commit 22fd76a1534d28f36a314ac6811bcf66fdc0cf72 Author: zer0day Date: Fri Feb 7 00:23:09 2025 +0100 Initial commit diff --git a/info.exult.exult/.ld.so/active b/info.exult.exult/.ld.so/active new file mode 120000 index 0000000..91ed0a1 --- /dev/null +++ b/info.exult.exult/.ld.so/active @@ -0,0 +1 @@ +df1a53df8e25d252b7abcd142868d2144904b3c49012e9cc5650b4252ae72eca \ No newline at end of file diff --git a/info.exult.exult/.ld.so/df1a53df8e25d252b7abcd142868d2144904b3c49012e9cc5650b4252ae72eca b/info.exult.exult/.ld.so/df1a53df8e25d252b7abcd142868d2144904b3c49012e9cc5650b4252ae72eca new file mode 100644 index 0000000..4ee8ad3 Binary files /dev/null and b/info.exult.exult/.ld.so/df1a53df8e25d252b7abcd142868d2144904b3c49012e9cc5650b4252ae72eca differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/index b/info.exult.exult/cache/mesa_shader_cache_db/index new file mode 100644 index 0000000..93ba805 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/index differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/marker b/info.exult.exult/cache/mesa_shader_cache_db/marker new file mode 100644 index 0000000..e69de29 diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part0/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part0/mesa_cache.db new file mode 100644 index 0000000..e61a5cb Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part0/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part0/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part0/mesa_cache.idx new file mode 100644 index 0000000..5ff2cb8 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part0/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part1/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part1/mesa_cache.db new file mode 100644 index 0000000..2ca4a04 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part1/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part1/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part1/mesa_cache.idx new file mode 100644 index 0000000..2ca4a04 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part1/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part10/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part10/mesa_cache.db new file mode 100644 index 0000000..cfa2a2c Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part10/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part10/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part10/mesa_cache.idx new file mode 100644 index 0000000..cfa2a2c Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part10/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part11/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part11/mesa_cache.db new file mode 100644 index 0000000..cc5ff1d Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part11/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part11/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part11/mesa_cache.idx new file mode 100644 index 0000000..cc5ff1d Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part11/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part12/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part12/mesa_cache.db new file mode 100644 index 0000000..2331cb7 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part12/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part12/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part12/mesa_cache.idx new file mode 100644 index 0000000..2331cb7 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part12/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part13/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part13/mesa_cache.db new file mode 100644 index 0000000..4673634 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part13/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part13/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part13/mesa_cache.idx new file mode 100644 index 0000000..4673634 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part13/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part14/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part14/mesa_cache.db new file mode 100644 index 0000000..874ae71 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part14/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part14/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part14/mesa_cache.idx new file mode 100644 index 0000000..874ae71 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part14/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part15/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part15/mesa_cache.db new file mode 100644 index 0000000..5cd43b3 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part15/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part15/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part15/mesa_cache.idx new file mode 100644 index 0000000..5cd43b3 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part15/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part16/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part16/mesa_cache.db new file mode 100644 index 0000000..c316566 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part16/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part16/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part16/mesa_cache.idx new file mode 100644 index 0000000..c316566 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part16/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part17/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part17/mesa_cache.db new file mode 100644 index 0000000..3e338c9 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part17/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part17/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part17/mesa_cache.idx new file mode 100644 index 0000000..3e338c9 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part17/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part18/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part18/mesa_cache.db new file mode 100644 index 0000000..410875c Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part18/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part18/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part18/mesa_cache.idx new file mode 100644 index 0000000..410875c Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part18/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part19/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part19/mesa_cache.db new file mode 100644 index 0000000..2237239 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part19/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part19/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part19/mesa_cache.idx new file mode 100644 index 0000000..2237239 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part19/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part2/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part2/mesa_cache.db new file mode 100644 index 0000000..5a9207d Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part2/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part2/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part2/mesa_cache.idx new file mode 100644 index 0000000..5a9207d Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part2/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part20/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part20/mesa_cache.db new file mode 100644 index 0000000..e2987aa Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part20/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part20/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part20/mesa_cache.idx new file mode 100644 index 0000000..e2987aa Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part20/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part21/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part21/mesa_cache.db new file mode 100644 index 0000000..7a49705 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part21/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part21/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part21/mesa_cache.idx new file mode 100644 index 0000000..7a49705 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part21/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part22/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part22/mesa_cache.db new file mode 100644 index 0000000..08202d8 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part22/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part22/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part22/mesa_cache.idx new file mode 100644 index 0000000..08202d8 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part22/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part23/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part23/mesa_cache.db new file mode 100644 index 0000000..490c2ad Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part23/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part23/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part23/mesa_cache.idx new file mode 100644 index 0000000..490c2ad Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part23/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part24/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part24/mesa_cache.db new file mode 100644 index 0000000..ddcb9e1 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part24/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part24/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part24/mesa_cache.idx new file mode 100644 index 0000000..ddcb9e1 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part24/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part25/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part25/mesa_cache.db new file mode 100644 index 0000000..d00e3d6 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part25/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part25/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part25/mesa_cache.idx new file mode 100644 index 0000000..d00e3d6 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part25/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part26/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part26/mesa_cache.db new file mode 100644 index 0000000..d811479 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part26/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part26/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part26/mesa_cache.idx new file mode 100644 index 0000000..d811479 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part26/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part27/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part27/mesa_cache.db new file mode 100644 index 0000000..208d3ab Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part27/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part27/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part27/mesa_cache.idx new file mode 100644 index 0000000..208d3ab Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part27/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part28/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part28/mesa_cache.db new file mode 100644 index 0000000..cafb576 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part28/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part28/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part28/mesa_cache.idx new file mode 100644 index 0000000..cafb576 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part28/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part29/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part29/mesa_cache.db new file mode 100644 index 0000000..0c0cf83 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part29/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part29/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part29/mesa_cache.idx new file mode 100644 index 0000000..0c0cf83 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part29/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part3/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part3/mesa_cache.db new file mode 100644 index 0000000..6155e43 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part3/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part3/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part3/mesa_cache.idx new file mode 100644 index 0000000..6155e43 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part3/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part30/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part30/mesa_cache.db new file mode 100644 index 0000000..d9871d4 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part30/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part30/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part30/mesa_cache.idx new file mode 100644 index 0000000..d9871d4 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part30/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part31/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part31/mesa_cache.db new file mode 100644 index 0000000..32ae270 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part31/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part31/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part31/mesa_cache.idx new file mode 100644 index 0000000..32ae270 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part31/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part32/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part32/mesa_cache.db new file mode 100644 index 0000000..f3279e1 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part32/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part32/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part32/mesa_cache.idx new file mode 100644 index 0000000..f3279e1 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part32/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part33/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part33/mesa_cache.db new file mode 100644 index 0000000..9322c07 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part33/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part33/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part33/mesa_cache.idx new file mode 100644 index 0000000..9322c07 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part33/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part34/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part34/mesa_cache.db new file mode 100644 index 0000000..d94bf87 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part34/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part34/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part34/mesa_cache.idx new file mode 100644 index 0000000..d94bf87 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part34/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part35/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part35/mesa_cache.db new file mode 100644 index 0000000..56540c8 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part35/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part35/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part35/mesa_cache.idx new file mode 100644 index 0000000..56540c8 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part35/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part36/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part36/mesa_cache.db new file mode 100644 index 0000000..5305fe7 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part36/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part36/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part36/mesa_cache.idx new file mode 100644 index 0000000..5305fe7 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part36/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part37/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part37/mesa_cache.db new file mode 100644 index 0000000..94d0c1a Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part37/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part37/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part37/mesa_cache.idx new file mode 100644 index 0000000..94d0c1a Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part37/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part38/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part38/mesa_cache.db new file mode 100644 index 0000000..3b570d4 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part38/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part38/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part38/mesa_cache.idx new file mode 100644 index 0000000..3b570d4 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part38/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part39/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part39/mesa_cache.db new file mode 100644 index 0000000..139dd97 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part39/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part39/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part39/mesa_cache.idx new file mode 100644 index 0000000..139dd97 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part39/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part4/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part4/mesa_cache.db new file mode 100644 index 0000000..e146af4 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part4/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part4/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part4/mesa_cache.idx new file mode 100644 index 0000000..e146af4 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part4/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part40/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part40/mesa_cache.db new file mode 100644 index 0000000..22177fb Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part40/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part40/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part40/mesa_cache.idx new file mode 100644 index 0000000..22177fb Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part40/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part41/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part41/mesa_cache.db new file mode 100644 index 0000000..69362d6 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part41/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part41/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part41/mesa_cache.idx new file mode 100644 index 0000000..69362d6 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part41/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part42/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part42/mesa_cache.db new file mode 100644 index 0000000..5fd9548 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part42/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part42/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part42/mesa_cache.idx new file mode 100644 index 0000000..5fd9548 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part42/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part43/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part43/mesa_cache.db new file mode 100644 index 0000000..246c0ca Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part43/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part43/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part43/mesa_cache.idx new file mode 100644 index 0000000..246c0ca Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part43/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part44/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part44/mesa_cache.db new file mode 100644 index 0000000..cdb6e7f Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part44/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part44/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part44/mesa_cache.idx new file mode 100644 index 0000000..cdb6e7f Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part44/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part45/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part45/mesa_cache.db new file mode 100644 index 0000000..b56cc51 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part45/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part45/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part45/mesa_cache.idx new file mode 100644 index 0000000..b56cc51 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part45/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part46/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part46/mesa_cache.db new file mode 100644 index 0000000..b8b48ca Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part46/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part46/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part46/mesa_cache.idx new file mode 100644 index 0000000..b8b48ca Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part46/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part47/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part47/mesa_cache.db new file mode 100644 index 0000000..a08aa3f Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part47/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part47/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part47/mesa_cache.idx new file mode 100644 index 0000000..a08aa3f Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part47/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part48/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part48/mesa_cache.db new file mode 100644 index 0000000..d7ffdf2 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part48/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part48/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part48/mesa_cache.idx new file mode 100644 index 0000000..d7ffdf2 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part48/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part49/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part49/mesa_cache.db new file mode 100644 index 0000000..e233ff0 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part49/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part49/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part49/mesa_cache.idx new file mode 100644 index 0000000..e233ff0 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part49/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part5/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part5/mesa_cache.db new file mode 100644 index 0000000..aec684f Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part5/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part5/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part5/mesa_cache.idx new file mode 100644 index 0000000..aec684f Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part5/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part6/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part6/mesa_cache.db new file mode 100644 index 0000000..7ea2298 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part6/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part6/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part6/mesa_cache.idx new file mode 100644 index 0000000..7ea2298 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part6/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part7/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part7/mesa_cache.db new file mode 100644 index 0000000..aa353d3 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part7/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part7/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part7/mesa_cache.idx new file mode 100644 index 0000000..aa353d3 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part7/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part8/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part8/mesa_cache.db new file mode 100644 index 0000000..fb837d6 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part8/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part8/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part8/mesa_cache.idx new file mode 100644 index 0000000..fb837d6 Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part8/mesa_cache.idx differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part9/mesa_cache.db b/info.exult.exult/cache/mesa_shader_cache_db/part9/mesa_cache.db new file mode 100644 index 0000000..610d78d Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part9/mesa_cache.db differ diff --git a/info.exult.exult/cache/mesa_shader_cache_db/part9/mesa_cache.idx b/info.exult.exult/cache/mesa_shader_cache_db/part9/mesa_cache.idx new file mode 100644 index 0000000..610d78d Binary files /dev/null and b/info.exult.exult/cache/mesa_shader_cache_db/part9/mesa_cache.idx differ diff --git a/info.exult.exult/config/exult.cfg b/info.exult.exult/config/exult.cfg new file mode 100644 index 0000000..c1df3a6 --- /dev/null +++ b/info.exult.exult/config/exult.cfg @@ -0,0 +1,157 @@ + + + 1 + /app/share/exult/ + /app/share/exult/music + + + /home/sebastian/.var/app/info.exult.exult/data/blackgate + /home/sebastian/.var/app/info.exult.exult/data/blackgate/save + /home/sebastian/.var/app/info.exult.exult/data/blackgate/static + /home/sebastian/.var/app/info.exult.exult/data/blackgate/gamedat + /home/sebastian/.var/app/info.exult.exult/data/blackgate/mods + /home/sebastian/.var/app/info.exult.exult/data/blackgate/patch + (default) + /app/share/exult/bg_autonotes.txt + sqsfxbg.flx + + + /home/sebastian/.var/app/info.exult.exult/data/forgeofvirtue + /home/sebastian/.var/app/info.exult.exult/data/forgeofvirtue/save + /home/sebastian/.var/app/info.exult.exult/data/forgeofvirtue/static + /home/sebastian/.var/app/info.exult.exult/data/forgeofvirtue/gamedat + /home/sebastian/.var/app/info.exult.exult/data/forgeofvirtue/mods + /home/sebastian/.var/app/info.exult.exult/data/forgeofvirtue/patch + (default) + /app/share/exult/bg_autonotes.txt + /app/share/exult/jmsfx.flx + + + /home/sebastian/.var/app/info.exult.exult/data/serpentbeta + /home/sebastian/.var/app/info.exult.exult/data/serpentbeta/save + /home/sebastian/.var/app/info.exult.exult/data/serpentbeta/static + /home/sebastian/.var/app/info.exult.exult/data/serpentbeta/gamedat + /home/sebastian/.var/app/info.exult.exult/data/serpentbeta/mods + /home/sebastian/.var/app/info.exult.exult/data/serpentbeta/patch + (default) + /app/share/exult/si_autonotes.txt + /app/share/exult/jmsisfx.flx + + + /home/sebastian/.var/app/info.exult.exult/data/serpentisle + /home/sebastian/.var/app/info.exult.exult/data/serpentisle/save + /home/sebastian/.var/app/info.exult.exult/data/serpentisle/static + /home/sebastian/.var/app/info.exult.exult/data/serpentisle/static + /home/sebastian/.var/app/info.exult.exult/data/serpentisle/mods + /home/sebastian/.var/app/info.exult.exult/data/serpentisle/patch + (default) + /app/share/exult/si_autonotes.txt + /app/share/exult/jmsisfx.flx + + + /home/sebastian/.var/app/info.exult.exult/data/silverseed + /home/sebastian/.var/app/info.exult.exult/data/silverseed/save + /home/sebastian/.var/app/info.exult.exult/data/silverseed/static + /home/sebastian/.var/app/info.exult.exult/data/silverseed/gamedat + /home/sebastian/.var/app/info.exult.exult/data/silverseed/mods + /home/sebastian/.var/app/info.exult.exult/data/silverseed/patch + (default) + /app/share/exult/si_autonotes.txt + /app/share/exult/jmsisfx.flx + + + + + + yes + yes + no + no + no + no + + -2 + normal + keypause + yes + + 8 + double + yes + 100 + no + yes + yes + yes + Offscreen + yes + 0 + -1 + no + no + + + + yes + no + no + + + yes + Black + yes + + diff --git a/info.exult.exult/config/pulse/cookie b/info.exult.exult/config/pulse/cookie new file mode 100644 index 0000000..4d0b304 --- /dev/null +++ b/info.exult.exult/config/pulse/cookie @@ -0,0 +1 @@ +u À-—rP{§5ò§0!>«=5[ϲn€®e ¡¾Aœ×¬©€À¶IŒmxá‰g)•šC`ò‡ Žûá#.¡ÿnw@׆<ȶ¼ª•`¨<¨Ã¾ï.êføî§ñ;õU2* ’/ç~Ÿû”ëVµLm+WmÀU¢±gßࡇ|ÏZýÒÖQéáœ|H ¾ðƒ 0™j¾ ¹(¨ž¶Óá7P%t²mæ*ÇÚ`’6(8ÚR-HÝÎ}ÙÂTФƒu׺×ó'«_Dµ˜dÞ1¦®¼Ïs‡ŸÿÍîÐDûÙá2f@WöÉuLi¼ð·ÉÊ«fȼ=á€c \ No newline at end of file diff --git a/info.exult.exult/data/README_audiopack.txt b/info.exult.exult/data/README_audiopack.txt new file mode 100644 index 0000000..0a5d324 --- /dev/null +++ b/info.exult.exult/data/README_audiopack.txt @@ -0,0 +1,35 @@ +ALL-In-One Audio pack for Exult +------------------------------- + +This all-in-one audio pack for Exult features the Soundblaster SFX pack, +the Roland MT-32 SFX pack and the Digital Music pack. + +The Soundblaster SFX pack was recorded and contributed by Joseph Morris. +The Roland MT-32 SFX pack and the Digital Music pack were recorded and +contributed by Simon Quinn. + + +This all-in-one pack is intended to consolidate the various packs into +a big one to make setting up Exult easier. + + +INSTALLATION +------------ + +Extract the files of exult_audio.zip into your Exult data folder: + +- on Windows the data folder is normally in the folder where you installed + Exult to (e.g. C:\Program Files\Exult\data) + +- Exult always looks in /Library/Application Support/Exult/data on OS X + +- on *nix based systems /usr/local/share/exult is used by default + +Exult will now find the files automatically and you can choose the sfx +packs and enable digital music in the audio setup. + + +THANKS +------ + +Thanks to Joseph Morris and Simon Quinn for their work on these packs. \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/DOSBOX/DOSBox.exe b/info.exult.exult/data/blackgate/DOSBOX/DOSBox.exe new file mode 100644 index 0000000..557396c Binary files /dev/null and b/info.exult.exult/data/blackgate/DOSBOX/DOSBox.exe differ diff --git a/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_AUTHORS.txt b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_AUTHORS.txt new file mode 100644 index 0000000..eb365e5 --- /dev/null +++ b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_AUTHORS.txt @@ -0,0 +1,12 @@ +The DOSBox Team +--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frössman +Dean Beeler +Sebastian Strohhäcker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net diff --git a/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_COPYING.txt b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_COPYING.txt new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_COPYING.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_INSTALL.txt b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_INSTALL.txt new file mode 100644 index 0000000..cc48f8e --- /dev/null +++ b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_INSTALL.txt @@ -0,0 +1,104 @@ +Things needed for compilation. + +SDL + The Simple DirectMedia Library available at http://www.libsdl.org + The dll distributed with the windows version of DOSBox is slightly + modified. You can find the changes in the sourcepackage of DOSBox + (src/platform/sdl-win32.diff). If you want the patched sourcetree + send us an email. (see README) + Licensed under LGPL + Note that only version 1.2 and its subversions (1.2.8, 1.2.13 etc.) + are currently supported. + +Curses (optional) + If you want to enable the debugger you need a curses library. + ncurses should be installed on just about every unix distro. + For win32 get pdcurses at http://pdcurses.sourceforge.net + License: Open source + +Libpng (optional) + Needed for the screenshots. + For win32 get libpng from http://gnuwin32.sourceforge.net/packages.html + See http://www.libpng.org/pub/png/ for more details. + License: Open Source + +Zlib (optional) + Needed by libpng. + For win32 get libz (rename to zlib) from http://gnuwin32.sourceforge.net/packages.html + See http://www.zlib.net for more details. + License: Open Source + +SDL_Net (optional) + For modem/ipx support. Get it from http://www.libsdl.org/projects/SDL_net/ + Licensed under LGPL + +SDL_Sound + For compressed audio on diskimages. (optional) + This is for cue/bin cdrom images with compressed (mp3/ogg) audio tracks. + Get it from http://icculus.org/SDL_sound + Licenced under LGPL + +ALSA_Headers + (optional) + for Alsa support under linux. Part of the linux kernel sources + Licensed under LGPL + +If you want compile from the CVS under a unix system, you'll also need +automake (>=1.6), autoconf(>=2.50). Should be available at http://www.gnu.org + +For building on unix systems. +If you are building from the cvs run ./autogen.sh first before doing the following. + +1. ./configure +2. make + +In step 1 you could add the following switches: +--enable-debug + enables the internal debugger. --enable-debug=heavy enables even more + debug options. DOSBox should then be run from a xterm and when the sdl- + window is active press alt-pause to enter the debugger. + +--enable-core-inline + enables some memory increasing inlines. This greatly increases + compiletime for maybe a increase in speed. + +--disable-fpu + disables the emulated fpu. Although the fpu emulation code isn't + finished and isn't entirely accurate it's advised to leave it on. + +--disable-fpu-x86 + disables the assembly fpu core. Although relatively new the x86 fpu + core has more accuracy then the regular fpu core. + +--disable-dynamic-x86 + disables the dynamic x86 specific cpu core. Although it might be + be a bit unstable, it can greatly improve the speed of dosbox on x86 + hosts. + Please note that this option on x86 will result in a different + dynamic/recompiling cpu core being compiled then the default. + For more information see the option --disable-dynrec + +--disable-dynrec + disables the recompiling cpu core. Currently x86 and x86_64 only. + You can activate this core on x86 by disabling the dynamic-x86 core. + +--disable-dynamic-core + disables all dynamic cores. (same effect as + --disable-dynamic-x86 --disable-dynrec) + +--disable-opengl + disables OpenGL-support (output mode that can be selected in the + DOSBox configuration file). + +--disable-unaligned-memory + disables unaligned memory access. + +Check the src subdir for the binary. + +NOTE: If capslock and numlock appear to be broken. open +src/ints/bios_keyboard.cpp and go to line 30 and read there how to fix it. + + +Build instructions for VC++6 +Don't use VC++ 6: it creates faulty code in core_normal.cpp +Later Visual Studio versions work fine (vs2003/.net, vs2005, vs2008) diff --git a/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_NEWS.txt b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_NEWS.txt new file mode 100644 index 0000000..adc6875 --- /dev/null +++ b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_NEWS.txt @@ -0,0 +1,673 @@ +0.74 + - Several small game specific fixes/hacks/support. (Offensive, + Roadhog, GTA installer, Kingdom O' Magic soundcard detection, + Pirate booter, Armored Fist installer) + - Add the S3-specific 640x480 256 color mode. (fixes regression in "Wooden + Ships and Iron Men" and "I Have No Mouth And I Must Scream") + - Fix a stack overflow that could crash DOSBox. + - Add fake microphone input. (fixes Talking Parrot) + - Modify adlib turn off code, so that it doesn't turn off in + cases where the same sound is repeated over and over again. + - Several small fixes to the CDROM audio code. (HOMM2, Redneck + Rampage and others) + - Several improvements to the CDROM emulation code. (fixes Alpha + Storm and GT Racing 97) + - Some small CPU fixes that might fix something. + - Handle opcode 0xff subcode 7 as invalid instruction. (fixes dif-2 & others) + - Some hercules fixes. (Testdrive) + - Improve support for blanked parts that wrap around to the start of + the screen. (fixes Magic Circle demo and Sid&Al) + - Remove old OPL cores as the new ones seem to work very nicely. + - Modify movie recording code so that the movies aren't corrupt when + you exit dosbox without stopping the movie. + - Change RGB3x scaler to look more pretty. + - Improve initial register values compatility of the GUS. + - Added autodetection for Gameblaster. (games can find it now) + - Change render preferences a bit to be more compatible with Windows 7. + - Add DOS fixes to terminate program. (fixes Fortune Teller) + - Add FFREEP. (fixes Trucks) + - Improve FPU ST80 in C mode when writing zero. (fixes Antigok) + - Add special int10 scanline function. (fixes mz700 and probably lots + of games that mess with them) + - Fix scrolling in rarely used video modes. (fixes Orphee) + - Modify game specific hacks a bit so that Kick off 3 works again. + - Lots of fixes to the INT10 video parameter table. (Seven spirits + of ra and others) + - Add VGA blanking in machine=vgaonly. (used by Alien Carnage) + - CGA, PCJr, Tandy: Add video blanking, change display start latch + timing, sync pulse width correction. + - PCJr, Tandy: implement vertical retrace interrupt. + - PCJr, CGA: line-by-line video emulation. + - PCJr: support on-screen change of color modes 4medium to 16low. (used + by Ghostbusters booter) + - Hercules: Add green and amber monochrome support. + - All machines: only update the video timing when needed. (Jungle Hunt, + others that synchronize to the video screen might profit) + - Several small DOS fixes. + - Some UMB related fixes. (The Legacy without UMB) + - Fix version number of DSP for SB 1.5. (fixes a few games) + - Several VGA emulation improvements. (Allertone football manager) + - Some Tandy fixes. (Mech Warrior) + - Small improvements and fixes to the OPL emulation. + - Add low level Tandy DAC emulation. + - Some EMS fixes. (fixes Mortal Kombat and others) + - Change SoundBlaster DSP reset mechanism, add sb irq acknowledge logic. + (fixes stmik-based applications) + - Some interrupt pointer location modifications. (fixes Tinker Tales) + - Some fixes to the BOOT code. (fixes Last Mission) + - Respect write-only file information. (fixes Champions of Zulala) + - Some RTC fix. (fixes Tully Bodine and others) + - Improve mouse emulation to work better with Water World. + - Hopefully fix the translation of the configuration file. + - Speed up and fixes for the recompiler core. (pitfall2 pcjr) + - Change memory start location. (fixes 7th Guest installer) + - Several fixes to the batch file handling. (Shift and + use the typed first %0 instead of the parsed %0) + - Improve file redirection and redirected line ends. (fixes + Phantasmagoria 2 DOS installer) + - Fix compilation with new MAC os X version. + - Add 16C550A FIFO support to the serial port emulation. + - Improve modem emulation to get higher speeds. + - Change default samplerates to 44100, blocksize to 1024 and prebuffer to 20, + so that hopefully certain soundcards produce more fluent sound playback. + - Add some rarely used, but for some games critical flags to + the internal commands. + - Add -userconf flag, so that the userspecific configuration can + easily be used together with -conf configfile. + - Improve internal timing with repeating timers (especially with + the dynamic core). + +0.73 + - Add two new opl2+opl3 emulators. (better speed, different implementation + approach) + - Improved DRO recording/better file structure. + - Add EGA emulation. + - Add special vga machine mode. Supports more of the exotic tricks like + changing the palette during screen updates, 9x16 fonts etc. + - Added special machine modes for the following svga cards: + - S3 + - Paradise + - Tseng + - Fix problems with the vga split line feature. + - Improve vesa emulation. + - Add optional selection of old vesa mode for games that don't work + with certain vesa features. + - Improve video BIOS emulation to behave more like a real bios. + - Fixes for emulated 4bpp graphics modes. + - Fixes to paging system. + - Various fixes and improvements for the recompiling core. + - Add arm backend for the recompiling core. + - Add some mscdex quirks when dealing with files that are exactly 8.3 long. + - Small fixes to batch file handling. + - Small fixes to the XMS memory handling. + - Various fixes for aligned memory on hosts that want it. + - Various improvements to the mouse. + - Fixes and small speed ups to the debugger. + - Fix and improve lot's of compilation problems. (curses detection, + GCC 3.4 and GCC 4.X fixes) + - Added some basic auto keyboard layout handling. (windows only currently) + - Add basic support for evdev keyboard driver. + - Various fixes to the timer. (improve mode 2 timer changes, + implement mode 1, improve gate2 handling) + - Add audio extraction and mci audio support. Should enable CDROM audio + for Vista and adds volume control. + - Improve the directory cache speed a lot, especially with mounting slow + media like network paths. + - Various fixes to the create temporary file call. + - Don't keep batchfiles open during execution. Allows rewriting of the + active batchfile. (menu programs use this trick sometimes) + - Fix problems with filenames with 2 extensions. + - Add some more lowlevel dos tables. + - Fixes to hercules emulation. + - Fix flag handling for special case of ROR. + - Make the batchfile handling in regard to IF more flexible. + - Fixes to scrolling/panning feature. + - Add prefetch queue emulation. + - Make the emulated cpu type selectable. This is mainly the + identification commands and the way paging works. + - Some special EMS functionality added. (OS handles, zero-page handling) + - Improve support for EMS when booting a different OS. + - Improve cdrom speed detection by games. + - Improve stability of cycle guessing code, when there is background + activity. + - Fix various mscdex and cdrom detection schemes. + - Added Coremidi support on Mac OS X. + - Improve support for DOS devices when used to detect the existance + of directories in various ways. + - Add IRQ 2 emulation on VRET. (ega only) + - Added video parameter table and video state functionality. + - Increase default freespace to 250 MB. + - Some fixes to the fat filesystem handling for disk images. + - Some soundblaster fixes and command additions. + - Fix mixer 16bit direct transfers on bigendian hosts. + +0.72 + - Fixed unitialized variable in joystick. (Fixes crashes on Vista and + Mac OS X) + - Some bugfixes and speedups to the 64 bit recompiling core. + - Fixed sign flag on soundblaster dma transfers (Space Quest 6 intro) + - Fixed a bug in keyboard layout processing code and fixed certain + layouts. + - Fixed Dreamweb. + - Improved speed unlocking when running cycles=max. + - Fixed a crash related to the tab completion in the shell. + - Improved aspect correction code. Should now be like how a real monitor + handles it. + - Fixed a bug in the xms status report code. (Blake Stone 1.0 shareware) + - Added a lot more keyboard layouts. + - Fix crash related to changing the scaler before a screen was created. + - Hopefully fixed compilation on *bsd. + - Enabled auto cpu core selection for recompiling core as well. + - Made the used joystick selectable when 4axis is specified. + - Added some hints for inexperienced DOS users to the shell. + +0.71 + - Add a new recompiling cpu core, which should be easier to port. + - Add 64 bit version of the recompiling core. + - Add mipsel 32 bit version of the recompiling core. + - Fix a few small problems with FCBs. (fixes Jewels of darkness and + cyrus chess) + - Raise some more exceptions. (fixes vbdos) + - Fix a few problems with the dynamic core. (fixes Inner Words, + Archmimedean Dynasty and others) + - Improve/Fix fallback code for certain graphics cards. + - Fix a few cd audio related bugs. + - Add an undocumented MSCDEX feature. (Fixes Ultimate Domain) + - Fix some pcspeaker mode. (fixes Test Drive and similar games) + - Improve dos keyinput handling. (fixes Wing Commander 3 exit dialog) + - Remove Exit condition on fully nested mode. (fixes some demo) + - Add image file size detection. + - Add/Fix some ansi codes. (fixes PC Larn and certain versions of + infocom games) + - Several general DOS fixes. (fixes nba95, hexit and various other games) + - Add some valid input checks. (fixes 3d body adventure and similar + games) + - Fix digital joystick centering problem. + - Reenable textmode 54 and 55. + - Fix a pelmask problem with univbe 5.0 lite. (fixes Panzer General) + - Fix minor mixer underflow. + - Some general image and bios disk emulation fixes. + - Hopefully fix compilation on BSD and darwin. + - Try using ioctl cdrom access by default if possible. + - Fix some svga detection routine. (fixes Grandest Fleet 2 and Bobby Fischer + Teaches Chess) + - You can now close DOSBox using the status window in win32. + - Add support for NX enabled systems. + - Fix a casting error which only showed with certain compilers. (fixes + various games under mac os x and 64 bit linux) + - Improve timer and add gate 2 support. (fixes various games and + joystick problems) + - Improve mouse. Add undocumented backdoor. (fixes Last half of Darkness, + PC-BLOX and others) + - Add/improve support for ~ and ~username in all commands. + - Fix a font problem with the pcjr/tandy. (fixes personal deskmate 2) + - Change dma routine a bit. (fixes ticks in sound in various games) + - Allow read-only diskimages to be booted. (fixes various booter + games) + - Add basic hidden file support on cdrom images. (fixes Player + Manager 2) + - Add some rarely used functionality to the int10 mode setup. (fixes + WW2 Battles of the South pacific) + - Add ability to force scaler usage. + - Speed up flag generation and make it more 386-like. + - Some colourful feedback in the mapper. + - General code cleanup. + +0.70 + - Improve register handling and support with XMS. + - Fix some issues with deleting open files.(windows only issue) + - Add dummy LPT1 class. (windows only issue) + - Improve some of the internal dos commands. (choice, copy and shift) + - Improve ROM area. (for games that use it for random numbers or + overwrite it as some sort of detection thing) + - Improve compatibility of dynamic core by making it handle certain + pagefaults earlier. + - Move internal dos tables around so we have more umb memory. + - Add some dos tables. + - Dynamic core supports io exceptions. + - Move some interrupt handlers to XT Bios locations. + - Add a dynamic fpu on x86. + - Improve fpu on non-x86. + - Trapflag gets strict priority over hardware IRQs. + - Trapflag support for the dynamic core. + - Add dummy TRx handling. + - Fix a few rarely used character functions. + - Improve auto cycle guessing code. + - Improve and extend the joystick support. + - Add autofire support. + - Improve the mapper so you can map keys to the joystick and vice versa. + - A few game specific video card fixes. + - Fix some 64 bit cpu bugs. + - Add support for certain cdrom detection schemes. + - Improve HSG/Red Book support. + - Improve MSCDEX. + - Improve dynamic core support under intel macs. + - Add basic support for clipper programs. + - Add support for different keyboard layouts. + - Add auto core guessing. + - Fix a few flags bugs. + - Fix a few small cpu bugs. + - Improve soundblaster detection rate by various programs. + - Improve EMS emulation. (allow mapping of non standard regions) + - Improve keyboard input codes on various OS-es. + - Fix problems with filenames having stackdata in them. + - Changed a few basic operations in DOSBox so they take emulated time. + - Improve dos ioctl functions. + - Extend cpu core so they are capable of detecting and raising a few + more exception types. + - Improve DOS functions when dealing with virtual drive. + - Improve FAT drives. + - Better handling of volume-labels in file functions. + - Image disk cycling capability. (prompt) + - Try to reduce the impact of using an analog joystick. + - Several measures to avoid code invalidation on certain types + of self modification in the dynamic core. + - Add dynamic core memory function inlining. + - A few small mouse improvements. (some games are using things they + shouldn't) + - Add nullmodem emulation.(h-a-l-9000) + - Some small cga and hercules fixes. + - Add more scalers (hq2x/hq3x/sai). (Kronuz) + - Change configuration file loading support. It now supports + multiple configuration files. + - Make dynamic core capable of running some win32s programs. + - Fix and add some rare soundblaster modes. (Srecko) + - Better soundblaster mixer controls. (Srecko) + - Make soundblaster installation under windows much easier. + - Add device control channel handling. + - GEMMIS support (ems under windows). + - Support more colours in win 3. (vasyl) + - Don't show unmounted drives in windows filemanager. + - Fix some bugs in the int13 handler. + - Simulate some side-effects of bios interrupt handlers on flags. + - Add IPX functions needed by netbios. + - Make ports take emulated time. + - Tabcompletion is now aware of the CD command. + - Add suppport for the dac pel mask. + - Fixes to hercules emulation, better detection and bank switching. + - Fixes to tandy emulation, 640x200x16 mode and different sizes bank. + - EGA/VGA memory changes detection for faster rendering. + - Gus 16 bit fixes. + - Many timer improvements. + - Some pcjr fixes. + - Some booter fixes. + - Many small fixes. + +0.65 + - Fixed FAT writing. + - Added some more missing DOS functions. + - Improved PIC so that it actually honours irq 2/9. + - Improved intelligent MPU-401 mode so that more games work with it. + - Some mouse fixes. + - Changed DMA transfers a bit so they bypass the paging tables. + - Added S3 XGA functionality. + - Improved paging so that read and write faults are handled differently. + - Rewrote exception handling a bit (no exception 0x0B with dos4gw anymore). + - Added IO exceptions in all but the dynamic core. + - Some ems improvements. + - Added midi-device selection code for the windows hosts. + - Fix crashes/segfaults related to the disabling of the pcspeaker. + - Added some more FILES=XX detection tricks. + - Fixed some vga detection schemes. + - Fixed screenshot corruption when using -noconsole in a read-only directory. + - Fix wrong scaled screenshots. + - Added some hidden file functions when using diskimages. (helps with cdrom + detection schemes) + - Fixed a bug in the mixer code, that muted the music in certain games. + - Added an assembly fpu core. + - Made the shell more flexible for batch files. + - Check for unaligned memory acces fixes hangups on ARM processors. + - Some 64 bit fixes. + - Added code to change configuration at runtime. + - Improved ADPCM emulation. + - Fixed a few cpu instructions. + - Always report vesa 2.0 and fix some colour issues with vesa games. + - Fix video mode 0x06 and 0x0a. + - Improvements to the joystick emulation. 4 buttons are supported as well. + - Add VCPI emulation for Origin games. + - Fixed a lot of things in the boot code. Most booters work now. + - Lots of improvements to the IPX emulation. + - Rewritten modem emulation. Should work with more games. + - Improvements to the dos memory managment routines. + - Add UMB (upper memory blocks) support. + - Emulate the pause key. + - Improve Composite CGA mode emulation. + - Lots of vga compatibility changes. + - Improved support for chained video modes. + - Improved mode and palette handling in cga modes. + - Mount accepts ~ now. + - Added a few of the EGA RIL functions. + - Added TandyDAC emulation. + - OS/2 support. + - Improved and speed up the dynamic cpu core. + - Fix some errors in the CD-ROM emulation layer. + - Added an automatic work-around for some graphics chipsets. + - Add PCjr support. + - Allow mousedriver to be replaced. Fixes a few games that come with their + own (internal) driver. + - Improved dynamic cpu core so it can handle pagefaults and some obscure + types of self-modifying code. + - Added -noautoexec switch to skip the contents of [autoexec] in the + configuration file. + - Improved v86 mode emulation (mainly for Strike Commander). + - Improved timer behavior. + - Improved extended keyboard support. + - Enhanced and added several DOS tables. + - Made core_full endian safe. + - Made pagefaults endian safe. + - Add support for moviecapturing + - Add support for 15/16/32 bit videomodes. + - Add some more VESA modi (4 bit). + - Add 1024x768 output. + - Changed screenrendering so it only draws changes to the screen. + - Allow remapping of the EMS page when the dma transfer was started from + the page frame + - Made EMS and DMA work together when playing from a mapped memory page. + - Renamed several configuration options, so that they are unique. + - Merged mpu and intelligent into one option. + - Merged fullfixed and fullresolution. + - Extended keys should be handled better. + - F11 and F12 work. + - Compilation fixes for various platforms. + - Fix a few crashes when giving bad input. + - Removed interp2x and added few new scalers. + - Reintroduce the lockfree mouse. (autolock=false) + - Add a larger cache for the dynamic cpu core. + - Improved soundblaster DSP, so it gets detected by creative tools. + - Lots of bugfixes. + - Even more bugfixes. + +0.63 + - Fixed crash with keymapper (ctrl-f1) and output=surface. + - Added unmounting. + - Fixed multiple issues with drive labels. + - Fixed most if not all FILES=XX problems. + - Added redirection in the shell. + - Fixed crashes with subst. + - Fixed multiple crashes with the drive images support. + - Added a missing fpu instruction. + - Fixed some cpu and fpu instructions. + - Fixed a small bug related to font loading. + - Rewrote the devices support. + - Added capslock/numlock checks on startup. + - Fixed wave writing. + - A few internal DOS fixes. + - Timer fixes for the hybrid loader. + - Some small soundblaster fixes. + - The drive cache can now be cleared by a keycombo. (CTRL-F4) + - A few keyboard fixes. + - Compilation fixes on various platforms. + - Quite some debugger improvements. + - Fixed dir only showing files after the first run on cdrom drives. + - Added some cdrom detection checks. + - Enabled insert in the shell. (Easier editing of commands) + - Changed order in which executables appear with tab-completion. + - Fixed some issues with raw opl recording and using a slightly different + format + +0.62 + - Added blinking support in the shell and some color fixes. + - Fixed commandline parsing when .bat files involved (fixes -exit) + - Fixed issues with tabs in commandline not being processed correctly. + - Cleaned/improved shutdown sequence. + - Added some more bios functions (wait and delay functions). + - Made our XMS driver conform the specs better. (c2woody) + - Added support for some more ems functions. + - Added intelligent mpu401 emulation. (Srecko) + - Added soundblaster 16 emulation. + - Rewrote GUS emulation to sound more authentic. + - Improved pc speaker emulation. + - Added an internal (programmable) mixer. + - Added support a few soundblaster/adlib detection routines. + - Fixed lot's of bugs related to DMA transfers. + - Added interpolating prebuffering mixer routines. + - Added recording of OPL commands and raw midi. + - Fixed some bugs with the wave recording. + - Changed sensitivity settings of the mouse. + - Added ps2 mouse-emulation in bios interrupts (c2woody). + - Fixed some bugs with mouse emulation limits. + - Fixed a bug with an unterminated string in the drivelabel. + - Changed file search routines a bit to be more compatible. + - Added support for attribute-searching with fcb's. + - Added basic SDA. + - Added TPA and DIB. + - Added Lot's of missing dos tables (c2woody). + - Changed psp and dta functions to use dta. + - Returned filename in ds:dx in create-random-file (c2woody). + - Fixed a bug with date and time used on open files. + - Some mscdex fixes. + - Added the -version switch, which makes dosbox report its version. + - Added a keymapper. + - Added basic IPX emulation. + - Added cdrom iso support and floppy images support. + - Added the possibity to boot another dos version. + - Added Serial passthrough support (win32 only). + - Added the possibility to pause dosbox. + - Changed OpenGL so that it is initialized only when used. + - Make dosbox run at higher priority when active and lower when inactive. + - Added direct draw output support (win32 only). + - Added current running program to title bar. + - Rewrote video emulation to support new scalers. + - Added new graphics scalers like advmame3x,tv2x. + - Added a support for a few anti-debugger tricks. + - Improved the handling of the tab-key. + - Improved support for the numeric keyboard. + - Fixed a few cpu opcodes. + - Added cpu core simple (for lowerend machines) + - Fixed some nasty bugs in the dynamic cpu core. + - Added a few (rarely used) fpu opcodes. + - Fixed various issues with GCC 3.4. + - Many internal timer improvements (PIT and PIC). + - Added some more PIC commands (c2woody). + - Added BCD counting to the timers. + - Fix some vesa functions. + - Add some basic support for 132x25 and 132x45 textmodes. + - Improved Tandy emulation a lot. + - Lowered cpu usage when dosbox is idle. + - Allow virtualisation of some basic IO-ports (c2woody). + +0.61 + - Added a beta dynamic cpu for x86 hosts (very unstable) + - Added opengl and hardware overlay display output + - Rewrote the vga screen updates to go in lines + - Added paging and v86 support to cpu emulation + - Added a config option to simulate a certain type of machine + - Added hercules graphics emulation + - Made CGA/TANDY modes more compatible + - Updated textmode drawing routines to support blinking colors + - Fixed VESA set page function that was documented wrong + - Fixed some wrongly emulated cpu opcodes. + - improved exception handling + - debugger: fixes; logging of gdt,lgt,idt, new commands(Fizzban) + - fixed some mscdex issues (drive letter header error, added get directory entry) + - added/fixed some bios funcs + - added some rarely used xms functions (thanks c2woody!) + - implemented GUS emulation + - Added 16-bit DMA support (for GUS and eventually SB16) + - Fixed many small bugs in filehandling routines + - Many small FPU fixes (c2woody/Fizzban) + - Some keyboard improvements (pharlab games) + - Some Timer and cmos/rtc fixes (Mirek/Srecko/Others) + - Lot's of mouse fixes (Help from various people) + - Enabled internal modem + - Made the DOS parsing routines a bit more flexible + - Added Subst (Srecko) + - Added cdrom ioctl support for linux (prompt) + - Many internal DOS fixes: memory/files/datastructures. + - Got some help from c2woody in allowing more than 1 irq being served + - Disabled DPMI (not needed anymore. DOSBox handles almost every extender) + - Search configfile in $HOME directory if none present in current directory + - Added another way to switch to protected mode. (Thanks Morten Eriksen!) + - Fixed some odd badly documented behaviour with PSP/DTA + - Added some warnings on opening of readonly files in writemode(DOS default). + - Many shell enhanchements + - Fixed a win32 specific bug dealing with filenames starting with a "." + - Fixed some bugs with the directory structure: not found/can't save errors + +0.60 + - rewrote memory system for future paging support + - fixed several EMS and XMS bugs and rewrite for new memory system + - added some support for tandy video modes + - added MAME Tandy 3 voice emulation + - added MAME CMS/GameBlaster emulation + - added serial port emulation with virtual tcp/ip modem (somewhat buggy) + - sound blaster emulation is now sb pro 2.0 compatible + - added basic support for 32-bit protected mode + - VGA now tries to emulate an S3 Trio 64 card with 2 MB + - VESA 2.0 support for some 256 color modes + - rewrote large piece of video bios code for better compatibility + - added support for the not inheritance flags. + - created functions for creating child psp. + - updated errorcodes of findfirst (thanks Mirek!) + - rewrote loggingsystem to generate less warnings + - added dos protected mode interface (dpmi) + - added cdrom label support + - improved cdrom audio playing + - fixed and improved directory cache + - debugger shows selector- and cpu mode info + - added SELINFO (selector information) command to debugger + - added reference counting for dos files + - added tab-completion + - added basic fpu support. + - fixed several bugs with case sensitive filesystems. + - added more shell commands and improved their behaviour. + - mouse improvements. + - real time clock improvements. + - DMA fixes. + - Improved .BAT file support. + +0.58 + - fixed date and time issues with fcbs + - added more commands to the internal Shell + - corrected config system when a old configfile was used + - fixed cga put and get pixel + - fixed some vga register getting reset to wrong values + - improved support for foreign keyboards + - improved joystick support + - made dosbox multithreaded again + - lot's of soundblaster fixes + - dma fixes + - cdrom support + - midi support + - added scale2x + - reenabled screenshot support + - joystick support fixes + - mouse improvements + - support for writing wavefiles + - added directory cache and longfilename support (longfilenames will be mangled) + - mouse fixes + + +0.57 + - added support for command /C + - fixed all fcb-write functions + - fixed fcb-parseline + - added debugger under linux/freebsd + - added debugger memory breakpoints and autolog function (heavy debug) + - added loadfix.com program that eats up memory (default 64kb) + Usage : loadfix [-option] [programname] [parameters]... + Example: loadfix mm2 (Allocates 64kb and starts executable mm2) + loadfix -32 mm2 (Allocates 32kb and starts executable mm2) + loadfix -128 (Allocates 128kb) + loadfix -f (frees all previous allocated memory) + - added echoing of characters for input function + - added support for backspace for input function + - added partial support for int10:01 set cursortype + - fixed most of the problems/bugs with character input. + - fixed allocationinfo call.(darksun series) + - improved dos support for non-existant functions + - Split screen support + - prefix 66 67 support + - rewrote timingscheme so 1000 hz timers don't cause problems anymore + - update adlib emulation + - fixed some isues with the mouse (double clicks and visible when it shouldn't be) + - improved mouse behaviour (mickey/pixel rate) and detection routines. + - basic ansi.sys support + - Disney sound system emulation + - rewrote upcase/lowcase functions so they work fine with gcc3.2 + - SHELL: added rename and delete + - added support for command /C. Fixed crashes in the shell + - fixed various bugs when exiting dosbox + - fixed a bug in XMS + - fixed a bug with the joystick when pressing a button + - create nicer configfiles. + - bios_disk function improved. + - trapflag support + - improved vertical retrace timing. + - PIT Timer improvements and many bug fixes + - Many many bug fixes to the DOS subsystem + - Support for memory allocation strategy + - rewrote cpu mainloop to act more like a real cpu + +0.56 + - added support for a configclass/configfile + - added support for writing out the configclass into a configfile + - removed the language file and made it internal + - added support for writing the language file (will override the internal one) + - improved mousesupport + - updated readme + - support for screenshots + - some cpu-bug fixes + - dma changes + - Real Sound support + - EMM fixes and new functions. + - VGA fixes + - new wildcompare + - support for size and disktype at mount. + - added new debugger functionalities: start/trace into INTs, write processor status log, + step over rep and loop instructions, breakpoint support without using INT 03 (heavy debugging switch) + - Added more cpu instructions and changed the string operations. + - Added classes for most of the internal dos structures. + - Rewrote most of the fcb calls to use normal dos calls. + +0.55 + - fixed the errors/warnings in prefix_66.h and prefix_66_of.h (decimal too large becomming unsigned). + - fixed compilation error on FreeBSD when #disable_joystick was defined + - int10_writechar has been updated to move the cursor position. + - changed the basedir routines to use the current working dir instead of argv[0]. This will fix and brake things :) + - illegal command, now displays the command + - wildcmp updated to be case insensitive + - added fcb:open,close,findfirst, findnext. + - fixed rename in drive_local + - added new features to the debugger: breakpoint support / data view / command line + - partial support of list of lists (dos info block) + - full emm 3.2 support + - partial emm 4.0 support + - fixes to graphics core fonts (text in sierra games is now correct) + - improved support for user mousehandlers + - fixed EGA graphics + - fixed VGA graphics + - fixed write with size 0 + - changed memory management. + - fixed and cleaned up the cpu flags. + - changed interrupt handler. + - speeded up the graphics. + - speeded up the cpu-core + - changed dma + - improved dma streams from emm memory + - added some cga videomodes + - added more funtions to the keyboard handler + +0.50: + -added F3 to repeat the last typed command. + -made it possible to change the shellmessages(dosshell). so + you can costumize it.(dosbox.lang) + -changed cpu core. + -Fixed a lot of errors with the keyboard: shift-f1 and + alt-f1 now works. + -Fixed some division errors. + -made a plugin system. + -added a lot of real 386 mode instructions. + -made it possible to resize the screen. + -Mayor source cleanup/reorganisation. + -Complete rewrite of the graphics routines. Should make it + possible to implement more fancy things like 2xsai,interpolation. + -changed the sound playback. + -Changed the vga drawing to only draw on memory changes, instead + of drawing an entire frame. + -fixes to the soundblaster/dma code should be able to play 4-bit + adpcm compressed sounds. + -added the correct time to dir. + -bugfixes to batch-file handling. + -Lot's of small bugfixes.(Dune1&2,wolf3d, many more). + -Released the source. diff --git a/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_README.txt b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_README.txt new file mode 100644 index 0000000..e66a72a --- /dev/null +++ b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_README.txt @@ -0,0 +1,1469 @@ +DOSBox v0.74 Manual (always use the latest version from www.dosbox.com) + + + +===== +NOTE: +===== + +While we are hoping that one day DOSBox will run all programs ever made for +the PC, we are not there yet. +At present, DOSBox running on a high-end machine will roughly be the equivalent +of a Pentium I PC. DOSBox can be configured to run a wide range of DOS games, +from CGA/Tandy/PCjr classics up to games from the Quake era. + + + +====== +INDEX: +====== + +1. Quickstart +2. Start (FAQ) +3. Command Line Parameters +4. Internal Programs +5. Special Keys +6. Joystick/Gamepad +7. KeyMapper +8. Keyboard Layout +9. Serial Multiplayer feature +10. How to speed up/slow down DOSBox +11. Troubleshooting +12. DOSBox Status Window +13. The configuration (options) file +14. The language file +15. Building your own version of DOSBox +16. Special thanks +17. Contact + + + +============== +1. Quickstart: +============== + +Type INTRO in DOSBox for a quick tour. +It is essential that you get familiar with the idea of mounting, DOSBox does not +automatically make any drive (or a part of it) accessible to the emulation. See +the FAQ entry "How to start?" as well as the description of the MOUNT command +(section 4: "Internal Programs"). If you have your game on a cdrom you may try +this guide: http://vogons.zetafleet.com/viewtopic.php?t=8933 + + + +=============== +2. Start (FAQ): +=============== + +START: How to start? +AUTOMATION: Do I always have to type these "mount" commands? +FULLSCREEN: How do I change to fullscreen? +CD-ROM: My CD-ROM doesn't work. +CD-ROM: The game/application can't find its CD-ROM. +MOUSE: The mouse doesn't work. +SOUND: There is no sound. +SOUND: What sound hardware does DOSBox presently emulate? +SOUND: The sound stutters or sounds stretched/weird. +KEYBOARD: I can't type \ or : in DOSBox. +KEYBOARD: Right Shift and "\" doesn't work in DOSBox. (Windows only) +KEYBOARD: The keyboard lags. +CONTROL: The character/cursor/mouse pointer always moves into one direction! +SPEED: The game/application runs much too slow/too fast! +CRASH: The game/application does not run at all/crashes! +CRASH: DOSBox crashes on startup! +GAME: My Build game(Duke3D/Blood/Shadow Warrior) has problems. +SAFETY: Can DOSBox harm my computer? +OPTIONS: I would like to change DOSBox's options. +HELP: Great Manual, but I still don't get it. + + + +START: How to start? + At the beginning you've got a Z:\> instead of a C:\> at the prompt. + You have to make your directories available as drives in DOSBox by using + the "mount" command. For example, in Windows "mount C D:\GAMES" will give + you a C drive in DOSBox which points to your Windows D:\GAMES directory + (that was created before). In Linux, "mount c /home/username" will give you + a C drive in DOSBox which points to /home/username in Linux. + To change to the drive mounted like above, type "C:". If everything went + fine, DOSBox will display the prompt "C:\>". + + +AUTOMATION: Do I always have to type these commands? + In the DOSBox configuration file is an [autoexec] section. The commands + present there are run when DOSBox starts, so you can use this section + for the mounting. Look at Section 13: The configuration (options) file + + +FULLSCREEN: How do I change to fullscreen? + Press alt-enter. Alternatively: Edit the configuration file of DOSBox and + change the option fullscreen=false to fullscreen=true. If fullscreen looks + wrong in your opinion: Play with the options: fullresolution, output and + aspect in the configuration file of DOSBox. To get back from fullscreen + mode: Press alt-enter again. + + +CD-ROM: My CD-ROM doesn't work. + To mount your CD-ROM in DOSBox you have to specify some additional options + when mounting the CD-ROM. + To enable CD-ROM support (includes MSCDEX) in Windows: + - mount d f:\ -t cdrom + in Linux: + - mount d /media/cdrom -t cdrom + + In some cases you might want to use a different CD-ROM interface, + for example if CD audio does not work: + To enable SDL-support (does not include low-level CD access!): + - mount d f:\ -t cdrom -usecd 0 -noioctl + To enable ioctl access using digital audio extraction for CD audio + (windows-only, useful for Vista): + - mount d f:\ -t cdrom -ioctl_dx + To enable ioctl access using MCI for CD audio (windows-only): + - mount d f:\ -t cdrom -ioctl_mci + To force ioctl-only access (windows-only): + - mount d f:\ -t cdrom -ioctl_dio + To enable low-level aspi-support (win98 with aspi-layer installed): + - mount d f:\ -t cdrom -aspi + + explanation: - d driveletter you will get in DOSBox (d is the best, + don't change it!) + - f:\ location of CD-ROM on your PC. In most cases it will + be d:\ or e:\ + - 0 The number of the CD-ROM drive, reported by "mount -cd" + (note that this value is only needed when using SDL + for CD audio, otherwise it is ignored) + See also the next question: The game/application can't find its CD-ROM. + + +CD-ROM: The game/application can't find its CD-ROM. + Be sure to mount the CD-ROM with -t cdrom switch, this will enable the + MSCDEX interface required by DOS games to interface with CD-ROMs. + Also try adding the correct label (-label LABEL) to the mount command, + where LABEL is the CD-label (volume ID) of the CD-ROM. + Under Windows you can specify -ioctl, -aspi or -noioctl. Look at the + description of the mount command in Section 4: "Internal programs" + for their meaning and the + additional audio-CD related options -ioctl_dx, ioctl_mci, ioctl_dio. + + Try creating a CD-ROM image (preferably CUE/BIN pair) and use the + DOSBox's internal IMGMOUNT tool to mount the image (the CUE sheet). + This enables very good low-level CD-ROM support on any operating system. + + +MOUSE: The mouse doesn't work. + Usually, DOSBox detects when a game uses mouse control. When you click on + the screen it should get locked (confined to the DOSBox window) and work. + With certain games, the DOSBox mouse detection doesn't work. In that case + you will have to lock the mouse manually by pressing CTRL-F10. + + +SOUND: There is no sound. + Be sure that the sound is correctly configured in the game. This might be + done during the installation or with a setup/setsound utility that + accompanies the game. First see if an autodetection option is provided. If + there is none try selecting Soundblaster or Soundblaster 16 with the default + settings being "address=220 irq=7 dma=1" (sometimes highdma=5). You might + also want to select Sound Canvas/SCC/MPU-401/General MIDI/Wave Blaster + at "address=330 IRQ=2" as music device. + The parameters of the emulated sound cards can be changed in the DOSBox + configuration file. + If you still don't get any sound set the core to normal in DOSBox + configuration and use some lower fixed cycles value (like cycles=2000). Also + assure that your host operating sound does provide sound. + In certain cases it might be useful to use a different emulated sound device + like a soundblaster pro (sbtype=sbpro1 in the DOSBox configuration file) or + the gravis ultrasound (gus=true). + + +SOUND: What sound hardware does DOSBox presently emulate? + DOSBox emulates several legacy sound devices: + - Internal PC speaker/Buzzer + This emulation includes both the tone generator and several forms of + digital sound output through the internal speaker. + - Creative CMS/Gameblaster + The is the first card released by Creative Labs(R). The default + configuration places it on address 220. It is disabled as default. + - Tandy 3 voice + The emulation of this sound hardware is complete with the exception of + the noise channel. The noise channel is not very well documented and as + such is only a best guess as to the sound's accuracy. It is disabled as + default. + - Tandy DAC + Some games may require turning off sound blaster emulation (sbtype=none) + for better tandy DAC sound support. Don't forget to set the sbtype back to + sb16 if you don't use tandy sound. + - Adlib + This emulation is almost perfect and includes the Adlib's ability to + almost play digitized sound. Placed at address 220 (also on 388). + - SoundBlaster 16 / SoundBlaster Pro I & II / SoundBlaster I & II + By default DOSBox provides Soundblaster 16 level 16-bit stereo sound. + You can select a different SoundBlaster version in the configuration of + DOSBox. AWE32 music is not emulated as you can use MPU-401 instead + (see below). + - Disney Sound Source and Covox Speech Thing + Using the printer port, this sound device outputs digital sound only. + Placed at LPT1 + - Gravis Ultrasound + The emulation of this hardware is nearly complete, though the MIDI + capabilities have been left out, since an MPU-401 has been emulated + in other code. For Gravis music you also have to install Gravis drivers + inside DOSBox. It is disabled as default. + - MPU-401 + A MIDI passthrough interface is also emulated. This method of sound + output will only work when used with external device/emulator. + Every Windows XP/Vista/7 and MAC OS has got a default emulator compatible + with: Sound Canvas/SCC/General Standard/General MIDI/Wave Blaster. + A different device/emulator is needed for Roland LAPC/CM-32L/MT-32 + compatibility. + + +SOUND: The sound stutters or sounds stretched/weird. + You may be using too much CPU power to keep DOSBox running at the current + speed. You can lower the cycles, skip frames, reduce the sampling rate of + the respective sound device, increase the prebuffer. See section 13: "The + configuration (options) file" + If you are using cycles=max or =auto, then make sure that there is no + background processes interfering! (especially if they access the harddisk) + Also look at Section 10. "How to speed up/slow down DOSBox" + + +KEYBOARD: I can't type \ or : in DOSBox. + This can happen in various cases, like your host keyboard layout does not + have a matching DOS layout representation (or it was not correctly + detected), or the key mapping is wrong. + Some possible fixes: + 1. Use / instead, or ALT-58 for : and ALT-92 for \. + 2. Change the DOS keyboard layout (see Section 8: Keyboard Layout). + 3. Add the commands you want to execute to the [autoexec] section + of the DOSBox configuration file. + 4. Open the DOSBox configuration file and change the usescancodes entry. + 5. Switch the keyboard layout of your operating system. + + Note that if the host layout can not be identified, or keyboardlayout is + set to none in the DOSBox configuration file, the standard US layout is + used. In this configuration try the keys around "enter" for the key \ + (backslash), and for the key : (colon) use shift and the keys between + "enter" and "L". + + +KEYBOARD: Right Shift and "\" doesn't work in DOSBox. (Windows only) + This may happen if Windows thinks that you have more than one keyboard + connected to your PC when you use some remote control devices. + To verity this problem run cmd.exe, navigate to DOSBox program folder + and type: + set sdl_videodriver=windib + dosbox.exe + check whether keyboard started to work properly. As windib is slower it is + best to use one of the two solutions provided here: + http://vogons.zetafleet.com/viewtopic.php?t=24072 + + +KEYBOARD: The keyboard lags. + Lower the priority setting in the DOSBox configuration file, for example + set "priority=normal,normal". You might also want to try lowering the + cycles (use a fixed cycle amount to start with, like cycles=10000). + + +CONTROL: The character/cursor/mouse pointer always moves into one direction! + See if it still happens if you disable the joystick emulation, + set joysticktype=none in the [joystick] section of your DOSBox + configuration file. Maybe also try unplugging any joystick/gamepad. + If you want to use the joystick in the game, try setting timed=false + and be sure to calibrate the joystick (both in your OS as well as + in the game or the game's setup program). + + +SPEED: The game/application runs much too slow/too fast! + Look at the section 10: "How to speed up/slow down DOSBox" for more + information. + + +CRASH: The game/application does not run at all/crashes! + Look at Section 11: Troubleshooting + + +CRASH: DOSBox crashes on startup!. + Look at Section 11: Troubleshooting + + +GAME: My Build game(Duke3D/Blood/Shadow Warrior) has problems. + First of all, try to find a port of the game. Those will offer a better + experience. To fix the graphics problem that occurs in DOSBox on higher + resolutions: Open the configuration file of DOSBox and search for + machine=svga_s3. Change svga_s3 to vesa_nolfb + Change memsize=16 to memsize=63 + + +SAFETY: Can DOSBox harm my computer? + DOSBox can not harm your computer more than any other resource demanding + program. Increasing the cycles does not overclock your real CPU. + Setting the cycles too high has a negative performance effect on the + software running inside DOSBox. + + +OPTIONS: I would like to change DOSBox's options. + Look at Section 13. "The configuration (options) file" + + +HELP: Great Manual, but I still don't get it. + For more questions read the rest of this Manual. You may also look at: + guides located at http://vogons.zetafleet.com/viewforum.php?f=39 + the wiki of DOSBox http://www.dosbox.com/wiki/ + the site/forum: http://www.dosbox.com + + + +=========================== +3. Command Line Parameters: +=========================== + +An overview of the command line options you can give to DOSBox. Although +in most cases it is easier to use DOSBox's configuration file instead. +See: Section 13. "The configuration (options) file" + +To be able to use Command Line Parameters: +(Windows) open cmd.exe or command.com or edit the shortcut to dosbox.exe +(Linux) use console +(MAC OS X) start terminal.app and navigate to: + /applications/dosbox.app/contents/macos/dosbox + +The options are valid for all operating systems unless noted in the option +description: + +dosbox [name] [-exit] [-c command] [-fullscreen] [-userconf] + [-conf congfigfilelocation] [-lang languagefilelocation] + [-machine machine type] [-noconsole] [-startmapper] [-noautoexec] + [-securemode] [-scaler scaler | -forcescaler scaler] [-version] + [-socket socket] + +dosbox -version +dosbox -editconf program +dosbox -opencaptures program +dosbox -printconf +dosbox -eraseconf +dosbox -erasemapper + + name + If "name" is a directory it will mount that as the C: drive. + If "name" is an executable it will mount the directory of "name" + as the C: drive and execute "name". + + -exit + DOSBox will close itself when the DOS application "name" ends. + + -c command + Runs the specified command before running "name". Multiple commands + can be specified. Each command should start with "-c" though. + A command can be: an Internal Program, a DOS command or an executable + on a mounted drive. + + -fullscreen + Starts DOSBox in fullscreen mode. + + -userconf + Start DOSBox with the users specific configuration file. Can be used + together with multiple -conf parameters, but -userconf will always be + loaded before them. + + -conf configfilelocation + Start DOSBox with the options specified in "configfilelocation". + Multiple -conf options may be present. + See Section 13 for more details. + + -lang languagefilelocation + Start DOSBox using the language specified in "languagefilelocation". + See Section 14 for more details. + + -machine machinetype + Setup DOSBox to emulate a specific type of machine. Valid choices are: + hercules, cga, ega, pcjr, tandy, svga_s3 (default) as well as + the additional svga chipsets listed in the DOSBox configuration file. + svga_s3 enables vesa emulation as well. + For some special vga effects the machinetype vgaonly can be used, + note that this disables svga capabilities and might be slower due to the + higher emulation precision. + The machinetype affects the video card and the available sound cards. + + -noconsole (Windows Only) + Start DOSBox without showing DOSBox Status Window (console). + Output will be redirected to stdout.txt and stderr.txt + + -startmapper + Enter the keymapper directly on startup. Useful for people with + keyboard problems. + + -noautoexec + Skips the [autoexec] section of the loaded configuration file. + + -securemode + Same as -noautoexec, but adds config.com -securemode at the + bottom of AUTOEXEC.BAT (which in turn disables any changes to how + the drives are mounted inside DOSBox). + + -scaler scaler + Uses the scaler specified by "scaler". See the DOSBox configuration file + for the available scalers. + + -forcescaler scaler + Similar to the -scaler parameter, but tries to force usage of + the specified scaler even if it might not fit. + + -version + output version information and exit. Useful for frontends. + + -editconf program + calls program with as first parameter the configuration file. + You can specify this command more than once. In this case it will + move to second program if the first one fails to start. + + -opencaptures program + calls program with as first parameter the location of the captures + folder. + + -printconf + prints the location of the default configuration file. + + -resetconf + removes the default configuration file. + + -resetmapper + removes the mapperfile used by the default clean configuration file. + + -socket + passes the socket number to the nullmodem emulation. See Section 9: + "Serial Multiplayer feature." + +Note: If a name/command/configfilelocation/languagefilelocation contains + a space, put the whole name/command/configfilelocation/languagefilelocation + between quotes ("command or file name"). If you need to use quotes within + quotes (most likely with -c and mount): + Windows and OS/2 users can use single quotes inside the double quotes. + Other people should be able to use escaped double quotes inside the + double quotes. + Windows: -c "mount c 'c:\My folder with DOS games\'" + Linux: -c "mount c \"/tmp/name with space\"" + +A rather unusual example, just to demonstrate what you can do (Windows): +dosbox D:\folder\file.exe -c "MOUNT Y H:\MyFolder" + This mounts D:\folder as C:\ and runs file.exe. + Before it does that, it will first mount H:\MyFolder as the Y drive. + +In Windows, you can also drag directories/files onto the DOSBox executable. + + + +===================== +4. Internal Programs: +===================== + +DOSBox supports most of the DOS commands found in command.com. +To get a list of the internal commands type "HELP" at the prompt. + +In addition, the following commands are available: + +MOUNT "Emulated Drive letter" "Real Drive or Directory" + [-t type] [-aspi] [-ioctl] [-noioctl] [-usecd number] [-size drivesize] + [-label drivelabel] [-freesize size_in_mb] + [-freesize size_in_kb (floppies)] +MOUNT -cd +MOUNT -u "Emulated Drive letter" + + Program to mount local directories as drives inside DOSBox. + + "Emulated Drive letter" + The driveletter inside DOSBox (for example C). + + "Real Drive letter (usually for CD-ROMs in Windows) or Directory" + The local directory you want accessible inside DOSBox. + + -t type + Type of the mounted directory. + Supported are: dir (default), floppy, cdrom. + + -size drivesize + (experts only) + Sets the size of the drive, where drivesize is of the form + "bps,spc,tcl,fcl": + bps: bytes per sector, by default 512 for regular drives and + 2048 for CD-ROM drives + spc: sectors per cluster, usually between 1 and 127 + tcl: total clusters, between 1 and 65534 + fcl: total free clusters, between 1 and tcl + + -freesize size_in_mb | size_in_kb + Sets the amount of free space available on a drive + in megabytes (regular drives) or kilobytes (floppy drives). + This is a simpler version of -size. + + -label drivelabel + Sets the name of the drive to "drivelabel". Needed on some systems + if the CD-ROM label isn't read correctly (useful when a program + can't find its CD-ROM). If you don't specify a label + and no lowlevel support is selected (that is omitting the -usecd # + and/or -aspi parameters, or specifying -noioctl): + For Windows: label is extracted from "Real Drive". + For Linux: label is set to NO_LABEL. + + If you do specify a label, this label will be kept as long as the drive + is mounted. It will not be updated !! + + -aspi + Forces use of the aspi layer. Only valid if mounting a CD-ROM under + Windows systems with an ASPI-Layer. + + -ioctl (automatic selection of the CD audio interface) + -ioctl_dx (digital audio extraction used for CD audio) + -ioctl_dio (ioctl calls used for CD audio) + -ioctl_mci (MCI used for CD audio) + Forces use of ioctl commands. Only valid if mounting a CD-ROM under + a Windows OS which support them (Win2000/XP/NT). + The various choices only differ in the way CD audio is handled, + preferably -ioctl_dio is used (lowest workload), but this might not + work on all systems, so -ioctl_dx (or -ioctl_mci) can be used. + + -noioctl + Forces use of the SDL CD-ROM layer. Valid on all systems. + + -usecd number + Valid on all systems, under windows the -noioctl switch has to be + present to make use of the -usecd switch. + Enables to select the drive that should be used by SDL. Use this if + the wrong or no CD-ROM drive is mounted while using the SDL CD-ROM + interface. "number" can be found by "MOUNT -cd". + + -cd + Displays all CD-ROM drives detected by SDL, and their numbers. + See the information at the -usecd entry above. + + -u + Removes the mount. Doesn't work for Z:\. + + Note: It's possible to mount a local directory as CD-ROM drive, + but hardware support is then missing. + + Basically MOUNT allows you to connect real hardware to DOSBox's emulated PC. + So MOUNT C C:\GAMES tells DOSBox to use your C:\GAMES directory as drive C: + in DOSBox. MOUNT C E:\SomeFolder tells DOSBox to use your E:\SomeFolder + directory as drive C: in DOSBox. + + Mounting your entire C drive with MOUNT C C:\ is NOT recommended! The same + is true for mounting the root of any other drive, except for CD-ROMs (due to + their read-only nature). + Otherwise if you or DOSBox make a mistake you may lose all your files. + Also never mount a "Windows" or "Program Files" folders or their subfolders + in Windows Vista/7 as DOSBox may not work correctly, or will stop working + correctly later. It is recommended to keep all your dos applications/games + in a simple folder (for example c:\dosgames) and mount that. + + You should always install your game inside DOSBox. + So if you have the game on CD you always (even after installation!) + have to mount both: folder as a harddisk drive and a CD-ROM. + HardDisk should always be mounted as c + CD-ROM should always be mounted as d + Floppy should always be mounted as a (or b) + + Basic MOUNT Examples for normal usage (Windows): + + 1. To mount a folder as a harddisk drive: + mount c d:\dosgames + + 3. To mount your CD-ROM drive E as CD-ROM drive D in DOSBox: + mount d e:\ -t cdrom + + 2. To mount your drive a: as a floppy: + mount a a:\ -t floppy + + Advanced MOUNT examples (Windows): + + 4. To mount a hard disk drive with ~870 mb free diskspace (simple version): + mount c d:\dosgames -freesize 870 + + 5. To mount a drive with ~870 mb free diskspace (experts only, full control): + mount c d:\dosgames -size 512,127,16513,13500 + + 1. To mount c:\dosgames\floppy as a floppy: + mount a c:\dosgames\floppy -t floppy + + + Other MOUNT examples: + + 3. To mount system CD-ROM drive at mountpoint /media/cdrom as CD-ROM drive D + in DOSBox: + mount d /media/cdrom -t cdrom -usecd 0 + + 6. To mount /home/user/dosgames as drive C in DOSBox: + mount c /home/user/dosgames + + 7. To mount the directory where DOSBox was started as C in DOSBox: + mount c . + (note the . which represents the directory where DOSBox was started, + on Windows Vista/7 don't use this if you installed DOSBox + to your "Program Files" folder) + + If you want to mount a CD image or floppy image, check IMGMOUNT. + MOUNT also works with images but only if you use external program, + for example (both are free): + - Daemon Tools Lite (for CD images), + - Virtual Floppy Drive (for floppy images). + Although IMGMOUNT can give better compatibility. + + +MEM + Program to display the amount and type of free memory. + + +VER +VER set major_version [minor_version] + Display the current DOSBox version and reported DOS version + (parameterless usage). + Change the reported DOS version with the "set" parameter, + for example: "VER set 6 22" to have DOSBox report DOS 6.22 as version number. + + +CONFIG -writeconf filelocation +CONFIG -writelang filelocation +CONFIG -securemode +CONFIG -set "section property=value" +CONFIG -get "section property" + + CONFIG can be used to change or query various settings of DOSBox + during runtime. It can save the current settings and language strings to + disk. Information about all possible sections and properties can + be found in Section 13: "The configuration (options) file". + + -writeconf filelocation + Write the current configuration settings to a file in a specified location. + "filelocation" is located on the local drive, not a mounted drive in DOSBox. + The configuration file controls various settings of DOSBox: + the amount of emulated memory, the emulated sound cards and many more + things. It allows access to AUTOEXEC.BAT as well. + See Section 13: "The configuration (options) file" for more information. + + -writelang filelocation + Write the current language settings to a file in a specified location. + "filelocation" is located on the local drive, not a mounted drive + in DOSBox. The language file controls all visible output of the internal + commands and the internal DOS. + See Section 14: "The Language File" for more information. + + -securemode + Switches DOSBox to a more secure mode. In this mode the internal + commands MOUNT, IMGMOUNT and BOOT won't work. It's not possible either + to create a new configfile or languagefile in this mode. + (Warning: you can only undo this mode by restarting DOSBox.) + + -set "section property=value" + CONFIG will attempt to set the property to new value. + Currently CONFIG can not report whether the command succeeded or not. + + -get "section property" + The current value of the property is reported and stored in the + environment variable %CONFIG%. This can be used to store the value + when using batch files. + + Both "-set" and "-get" work from batch files and can be used to set up your + own preferences for each game. Although it may be easier to use separate + DOSBox's configuration files for each game instead. + + Examples: + 1. To create a configuration file in your c:\dosgames directory: + config -writeconf c:\dosgames\dosbox.conf + 2. To set the cpu cycles to 10000: + config -set "cpu cycles=10000" + 3. To turn ems memory emulation off: + config -set "dos ems=off" + 4. To check which cpu core is being used. + config -get "cpu core" + + +LOADFIX [-size] [program] [program-parameters] +LOADFIX -f + Program to reduce the amount of available conventional memory. + Useful for old programs which don't expect much memory to be free. + + -size + number of kilobytes to "eat up", default = 64kb + + -f + frees all previously allocated memory + + Examples: + 1. To start mm2.exe and allocate 64kb memory + (mm2 will have 64 kb less available): + loadfix mm2 + 2. To start mm2.exe and allocate 32kb memory: + loadfix -32 mm2 + 3. To free previous allocated memory: + loadfix -f + + +RESCAN + Make DOSBox reread the directory structure. Useful if you changed something + on a mounted drive outside of DOSBox. (CTRL - F4 does this as well!) + + +MIXER + Makes DOSBox display its current volume settings. + Here's how you can change them: + + mixer channel left:right [/NOSHOW] [/LISTMIDI] + + channel + Can be one of the following: MASTER, DISNEY, SPKR, GUS, SB, FM [, CDAUDIO]. + CDAUDIO is only available if a CD-ROM interface with volume control is + enabled (CD image, ioctl_dx). + + left:right + The volume levels in percentages. If you put a D in front it will be + in decibel (Example: mixer gus d-10). + + /NOSHOW + Prevents DOSBox from showing the result if you set one + of the volume levels. + + /LISTMIDI + In Windows lists the available midi devices on your PC. To select a device + other than the Windows default midi-mapper, change the line 'midiconfig=' + in the [midi] section of the configuration file to 'midiconfig=id', where + 'id' is the number for the device as listed by LISTMIDI. eg. midiconfig=2 + + In Linux this option doesn't work, but you get similar results by using + 'pmidi -l' in console. Then change the line 'midiconfig=' to + 'midiconfig=port', where 'port' is the port for the device as listed by + 'pmidi -l'. eg. midiconfig=128:0 + + +IMGMOUNT + A utility to mount disk images and CD-ROM images in DOSBox. + + IMGMOUNT DRIVE [imagefile] -t [image_type] -fs [image_format] + -size [sectorsbytesize, sectorsperhead, heads, cylinders] + IMGMOUNT DRIVE [imagefile1 imagefile2 .. imagefileN] -t cdrom -fs iso + + imagefile + Location of the image file to mount in DOSBox. The location can be + on a mounted drive inside DOSBox, or on your real disk. It is possible + to mount CD-ROM images (ISOs or CUE/BIN or CUE/IMG) too. + If you need CD swapping capabilities, specify all images in succession + (see the next entry). + CUE/BIN pairs and cue/img are the preferred CD-ROM image types as they can + store audio tracks compared to ISOs (which are data-only). For + the CUE/BIN mounting always specify the CUE sheet. + + imagefile1 imagefile2 .. imagefileN + Location of the image files to mount in DOSBox. Specifying a number + of image files is only allowed for CD-ROM images. + The CD's can be swapped with CTRL-F4 at any time. + This is required for games which use multiple CD-ROMs and require the CD + to be switched during the gameplay at some point. + + -t + The following are valid image types: + floppy: Specifies a floppy image. DOSBox will automatically identify + the disk geometry (360K, 1.2MB, 720K, 1.44MB, etc). + cdrom: Specifies a CD-ROM image. The geometry is automatic and + set for this size. This can be an iso or a cue/bin pair or + a cue/img pair. + hdd: Specifies a harddrive image. The proper CHS geometry must be set + for this to work. + + -fs + The following are valid file system formats: + iso: Specifies the ISO 9660 CD-ROM format. + fat: Specifies that the image uses the FAT file system. DOSBox will + attempt to mount this image as a drive in DOSBox and make + the files available from inside DOSBox. + none: DOSBox will make no attempt to read the file system on the disk. + This is useful if you need to format it or if you want to boot + the disk using the BOOT command. When using the "none" + filesystem, you must specify the drive number (2 or 3, + where 2 = master, 3 = slave) rather than a drive letter. + For example, to mount a 70MB image as the slave drive device, + you would type (without the quotes): + "imgmount 3 d:\test.img -size 512,63,16,142 -fs none" + Compare this with a mount to be able to access the drive + within DOSBox, which would read as: + "imgmount e: d:\test.img -size 512,63,16,142" + + -size + The Cylinders, Heads and Sectors of the drive. + Required to mount hard drive images. + + An example how to mount CD-ROM images (in Linux): + 1. imgmount d /tmp/cdimage1.cue /tmp/cdimage2.cue -t cdrom + or (which also works): + 2a. mount c /tmp + 2b. imgmount d c:\cdimage1.cue c:\cdimage2.cue -t cdrom + (in Windows): + imgmount d f:\img\CD1.cue f:\img\CD2.cue f:\img\CD3.cue -t cdrom + imgmount d "g:\img\7th Guest CD1.cue" "g:\img\7th Guest CD2.cue" -t cdrom + Don't forget that you can also use MOUNT with images, but only if you use + external program, for example (both are free): + - Daemon Tools Lite (for CD images), + - Virtual Floppy Drive (for floppy images). + Although IMGMOUNT can give better compatibility. + + +BOOT + Boot will start floppy images or hard disk images independent of + the operating system emulation offered by DOSBox. This will allow you to + play booter floppies or boot other operating systems inside DOSBox. + If the target emulated system is PCjr (machine=pcjr) the boot command + can be used to load PCjr cartridges (.jrc). + + BOOT [diskimg1.img diskimg2.img .. diskimgN.img] [-l driveletter] + BOOT [cart.jrc] (PCjr only) + + diskimg1.img diskimg2.img .. diskimgN.img + This can be any number of floppy disk images one wants mounted after + DOSBox boots the specified drive letter. + To swap between images, hit CTRL-F4 to change from the current disk + to the next disk in the list. The list will loop back from the last + disk image to the beginning. + + [-l driveletter] + This parameter allows you to specify the drive to boot from. + The default is the A drive, the floppy drive. You can also boot + a hard drive image mounted as master by specifying "-l C" + without the quotes, or the drive as slave by specifying "-l D" + + cart.jrc (PCjr only) + When emulation of a PCjr is enabled, cartridges can be loaded with + the BOOT command. Support is still limited. + + +IPX + + You need to enable IPX networking in the configuration file of DOSBox. + + All of the IPX networking is managed through the internal DOSBox program + IPXNET. For help on the IPX networking from inside DOSBox, type + "IPXNET HELP" (without quotes) and the program will list the commands + and relevant documentation. + + With regard to actually setting up a network, one system needs to be + the server. To set this up, type "IPXNET STARTSERVER" (without the quotes) + in a DOSBox session. The server DOSBox session will automatically add + itself to the virtual IPX network. For every additional computer that + should be part of the virtual IPX network, you'll need to type + "IPXNET CONNECT ". + For example, if your server is at bob.dosbox.com, you would type + "IPXNET CONNECT bob.dosbox.com" on every non-server system. + + To play games that need Netbios a file named NETBIOS.EXE from Novell is + needed. Establish the IPX connection as explained above, then run + "netbios.exe". + + The following is an IPXNET command reference: + + IPXNET CONNECT + + IPXNET CONNECT opens a connection to an IPX tunneling server + running on another DOSBox session. The "address" parameter specifies + the IP address or host name of the server computer. You can also + specify the UDP port to use. By default IPXNET uses port 213 - the + assigned IANA port for IPX tunneling - for its connection. + + The syntax for IPXNET CONNECT is: + IPXNET CONNECT address + + IPXNET DISCONNECT + + IPXNET DISCONNECT closes the connection to the IPX tunneling server. + + The syntax for IPXNET DISCONNECT is: + IPXNET DISCONNECT + + IPXNET STARTSERVER + + IPXNET STARTSERVER starts an IPX tunneling server on this DOSBox + session. By default, the server will accept connections on UDP port + 213, though this can be changed. Once the server is started, DOSBox + will automatically start a client connection to the IPX tunneling server. + + The syntax for IPXNET STARTSERVER is: + IPXNET STARTSERVER + + If the server is behind a router, UDP port needs to be forwarded + to that computer. + + On Linux/Unix-based systems port numbers smaller than 1023 can only be + used with root privileges. Use ports greater than 1023 on those systems. + + IPXNET STOPSERVER + + IPXNET STOPSERVER stops the IPX tunneling server running on this DOSBox + session. Care should be taken to ensure that all other connections have + terminated as well, since stopping the server may cause lockups on other + machines that are still using the IPX tunneling server. + + The syntax for IPXNET STOPSERVER is: + IPXNET STOPSERVER + + IPXNET PING + + IPXNET PING broadcasts a ping request through the IPX tunneled network. + In response, all other connected computers will respond to the ping + and report the time it took to receive and send the ping message. + + The syntax for IPXNET PING is: + IPXNET PING + + IPXNET STATUS + + IPXNET STATUS reports the current state of this DOSBox session's + IPX tunneling network. For a list of all computers connected to the + network use the IPXNET PING command. + + The syntax for IPXNET STATUS is: + IPXNET STATUS + + +KEYB [keyboardlayoutcode [codepage [codepagefile]]] + + Change the keyboard layout. For detailed information about keyboard layouts + please see Section 8: "Keyboard Layout" + + [keyboardlayoutcode] is a string consisting of five or less characters, + examples are PL214 (Polish typists) or PL457 (Polish programmers). + It specifies the keyboard layout to be used. + The list of all layouts built into DOSBox is here: + http://vogons.zetafleet.com/viewtopic.php?t=21824 + + [codepage] is the number of the codepage to be used. The keyboard layout + has to provide support for the specified codepage, otherwise the layout + loading will fail. + If no codepage is specified, an appropriate codepage for the requested + layout is chosen automatically. + + [codepagefile] can be used to load codepages that are yet not compiled + into DOSBox. This is only needed when DOSBox does not find the codepage. + If no codepagefile is specified, but you place all ten ega.cpx files + (from FreeDOS) in the DOSBox program folder, an appropriate codepagefile + for the requested layout/codepage is chosen automatically. + + Examples: + 1. To load the polish typist keys layout (automatically uses codepage 852): + keyb pl214 + 2. To load one of russian keyboard layouts with codepage 866: + keyb ru441 866 + In order to type russian characters press ALT+RIGHT-SHIFT. + 3. To load one of french keyboard layouts with codepage 850 (where the + codepage is defined in EGACPI.DAT): + keyb fr189 850 EGACPI.DAT + 4. To load codepage 858 (without a keyboard layout): + keyb none 858 + This can be used to change the codepage for the FreeDOS keyb2 utility. + 5. To display the current codepage and, if loaded, the keyboard layout: + keyb + + + +For more information use the /? command line switch with the programs. + + + +================ +5. Special Keys: +================ + +ALT-ENTER Switch to full screen and back. +ALT-PAUSE Pause emulation (hit ALT-PAUSE again to continue). +CTRL-F1 Start the keymapper. +CTRL-F4 Change between mounted floppy/CD images. Update directory cache + for all drives. +CTRL-ALT-F5 Start/Stop creating a movie of the screen. (avi video capturing) +CTRL-F5 Save a screenshot. (PNG format) +CTRL-F6 Start/Stop recording sound output to a wave file. +CTRL-ALT-F7 Start/Stop recording of OPL commands. (DRO format) +CTRL-ALT-F8 Start/Stop the recording of raw MIDI commands. +CTRL-F7 Decrease frameskip. +CTRL-F8 Increase frameskip. +CTRL-F9 Kill DOSBox. +CTRL-F10 Capture/Release the mouse. +CTRL-F11 Slow down emulation (Decrease DOSBox Cycles). +CTRL-F12 Speed up emulation (Increase DOSBox Cycles)*. +ALT-F12 Unlock speed (turbo button/fast forward)**. +F11, ALT-F11 (machine=cga) change tint in NTSC output modes*** +F11 (machine=hercules) cycle through amber, green, white colouring*** + +*NOTE: Once you increase your DOSBox cycles beyond your computer CPU resources, + it will produce the same effect as slowing down the emulation. + This maximum will vary from computer to computer. + +**NOTE: You need free CPU resources for this (the more you have, the faster + it goes), so it won't work at all with cycles=max or a too high amount + of fixed cycles. You have to keep the keys pressed for it to work! + +***NOTE: These keys won't work if you saved a mapper file earlier with + a different machine type. So either reassign them or reset the mapper. + +These are the default keybindings. They can be changed in the keymapper +(see Section 7: KeyMapper). + +In MAC OS you can try using cmd(applekey) together with Ctrl if the key doesn't +work eg. cmd-ctrl-F1, but some keys may still need remapping (in Linux too). + +Saved/recorded files can be found in: + (Windows) "Start/WinLogo Menu"->"All Programs"->DOSBox-0.74->Extras + (Linux) ~/.dosbox/capture + (MAC OS X) "~/Library/Preferences/capture" +This can be changed in the DOSBox configuration file. + + + +==================== +6. Joystick/Gamepad: +==================== + +The standard joystick port in DOS supports a maximum of 4 axes and 4 buttons. +For more, different modifications of that configuration were used. + +To force DOSBox to use a different type of emulated joystick/gamepad, the entry +"joysticktype" in the [joystick] section of the DOSBox configuration file can +be used. + +none - disables controller support. +auto - (default) autodetects whether you have one or two controllers connected: + if you have one - '4axis' setting is used, + if you have two - '2axis' setting is used. +2axis - If you have two controllers connected, each will emulate a joystick + with 2 axes and 2 buttons. If you have only one controller connected, + it will emulate a joystick with only 2 axis and 2 buttons. +4axis - supports only first controller, emulates a joystick + with 4 axis and 4 buttons or a gamepad with 2axis and 6 buttons. +4axis_2 - supports only second controller. +fcs - supports only first controller, emulates ThrustMaster + Flight Control System, with 3-axes, 4 buttons and 1 hat. +ch - supports only first controller, emulates CH Flightstick, + with 4-axes, 6 buttons and 1 hat, but you cannot press more + than one button at the same time. + +You also have to configure controller properly inside the game. + +It is important to remember that if you saved the mapperfile without joystick + +connected, or with a different joystick setting, your new setting will +not work +properly, +or not work at all, until you reset DOSBox's mapperfile. + + +If controller is working properly outside DOSBox, but doesn't calibrate properly +inside DOSBox, try different 'timed' setting in DOSBox's configuration file. + + + +============= +7. KeyMapper: +============= + +You start the DOSBox mapper either with CTRL-F1 (see section 5. Special Keys) +or -startmapper (see Section 3. Command Line Parameters). +You are presented with a virtual keyboard and a virtual joystick. + +These virtual devices correspond to the keys and events DOSBox will +report to the DOS applications. If you click on a button with your mouse, +you can see in the lower left corner with which event it is associated +(EVENT) and to what events it is currently bound. + +Event: EVENT +BIND: BIND (the real key/button/axis you push with your finger/hand) + + Add Del +mod1 hold Next +mod2 +mod3 + + +EVENT + The key or joystick axis/button/hat DOSBox will report to DOS applications. + (the event that will happen during the game, (eg. shooting/jumping/walking) +BIND + The key on your real keyboard or the axis/button/hat on your real + joystick(s) (as reported by SDL), which is connected to the EVENT. +mod1,2,3 + Modifiers. These are keys you need to have to be pressed while pressing + BIND. mod1 = CTRL and mod2 = ALT. These are generally only used when you + want to change the special keys of DOSBox. +Add + Add a new BIND to this EVENT. Basically add a key from your keyboard or an + event from the joystick (button press, axis/hat movement) which will + produce the EVENT in DOSBox. +Del + Delete the BIND to this EVENT. If an EVENT has no BINDS, then it is not + possible to trigger this event in DOSBox (that is there's no way to type + the key or use the respective action of the joystick). +Next + Go through the list of bindings which map to this EVENT. + + +Example: +Q1. You want to have the X on your keyboard to type a Z in DOSBox. + A. Click on the Z on the keyboard mapper. Click "Add". + Now press the X key on your keyboard. + +Q2. If you click "Next" a couple of times, you will notice that the Z on your + keyboard also produces an Z in DOSBox. + A. Therefore select the Z again, and click "Next" until you have the Z on + your keyboard. Now click "Del". + +Q3. If you try it out in DOSBox, you will notice that pressing X makes ZX + appear. + A. The X on your keyboard is still mapped to the X as well! Click on + the X in the keyboard mapper and search with "Next" until you find the + mapped key X. Click "Del". + + +Examples about remapping the joystick: + You have a joystick attached, it is working fine under DOSBox and you + want to play some keyboard-only game with the joystick (it is assumed + that the game is controlled by the arrows on the keyboard): + 1. Start the mapper, then click on one of the left keyboard arrow. + EVENT should be key_left. Now click on Add and move your joystick + in the respective direction, this should add an event to the BIND. + 2. Repeat the above for the missing three directions, additionally + the buttons of the joystick can be remapped as well (fire/jump). + 3. Click on Save, then on Exit and test it with some game. + + You want to swap the y-axis of the joystick because some flightsim uses + the up/down joystick movement in a way you don't like, and it is not + configurable in the game itself: + 1. Start the mapper and click on Y- in the first joystick field. + EVENT should be jaxis_0_1-. + 2. Click on Del to remove the current binding, then click Add and move + your joystick downwards. A new bind should be created. + 3. Repeat this for Y+, save the layout and finally test it with some game. + + If you want to remap anything to your d-pad/hat you will have to change + 'joysticktype=auto' to 'joysticktype=fcs' in configuration file. Maybe this + will be improved in the next dosbox version. + + +If you change the default mapping, you can save your changes by clicking on +"Save". DOSBox will save the mapping to a location specified in +the configuration file (the mapperfile= entry). At startup, DOSBox will load +your mapperfile, if it is present in the DOSBox configuration file. + + + +=================== +8. Keyboard Layout: +=================== + +To switch to a different keyboard layout, either the entry "keyboardlayout" +in the [dos] section of the DOSBox configuration file can be used, or the +internal DOSBox program keyb.com (Section 4: Internal Programs) +Both accept DOS conforming language codes (see below), +but only by using keyb.com a custom codepage can be specified. + +The default keyboardlayout=auto currently works under windows only. The language +is chosen according to the OS language, but the keyboard layout is not detected. + +Layout switching + DOSBox supports a number of keyboard layouts and codepages by default, + in this case just the layout identifier needs to be specified (like + keyboardlayout=PL214 in the DOSBox configuration file, or using "keyb PL214" + at the DOSBox command prompt). The list of all layouts built into DOSBox is + here: http://vogons.zetafleet.com/viewtopic.php?t=21824 + + Some keyboard layouts (for example layout GK319 codepage 869 and layout RU441 + codepage 808) have support for dual layouts that can be accessed by pressing + LeftALT+RrightSHIFT for one layout and LeftALT+LeftSHIFT for the other. + Some keyboard layouts (for example layout LT456 codepage 771) have support + for three layouts, third can be accessed by pressing LeftALT+LeftCTRL + +Supported external files + The FreeDOS .kl files are supported (FreeDOS keyb2 keyboard layoutfiles) as + well as the FreeDOS keyboard.sys/keybrd2.sys/keybrd3.sys libraries which + consist of all available .kl files. + See http://www.freedos.org/ for precompiled keyboard layouts if + the DOSBox-integrated layouts don't work for some reason, or if updated or + new layouts become available. + + Both .CPI (MS-DOS and compatible codepage files) and .CPX (FreeDOS + UPX-compressed codepage files) can be used. Some codepages are compiled + into DOSBox, so it is mostly not needed to care about external codepage + files. If you need a different (or custom) codepage file, copy it into + the directory of the DOSBox so it is accessible for DOSBox. + If you place all ten ega.cpx files (from FreeDOS) in DOSBox folder, + an appropriate codepagefile for the requested layout/codepage is + chosen automatically. + + Additional layouts can be added by copying the corresponding .kl file into + the directory of the DOSBox configuration file and using the first part of + the filename as language code. + Example: For the file UZ.KL (keyboard layout for Uzbekistan) specify + "keyboardlayout=uz" in the DOSBox configuration file. + The integration of keyboard layout packages (like keybrd2.sys) works similar. + +Note that the keyboard layout allows foreign characters to be entered, but +there is NO support for them in filenames. Try to avoid them both inside +DOSBox as well as in files on your host operating system that are accessible +by DOSBox. + + + +============================== +9. Serial Multiplayer feature: +============================== + +DOSBox can emulate a serial nullmodem cable over network and internet. +It can be configured through the [serialports] section in the DOSBox +configuration file. + +To create a nullmodem connection, one side needs to act as the server and +one as the client. + +The server needs to be set up in the DOSBox configuration file like this: + serial1=nullmodem + +The client: + serial1=nullmodem server: + +Now start your game and choose nullmodem / serial cable / already connected +as multiplayer method on COM1. Set the same baudrate on both computers. + +Furthermore, additional parameters can be specified to control the behavior +of the nullmodem connection. These are all parameters: + + * port: - TCP port number. Default: 23 + * rxdelay: - how long (milliseconds) to delay received data if the + interface is not ready. Increase this value if you encounter + overrun errors in the DOSBox Status Window. Default: 100 + * txdelay: - how long to gather data before sending a packet. Default: 12 + (reduces Network overhead) + * server: - This nullmodem will be a client connecting to the specified + server. (No server argument: be a server.) + * transparent:1 - Only send the serial data, no RTS/DTR handshake. Use this + when connecting to anything other than a nullmodem. + * telnet:1 - Interpret Telnet data from the remote site. Automatically + sets transparent. + * usedtr:1 - The connection will not be established until DTR is switched + on by the DOS program. Useful for modem terminals. + Automatically sets transparent. + * inhsocket:1 - Use a socket passed to DOSBox by command line. Automatically + sets transparent. (Socket Inheritance: It is used for + playing old DOS door games on new BBS software.) + +Example: Be a server listening on TCP port 5000. + serial1=nullmodem server: port:5000 rxdelay:1000 + + + +===================================== +10. How to speed up/slow down DOSBox: +===================================== + +DOSBox emulates the CPU, the sound and graphic cards, and other peripherals +of a PC, all at the same time. The speed of an emulated DOS application +depends on how many instructions can be emulated, which is adjustable +(number of cycles). + +CPU Cycles (speed up/slow down) + By default (cycles=auto) DOSBox tries to detect whether a game needs to + be run with as many instructions emulated per time interval as possible + (cycles=max, sometimes this results in game working too fast or unstable), + or whether to use fixed amount of cycles (cycles=3000, sometimes this results + in game working too slow or too fast). But you can always manually force + a different setting in the DOSBox's configuration file. + + You can force the slow or fast behavior by setting a fixed amount of cycles + in the DOSBox's configuration file. If you for example set cycles=10000, then + DOSBox window will display a line "Cpu Speed: fixed 10000 cycles" at the top. + In this mode you can reduce the amount of cycles even more by hitting CTRL-F11 + (you can go as low as you want) or raise it by hitting CTRL-F12 as much as you + want, but you will be limited by the power of one core of your computer's CPU. + You can see how much free time your real CPU's cores have by looking at + the Task Manager in Windows 2000/XP/Vista/7 and the System Monitor + in Windows 95/98/ME. Once 100% of the power of your computer's real CPU's one + core is used, there is no further way to speed up DOSBox (it will actually + start to slow down), unless you reduce the load generated by the non-CPU parts + of DOSBox. DOSBox can use only one core of your CPU, so If you have + for example a CPU with 4 cores, DOSBox will not be able to use the power + of three other cores. + + You can also force the fast behavior by setting cycles=max in the DOSBox + configuration file. The DOSBox window will display a line + "Cpu Speed: max 100% cycles" at the top then. This time you won't have to care + how much free time your real CPU's cores have, because DOSBox will always use + 100% of your real CPU's one core. In this mode you can reduce the amount + of your real CPU's core usage by CTRL-F11 or raise it with CTRL-F12. + +CPU Core (speed up) + On x86 architectures you can try to force the usage of a dynamically + recompiling core (set core=dynamic in the DOSBox configuration file). + This usually gives better results if the auto detection (core=auto) fails. + It is best accompanied by cycles=max. But you may also try using it with + high amounts of cycles (for example 20000 or more). Note that there might be + games that work worse/crash with the dynamic core (so save your game often), + or do not work at all! + +Graphics emulation (speed up) + VGA emulation is a demanding part of DOSBox in terms of actual CPU usage. + Increase the number of frames skipped (in increments of one) by pressing + CTRL-F8. Your CPU usage should decrease when using a fixed cycle setting, + and you will be able to increase cycles with CTRL-F12. + You can repeat this until the game runs fast enough for you. + Please note that this is a trade-off: you lose in fluidity of video what + you gain in speed. + +Sound emulation (speed up) + You can also try to disable the sound through the setup utility of the game + to reduce load on your CPU further. Setting nosound=true in DOSBox's + configuration does NOT disable the emulation of sound devices, just + the output of sound will be disabled. + +Also try to close every program but DOSBox to reserve as much resources +as possible for DOSBox. + + +Advanced cycles configuration: +The cycles=auto and cycles=max settings can be parameterized to have +different startup defaults. The syntax is + cycles=auto ["realmode default"] ["protected mode default"%] + [limit "cycle limit"] + cycles=max ["protected mode default"%] [limit "cycle limit"] +Example: + cycles=auto 5000 80% limit 20000 + will use cycles=5000 for real mode games, 80% CPU throttling for + protected mode games along with a hard cycle limit of 20000 + + + +==================== +11. Troubleshooting: +==================== + +General tip: + Check messages in DOSBox Status Window. See section 12. "DOSBox Status Window" + +DOSBox crashes right after starting it: + - use different values for the output= entry in your DOSBox + configuration file + - try to update your graphics card driver and DirectX + - (Linux) set the environment variable SDL_AUDIODRIVER to alsa or oss. + +Running a certain game closes DOSBox, crashes with some message or hangs: + - see if it works with a default DOSBox installation + (unmodified configuration file) + - try it with sound disabled (use the sound configuration + program that comes with the game, additionally you can + set sbtype=none and gus=false in the DOSBox configuration file) + - change some entries of the DOSBox configuration file, especially try: + core=normal + fixed cycles (for example cycles=10000) + ems=false + xms=false + or combinations of the above settings, + similar the machine settings that control the emulated chipset and + functionality: + machine=vesa_nolfb + or + machine=vgaonly + - use loadfix before starting the game + +The game exits to the DOSBox prompt with some error message: + - read the error message closely and try to locate the error + - try the hints at the above sections + - mount differently as some games are picky about the locations, + for example if you used "mount d d:\oldgames\game" try + "mount c d:\oldgames\game" and "mount c d:\oldgames" + - if the game requires a CD-ROM be sure you used "-t cdrom" when + mounting and try different additional parameters (the ioctl, + usecd and label switches, see the appropriate section) + - check the file permissions of the game files (remove read-only + attributes, add write permissions etc.) + - try reinstalling the game within DOSBox + + + +========================= +12. DOSBox Status Window: +========================= + +DOSBox's Staus window contains many useful information about your currant +configuration, your actions in DOSBox, errors that happened and more. +Whenever you have any problem with DOSBox check these messages. + +To start DOSBox Status Window: + (Windows) Status Window is being started together with main DOSBox window. + (Linux) You may have to start DOSBox from a console to see Status Window. + (MAC OS X) Right click on DOSBox.app, choose "Show Package Contents"-> + ->enter "Contents"->enter "MacOS"->run "DOSBox" + + + +===================================== +13. The configuration (options) file: +===================================== + +The configuration file is automatically created the first time you run DOSBox. +The file can be found in: + (Windows) "Start/WinLogo Menu"->"All Programs"->DOSBox-0.74->Options + (Linux) ~/.dosbox/dosbox-0.74.conf + (MAC OS X) "~/Library/Preferences/DOSBox 0.74 Preferences" +The file is divided into several sections. Each section starts with a +[section name] line. The settings are the property=value lines where value can +be altered to customize DOSBox. +# and % indicate comment-lines. + + +An extra configuration file can be generated by CONFIG.COM, which can be found +on the internal DOSBox Z: drive when you start up DOSBox. Look in the Section 4: +"Internal programs" for usage of CONFIG.COM. You can start DOSBox with +the -conf switch to load the generated file and use its settings. + +DOSBox will load configuration files that are specified with -conf. If none were +specified, it will try to load "dosbox.conf" from the local directory. +If there is none, DOSBox will load the user configuration file. +This file will be created if it doesn't exist. + +Important!: In Windows Vista/7 the configuration file won't work correctly +if it is located in "Windows" or "Program Files" folder or their subfolders, +or directly on c:\, so the best place for storing extra configuration files is +for example: C:\oldgames + + + +====================== +14. The Language File: +====================== + +A language file can be generated by CONFIG.COM, which can be found on the +internal DOSBox Z: drive when you start up DOSBox. Look in the Section 4: +"Internal programs" for usage of CONFIG.COM. +Read the language file, and you will hopefully understand how to change it. +Start DOSBox with the -lang switch to use your new language file. +Alternatively, you can setup the filename in the configuration file +in the [dosbox] section. There's a language= entry that can be changed with +the filelocation. + + + +======================================== +15. Building your own version of DOSBox: +======================================== + +Download the source. +Check the INSTALL in the source distribution. + + + +=================== +16. Special thanks: +=================== + +See the THANKS file. + + + +============ +17. Contact: +============ + +See the site: +http://www.dosbox.com +for an email address (The Crew-page). + + diff --git a/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_THANKS.txt b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_THANKS.txt new file mode 100644 index 0000000..8b0e5d9 --- /dev/null +++ b/info.exult.exult/data/blackgate/DOSBOX/Documentation/dosbox_THANKS.txt @@ -0,0 +1,29 @@ +We would like to thank: + + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gérardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + diff --git a/info.exult.exult/data/blackgate/DOSBOX/GOGDOSConfig.exe b/info.exult.exult/data/blackgate/DOSBOX/GOGDOSConfig.exe new file mode 100644 index 0000000..6310a3f Binary files /dev/null and b/info.exult.exult/data/blackgate/DOSBOX/GOGDOSConfig.exe differ diff --git a/info.exult.exult/data/blackgate/DOSBOX/SDL.dll b/info.exult.exult/data/blackgate/DOSBOX/SDL.dll new file mode 100644 index 0000000..37d3151 Binary files /dev/null and b/info.exult.exult/data/blackgate/DOSBOX/SDL.dll differ diff --git a/info.exult.exult/data/blackgate/DOSBOX/SDL_net.dll b/info.exult.exult/data/blackgate/DOSBOX/SDL_net.dll new file mode 100644 index 0000000..924e654 Binary files /dev/null and b/info.exult.exult/data/blackgate/DOSBOX/SDL_net.dll differ diff --git a/info.exult.exult/data/blackgate/DOSBOX/Video Codec/Video Instructions.txt b/info.exult.exult/data/blackgate/DOSBOX/Video Codec/Video Instructions.txt new file mode 100644 index 0000000..1d15b4f --- /dev/null +++ b/info.exult.exult/data/blackgate/DOSBOX/Video Codec/Video Instructions.txt @@ -0,0 +1,35 @@ +Starting with version 0.65, DOSBox allows you to create movies out of screen +output. + +To record a movie, you have to press CTRL-ALT-F5. +To stop/end the recording, you have to press CTRL-ALT-F5 again. + +To play the recorded movie, you need a movie player which can handle the +ZMBV codec. MS Windows users can find this codec in the start menu entry of +DOSBox. Users of Linux and other OSes should look for a movie player that +uses the ffmpeg libary (you may need to update or ask your distribution to +upgrade). + +FAQ: +Q: During the display of the movies the sound is lagging. +A: Check your display properties to see whether your refresh rate is set to +at least 70 hz. Try playing the movie in virtualdub (http://virtualdub.sf.net) + +Q: Why does the resulting movie consist of multiple files? +A: Each time the game changes resolution, DOSBox creates a new movie file, +because a movie file can only contain one resolution. + +Q: Can I set the cycles higher than my PC can handle during recording? +A: Yes. During recording, the game might play slowly and stuttering, but the +resulting movie should play at the intended speed and have no stuttering. + +Q: CTRL-ALT-F5 switches to the console under linux. +A: 1. Start DOSBox like this: dosbox -startmapper + 2. Click on Video, click on Add + 3. Press the key you want (for example scroll lock or printscreen) + 4. Click exit. + 5. You can make movies by pressing scroll lock or whichever key you + selected. + +Q: The colours are wrong and I'm using 64 bit windows +A: Look here: http://vogons.zetafleet.com/viewtopic.php?t=12133 diff --git a/info.exult.exult/data/blackgate/DOSBOX/Video Codec/zmbv.dll b/info.exult.exult/data/blackgate/DOSBOX/Video Codec/zmbv.dll new file mode 100644 index 0000000..c6c0eb6 Binary files /dev/null and b/info.exult.exult/data/blackgate/DOSBOX/Video Codec/zmbv.dll differ diff --git a/info.exult.exult/data/blackgate/DOSBOX/Video Codec/zmbv.inf b/info.exult.exult/data/blackgate/DOSBOX/Video Codec/zmbv.inf new file mode 100644 index 0000000..a98ea01 --- /dev/null +++ b/info.exult.exult/data/blackgate/DOSBOX/Video Codec/zmbv.inf @@ -0,0 +1,105 @@ +[Version] +Signature="$CHICAGO$" +Provider=%ZMBV_PUBLISHER% +Class=MEDIA + + +[DefaultInstall] +CopyFiles=ZMBV.Files.Inf,ZMBV.Files.Dll +AddReg=ZMBV.Reg9x +UpdateInis=ZMBV.INIs + +[DefaultInstall.ntx86] +CopyFiles=ZMBV.Files.Inf,ZMBV.Files.Dll +AddReg=ZMBV.RegNTx86 +UpdateInis=ZMBV.INIs + +[DefaultInstall.ntamd64] +CopyFiles=ZMBV.Files.Inf,ZMBV.Files.Dll.NTamd64 +AddReg=ZMBV.RegNTamd64 +UpdateInis=ZMBV.INIs + +[DefaultUnInstall] +DelFiles=ZMBV.Files.Dll,ZMBV.Files.Inf,ZMBV.Files.Ini +DelReg=ZMBV.Reg9x +UpdateInis=ZMBV.INIs.Del + +[DefaultUnInstall.ntx86] +DelFiles=ZMBV.Files.Dll,ZMBV.Files.Inf,ZMBV.Files.Ini +DelReg=ZMBV.RegNTx86 +UpdateInis=ZMBV.INIs.Del + +[DefaultUnInstall.ntamd64] +DelFiles=ZMBV.Files.Dll.NTamd64,ZMBV.Files.Inf,ZMBV.Files.Ini +DelReg=ZMBV.RegNTamd64 +UpdateInis=ZMBV.INIs.Del + +[SourceDisksNames] +1="Zip Motion Block Video codec","",1 + +[SourceDisksFiles] +ZMBV.INF=1 + +[DestinationDirs] +ZMBV.Files.Inf=17 +ZMBV.Files.Dll=11 +ZMBV.Files.Dll.NTamd64=10,SysWOW64 +ZMBV.Files.Ini=25 + +[ZMBV.Files.Inf] +zmbv.inf + +[ZMBV.Files.Dll] +zmbv.dll + +[ZMBV.Files.Dll.NTamd64] +zmbv.dll + +[ZMBV.Files.Ini] +zmbv.ini + +[ZMBV.Reg9x] +HKLM,SYSTEM\CurrentControlSet\Control\MediaResources\icm\VIDC.ZMBV,Description,,"%ZMBV_DISPLAY_NAME%" +HKLM,SYSTEM\CurrentControlSet\Control\MediaResources\icm\VIDC.ZMBV,Driver,,"zmbv.dll" +HKLM,SYSTEM\CurrentControlSet\Control\MediaResources\icm\VIDC.ZMBV,FriendlyName,,"%ZMBV_DISPLAY_NAME%" + +HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV +HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,DisplayName,,"%ZMBV_UNINST_DISPLAY_NAME%" +HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,UninstallString,,"rundll.exe setupx.dll,InstallHinfSection DefaultUninstall 132 %17%\ZMBV.INF" + +[ZMBV.RegNTx86] +HKLM,SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers.desc,zmbv.dll,,"%ZMBV_DISPLAY_NAME%" +HKLM,SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers32,vidc.zmbv,,zmbv.dll + +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,DisplayName,,"%ZMBV_UNINST_DISPLAY_NAME%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,Publisher,,"%ZMBV_PUBLISHER%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,URLInfoAbout,,"%ZMBV_URL_HOMEPAGE%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,NoRepair,0x10001,01,00,00,00 +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,NoModify,0x10001,01,00,00,00 +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,UninstallString,,"rundll32.exe setupapi,InstallHinfSection DefaultUninstall 132 %17%\ZMBV.INF" + +[ZMBV.RegNTamd64] +HKLM,SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\drivers.desc,zmbv.dll,,"%ZMBV_DISPLAY_NAME%" +HKLM,SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\drivers32,vidc.zmbv,,zmbv.dll + +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,DisplayName,,"%ZMBV_UNINST_DISPLAY_NAME%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,Publisher,,"%ZMBV_PUBLISHER%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,URLInfoAbout,,"%ZMBV_URL_HOMEPAGE%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,NoRepair,0x10001,01,00,00,00 +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,NoModify,0x10001,01,00,00,00 +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,UninstallString,,"rundll32.exe setupapi.dll,InstallHinfSection DefaultUninstall 132 %17%\ZMBV.INF" + +[ZMBV.INIs] +system.ini, drivers32,, "VIDC.ZMBV=zmbv.dll" + +[ZMBV.INIs.Del] +system.ini, drivers32, "VIDC.ZMBV=zmbv.dll" + +[Strings] +ZMBV_PUBLISHER = "DOSBox Team" +ZMBV_DISPLAY_NAME = "Zip Motion Block Video [ZMBV]" +ZMBV_UNINST_DISPLAY_NAME = "Zip Motion Block Video codec (Remove Only)" +ZMBV_URL_HOMEPAGE = "http://www.dosbox.com/" +CODEC_INSTALLATION_FINISHED = "Zip Motion Block Video codec installation is complete." diff --git a/info.exult.exult/data/blackgate/DOSBOX/dosbox-0.74.tar.gz b/info.exult.exult/data/blackgate/DOSBOX/dosbox-0.74.tar.gz new file mode 100644 index 0000000..cf8c323 Binary files /dev/null and b/info.exult.exult/data/blackgate/DOSBOX/dosbox-0.74.tar.gz differ diff --git a/info.exult.exult/data/blackgate/ENDGAME.EXE b/info.exult.exult/data/blackgate/ENDGAME.EXE new file mode 100644 index 0000000..14596e5 Binary files /dev/null and b/info.exult.exult/data/blackgate/ENDGAME.EXE differ diff --git a/info.exult.exult/data/blackgate/INSTALL.EXE b/info.exult.exult/data/blackgate/INSTALL.EXE new file mode 100644 index 0000000..43ecf9b Binary files /dev/null and b/info.exult.exult/data/blackgate/INSTALL.EXE differ diff --git a/info.exult.exult/data/blackgate/INSTALL.PRM b/info.exult.exult/data/blackgate/INSTALL.PRM new file mode 100644 index 0000000..60e3e3f Binary files /dev/null and b/info.exult.exult/data/blackgate/INSTALL.PRM differ diff --git a/info.exult.exult/data/blackgate/INTRO.EXE b/info.exult.exult/data/blackgate/INTRO.EXE new file mode 100644 index 0000000..0e5de96 Binary files /dev/null and b/info.exult.exult/data/blackgate/INTRO.EXE differ diff --git a/info.exult.exult/data/blackgate/MAINMENU.EXE b/info.exult.exult/data/blackgate/MAINMENU.EXE new file mode 100644 index 0000000..7b0865d Binary files /dev/null and b/info.exult.exult/data/blackgate/MAINMENU.EXE differ diff --git a/info.exult.exult/data/blackgate/STATIC/ADLIB.ADV b/info.exult.exult/data/blackgate/STATIC/ADLIB.ADV new file mode 100644 index 0000000..775e799 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/ADLIB.ADV differ diff --git a/info.exult.exult/data/blackgate/STATIC/ADLIBMUS.DAT b/info.exult.exult/data/blackgate/STATIC/ADLIBMUS.DAT new file mode 100644 index 0000000..7fc4d86 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/ADLIBMUS.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/ADLIBSFX.DAT b/info.exult.exult/data/blackgate/STATIC/ADLIBSFX.DAT new file mode 100644 index 0000000..da19ba8 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/ADLIBSFX.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/AMMO.DAT b/info.exult.exult/data/blackgate/STATIC/AMMO.DAT new file mode 100644 index 0000000..ed69245 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/AMMO.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/ARMOR.DAT b/info.exult.exult/data/blackgate/STATIC/ARMOR.DAT new file mode 100644 index 0000000..f56daee Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/ARMOR.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/ENDGAME.DAT b/info.exult.exult/data/blackgate/STATIC/ENDGAME.DAT new file mode 100644 index 0000000..f6a7d66 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/ENDGAME.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/ENDSCORE.XMI b/info.exult.exult/data/blackgate/STATIC/ENDSCORE.XMI new file mode 100644 index 0000000..374bd5d Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/ENDSCORE.XMI differ diff --git a/info.exult.exult/data/blackgate/STATIC/ENDSHAPE.FLX b/info.exult.exult/data/blackgate/STATIC/ENDSHAPE.FLX new file mode 100644 index 0000000..2dd4220 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/ENDSHAPE.FLX differ diff --git a/info.exult.exult/data/blackgate/STATIC/EQUIP.DAT b/info.exult.exult/data/blackgate/STATIC/EQUIP.DAT new file mode 100644 index 0000000..2105f1a Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/EQUIP.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/FACES.VGA b/info.exult.exult/data/blackgate/STATIC/FACES.VGA new file mode 100644 index 0000000..ee62ed7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/FACES.VGA differ diff --git a/info.exult.exult/data/blackgate/STATIC/FONTS.VGA b/info.exult.exult/data/blackgate/STATIC/FONTS.VGA new file mode 100644 index 0000000..f77c7ba Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/FONTS.VGA differ diff --git a/info.exult.exult/data/blackgate/STATIC/GUMPS.VGA b/info.exult.exult/data/blackgate/STATIC/GUMPS.VGA new file mode 100644 index 0000000..212f432 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/GUMPS.VGA differ diff --git a/info.exult.exult/data/blackgate/STATIC/INITGAME.DAT b/info.exult.exult/data/blackgate/STATIC/INITGAME.DAT new file mode 100644 index 0000000..7e34f4e Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/INITGAME.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/INTROADM.DAT b/info.exult.exult/data/blackgate/STATIC/INTROADM.DAT new file mode 100644 index 0000000..36b7cfb Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/INTROADM.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/INTROPAL.DAT b/info.exult.exult/data/blackgate/STATIC/INTROPAL.DAT new file mode 100644 index 0000000..3105fa3 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/INTROPAL.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/INTRORDM.DAT b/info.exult.exult/data/blackgate/STATIC/INTRORDM.DAT new file mode 100644 index 0000000..4db92c1 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/INTRORDM.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/INTROSND.DAT b/info.exult.exult/data/blackgate/STATIC/INTROSND.DAT new file mode 100644 index 0000000..ca834b6 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/INTROSND.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/LINKDEP1 b/info.exult.exult/data/blackgate/STATIC/LINKDEP1 new file mode 100644 index 0000000..a739458 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/LINKDEP1 differ diff --git a/info.exult.exult/data/blackgate/STATIC/LINKDEP2 b/info.exult.exult/data/blackgate/STATIC/LINKDEP2 new file mode 100644 index 0000000..fd2d154 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/LINKDEP2 differ diff --git a/info.exult.exult/data/blackgate/STATIC/MAINSHP.FLX b/info.exult.exult/data/blackgate/STATIC/MAINSHP.FLX new file mode 100644 index 0000000..cc68409 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/MAINSHP.FLX differ diff --git a/info.exult.exult/data/blackgate/STATIC/MONSTERS.DAT b/info.exult.exult/data/blackgate/STATIC/MONSTERS.DAT new file mode 100644 index 0000000..fe01917 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/MONSTERS.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/MT32MPU.ADV b/info.exult.exult/data/blackgate/STATIC/MT32MPU.ADV new file mode 100644 index 0000000..c315c93 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/MT32MPU.ADV differ diff --git a/info.exult.exult/data/blackgate/STATIC/MT32MUS.DAT b/info.exult.exult/data/blackgate/STATIC/MT32MUS.DAT new file mode 100644 index 0000000..2d26e76 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/MT32MUS.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/MT32SFX.DAT b/info.exult.exult/data/blackgate/STATIC/MT32SFX.DAT new file mode 100644 index 0000000..9eadc79 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/MT32SFX.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/NPCFLAG.DAT b/info.exult.exult/data/blackgate/STATIC/NPCFLAG.DAT new file mode 100644 index 0000000..a3543dc Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/NPCFLAG.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/OCCLUDE.DAT b/info.exult.exult/data/blackgate/STATIC/OCCLUDE.DAT new file mode 100644 index 0000000..71c44a0 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/OCCLUDE.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/PALETTES.FLX b/info.exult.exult/data/blackgate/STATIC/PALETTES.FLX new file mode 100644 index 0000000..5101533 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/PALETTES.FLX differ diff --git a/info.exult.exult/data/blackgate/STATIC/POINTERS.SHP b/info.exult.exult/data/blackgate/STATIC/POINTERS.SHP new file mode 100644 index 0000000..d4b2a76 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/POINTERS.SHP differ diff --git a/info.exult.exult/data/blackgate/STATIC/READY.DAT b/info.exult.exult/data/blackgate/STATIC/READY.DAT new file mode 100644 index 0000000..2818d62 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/READY.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/SBDIG.ADV b/info.exult.exult/data/blackgate/STATIC/SBDIG.ADV new file mode 100644 index 0000000..d1daed9 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/SBDIG.ADV differ diff --git a/info.exult.exult/data/blackgate/STATIC/SCHEDULE.DAT b/info.exult.exult/data/blackgate/STATIC/SCHEDULE.DAT new file mode 100644 index 0000000..d0004cb Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/SCHEDULE.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/SHAPES.VGA b/info.exult.exult/data/blackgate/STATIC/SHAPES.VGA new file mode 100644 index 0000000..f7e291f Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/SHAPES.VGA differ diff --git a/info.exult.exult/data/blackgate/STATIC/SHPDIMS.DAT b/info.exult.exult/data/blackgate/STATIC/SHPDIMS.DAT new file mode 100644 index 0000000..0d6edce --- /dev/null +++ b/info.exult.exult/data/blackgate/STATIC/SHPDIMS.DAT @@ -0,0 +1,117 @@ + +  +        + +     + +    +  + +  + +    + + + +  + +  + +  +    +         +   +   + + +   + + + + +         + +         + +  + + + + +     +  +  +  + +   +      +  +   +   + + + + + + + + + + +  +  + +   + + + + +  +     + + + + +         + + +          + +        +        + + +        +    + +        + +    +     +   +  +             +        +  +      + +   + + +       +      +   + +   +   +       +   + +    + + + +   + +    +  diff --git a/info.exult.exult/data/blackgate/STATIC/SPRITES.VGA b/info.exult.exult/data/blackgate/STATIC/SPRITES.VGA new file mode 100644 index 0000000..6723ee4 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/SPRITES.VGA differ diff --git a/info.exult.exult/data/blackgate/STATIC/TEXT.FLX b/info.exult.exult/data/blackgate/STATIC/TEXT.FLX new file mode 100644 index 0000000..f071139 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/TEXT.FLX differ diff --git a/info.exult.exult/data/blackgate/STATIC/TFA.DAT b/info.exult.exult/data/blackgate/STATIC/TFA.DAT new file mode 100644 index 0000000..e170ca3 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/TFA.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7CHUNKS b/info.exult.exult/data/blackgate/STATIC/U7CHUNKS new file mode 100644 index 0000000..d46893e Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7CHUNKS differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX00 b/info.exult.exult/data/blackgate/STATIC/U7IFIX00 new file mode 100644 index 0000000..97f601a Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX00 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX01 b/info.exult.exult/data/blackgate/STATIC/U7IFIX01 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX01 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX02 b/info.exult.exult/data/blackgate/STATIC/U7IFIX02 new file mode 100644 index 0000000..eb48e55 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX02 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX03 b/info.exult.exult/data/blackgate/STATIC/U7IFIX03 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX03 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX04 b/info.exult.exult/data/blackgate/STATIC/U7IFIX04 new file mode 100644 index 0000000..bd3c14d Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX04 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX05 b/info.exult.exult/data/blackgate/STATIC/U7IFIX05 new file mode 100644 index 0000000..6da72ac Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX05 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX06 b/info.exult.exult/data/blackgate/STATIC/U7IFIX06 new file mode 100644 index 0000000..e2e8b57 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX06 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX07 b/info.exult.exult/data/blackgate/STATIC/U7IFIX07 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX07 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX08 b/info.exult.exult/data/blackgate/STATIC/U7IFIX08 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX08 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX09 b/info.exult.exult/data/blackgate/STATIC/U7IFIX09 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX09 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX0A b/info.exult.exult/data/blackgate/STATIC/U7IFIX0A new file mode 100644 index 0000000..3b6ac22 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX0A differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX0B b/info.exult.exult/data/blackgate/STATIC/U7IFIX0B new file mode 100644 index 0000000..9936c08 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX0B differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX0C b/info.exult.exult/data/blackgate/STATIC/U7IFIX0C new file mode 100644 index 0000000..968a742 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX0C differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX0D b/info.exult.exult/data/blackgate/STATIC/U7IFIX0D new file mode 100644 index 0000000..a9a9ef6 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX0D differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX0E b/info.exult.exult/data/blackgate/STATIC/U7IFIX0E new file mode 100644 index 0000000..a5020a7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX0E differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX0F b/info.exult.exult/data/blackgate/STATIC/U7IFIX0F new file mode 100644 index 0000000..5e5b02d Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX0F differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX10 b/info.exult.exult/data/blackgate/STATIC/U7IFIX10 new file mode 100644 index 0000000..7f1054c Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX10 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX11 b/info.exult.exult/data/blackgate/STATIC/U7IFIX11 new file mode 100644 index 0000000..3bee734 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX11 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX12 b/info.exult.exult/data/blackgate/STATIC/U7IFIX12 new file mode 100644 index 0000000..e1c8061 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX12 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX13 b/info.exult.exult/data/blackgate/STATIC/U7IFIX13 new file mode 100644 index 0000000..0918dcb Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX13 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX14 b/info.exult.exult/data/blackgate/STATIC/U7IFIX14 new file mode 100644 index 0000000..4d68cc3 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX14 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX15 b/info.exult.exult/data/blackgate/STATIC/U7IFIX15 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX15 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX16 b/info.exult.exult/data/blackgate/STATIC/U7IFIX16 new file mode 100644 index 0000000..48a1335 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX16 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX17 b/info.exult.exult/data/blackgate/STATIC/U7IFIX17 new file mode 100644 index 0000000..d869dca Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX17 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX18 b/info.exult.exult/data/blackgate/STATIC/U7IFIX18 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX18 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX19 b/info.exult.exult/data/blackgate/STATIC/U7IFIX19 new file mode 100644 index 0000000..f64a05c Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX19 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX1A b/info.exult.exult/data/blackgate/STATIC/U7IFIX1A new file mode 100644 index 0000000..c8ee084 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX1A differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX1B b/info.exult.exult/data/blackgate/STATIC/U7IFIX1B new file mode 100644 index 0000000..6e1925d Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX1B differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX1C b/info.exult.exult/data/blackgate/STATIC/U7IFIX1C new file mode 100644 index 0000000..b5937db Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX1C differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX1D b/info.exult.exult/data/blackgate/STATIC/U7IFIX1D new file mode 100644 index 0000000..be32e79 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX1D differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX1E b/info.exult.exult/data/blackgate/STATIC/U7IFIX1E new file mode 100644 index 0000000..48009e9 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX1E differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX1F b/info.exult.exult/data/blackgate/STATIC/U7IFIX1F new file mode 100644 index 0000000..e575f5d Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX1F differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX20 b/info.exult.exult/data/blackgate/STATIC/U7IFIX20 new file mode 100644 index 0000000..0682fef Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX20 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX21 b/info.exult.exult/data/blackgate/STATIC/U7IFIX21 new file mode 100644 index 0000000..4a1058e Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX21 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX22 b/info.exult.exult/data/blackgate/STATIC/U7IFIX22 new file mode 100644 index 0000000..349b67d Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX22 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX23 b/info.exult.exult/data/blackgate/STATIC/U7IFIX23 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX23 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX24 b/info.exult.exult/data/blackgate/STATIC/U7IFIX24 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX24 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX25 b/info.exult.exult/data/blackgate/STATIC/U7IFIX25 new file mode 100644 index 0000000..81f023f Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX25 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX26 b/info.exult.exult/data/blackgate/STATIC/U7IFIX26 new file mode 100644 index 0000000..4bc5331 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX26 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX27 b/info.exult.exult/data/blackgate/STATIC/U7IFIX27 new file mode 100644 index 0000000..06e1201 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX27 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX28 b/info.exult.exult/data/blackgate/STATIC/U7IFIX28 new file mode 100644 index 0000000..d1dc1cd Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX28 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX29 b/info.exult.exult/data/blackgate/STATIC/U7IFIX29 new file mode 100644 index 0000000..47e3907 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX29 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX2A b/info.exult.exult/data/blackgate/STATIC/U7IFIX2A new file mode 100644 index 0000000..eeb237b Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX2A differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX2B b/info.exult.exult/data/blackgate/STATIC/U7IFIX2B new file mode 100644 index 0000000..3abb1b7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX2B differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX2C b/info.exult.exult/data/blackgate/STATIC/U7IFIX2C new file mode 100644 index 0000000..0fcd5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX2C differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX2D b/info.exult.exult/data/blackgate/STATIC/U7IFIX2D new file mode 100644 index 0000000..258cf9a Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX2D differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX2E b/info.exult.exult/data/blackgate/STATIC/U7IFIX2E new file mode 100644 index 0000000..2aa63e5 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX2E differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX2F b/info.exult.exult/data/blackgate/STATIC/U7IFIX2F new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX2F differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX30 b/info.exult.exult/data/blackgate/STATIC/U7IFIX30 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX30 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX31 b/info.exult.exult/data/blackgate/STATIC/U7IFIX31 new file mode 100644 index 0000000..9826dcc Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX31 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX32 b/info.exult.exult/data/blackgate/STATIC/U7IFIX32 new file mode 100644 index 0000000..7c3e9a7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX32 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX33 b/info.exult.exult/data/blackgate/STATIC/U7IFIX33 new file mode 100644 index 0000000..7255401 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX33 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX34 b/info.exult.exult/data/blackgate/STATIC/U7IFIX34 new file mode 100644 index 0000000..8ef709c Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX34 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX35 b/info.exult.exult/data/blackgate/STATIC/U7IFIX35 new file mode 100644 index 0000000..756330d Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX35 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX36 b/info.exult.exult/data/blackgate/STATIC/U7IFIX36 new file mode 100644 index 0000000..27eedab Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX36 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX37 b/info.exult.exult/data/blackgate/STATIC/U7IFIX37 new file mode 100644 index 0000000..8ae267b Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX37 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX38 b/info.exult.exult/data/blackgate/STATIC/U7IFIX38 new file mode 100644 index 0000000..b8a5e3a Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX38 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX39 b/info.exult.exult/data/blackgate/STATIC/U7IFIX39 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX39 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX3A b/info.exult.exult/data/blackgate/STATIC/U7IFIX3A new file mode 100644 index 0000000..9665611 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX3A differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX3B b/info.exult.exult/data/blackgate/STATIC/U7IFIX3B new file mode 100644 index 0000000..9fd9bc2 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX3B differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX3C b/info.exult.exult/data/blackgate/STATIC/U7IFIX3C new file mode 100644 index 0000000..38be97a Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX3C differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX3D b/info.exult.exult/data/blackgate/STATIC/U7IFIX3D new file mode 100644 index 0000000..a1bcd48 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX3D differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX3E b/info.exult.exult/data/blackgate/STATIC/U7IFIX3E new file mode 100644 index 0000000..d40e2c5 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX3E differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX3F b/info.exult.exult/data/blackgate/STATIC/U7IFIX3F new file mode 100644 index 0000000..8905a8c Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX3F differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX40 b/info.exult.exult/data/blackgate/STATIC/U7IFIX40 new file mode 100644 index 0000000..b65197f Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX40 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX41 b/info.exult.exult/data/blackgate/STATIC/U7IFIX41 new file mode 100644 index 0000000..355a09d Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX41 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX42 b/info.exult.exult/data/blackgate/STATIC/U7IFIX42 new file mode 100644 index 0000000..a35bcdf Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX42 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX43 b/info.exult.exult/data/blackgate/STATIC/U7IFIX43 new file mode 100644 index 0000000..52cd0d4 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX43 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX44 b/info.exult.exult/data/blackgate/STATIC/U7IFIX44 new file mode 100644 index 0000000..fe5c70f Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX44 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX45 b/info.exult.exult/data/blackgate/STATIC/U7IFIX45 new file mode 100644 index 0000000..db6421f Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX45 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX46 b/info.exult.exult/data/blackgate/STATIC/U7IFIX46 new file mode 100644 index 0000000..0c59626 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX46 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX47 b/info.exult.exult/data/blackgate/STATIC/U7IFIX47 new file mode 100644 index 0000000..6d50e03 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX47 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX48 b/info.exult.exult/data/blackgate/STATIC/U7IFIX48 new file mode 100644 index 0000000..82706a7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX48 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX49 b/info.exult.exult/data/blackgate/STATIC/U7IFIX49 new file mode 100644 index 0000000..c4d4dde Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX49 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX4A b/info.exult.exult/data/blackgate/STATIC/U7IFIX4A new file mode 100644 index 0000000..40eedb7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX4A differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX4B b/info.exult.exult/data/blackgate/STATIC/U7IFIX4B new file mode 100644 index 0000000..e92c846 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX4B differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX4C b/info.exult.exult/data/blackgate/STATIC/U7IFIX4C new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX4C differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX4D b/info.exult.exult/data/blackgate/STATIC/U7IFIX4D new file mode 100644 index 0000000..4e2cb15 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX4D differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX4E b/info.exult.exult/data/blackgate/STATIC/U7IFIX4E new file mode 100644 index 0000000..f9633c7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX4E differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX4F b/info.exult.exult/data/blackgate/STATIC/U7IFIX4F new file mode 100644 index 0000000..9f4d0c5 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX4F differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX50 b/info.exult.exult/data/blackgate/STATIC/U7IFIX50 new file mode 100644 index 0000000..91f02b7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX50 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX51 b/info.exult.exult/data/blackgate/STATIC/U7IFIX51 new file mode 100644 index 0000000..84eb4fd Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX51 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX52 b/info.exult.exult/data/blackgate/STATIC/U7IFIX52 new file mode 100644 index 0000000..88031cb Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX52 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX53 b/info.exult.exult/data/blackgate/STATIC/U7IFIX53 new file mode 100644 index 0000000..a9815f7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX53 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX54 b/info.exult.exult/data/blackgate/STATIC/U7IFIX54 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX54 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX55 b/info.exult.exult/data/blackgate/STATIC/U7IFIX55 new file mode 100644 index 0000000..f77a290 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX55 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX56 b/info.exult.exult/data/blackgate/STATIC/U7IFIX56 new file mode 100644 index 0000000..d3b8ee0 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX56 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX57 b/info.exult.exult/data/blackgate/STATIC/U7IFIX57 new file mode 100644 index 0000000..4bd8679 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX57 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX58 b/info.exult.exult/data/blackgate/STATIC/U7IFIX58 new file mode 100644 index 0000000..3b1753c Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX58 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX59 b/info.exult.exult/data/blackgate/STATIC/U7IFIX59 new file mode 100644 index 0000000..c394231 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX59 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX5A b/info.exult.exult/data/blackgate/STATIC/U7IFIX5A new file mode 100644 index 0000000..75e8de5 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX5A differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX5B b/info.exult.exult/data/blackgate/STATIC/U7IFIX5B new file mode 100644 index 0000000..6281902 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX5B differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX5C b/info.exult.exult/data/blackgate/STATIC/U7IFIX5C new file mode 100644 index 0000000..342c70a Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX5C differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX5D b/info.exult.exult/data/blackgate/STATIC/U7IFIX5D new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX5D differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX5E b/info.exult.exult/data/blackgate/STATIC/U7IFIX5E new file mode 100644 index 0000000..bc43691 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX5E differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX5F b/info.exult.exult/data/blackgate/STATIC/U7IFIX5F new file mode 100644 index 0000000..6564896 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX5F differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX60 b/info.exult.exult/data/blackgate/STATIC/U7IFIX60 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX60 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX61 b/info.exult.exult/data/blackgate/STATIC/U7IFIX61 new file mode 100644 index 0000000..88c3e7a Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX61 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX62 b/info.exult.exult/data/blackgate/STATIC/U7IFIX62 new file mode 100644 index 0000000..a01c46f Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX62 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX63 b/info.exult.exult/data/blackgate/STATIC/U7IFIX63 new file mode 100644 index 0000000..22eaa76 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX63 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX64 b/info.exult.exult/data/blackgate/STATIC/U7IFIX64 new file mode 100644 index 0000000..f96a6d7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX64 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX65 b/info.exult.exult/data/blackgate/STATIC/U7IFIX65 new file mode 100644 index 0000000..d90748c Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX65 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX66 b/info.exult.exult/data/blackgate/STATIC/U7IFIX66 new file mode 100644 index 0000000..243759c Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX66 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX67 b/info.exult.exult/data/blackgate/STATIC/U7IFIX67 new file mode 100644 index 0000000..5993bc4 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX67 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX68 b/info.exult.exult/data/blackgate/STATIC/U7IFIX68 new file mode 100644 index 0000000..8c99213 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX68 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX69 b/info.exult.exult/data/blackgate/STATIC/U7IFIX69 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX69 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX6A b/info.exult.exult/data/blackgate/STATIC/U7IFIX6A new file mode 100644 index 0000000..dd41573 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX6A differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX6B b/info.exult.exult/data/blackgate/STATIC/U7IFIX6B new file mode 100644 index 0000000..bd7141f Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX6B differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX6C b/info.exult.exult/data/blackgate/STATIC/U7IFIX6C new file mode 100644 index 0000000..0a42256 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX6C differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX6D b/info.exult.exult/data/blackgate/STATIC/U7IFIX6D new file mode 100644 index 0000000..e486376 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX6D differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX6E b/info.exult.exult/data/blackgate/STATIC/U7IFIX6E new file mode 100644 index 0000000..27804a8 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX6E differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX6F b/info.exult.exult/data/blackgate/STATIC/U7IFIX6F new file mode 100644 index 0000000..af70e22 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX6F differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX70 b/info.exult.exult/data/blackgate/STATIC/U7IFIX70 new file mode 100644 index 0000000..aedbc3a Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX70 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX71 b/info.exult.exult/data/blackgate/STATIC/U7IFIX71 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX71 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX72 b/info.exult.exult/data/blackgate/STATIC/U7IFIX72 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX72 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX73 b/info.exult.exult/data/blackgate/STATIC/U7IFIX73 new file mode 100644 index 0000000..17677b7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX73 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX74 b/info.exult.exult/data/blackgate/STATIC/U7IFIX74 new file mode 100644 index 0000000..b953409 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX74 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX75 b/info.exult.exult/data/blackgate/STATIC/U7IFIX75 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX75 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX76 b/info.exult.exult/data/blackgate/STATIC/U7IFIX76 new file mode 100644 index 0000000..8c91b6f Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX76 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX77 b/info.exult.exult/data/blackgate/STATIC/U7IFIX77 new file mode 100644 index 0000000..ef4aef2 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX77 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX78 b/info.exult.exult/data/blackgate/STATIC/U7IFIX78 new file mode 100644 index 0000000..12bc646 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX78 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX79 b/info.exult.exult/data/blackgate/STATIC/U7IFIX79 new file mode 100644 index 0000000..4805b6a Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX79 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX7A b/info.exult.exult/data/blackgate/STATIC/U7IFIX7A new file mode 100644 index 0000000..108be3d Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX7A differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX7B b/info.exult.exult/data/blackgate/STATIC/U7IFIX7B new file mode 100644 index 0000000..a33ceb4 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX7B differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX7C b/info.exult.exult/data/blackgate/STATIC/U7IFIX7C new file mode 100644 index 0000000..5f66295 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX7C differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX7D b/info.exult.exult/data/blackgate/STATIC/U7IFIX7D new file mode 100644 index 0000000..42c0a6f Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX7D differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX7E b/info.exult.exult/data/blackgate/STATIC/U7IFIX7E new file mode 100644 index 0000000..00a74eb Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX7E differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX7F b/info.exult.exult/data/blackgate/STATIC/U7IFIX7F new file mode 100644 index 0000000..59c5891 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX7F differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX80 b/info.exult.exult/data/blackgate/STATIC/U7IFIX80 new file mode 100644 index 0000000..9acc19a Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX80 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX81 b/info.exult.exult/data/blackgate/STATIC/U7IFIX81 new file mode 100644 index 0000000..10d2a81 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX81 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX82 b/info.exult.exult/data/blackgate/STATIC/U7IFIX82 new file mode 100644 index 0000000..ad8b39b Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX82 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX83 b/info.exult.exult/data/blackgate/STATIC/U7IFIX83 new file mode 100644 index 0000000..348231b Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX83 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX84 b/info.exult.exult/data/blackgate/STATIC/U7IFIX84 new file mode 100644 index 0000000..7a07e31 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX84 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX85 b/info.exult.exult/data/blackgate/STATIC/U7IFIX85 new file mode 100644 index 0000000..ca8614f Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX85 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX86 b/info.exult.exult/data/blackgate/STATIC/U7IFIX86 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX86 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX87 b/info.exult.exult/data/blackgate/STATIC/U7IFIX87 new file mode 100644 index 0000000..1f40704 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX87 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX88 b/info.exult.exult/data/blackgate/STATIC/U7IFIX88 new file mode 100644 index 0000000..e475ab5 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX88 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX89 b/info.exult.exult/data/blackgate/STATIC/U7IFIX89 new file mode 100644 index 0000000..56fd862 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX89 differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX8A b/info.exult.exult/data/blackgate/STATIC/U7IFIX8A new file mode 100644 index 0000000..0e023bd Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX8A differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX8B b/info.exult.exult/data/blackgate/STATIC/U7IFIX8B new file mode 100644 index 0000000..476386c Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX8B differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX8C b/info.exult.exult/data/blackgate/STATIC/U7IFIX8C new file mode 100644 index 0000000..21b908b Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX8C differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX8D b/info.exult.exult/data/blackgate/STATIC/U7IFIX8D new file mode 100644 index 0000000..2cb612d Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX8D differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX8E b/info.exult.exult/data/blackgate/STATIC/U7IFIX8E new file mode 100644 index 0000000..1925445 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX8E differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7IFIX8F b/info.exult.exult/data/blackgate/STATIC/U7IFIX8F new file mode 100644 index 0000000..95e82dd Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7IFIX8F differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7INTRO.TIM b/info.exult.exult/data/blackgate/STATIC/U7INTRO.TIM new file mode 100644 index 0000000..d244381 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7INTRO.TIM differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7MAP b/info.exult.exult/data/blackgate/STATIC/U7MAP new file mode 100644 index 0000000..731ec20 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7MAP differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7SPEECH.SPC b/info.exult.exult/data/blackgate/STATIC/U7SPEECH.SPC new file mode 100644 index 0000000..1fa7911 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7SPEECH.SPC differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7STRAX.DRV b/info.exult.exult/data/blackgate/STATIC/U7STRAX.DRV new file mode 100644 index 0000000..fd2d0a4 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7STRAX.DRV differ diff --git a/info.exult.exult/data/blackgate/STATIC/U7VOICE.FLX b/info.exult.exult/data/blackgate/STATIC/U7VOICE.FLX new file mode 100644 index 0000000..45530bd Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/U7VOICE.FLX differ diff --git a/info.exult.exult/data/blackgate/STATIC/USECODE b/info.exult.exult/data/blackgate/STATIC/USECODE new file mode 100644 index 0000000..8662eca Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/USECODE differ diff --git a/info.exult.exult/data/blackgate/STATIC/WEAPONS.DAT b/info.exult.exult/data/blackgate/STATIC/WEAPONS.DAT new file mode 100644 index 0000000..c1f449e Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/WEAPONS.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/WGTVOL.DAT b/info.exult.exult/data/blackgate/STATIC/WGTVOL.DAT new file mode 100644 index 0000000..9c2bded Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/WGTVOL.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/WIHH.DAT b/info.exult.exult/data/blackgate/STATIC/WIHH.DAT new file mode 100644 index 0000000..fbed2b3 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/WIHH.DAT differ diff --git a/info.exult.exult/data/blackgate/STATIC/XFORM.TBL b/info.exult.exult/data/blackgate/STATIC/XFORM.TBL new file mode 100644 index 0000000..27e5469 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/XFORM.TBL differ diff --git a/info.exult.exult/data/blackgate/STATIC/XMIDI.AD b/info.exult.exult/data/blackgate/STATIC/XMIDI.AD new file mode 100644 index 0000000..22cda50 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/XMIDI.AD differ diff --git a/info.exult.exult/data/blackgate/STATIC/XMIDI.MT b/info.exult.exult/data/blackgate/STATIC/XMIDI.MT new file mode 100644 index 0000000..2d993e7 Binary files /dev/null and b/info.exult.exult/data/blackgate/STATIC/XMIDI.MT differ diff --git a/info.exult.exult/data/blackgate/TEMP0003.$$$ b/info.exult.exult/data/blackgate/TEMP0003.$$$ new file mode 100644 index 0000000..32ddd60 Binary files /dev/null and b/info.exult.exult/data/blackgate/TEMP0003.$$$ differ diff --git a/info.exult.exult/data/blackgate/U7.BAT b/info.exult.exult/data/blackgate/U7.BAT new file mode 100644 index 0000000..107778d --- /dev/null +++ b/info.exult.exult/data/blackgate/U7.BAT @@ -0,0 +1,22 @@ +@echo off +rem Ultima 7 batch file +rem Created by Myque Ouellette +rem 11/24/97 + +cd ultima7 + +@echo off +if not exist test.cfg goto sound +goto main + +:sound +install +copy u7.cfg test.cfg +goto main + +:main +ultima7.com +goto end + + +:end diff --git a/info.exult.exult/data/blackgate/U7.EXE b/info.exult.exult/data/blackgate/U7.EXE new file mode 100644 index 0000000..992c236 Binary files /dev/null and b/info.exult.exult/data/blackgate/U7.EXE differ diff --git a/info.exult.exult/data/blackgate/ULTIMA7.COM b/info.exult.exult/data/blackgate/ULTIMA7.COM new file mode 100644 index 0000000..25f31c0 Binary files /dev/null and b/info.exult.exult/data/blackgate/ULTIMA7.COM differ diff --git a/info.exult.exult/data/blackgate/__redist/ISI/scriptinterpreter.exe b/info.exult.exult/data/blackgate/__redist/ISI/scriptinterpreter.exe new file mode 100644 index 0000000..c211ff1 Binary files /dev/null and b/info.exult.exult/data/blackgate/__redist/ISI/scriptinterpreter.exe differ diff --git a/info.exult.exult/data/blackgate/__support/app/TEST.CFG b/info.exult.exult/data/blackgate/__support/app/TEST.CFG new file mode 100644 index 0000000..81142ca --- /dev/null +++ b/info.exult.exult/data/blackgate/__support/app/TEST.CFG @@ -0,0 +1,2 @@ +s 388 +220 7 1 diff --git a/info.exult.exult/data/blackgate/__support/app/U7.CFG b/info.exult.exult/data/blackgate/__support/app/U7.CFG new file mode 100644 index 0000000..81142ca --- /dev/null +++ b/info.exult.exult/data/blackgate/__support/app/U7.CFG @@ -0,0 +1,2 @@ +s 388 +220 7 1 diff --git a/info.exult.exult/data/blackgate/__support/app/dosboxULTIMA7.conf b/info.exult.exult/data/blackgate/__support/app/dosboxULTIMA7.conf new file mode 100644 index 0000000..ce840fb --- /dev/null +++ b/info.exult.exult/data/blackgate/__support/app/dosboxULTIMA7.conf @@ -0,0 +1,230 @@ +# This is the configurationfile for DOSBox 0.74. (Please use the latest version of DOSBox) +# Lines starting with a # are commentlines and are ignored by DOSBox. +# They are used to (briefly) document the effect of each option. + +[sdl] +# fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back) +# fulldouble: Use double buffering in fullscreen. It can reduce screen flickering, but it can also result in a slow DOSBox. +# fullresolution: What resolution to use for fullscreen: original or fixed size (e.g. 1024x768). +# Using your monitor's native resolution with aspect=true might give the best results. +# If you end up with small window on a large screen, try an output different from surface. +# windowresolution: Scale the window to this size IF the output device supports hardware scaling. +# (output=surface does not!) +# output: What video system to use for output. +# Possible values: surface, overlay, opengl, openglnb, ddraw. +# autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) +# sensitivity: Mouse sensitivity. +# waitonerror: Wait before closing the console if dosbox has an error. +# priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. +# pause is only valid for the second entry. +# Possible values: lowest, lower, normal, higher, highest, pause. +# mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the defaul value. +# usescancodes: Avoid usage of symkeys, might not work on all operating systems. + +fullscreen=true +fulldouble=false +fullresolution=desktop +windowresolution=original +output=overlay +autolock=true +sensitivity=100 +waitonerror=true +priority=higher,normal +mapperfile=mapper-0.74.map +usescancodes=true + +[dosbox] +# language: Select another language file. +# machine: The type of machine tries to emulate. +# Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe. +# captures: Directory where things like wave, midi, screenshot get captured. +# memsize: Amount of memory DOSBox has in megabytes. +# This value is best left at its default to avoid problems with some games, +# though few games might require a higher value. +# There is generally no speed advantage when raising this value. + +language= +machine=svga_s3 +captures=capture +memsize=16 + +[render] +# frameskip: How many frames DOSBox skips before drawing one. +# aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!. +# scaler: Scaler used to enlarge/enhance low resolution modes. +# If 'forced' is appended, then the scaler will be used even if the result might not be desired. +# Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x. + +frameskip=0 +aspect=false +scaler=normal2x + +[cpu] +# core: CPU Core used in emulation. auto will switch to dynamic if available and appropriate. +# Possible values: auto, dynamic, normal, simple. +# cputype: CPU Type used in emulation. auto is the fastest choice. +# Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch. +# cycles: Amount of instructions DOSBox tries to emulate each millisecond. +# Setting this value too high results in sound dropouts and lags. +# Cycles can be set in 3 ways: +# 'auto' tries to guess what a game needs. +# It usually works, but can fail for certain games. +# 'fixed #number' will set a fixed amount of cycles. This is what you usually need if 'auto' fails. +# (Example: fixed 4000). +# 'max' will allocate as much cycles as your computer is able to handle. +# +# Possible values: auto, fixed, max. +# cycleup: Amount of cycles to decrease/increase with keycombo.(CTRL-F11/CTRL-F12) +# cycledown: Setting it lower than 100 will be a percentage. + +core=auto +cputype=auto +cycles=fixed 14000 +cycleup=1000 +cycledown=1000 + +[mixer] +# nosound: Enable silent mode, sound is still emulated though. +# rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. +# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. +# blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. +# Possible values: 1024, 2048, 4096, 8192, 512, 256. +# prebuffer: How many milliseconds of data to keep on top of the blocksize. + +nosound=false +rate=44100 +blocksize=1024 +prebuffer=80 + +[midi] +# mpu401: Type of MPU-401 to emulate. +# Possible values: intelligent, uart, none. +# mididevice: Device that will receive the MIDI data from MPU-401. +# Possible values: default, win32, alsa, oss, coreaudio, coremidi, none. +# midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use. See README for details. + +mpu401=intelligent +mididevice=default +midiconfig= + +[sblaster] +# sbtype: Type of sblaster to emulate. +# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, none. +# sbbase: The IO address of the soundblaster. +# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300. +# irq: The IRQ number of the soundblaster. +# Possible values: 7, 5, 3, 9, 10, 11, 12. +# dma: The DMA number of the soundblaster. +# Possible values: 1, 5, 0, 3, 6, 7. +# hdma: The High DMA number of the soundblaster. +# Possible values: 1, 5, 0, 3, 6, 7. +# sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer. +# oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'. +# Possible values: auto, cms, opl2, dualopl2, opl3, none. +# oplemu: Provider for the OPL emulation. compat or old might provide better quality (see oplrate as well). +# Possible values: default, compat, fast, old. +# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). +# Possible values: 22050, 49716, 44100, 48000, 32000, 16000, 11025, 8000. + +sbtype=sb16 +sbbase=220 +irq=7 +dma=1 +hdma=5 +sbmixer=true +oplmode=auto +oplemu=default +oplrate=44100 + +[gus] +# gus: Enable the Gravis Ultrasound emulation. +# gusrate: Sample rate of Ultrasound emulation. +# Possible values: 22050, 44100, 48000, 32000, 16000, 11025, 8000, 49716. +# gusbase: The IO base address of the Gravis Ultrasound. +# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. +# gusirq: The IRQ number of the Gravis Ultrasound. +# Possible values: 5, 3, 7, 9, 10, 11, 12. +# gusdma: The DMA channel of the Gravis Ultrasound. +# Possible values: 3, 0, 1, 5, 6, 7. +# ultradir: Path to Ultrasound directory. In this directory +# there should be a MIDI directory that contains +# the patch files for GUS playback. Patch sets used +# with Timidity should work fine. + +gus=true +gusrate=22050 +gusbase=240 +gusirq=5 +gusdma=3 +ultradir=C:\ULTRASND + +[speaker] +# pcspeaker: Enable PC-Speaker emulation. +# pcrate: Sample rate of the PC-Speaker sound generation. +# Possible values: 22050, 44100, 48000, 32000, 16000, 11025, 8000, 49716. +# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. +# Possible values: auto, on, off. +# tandyrate: Sample rate of the Tandy 3-Voice generation. +# Possible values: 22050, 44100, 48000, 32000, 16000, 11025, 8000, 49716. +# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). + +pcspeaker=true +pcrate=22050 +tandy=auto +tandyrate=22050 +disney=true + +[joystick] +# joysticktype: Type of joystick to emulate: auto (default), none, +# 2axis (supports two joysticks), +# 4axis (supports one joystick, first joystick used), +# 4axis_2 (supports one joystick, second joystick used), +# fcs (Thrustmaster), ch (CH Flightstick). +# none disables joystick emulation. +# auto chooses emulation depending on real joystick(s). +# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. +# timed: enable timed intervals for axis. (false is old style behaviour). +# autofire: continuously fires as long as you keep the button pressed. +# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. +# buttonwrap: enable button wrapping at the number of emulated buttons. + +joysticktype=auto +timed=true +autofire=false +swap34=false +buttonwrap=true + +[serial] +# serial1: set type of device connected to com port. +# Can be disabled, dummy, modem, nullmodem, directserial. +# Additional parameters must be in the same line in the form of +# parameter:value. Parameter for all types is irq. +# for directserial: realport (required), rxdelay (optional). +# (realport:COM1 realport:ttyS0). +# for modem: listenport (optional). +# for nullmodem: server, rxdelay, txdelay, telnet, usedtr, +# transparent, port, inhsocket (all optional). +# Example: serial1=modem listenport:5000 +# Possible values: dummy, disabled, modem, nullmodem, directserial. +# serial2: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, directserial. +# serial3: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, directserial. +# serial4: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, directserial. + +serial1=dummy +serial2=dummy +serial3=disabled +serial4=disabled + +[dos] +# xms: Enable XMS support. +# ems: Enable EMS support. +# umb: Enable UMB support. +# keyboardlayout: Language code of the keyboard layout (or none). + +xms=true +ems=false +umb=true +keyboardlayout=auto \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/__support/app/dosboxULTIMA7_settings.conf b/info.exult.exult/data/blackgate/__support/app/dosboxULTIMA7_settings.conf new file mode 100644 index 0000000..502fee9 --- /dev/null +++ b/info.exult.exult/data/blackgate/__support/app/dosboxULTIMA7_settings.conf @@ -0,0 +1,12 @@ +[ipx] +# ipx: Enable ipx over UDP/IP emulation. + +ipx=false + +[autoexec] +@echo off +mount C ".." +cls +c: +install.exe +exit \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/__support/app/dosboxULTIMA7_single.conf b/info.exult.exult/data/blackgate/__support/app/dosboxULTIMA7_single.conf new file mode 100644 index 0000000..e93ad00 --- /dev/null +++ b/info.exult.exult/data/blackgate/__support/app/dosboxULTIMA7_single.conf @@ -0,0 +1,12 @@ +[ipx] +# ipx: Enable ipx over UDP/IP emulation. + +ipx=false + +[autoexec] +@echo off +mount C ".." +cls +c: +ultima7.com +exit \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/answers.pdf b/info.exult.exult/data/blackgate/answers.pdf new file mode 100644 index 0000000..d0390aa Binary files /dev/null and b/info.exult.exult/data/blackgate/answers.pdf differ diff --git a/info.exult.exult/data/blackgate/app/goggame-1207662623.ico b/info.exult.exult/data/blackgate/app/goggame-1207662623.ico new file mode 100644 index 0000000..8b15bdb Binary files /dev/null and b/info.exult.exult/data/blackgate/app/goggame-1207662623.ico differ diff --git a/info.exult.exult/data/blackgate/app/webcache.zip b/info.exult.exult/data/blackgate/app/webcache.zip new file mode 100644 index 0000000..4d0e980 Binary files /dev/null and b/info.exult.exult/data/blackgate/app/webcache.zip differ diff --git a/info.exult.exult/data/blackgate/commonappdata/GOG.com/supportInstaller/uninstall.dll b/info.exult.exult/data/blackgate/commonappdata/GOG.com/supportInstaller/uninstall.dll new file mode 100644 index 0000000..89b17e6 Binary files /dev/null and b/info.exult.exult/data/blackgate/commonappdata/GOG.com/supportInstaller/uninstall.dll differ diff --git a/info.exult.exult/data/blackgate/gamedat/ACTION.DAT b/info.exult.exult/data/blackgate/gamedat/ACTION.DAT new file mode 100644 index 0000000..9f2309f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/ACTION.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/AV_FLAGS.DAT b/info.exult.exult/data/blackgate/gamedat/AV_FLAGS.DAT new file mode 100644 index 0000000..fbf8ff0 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/AV_FLAGS.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/FRAMES.FLG b/info.exult.exult/data/blackgate/gamedat/FRAMES.FLG new file mode 100644 index 0000000..011b633 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/FRAMES.FLG differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMA.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMA.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMA.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMB.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMB.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMB.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMC.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMC.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMC.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMD.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMD.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMD.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIME.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIME.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIME.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMF.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMF.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMF.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMG.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMG.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMG.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMH.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMH.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMH.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMI.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMI.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMI.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMJ.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMJ.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMJ.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMK.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMK.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMK.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIML.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIML.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIML.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GAMETIMM.DAT b/info.exult.exult/data/blackgate/gamedat/GAMETIMM.DAT new file mode 100644 index 0000000..27d9555 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GAMETIMM.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/GUMPMGR.DAT b/info.exult.exult/data/blackgate/gamedat/GUMPMGR.DAT new file mode 100644 index 0000000..74b8d86 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/GUMPMGR.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/ITEMNODE.DAT b/info.exult.exult/data/blackgate/gamedat/ITEMNODE.DAT new file mode 100644 index 0000000..e46aade Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/ITEMNODE.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/MAPCOORD.DAT b/info.exult.exult/data/blackgate/gamedat/MAPCOORD.DAT new file mode 100644 index 0000000..24aa444 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/MAPCOORD.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/MISSTRAC.DAT b/info.exult.exult/data/blackgate/gamedat/MISSTRAC.DAT new file mode 100644 index 0000000..3d3a846 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/MISSTRAC.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/OPTIONS.CFG b/info.exult.exult/data/blackgate/gamedat/OPTIONS.CFG new file mode 100644 index 0000000..4ca90be --- /dev/null +++ b/info.exult.exult/data/blackgate/gamedat/OPTIONS.CFG @@ -0,0 +1,4 @@ +MUSIC ON + SPEECH ON + SFX ON + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/gamedat/PARTY b/info.exult.exult/data/blackgate/gamedat/PARTY new file mode 100644 index 0000000..3b8fee4 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/PARTY differ diff --git a/info.exult.exult/data/blackgate/gamedat/PATH.DAT b/info.exult.exult/data/blackgate/gamedat/PATH.DAT new file mode 100644 index 0000000..6793185 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/PATH.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/PATH0.DAT b/info.exult.exult/data/blackgate/gamedat/PATH0.DAT new file mode 100644 index 0000000..becf1c8 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/PATH0.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/RANDSEED.DAT b/info.exult.exult/data/blackgate/gamedat/RANDSEED.DAT new file mode 100644 index 0000000..7161c1f --- /dev/null +++ b/info.exult.exult/data/blackgate/gamedat/RANDSEED.DAT @@ -0,0 +1 @@ +È"ú \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/gamedat/U7IBUF.DAT b/info.exult.exult/data/blackgate/gamedat/U7IBUF.DAT new file mode 100644 index 0000000..32817ed Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IBUF.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG00 b/info.exult.exult/data/blackgate/gamedat/U7IREG00 new file mode 100644 index 0000000..220f81b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG00 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG01 b/info.exult.exult/data/blackgate/gamedat/U7IREG01 new file mode 100644 index 0000000..fb9c7a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG01 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG02 b/info.exult.exult/data/blackgate/gamedat/U7IREG02 new file mode 100644 index 0000000..34dffe5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG02 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG03 b/info.exult.exult/data/blackgate/gamedat/U7IREG03 new file mode 100644 index 0000000..b558a79 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG03 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG04 b/info.exult.exult/data/blackgate/gamedat/U7IREG04 new file mode 100644 index 0000000..270d245 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG04 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG05 b/info.exult.exult/data/blackgate/gamedat/U7IREG05 new file mode 100644 index 0000000..d872c86 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG05 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG06 b/info.exult.exult/data/blackgate/gamedat/U7IREG06 new file mode 100644 index 0000000..b9778d3 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG06 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG07 b/info.exult.exult/data/blackgate/gamedat/U7IREG07 new file mode 100644 index 0000000..cefc673 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG07 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG08 b/info.exult.exult/data/blackgate/gamedat/U7IREG08 new file mode 100644 index 0000000..b1d1f16 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG08 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG09 b/info.exult.exult/data/blackgate/gamedat/U7IREG09 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG09 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG0A b/info.exult.exult/data/blackgate/gamedat/U7IREG0A new file mode 100644 index 0000000..2d70f36 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG0A differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG0B b/info.exult.exult/data/blackgate/gamedat/U7IREG0B new file mode 100644 index 0000000..bcf9b00 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG0B differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG0C b/info.exult.exult/data/blackgate/gamedat/U7IREG0C new file mode 100644 index 0000000..14a9384 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG0C differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG0D b/info.exult.exult/data/blackgate/gamedat/U7IREG0D new file mode 100644 index 0000000..f2a0ac7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG0D differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG0E b/info.exult.exult/data/blackgate/gamedat/U7IREG0E new file mode 100644 index 0000000..1f46414 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG0E differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG0F b/info.exult.exult/data/blackgate/gamedat/U7IREG0F new file mode 100644 index 0000000..1f4e894 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG0F differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG10 b/info.exult.exult/data/blackgate/gamedat/U7IREG10 new file mode 100644 index 0000000..e8981e9 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG10 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG11 b/info.exult.exult/data/blackgate/gamedat/U7IREG11 new file mode 100644 index 0000000..998c1b8 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG11 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG12 b/info.exult.exult/data/blackgate/gamedat/U7IREG12 new file mode 100644 index 0000000..96fe3ab Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG12 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG13 b/info.exult.exult/data/blackgate/gamedat/U7IREG13 new file mode 100644 index 0000000..04a7ab5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG13 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG14 b/info.exult.exult/data/blackgate/gamedat/U7IREG14 new file mode 100644 index 0000000..92828ef Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG14 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG15 b/info.exult.exult/data/blackgate/gamedat/U7IREG15 new file mode 100644 index 0000000..2e0553a Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG15 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG16 b/info.exult.exult/data/blackgate/gamedat/U7IREG16 new file mode 100644 index 0000000..e6b345a Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG16 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG17 b/info.exult.exult/data/blackgate/gamedat/U7IREG17 new file mode 100644 index 0000000..456b341 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG17 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG18 b/info.exult.exult/data/blackgate/gamedat/U7IREG18 new file mode 100644 index 0000000..e0780d7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG18 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG19 b/info.exult.exult/data/blackgate/gamedat/U7IREG19 new file mode 100644 index 0000000..b590d77 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG19 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG1A b/info.exult.exult/data/blackgate/gamedat/U7IREG1A new file mode 100644 index 0000000..3c3c5c4 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG1A differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG1B b/info.exult.exult/data/blackgate/gamedat/U7IREG1B new file mode 100644 index 0000000..a73464e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG1B differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG1C b/info.exult.exult/data/blackgate/gamedat/U7IREG1C new file mode 100644 index 0000000..e884e37 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG1C differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG1D b/info.exult.exult/data/blackgate/gamedat/U7IREG1D new file mode 100644 index 0000000..6103578 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG1D differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG1E b/info.exult.exult/data/blackgate/gamedat/U7IREG1E new file mode 100644 index 0000000..ce1a741 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG1E differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG1F b/info.exult.exult/data/blackgate/gamedat/U7IREG1F new file mode 100644 index 0000000..617038c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG1F differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG20 b/info.exult.exult/data/blackgate/gamedat/U7IREG20 new file mode 100644 index 0000000..a0b5936 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG20 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG21 b/info.exult.exult/data/blackgate/gamedat/U7IREG21 new file mode 100644 index 0000000..f0b0b05 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG21 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG22 b/info.exult.exult/data/blackgate/gamedat/U7IREG22 new file mode 100644 index 0000000..3adaa50 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG22 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG23 b/info.exult.exult/data/blackgate/gamedat/U7IREG23 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG23 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG24 b/info.exult.exult/data/blackgate/gamedat/U7IREG24 new file mode 100644 index 0000000..286b46a Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG24 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG25 b/info.exult.exult/data/blackgate/gamedat/U7IREG25 new file mode 100644 index 0000000..1ca4e75 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG25 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG26 b/info.exult.exult/data/blackgate/gamedat/U7IREG26 new file mode 100644 index 0000000..40c7064 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG26 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG27 b/info.exult.exult/data/blackgate/gamedat/U7IREG27 new file mode 100644 index 0000000..4daf6e4 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG27 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG28 b/info.exult.exult/data/blackgate/gamedat/U7IREG28 new file mode 100644 index 0000000..59df6e5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG28 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG29 b/info.exult.exult/data/blackgate/gamedat/U7IREG29 new file mode 100644 index 0000000..f9d4044 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG29 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG2A b/info.exult.exult/data/blackgate/gamedat/U7IREG2A new file mode 100644 index 0000000..95042e3 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG2A differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG2B b/info.exult.exult/data/blackgate/gamedat/U7IREG2B new file mode 100644 index 0000000..33e8d71 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG2B differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG2C b/info.exult.exult/data/blackgate/gamedat/U7IREG2C new file mode 100644 index 0000000..b5ccff5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG2C differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG2D b/info.exult.exult/data/blackgate/gamedat/U7IREG2D new file mode 100644 index 0000000..1a42d76 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG2D differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG2E b/info.exult.exult/data/blackgate/gamedat/U7IREG2E new file mode 100644 index 0000000..aab7489 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG2E differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG2F b/info.exult.exult/data/blackgate/gamedat/U7IREG2F new file mode 100644 index 0000000..3ed7773 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG2F differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG30 b/info.exult.exult/data/blackgate/gamedat/U7IREG30 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG30 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG31 b/info.exult.exult/data/blackgate/gamedat/U7IREG31 new file mode 100644 index 0000000..904b4f7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG31 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG32 b/info.exult.exult/data/blackgate/gamedat/U7IREG32 new file mode 100644 index 0000000..04f1832 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG32 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG33 b/info.exult.exult/data/blackgate/gamedat/U7IREG33 new file mode 100644 index 0000000..6af5ccb Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG33 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG34 b/info.exult.exult/data/blackgate/gamedat/U7IREG34 new file mode 100644 index 0000000..4c51660 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG34 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG35 b/info.exult.exult/data/blackgate/gamedat/U7IREG35 new file mode 100644 index 0000000..ac477ac Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG35 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG36 b/info.exult.exult/data/blackgate/gamedat/U7IREG36 new file mode 100644 index 0000000..5ec29be Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG36 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG37 b/info.exult.exult/data/blackgate/gamedat/U7IREG37 new file mode 100644 index 0000000..fa09e63 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG37 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG38 b/info.exult.exult/data/blackgate/gamedat/U7IREG38 new file mode 100644 index 0000000..d120e8c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG38 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG39 b/info.exult.exult/data/blackgate/gamedat/U7IREG39 new file mode 100644 index 0000000..8fc1efa Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG39 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG3A b/info.exult.exult/data/blackgate/gamedat/U7IREG3A new file mode 100644 index 0000000..31b3f11 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG3A differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG3B b/info.exult.exult/data/blackgate/gamedat/U7IREG3B new file mode 100644 index 0000000..5dd9177 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG3B differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG3C b/info.exult.exult/data/blackgate/gamedat/U7IREG3C new file mode 100644 index 0000000..448bb1d Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG3C differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG3D b/info.exult.exult/data/blackgate/gamedat/U7IREG3D new file mode 100644 index 0000000..58ff22e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG3D differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG3E b/info.exult.exult/data/blackgate/gamedat/U7IREG3E new file mode 100644 index 0000000..1a91861 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG3E differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG3F b/info.exult.exult/data/blackgate/gamedat/U7IREG3F new file mode 100644 index 0000000..7bb7e4e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG3F differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG40 b/info.exult.exult/data/blackgate/gamedat/U7IREG40 new file mode 100644 index 0000000..92acf9c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG40 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG41 b/info.exult.exult/data/blackgate/gamedat/U7IREG41 new file mode 100644 index 0000000..466cf1c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG41 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG42 b/info.exult.exult/data/blackgate/gamedat/U7IREG42 new file mode 100644 index 0000000..e6e365e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG42 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG43 b/info.exult.exult/data/blackgate/gamedat/U7IREG43 new file mode 100644 index 0000000..6367afb Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG43 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG44 b/info.exult.exult/data/blackgate/gamedat/U7IREG44 new file mode 100644 index 0000000..3b3d0da Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG44 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG45 b/info.exult.exult/data/blackgate/gamedat/U7IREG45 new file mode 100644 index 0000000..c738763 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG45 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG46 b/info.exult.exult/data/blackgate/gamedat/U7IREG46 new file mode 100644 index 0000000..a6bbf61 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG46 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG47 b/info.exult.exult/data/blackgate/gamedat/U7IREG47 new file mode 100644 index 0000000..7c53283 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG47 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG48 b/info.exult.exult/data/blackgate/gamedat/U7IREG48 new file mode 100644 index 0000000..a78e04f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG48 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG49 b/info.exult.exult/data/blackgate/gamedat/U7IREG49 new file mode 100644 index 0000000..bc22c24 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG49 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG4A b/info.exult.exult/data/blackgate/gamedat/U7IREG4A new file mode 100644 index 0000000..ea76f2c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG4A differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG4B b/info.exult.exult/data/blackgate/gamedat/U7IREG4B new file mode 100644 index 0000000..1502f5c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG4B differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG4C b/info.exult.exult/data/blackgate/gamedat/U7IREG4C new file mode 100644 index 0000000..5d6de30 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG4C differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG4D b/info.exult.exult/data/blackgate/gamedat/U7IREG4D new file mode 100644 index 0000000..b876804 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG4D differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG4E b/info.exult.exult/data/blackgate/gamedat/U7IREG4E new file mode 100644 index 0000000..9922828 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG4E differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG4F b/info.exult.exult/data/blackgate/gamedat/U7IREG4F new file mode 100644 index 0000000..88bf613 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG4F differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG50 b/info.exult.exult/data/blackgate/gamedat/U7IREG50 new file mode 100644 index 0000000..4a8e587 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG50 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG51 b/info.exult.exult/data/blackgate/gamedat/U7IREG51 new file mode 100644 index 0000000..e4b99da Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG51 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG52 b/info.exult.exult/data/blackgate/gamedat/U7IREG52 new file mode 100644 index 0000000..5e18998 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG52 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG53 b/info.exult.exult/data/blackgate/gamedat/U7IREG53 new file mode 100644 index 0000000..744b37d Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG53 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG54 b/info.exult.exult/data/blackgate/gamedat/U7IREG54 new file mode 100644 index 0000000..0861643 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG54 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG55 b/info.exult.exult/data/blackgate/gamedat/U7IREG55 new file mode 100644 index 0000000..5e1fd62 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG55 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG56 b/info.exult.exult/data/blackgate/gamedat/U7IREG56 new file mode 100644 index 0000000..34aee87 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG56 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG57 b/info.exult.exult/data/blackgate/gamedat/U7IREG57 new file mode 100644 index 0000000..3e40c36 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG57 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG58 b/info.exult.exult/data/blackgate/gamedat/U7IREG58 new file mode 100644 index 0000000..f27dcdd Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG58 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG59 b/info.exult.exult/data/blackgate/gamedat/U7IREG59 new file mode 100644 index 0000000..1d33d61 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG59 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG5A b/info.exult.exult/data/blackgate/gamedat/U7IREG5A new file mode 100644 index 0000000..6af03fa Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG5A differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG5B b/info.exult.exult/data/blackgate/gamedat/U7IREG5B new file mode 100644 index 0000000..477d68a Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG5B differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG5C b/info.exult.exult/data/blackgate/gamedat/U7IREG5C new file mode 100644 index 0000000..d9afabf Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG5C differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG5D b/info.exult.exult/data/blackgate/gamedat/U7IREG5D new file mode 100644 index 0000000..b4ac17b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG5D differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG5E b/info.exult.exult/data/blackgate/gamedat/U7IREG5E new file mode 100644 index 0000000..e3cb4e1 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG5E differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG5F b/info.exult.exult/data/blackgate/gamedat/U7IREG5F new file mode 100644 index 0000000..2b32c18 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG5F differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG60 b/info.exult.exult/data/blackgate/gamedat/U7IREG60 new file mode 100644 index 0000000..34f0bf7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG60 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG61 b/info.exult.exult/data/blackgate/gamedat/U7IREG61 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG61 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG62 b/info.exult.exult/data/blackgate/gamedat/U7IREG62 new file mode 100644 index 0000000..77971f5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG62 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG63 b/info.exult.exult/data/blackgate/gamedat/U7IREG63 new file mode 100644 index 0000000..c8e3795 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG63 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG64 b/info.exult.exult/data/blackgate/gamedat/U7IREG64 new file mode 100644 index 0000000..2a4a8f5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG64 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG65 b/info.exult.exult/data/blackgate/gamedat/U7IREG65 new file mode 100644 index 0000000..e2b21f1 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG65 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG66 b/info.exult.exult/data/blackgate/gamedat/U7IREG66 new file mode 100644 index 0000000..4fbbe7b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG66 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG67 b/info.exult.exult/data/blackgate/gamedat/U7IREG67 new file mode 100644 index 0000000..976bb0f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG67 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG68 b/info.exult.exult/data/blackgate/gamedat/U7IREG68 new file mode 100644 index 0000000..200dcc8 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG68 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG69 b/info.exult.exult/data/blackgate/gamedat/U7IREG69 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG69 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG6A b/info.exult.exult/data/blackgate/gamedat/U7IREG6A new file mode 100644 index 0000000..5108539 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG6A differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG6B b/info.exult.exult/data/blackgate/gamedat/U7IREG6B new file mode 100644 index 0000000..0396af1 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG6B differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG6C b/info.exult.exult/data/blackgate/gamedat/U7IREG6C new file mode 100644 index 0000000..ef72c55 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG6C differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG6D b/info.exult.exult/data/blackgate/gamedat/U7IREG6D new file mode 100644 index 0000000..32b606e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG6D differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG6E b/info.exult.exult/data/blackgate/gamedat/U7IREG6E new file mode 100644 index 0000000..d4adb38 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG6E differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG6F b/info.exult.exult/data/blackgate/gamedat/U7IREG6F new file mode 100644 index 0000000..bdba7e2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG6F differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG70 b/info.exult.exult/data/blackgate/gamedat/U7IREG70 new file mode 100644 index 0000000..abce224 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG70 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG71 b/info.exult.exult/data/blackgate/gamedat/U7IREG71 new file mode 100644 index 0000000..f42b5cc Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG71 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG72 b/info.exult.exult/data/blackgate/gamedat/U7IREG72 new file mode 100644 index 0000000..f58d2f3 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG72 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG73 b/info.exult.exult/data/blackgate/gamedat/U7IREG73 new file mode 100644 index 0000000..d6712b1 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG73 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG74 b/info.exult.exult/data/blackgate/gamedat/U7IREG74 new file mode 100644 index 0000000..142fcb4 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG74 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG75 b/info.exult.exult/data/blackgate/gamedat/U7IREG75 new file mode 100644 index 0000000..38b5f66 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG75 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG76 b/info.exult.exult/data/blackgate/gamedat/U7IREG76 new file mode 100644 index 0000000..19f8b44 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG76 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG77 b/info.exult.exult/data/blackgate/gamedat/U7IREG77 new file mode 100644 index 0000000..7e7d798 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG77 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG78 b/info.exult.exult/data/blackgate/gamedat/U7IREG78 new file mode 100644 index 0000000..a3c6f08 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG78 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG79 b/info.exult.exult/data/blackgate/gamedat/U7IREG79 new file mode 100644 index 0000000..5908ed1 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG79 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG7A b/info.exult.exult/data/blackgate/gamedat/U7IREG7A new file mode 100644 index 0000000..a5872e5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG7A differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG7B b/info.exult.exult/data/blackgate/gamedat/U7IREG7B new file mode 100644 index 0000000..3c4a42e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG7B differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG7C b/info.exult.exult/data/blackgate/gamedat/U7IREG7C new file mode 100644 index 0000000..3b09b3b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG7C differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG7D b/info.exult.exult/data/blackgate/gamedat/U7IREG7D new file mode 100644 index 0000000..113248b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG7D differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG7E b/info.exult.exult/data/blackgate/gamedat/U7IREG7E new file mode 100644 index 0000000..7d18f5f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG7E differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG7F b/info.exult.exult/data/blackgate/gamedat/U7IREG7F new file mode 100644 index 0000000..07a1d99 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG7F differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG80 b/info.exult.exult/data/blackgate/gamedat/U7IREG80 new file mode 100644 index 0000000..608188d Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG80 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG81 b/info.exult.exult/data/blackgate/gamedat/U7IREG81 new file mode 100644 index 0000000..3932e93 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG81 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG82 b/info.exult.exult/data/blackgate/gamedat/U7IREG82 new file mode 100644 index 0000000..9987e61 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG82 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG83 b/info.exult.exult/data/blackgate/gamedat/U7IREG83 new file mode 100644 index 0000000..953f2a7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG83 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG84 b/info.exult.exult/data/blackgate/gamedat/U7IREG84 new file mode 100644 index 0000000..0f9cf46 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG84 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG85 b/info.exult.exult/data/blackgate/gamedat/U7IREG85 new file mode 100644 index 0000000..a1d4d75 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG85 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG86 b/info.exult.exult/data/blackgate/gamedat/U7IREG86 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG86 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG87 b/info.exult.exult/data/blackgate/gamedat/U7IREG87 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG87 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG88 b/info.exult.exult/data/blackgate/gamedat/U7IREG88 new file mode 100644 index 0000000..39e1ad7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG88 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG89 b/info.exult.exult/data/blackgate/gamedat/U7IREG89 new file mode 100644 index 0000000..64ef27c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG89 differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG8A b/info.exult.exult/data/blackgate/gamedat/U7IREG8A new file mode 100644 index 0000000..53fb6d0 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG8A differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG8B b/info.exult.exult/data/blackgate/gamedat/U7IREG8B new file mode 100644 index 0000000..647519e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG8B differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG8C b/info.exult.exult/data/blackgate/gamedat/U7IREG8C new file mode 100644 index 0000000..c2f1db6 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG8C differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG8D b/info.exult.exult/data/blackgate/gamedat/U7IREG8D new file mode 100644 index 0000000..b651f9c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG8D differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG8E b/info.exult.exult/data/blackgate/gamedat/U7IREG8E new file mode 100644 index 0000000..a66d7e8 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG8E differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7IREG8F b/info.exult.exult/data/blackgate/gamedat/U7IREG8F new file mode 100644 index 0000000..e76fa50 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7IREG8F differ diff --git a/info.exult.exult/data/blackgate/gamedat/U7_OSTIA.DAT b/info.exult.exult/data/blackgate/gamedat/U7_OSTIA.DAT new file mode 100644 index 0000000..ddfad19 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/U7_OSTIA.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/WEATHER.DAT b/info.exult.exult/data/blackgate/gamedat/WEATHER.DAT new file mode 100644 index 0000000..7af0a14 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/WEATHER.DAT differ diff --git a/info.exult.exult/data/blackgate/gamedat/exult.ver b/info.exult.exult/data/blackgate/gamedat/exult.ver new file mode 100644 index 0000000..1616a4a --- /dev/null +++ b/info.exult.exult/data/blackgate/gamedat/exult.ver @@ -0,0 +1,18 @@ +Exult version 1.10.1 +Source url: https://github.com/exult/exult +Build Architechture: x86_64 +CPUID: AuthenticAMD, AMD Ryzen 5 5600X 6-Core Processor +stepping: 2 +type: 0 +family: 15 +ext family: 10 +model: 1 +ext model: 2 +SSE: supported +SSE2: supported +X86-64-v3 supported +Built at: Jan 28 2025 16:00:33 +Compile-time options: USE_TIMIDITY_MIDI, USE_FMOPL_MIDI, USE_MT32EMU_MIDI, USE_ALSA_MIDI, USE_EXULTSTUDIO, HAVE_ZIP_SUPPORT, ENABLE_MIDISFX +Compiler: GCC 14.2.0 + +Platform: Linux version 6.13.1-arch1-1 diff --git a/info.exult.exult/data/blackgate/gamedat/flaginit b/info.exult.exult/data/blackgate/gamedat/flaginit new file mode 100644 index 0000000..2a18e51 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/flaginit differ diff --git a/info.exult.exult/data/blackgate/gamedat/frames.flg b/info.exult.exult/data/blackgate/gamedat/frames.flg new file mode 100644 index 0000000..dea0d12 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/frames.flg differ diff --git a/info.exult.exult/data/blackgate/gamedat/gamewin.dat b/info.exult.exult/data/blackgate/gamedat/gamewin.dat new file mode 100644 index 0000000..986e46a Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/gamewin.dat differ diff --git a/info.exult.exult/data/blackgate/gamedat/identity b/info.exult.exult/data/blackgate/gamedat/identity new file mode 100644 index 0000000..cbac40f --- /dev/null +++ b/info.exult.exult/data/blackgate/gamedat/identity @@ -0,0 +1,3 @@ +FORGE + + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/gamedat/monsnpcs.dat b/info.exult.exult/data/blackgate/gamedat/monsnpcs.dat new file mode 100644 index 0000000..eb4e254 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/monsnpcs.dat differ diff --git a/info.exult.exult/data/blackgate/gamedat/newgame.ver b/info.exult.exult/data/blackgate/gamedat/newgame.ver new file mode 100644 index 0000000..ee1e592 --- /dev/null +++ b/info.exult.exult/data/blackgate/gamedat/newgame.ver @@ -0,0 +1,18 @@ +Exult version 1.10.1 +Source url: https://github.com/exult/exult +Build Architechture: x86_64 +CPUID: AuthenticAMD, AMD Ryzen 5 5600X 6-Core Processor +stepping: 2 +type: 0 +family: 15 +ext family: 10 +model: 1 +ext model: 2 +SSE: supported +SSE2: supported +X86-64-v3 supported +Built at: Jan 28 2025 16:00:33 +Compile-time options: USE_TIMIDITY_MIDI, USE_FMOPL_MIDI, USE_MT32EMU_MIDI, USE_ALSA_MIDI, USE_EXULTSTUDIO, HAVE_ZIP_SUPPORT, ENABLE_MIDISFX +Compiler: GCC 14.2.0 + +Platform: Linux version 6.12.10-arch1-1 diff --git a/info.exult.exult/data/blackgate/gamedat/notebook.xml b/info.exult.exult/data/blackgate/gamedat/notebook.xml new file mode 100644 index 0000000..314d309 --- /dev/null +++ b/info.exult.exult/data/blackgate/gamedat/notebook.xml @@ -0,0 +1,226 @@ + + + + 1076:2214 + 76 + +The mayor of Trinsic is called Finnigan. he wants me to investigate a ritual murder. + + + + + 1076:2214 + 90 + +I just arrived and already have a quest: Investigate the stables. + + + + + 1069:2206 + 60 + +What's this? A body! And a key? Could this be a clue? + + + + + 1073:2218 + 72 + +I told the mayor Finnigan about the key I found on the body + + + + + 1073:2218 + 91 + +I found enough clues to report to Finnigan! + + + + + 950:2255 + 82 + +Chantu of Trinsic is a solemn fellow in healer's robes. + + + + + 970:2137 + 63 + +Christopher had an argument with Klog! + + + + + 970:2137 + 67 + +A man with a hook was in Trinsic. + + + + + 965:2135 + 62 + +Searched Christopher's house, the key I found unlocked a chest with a medallion, a scroll, and gold inside. + + + + + 952:2261 + 64 + +There is a ship named Crown Jewel which was anchored in Trinsic when the murder happened. + + + + + 983:2203 + 93 + +I've reported some clues, but apparently need to find out more. + + + + + 983:2203 + 68 + +I finished the investigation of the gruesome murder in Trinsic. + + + + + 983:2203 + 66 + +Because of the murder in Trinsic, all gates are locked. I need a password to get out. + + + + + 983:2203 + 61 + +Now I know the password I need to leave Trinsic. It's Blackbird! + + + + + 1015:2103 + 87 + +Off we go exploring outside Trinsic. + + + + + 930:1815 + 530 + +I've been told that there was a theft in Paws. + + + + + 807:1646 + 554 + +Camille is a hard working farm woman and widow. She runs her farm in Paws with her son Tobias. + + + + + 856:1708 + 531 + +Feridwyn accused Tobias of the theft in Paws. + + + + + 826:1671 + 564 + +Camille has run out to say that her son is innocent of the theft in Paws. + + + + + 858:1679 + 536 + +Found Garritt was the thief in Paws. + + + + + 935:1142 + 152 + +I've met my old friend Lord British again. + + + + + 935:1142 + 221 + +Lord British gave me his Orb of the moon, but warned me that the moongates are no longer stable. + + + + + 935:1142 + 101 + +LEARNED_ABOUT_BLACKROCK - allows you to ask Rudyom about it? + + + + + 935:1142 + 766 + +I mentioned the earthquake to Lord British, and he tells me that the Isle of Fire, where I defeated Exodus, has risen. He also told me of three shrines he erected there. He offers me use of his ship, the Golden Ankh, anchored at Vesper, to visit this island. + + + + + 935:1142 + 102 + +Lord British tells me that magic doesn't work anymore, but he thinks that I might still be able to cast magic. He put a spellbook for me with my other equipment. Hmm, what does he mean with equipment? + + + + + 893:1224 + 205 + +A man named Weston is imprisoned atop Britain's castle. His imprisonment may be unjust. I must talk to my friend Lord British about this. + + + + + 959:1194 + 204 + +Lord British investigated Weston's imprionment and lets him go free. + + + + + 883:1415 + 181 + +Willy is the baker of Britain and makes the sweetest bread. + + + diff --git a/info.exult.exult/data/blackgate/gamedat/npc.dat b/info.exult.exult/data/blackgate/gamedat/npc.dat new file mode 100644 index 0000000..3946246 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/npc.dat differ diff --git a/info.exult.exult/data/blackgate/gamedat/saveinfo.dat b/info.exult.exult/data/blackgate/gamedat/saveinfo.dat new file mode 100644 index 0000000..d6b25d1 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/saveinfo.dat differ diff --git a/info.exult.exult/data/blackgate/gamedat/schedule.dat b/info.exult.exult/data/blackgate/gamedat/schedule.dat new file mode 100644 index 0000000..7069ea0 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/schedule.dat differ diff --git a/info.exult.exult/data/blackgate/gamedat/scrnshot.shp b/info.exult.exult/data/blackgate/gamedat/scrnshot.shp new file mode 100644 index 0000000..34c877c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/scrnshot.shp differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg00 b/info.exult.exult/data/blackgate/gamedat/u7ireg00 new file mode 100644 index 0000000..220f81b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg00 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg01 b/info.exult.exult/data/blackgate/gamedat/u7ireg01 new file mode 100644 index 0000000..fb9c7a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg01 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg02 b/info.exult.exult/data/blackgate/gamedat/u7ireg02 new file mode 100644 index 0000000..34dffe5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg02 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg03 b/info.exult.exult/data/blackgate/gamedat/u7ireg03 new file mode 100644 index 0000000..b558a79 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg03 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg04 b/info.exult.exult/data/blackgate/gamedat/u7ireg04 new file mode 100644 index 0000000..270d245 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg04 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg05 b/info.exult.exult/data/blackgate/gamedat/u7ireg05 new file mode 100644 index 0000000..d872c86 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg05 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg06 b/info.exult.exult/data/blackgate/gamedat/u7ireg06 new file mode 100644 index 0000000..b9778d3 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg06 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg07 b/info.exult.exult/data/blackgate/gamedat/u7ireg07 new file mode 100644 index 0000000..cefc673 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg07 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg08 b/info.exult.exult/data/blackgate/gamedat/u7ireg08 new file mode 100644 index 0000000..b1d1f16 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg08 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg09 b/info.exult.exult/data/blackgate/gamedat/u7ireg09 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg09 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg0a b/info.exult.exult/data/blackgate/gamedat/u7ireg0a new file mode 100644 index 0000000..2d70f36 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg0a differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg0b b/info.exult.exult/data/blackgate/gamedat/u7ireg0b new file mode 100644 index 0000000..bcf9b00 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg0b differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg0c b/info.exult.exult/data/blackgate/gamedat/u7ireg0c new file mode 100644 index 0000000..14a9384 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg0c differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg0d b/info.exult.exult/data/blackgate/gamedat/u7ireg0d new file mode 100644 index 0000000..93312de Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg0d differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg0e b/info.exult.exult/data/blackgate/gamedat/u7ireg0e new file mode 100644 index 0000000..241f623 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg0e differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg0f b/info.exult.exult/data/blackgate/gamedat/u7ireg0f new file mode 100644 index 0000000..1f4e894 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg0f differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg10 b/info.exult.exult/data/blackgate/gamedat/u7ireg10 new file mode 100644 index 0000000..e8981e9 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg10 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg11 b/info.exult.exult/data/blackgate/gamedat/u7ireg11 new file mode 100644 index 0000000..998c1b8 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg11 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg12 b/info.exult.exult/data/blackgate/gamedat/u7ireg12 new file mode 100644 index 0000000..96fe3ab Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg12 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg13 b/info.exult.exult/data/blackgate/gamedat/u7ireg13 new file mode 100644 index 0000000..77c6738 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg13 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg14 b/info.exult.exult/data/blackgate/gamedat/u7ireg14 new file mode 100644 index 0000000..92828ef Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg14 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg15 b/info.exult.exult/data/blackgate/gamedat/u7ireg15 new file mode 100644 index 0000000..2e0553a Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg15 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg16 b/info.exult.exult/data/blackgate/gamedat/u7ireg16 new file mode 100644 index 0000000..e6b345a Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg16 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg17 b/info.exult.exult/data/blackgate/gamedat/u7ireg17 new file mode 100644 index 0000000..456b341 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg17 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg18 b/info.exult.exult/data/blackgate/gamedat/u7ireg18 new file mode 100644 index 0000000..e0780d7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg18 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg19 b/info.exult.exult/data/blackgate/gamedat/u7ireg19 new file mode 100644 index 0000000..519276e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg19 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg1a b/info.exult.exult/data/blackgate/gamedat/u7ireg1a new file mode 100644 index 0000000..b0d8d61 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg1a differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg1b b/info.exult.exult/data/blackgate/gamedat/u7ireg1b new file mode 100644 index 0000000..a73464e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg1b differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg1c b/info.exult.exult/data/blackgate/gamedat/u7ireg1c new file mode 100644 index 0000000..e884e37 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg1c differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg1d b/info.exult.exult/data/blackgate/gamedat/u7ireg1d new file mode 100644 index 0000000..6103578 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg1d differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg1e b/info.exult.exult/data/blackgate/gamedat/u7ireg1e new file mode 100644 index 0000000..ce1a741 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg1e differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg1f b/info.exult.exult/data/blackgate/gamedat/u7ireg1f new file mode 100644 index 0000000..617038c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg1f differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg20 b/info.exult.exult/data/blackgate/gamedat/u7ireg20 new file mode 100644 index 0000000..a0b5936 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg20 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg21 b/info.exult.exult/data/blackgate/gamedat/u7ireg21 new file mode 100644 index 0000000..f0b0b05 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg21 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg22 b/info.exult.exult/data/blackgate/gamedat/u7ireg22 new file mode 100644 index 0000000..3adaa50 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg22 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg23 b/info.exult.exult/data/blackgate/gamedat/u7ireg23 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg23 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg24 b/info.exult.exult/data/blackgate/gamedat/u7ireg24 new file mode 100644 index 0000000..286b46a Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg24 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg25 b/info.exult.exult/data/blackgate/gamedat/u7ireg25 new file mode 100644 index 0000000..bac0556 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg25 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg26 b/info.exult.exult/data/blackgate/gamedat/u7ireg26 new file mode 100644 index 0000000..9a8482c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg26 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg27 b/info.exult.exult/data/blackgate/gamedat/u7ireg27 new file mode 100644 index 0000000..5649bbe Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg27 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg28 b/info.exult.exult/data/blackgate/gamedat/u7ireg28 new file mode 100644 index 0000000..3e529c8 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg28 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg29 b/info.exult.exult/data/blackgate/gamedat/u7ireg29 new file mode 100644 index 0000000..f9d4044 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg29 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg2a b/info.exult.exult/data/blackgate/gamedat/u7ireg2a new file mode 100644 index 0000000..95042e3 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg2a differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg2b b/info.exult.exult/data/blackgate/gamedat/u7ireg2b new file mode 100644 index 0000000..33e8d71 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg2b differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg2c b/info.exult.exult/data/blackgate/gamedat/u7ireg2c new file mode 100644 index 0000000..8b0adeb Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg2c differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg2d b/info.exult.exult/data/blackgate/gamedat/u7ireg2d new file mode 100644 index 0000000..1a42d76 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg2d differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg2e b/info.exult.exult/data/blackgate/gamedat/u7ireg2e new file mode 100644 index 0000000..aab7489 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg2e differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg2f b/info.exult.exult/data/blackgate/gamedat/u7ireg2f new file mode 100644 index 0000000..3ed7773 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg2f differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg30 b/info.exult.exult/data/blackgate/gamedat/u7ireg30 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg30 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg31 b/info.exult.exult/data/blackgate/gamedat/u7ireg31 new file mode 100644 index 0000000..05ae31f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg31 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg32 b/info.exult.exult/data/blackgate/gamedat/u7ireg32 new file mode 100644 index 0000000..07821e8 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg32 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg33 b/info.exult.exult/data/blackgate/gamedat/u7ireg33 new file mode 100644 index 0000000..5f3f9bc Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg33 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg34 b/info.exult.exult/data/blackgate/gamedat/u7ireg34 new file mode 100644 index 0000000..beeaf2f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg34 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg35 b/info.exult.exult/data/blackgate/gamedat/u7ireg35 new file mode 100644 index 0000000..daf206f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg35 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg36 b/info.exult.exult/data/blackgate/gamedat/u7ireg36 new file mode 100644 index 0000000..fc1e3c7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg36 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg37 b/info.exult.exult/data/blackgate/gamedat/u7ireg37 new file mode 100644 index 0000000..a034082 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg37 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg38 b/info.exult.exult/data/blackgate/gamedat/u7ireg38 new file mode 100644 index 0000000..d120e8c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg38 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg39 b/info.exult.exult/data/blackgate/gamedat/u7ireg39 new file mode 100644 index 0000000..8fc1efa Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg39 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg3a b/info.exult.exult/data/blackgate/gamedat/u7ireg3a new file mode 100644 index 0000000..31b3f11 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg3a differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg3b b/info.exult.exult/data/blackgate/gamedat/u7ireg3b new file mode 100644 index 0000000..5dd9177 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg3b differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg3c b/info.exult.exult/data/blackgate/gamedat/u7ireg3c new file mode 100644 index 0000000..448bb1d Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg3c differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg3d b/info.exult.exult/data/blackgate/gamedat/u7ireg3d new file mode 100644 index 0000000..c78065b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg3d differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg3e b/info.exult.exult/data/blackgate/gamedat/u7ireg3e new file mode 100644 index 0000000..ac057cb Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg3e differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg3f b/info.exult.exult/data/blackgate/gamedat/u7ireg3f new file mode 100644 index 0000000..80b82e0 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg3f differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg40 b/info.exult.exult/data/blackgate/gamedat/u7ireg40 new file mode 100644 index 0000000..0bc08f4 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg40 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg41 b/info.exult.exult/data/blackgate/gamedat/u7ireg41 new file mode 100644 index 0000000..966fa6d Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg41 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg42 b/info.exult.exult/data/blackgate/gamedat/u7ireg42 new file mode 100644 index 0000000..f6ef053 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg42 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg43 b/info.exult.exult/data/blackgate/gamedat/u7ireg43 new file mode 100644 index 0000000..950f922 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg43 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg44 b/info.exult.exult/data/blackgate/gamedat/u7ireg44 new file mode 100644 index 0000000..fb86caa Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg44 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg45 b/info.exult.exult/data/blackgate/gamedat/u7ireg45 new file mode 100644 index 0000000..c738763 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg45 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg46 b/info.exult.exult/data/blackgate/gamedat/u7ireg46 new file mode 100644 index 0000000..a6bbf61 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg46 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg47 b/info.exult.exult/data/blackgate/gamedat/u7ireg47 new file mode 100644 index 0000000..8857c02 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg47 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg48 b/info.exult.exult/data/blackgate/gamedat/u7ireg48 new file mode 100644 index 0000000..a78e04f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg48 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg49 b/info.exult.exult/data/blackgate/gamedat/u7ireg49 new file mode 100644 index 0000000..bc22c24 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg49 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg4a b/info.exult.exult/data/blackgate/gamedat/u7ireg4a new file mode 100644 index 0000000..cf79bf4 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg4a differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg4b b/info.exult.exult/data/blackgate/gamedat/u7ireg4b new file mode 100644 index 0000000..38e2930 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg4b differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg4c b/info.exult.exult/data/blackgate/gamedat/u7ireg4c new file mode 100644 index 0000000..677e0db Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg4c differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg4d b/info.exult.exult/data/blackgate/gamedat/u7ireg4d new file mode 100644 index 0000000..b876804 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg4d differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg4e b/info.exult.exult/data/blackgate/gamedat/u7ireg4e new file mode 100644 index 0000000..e2bc8fd Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg4e differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg4f b/info.exult.exult/data/blackgate/gamedat/u7ireg4f new file mode 100644 index 0000000..cf68ed5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg4f differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg50 b/info.exult.exult/data/blackgate/gamedat/u7ireg50 new file mode 100644 index 0000000..fe60ae6 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg50 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg51 b/info.exult.exult/data/blackgate/gamedat/u7ireg51 new file mode 100644 index 0000000..e4b99da Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg51 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg52 b/info.exult.exult/data/blackgate/gamedat/u7ireg52 new file mode 100644 index 0000000..aa950ca Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg52 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg53 b/info.exult.exult/data/blackgate/gamedat/u7ireg53 new file mode 100644 index 0000000..364a8aa Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg53 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg54 b/info.exult.exult/data/blackgate/gamedat/u7ireg54 new file mode 100644 index 0000000..0861643 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg54 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg55 b/info.exult.exult/data/blackgate/gamedat/u7ireg55 new file mode 100644 index 0000000..5e1fd62 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg55 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg56 b/info.exult.exult/data/blackgate/gamedat/u7ireg56 new file mode 100644 index 0000000..34aee87 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg56 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg57 b/info.exult.exult/data/blackgate/gamedat/u7ireg57 new file mode 100644 index 0000000..167cbd3 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg57 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg58 b/info.exult.exult/data/blackgate/gamedat/u7ireg58 new file mode 100644 index 0000000..87b0746 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg58 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg59 b/info.exult.exult/data/blackgate/gamedat/u7ireg59 new file mode 100644 index 0000000..1d33d61 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg59 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg5a b/info.exult.exult/data/blackgate/gamedat/u7ireg5a new file mode 100644 index 0000000..6af03fa Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg5a differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg5b b/info.exult.exult/data/blackgate/gamedat/u7ireg5b new file mode 100644 index 0000000..477d68a Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg5b differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg5c b/info.exult.exult/data/blackgate/gamedat/u7ireg5c new file mode 100644 index 0000000..d9afabf Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg5c differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg5d b/info.exult.exult/data/blackgate/gamedat/u7ireg5d new file mode 100644 index 0000000..b4ac17b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg5d differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg5e b/info.exult.exult/data/blackgate/gamedat/u7ireg5e new file mode 100644 index 0000000..c740dde Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg5e differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg5f b/info.exult.exult/data/blackgate/gamedat/u7ireg5f new file mode 100644 index 0000000..1ebff2f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg5f differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg60 b/info.exult.exult/data/blackgate/gamedat/u7ireg60 new file mode 100644 index 0000000..34f0bf7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg60 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg61 b/info.exult.exult/data/blackgate/gamedat/u7ireg61 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg61 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg62 b/info.exult.exult/data/blackgate/gamedat/u7ireg62 new file mode 100644 index 0000000..77971f5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg62 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg63 b/info.exult.exult/data/blackgate/gamedat/u7ireg63 new file mode 100644 index 0000000..003e2b2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg63 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg64 b/info.exult.exult/data/blackgate/gamedat/u7ireg64 new file mode 100644 index 0000000..3f0a4f5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg64 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg65 b/info.exult.exult/data/blackgate/gamedat/u7ireg65 new file mode 100644 index 0000000..0412b9d Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg65 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg66 b/info.exult.exult/data/blackgate/gamedat/u7ireg66 new file mode 100644 index 0000000..4fbbe7b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg66 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg67 b/info.exult.exult/data/blackgate/gamedat/u7ireg67 new file mode 100644 index 0000000..976bb0f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg67 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg68 b/info.exult.exult/data/blackgate/gamedat/u7ireg68 new file mode 100644 index 0000000..8d30f65 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg68 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg69 b/info.exult.exult/data/blackgate/gamedat/u7ireg69 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg69 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg6a b/info.exult.exult/data/blackgate/gamedat/u7ireg6a new file mode 100644 index 0000000..5108539 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg6a differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg6b b/info.exult.exult/data/blackgate/gamedat/u7ireg6b new file mode 100644 index 0000000..0396af1 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg6b differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg6c b/info.exult.exult/data/blackgate/gamedat/u7ireg6c new file mode 100644 index 0000000..ef72c55 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg6c differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg6d b/info.exult.exult/data/blackgate/gamedat/u7ireg6d new file mode 100644 index 0000000..32b606e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg6d differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg6e b/info.exult.exult/data/blackgate/gamedat/u7ireg6e new file mode 100644 index 0000000..d4adb38 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg6e differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg6f b/info.exult.exult/data/blackgate/gamedat/u7ireg6f new file mode 100644 index 0000000..98ee942 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg6f differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg70 b/info.exult.exult/data/blackgate/gamedat/u7ireg70 new file mode 100644 index 0000000..cfbeddb Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg70 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg71 b/info.exult.exult/data/blackgate/gamedat/u7ireg71 new file mode 100644 index 0000000..1ed91b0 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg71 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg72 b/info.exult.exult/data/blackgate/gamedat/u7ireg72 new file mode 100644 index 0000000..f58d2f3 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg72 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg73 b/info.exult.exult/data/blackgate/gamedat/u7ireg73 new file mode 100644 index 0000000..d6712b1 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg73 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg74 b/info.exult.exult/data/blackgate/gamedat/u7ireg74 new file mode 100644 index 0000000..91062fe Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg74 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg75 b/info.exult.exult/data/blackgate/gamedat/u7ireg75 new file mode 100644 index 0000000..38b5f66 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg75 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg76 b/info.exult.exult/data/blackgate/gamedat/u7ireg76 new file mode 100644 index 0000000..19f8b44 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg76 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg77 b/info.exult.exult/data/blackgate/gamedat/u7ireg77 new file mode 100644 index 0000000..7e7d798 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg77 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg78 b/info.exult.exult/data/blackgate/gamedat/u7ireg78 new file mode 100644 index 0000000..efeab70 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg78 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg79 b/info.exult.exult/data/blackgate/gamedat/u7ireg79 new file mode 100644 index 0000000..42c4ffd Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg79 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg7a b/info.exult.exult/data/blackgate/gamedat/u7ireg7a new file mode 100644 index 0000000..a5872e5 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg7a differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg7b b/info.exult.exult/data/blackgate/gamedat/u7ireg7b new file mode 100644 index 0000000..3c4a42e Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg7b differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg7c b/info.exult.exult/data/blackgate/gamedat/u7ireg7c new file mode 100644 index 0000000..3b09b3b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg7c differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg7d b/info.exult.exult/data/blackgate/gamedat/u7ireg7d new file mode 100644 index 0000000..113248b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg7d differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg7e b/info.exult.exult/data/blackgate/gamedat/u7ireg7e new file mode 100644 index 0000000..7d18f5f Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg7e differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg7f b/info.exult.exult/data/blackgate/gamedat/u7ireg7f new file mode 100644 index 0000000..e420455 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg7f differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg80 b/info.exult.exult/data/blackgate/gamedat/u7ireg80 new file mode 100644 index 0000000..94ec39b Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg80 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg81 b/info.exult.exult/data/blackgate/gamedat/u7ireg81 new file mode 100644 index 0000000..3932e93 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg81 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg82 b/info.exult.exult/data/blackgate/gamedat/u7ireg82 new file mode 100644 index 0000000..9987e61 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg82 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg83 b/info.exult.exult/data/blackgate/gamedat/u7ireg83 new file mode 100644 index 0000000..953f2a7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg83 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg84 b/info.exult.exult/data/blackgate/gamedat/u7ireg84 new file mode 100644 index 0000000..e932a26 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg84 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg85 b/info.exult.exult/data/blackgate/gamedat/u7ireg85 new file mode 100644 index 0000000..0649507 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg85 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg86 b/info.exult.exult/data/blackgate/gamedat/u7ireg86 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg86 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg87 b/info.exult.exult/data/blackgate/gamedat/u7ireg87 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg87 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg88 b/info.exult.exult/data/blackgate/gamedat/u7ireg88 new file mode 100644 index 0000000..39e1ad7 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg88 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg89 b/info.exult.exult/data/blackgate/gamedat/u7ireg89 new file mode 100644 index 0000000..64ef27c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg89 differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg8a b/info.exult.exult/data/blackgate/gamedat/u7ireg8a new file mode 100644 index 0000000..53fb6d0 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg8a differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg8b b/info.exult.exult/data/blackgate/gamedat/u7ireg8b new file mode 100644 index 0000000..8af33f2 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg8b differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg8c b/info.exult.exult/data/blackgate/gamedat/u7ireg8c new file mode 100644 index 0000000..a2425ea Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg8c differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg8d b/info.exult.exult/data/blackgate/gamedat/u7ireg8d new file mode 100644 index 0000000..b651f9c Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg8d differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg8e b/info.exult.exult/data/blackgate/gamedat/u7ireg8e new file mode 100644 index 0000000..a66d7e8 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg8e differ diff --git a/info.exult.exult/data/blackgate/gamedat/u7ireg8f b/info.exult.exult/data/blackgate/gamedat/u7ireg8f new file mode 100644 index 0000000..e76fa50 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/u7ireg8f differ diff --git a/info.exult.exult/data/blackgate/gamedat/usecode.dat b/info.exult.exult/data/blackgate/gamedat/usecode.dat new file mode 100644 index 0000000..7521000 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/usecode.dat differ diff --git a/info.exult.exult/data/blackgate/gamedat/usecode.var b/info.exult.exult/data/blackgate/gamedat/usecode.var new file mode 100644 index 0000000..94ed689 Binary files /dev/null and b/info.exult.exult/data/blackgate/gamedat/usecode.var differ diff --git a/info.exult.exult/data/blackgate/goggame-1207662623.hashdb b/info.exult.exult/data/blackgate/goggame-1207662623.hashdb new file mode 100644 index 0000000..69e7424 Binary files /dev/null and b/info.exult.exult/data/blackgate/goggame-1207662623.hashdb differ diff --git a/info.exult.exult/data/blackgate/goggame-1207662623.info b/info.exult.exult/data/blackgate/goggame-1207662623.info new file mode 100644 index 0000000..7168ef1 --- /dev/null +++ b/info.exult.exult/data/blackgate/goggame-1207662623.info @@ -0,0 +1,76 @@ +{ + "buildId": "51402764892134586", + "clientId": "49552650753938435", + "gameId": "1207662623", + "language": "English", + "languages": [ + "en-US" + ], + "name": "Ultima VII - The Black Gate", + "playTasks": [ + { + "arguments": "-conf \"..\\dosboxULTIMA7.conf\" -conf \"..\\dosboxULTIMA7_single.conf\" -noconsole -c \"exit\"", + "category": "game", + "isPrimary": true, + "languages": [ + "*" + ], + "name": "Ultima VII - The Black Gate", + "path": "DOSBOX\\dosbox.exe", + "type": "FileTask", + "workingDir": "DOSBOX" + }, + { + "arguments": "1207662623", + "category": "tool", + "languages": [ + "*" + ], + "name": "Graphic Mode Setup", + "path": "DOSBOX\\GOGDOSConfig.exe", + "type": "FileTask", + "workingDir": "DOSBOX" + }, + { + "arguments": "-conf \"..\\dosboxULTIMA7.conf\" -conf \"..\\dosboxULTIMA7_settings.conf\" -noconsole -c \"exit\"", + "category": "tool", + "icon": "DOSBOX\\dosbox.exe", + "languages": [ + "*" + ], + "name": "Settings", + "path": "DOSBOX\\dosbox.exe", + "type": "FileTask", + "workingDir": "DOSBOX" + }, + { + "category": "document", + "languages": [ + "*" + ], + "link": "http://www.gog.com/support/ultima_7_complete", + "name": "Support", + "type": "URLTask" + }, + { + "category": "document", + "languages": [ + "*" + ], + "name": "Manual", + "path": "Manual.pdf", + "type": "FileTask" + }, + { + "category": "document", + "languages": [ + "*" + ], + "name": "The Answers", + "path": "answers.pdf", + "type": "FileTask" + } + ], + "rootGameId": "1207662623", + "version": 1 +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/goggame-1207662623.script b/info.exult.exult/data/blackgate/goggame-1207662623.script new file mode 100644 index 0000000..83d7bc8 --- /dev/null +++ b/info.exult.exult/data/blackgate/goggame-1207662623.script @@ -0,0 +1,37 @@ +{ + "actions": [ + { + "install": { + "action": "setRegistry", + "arguments": { + "root": "HKEY_LOCAL_MACHINE", + "subkey": "Software\\GOG.com\\Games\\{productID}", + "valueData": "{app}\\DOSBox", + "valueName": "DOSBOXFOLDER", + "valueType": "String" + } + }, + "languages": [ + "*" + ], + "name": "DOSBoxConfigLegacy1" + }, + { + "install": { + "action": "setRegistry", + "arguments": { + "root": "HKEY_LOCAL_MACHINE", + "subkey": "Software\\GOG.com\\Games\\{productID}", + "valueData": "dosboxULTIMA7", + "valueName": "DOSBOXCONF", + "valueType": "String" + } + }, + "languages": [ + "*" + ], + "name": "DOSBoxConfigLegacy2" + } + ], + "productId": "1207662623" +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/manual.pdf b/info.exult.exult/data/blackgate/manual.pdf new file mode 100644 index 0000000..bbf6eda Binary files /dev/null and b/info.exult.exult/data/blackgate/manual.pdf differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2.cfg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2.cfg new file mode 100644 index 0000000..d5259fb --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2.cfg @@ -0,0 +1,15 @@ + + + Ultima 6 v1.2 + + + 1.10.0 + + + __MOD_PATH__/patch + + + __MOD_PATH__/saves + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/U7IFIX3f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/U7IFIX3f new file mode 100644 index 0000000..1894e1e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/U7IFIX3f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/armor.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/armor.dat new file mode 100644 index 0000000..819a24a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/armor.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/avatar_data.txt b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/avatar_data.txt new file mode 100644 index 0000000..9275c05 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/avatar_data.txt @@ -0,0 +1,58 @@ +# New avatars +# +# December 17, 2006 +# + +%%section version +:2 +%%endsection + +%%section defaultshape +# Setting new blonde avatars as default shapes +:0/721/297/5 +:1/989/297/4 +%%endsection + +%%section baseracesex +# Setting the blonde avatars as default +:0/0 +%%endsection + +%%section multiracial_table +# :skin/sex/shapenum/nakedshape/facenum/faceframe/alterface/alterframe/copydata +#skin = 0-based skin number +#sex = 1 for female, 0 for male +#shapenum and nakedshape can be either a shape # or a reference to an imported +#shape (either in the form of a shape number or on the form %num, as explained +#in the multiracial_imports section. +#facenum is the face shape from faces.vga to use +#faceframe is the frame of the face to use +#alterface and alterframe indicate the face/frame to use when flag 33 is set +#copydata is optional, and can be 0 or 1. If 1, Exult will copy the shape data +#from the default avatar shapes; if 0, Exult will use the data already available +#for the shape. + +# Blonde avatars +:0/0/1028/1034/0/0/297/5/1 +:0/1/1029/1035/0/1/297/4/1 + +# Raven haired avatars +:1/0/1036/1042/0/2/297/3/1 +:1/1/1037/1043/0/3/297/2/1 + +# Brunette avatars +:2/0/1036/1044/0/4/297/1/1 +:2/1/1037/1045/0/5/297/0/1 + +# Redhead avatars +:3/0/1036/1046/0/6/297/9/1 +:3/1/1037/1047/0/7/297/8/1 + +# Black avatars +:5/0/1024/1030/0/8/297/11/1 + +# Buckethead +:6/0/1036/1034/0/9/297/12/0 +:6/1/1037/1035/0/10/297/12/1 + +%%endsection diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/bodies.txt b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/bodies.txt new file mode 100644 index 0000000..12a51bd --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/bodies.txt @@ -0,0 +1,41 @@ +# Exult 1.9.0git text message file. Written by ExultStudio. +%%section version +:2 +%%endsection +%%section bodyshapes +:1140/1 +:1175/1 +:1196/1 +:1198/1 +:1199/1 +%%endsection +%%section bodylist +:259/400/20 +:884/400/18 +:929/1140/18 +:1024/0/1 +:1043/1098/17 +:1107/1140/0 +:1122/1099/2 +:1148/1140/1 +:1149/1140/15 +:1155/1140/3 +:1156/1140/5 +:1157/1140/4 +:1158/1140/6 +:1159/1140/2 +:1167/1140/7 +:1174/1175/0 +:1176/892/17 +:1184/1140/8 +:1193/1199/0 +:1194/1196/0 +:1197/1198/0 +:1202/1140/16 +:1226/762/18 +:1243/1140/12 +:1244/1140/13 +:1248/1140/13 +:1249/1140/14 +:1254/1140/17 +%%endsection diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/combos.flx b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/combos.flx new file mode 100644 index 0000000..b955459 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/combos.flx differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/container.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/container.dat new file mode 100644 index 0000000..a5e84ae Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/container.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/equip.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/equip.dat new file mode 100644 index 0000000..e215138 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/equip.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/faces.vga b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/faces.vga new file mode 100644 index 0000000..a02dbba Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/faces.vga differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/gumps.vga b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/gumps.vga new file mode 100644 index 0000000..8a9f552 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/gumps.vga differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/initgame.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/initgame.dat new file mode 100644 index 0000000..5575b41 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/initgame.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/jmsfx.flx b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/jmsfx.flx new file mode 100644 index 0000000..2207ddb Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/jmsfx.flx differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/mainshp.flx b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/mainshp.flx new file mode 100644 index 0000000..856b5fc Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/mainshp.flx differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix00 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix00 new file mode 100644 index 0000000..5f8516a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix00 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix01 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix01 new file mode 100644 index 0000000..b886a8f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix01 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix02 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix02 new file mode 100644 index 0000000..a8537d3 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix02 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix03 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix03 new file mode 100644 index 0000000..1e78985 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix03 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix04 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix04 new file mode 100644 index 0000000..3fce325 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix04 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix05 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix05 new file mode 100644 index 0000000..659d2c5 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix05 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix06 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix06 new file mode 100644 index 0000000..2ec94ac Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix06 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0b new file mode 100644 index 0000000..e0561ec Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0c new file mode 100644 index 0000000..cc4c27f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0d new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0e new file mode 100644 index 0000000..784c459 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0f new file mode 100644 index 0000000..8892018 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix0f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix10 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix10 new file mode 100644 index 0000000..750bcb5 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix10 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix11 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix11 new file mode 100644 index 0000000..1d9bfe9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix11 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix12 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix12 new file mode 100644 index 0000000..3decffd Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix12 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix13 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix13 new file mode 100644 index 0000000..87744d2 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix13 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix14 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix14 new file mode 100644 index 0000000..27c2588 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix14 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix15 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix15 new file mode 100644 index 0000000..156043c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix15 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix16 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix16 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix16 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix18 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix18 new file mode 100644 index 0000000..9533905 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix18 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1a new file mode 100644 index 0000000..d7ee875 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1b new file mode 100644 index 0000000..26800ec Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1c new file mode 100644 index 0000000..41cc9ed Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1d new file mode 100644 index 0000000..7556969 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1e new file mode 100644 index 0000000..36aba8d Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1f new file mode 100644 index 0000000..71207d6 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix1f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix20 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix20 new file mode 100644 index 0000000..7be8f73 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix20 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix21 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix21 new file mode 100644 index 0000000..6d6f84f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix21 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix22 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix22 new file mode 100644 index 0000000..8376d59 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix22 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix23 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix23 new file mode 100644 index 0000000..c98d816 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix23 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix26 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix26 new file mode 100644 index 0000000..acbd619 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix26 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix27 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix27 new file mode 100644 index 0000000..07e13c1 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix27 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix28 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix28 new file mode 100644 index 0000000..d886b3a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix28 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix29 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix29 new file mode 100644 index 0000000..adb48eb Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix29 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2a new file mode 100644 index 0000000..fe15f23 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2b new file mode 100644 index 0000000..92dc41e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2c new file mode 100644 index 0000000..4bceb37 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2d new file mode 100644 index 0000000..12ff533 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2e new file mode 100644 index 0000000..78a9126 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix2e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix30 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix30 new file mode 100644 index 0000000..c0c579f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix30 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix31 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix31 new file mode 100644 index 0000000..ff7133d Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix31 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix33 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix33 new file mode 100644 index 0000000..3670a73 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix33 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix34 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix34 new file mode 100644 index 0000000..12613a1 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix34 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix35 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix35 new file mode 100644 index 0000000..23035e2 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix35 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix36 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix36 new file mode 100644 index 0000000..e4186f6 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix36 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix37 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix37 new file mode 100644 index 0000000..2449dac Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix37 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix38 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix38 new file mode 100644 index 0000000..6160d9b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix38 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix39 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix39 new file mode 100644 index 0000000..9df4e0d Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix39 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3a new file mode 100644 index 0000000..f4707bc Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3b new file mode 100644 index 0000000..b949974 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3c new file mode 100644 index 0000000..d86ba11 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3d new file mode 100644 index 0000000..b694ecc Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3f new file mode 100644 index 0000000..2543508 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix3f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix40 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix40 new file mode 100644 index 0000000..be3ef45 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix40 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix41 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix41 new file mode 100644 index 0000000..1ed1296 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix41 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix42 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix42 new file mode 100644 index 0000000..55f3c6e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix42 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix43 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix43 new file mode 100644 index 0000000..756333c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix43 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix44 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix44 new file mode 100644 index 0000000..91cae35 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix44 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix45 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix45 new file mode 100644 index 0000000..ebc06c3 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix45 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix46 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix46 new file mode 100644 index 0000000..e0b9bdd Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix46 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix47 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix47 new file mode 100644 index 0000000..c991238 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix47 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix48 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix48 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix48 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix49 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix49 new file mode 100644 index 0000000..9dbc3b5 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix49 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4a new file mode 100644 index 0000000..3c39f5e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4b new file mode 100644 index 0000000..0804c19 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4c new file mode 100644 index 0000000..52d318b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4d new file mode 100644 index 0000000..3017fde Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4e new file mode 100644 index 0000000..6d8a7eb Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4f new file mode 100644 index 0000000..7182d2b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix4f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix50 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix50 new file mode 100644 index 0000000..7a9d12c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix50 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix51 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix51 new file mode 100644 index 0000000..b4b8691 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix51 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix52 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix52 new file mode 100644 index 0000000..a2dde99 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix52 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix55 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix55 new file mode 100644 index 0000000..c06ec07 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix55 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix56 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix56 new file mode 100644 index 0000000..489ca6e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix56 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix58 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix58 new file mode 100644 index 0000000..8dd6f35 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix58 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix59 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix59 new file mode 100644 index 0000000..cedb27d Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix59 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5a new file mode 100644 index 0000000..039a662 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5b new file mode 100644 index 0000000..fc1b490 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5c new file mode 100644 index 0000000..f432e90 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5d new file mode 100644 index 0000000..5a5334d Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5e new file mode 100644 index 0000000..a6c9117 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5f new file mode 100644 index 0000000..1887d75 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix5f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix61 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix61 new file mode 100644 index 0000000..f6b8df1 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix61 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix62 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix62 new file mode 100644 index 0000000..79ff9ad Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix62 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix63 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix63 new file mode 100644 index 0000000..264a889 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix63 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix64 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix64 new file mode 100644 index 0000000..12415af Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix64 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix65 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix65 new file mode 100644 index 0000000..4b10d4c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix65 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix66 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix66 new file mode 100644 index 0000000..0689217 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix66 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix67 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix67 new file mode 100644 index 0000000..8c653b1 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix67 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix68 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix68 new file mode 100644 index 0000000..489ee26 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix68 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix69 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix69 new file mode 100644 index 0000000..120d76f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix69 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6a new file mode 100644 index 0000000..8a56fb0 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6b new file mode 100644 index 0000000..7c36698 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6c new file mode 100644 index 0000000..49a242d Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6d new file mode 100644 index 0000000..37a20e5 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6e new file mode 100644 index 0000000..18cf075 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6f new file mode 100644 index 0000000..334ac88 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix6f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix70 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix70 new file mode 100644 index 0000000..5aabc3a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix70 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix71 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix71 new file mode 100644 index 0000000..9d33085 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix71 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix72 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix72 new file mode 100644 index 0000000..b371821 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix72 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix73 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix73 new file mode 100644 index 0000000..379d464 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix73 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix74 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix74 new file mode 100644 index 0000000..cde4d7c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix74 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix75 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix75 new file mode 100644 index 0000000..3c885e1 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix75 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix76 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix76 new file mode 100644 index 0000000..cf282dc Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix76 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix77 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix77 new file mode 100644 index 0000000..fc1f414 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix77 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix78 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix78 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix78 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix79 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix79 new file mode 100644 index 0000000..2305522 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix79 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7a new file mode 100644 index 0000000..b68c5fd Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7b new file mode 100644 index 0000000..c0f75ee Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7c new file mode 100644 index 0000000..9cf71ae Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7d new file mode 100644 index 0000000..3e417be Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7e new file mode 100644 index 0000000..3641a48 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7f new file mode 100644 index 0000000..f73932b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix7f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix80 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix80 new file mode 100644 index 0000000..de457bb Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix80 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix81 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix81 new file mode 100644 index 0000000..9ae4ae9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix81 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix82 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix82 new file mode 100644 index 0000000..5d5b57a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix82 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix83 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix83 new file mode 100644 index 0000000..1d9e46c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix83 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix84 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix84 new file mode 100644 index 0000000..b1c2078 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix84 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix85 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix85 new file mode 100644 index 0000000..8202971 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix85 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix86 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix86 new file mode 100644 index 0000000..bb091f6 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix86 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix87 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix87 new file mode 100644 index 0000000..e7bac2c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix87 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix88 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix88 new file mode 100644 index 0000000..8f06fe4 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix88 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix89 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix89 new file mode 100644 index 0000000..a8d1b34 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix89 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8c new file mode 100644 index 0000000..17c757d Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8d new file mode 100644 index 0000000..ceb664a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8e new file mode 100644 index 0000000..869abd9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8f new file mode 100644 index 0000000..be5e9b0 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7ifix8f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7map b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7map new file mode 100644 index 0000000..5e0b775 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map01/u7map differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix00 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix00 new file mode 100644 index 0000000..b685201 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix00 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix01 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix01 new file mode 100644 index 0000000..b7b9fdd Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix01 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix02 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix02 new file mode 100644 index 0000000..441c1fb Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix02 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix03 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix03 new file mode 100644 index 0000000..754eca2 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix03 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix04 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix04 new file mode 100644 index 0000000..b576f96 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix04 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix05 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix05 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix05 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix06 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix06 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix06 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix07 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix07 new file mode 100644 index 0000000..8120e31 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix07 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix08 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix08 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix08 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix09 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix09 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix09 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0a new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0b new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0c new file mode 100644 index 0000000..d23b288 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0d new file mode 100644 index 0000000..468e226 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0e new file mode 100644 index 0000000..1bf9a1f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0f new file mode 100644 index 0000000..268f332 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix0f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix10 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix10 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix10 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix11 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix11 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix11 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix12 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix12 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix12 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix13 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix13 new file mode 100644 index 0000000..a1176c8 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix13 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix14 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix14 new file mode 100644 index 0000000..4a956fc Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix14 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix15 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix15 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix15 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix16 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix16 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix16 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix17 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix17 new file mode 100644 index 0000000..79d9c14 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix17 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix18 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix18 new file mode 100644 index 0000000..371aa46 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix18 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix19 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix19 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix19 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1a new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1b new file mode 100644 index 0000000..d2698e0 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1c new file mode 100644 index 0000000..268f332 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1d new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1e new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1f new file mode 100644 index 0000000..ec875c9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix1f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix20 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix20 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix20 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix21 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix21 new file mode 100644 index 0000000..20c4078 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix21 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix22 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix22 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix22 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix23 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix23 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix23 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix24 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix24 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix24 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix25 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix25 new file mode 100644 index 0000000..8f1efa7 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix25 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix26 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix26 new file mode 100644 index 0000000..34e3712 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix26 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix27 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix27 new file mode 100644 index 0000000..a4807dc Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix27 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix28 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix28 new file mode 100644 index 0000000..887af16 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix28 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix29 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix29 new file mode 100644 index 0000000..268f332 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix29 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2a new file mode 100644 index 0000000..268f332 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2b new file mode 100644 index 0000000..7530591 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2c new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2d new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2e new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2f new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix2f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix30 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix30 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix30 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix31 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix31 new file mode 100644 index 0000000..80d46ac Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix31 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix32 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix32 new file mode 100644 index 0000000..37b24c9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix32 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix33 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix33 new file mode 100644 index 0000000..f204712 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix33 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix34 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix34 new file mode 100644 index 0000000..0e02e26 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix34 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix35 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix35 new file mode 100644 index 0000000..268f332 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix35 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix36 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix36 new file mode 100644 index 0000000..268f332 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix36 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix37 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix37 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix37 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix38 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix38 new file mode 100644 index 0000000..d20f005 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix38 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix39 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix39 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix39 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3a new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3b new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3c new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3d new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3e new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3f new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix3f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix40 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix40 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix40 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix41 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix41 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix41 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix42 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix42 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix42 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix43 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix43 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix43 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix44 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix44 new file mode 100644 index 0000000..15213b7 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix44 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix45 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix45 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix45 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix46 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix46 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix46 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix47 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix47 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix47 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix48 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix48 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix48 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix49 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix49 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix49 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4a new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4b new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4c new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4d new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4e new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4f new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix4f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix50 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix50 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix50 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix51 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix51 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix51 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix52 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix52 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix52 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix53 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix53 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix53 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix54 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix54 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix54 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix55 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix55 new file mode 100644 index 0000000..18cb364 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix55 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix56 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix56 new file mode 100644 index 0000000..cc8de06 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix56 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix57 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix57 new file mode 100644 index 0000000..2ed8772 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix57 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix58 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix58 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix58 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix59 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix59 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix59 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5a new file mode 100644 index 0000000..090aff2 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5b new file mode 100644 index 0000000..d130584 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5c new file mode 100644 index 0000000..c4ee448 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5d new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5e new file mode 100644 index 0000000..268f332 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5f new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix5f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix60 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix60 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix60 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix61 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix61 new file mode 100644 index 0000000..e047abb Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix61 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix62 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix62 new file mode 100644 index 0000000..a1a5047 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix62 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix63 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix63 new file mode 100644 index 0000000..b2d19da Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix63 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix64 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix64 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix64 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix65 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix65 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix65 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix66 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix66 new file mode 100644 index 0000000..9b16809 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix66 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix67 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix67 new file mode 100644 index 0000000..efdc193 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix67 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix68 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix68 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix68 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix69 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix69 new file mode 100644 index 0000000..b06879b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix69 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6a new file mode 100644 index 0000000..a1f218d Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6b new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6c new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6d new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6e new file mode 100644 index 0000000..444b12e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6f new file mode 100644 index 0000000..f0c4572 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix6f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix70 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix70 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix70 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix71 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix71 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix71 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix72 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix72 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix72 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix73 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix73 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix73 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix74 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix74 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix74 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix75 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix75 new file mode 100644 index 0000000..2b80247 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix75 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix76 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix76 new file mode 100644 index 0000000..b349e05 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix76 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix77 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix77 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix77 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix78 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix78 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix78 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix79 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix79 new file mode 100644 index 0000000..04e5540 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix79 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7a new file mode 100644 index 0000000..5bba034 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7b new file mode 100644 index 0000000..2ef00f0 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7c new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7d new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7e new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7f new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix7f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix80 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix80 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix80 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix81 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix81 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix81 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix82 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix82 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix82 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix83 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix83 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix83 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix84 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix84 new file mode 100644 index 0000000..021b96f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix84 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix85 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix85 new file mode 100644 index 0000000..9b76dc8 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix85 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix86 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix86 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix86 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix87 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix87 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix87 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix88 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix88 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix88 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix89 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix89 new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix89 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8a new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8b new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8c new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8d new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8e new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8f new file mode 100644 index 0000000..d102859 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7ifix8f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7map b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7map new file mode 100644 index 0000000..1c353a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map02/u7map differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix0d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix0d new file mode 100644 index 0000000..14fad51 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix0d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix0f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix0f new file mode 100644 index 0000000..fed794a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix0f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix10 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix10 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix10 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix11 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix11 new file mode 100644 index 0000000..e1eaad5 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix11 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix12 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix12 new file mode 100644 index 0000000..f8bda6e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix12 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix29 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix29 new file mode 100644 index 0000000..027b723 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix29 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix34 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix34 new file mode 100644 index 0000000..916aa0a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix34 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix35 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix35 new file mode 100644 index 0000000..fbea2e3 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix35 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix36 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix36 new file mode 100644 index 0000000..8d331d0 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix36 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix37 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix37 new file mode 100644 index 0000000..47a1fa6 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix37 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix40 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix40 new file mode 100644 index 0000000..61eae95 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix40 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix41 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix41 new file mode 100644 index 0000000..507bb6e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix41 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix42 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix42 new file mode 100644 index 0000000..cd922e8 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix42 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix43 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix43 new file mode 100644 index 0000000..9660799 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix43 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix4d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix4d new file mode 100644 index 0000000..e947bff Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix4d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix4e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix4e new file mode 100644 index 0000000..a28f70d Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix4e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix4f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix4f new file mode 100644 index 0000000..6cdccce Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix4f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix50 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix50 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix50 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix59 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix59 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix59 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix5a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix5a new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix5a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix5b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix5b new file mode 100644 index 0000000..25495bc Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix5b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix5e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix5e new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix5e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix69 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix69 new file mode 100644 index 0000000..d70edfe Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix69 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix6a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix6a new file mode 100644 index 0000000..6b994f7 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix6a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix6b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix6b new file mode 100644 index 0000000..8dbc8a3 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix6b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix6d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix6d new file mode 100644 index 0000000..af83a61 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix6d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix75 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix75 new file mode 100644 index 0000000..59ab84b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix75 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix76 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix76 new file mode 100644 index 0000000..52f9c96 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix76 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix77 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix77 new file mode 100644 index 0000000..8d44014 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix77 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix79 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix79 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7ifix79 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7map b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7map new file mode 100644 index 0000000..31744df --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/map03/u7map @@ -0,0 +1,941 @@ +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿëÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿë\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëëëëëëëëëëëëëëëÿÿÿÿÿ¤¤¤ÿÿÿÿÿëÿëÿÿÿÿÿ¤¤¤ÿÿÿÿÿÿÿëÿÿÿÿ뤤¤ÿÿÿÿÿÿÿëÿÿÿÿ뤤¤ÿÿÿÿÿÿÿëÿÿÿÿÿÿ­ÿÿÿÿÿÿÿÿëÿÿÿÿÿÿ­ÿÿÿÿÿÿÿÿëÿÿÿÿÿÿ­ÿÿÿÿÿÿÿÿëÿÿÿÿÿÿ­ÿÿÿÿÿÿÿÿëÿÿÿÿÿÿ¤ÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿëëÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÕÎÍÎØÿÿÿÿÿÿ\ÿÿÿÿÑþêÿÿÿÿÿÿ\ÿÿÿÿÑÿýü¶ÿÿÿÿÿÿ\ÿÿÿÿRÖÈÕæÿÿÿÿÿÿ\ÿÿÿÿÿÿªÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿ¬ÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿ«ÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿ¬ÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿ»ÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\ëë\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿë\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëëëëëëëëëëëëëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿ¤\ ˆ \ ¤\ ˆ \ ¤\ ˆ \ ¤ÿëÿ` ÿ` ÿ` ÿ` ÿ` ÿ` ÿ` ÿëÿŠ \ ¤\ ¢ \ ¤\ ¢ \ ¤\ ‹ ÿëÿ` ÿ` ÿ` ÿ` ÿ` ÿ` ÿ` ÿëÿ¤\ ¢ \ ¤\ ¢ \ ¤\ ¢ \ ¤ÿëÿ` ÿ` ÿ` ÿ` ÿ` ÿ` ÿ` ÿëÿŠ \ ¤\ ¢ \ ¤\ ¢ \ ¤\ ‹ ÿëÿ` ÿ` ÿ` ÿ` ÿ` ÿ` ÿ` ÿëÿ­\ ¢ \ ¤\ ¢ \ ¤\ ¢ \ ¤ÿëÿ` ÿ` ÿ` Q +` ÿ` ÿ` ÿ` ÿëÿŠ \ ¤\ ¢ ­¤\ ¢ \ ¤\ ‹ ÿëÿ` ÿ` ÿ` Q +` ÿ` ÿ` ÿ` ÿëÿ­\ ‰ \ ¤\ ‰ \ ¤\ ‰ \ ¤ÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëëëëëëëëëëëëëëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿ¤¤¤ÿÿÿÿëÿÿÿÿÿÿÿÿ¤¤¤ÿÿÿÿëÿÿÿÿÿÿÿÿ¤¤¤ÿÿÿÿëÿÿÿÿÿÿÿÿ¤¤¤ÿÿÿÿëÿÿÿÿÿÿÿÿÿH ÿÿÿ} ÿëÿÿÿÿÿÿÿÿÿH ÿÿÿH ÿëÿÿÿÿÿÿÿÿÿX D D D ‡ ÿëÿÿÿÿÿÿÿÿÿÿÿÿÿH ÿëÿÿÿÿÿÿÿÿÿÿÿÿÿw ÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë\\\\\\\\\\\\\\\ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +\\\\\\\\\\ëëëëëù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4ù +ÿÿÿÿÿÿÿÿÿÿÿÿÿ4ù +ÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿ24ù +ÿÿÿÿÿÿÿÿÿ4ÿ2ÿÿÿù +ÿÿÿÿÿÿÿÿb2ÿ4ÿÿ4ù +ÿÿÿÿ333ÿÿÿÿÿÿù +ÿÿ33ÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿ33ÿÿÿÿÿÿÿÿÿù +ÿÿÿÿb3ÿÿÿ3ÿÿÿëëëëëëëëëëëëëëëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2ÿÿÿÿÿÿÿÿÿÿÿÿÿ44444ÿÿÿÿÿÿÿÿÿÿÿ4424ÿÿÿÿÿÿÿÿÿÿÿÿ44ÿ44ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ44ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ33ÿ,ÿ3ÿÿÿÿÿÿÿµ ëëëëëëëëëëëëëëëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4\ÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4µ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1ë\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ44ÿÿÿ44ÿÿÿÿÿÿÿÿÿ4ÿÿÿ44ÿÿÿÿÿÿÿÿÿÿ44ÿÿÿ44ÿÿÿÿÿÿÿÿÿ44ÿÿÿÿ4ÿÿÿÿÿÿÿÿÿ2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2ÿÿ4ÿÿÿÿÿ444ÿÿÿÿ2ÿÿÿÿÿ,ÿ44ÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +\ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿoÿÿÿÿÿ33ÿrÿÿ\ÿÿÿcÿÿÿr331ÿÿÿÿ\ÿÿÿÿÿÿÿ1ÿ33ÿÿÿ\ÿÿÿÿÿÿÿÿ3ÿÿÿÿÿÿ\rrÿÿrÿÿÿÿÿÿÿÿÿÿ\ÿrÿÿÿÿÿÿÿÿÿÿÿÿ² \ÿÿcÿÿÿÿÿÿÿÿ² ÿÿÿ\ÿÿÿÿÿrÿÿÿÿÿÿÿÿÿ\ÿÿÿÿrÿÿ² ÿÿÿÿÿÿÿ\ÿÿÿrÿÿÿÿ² ÿÿÿÿÿÿù +ÿÿÿÿÿcÿÿÿÿÿÿÿÿÿù +ÿÿÿrÿÿcÿÿ² ÿÿÿÿÿù +ù +ù +3ù +ù +ù +ù +ù +ù +3ù +ù +ù +ù +ù +ÿÿ3ÿÿÿÿÿÿÿ3ÿÿÿÿ33ÿÿÿÿÿbbÿÿÿÿÿù +ÿÿÿÿÿbÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿ32bÿÿÿÿ× ù +ÿÿÿÿÿÿÿÿÿÿÿÿ× ì ù +ÿÿ² 3ÿ22ÿÿÿÿÿ× ì ù +ÿÿÿ223ÿ33ÿÿÿÚ ù +ÿÿÿÿÿ2ÿ3ÿÿÿÿØ ù +ÿÿÿÿÿÿÿ´ ÿ³ × â ì ù +ÿÿÿÿÿÿ³ 3¾ ÿÚ ù +ÿÿÿÿÿ³ ÿÿÿ3Ø ù +ÿÿÿÿ³ ÿ× × â á Ù ù +ÿÿÿÿ× á â ì ù +ÿ³ ÿ× ì ù +× â â ì ù +3ù +ù +ù +ù +33ù +ù +ù +ù +ù +ù +ù +3ù +3ÿÿÿ33ÿÿÿÿÿÿÿÿµ .ÿ,ÿÿ3ÿ,ÿ³ ÿ³ ÿÿÿÿù +,ÿ3ÿÿÿÿbÿ3ÿ/3ÿÿÕ ,ÿÿÿÿÿµ ÿÿÿÿ32ÿµ ê ÿÿÿ,ÿÿÿ× á â á Õ ÿbÿå 2ÿÿÿb2ÿØ ë Õ 2bç Þ â Õ × á â á ì ë á â ë ì µ rù +ù +ù +ù +ù +ù +ù +ù +ù +ù +2221rù +µ ÿÿÿÿÿÿÿÿÿÿÿÿ1ù +3µ ÿÿÿÿÿÿµ ÿÿÿÿÿÿù +ÿÿÿÿÿÿÿµ ÿµ ÿÿ4ÿÿ2ÿÿÿÿÿÿÿÿÿÿ4ÿ/2ÿ/ÿÿµ µ ,ÿÿÿÿÿÿÿ4ÿ2ù +ÿ2ÿµ µ 2ÿÿÿÿÿ2ÿ2ÿá Õ ÿÿ2ÿ4ÿÿ,ÿÿ1× á Õ ë Õ ÿµ µ ÿµ ÿÿ13ÿØ ë ë á Õ ,2/bqrbÿÚ ë â á ã × Õ ,ÿÿÉ Ý ì ë á â á ì 212,42,44/444444211,4ÿÿÿbrÿ4ÿ4ÿÿ4ÿÿÿÿ4ÿÿbÿ,ÿÿÿÿÿ,ÿÿrÿÿÿÿÿrÿ4444ÿ2bÿrÿ4ÿÿÿÿÿ4ÿÿ4r3ÿµ µ 3ÿÿ´ r,ÿÿ44442ÿÿÿÿÿ³ ÿÿ1ÿ444443ÿ3ÿÿÿÿ3rÿÿ4r4ÿrã µ ÿÿÿÿ,ÿÿrÿÿÿ4ÿÿÝ Õ ÿã ÿÿÿÿÿ44ÿrÿÿÿë ì ç é µ ÿÿ4ÿÿÿÿÿÿÿà ÿÿÿÿÿÿ1ÿÿÿÿå ,ÿ,ÿ421ÿÿ3ÿç é ÿµ ÿ11ÿÿÿ33Ý â Õ ÿ2ÿ,ÿÿÿ3ë Õ ÿ.bµ 3r3\\\\\\\\\\\\\\\\4ÿÿµ ÿrrÿÿÿÿÿÿÿÿÿ4ÿÿÿrrµ ÿÿÿÿÿÿÿÿÿ4ÿµ µ ÿµ µ rÿÿÿÿÿÿÿÿ4ÿÿÿµ ÿÿÿÿÿÿÿÿÿÿÿ4ÿrµ µ ÿÿÿÿÿÿÿÿÿÿÿ4ÿÿµ ÿÿÿÿÿÿÿÿÿÿÿÿ4rÿÿÿµ ÿÿÿÿÿÿÿÿÿÿ44ÿ/ÿµ ÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿµ ÿÿÿÿÿÿÿÿÿÿ44//µ ÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿµ ÿÿÿÿÿÿÿÿÿ4ÿÿ44ÿÿÿÿÿÿÿÿÿÿÿ33ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ43ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ33ÿÿ/ÿ2ÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\ù +\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +cù +ÿÿÿÿÿÿÿ² ÿ² ÿcù +ÿÿù +ÿÿrÿrrÿÿÿÿÿÿÿcÿù +ÿÿÿrÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿ² ÿÿÿÿÿÿ³ ñ +\ÿÿÿÿÿÿÿÿÿÿÿÿñ +ÿÿ\ÿÿÿrÿÿÿÿÿÿ² ÿÿÿÿ\ÿ2ÿ4ÿÿÿÿÿÿÿ² ÿÿ³ \ÿÿrrrÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿñ +ÿÿÿñ +ÿÿ\ÿÿÿqÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ +\ÿÿ.ÿÿÿÿÿÿñ +ÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +\ÿÿqqÿ3ÿÿÿÿñ +ÿÿÿ3ù +Ú A³ Ø 1\× Ù #ŒU Ú  ) ) ) ) É "$%) Ô Ð 1 ) 3Ô Ð 3Ê +Ó +3² Ê JMžù +ñ +Ô Ð J)3ÿÿÊ ù +³ ÿÉ ù +ÿÿØ ù +³ ÿÉ æ Í è ² ÿÿÛ Í Ì ³ Ñ ù +33ÿÿ² ÿØ A33ÿ³ ÿ33Ú AUÔ 7Õ +É +P7A 7A 7) ) [!PUPU¯¸*A) ) +É +¡›”\É +®·RU¬\) ) ) ) +Õ +¥  +É +·íÈ +Î +) ) ) ) ) ) ) ) ) ) ) +]È + ) Í +) ) ) ) ) ) ) ) ) ) )  ) ) Ê +Ó + ) ) ) ) 9 +) ) ) )  ) ) MÔÐ +) ) Ò +Í +) ) [Ð +) ) JM ) ) +É +ÕÔ ) Ì +Ë + ) ) 5Ê +Ó +Ó +Ó +Ë +!ÖË +·Ð +) ) 0È +Õ +Õ +¥É +È +Õ +]· ) Ì +5Ð +) ) ) Ï + ) ) ) [· ) +AUZ) ) ) ) ) ) ) Ì +Ë +È +Î +) ) UÈ + ) ) ) ) ) ) ) · ) Í +Ô ) ) ) ) ) ) ) ) TÉ +Ê +XË + A7D7A UR7 bR U¶È +Õ +É +¯/Õ +¥Õ +É +Ô ) ) ) [Ô/) ) ) ) ) ) TÉ + ) ) [•P) ) ) ) ) ) ) [\ ) ) TÕ + ) ) ) ) ) ) ) [Ð +) ) ) ) ) ) XÒ +X ) ) [Î +) ) 9 +) ) Ì +Ë +ËËËÐ +) Ð +) Ì +® Ó +Ò +Ë +•[ËËËZ) [Ð +) \Õ +Õ +É +ËËË ) [Z) Ð +) ) ) ) [Ë +ÔÔ·Ð +) [Ó + ) ) ) ) +Õ +¥ ) Ï +¥É +¸ ) ) ) ) ) ) ) ) ) ) ) ) ) +É +Ê +X) ) € ) ) ) ) ) Ë +ºÈ +É +) Ì +® Í +Í +) ) Ñ +·· ) ) ) ê rr,,,3ù +Ü µ .ÿbbÿµ ß ÿ1rÿ,ÿ2å ÿµ 3ÿÿ1ÿß ÿÿÿ2ÿÿÿ)  à 33ÿµ ÿÿÿÓ +*å 1ÿÿÿÿÿÿ¯/à ÿ,2ÿÿÿÿL;ç é ÿÿÿÿÿÿ/ç é ¾ 3ÿ3ñ +P"  7Ý Õ ù +ÿÿÿ¥¥Õ +¥É ++ë Õ ÿÿÿ) ) ) ) ) L;ë Õ ÿÿXÓ +Í +) P7ë â á È +Õ +É +Ð +) [*Ð +) [XP"73ù +212.2/,/4,,\\\ù +1ÿÿbÿÿÿÿ,ÿÿÿÿÿÿù +ÿ1ÿÿÿÿÿ/ÿÿÿÿÿÿÿù +ÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿ.ÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿ3ÿÿÿÿÿÿñ +ÿÿÿÿÿÿÿÿÿÿrÿÿÿÿñ +ñ +ÿÿÿ4ÿÿÿÿÿÿÿÿÿÿ3ñ +4ñ +2ÿÿÿ4ÿÿÿÿÿÿÿñ +ÿ4ÿñ +332ÿ44ÿÿÿÿÿã ÿÿñ +ñ +ÿÿ-ÿÿ44ÿÿÿÿç é ÿÿñ +ñ +4--ÿÿÿÿÿÿÿà ÿÿ4ñ +ÿÿ-4ñ +ÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +\ÿÿÿÿÿ.ÿ4ÿÿÿÿÿÿñ +\ÿÿÿ.ÿÿ.ÿÿÿÿÿÿÿÿ\ÿÿÿÿ.r.ÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿrÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿ2rrÿÿÿÿÿÿ\ÿÿÿÿÿÿr2ÿÿÿÿÿÿÿ\ÿÿÿÿÿrÿr2ÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿr2rÿÿÿÿÿÿÿ\ÿÿÿÿÿrrÿrÿÿÿÿÿÿ\ÿÿÿÿÿÿrrÿÿÿÿÿÿÿù +ù +ù +² ³ 3ù +Ê 5È +ù +² ÿÿÿÿÿÚ GC) ù +ÿÿÿñ +² ÿØ $ù +ÿÿÿÿÿñ +Ê AUù +ÿÿñ +ÿ3ÿÉ 5žù +ñ +ÿÿÿÿ× Ù 0¡ù +ÿÿÿÿ× ì 3Ôù +ÿÿÿÿÚ GMù +ÿÿÿ³ É AUù +ÿ33ÿÛ Í è 3È +ù +ÿÿq³ ÿÿÑ 0 ù +ÿÿñ +ÿrñ +Ú 3Zù +ÿÿÿbÿ² Ø 1ù +ÿÿñ +ÿ³ ÿÔ Ð J#ù +ÿÿÿÿÿÿñ +Ú ù +ÿÿÿÿÿrÿÔ Ð A] ) ) ) ) ) ) ) ) Ì +Ë +··‚ + ) ) ) ) ) ) ) ) Ñ +·d··¡) ) ) ) ) ) ) ) ) Ì +··î¶·Ò +Í +) ) ) ) ‡‡”···È + ) ) ) Ì +ÿÿÿˆ‡Ö··Ô ) ) ) ) Ì +Ë +ÿ­­ÿÿÔ··ÔÐ +) ) ) ) [”Ù­­:ÔÿUUUÊ +Í +Ì +XÒ +Ë +ˆÿÌ Í >TWOY¢Ë +¤¡ÿ·É Í [ËËËÕ +¥É +1M + +È \·ËËË) ) ) ) [ Z +] +[:¸×º) ) ) ) +Õ +¥É +¢¡Ô[ï\\\Í +) ) ) ) ) [ÔÔÔ\º\\\M ) ) ) ) ) ¶­­Z44?40Ê +XXÒ +Ë +>Š­ÔÔÔ­­UÕÈ +É +ÔÙÔØÔdÔÔÔ­­XË +eeÊ +Í +Ë +Ô· ) ) ) ÿULUcÖÔÔ·1ccc0Ôº· Ô··QcO––· Ö”·Ô1c0·····Ô····Ô1c0····t­····UPcMU!8­­·ÔÔËQNS?b·¡Ì Í  & ËËí10!­­·[ Í + +$ ËË?WR?­©·\ +Í  * M Õ +Õ +î10···![ Y +] +# ºÐ +) ) 4W0·\\¡© & % & * ¢Z) ) Õ1R?\\·[Ì Í ž›! ?WR??4?@ + +¾ + ¡È + Ô10º\\Ì Ç ~É È +Î +) ) 4PR?\\º +¢Ÿ~È ) ) ) Ð +) Ï +É +····P7Ð +) ) Ñ +·····P7XXË +···L)M*È +¥¥¥É +P7J; ) ) ) ) ) ·\7Ð +) ) ) ) ) [·¶,XÓ +Ë +··/ºÔ>ÔÿUU·*·ÙÔ×L;Õ +Õ +Õ +¥Õ +É +·P7) ) ) ) ) ) Ñ +··P7) ) ) ) ) ) [··Õ*) ) ) Ì +Ë +Ö··,) ) ) Ñ +·í·×·+) ) ) Ñ +··¯··L;Ì +Ó +Ó +Ë +Ö·L#$;Ý â á Õ ñ +ñ +24ñ +ñ +4ñ +424ê ÿ-4ñ +ñ +ÿÿÿ3ÿ4å ÿñ +4ñ +4ñ +ÿ4ÿµ ÿæ ä ñ +4µ 42ñ +ÿÿ,ÿÿå ó +ÿÿñ +ÿµ ÿq4ÿ,bæ Ï Ì ñ +ó +µ 222ÿ4ÿrÿÿå ô +ÿÿ,ÿ-ÿÿ444ÿÿÿå 2ô +2ÿ/ÿÿÿÿÿÿ,ÿÿæ ä ÿ2µ ÿ.ÿÿÿÿÿÿÿbÿÝ Õ 2ô +2ÿÿ2ÿÿÿ,ÿ44ÿë á Õ /ô +ÿÿÿÿrÿÿ44ÿê ÿô +2ÿ4ÿÿÿr,ÿrå ÿÿÿ³ ÿ4ÿbÿ4,ÿå ÿ/2ÿbÿÿÿ4ÿÿÿå ÿô +1rÿÿÿÿr/ÿÿå ÿô +ô +ÿµ ÿ/ÿ,ÿÿÿù +\\\\\\\\\\\\\\\ù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +2ÿbÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿ,ÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿrÿÿÿÿÿÿÿ42ÿ,ÿÿrÿÿÿÿÿÿÿÿÿ2ÿ4ÿÿ4ÿÿrÿÿÿÿÿÿÿ,42ÿÿÿÿ4ÿÿrr2ÿÿÿù +4r2ÿbÿÿÿr2rÿÿÿÿrÿ/ÿ4ÿ,ÿ4ÿÿÿ2rÿÿqÿrÿÿ-ÿ2ÿÿÿ2ÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ù +ù +ù +ù +ù +ù +22ù +ù +ù +ù +ù +ù +ù +\ÿÿÿÿÿÿ23ÿÿÿÿÿÿr\ÿÿÿÿÿ2ÿÿÿÿÿÿÿr4\ÿÿÿÿÿÿÿÿÿÿÿÿÿrr\ÿÿÿÿÿÿÿÿÿÿÿ1.ÿÿ\ÿÿÿÿÿÿÿÿÿ.1ÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿµ .ÿ4\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿµ ÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿµ ÿÿÿÿ4\ÿÿÿÿÿÿÿÿÿÿÿµ ÿÿ4\ÿÿÿÿÿÿÿÿÿÿÿÿÿ44\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿµ \ÿÿÿÿÿÿÿÿÿÿÿÿÿÿµ \ÿÿÿÿÿÿÿ444ÿÿÿÿÿ\ÿÿÿÿÿÿÿ4ÿÿ4ÿÿÿÿù +ù +ù +ù +ù +ñ +ù +rù +Ú AU4rÿÿÿÿñ +r× Ù 5Ôù +ÿÿÿÿÿ× á Ù GKù +rÿÿÿÿÚ 3ù +ÿ4rÿÿÔ Ð 14ÿrÿÿÿ× Ù J4ÿÿÿñ +ÿÚ ù +ÿ² ÿ4ÿØ ù +ÿñ +² ÿÿÊ ù +ÿÿÿ² ÿÔ Ò Í è 4ÿÿÿÿÿÿ4ÿÑ µ µ ÿÿÿÿv4ÿÚ µ µ ÿ4ÿÿÿvpØ ù +ÿÿoÿµ cÿÿÔ Ð ù +ÿp² ÿ44vÿÚ ù +ÿÿÿopÿÿÛ Ï Ï è \¥ ) +Õ +É +ÔÔ!¹â +ÔÔÔÔ ) ) ) ) ) ž¡Ôœ×ÔÔ×ÔÐ +) ) ) ) ) Ñ +â +ÔØÔÔÔ¸ËÊ + ) ) ) TÉ +íÔÔ¬ÔÔÖËÔÔÍ +) ) ) ÔžÔÔs!ŠÔ&)M ) ) ) +É +ÔÔ·ƒ·¸0Ð +) ) ) ) ­··â +···3 ) ) ) ) [­­È +]È +1Ê +Í +) ) ÔÔÐ +) ) Ñ + J)MÊ +XË +ÔÔ ) ) [ZJ$MÔÔÕÖÐ +) ) ZJ)$#M ) )  3Ê +Ë +Ð +JMÔÔÖZGMÔÔÊ +G#)$Ô10ºººÌ Ç acB ++ +Ð +) ) ) Ô10··· +dŸ`È ·Ê +Ó +Ó +Ó +ËËËËËÔ\ +Z +Z +[ +] +W +È +Õ +Õ +Õ +Ën o ËËÖM ¥Õ +Õ +]Ð +) ) ) ¶ ~ ÕºÔ ) ) ) ) TÎ +) ) ) ¡c b › V +m + %) ) ) ) ) ) ) ) ¸ºÙN +l +m + ) ) ) ) ) ) ) ) ) Õ +É +â +Ê +Ó +XÓ +Ò +Ó +XÒ +Í +) ) ) ) ) ·N +W +······Z) ) ) ) ) +É +··ÿU··Z) ) ) ) ) ) ) Ñ +··1c0··Ð +) ) ) 9 +) ) ) ÔÔ1c0ÔÈ + ) ) Ó +Ó +Ë +ÔÔ·Ð +) ) )  Ñ +·ÔÔLMÔÔÔÕÐ +) ) Ó +Ë +Ë +ÕÖL;J&)$MZ) ) )ML)$#;GMXÒ +Ñ +­­Õ”·/Ë +­­··Õ*]·····,Ñ +·Ö·L#;[¶·Š* +¥É +L;æ Í ) ) >;æ Í Ï Í Ì ñ +) )  å ò +/ñ +´ ñ +) ;à ò +ô +/r4) ###Ý Õ ´ ñ +ÿô +) ) ) ) ) ##ë Õ ÿ4ô +) ) ) N§Q) ) !ê 2ÿr) %) ªë©) ) !å /ÿ2Ì +Ó +ëª) ) !ç Þ â á M Î +ë») ) !Ë + ) ) ) Ì + å ô +,ô +ô +³ ô +-.ô +ô +qù +æ Ï Í ä r.ÿÿÿ2ÿÿÿ2ÿÿå ñ +ñ +ô +ô +ÿÿÿô +ô +ô +ÿ-ÿÿÿÜ ô +r4ô +ô +ô +ô +ÿô +ÿÿÿqÿ2å ô +rñ +4ô +ô +/ô +ÿÿ2ÿÿÿÿÌ ÿ³ ñ +ñ +/ô +ÿÿÿÿÿÿÿ2ÿrô +4ÿ4ÿÿÿÿb2ÿÿÿÿ2´ ô +ÿÿÿÿ4ÿ1ÿô +ÿÿÿbÿô +³ ô +ÿÿÿÿÿÿ1ÿ4ÿÿÿÿô +ÿbÿÿ4ÿÿÿÿÿ/ÿbÿ2ô +ÿrÿb1ÿÿ1ô +ÿÿÿÿÿbù +rÿÿÿÿÿ1ÿÿbÿ2ÿÿÿù +ÿÿÿrô +ÿÿÿÿÿ.1ÿÿù +Õ ÿÿ1ÿÿÿÿÿÿbÿÿÿÿù +ë Õ ÿrÿÿÿÿÿ211ÿÿÿ4ê ÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +4b4/rb22b2r2rrrù +rbÿÿÿÿÿÿrÿÿr4ÿÿù +ÿÿÿÿÿÿÿqÿÿ2ÿÿÿÿù +,ÿµ ÿ,qÿÿÿÿÿÿ44ÿù +ÿÿÿÿ/ÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿù +bÿÿÿÿÿÿ4ÿÿ4ÿÿÿÿµ ÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿù +4ÿÿÿ44ÿÿÿÿÿÿÿÿÿù +4ÿ44ÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿù +ÿÿÿ444ÿÿÿÿÿÿÿÿÿù +ÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿ44ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +44ÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ù +ù +ù +ù +ù +ù +ù +444ù +ù +ù +ù +ù +\ÿÿÿÿÿù +ù +ÿÿÿÿÿÿÿù +\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ù +ù +ù +ù +ù +ù +4ù +ù +ù +ù +Ñ ù +ÿ² ÿÿÿÿÿÿÿÔ Ò è ù +ÿÿÿ± ² ÿÿcÿÿÿv³ ÿÓ ù +ÿÿÿÿ± ÿpocÿÿ³ ÿñ +ù +ù +ÿÿÿ² ÿÿÿÿÿÿvÿ± ÿÿù +ÿÿÿÿÿÿ² ÿÿvÿÿÿÿÿù +ÿÿÿÿÿÿÿÿvÿÿÿÿÿ³ ù +ÿÿÿÿÿÿÿÿÿÿÿÿvvcù +ÿÿÿÿÿÿÿÿ² ÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿ² ÿÿù +ÿÿÿÿÿÿÿÿÿÿ² ÿÿÿÿù +ÿÿÿÿÿ1ÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿ11ÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿ1ÿÿÿÿÿÿÿÿæ Í Í Î è Í Ï Î Ï Ì ÿ³ ÿÓ Î Í Ï Î Ï è ù +² ÿÿÿÿó +ó +ó +ó +ó +ó +ó +ÿÑ µ ÿÿ² ÿÿÿÿó +ó +ó +ó +ó +ó +Ø ù +ù +ÿ³ ³ ÿvÿÿó +ó +ÿó +ó +Û Í ù +ÿÿÿÿÿvÿ³ ÿó +ÿó +ó +ó +ò +ù +² ÿvÿÿÿ³ ÿÿvÿò +ò +ó +ó +ù +ÿvÿÿÿÿÿÿ³ ÿÿcÿù +vÿ³ vÿ³ ÿÿpvÿ³ ³ ÿù +ÿvÿÿÿÿÿÿÿcÿÿÿÿvù +ÿÿÿÿÿÿÿÿÿÿÿ³ ÿÿù +ÿÿÿÿÿopÿÿÿÿÿÿÿÿù +ÿÿÿÿccÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿµ ÿÿÿù +ÿÿÿÿÿÿÿÿµ µ ÿÿÿµ µ J;G#MGæ Í Ï Í Í è Í Ï è æ Ì ò +ó +4ò +Ó è ò +ò +Ó Í Ì ò +ÿÿò +ò +Ó è ò +ò +ò +ò +ò +ò +ÿÿÿò +4ÿÓ Í Î Í ò +ò +ò +ò +ÿ4ÿvÿÿÿÿ4ÿÿÿù +ÿÿÿÿÿÿ4cvÿÿÿÿÿù +ù +4ÿ³ ÿvvÿÿÿÿÿÿp4ù +ÿcÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿpÿÿÿÿÿÿÿÿvÿÿù +ÿÿÿvÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ + )  [ŠÐ +$ŽQ$C‹$C# ) ) !""Î è æ Í Í ù +Ó è æ Ì ¯ ³ ù +ÿÓ è æ ä ÿÿµ ÿÿÓ Í Î Í Î Ï Î Í ä ÿ³ ² ± vÿpÿrÿÿrÿÿÿÿÿrÿÿù +ÿÿcÿÿÿµ ÿÿÿÿÿµ ÿù +ù +ÿrÿÿÿÿÿrÿÿÿÿÿÿÿù +ÿÿÿcrvcÿÿµ ÿÿÿ¯ ÿù +rÿÿÿ4cÿÿÿÿÿÿµ ± µ æ ä ù +,2ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +å ÿÿÿ1ÿÿÿÿÿÿÿÿÿÿÿß ÿbÿÿÿÿÿr44ÿÿÿÿÿå ÿÿ¯ ÿrÿÿ44ÿÿÿ4ÿÿå ÿ³ ³ ÿÿÿÿÿÿÿ44ÿÿÿà ´ ÿbÿÿrÿÿÿÿ4ÿ44ÿå ÿÿ¯ ÿÿÿ44ÿÿÿÿÿÿÿä ÿ³ ² ÿÿrÿÿÿµ 4ÿÿÿÿù +ÿrÿrÿÿÿÿ414ÿÿÿÿù +ÿÿÿÿÿrÿÿ4r44ÿÿÿù +ÿÿÿÿrÿÿÿ1rÿÿÿÿÿù +.ÿÿÿÿÿrÿÿÿÿÿÿÿëù +rÿrrÿÿÿÿÿÿÿÿÿÿÿù +rr.rÿÿÿÿÿÿÿÿÿÿÿù +ù +rrÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿëù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ÿÿ444ÿÿÿÿÿÿÿÿÿÿù +ÿ4ÿÿ4ÿÿÿÿÿÿÿÿÿÿù +ÿ4ÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ù +ù +ù +ù +ù +ù +ù +1ù +ù +ù +ù +ù +ù +ù +ù +ÿÿÿÿÿÿÿ1ÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿ1ÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿ1ÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿ1ÿÿÿÿÿÿÿÿÿù +ÿÿÿÿ1111ÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿ1ÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿ1ÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿµ µ ÿµ ÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿµ ÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ù +ù +ù +ù +ù +-ù +ù +ù +ù +ù +ù +ù +µ ù +ù +ÿÿÿ1ù +ù +ÿÿ,ÿÿµ ÿÿÿù +ÿrÿÿ44ÿÿÿÿµ ÿÿµ ÿù +ÿÿÿµ 41ÿÿÿÿÿÿrÿÿù +1ÿµ 44ÿÿ444ÿµ ÿÿµ ù +ÿÿÿÿÿÿÿ444ÿÿÿÿÿ4µ rÿrÿÿ4444ÿ44ÿÿµ rr4ÿÿÿ4444ÿ4444ù +rµ µ ÿÿÿµ ÿÿÿÿÿÿÿ4ù +ÿÿÿÿÿÿ4ÿÿÿ44444ù +ÿÿÿÿµ ,ÿÿÿÿÿÿ444ù +ÿÿÿµ .µ 4ÿÿÿÿÿ444ù +ÿÿÿµ ÿµ ÿ4ÿÿÿÿ4ÿÿù +ÿÿÿÿÿÿÿ44ÿÿÿÿÿÿù +ÿÿµ ÿÿÿÿ4ÿÿµ ÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ù +4ù +3rrrÿÿÿÿÿÿÿÿÿÿÿÿù +34rÿÿrÿÿÿÿÿÿ4ÿÿ4ÿ3ÿrrÿÿÿrÿÿÿÿÿÿù +ÿÿ33rÿÿrrrÿÿÿÿÿù +ÿÿÿrrrÿrÿÿrÿÿÿÿù +ÿÿÿÿÿÿÿÿrrÿÿÿÿrù +ÿÿÿÿÿÿÿÿÿÿÿÿÿrrù +ÿÿÿÿÿÿÿÿÿÿÿÿÿrÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ù +ù +ù +cù +ù +pù +ù +ù +ù +rµ ù +² ù +ù +4ó +ÿÿÿÿÿÿp¾ ÿÿµ ÿrÿÿÿÿÿó +ÿ¾ ÿpµ ÿrÿù +4rÿÿÿÿÿÿpÿÿÿÿÿÿqÿÿÿ¾ ó +ÿrrÿÿÿÿÿµ ÿù +ÿÿÿÿrrÿrÿÿÿÿrÿrù +ÿÿÿÿÿrrÿÿrÿÿró +ÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +rÿÿÿrÿrÿÿÿó +ÿó +ÿÿù +ÿrÿÿÿÿÿÿÿÿÿÿò +ÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿrÿÿÿÿÿÿÿµ ù +ÿÿÿÿÿÿÿÿÿÿÿÿÿò +ÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ù +ù +ù +ù +ù +ù +ù +ù +ù +ëëëëëërÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿrrrÿÿÿÿÿÿÿÿÿÿù +ÿrrÿrÿÿÿÿÿÿÿÿÿÿù +ÿrÿrÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿ¯ ÿÿÿÿÿò +ÿó +ÿÿ³ ÿÿÿ± ² ÿÿÿÿÿµ ÿñ +ÿÿ´ ÿñ +ò +ò +ô +ÿÿÿÿÿù +ÿµ ÿ± ÿµ ÿñ +ò +ÿÿÿÿÿÿù +ÿÿµ ´ ÿÿÿò +ó +ÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +µ ÿÿÿò +ÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëëëëëëëëëëëëë\ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÙÿÿÿÿÿÿëÿÿÿÿÿÿÿÿH ÿÿÿÿÿÿëÿÿÿÿÿÿÿ‚ ¤e ÿÿÿÿÿëÿÿÿÿÿ¤D ­­­D ¤ÿÿÿëÿÿÿÿÿÿÿ + ­ ÿÿÿÿÿëÿÿÿÿÿ¤D ­­­D ¤ÿÿÿëÿÿÿÿÿÿÿ + ­ ÿÿÿÿÿëÿ­ÿ­ÿ¤D ­­­D ¤ÿ¤ÿëÿH ÿH ÿH ÿ + ­ ÿH ÿH ÿëÿ† D F D F D ­­­D F D F D ëÿH ÿH ÿH ÿ + ­ ÿH ÿH ÿëÿ­ÿ­ÿ­D ­­­D ­ÿ­ÿëÿÿÿÿÿëÿ + ­ ÿÿÿÿÿëÿÿÿÿÿ­D ­­­D ­ÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ Æ Å Ä Ã ÿÿÿ¦§ÿÿÿÿÿ\ À º  ÿÿÿ¥§ÿÿÿÿÿ\ Á ¼ ¾ ÿÿÿÿÿÿ\ á ÿÿÿÿÿÿ\ÿÏ Í Ë Ð Ë ÿÿÿÿÿÿ\ÿ Ð Ø Ü ÷ ÿÿÿÿÿ\ÿ + Ô Ø à ÷÷® ÿÿÿÿÿ\ÿ º » Ç ùúå Ï I ÿÿÿ\ÿ Â È   â Ï  ÿÿÿ\ÿÿ Ä É ÷÷º Ü ÿÿÿ\ÿÿÿÿ÷÷Œ ä ÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿ + ¤ ÿÿÿÿÿëÿÿÿÿÿ­D û¤¤D ­ÿÿÿëÿÿÿÿÿÿÿ + ¤ ÿÿÿÿÿëÿÿÿÿÿÿÿ¤¤¤ÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\\\\\\\\\\\\\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/minimaps.vga b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/minimaps.vga new file mode 100644 index 0000000..df8375e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/minimaps.vga differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/monsters.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/monsters.dat new file mode 100644 index 0000000..1ae308a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/monsters.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/03bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/03bg.ogg new file mode 100644 index 0000000..36ef048 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/03bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/100bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/100bg.ogg new file mode 100644 index 0000000..d7d3332 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/100bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/101bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/101bg.ogg new file mode 100644 index 0000000..770b8fb Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/101bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/102bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/102bg.ogg new file mode 100644 index 0000000..4858673 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/102bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/103bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/103bg.ogg new file mode 100644 index 0000000..15a976b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/103bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/11bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/11bg.ogg new file mode 100644 index 0000000..5285f04 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/11bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/12bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/12bg.ogg new file mode 100644 index 0000000..5285f04 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/12bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/200bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/200bg.ogg new file mode 100644 index 0000000..25a9763 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/200bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/201bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/201bg.ogg new file mode 100644 index 0000000..acdd4d2 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/201bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/202bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/202bg.ogg new file mode 100644 index 0000000..6cd6190 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/202bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/203bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/203bg.ogg new file mode 100644 index 0000000..e7452cd Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/203bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/204bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/204bg.ogg new file mode 100644 index 0000000..b92025a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/204bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/205bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/205bg.ogg new file mode 100644 index 0000000..ef9ba48 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/205bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/206bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/206bg.ogg new file mode 100644 index 0000000..43778d7 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/206bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/207bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/207bg.ogg new file mode 100644 index 0000000..2009f42 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/207bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/208bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/208bg.ogg new file mode 100644 index 0000000..b54a827 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/208bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/209bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/209bg.ogg new file mode 100644 index 0000000..fba6de1 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/209bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/210bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/210bg.ogg new file mode 100644 index 0000000..ee35256 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/210bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/211bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/211bg.ogg new file mode 100644 index 0000000..9635a59 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/211bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/21bg.mp3 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/21bg.mp3 new file mode 100644 index 0000000..03afd33 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/21bg.mp3 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/21bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/21bg.ogg new file mode 100644 index 0000000..740df46 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/21bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/252bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/252bg.ogg new file mode 100644 index 0000000..c94cc16 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/252bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/253bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/253bg.ogg new file mode 100644 index 0000000..e7452cd Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/253bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/33bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/33bg.ogg new file mode 100644 index 0000000..f3daa97 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/33bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/52bg.ogg b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/52bg.ogg new file mode 100644 index 0000000..6a99a07 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/music/52bg.ogg differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/npcs.grp b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/npcs.grp new file mode 100644 index 0000000..d309964 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/npcs.grp differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/occlude.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/occlude.dat new file mode 100644 index 0000000..fa3f5fd Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/occlude.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/paperdol.vga b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/paperdol.vga new file mode 100644 index 0000000..dbc3a6a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/paperdol.vga differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/paperdol_info.txt b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/paperdol_info.txt new file mode 100644 index 0000000..b33c1ca --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/paperdol_info.txt @@ -0,0 +1,55 @@ +# Exult 1.9.0git text message file. Written by ExultStudio. +%%section version +:3 +%%endsection +%%section characters +:464/0/0/14/0/316/1/1/7/1/3/5 +:465/0/0/14/0/323/0/1/7/1/3/5 +:475/0/0/306/0/308/0/0/307/0/2/4 +:485/0/0/14/1/311/0/1/130/1/3/5 +:1024/0/0/14/2/128/4/1/131/1/3/5 +:1036/0/0/14/0/321/0/1/7/1/3/5 +:1041/0/0/14/0/159/0/1/7/1/3/5 +:1043/0/0/14/0/125/0/1/7/1/3/5 +:1107/0/0/14/0/126/0/1/7/1/3/5 +:1122/1/0/14/0/126/0/1/7/1/3/5 +:1148/1/0/13/0/127/0/1/7/0/2/4 +:1149/0/0/13/0/127/0/1/7/0/2/4 +:1159/1/0/13/0/127/0/1/7/0/2/4 +:1167/1/0/0/0/0/0/0/0/0/0/0 +:1202/1/0/13/0/187/0/1/7/0/2/4 +:1243/1/0/13/0/185/0/1/7/0/2/4 +:1249/0/0/14/0/320/0/1/7/1/3/5 +:1254/0/0/14/0/188/0/1/7/1/3/5 +%%endsection +%%section items +:383/0/1/0/1/1/322/0 +:561/-1/1/2/0/0/318/1 +:561/-1/1/3/0/0/318/0 +:637/-1/1/2/0/0/319/1 +:637/-1/1/3/0/0/319/0 +:1138/-1/1/2/0/1/54/0 +:1140/-1/1/3/0/0/135/0 +:1163/-1/1/3/2/0/301/0 +:1163/-1/1/12/0/0/301/1 +:1164/-1/1/3/2/0/300/0 +:1164/-1/1/12/0/0/300/1 +:1172/-1/1/9/0/1/302/0/2/4/6 +:1173/-1/1/5/0/1/309/0 +:1178/-1/1/8/0/0/38/0 +:1178/-1/1/13/0/0/99/0 +:1234/0/1/10/0/0/303/0 +:1236/0/1/0/1/1/304/0 +:1236/-1/1/0/1/1/304/0 +:1237/-1/1/9/0/1/305/0/2/4/6 +:1247/0/1/15/0/0/310/0 +:1247/0/1/102/0/1/310/1 +:1259/-1/1/9/0/1/312/0/2/4/6 +:1260/-1/1/3/2/0/315/0 +:1260/-1/1/12/0/0/315/1 +:1261/-1/0/3/2/0/313/0 +:1261/-1/1/12/0/0/313/1 +:1262/-1/0/3/2/0/314/0 +:1262/-1/0/12/0/0/314/1 +:1264/0/1/0/1/1/317/0 +%%endsection diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/ready.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/ready.dat new file mode 100644 index 0000000..beeec9b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/ready.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/shape_info.txt b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/shape_info.txt new file mode 100644 index 0000000..f92e3f5 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/shape_info.txt @@ -0,0 +1,144 @@ +# Exult 1.9.0git text message file. Written by ExultStudio. +%%section version +:7 +%%endsection +%%section explosions +:1177/4/9 +%%endsection +%%section shape_sfx +:334/54/50/5/1 +:335/54/50/5/1 +:517/113/100/1/0 +:768/11/1/1/0 +:900/52/40/1/0 +:902/52/40/1/0 +:1010/-255 +:1113/77/100/1/0 +:1114/77/100/1/0 +:1121/50/100/1/0 +:1152/104/100/1/1 +:1185/113/100/20/0/0 +:1258/48/100/1/0 +:1265/50/100/1/0 +%%endsection +%%section animation +:160/3/-1/1/-1/20/0 +:334/3/-1/1/-1/20/0 +:335/3/-1/1/-1/20/0 +:447/3/-1/1/-1/20/0 +:768/2/-1/1/0 +:862/3/-1/1/1/0/1 +:880/3/-1/1/1/0/1 +:895/3/-1/1/1/100/8 +:900/3/-1/1/1/100/6 +:902/3/-1/1/1/100/8 +:1117/0/-1/1/1 +:1160/3/-1/3/1/100/0 +:1222/0/-1/4/1 +:1223/0/-1/1/1 +:1224/0/-1/4/-1 +:1235/0/4/3/1 +:1242/3/-1/1/1/100/8 +:1253/0/-1/2/1 +%%endsection +%%section usecode_events +:637/1 +:1164/1 +:1177/1 +:1234/1 +:1247/1 +:1260/1 +:1261/1 +:1262/1 +%%endsection +%%section mountain_tops +:1170/1 +%%endsection +%%section monster_food +:1176/9 +:1193/23 +%%endsection +%%section actor_flags +:805/0/0/1/0/1/0/0/0 +:1174/0/0/0/1/0/0/0/0 +:1177/0/0/0/0/1/0/0/0 +:1193/0/0/0/0/1/0/0/0 +:1194/0/0/0/0/1/0/0/0 +:1197/0/0/0/0/1/0/0/0 +:1226/0/0/0/0/1/0/0/0 +%%endsection +%%section locked_containers +:1187/1 +%%endsection +%%section content_rules +:786/1139/1 +:1255/1139/1 +%%endsection +%%section framenames +:377/31/-1/0/99 +:675/21/-1/0/97 +:1142/0/-1/0/87 +:1142/1/-1/0/88 +:1143/1/0/-255 +:1143/2/0/-255 +:1143/4/0/-255 +:1143/6/0/-255 +:1143/8/0/-255 +:1144/0/-1/0/78 +:1144/1/-1/0/79 +:1144/2/-1/0/80 +:1144/3/-1/0/81 +:1144/4/-1/0/82 +:1144/5/-1/0/83 +:1144/6/-1/0/84 +:1144/7/-1/0/85 +:1144/8/-1/0/86 +:1240/1/-1/0/98 +:1245/0/-1/0/89 +:1245/1/-1/0/90 +:1245/2/-1/0/91 +:1245/3/-1/0/92 +:1245/4/-1/0/93 +:1245/5/-1/0/94 +:1245/6/-1/0/95 +:1245/7/-1/0/96 +%%endsection +%%section altready +:517/255/255 +:883/255/255 +:1146/21/255 +:1163/21/255 +:1164/21/255 +:1178/8/13 +:1234/255/255 +:1260/21/255 +:1261/21/255 +:1262/21/255 +%%endsection +%%section is_mirror +:1266/1 +%%endsection +%%section on_fire +:1229/1 +:1234/0 +:1242/1 +%%endsection +%%section field_type +:1221/-1 +:1222/0 +:1242/0 +%%endsection +%%section frame_usecode +:637/-1/0/1/chaosSword +:1171/-1/0/1/1592 +:1171/-1/100/1/1592 +:1234/-1/-1/1/amuletOfSubmission +%%endsection +%%section light_data +:157/-1/4 +:776/-1/4 +:777/-1/4 +:779/-1/4 +:1113/-1/4 +:1114/-1/4 +%%endsection \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/shapes.vga b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/shapes.vga new file mode 100644 index 0000000..ca4c104 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/shapes.vga differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/shpdims.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/shpdims.dat new file mode 100644 index 0000000..53ab5e0 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/shpdims.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/sprites.vga b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/sprites.vga new file mode 100644 index 0000000..6451730 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/sprites.vga differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/textmsg.txt b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/textmsg.txt new file mode 100644 index 0000000..729ec84 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/textmsg.txt @@ -0,0 +1,1512 @@ +Exult 1.9.0git text message file. Written by ExultStudio. +%%section shapes +0x0:carpet +0x1:sidewalk +0x3:lightning +0x4:grass +0x5:cavefloor +0x6:arrow +0x7:spring +0x8:water +0x9:fireball +0xa:sand +0xb:ether +0xc:void +0xd:spring +0xe:ford +0xf:ford +0x10:rut +0x11:planking +0x12:tile +0x15:stone floor +0x16:swamp +0x17:dirt +0x18:cobblestone +0x19:rut +0x1b:carpet +0x1c:sandy grass +0x1d:muddy bank +0x1f:grass +0x20:grass +0x21:grass +0x22:grass +0x23:grass +0x24:grass +0x25:grass +0x26:grass +0x27:grass +0x28:grass +0x29:grass +0x2a:grass +0x2b:grass +0x2c:grass +0x2d:grass +0x2e:rocky grass +0x2f:carpet +0x30:ethereal void +0x31:cavefloor +0x32:cavefloor +0x33:cavefloor +0x34:cavefloor +0x35:cavefloor +0x36:cavefloor +0x37:cavefloor +0x38:cavefloor +0x39:cavefloor +0x3a:cavefloor +0x3b:cavefloor +0x3c:cavefloor +0x3d:cavefloor +0x3e:cavefloor +0x3f:cavefloor +0x42:grass +0x43:muck +0x44:enchant missiles +0x45:heal +0x46:light +0x47:destroy trap +0x48:sleep +0x49:unlock magic +0x4a:light +0x4b:dispel field +0x4c:heal +0x4d:seance +0x4e:explosion +0x4f:reveal +0x50:charm +0x51:flamestrike +0x52:delayed explosion +0x54:ford +0x55:muddy bank +0x56:muddy bank +0x57:muddy bank +0x58:muddy bank +0x59:muddy bank +0x5a:muddy bank +0x5b:muddy bank +0x5c:muddy bank +0x5d:muddy bank +0x5e:muddy bank +0x5f:muddy bank +0x60:muddy bank +0x61:muddy bank +0x62:muddy bank +0x63:muddy bank +0x64:muddy bank +0x65:muddy bank +0x66:muddy bank +0x67:muddy bank +0x68:muddy bank +0x69:muddy bank +0x6a:muddy bank +0x6b:muddy bank +0x6c:muddy bank +0x6d:muddy bank +0x6f:sandy ground +0x70:ford +0x71:swamp +0x72:swamp +0x73:swamp +0x74:swamp +0x75:swamp +0x76:sandy grass +0x77:sandy grass +0x78:sandy grass +0x79:sandy grass +0x7a:sandy grass +0x7b:sandy grass +0x7c:sandy grass +0x7d:sandy grass +0x7e:sandy grass +0x7f:sandy grass +0x80:sandy grass +0x81:sandy grass +0x82:sandy grass +0x83:sandy grass +0x84:sandy grass +0x85:sandy grass +0x86:grassy mud +0x87:grassy mud +0x88:grassy mud +0x89:grassy mud +0x8a:grassy mud +0x8b:grassy mud +0x8c:grassy mud +0x8d:grassy mud +0x8e:grassy mud +0x8f:grassy mud +0x90:grassy mud +0x91:grassy mud +0x92:grass +0x93:grass +0x94:grass +0x95:mud +0x96:gangplank +0x97:wall +0x98:wall +0x99:oppressor +0x9a:mage +0x9b:The Ferryman +0x9c:tile roof +0x9d:Moongate +0x9e:stand +0x9f:pocketwatch +0xa0:hydra +0xa3:rock outcropping +0xa4:slate roof +0xa5:slate roof +0xa6:slate roof +0xa7:slate roof +0xa8:beam of light +0xa9:slate roof +0xaa:wood roof +0xab:wood roof +0xac:wood roof +0xad:wood roof +0xae:wood roof +0xaf:wood roof +0xb0:wood roof +0xb1:alchemist device +0xb2:cloth map +0xb3:lightning +0xb4:mountain +0xb5:tree +0xb6:mountain +0xb7:mountain +0xb8:Caddelite meteor +0xb9:dead tree +0xba:carpet +0xbb:carpet +0xbc:rug +0xbd:floor +0xbe:carpet +0xbf:fortress +0xc0:fortress +0xc1:floor +0xc2:Knight's Bridge piece +0xc3:mountain +0xc4:mountain +0xc5:mountain +0xc6:light +0xc7:mast +0xc8:trap +0xc9:debris +0xca:debris +0xcb:small rock +0xcc:scorch mark +0xcd:wall +0xce:wall +0xcf:scorch mark +0xd0:broken door +0xd1:dust +0xd2:chicken coop +0xd3:broken door +0xd4:bridge +0xd5:bridge +0xd6:bridge +0xd7:bridge +0xd8:broken wall +0xd9:broken wall +0xda:wall +0xdb:wall +0xdc:wall +0xdd:wall +0xde:blue flag +0xdf:broken roof +0xe0:dust +0xe1:Abbey door +0xe2:flying Gargoyle +0xe3:Alagner +0xe4:Papa +0xe5:naked woman +0xe6:ethereal monster +0xe7:blinker +0xe8:red flag +0xe9:platform +0xea:Sphere Generator +0xeb:Sphere Generator +0xec:Sphere Generator +0xed:Sphere Generator +0xee:Cube Generator +0xef:Cube Generator +0xf0:Cube Generator +0xf1:Cube Generator +0xf2:Tetrahedron Generator +0xf3:Tetrahedron Generator +0xf4:Tetrahedron Generator +0xf5:Tetrahedron Generator +0xf6:Abbey door +0xf7:paladin +0xf8:green flag +0xf9:top +0xfa:Abbey door +0xfb:sails +0xfc:grandfather clock +0xfd:wall +0xfe:wall +0xff:broken wall +0x100:delta +0x101:fortress gateway +0x102:keg +0x103:fighter +0x104:fortress +0x105:loom +0x106:Go away! +0x107:fortress +0x108:iron bars +0x109:townsman +0x10a:wall +0x10b:mysterious craft +0x10c:mirror +0x10d:carpet +0x10e:door +0x10f:portcullis +0x110:portcullis +0x111:wall +0x112:Gargoyle warrior +0x113:Egg +0x114:crossbeam +0x115:crossbeam +0x116:musket +0x117:cavern +0x118:ignite +0x119:curse +0x11a:painting +0x11b:desk +0x11c:sundial +0x11d:cloak +0x11e:banner +0x11f:swordstrike +0x120:slime attack +0x121:The Passion Play Theatre +0x122:closed shutters +0x123:closed shutters +0x124:seat +0x125:tapestry +0x126:carpet +0x127:wedding ring +0x128:ring of invisibility +0x129:ring of protection +0x12a:ring of regeneration +0x12b:ghost +0x12c:cooking utensils +0x12d:cart +0x12e:pumpkin +0x12f:metal wall +0x130:blacksmith +0x131:The Black Gate +0x132:evergreen +0x133:laboratory burner +0x134:wall +0x135:fallen tree +0x136:tree +0x137:trophy +0x138:gargoyle futon +0x139:stump +0x13a:weeds +0x13b:fallen tree +0x13c:large rock +0x13d:ghost +0x13e:sage +0x13f:peasant +0x140:brambles +0x141:reeds +0x142:open shutters +0x143:cattails +0x144:mountain +0x145:dead tree +0x146:tropical plant +0x147:cypress tree +0x148:baobab tree +0x149:kite +0x14a:Virtue Stone +0x14b:rock +0x14c:tree +0x14d:table +0x14e:bubbles +0x14f:bubbles +0x150:light source +0x151:ghost +0x152:lit light source +0x153:dispel magic +0x154:/potion//s +0x155:rock +0x156:boulder +0x157:boulder +0x158:wall +0x159:wall +0x15a:wall +0x15b:broken wall +0x15c:wall +0x15d:wall +0x15e:wall +0x15f:wall +0x160:fortress +0x161:greaves +0x162:liche +0x163:wall +0x164:broken wall +0x165:wall +0x166:wall +0x167:wall +0x168:sign +0x169:sign +0x16a:wall +0x16b:gargoyle futon +0x16c:platform +0x16d:wall +0x16e:wall +0x16f:floor +0x170:floor +0x171:floor +0x172:floor +0x173:wall +0x174:open shutters +0x175:glass wall +0x176:wall +0x177:Unicorn +0x178:door +0x179:food item +0x17a:fence +0x17b:sign +0x17c:cyclops +0x17d:three headed hydra +0x17e:Kissme +0x17f:magic helm +0x180:waves +0x181:stairs +0x182:stairs +0x183:stairs +0x184:eating utensils +0x185:cavern +0x186:cavern +0x187:cavern +0x188:Abbey door +0x189:wall +0x18a:guard +0x18b:mountain +0x18c:mountain +0x18f:energy mist +0x190:body +0x191:pirate +0x192:ferry +0x193:man +0x194:honeycomb +0x195:ship's hold +0x196:nightstand +0x197:desk +0x198:paralyze +0x199:trophy +0x19a:mining machine +0x19b:conveyer belt +0x19c:The Black Gate Dais +0x19d:carpet +0x19e:body +0x19f:garbage +0x1a0:drawers +0x1a1:/magic bolt//s +0x1a2:giant bones +0x1a3:delta +0x1a4:fence +0x1a5:fence +0x1a6:fence +0x1a7:crops +0x1a8:poison +0x1a9:wall +0x1aa:stairs +0x1ab:stairs +0x1ac:stairs +0x1ad:stairs +0x1ae:stairs +0x1af:bellows +0x1b0:door +0x1b1:door +0x1b2:cask +0x1b3:lit sconce +0x1b4:wagon floor +0x1b5:wagon wheel +0x1b6:window +0x1b7:chimney +0x1b8:light +0x1b9:floor +0x1ba:fireplace +0x1bb:telekinesis +0x1bc:hood +0x1bd:mage +0x1be:mage +0x1bf:wounded man +0x1c0:sage +0x1c1:beggar +0x1c2:beggar +0x1c3:noble +0x1c4:peasant +0x1c5:tree +0x1c6:shopkeeper +0x1c7:shopkeeper +0x1c8:noble +0x1c9:gypsy +0x1ca:pirate +0x1cb:wench +0x1cc:ranger +0x1cd:ranger +0x1ce:fighter +0x1cf:fighter +0x1d0:paladin +0x1d1:Iolo +0x1d2:Lord British +0x1d3:jester +0x1d4:entertainer +0x1d5:entertainer +0x1d6:well +0x1d7:child +0x1d8:child +0x1d9:Gargoyle noble +0x1da:sling +0x1db:Gargoyle worker +0x1dc:Smith the Horse +0x1dd:Frank the Fox +0x1de:Sherry the Mouse +0x1df:emp +0x1e0:Draxinusom +0x1e1:sconce +0x1e2:man +0x1e3:rug +0x1e4:bars +0x1e5:highwayman +0x1e6:statue +0x1e7:Shamino +0x1e8:Dupre +0x1e9:Spark +0x1ea:Jaana +0x1eb:acid slug +0x1ec:alligator +0x1ed:bat +0x1ee:bee +0x1ef:cat +0x1f0:dog +0x1f1:wall +0x1f2:chicken +0x1f3:corpser +0x1f4:cow +0x1f5:cyclops +0x1f6:deer +0x1f7:puppet show +0x1f8:dragon +0x1f9:drake +0x1fa:Hook +0x1fb:corpse +0x1fc:stained glass window +0x1fd:fish +0x1fe:fox +0x1ff:gazer +0x200:stained glass window +0x201:gremlin +0x202:headless +0x203:closed drawbridge +0x204:delta +0x205:insects +0x206:glass counter tops +0x207:liche +0x208:Virtue Roulette Table +0x209:mouse +0x20a:locked chest +0x20b:rat +0x20c:reaper +0x20d:sea serpent +0x20e:lit lamp +0x20f:death bolt +0x210:skeleton +0x211:slime +0x212:snake +0x213:cavern +0x214:harpie +0x215:troll +0x216:wisp +0x217:spent sconce +0x218:tentacles +0x219:wolf +0x21a:fence +0x21b:chain coif +0x21c:douse +0x21d:great helm +0x21e:crested helm +0x21f:buckler +0x220:broken columns +0x221:curved heater +0x222:broken dish +0x223:magic sword +0x224:Hoe of Destruction +0x225:lightning whip +0x226:magic boomerang +0x227:fire sword +0x228:magic axe +0x229:firedoom staff +0x22a:/burst arrow//s +0x22b:hawk +0x22c:/magic arrow//s +0x22d:juggernaut hammer +0x22e:/lucky arrow//s +0x22f:Magebane +0x230:/love arrow//s +0x231:Drudgeworth's rusty cutlass +0x232:The Death Scythe +0x233:blowgun +0x234:poison dagger +0x235:/starburst//s +0x236:glimmer +0x237:sword of defense +0x238:/Sleep Arrow//s +0x239:leather armour +0x23a:scale armour +0x23b:chain armour +0x23c:wooden shield +0x23d:plate armour +0x23e:leather leggings +0x23f:chain leggings +0x240:plate leggings +0x241:pedestal +0x242:spiked shield +0x243:leather gloves +0x244:gauntlets +0x245:ammunition +0x246:leather collar +0x247:bed roll +0x248:kidney belt +0x249:shoes +0x24a:gorget +0x24b:boots +0x24c:swamp boots +0x24d:pitchfork +0x24e:club +0x24f:main gauche +0x250:/spear//s +0x251:/throwing axe//s +0x252:/dagger//s +0x253:torch +0x254:morning star +0x255:bow +0x256:crossbow +0x257:sword +0x258:two-handed hammer +0x259:two handed axe +0x25a:two-handed sword +0x25b:halberd +0x25c:Glass Sword +0x25d:boomerang +0x25e:magic bow +0x25f:path +0x260:decorative sword +0x261:kite shield +0x262:delta +0x263:lily pads +0x264:surf +0x265:surf +0x266:cleaver +0x267:/kni/fe/ves +0x268:bottle +0x269:The Time Lord +0x26a:scythe +0x26b:fern +0x26c:rake +0x26d:delayed explosion +0x26e:whip +0x26f:/hammer//s +0x270:pick +0x271:shovel +0x272:hoe +0x273:/lockpick//s +0x274:cup +0x275:lightning wand +0x276:fire wand +0x277:tree +0x278:surf +0x279:table +0x27a:standing stone +0x27b:custom sword +0x27c:/serpentine dagger//s +0x27d:Chaos sword +0x27e:Caddellite Helmet +0x27f:death vortex +0x280:ring +0x281:/key//s +0x282:book +0x283:tree +0x284:/gold coin//s +0x285:/gold nugget//s +0x286:/gold bar//s +0x287:triple crossbow +0x288:sleeping powder +0x289:venom +0x28a:sextant +0x28b:spinning wheel +0x28c:cart +0x28d:bale of wool +0x28e:spindle of thread +0x28f:topiary +0x290:wine press +0x291:curtain +0x292:dough +0x293:mace +0x294:cart +0x295:mongbat +0x296:fishing rod +0x297:magic shield +0x298:stove +0x299:prow +0x29a:magic armor +0x29b:cobwebs +0x29c:sword blank +0x29d:cactus +0x29e:maple tree +0x29f:mushrooms +0x2a0:shrubbery +0x2a1:plant +0x2a2:silverleaf tree +0x2a3:desk item +0x2a5:sack of wheat +0x2a6:curtain +0x2a7:drawers +0x2a8:deck +0x2a9:jar +0x2aa:glass item +0x2ab:tree +0x2ac:trellis +0x2ad:mechanism +0x2ae:magic leggings +0x2af:pillar +0x2b0:blank type +0x2b1:harpsichord +0x2b2:xylophone +0x2b3:lyre +0x2b4:lute +0x2b5:whistle +0x2b6:cave door +0x2b7:grandfather clock +0x2b8:bed +0x2b9:podium +0x2ba:shears +0x2bb:surf +0x2bc:deck +0x2bd:lit torch +0x2be:cannon +0x2bf:cannon ball +0x2c0:powder keg +0x2c1:rope ladder +0x2c2:scorpion +0x2c3:The Black Sword +0x2c4:Stocks +0x2c5:guillotine +0x2c6:log saw +0x2c7:mill stone +0x2c8:stove +0x2c9:post +0x2ca:rope ladder +0x2cb:tombstone +0x2cc:bird +0x2cd:plate +0x2ce:pedestal +0x2cf:water trough +0x2d0:guard +0x2d1:Avatar +0x2d2:/arrow//s +0x2d3:/bolt//s +0x2d4:Fellowship Icon +0x2d5:Virtue Roulette Wheel +0x2d6:lens +0x2d7:horse +0x2d8:Caddellite chunks +0x2d9:crystal ball +0x2da:baby +0x2dc:window +0x2dd:carpet +0x2de:guillotine +0x2df:archery target +0x2e0:surf +0x2e1:surf +0x2e2:pants +0x2e3:firepit +0x2e4:well +0x2e5:water trough +0x2e6:stuffed toy +0x2e7:strength tester +0x2e8:telescope +0x2e9:harp +0x2ea:The Orrery Crystal +0x2eb:Soul Cage +0x2ec:Well of Souls +0x2ed:alchemist aparatus +0x2ee:carpet +0x2ef:surf +0x2f0:music box +0x2f1:stone harpie +0x2f2:vial +0x2f3:orrery paths +0x2f4:caltrops +0x2f5:cart +0x2f6:carpet +0x2f7:ethereal ring +0x2f8:gem +0x2f9:spellbook +0x2fa:body +0x2fb:The Rat Race Game +0x2fc:The Rat Race Game +0x2fd:The Planet Britannia +0x2fe:The Moon Trammel +0x2ff:small orrery +0x300:energy field +0x301:/smokebomb//s +0x302:orrery viewer +0x303:Rudyom's Wand +0x304:honey +0x305:cart +0x306:cart +0x307:ship rails +0x308:moongate +0x309:moongate +0x30a:body +0x30b:Moongate +0x30c:bubbles +0x30d:gang plank +0x30e:flaming oil +0x30f:tree +0x310:emp +0x311:Orb of the Moons +0x312:The Vortex Cube +0x313:lever +0x314:switch +0x315:sword in a stone +0x316:invisibility dust +0x317:ship +0x318:Magician's Wand +0x31a:water +0x31b:mantle +0x31c:draft horse +0x31d:scroll +0x31e:sealed box +0x31f:unsealed box +0x320:chest +0x321:backpack +0x322:bag +0x323:basket +0x324:crate +0x325:daemon +0x326:guard +0x327:lightning +0x328:surf +0x329:The Triples Game +0x32a:bucket +0x32b:rabbit +0x32c:Iron Maiden +0x32d:The Rack +0x32e:The Triples Game +0x32f:stone chips +0x330:nest +0x331:cactus +0x332:The Triples Game +0x333:barrel +0x334:plaque +0x335:painting +0x336:diaper +0x337:artist's equipment +0x338:pitcher +0x339:campfire +0x33a:tree top +0x33b:/bandage//s +0x33c:wall +0x33d:floor +0x33e:gear +0x33f:baking hearth +0x340:glass wall +0x341:glass wall +0x342:surf +0x343:magic gauntlets +0x344:antique armor +0x345:easel +0x346:Avatar Costume +0x347:hourglass +0x348:flying carpet +0x349:glass wall +0x34a:/reagent//s +0x34b:magic gorget +0x34c:sea serpent +0x34d:wall +0x34e:mantle +0x34f:table +0x350:mirror +0x351:tapestry +0x352:carpet +0x353:cloth +0x354:crenellations +0x355:greenhouse roof +0x356:statue +0x357:Rats Face Cage +0x358:fire bolt +0x359:dragon breath +0x35a:bookshelf +0x35b:casting frames +0x35c:fencing dummy +0x35d:troll +0x35e:shaft +0x35f:kitchen items +0x360:toddler +0x361:spider +0x362:Thumbscrews +0x363:victim +0x364:wall mount +0x365:wall +0x366:drawbridge +0x367:wall +0x368:stove +0x369:chair +0x36a:void +0x36b:surf +0x36c:metal wall +0x36d:Rune +0x36e:crenellations +0x36f:wall +0x370:shaft +0x371:noble +0x372:noble +0x373:wingless Gargoyle +0x374:swashbuckler +0x375:Fellowship Staff +0x376:anchor +0x377:test tubes +0x378:horn +0x379:lamp post +0x37a:table +0x37b:wood roof +0x37c:body +0x37d:pool of water +0x37e:monolith +0x37f:fire field +0x380:crenellations +0x381:seat +0x382:altar +0x383:wall +0x384:poison field +0x385:crenellations +0x386:sleep field +0x387:crenellations +0x388:wall +0x389:cavern +0x38a:Statue +0x38b:surf +0x38c:tile roof +0x38d:wall +0x38e:wall +0x38f:surf +0x390:blood +0x391:pillar +0x392:blackrock +0x393:chunks of lead +0x394:chunks of iron ore +0x395:shaft +0x396:surf +0x397:bookshelf +0x398:pillar +0x399:betting marker +0x39a:small bush +0x39b:piece of wood +0x39c:cavern +0x39d:cavern +0x39e:delta +0x39f:delta +0x3a0:cavern +0x3a1:pirate +0x3a2:delta +0x3a3:mountain +0x3a4:tree +0x3a5:millsaw +0x3a6:water wheel +0x3a7:portcullis door +0x3a8:portcullis door +0x3a9:Gargoyle jewelry +0x3aa:delta +0x3ab:wall +0x3ac:wall +0x3ad:water wheel +0x3ae:water wheel +0x3af:wall +0x3b0:pot +0x3b1:Guardian Statue +0x3b2:guard +0x3b3:/bee stinger//s +0x3b4:/bolt//s +0x3b5:winch +0x3b6:winch +0x3b7:water wheel +0x3b8:The Ferryman +0x3b9:wall +0x3ba:greenhouse roof +0x3bb:amulet +0x3bc:wood roof +0x3bd:barkeep +0x3be:The Moon Felucca +0x3bf:mountain +0x3c0:mushroom +0x3c1:barge +0x3c2:slate roof +0x3c3:slate roof +0x3c4:table +0x3c5:child +0x3c6:tile roof +0x3c7:broken wall +0x3c8:Enclosed Prism +0x3c9:mountain +0x3ca:sheep +0x3cb:table +0x3cc:wall +0x3cd:stairs +0x3ce:stairs +0x3cf:wagon door +0x3d0:wagon +0x3d1:wagon +0x3d2:wagon +0x3d3:wagon roof +0x3d4:wall +0x3d5:Prism +0x3d6:chimney +0x3d7:mountain +0x3d8:piece of wood +0x3d9:waves +0x3da:stove top +0x3db:baby in a cradle +0x3dc:planet +0x3dd:Avatar +0x3de:The Dark Core +0x3df:anvil +0x3e0:cradle +0x3e1:mushroom +0x3e2:tongs +0x3e3:cauldron +0x3e4:glass wall +0x3e5:spent light source +0x3e6:horseshoe +0x3e7:plant +0x3e8:table +0x3e9:table +0x3ea:table +0x3eb:table +0x3ec:leather helm +0x3ed:glass wall +0x3ee:broken wall +0x3ef:glass wall +0x3f0:waves +0x3f1:waves +0x3f2:prism +0x3f3:bed +0x3f4:surf +0x3f5:rocking horse +0x3f6:floor +0x3f7:Golem +0x3f8:floor +0x3f9:ship +0x3fa:table +0x3fb:glass wall +0x3fc:surf +0x3fd:time barrier +0x3fe:surf +0x3ff:haystack +0x400:Avatar +0x407:naked woman +0x40a:naked Avatar +0x413:naked woman +0x44e:codex +0x452:dragon egg +0x453:man +0x459:Moongate +0x45a:Moongate +0x45b:urn +0x45c:urn +0x45d:urn +0x460:stone staircase +0x461:edge +0x462:mage +0x465:codex symbol +0x468:Serpent Amulet +0x469:carpet +0x46a:table +0x46b:counter +0x46c:staircase +0x46d:scroll +0x46e:rope +0x46f:rubber duck +0x470:bell +0x471:Book of Prophesies +0x472:guild belt +0x473:moonstone +0x474:body +0x475:sign +0x476:silver tablet +0x477:lever +0x478:treasure map +0x479:broken egg +0x47a:crypt +0x47b:magic scroll +0x47c:bard +0x47d:judge +0x47e:crypt +0x47f:painting +0x480:forcefield +0x481:shaft +0x482:shaft +0x483:mage +0x484:bard +0x485:man +0x486:mage +0x487:bard +0x488:man in stocks +0x489:lamp +0x48a:lit lamp +0x48b:yew staff +0x48c:yew staff (lightning) +0x48d:panpipes +0x48e:looking glass +0x48f:woman +0x490:yew log +0x491:yew board +0x492:floor +0x493:book +0x494:cloth armour +0x495:cloth leggings +0x496:giant ant +0x497:body +0x498:evil rabbit +0x499:volcano +0x49a:door shield +0x49b:brass shield +0x49c:avatar bookshelf +0x49d:pizza box +0x49e:soda can +0x49f:ground +0x4a0:crazy man +0x4a1:beehive +0x4a2:carpet +0x4a3:magic locked chest +0x4a4:open grave +0x4a5:dirt +0x4a6:grave +0x4a7:soft dirt +0x4a8:cot +0x4a9:Pushme-Pullyu +0x4aa:hydra +0x4ab:two-headed cow +0x4ac:body +0x4ad:two-headed scorpion +0x4ae:body +0x4af:body +0x4b0:basket +0x4b1:balloon +0x4b2:shepherd +0x4b3:raw beef +0x4b4:raw chicken +0x4b5:raw horsemeat +0x4b6:raw ribs +0x4b7:raw venison +0x4b8:raw mutton +0x4b9:raw rabbit +0x4ba:raw pork +0x4bb:bones of Zog +0x4bc:kindling +0x4bd:grave +0x4be:gears +0x4bf:gears +0x4c0:gears +0x4c1:gears +0x4c2:silk thread +0x4c3:silk cloth +0x4c4:balloon bag +0x4c5:lava +0x4c6:lava +0x4c7:barrier +0x4c8:planet +0x4c9:gargish vase +0x4ca:silver serpent +0x4cb:stone wall +0x4cc:sign +0x4cd:campfire +0x4ce:plaque +0x4cf:burner +0x4d0:packed balloon +0x4d1:balloon +0x4d2:amulet of submission +0x4d4:gargish helm +0x4d5:ringmail armor +0x4d7:altar of singularity +0x4d8:urn +0x4d9:raft +0x4da:fire field +0x4db:gypsy +0x4dc:mage +0x4dd:shrine +0x4de:wall +0x4df:storm cloak +0x4e0:woman +0x4e1:barbarian +0x4e2:winged gargoyle +0x4e3:gargish book +0x4e4:horseflesh +0x4e5:whirlpool +0x4e6:fighter +0x4e7:The Vortex Cube +0x4e8:magic quill +0x4e9:body part +0x4ea:fountain +0x4eb:mystic armor +0x4ec:yew staff (fire bolt) +0x4ed:yew staff (death bolt) +0x4ee:yew staff (poison) +0x4ef:parrot +0x4f0:winged helm +0x4f1:edge +0x4f2:mirror +0x4f3:lion statue +%%endsection shapes +%%section msgs +0x0:"Step aside!" +0x1:"Stand away!" +0x2:"Move on!" +0x3:"Strive for unity!" +0x4:"Trust thy brother!" +0x5:"Worthiness precedes reward!" +0x6:"Heed thine inner voice!" +0x7:"You are all individuals!" +0x8:"Say it with me, brother!" +0x9:"Art thou with us, brother?" +0xa:"Let me shake thine hand!" +0xb:"Thou must believe!" +0xc:"I am worthy!" +0xd:"I believe!" +0xe:"Yes!" +0xf:"Yea, verily!" +0x10:"Nice weather today." +0x11:"Good day." +0x12:"How art thou doing?" +0x13:"Greetings." +0x14:"Stop!" +0x15:"I would have words with thee." +0x16:"I wish to speak to thee." +0x17:"Come here!" +0x18:"Surrender!" +0x19:"Resist not!" +0x1a:"Stop!" +0x1b:"Can I help thee?" +0x1c:"What wilt thou have?" +0x1d:"The vegetables are good." +0x1e:"Hast thou decided yet?" +0x1f:"Try the ale." +0x20:"More food!" +0x21:"Service!" +0x22:"Barkeeper!" +0x23:"Ale!" +0x24:"Yo ho, yo ho..." +0x25:"Mmmm, tasty!" +0x26:"Burp!" +0x27:"Mmmm..." +0x28:"Who made this slop?" +0x29:"Ouch!" +0x2a:"Ooof!" +0x2b:"Argh!" +0x2c:"Eeow!" +0x2d:"Thou wilt pay for that!" +0x2e:"Thou wilt regret that!" +0x2f:"Unnhhh!" +0x30:"To my side!" +0x31:"Cover me!" +0x32:"Defend me!" +0x33:"Protect me!" +0x34:"I shall protect thee!" +0x35:"On my way!" +0x36:"Hold on!" +0x37:"Aiiieeee!" +0x38:"Boom!" +0x39:"To Battle!" +0x3a:"To Arms!" +0x3b:"To the Death!" +0x3c:"Stop, thief!" +0x3d:"Thieving scoundrel!" +0x3e:"Guards! Guards!" +0x3f:"Blast!" +0x40:"Ouch - cut myself!" +0x41:"These crops are tough!" +0x42:"Still no gold!" +0x43:"Whew!" +0x44:"Am I not worthy?" +0x45:"Eureka!" +0x46:"I am rich!" +0x47:"I must be worthy!" +0x48:"Mercy!" +0x49:"Pity me!" +0x4a:"Spare me!" +0x4b:"Let me be!" +0x4c:"I surrender!" +0x4d:"I give up!" +0x4e:"Please, no more!" +0x4f:"I will have my revenge!" +0x50:"Thou wilt regret this day!" +0x51:"Thou wilt pay for this!" +0x52:"We shall meet again!" +0x53:"Curse thine offspring!" +0x54:"Damn thee!" +0x55:"Take this!" +0x56:"Vultures will pick thy bones!" +0x57:"I shall have thine head!" +0x58:"Die, fool!" +0x59:"Thy blood will soil the land!" +0x5a:"Watch out!" +0x5b:"Move!" +0x5c:"Stand aside, I am practicing!" +0x5d:"Step aside so that I can practice!" +0x5e:"Thou art in my way!" +0x5f:"Kindly step aside!" +0x60:"Whew! 'Tis hot!"; +0x61:"Work...work...work..." +0x62:"We need rain..." +0x63:"Ah, 'tis better." +0x64:"Much better!" +0x65:"'Tis better." +0x66:"I can see again!" +0x67:"This need not be on." +0x68:"This needs replacing." +0x69:"Guards! Guards!" +0x6a:"Help!" +0x6b:"Save me!" +0x6c:"Call the guards!" +0x6d:"Alert the town guard!" +0x6e:"Do not touch that!" +0x6f:"Stop that, or else!" +0x70:"Leave that be!" +0x71:"These should be closed." +0x72:"Too cold for these to be open!" +0x73:"Who left these open?" +0x74:"Ah, 'tis better!" +0x75:"That will let some light in!" +0x76:"Too nice a day for these to be shut!" +0x77:"I could use a little food." +0x78:"I am a bit hungry." +0x79:"When do we eat?" +0x7a:"I am very hungry." +0x7b:"I must eat now." +0x7c:"I must have food." +0x7d:"I'm famished!" +0x7e:"I'm starving!" +0x7f:"I need food!" +0x80:"Catch me if thou canst!" +0x81:"Tag! Thou art it!" +0x82:"Thou cannot catch me!" +0x83:"Nyah nyah! Thou art it!" +0x84:"Gargoyle boy!" +0x85:"Ghosts!" +0x86:"Shades!" +0x87:"Spectres!" +0x88:"I hear something to the north!" +0x89:"I hear something to the east!" +0x8a:"I hear something to the south!" +0x8b:"I hear something to the west!" +0x8c:"Die!" +0x8d:"Bastard!" +0x8e:"Murderer!" +0x8f:"Suffer my wrath!" +0x90:"I will kill thee!" +0x91:"For that thou shalt perish!" +0x92:"Mmmmm..." +0x93:"Burp!" +0x94:"I hate leftovers..." +0x95:"What was that noise?" +0x96:"Who goes there?" +0x97:"What art thou doing here?" +0x98:"Away with thee!" +0x99:"I am trying to sleep!" +0x9a:"Begone, fool!" +0x100:Put that chair back! +0x101:Thief!! +0x102:Thou scoundrel!! +0x103:Not funny! +0x104:Who moved my chair?? +0x105:You look like you're doing fine. +0x106:Everything okay? +0x107:Ready for dessert? +0x108:Enjoy! +0x109:Specialty of the house! +0x10a:Avatar! Please restrain thyself! +0x10b:Hast thou noticed that this bed is occupied? +0x10c:The resident of this bed may not be desirouth of company at the moment. +0x10d:Thou shan't lose me so easily! +0x10e:Ah, there thou art! +0x10f:Found ye! +0x110:with help from +0x111:The Exult Team +0x112:Driven by Exult +0x113:The end of Ultima VII +0x114:The end of Britannia as you know it! +0x115:No. You cannot do that! You must not! +0x116:Damn you Avatar! Damn you! +0x117:The Black Gate is destroyed. +0x118:The Guardian has been stopped. +0x119:Avatar! You think you have won? +0x11a:Think again! You are unable to +0x11b:leave Britannia, whereas I am free +0x11c:to enter other worlds! +0x11d:Perhaps your puny Earth shall be +0x11e:my NEXT target! +0x11f:In the months following the climactic +0x120:battle at The Black Gate, Britannia +0x121:is set upon the long road to recovery +0x122:from its various plights. +0x123: +0x124:The end. +0x125:Lord British decreed that +0x126:The Fellowship be outlawed +0x127:and all of the branches were +0x128:soon destroyed. +0x129:The frustration you feel at having been +0x12a:stranded in Britannia is somewhat +0x12b:alleviated by the satisfaction that you +0x12c:solved the gruesome murders committed +0x12d:by The Fellowship and even avenged the +0x12e:death of Spark's father. +0x12f:And although you are, at the moment, +0x130:helpless to do anything about +0x131:The Guardian's final threat, +0x132:another thought nags at you... +0x133:what became of Batlin, the fiend +0x134:who got away? +0x135:That is another story... +0x136:one that will take you +0x137:to a place called +0x138:The Serpent Isle... +0x139:Lord British's Castle +0x13a:Dick British's Castle +0x13b:Eighteen months after the destruction +0x13c:of the Black Gate and the +0x13d:dismantling of The Fellowship +0x13e:My liege +0x13f:Yo, homes +0x140:All we found among Batlin's +0x141:belongings was this enchanted scroll... +0x142:and a map showing the way to +0x143:a place called the Serpent Isle. +0x144:Indeed. +0x145:Put it on the table. +0x146:Iree. Slap it down there! +0x147:Stand Back! +0x148:Jump Back! +0x149:Batlin! In the event that the +0x14a:Avatar destroys the Black Gate +0x14b:you shall follow the unwitting +0x14c:human Gwenno to the Serpent Isle +0x14d:There I shall outline my plan +0x14e:to destroy Britannia! +0x14f:Batlin! Know that my face is most +0x150:muppet like! +0x151:You must go to the Serpent Isl +0x152:to learn the secret of Acne Medication +0x153:Soon I and my horde of muppets will +0x154:destroy Britannia! +0x155:'Tis my worst fear! +0x156:I must send the Avatar through +0x157:the pillars to the Serpent Isle! +%%endsection msgs +%%section miscnames +0x0:a/black pearl//s +0x1:bloodmoss +0x2:a/nightshade//s +0x3:a/mandrake root//s +0x4:a/garlic//s +0x5:ginseng +0x6:spider silk +0x7:sulfurous ash +0x8:Ankh +0x9:Fellowship Medallion +0xa:locket +0xb:bread +0xc:bread +0xd:rolls +0xe:fruitcake +0xf:cake +0x10:pie +0x11:pastry +0x12:sausage +0x13:mutton +0x14:beef +0x15:fowl +0x16:ham +0x17:trout +0x18:flounder +0x19:meat +0x1a:dried meat +0x1b:apple +0x1c:bananas +0x1d:carrots +0x1e:grapes +0x1f:pumpkin +0x20:pumpkin +0x21:leeks +0x22:ribs +0x23:egg +0x24:butter +0x25:cheese +0x26:cheese +0x27:green cheese +0x28:potatoes +0x29:fish and chips +0x2a:silverleaf meal +0x2b:gold sextant +0x2c:sextant +0x2d:gavel +0x2e:quill +0x2f:inkwell +0x30:quill holder +0x31:book mark +0x32:letter opener +0x33:document +0x34:sealing wax +0x35:seal +0x36:blotter +0x37:parrot +0x38:abacus +0x39:sealing wax +0x3a:document +0x3b:quill +0x3c:quill +0x3d:mirror +0x3e:clacker +0x3f:clacker +0x40:clacker +0x41:bell +0x42:yourself +0x43:Boom! +0x44:"I have a bad feeling..." +0x45:Circle +0x46:First +0x47:Second +0x48:Third +0x49:Fourth +0x4a:Fifth +0x4b:Sixth +0x4c:Seventh +0x4d:Eighth +0x4e:map 1 +0x4f:map 2 +0x50:map 3 +0x51:map 4 +0x52:map 5 +0x53:map 6 +0x54:map 7 +0x55:map 8 +0x56:map 9 +0x57:silver tablet +0x58:silver fragment +0x59:Shrine of Compassion +0x5a:Shrine of Valor +0x5b:Shrine of Honesty +0x5c:Shrine of Justice +0x5d:Shrine of Humility +0x5e:Shrine of Sacrifice +0x5f:Shrine of Honor +0x60:Shrine of Spirituality +0x61:perch +0x62:Chuckles' ashes +0x63:fish +%%endsection miscnames diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/tfa.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/tfa.dat new file mode 100644 index 0000000..c7bd913 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/tfa.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/title_screen.shp b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/title_screen.shp new file mode 100644 index 0000000..bbfd77c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/title_screen.shp differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/title_shape.shp b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/title_shape.shp new file mode 100644 index 0000000..bbfd77c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/title_shape.shp differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7chunks b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7chunks new file mode 100644 index 0000000..b55f418 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7chunks differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7chunks.grp b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7chunks.grp new file mode 100644 index 0000000..d62685f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7chunks.grp differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix00 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix00 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix00 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix01 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix01 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix01 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix02 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix02 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix02 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix03 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix03 new file mode 100644 index 0000000..bff8340 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix03 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix04 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix04 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix04 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix05 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix05 new file mode 100644 index 0000000..410081a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix05 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix06 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix06 new file mode 100644 index 0000000..7c5f725 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix06 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix07 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix07 new file mode 100644 index 0000000..0fd10f9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix07 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix08 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix08 new file mode 100644 index 0000000..7bafbc6 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix08 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix09 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix09 new file mode 100644 index 0000000..cd82f33 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix09 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0a new file mode 100644 index 0000000..769e0cf Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0b new file mode 100644 index 0000000..3ac1633 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0c new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0d new file mode 100644 index 0000000..fcd4075 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0e new file mode 100644 index 0000000..9689104 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0f new file mode 100644 index 0000000..1da99ec Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix0f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix10 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix10 new file mode 100644 index 0000000..7ba43a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix10 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix11 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix11 new file mode 100644 index 0000000..4e2b5ff Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix11 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix12 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix12 new file mode 100644 index 0000000..e5fcc5c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix12 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix13 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix13 new file mode 100644 index 0000000..bad9652 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix13 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix14 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix14 new file mode 100644 index 0000000..1f0d84a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix14 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix15 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix15 new file mode 100644 index 0000000..5f2f9af Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix15 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix16 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix16 new file mode 100644 index 0000000..438ed46 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix16 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix17 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix17 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix17 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix18 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix18 new file mode 100644 index 0000000..ffb58d2 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix18 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix19 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix19 new file mode 100644 index 0000000..a781b8e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix19 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1a new file mode 100644 index 0000000..7645b23 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1b new file mode 100644 index 0000000..9a62350 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1c new file mode 100644 index 0000000..5a3a179 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1d new file mode 100644 index 0000000..c9f588a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1e new file mode 100644 index 0000000..6dc7df5 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1f new file mode 100644 index 0000000..ba3705a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix1f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix20 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix20 new file mode 100644 index 0000000..185767e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix20 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix21 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix21 new file mode 100644 index 0000000..853b883 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix21 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix22 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix22 new file mode 100644 index 0000000..debd6e5 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix22 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix23 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix23 new file mode 100644 index 0000000..ab60b29 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix23 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix24 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix24 new file mode 100644 index 0000000..64f0c89 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix24 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix25 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix25 new file mode 100644 index 0000000..edd78f9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix25 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix26 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix26 new file mode 100644 index 0000000..9898fbf Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix26 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix27 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix27 new file mode 100644 index 0000000..2a11642 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix27 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix28 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix28 new file mode 100644 index 0000000..2265a23 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix28 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix29 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix29 new file mode 100644 index 0000000..a071f6f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix29 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2a new file mode 100644 index 0000000..de28843 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2b new file mode 100644 index 0000000..11c82e1 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2c new file mode 100644 index 0000000..3ee319a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2d new file mode 100644 index 0000000..69a141a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2e new file mode 100644 index 0000000..c2b1ee1 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2f new file mode 100644 index 0000000..9f184ef Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix2f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix30 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix30 new file mode 100644 index 0000000..85bd493 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix30 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix31 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix31 new file mode 100644 index 0000000..bfeac76 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix31 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix32 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix32 new file mode 100644 index 0000000..ae3d63f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix32 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix33 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix33 new file mode 100644 index 0000000..f94ec9a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix33 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix34 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix34 new file mode 100644 index 0000000..35bebf8 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix34 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix35 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix35 new file mode 100644 index 0000000..0b96f6f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix35 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix36 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix36 new file mode 100644 index 0000000..7a1c236 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix36 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix37 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix37 new file mode 100644 index 0000000..8d0d20b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix37 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix38 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix38 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix38 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix39 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix39 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix39 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3a new file mode 100644 index 0000000..2769a47 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3b new file mode 100644 index 0000000..fd32e30 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3c new file mode 100644 index 0000000..91b2ee8 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3d new file mode 100644 index 0000000..2366397 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3e new file mode 100644 index 0000000..8698ba0 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix3e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix40 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix40 new file mode 100644 index 0000000..2d8c688 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix40 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix41 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix41 new file mode 100644 index 0000000..787d832 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix41 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix42 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix42 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix42 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix43 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix43 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix43 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix44 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix44 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix44 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix45 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix45 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix45 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix46 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix46 new file mode 100644 index 0000000..73c6129 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix46 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix47 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix47 new file mode 100644 index 0000000..7b7ee84 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix47 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix48 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix48 new file mode 100644 index 0000000..9250af7 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix48 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix49 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix49 new file mode 100644 index 0000000..3ede73f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix49 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4a new file mode 100644 index 0000000..f3d0e48 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4b new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4c new file mode 100644 index 0000000..cb1264a Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4d new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4e new file mode 100644 index 0000000..7f72646 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4f new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix4f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix50 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix50 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix50 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix51 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix51 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix51 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix52 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix52 new file mode 100644 index 0000000..d93752f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix52 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix53 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix53 new file mode 100644 index 0000000..68df63c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix53 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix54 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix54 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix54 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix55 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix55 new file mode 100644 index 0000000..1d768b9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix55 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix56 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix56 new file mode 100644 index 0000000..e20df3b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix56 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix57 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix57 new file mode 100644 index 0000000..0b2c651 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix57 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix58 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix58 new file mode 100644 index 0000000..ec95223 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix58 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix59 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix59 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix59 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5a new file mode 100644 index 0000000..a9741a2 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5b new file mode 100644 index 0000000..df02bd7 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5c new file mode 100644 index 0000000..a701bea Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5d new file mode 100644 index 0000000..8269bd7 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5e new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5f new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix5f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix60 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix60 new file mode 100644 index 0000000..0f72fb0 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix60 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix61 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix61 new file mode 100644 index 0000000..814aa41 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix61 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix62 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix62 new file mode 100644 index 0000000..79a211c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix62 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix63 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix63 new file mode 100644 index 0000000..6f7edb6 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix63 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix64 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix64 new file mode 100644 index 0000000..528f392 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix64 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix65 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix65 new file mode 100644 index 0000000..95df365 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix65 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix66 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix66 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix66 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix67 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix67 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix67 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix68 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix68 new file mode 100644 index 0000000..c7cb849 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix68 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix69 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix69 new file mode 100644 index 0000000..9229466 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix69 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6a new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6b new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6c new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6d new file mode 100644 index 0000000..c701cbb Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6e new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6f new file mode 100644 index 0000000..232fd0e Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix6f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix70 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix70 new file mode 100644 index 0000000..a21f3d7 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix70 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix71 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix71 new file mode 100644 index 0000000..e350fc2 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix71 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix72 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix72 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix72 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix73 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix73 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix73 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix74 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix74 new file mode 100644 index 0000000..e7abc1b Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix74 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix75 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix75 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix75 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix76 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix76 new file mode 100644 index 0000000..817bf30 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix76 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix77 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix77 new file mode 100644 index 0000000..7a0d0a6 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix77 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix78 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix78 new file mode 100644 index 0000000..daa1bb1 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix78 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix79 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix79 new file mode 100644 index 0000000..2f20884 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix79 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7a new file mode 100644 index 0000000..e6e491f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7b new file mode 100644 index 0000000..9ed73ed Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7c new file mode 100644 index 0000000..16e0bbb Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7d new file mode 100644 index 0000000..c1ebcff Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7e new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7f new file mode 100644 index 0000000..4b6ba0c Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix7f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix80 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix80 new file mode 100644 index 0000000..d3b797f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix80 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix81 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix81 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix81 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix82 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix82 new file mode 100644 index 0000000..b0119b3 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix82 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix83 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix83 new file mode 100644 index 0000000..4aac108 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix83 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix84 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix84 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix84 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix85 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix85 new file mode 100644 index 0000000..37ab106 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix85 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix86 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix86 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix86 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix87 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix87 new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix87 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix88 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix88 new file mode 100644 index 0000000..4fd50de Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix88 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix89 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix89 new file mode 100644 index 0000000..63a19c6 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix89 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8a b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8a new file mode 100644 index 0000000..ff6a555 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8a differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8b b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8b new file mode 100644 index 0000000..c36ece4 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8b differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8c b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8c new file mode 100644 index 0000000..9b6965f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8c differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8d b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8d new file mode 100644 index 0000000..0b25193 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8d differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8e b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8e new file mode 100644 index 0000000..3a92394 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8e differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8f b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8f new file mode 100644 index 0000000..3cea407 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ifix8f differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ireg68 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ireg68 new file mode 100644 index 0000000..86994f4 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ireg68 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ireg82 b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ireg82 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7ireg82 differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7map b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7map new file mode 100644 index 0000000..4b98582 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/u7map differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/usecode b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/usecode new file mode 100644 index 0000000..8142198 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/usecode differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/weapons.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/weapons.dat new file mode 100644 index 0000000..575595f Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/weapons.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/wgtvol.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/wgtvol.dat new file mode 100644 index 0000000..0ac0f67 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/wgtvol.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/wihh.dat b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/wihh.dat new file mode 100644 index 0000000..2b966c8 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/wihh.dat differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/zlib1.dll b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/zlib1.dll new file mode 100644 index 0000000..5d388d2 Binary files /dev/null and b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/patch/zlib1.dll differ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/readme.txt b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/readme.txt new file mode 100644 index 0000000..cea3230 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/readme.txt @@ -0,0 +1,32 @@ +Ultima 6 mod for Ultima 7: The Black Gate for Exult +---------------------- + +To install: + +If you are using the GOG version - you MUST set up your installation this way: Ultima7 folder with two subfolders, blackgate, and serpentisle (or whatever the exact Exult defaults are). Make sure you put a "mods" folder in there if it isn't there already. If there isn't a "mods" folder in the blackgate folder, make an empty one. Then put the Ultima6 folder into the mods folder with the cfg file. + +unzip into your Ultima7\blackgate\mods folder. Start a new game!! STRONGLY recommend having digital audio installed, digital music enabled, SFX pack - Sound Blaster, Speech disabled. This way you can hear the original u6 music which was added. Of course you need a copy of U7 BG installed, you can get it on gog.com and Exult latest snapshot (1.9). There are some issues with using Exult 1.8 and the mod... so PLEASE use 1.9 or it might act wonky! + + + +Version: + +v1.2 9/8/2024 - Tons of updates - the intro now includes the gypsy cutscene where you answer the Virtue questions and it determines your starting stats as in the original. Thariand of Moonglow will now teach magic for a price. Iolo's paperdoll looks younger. Ideal Dragon aka Dr Yazman has given us an updated pirate sprite for Leodon in Buccaneer's Den, looks great! Intro was tweaked to make it look nicer. Nicodemus now sells the Invisibilty All spell. Fixed a ton of bugs such as the duplicate Humility rune, Dale in Minoc's gem selling thread, and you should be able to sell back items to blacksmiths who also sell those items. Bees now have the proper equipment record (at some point a glitch caused the quality to change to 8). + +v1.1 - 5/10/2023 ***IMPORTANT**** Many bugs are associated with using 1.8, PLEASE USE VERSION 1.9 (whatever the latest snapshot is!)of Exult!!! Fixed numerous usecode bugs with dialogue (shopkeeper bugs and such) Boats are a little less buggy and should be fixed, especially the boat in Minoc that couldn't be reached normally. Fixed some conversation looping issues with Julia that would not allow you to get the panpipes if she already left the party, Chuckles, and several others. Can no longer get "Tseramed" to join. Fixed bug where Gwenno wouldnt join if Iolo was in the party. Secret doors in Wayfarer's inn, Rudyom's house and others are fixed (Bug where quality on some doors were changed to '8' for some reason, breaking things.) When arrested by guards and you refuse, all other guards in the area will be turned to combat mode instead of saying the same things. A timer bug was fixed in the Quenton / Michael quest that would randomly make you fail. Pridgarm now gives you the correct keys. You only get the key to the other cells if you were arrested and ask him for the key. Some shrines were allowing infinite training, that is fixed. Fixed an issue where Sherry couldn't "sit down" on a boat, causing some issues. I gave her a "sitting frame" so now she should "sit down" and the boat can now take off. The "Sherry won't talk to me" bug I think is because of using Exult 1.8. I *HIGHLY*!!!! recommend you use the latest Exult snapshot - there are things that were fixed after 1.8 that might cause problems with the mod on 1.8! + + + +v1.0 - Main plot, sidequests, most dungeons are playable. Only known issues is that sometimes when you die, it never fades from black and doesn't trigger. Save often! Probably some conversation bugs here and there which will be fixed along the way. Videos of sidequests will be released on youtube soon to provide a walkthrough of the added quests. + + +- U6 for Exult team : +agentorangeguy / TotalImmortal: agentorangeguy@yahoo.com, TotalImmortal#1860 Discord +Zygon Dragon +Pegbyter Dragon +Crowley +Archangel +Jaana's Curse + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/BrawlEngine.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/BrawlEngine.uc new file mode 100755 index 0000000..50b6c6a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/BrawlEngine.uc @@ -0,0 +1,652 @@ +//ADD TOURNA FLAGS, SFX, etc.... + + + //determine if brawlers are still brawling + var isBrawling (var npc) + { + if (UI_get_schedule_type(npc) == KID_GAMES) + return true; + else + return false; + + } + + + + + void BrawlEngineJhelom object#() () + { + //const int BRAWL_TIMER = 0; //sets Brawl timer if it's triggered outside of normal times (saying "rat" and so on). After 1 hour, will subside. + + var brawl_timer = UI_get_npc_id(ARVIN); //using npc Arvin for "brawl timer". His npc ID will be incremented each time the brawl engine is called + var hour = UI_game_hour(); + + var atk_frame1; + var atk_frame2; + var atk_frame3; + var bark; + + var brawl_sfx = [2, 3, 4, 5]; + var rand_num_sfx; + var rand_sfx; + + UI_set_schedule_type(CULHAM, KID_GAMES); + UI_set_schedule_type(STELNAR, KID_GAMES); + UI_set_schedule_type(JERRIS, KID_GAMES); + UI_set_schedule_type(NOMAAN, KID_GAMES); + UI_set_schedule_type(VANKELLIAN, KID_GAMES); + + + var attacking_frames = [SWING_1, SWING_2, SWING_3, SWING_2H_1, SWING_2H_2, SWING_2H_3, LEAN, KNEEL, LIE]; //1H and 2H swing frames + + var barks = ["Thou bastard!", "Oof!", "'twas a rat!", "'twas a mouse!", "Argh!", "Thou bloodied my lip!", "Have at thee!", "Take that!", "Thou dost hit like a girl!", "Ouch that hurt!!"]; + + var brawling_npcs = [STELNAR, JERRIS, VANKELLIAN, CULHAM, NOMAAN]; + var brawler; + + UI_error_message("Brawl engine engaged!"); + + //something to run the script off of + var table = UI_find_object(FIND_ON_SCREEN, 847, QUALITY_ANY, FRAME_ANY); + + //check to see if at least 1 brawler is nearby + if ((isNearby(STELNAR) || isNearby(JERRIS) || isNearby(VANKELLIAN) || isNearby(CULHAM) || isNearby(NOMAAN)) && gflags[BRAWLING]) + { + var rand_ticks = UI_get_random(6); + var rand2 = UI_get_random(6); + var rand_npc = UI_get_random(5); + var rand_npc2 = UI_get_random(5); + var rand_bark = UI_get_random(UI_get_array_size(barks)); + + // 3/10 chance stuff getting thrown around: + var something_thrown = UI_get_random(10); + if (something_thrown >= 7) + { + var rand_1 = UI_die_roll(0385, 0430); + var rand_2 = UI_die_roll(2561, 2574); + var rand_frame = UI_get_random(16); + var pos = [rand_1, rand_2]; + + //get current dish count: + var broken_dishes = UI_count_objects(FIND_ON_SCREEN, 546, QUALITY_ANY, FRAME_ANY); + var dish = UI_find_object(FIND_ON_SCREEN, 546, QUALITY_ANY, FRAME_ANY); + if (broken_dishes < 50) + { + var brokendish = UI_create_new_object(546); + brokendish->set_item_frame(rand_frame); + brokendish->set_item_flag(TEMPORARY); + UI_update_last_created([pos]); + UI_play_sound_effect(37); + } + else + UI_remove_item(dish); + } + + //add some barks for color: + var npc_to_bark = UI_get_random(6); + + switch (npc_to_bark) + { + case 1: + if (isNearby(LYSSANDRA)) + { + var lyssandra_barks = ["I just cleaned this place up!", "Watch it, ye oafs!", "Hey, that almost hit me!", "Take it outside, ya louts!", "What a mess!"]; + var npc_bark = UI_get_random(UI_get_array_size(barks)); + + //bark + UI_item_say(LYSSANDRA, lyssandra_barks[npc_bark]); + + } + break; + + case 2: + if (isNearby(HEFTIMUS) && UI_get_schedule_type(HEFTIMUS, EAT_AT_INN)) + { + + var heftimus_barks = ["Watch it, mateys!", "Don't make me cut ya!", "Who threw that bottle?!", "I'll keelhaul the lot of ye!", "Ye call this a fight?"]; + var npc_bark = UI_get_random(UI_get_array_size(barks)); + + //bark + UI_item_say(HEFTIMUS, heftimus_barks[npc_bark]); + + } + break; + + case 3: + if (isNearby(CULHAM)) + { + + var culham_barks = ["Hey, that didst hurt!", "Don't break my lute!", "It was a rat, I saw it!", "Don't punch so hard!", "Ow, my spleen!", "Not the face!"]; + var npc_bark = UI_get_random(UI_get_array_size(barks)); + + //bark + UI_item_say(CULHAM, culham_barks[npc_bark]); + + } + break; + + + case 4: + if (isNearby(STELNAR)) + { + + var stelnar_barks = ["T'was a mouse, Jerris!", "Take that!", "I'll cut you!", "Fight like a man, ya coward!", "Thou dost hit like a girl!", "My grandmother hits harder than you!"]; + var npc_bark = UI_get_random(UI_get_array_size(barks)); + + //bark + UI_item_say(STELNAR, stelnar_barks[npc_bark]); + + } + break; + + case 5: + if (isNearby(JERRIS)) + { + + var jerris_barks = ["@It was a rat, Stelnar!@", "@Watch the face!@", "@Ow!@", "@Eat fist!@", "@Thou dost hit like a girl!@", "You call that a punch?"]; + var npc_bark = UI_get_random(UI_get_array_size(barks)); + + //bark + UI_item_say(JERRIS, jerris_barks[npc_bark]); + + } + break; + + case 6: + if (isNearby(NOMAAN)) + { + + var nomaan_barks = ["@It was a rat, I saw it!@", "@Watch the face!@", "@Ow!@", "@No punching below the belt!@", "@Thou dost hit like a girl!@", "You call that a punch?", "Who threw the bottle?", "Come at me, wimpy man!"]; + var npc_bark = UI_get_random(UI_get_array_size(barks)); + + //bark + UI_item_say(NOMAAN, nomaan_barks[npc_bark]); + + } + break; + + + } + + + + var npc = brawling_npcs[rand_npc]; + + + //make sure both npcs aren't same + while (rand_npc == rand_npc2) + { + rand_npc2 = UI_get_random(5); + + } + var npc2 = brawling_npcs[rand_npc2]; + + UI_error_message("Rand1 is " + rand_ticks); + + if (isNearby(npc) && isBrawling(npc)) + { + var rand_ticks = UI_get_random(6); + + var rand2 = UI_get_random(6); + + rand_num_sfx = UI_get_random(UI_get_array_size(brawl_sfx)); + + rand_sfx = brawl_sfx[rand_num_sfx]; + + + + bark = barks[rand_bark]; + + if (rand2 == 1) + { + atk_frame1 = attacking_frames[1]; + atk_frame2 = attacking_frames[2]; + atk_frame3 = attacking_frames[3]; + + + } + else if (rand2 == 2) + { + atk_frame1 = attacking_frames[4]; + atk_frame2 = attacking_frames[5]; + atk_frame3 = attacking_frames[6]; + + } + + else if (rand2 == 3) + { + atk_frame1 = attacking_frames[7]; + atk_frame2 = attacking_frames[8]; + atk_frame3 = attacking_frames[9]; + + } + else if (rand2 == 4) + { + atk_frame1 = attacking_frames[2]; + atk_frame2 = attacking_frames[3]; + atk_frame3 = attacking_frames[8]; + + + } + else + { + atk_frame1 = attacking_frames[7]; + atk_frame2 = attacking_frames[4]; + atk_frame3 = attacking_frames[5]; + + } + + script npc after rand_ticks ticks + { + call GenericFreeze; + nohalt; + actor frame atk_frame1; + actor frame atk_frame2; + actor frame atk_frame3; + say bark; + sfx rand_sfx; + call GenericUnfreeze; + }; + + ///npc 2 + + rand2 = UI_get_random(6); //reroll + rand_bark = UI_get_random(UI_get_array_size(barks)); + bark = barks[rand_bark]; + + rand_num_sfx = UI_get_random(UI_get_array_size(brawl_sfx)); + rand_sfx = brawl_sfx[rand_num_sfx]; + + + if (rand2 == 1) + { + atk_frame1 = attacking_frames[1]; + atk_frame2 = attacking_frames[2]; + atk_frame3 = attacking_frames[3]; + + + } + else if (rand2 == 2) + { + atk_frame1 = attacking_frames[4]; + atk_frame2 = attacking_frames[5]; + atk_frame3 = attacking_frames[6]; + + } + + else if (rand2 == 3) + { + atk_frame1 = attacking_frames[7]; + atk_frame2 = attacking_frames[8]; + atk_frame3 = attacking_frames[9]; + + } + else if (rand2 == 4) + { + atk_frame1 = attacking_frames[2]; + atk_frame2 = attacking_frames[3]; + atk_frame3 = attacking_frames[8]; + + + } + else + { + atk_frame1 = attacking_frames[7]; + atk_frame2 = attacking_frames[4]; + atk_frame3 = attacking_frames[5]; + + } + + script npc2 after rand_ticks + 5 ticks + { + call GenericFreeze; + nohalt; + actor frame atk_frame1; + actor frame atk_frame2; + actor frame atk_frame3; + sfx rand_sfx; + say bark; + call GenericUnfreeze; + }; + + + + } + + + // increment brawl timer if time is not within the 9pm to midnight range. + // if it's during the normal brawl hours we don't want the flag to reset + if (hour < 20) + { + UI_set_npc_id(ARVIN, brawl_timer + 1); //should increment by 1 + + } + + script table after 30 ticks + { + call BrawlEngineJhelom; + + + }; + + } + else //no brawlers nearby + { + UI_error_message("No Jhelom brawlers detected nearby, turn off brawl engine."); + gflags[BRAWLING] = false; + UI_play_music(255, 0); + + //reset 'brawl timer' + UI_set_npc_id(ARVIN, 0); + + } + + //people stopped brawling, turn off "Brawling" flag + if (brawl_timer > 30) //brawl has been going on for past a half hour + { + gflags[BRAWLING] = false; + UI_play_music(255, 0); + UI_error_message("Timer expired, turning off Brawling flag"); + + //reset 'brawl timer' + UI_set_npc_id(ARVIN, 0); + + } + } + + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + void BrawlEngineBucsDen object#() () + { + var hour = UI_game_hour(); + var atk_frame1; + var atk_frame2; + var atk_frame3; + var bark; + + var brawl_sfx = [2, 3, 4, 5]; + var rand_num_sfx; + var rand_sfx; + + var attacking_frames = [SWING_1, SWING_2, SWING_3, SWING_2H_1, SWING_2H_2, SWING_2H_3, LEAN, KNEEL, LIE]; //1H and 2H swing frames + + var barks = ["Thou bastard!", "Oof!", "I'll keelhaul the lot of ye!", "Eat fist!", "Argh!", "Thou bloodied my lip!", "Have at thee!", "Take that!", "Thou dost hit like a girl!", "Yar, that hurt!"]; + + var brawling_npcs = [CAPTAIN_FOX, CAPTAIN_ELAD, ENRIK, LEONNA, LEODON]; + var brawler; + + UI_error_message("Brawl engine engaged!"); + + //something to run the script off of + //var table = UI_find_object(FIND_ON_SCREEN, 964, QUALITY_ANY, FRAME_ANY); + var table = UI_find_nearby(AVATAR, 964, 31, MASK_NONE); + //table found and time is within midnight to 3am: + if ((table) && hour >= 0 && hour <= 3) + { + //check to see if at least 1 brawler is nearby + if ((isNearby(CAPTAIN_FOX) || isNearby(CAPTAIN_ELAD) || isNearby(ENRIK) || isNearby(LEONNA) || isNearby(LEODON))) + { + var rand_ticks = UI_get_random(6); + var rand2 = UI_get_random(6); + var rand_npc = UI_get_random(UI_get_array_size([brawling_npcs])); + var rand_npc2 = UI_get_random(UI_get_array_size([brawling_npcs])); + var rand_bark = UI_get_random(UI_get_array_size(barks)); + + // 3/10 chance stuff getting thrown around: + var something_thrown = UI_get_random(10); + if (something_thrown >= 7) + { + var rand_1 = UI_die_roll(1729, 1763); + var rand_2 = UI_die_roll(1847, 1868); + var rand_frame = UI_get_random(16); + var pos = [rand_1, rand_2]; + + //get current dish count: + var broken_dishes = UI_count_objects(FIND_ON_SCREEN, 546, QUALITY_ANY, FRAME_ANY); + var dish = UI_find_object(FIND_ON_SCREEN, 546, QUALITY_ANY, FRAME_ANY); + if (broken_dishes < 50) + { + var brokendish = UI_create_new_object(546); + brokendish->set_item_frame(rand_frame); + brokendish->set_item_flag(TEMPORARY); + UI_update_last_created([pos]); + UI_play_sound_effect(37); + } + else + UI_remove_item(dish); + } + + //add some barks for color: + var npc_to_bark = UI_get_random(UI_get_array_size([brawling_npcs])); + + switch (npc_to_bark) + { + case 1: + if (isNearby(CAPTAIN_FOX)) + { + var fox_barks = ["Thou bastard!", "Oof!", "I'll keelhaul the lot of ye!", "Eat fist!", "Argh!", "Thou bloodied my lip!", "Have at thee!", "Take that!", "Thou dost hit like a girl!", "Yar, that hurt!"]; + var npc_bark = UI_get_random(UI_get_array_size(barks)); + + //bark + UI_item_say(CAPTAIN_FOX, fox_barks[npc_bark]); + + } + break; + + case 2: + case 3: + if (isNearby(LEONNA)) + { + + var leonna_barks = ["Hey, that didst hurt!", "Ooof!", "Eat fist!", "Don't punch so hard!", "Who threw that?!", "Not the face!"]; + var npc_bark = UI_get_random(UI_get_array_size(barks)); + + //bark + UI_item_say(LEONNA, leonna_barks[npc_bark]); + + } + break; + + + case 4: + + case 5: + if (isNearby(CAPTAIN_ELAD)) + { + + var elad_barks = ["Don't spill my tea!", "Who threw that bottle?!", "I'll cut you!", "Fight like a man, ya coward!", "Thou dost hit like a girl!", "Me grandmother hits harder than you!", "Yar, that hurt!"]; + var npc_bark = UI_get_random(UI_get_array_size(barks)); + + //bark + UI_item_say(CAPTAIN_ELAD, elad_barks[npc_bark]); + + } + break; + + case 6: + if (isNearby(LEODON)) + { + + var leodon_barks = ["@You call that a punch?@", "@Ooof!@", "@Ow!@", "@I'll keelhaul ye!@", "@Bilgerat!@", "You call that a punch?", "Who threw the bottle?", "Come at me, wimpy man!"]; + var npc_bark = UI_get_random(UI_get_array_size(barks)); + + //bark + UI_item_say(LEODON, leodon_barks[npc_bark]); + + } + break; + + + } + + + + var npc = brawling_npcs[rand_npc]; + + + //make sure both npcs aren't same + while (rand_npc == rand_npc2) + { + rand_npc2 = UI_get_random(UI_get_array_size([brawling_npcs])); + + } + var npc2 = brawling_npcs[rand_npc2]; + + UI_error_message("Rand1 is " + rand_ticks); + + if (isNearby(npc) && UI_get_schedule_type(npc, KID_GAMES)) + { + var rand_ticks = UI_get_random(UI_get_array_size([brawling_npcs])); + + var rand2 = UI_get_random(UI_get_array_size([brawling_npcs])); + + rand_num_sfx = UI_get_random(UI_get_array_size(brawl_sfx)); + + rand_sfx = brawl_sfx[rand_num_sfx]; + + + + bark = barks[rand_bark]; + + if (rand2 == 1) + { + atk_frame1 = attacking_frames[1]; + atk_frame2 = attacking_frames[2]; + atk_frame3 = attacking_frames[3]; + + + } + else if (rand2 == 2) + { + atk_frame1 = attacking_frames[4]; + atk_frame2 = attacking_frames[5]; + atk_frame3 = attacking_frames[6]; + + } + + else if (rand2 == 3) + { + atk_frame1 = attacking_frames[7]; + atk_frame2 = attacking_frames[8]; + atk_frame3 = attacking_frames[9]; + + } + else if (rand2 == 4) + { + atk_frame1 = attacking_frames[2]; + atk_frame2 = attacking_frames[3]; + atk_frame3 = attacking_frames[8]; + + + } + else + { + atk_frame1 = attacking_frames[7]; + atk_frame2 = attacking_frames[4]; + atk_frame3 = attacking_frames[5]; + + } + + script npc after rand_ticks ticks + { + call GenericFreeze; + nohalt; + actor frame atk_frame1; + actor frame atk_frame2; + actor frame atk_frame3; + say bark; + sfx rand_sfx; + call GenericUnfreeze; + }; + + ///npc 2 + + rand2 = UI_get_random(UI_get_array_size([brawling_npcs])); //reroll + rand_bark = UI_get_random(UI_get_array_size(barks)); + bark = barks[rand_bark]; + + rand_num_sfx = UI_get_random(UI_get_array_size(brawl_sfx)); + rand_sfx = brawl_sfx[rand_num_sfx]; + + + if (rand2 == 1) + { + atk_frame1 = attacking_frames[1]; + atk_frame2 = attacking_frames[2]; + atk_frame3 = attacking_frames[3]; + + + } + else if (rand2 == 2) + { + atk_frame1 = attacking_frames[4]; + atk_frame2 = attacking_frames[5]; + atk_frame3 = attacking_frames[6]; + + } + + else if (rand2 == 3) + { + atk_frame1 = attacking_frames[7]; + atk_frame2 = attacking_frames[8]; + atk_frame3 = attacking_frames[9]; + + } + else if (rand2 == 4) + { + atk_frame1 = attacking_frames[2]; + atk_frame2 = attacking_frames[3]; + atk_frame3 = attacking_frames[8]; + + + } + else + { + atk_frame1 = attacking_frames[7]; + atk_frame2 = attacking_frames[4]; + atk_frame3 = attacking_frames[5]; + + } + + script npc2 after rand_ticks + 5 ticks + { + call GenericFreeze; + nohalt; + actor frame atk_frame1; + actor frame atk_frame2; + actor frame atk_frame3; + sfx rand_sfx; + say bark; + call GenericUnfreeze; + }; + + + + } + + script table after 25 ticks + { + call BrawlEngineBucsDen; + + + }; + + } + else //no brawlers nearby + { + + UI_error_message("No brawlers nearby, abort"); + abort; + } + } + else //left area or time isn't right + { + UI_error_message("Table not found or time is not early morning. Stop Bucs Den brawling"); + abort; + + } + + } + + + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/Crypts.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/Crypts.uc new file mode 100755 index 0000000..ede4d31 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/Crypts.uc @@ -0,0 +1,103 @@ +//30 ticks per minute +enum moonglow_crypts + +{ + GOT_RUNE = 1, + WALK_OUTSIDE = 2, + GUARD_TALK = 3 + + +}; + +void getRuneHonesty object#() () +{ + + var party = UI_get_party_list(); + + if (event == GOT_RUNE) + { + AVATAR->GenericUnfreeze(); + if (party > 1) + { + randomPartyBark("@We have the rune, let's go.@"); + script AVATAR after 5 ticks + { + call getRuneHonesty, WALK_OUTSIDE; + }; + } + else script AVATAR after 15 ticks { call getRuneHonesty, WALK_OUTSIDE;}; + + } + + if (event == WALK_OUTSIDE) + { + THUG1->clear_item_flag(DONT_RENDER); + THUG2->clear_item_flag(DONT_RENDER); + THUG3->clear_item_flag(DONT_RENDER); + THUG4->clear_item_flag(DONT_RENDER); + THUG5->clear_item_flag(DONT_RENDER); + THUG6->clear_item_flag(DONT_RENDER); + THUG7->clear_item_flag(DONT_RENDER); + + if (inParty(SHAMINO)) + delayedBark(SHAMINO, "@Ambush!@" , 10); + + + UI_si_path_run_usecode(AVATAR, [2344, 2968]); + script THUG1 after 25 ticks + { + call getRuneHonesty, GUARD_TALK; + }; + + } + if (event == GUARD_TALK) + { + AVATAR->GenericUnfreeze(); + var polite_title = getPoliteTitle(); + //UI_show_npc_face(259, 0); + THUG1.say("Approaching from seemingly out of nowhere, an unsavoury-looking guard stands before you. His henchmen take up positions, blocking all routes of escape."); + THUG1.say("@We been waitin' to break into that vault for a while now. As luck would have it, thou didst come along with a key to open the door.@"); + THUG1.say("He notices you clutching the Rune of Honesty."); + THUG1.say("@Say.. that be quite a trinket thou'rt carrying. T'would fetch us fair price on the antiquities market. Much too valuable for the likes of ye...@"); + if (inParty(SHAMINO)) + { + SHAMINO.say("Noticing the rogue guard's henchmen slowly closing in, Shamino leans towards you and whispers. @Careful " + polite_title + ", these grave-robbers have us surrounded...@"); + SHAMINO.say("Shamino clutches his weapon, never once keeping his eyes off the bandits."); + SHAMINO.hide(); + } + THUG1.say("@Well " + polite_title + ", it is thy lucky day. Hand over that artifact and we won't kill ye.@"); + if (inParty(DUPRE)) + { + DUPRE.say("@Knave, the Avatar will not give in to such a request from a petty criminal such as thyself!@"); + DUPRE.hide(); + } + THUG1.say("@What will it be?@"); + if (askYesNo()) + { + THUG1.say("Seeing you pull out the rune, they attack anyway!"); + subtractKarma(10); //cowardly! + + } + else + { + AVATAR.say("You put the rune into your pack and draw your weapon, declining the rogue's request."); + THUG1.say("The rogue guard scoffs, as if he actually expected you to hand over the Rune."); + THUG1.say("@Suits thyself. Prepare to join these unfortunate souls in the abyss...@"); + } + UI_set_schedule_type(THUG1, IN_COMBAT); + UI_set_schedule_type(THUG2, IN_COMBAT); + UI_set_schedule_type(THUG3, IN_COMBAT); + UI_set_schedule_type(THUG4, IN_COMBAT); + UI_set_schedule_type(THUG5, IN_COMBAT); + UI_set_schedule_type(THUG6, IN_COMBAT); + UI_set_schedule_type(THUG7, IN_COMBAT); + + delayedBark(item, "To the death!", 3); + + + return; + + + + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/GetValorRune.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/GetValorRune.uc new file mode 100755 index 0000000..1454ded --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/GetValorRune.uc @@ -0,0 +1,320 @@ + +void SherryGetRune object# () () +{ + var party = UI_get_party_list(); + var npc; + + //set flag to prevent Sher-nanigans + gflags[AVATAR_IS_SHERRY] = true; + + + //get Avatar and Sherry's location + var SherryPos = UI_get_object_position(SHERRY); + var AvatarPos = UI_get_object_position(AVATAR); + + //find position of path egg to "store" Avatar's location + var PathEgg = UI_find_object(FIND_ON_SCREEN, 607, QUALITY_ANY, FRAME_ANY); + var PathEggPos = UI_get_object_position(PathEgg); + + //get Avatar's attributes: + var AvatarName = getAvatarName(); + var AvatarStr = UI_get_npc_prop(UI_get_avatar_ref(), STRENGTH); + var AvatarDex = UI_get_npc_prop(UI_get_avatar_ref(), DEXTERITY); + var AvatarInt = UI_get_npc_prop(UI_get_avatar_ref(), INTELLIGENCE); + var AvatarCombat = UI_get_npc_prop(UI_get_avatar_ref(), COMBAT); + var AvatarMagic = UI_get_npc_prop(UI_get_avatar_ref(), MAX_MANA); + var AvatarHits = UI_get_npc_prop(UI_get_avatar_ref(), HEALTH); + var AvatarMana = UI_get_npc_prop(UI_get_avatar_ref(), MANA); + var AvatarExp = UI_get_npc_prop(UI_get_avatar_ref(), EXPERIENCE); + var AvatarTraining = UI_get_npc_prop(UI_get_avatar_ref(), TRAINING); + var AvatarFood = UI_get_npc_prop(UI_get_avatar_ref(), FOODLEVEL); + var AvatarShape = UI_get_item_shape(AVATAR); + + //get Sherry's attributes + var SherryStr = UI_get_npc_prop(SHERRY, STRENGTH); + var SherryDex = UI_get_npc_prop(SHERRY, DEXTERITY); + var SherryInt = UI_get_npc_prop(SHERRY, INTELLIGENCE); + var SherryCombat = UI_get_npc_prop(SHERRY, COMBAT); + var SherryMagic = UI_get_npc_prop(SHERRY, MAX_MANA); + var SherryHits = UI_get_npc_prop(SHERRY, HEALTH); + var SherryMana = UI_get_npc_prop(SHERRY, MANA); + var SherryExp = UI_get_npc_prop(SHERRY, EXPERIENCE); + var SherryTraining = UI_get_npc_prop(SHERRY, TRAINING); + var SherryFood = UI_get_npc_prop(SHERRY, FOODLEVEL); + + //set GENRICSHRINE's experience to Sherry's as a place holder + GENERICSHRINE->set_npc_prop(EXPERIENCE, SherryExp*2); //npc 255 MAMA + + //set "HolderGuy"'s name and stats to Avatar's + var HolderGuyName = getAvatarName(); + + UI_set_item_shape(HOLDERGUY, AvatarShape); //should set HolderGuy to Avatar shape. + UI_set_npc_prop(HOLDERGUY, STRENGTH, AvatarStr); + UI_set_npc_prop(HOLDERGUY, DEXTERITY, AvatarDex); + UI_set_npc_prop(HOLDERGUY, INTELLIGENCE, AvatarInt); + UI_set_npc_prop(HOLDERGUY, COMBAT, AvatarCombat); + UI_set_npc_prop(HOLDERGUY, MAX_MANA, AvatarMagic); + UI_set_npc_prop(HOLDERGUY, HEALTH, AvatarHits); + UI_set_npc_prop(HOLDERGUY, MANA, AvatarMana); + UI_set_npc_prop(HOLDERGUY, EXPERIENCE, AvatarExp*2); + UI_set_npc_name(HOLDERGUY, AvatarName); + UI_set_npc_prop(HOLDERGUY, FOODLEVEL, AvatarFood); + + UI_set_npc_prop(BLORN, TRAINING, AvatarTraining); //to avoid extra training points, NPC is 208 - Blorn + + //Get HolderGuys's new Avatar stats + var HolderGuyStr = UI_get_npc_prop(HOLDERGUY, STRENGTH); + var HolderGuyDex = UI_get_npc_prop(HOLDERGUY, DEXTERITY); + var HolderGuyInt = UI_get_npc_prop(HOLDERGUY, INTELLIGENCE); + var HolderGuyCombat = UI_get_npc_prop(HOLDERGUY, COMBAT); + var HolderGuyMagic = UI_get_npc_prop(HOLDERGUY, MAX_MANA); + var HolderGuyHits = UI_get_npc_prop(HOLDERGUY, HEALTH); + var HolderGuyMana = UI_get_npc_prop(HOLDERGUY, MANA); + var HolderGuyExp = UI_get_npc_prop(HOLDERGUY, EXPERIENCE); + var HolderGuyTraining = UI_get_npc_prop(HOLDERGUY, TRAINING); + var HolderGuyFood = UI_get_npc_prop(HOLDERGUY, FOODLEVEL); + + var BlornTraining = UI_get_npc_prop(BLORN, TRAINING); //npc 255 + + //Transfer Avatar's inventory to Holder Guy npc # 250 + //Transfer Sherry's inventory to Avatar + //transfer HolderGuy's inventory to Sherry + transferAllItems(AVATAR, HOLDERGUY); + transferAllItems(SHERRY, AVATAR); + transferAllItems(HOLDERGUY, SHERRY); + + + + + + //swap names, shape, attributes with Sherry + +// ****Commented out, paperdolls don't switch upon polymorph. Using shape change instead. + AVATAR->set_polymorph(478); //Sherry shape +// SHERRY->set_polymorph(AvatarShape); //stored by HolderGuy + +// AVATAR->set_item_shape(478); //Sherry shape + SHERRY->set_item_shape(AvatarShape); //stored by HolderGuy + + AVATAR->set_npc_name("Sherry"); + SHERRY->set_npc_name(HolderGuyName); + + AVATAR->set_npc_prop(STRENGTH, SherryStr-HolderGuyStr); + SHERRY->set_npc_prop(STRENGTH, HolderGuyStr-SherryStr); + + AVATAR->set_npc_prop(DEXTERITY, SherryDex-HolderGuyDex); + SHERRY->set_npc_prop(DEXTERITY, HolderGuyDex-SherryDex); + + AVATAR->set_npc_prop(INTELLIGENCE, SherryInt-HolderGuyInt); + SHERRY->set_npc_prop(INTELLIGENCE, HolderGuyInt-SherryInt); + + AVATAR->set_npc_prop(COMBAT, SherryCombat-HolderGuyCombat); + SHERRY->set_npc_prop(COMBAT, HolderGuyCombat-SherryCombat); // + + AVATAR->set_npc_prop(MAX_MANA, SherryMagic-HolderGuyMagic); // + SHERRY->set_npc_prop(MAX_MANA, HolderGuyMagic-SherryMagic); // + + AVATAR->set_npc_prop(HEALTH, SherryHits-HolderGuyHits); // + SHERRY->set_npc_prop(HEALTH, HolderGuyHits-SherryHits); // + + AVATAR->set_npc_prop(MANA, SherryMana-HolderGuyMana); // + SHERRY->set_npc_prop(MANA, HolderGuyMana-SherryMana); // + + AVATAR->set_npc_prop(EXPERIENCE, (SherryExp-HolderGuyExp)*2); // Exult adds Half of number used, so multiplying by 2 gives correct XP + SHERRY->set_npc_prop(EXPERIENCE, (HolderGuyExp-SherryExp)*2); // + + + //get Sherry new training + var SherryNewTrain = UI_get_npc_prop(SHERRY, TRAINING); + var AvatarNewTrain = UI_get_npc_prop(AVATAR, TRAINING); + + + AVATAR->set_npc_prop(FOODLEVEL, SherryFood-HolderGuyFood); + SHERRY->set_npc_prop(FOODLEVEL, HolderGuyFood-SherryFood); + + AVATAR->set_npc_prop(TRAINING, -SherryNewTrain); //zero out incorrect training points + SHERRY->set_npc_prop(TRAINING, -SherryNewTrain); // + + AVATAR->set_npc_prop(TRAINING, SherryTraining); //add correct training points + SHERRY->set_npc_prop(TRAINING, BlornTraining); // + + + //swap Sherry and Avatar locations + PathEgg->move_object(AvatarPos); + AVATAR->move_object(SherryPos); + SHERRY->move_object(AvatarPos); //should be path egg pos but for testing + + //Freeze party + for (npc in party with index to max) + { + npc->set_schedule_type(WAIT); + npc->set_item_flag(DEAD); //to prevent Sherry from speaking to the party + } + AVATAR->clear_item_flag(DEAD); //Don't want Avatar dead.. + +} + + +void UndoSherrySwap object# () () +{ + + var party = UI_get_party_list(); + var npc; + + + //clear flag to prevent Sher-nanigans + gflags[AVATAR_IS_SHERRY] = false; + + //get Avatar and Sherry's location + var SherryPos = UI_get_object_position(SHERRY); + var AvatarPos = UI_get_object_position(AVATAR); + + + //find position of path egg to "store" Avatar's location + var PathEgg = UI_find_object(FIND_ON_SCREEN, 607, QUALITY_ANY, FRAME_ANY); + var PathEggPos = UI_get_object_position(PathEgg); + + + //get Avatar's attributes: + var AvatarName = getAvatarName(); + var AvatarStr = UI_get_npc_prop(UI_get_avatar_ref(), STRENGTH); + var AvatarDex = UI_get_npc_prop(UI_get_avatar_ref(), DEXTERITY); + var AvatarInt = UI_get_npc_prop(UI_get_avatar_ref(), INTELLIGENCE); + var AvatarCombat = UI_get_npc_prop(UI_get_avatar_ref(), COMBAT); + var AvatarMagic = UI_get_npc_prop(UI_get_avatar_ref(), MAX_MANA); + var AvatarHits = UI_get_npc_prop(UI_get_avatar_ref(), HEALTH); + var AvatarMana = UI_get_npc_prop(UI_get_avatar_ref(), MANA); + var AvatarExp = UI_get_npc_prop(UI_get_avatar_ref(), EXPERIENCE); + var AvatarTraining = UI_get_npc_prop(UI_get_avatar_ref(), TRAINING); + var AvatarFood = UI_get_npc_prop(UI_get_avatar_ref(), FOODLEVEL); + + //get Sherry's attributes + var SherryStr = UI_get_npc_prop(SHERRY, STRENGTH); + var SherryDex = UI_get_npc_prop(SHERRY, DEXTERITY); + var SherryInt = UI_get_npc_prop(SHERRY, INTELLIGENCE); + var SherryCombat = UI_get_npc_prop(SHERRY, COMBAT); + var SherryMagic = UI_get_npc_prop(SHERRY, MAX_MANA); + var SherryHits = UI_get_npc_prop(SHERRY, HEALTH); + var SherryMana = UI_get_npc_prop(SHERRY, MANA); + var SherryExp = UI_get_npc_prop(SHERRY, EXPERIENCE); + var SherryTraining = UI_get_npc_prop(SHERRY, TRAINING); + var SherryFood = UI_get_npc_prop(SHERRY, FOODLEVEL); + + //set "HolderGuy"'s name and stats to Avatar's + + var AvatarShape = UI_get_item_shape(HOLDERGUY); + var HolderGuyName = UI_get_npc_name(HOLDERGUY); + + //Get HolderGuys's new Avatar stats + var HolderGuyStr = UI_get_npc_prop(HOLDERGUY, STRENGTH); + var HolderGuyDex = UI_get_npc_prop(HOLDERGUY, DEXTERITY); + var HolderGuyInt = UI_get_npc_prop(HOLDERGUY, INTELLIGENCE); + var HolderGuyCombat = UI_get_npc_prop(HOLDERGUY, COMBAT); + var HolderGuyMagic = UI_get_npc_prop(HOLDERGUY, MAX_MANA); + var HolderGuyHits = UI_get_npc_prop(HOLDERGUY, HEALTH); + var HolderGuyMana = UI_get_npc_prop(HOLDERGUY, MANA); + var HolderGuyExp = UI_get_npc_prop(HOLDERGUY, EXPERIENCE); + var HolderGuyTraining = UI_get_npc_prop(HOLDERGUY, TRAINING); + var HolderGuyFood = UI_get_npc_prop(HOLDERGUY, FOODLEVEL); + + var GenericShrineExp = UI_get_npc_prop(GENERICSHRINE, EXPERIENCE); //Sherry's XP Place holder + + var BlornTraining = UI_get_npc_prop(BLORN, TRAINING); //npc 255 + + + + //reset shapes + SHERRY->set_item_shape(478); //Sherry shape + //AVATAR->set_item_shape(AvatarShape); //stored by HolderGuy + UI_clear_item_flag(AVATAR, POLYMORPH); //to accurately change Avatar's shape back + + UI_set_npc_name(AVATAR, HolderGuyName); + SHERRY->set_npc_name("Sherry"); + + SHERRY->set_npc_prop(STRENGTH, -SherryStr); //zero out first + SHERRY->set_npc_prop(STRENGTH, AvatarStr); //add Sherry's back + AVATAR->set_npc_prop(STRENGTH, -AvatarStr); //zero out + AVATAR->set_npc_prop(STRENGTH, HolderGuyStr); //add HolderGuy's str + + SHERRY->set_npc_prop(DEXTERITY, -SherryDex); //zero out first + SHERRY->set_npc_prop(DEXTERITY, AvatarDex); //add Sherry's back + AVATAR->set_npc_prop(DEXTERITY, -AvatarDex); //zero out + AVATAR->set_npc_prop(DEXTERITY, HolderGuyDex); //add HolderGuy's str + + SHERRY->set_npc_prop(INTELLIGENCE, -SherryInt); //zero out first + SHERRY->set_npc_prop(INTELLIGENCE, AvatarInt); //add Sherry's back + AVATAR->set_npc_prop(INTELLIGENCE, -AvatarInt); //zero out + AVATAR->set_npc_prop(INTELLIGENCE, HolderGuyInt); //add HolderGuy's Int + + SHERRY->set_npc_prop(COMBAT, -SherryCombat); //zero out first + SHERRY->set_npc_prop(COMBAT, AvatarCombat); //add Sherry's back + AVATAR->set_npc_prop(COMBAT, -AvatarCombat); //zero out + AVATAR->set_npc_prop(COMBAT, HolderGuyCombat); //add HolderGuy's Combat + + SHERRY->set_npc_prop(MAX_MANA, -SherryMagic); //zero out first + SHERRY->set_npc_prop(MAX_MANA, AvatarMagic); //add Sherry's back + AVATAR->set_npc_prop(MAX_MANA, -AvatarMagic); //zero out + AVATAR->set_npc_prop(MAX_MANA, HolderGuyMagic); //add HolderGuy's Magic + + SHERRY->set_npc_prop(HEALTH, -SherryHits); //zero out first + SHERRY->set_npc_prop(HEALTH, AvatarHits); //add Sherry's back + AVATAR->set_npc_prop(HEALTH, -AvatarHits); //zero out + AVATAR->set_npc_prop(HEALTH, HolderGuyHits); //add HolderGuy's Hits + + SHERRY->set_npc_prop(MANA, -SherryMana); //zero out first + SHERRY->set_npc_prop(MANA, AvatarMana); //add Sherry's back + AVATAR->set_npc_prop(MANA, -AvatarMana); //zero out + AVATAR->set_npc_prop(MANA, HolderGuyMana); //add HolderGuy's Mana + + //Zero out EXP and re-add + + SHERRY->set_npc_prop(EXPERIENCE, -SherryExp*2); //testing purpose - Sherry's STR is 5 + AVATAR->set_npc_prop(EXPERIENCE, -AvatarExp*2); //testing purposes - Avatar STR is 18 + + SHERRY->set_npc_prop(EXPERIENCE, GenericShrineExp*2); //testing purpose - Sherry's STR is 5 + AVATAR->set_npc_prop(EXPERIENCE, HolderGuyExp*2); //testing purposes - Avatar STR is 18 + + //get Sherry new training + var SherryNewTrain = UI_get_npc_prop(SHERRY, TRAINING); + var AvatarNewTrain = UI_get_npc_prop(AVATAR, TRAINING); + + + SHERRY->set_npc_prop(FOODLEVEL, SherryFood-HolderGuyFood); //testing purposes - Avatar STR is 18 + AVATAR->set_npc_prop(FOODLEVEL, HolderGuyFood-SherryFood); //testing purpose - Sherry's STR is 5 + + SHERRY->set_npc_prop(TRAINING, -SherryNewTrain); //zero out incorrect training points + AVATAR->set_npc_prop(TRAINING, -AvatarNewTrain); // + + SHERRY->set_npc_prop(TRAINING, SherryTraining); //need to make holder training points for Sherry + AVATAR->set_npc_prop(TRAINING, BlornTraining); // Using new npc 255 + + + //swap Sherry and Avatar locations + PathEgg->move_object(SherryPos); + SHERRY->move_object(AvatarPos); + AVATAR->move_object(SherryPos); //should be path egg pos but for testing + + //Transfer Avatar's inventory to Holder Guy npc # 250 + //Transfer Sherry's inventory to Avatar + //transfer HolderGuy's inventory to Sherry + transferAllItems(AVATAR, HOLDERGUY); + transferAllItems(SHERRY, AVATAR); + transferAllItems(HOLDERGUY, SHERRY); + + + + + + //UnFreeze party + for (npc in party with index to max) + { + npc->set_schedule_type(STANDTHERE); + npc->clear_item_flag(DEAD); //to prevent Sherry from speaking to the party + + } + //Set global flag to prevent Sherry switch again. + gflags[GOT_VALOR_RUNE] = true; + + +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/Glen_cremation.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/Glen_cremation.uc new file mode 100755 index 0000000..f8e48ef --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/Glen_cremation.uc @@ -0,0 +1,387 @@ +/* + * Copyright 2018 Scott Cooper + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + +/* + * This is a cremation function for Glen the Undertaker in U6. + * + * 2018-12-23 Knight Captain + */ + +void greenCremation object#(0x9D6) () +{ + var body_400_frames; + var body_402_frames; + var body_414_frames; + var body_507_frames; + var body_762_frames; + var body_892_frames; + var total_count; + var body_count; + var each; + var body_400_shape; + var body_402_shape; + var body_414_shape; + var body_507_shape; + var body_762_shape; + var body_892_shape; + var bodies; + var index; + var max; + var frame; + var frame_index; + var frame_max; + var valid_bodies; + + const int SHAPE_BODY1 = 400; + const int SHAPE_BODY2 = 414; + const int SHAPE_BODY3 = 762; + const int SHAPE_BODY4 = 892; //need to limit by frames + var body_frames4 = [1, 2, 3, 4, 5, 6, 7, 10, 11, 29]; + const int SHAPE_BODY5 = 1140; + + + UI_error_message(""); // Blank line. + UI_error_message("greenCremation starting."); + + /////////////////////////////////////////////////////////////////////////// + // Since some frames of each body shape either cannot or should not be cremated, + // we have to list individual frames. These are SI-specific. + + // Excludes Petra and 29 which is blank. + body_400_frames = ([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]); + UI_error_message("greenCremation body_400_frames are ", body_400_frames, "."); + + // Excludes monsters, undead, and brass automaton, as well as 24 which is blank. + body_402_frames = ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 14, 15, 20, + 22, 23, 26, 27, 28, 30]); + UI_error_message("greenCremation body_402_frames are ", body_402_frames, "."); + + // Excludes party members, Cantra, and 26 which is blank. + body_414_frames = ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, + 22, 23, 24, 25, 27, 28, 29, 30, 31]); + UI_error_message("greenCremation body_414_frames are ", body_414_frames, "."); + + // Torsos, Gwani body frames, the rest are skeletons. + body_507_frames = ([11, 12, 14, 15, 16]); + UI_error_message("greenCremation body_507_frames are ", body_507_frames, "."); + + // Most frames are monsters or dead Banes. + body_762_frames = ([5, 6, 8, 9, 11, 22, 23, 24]); + UI_error_message("greenCremation body_762_frames are ", body_762_frames, "."); + + // Most frames are monsters or dead Banes. + body_892_frames = ([23, 29, 30]); + UI_error_message("greenCremation body_892_frames are ", body_892_frames, "."); + + /////////////////////////////////////////////////////////////////////////// + // Let's check if there are any bodies at all. + total_count = (UI_count_objects(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY)); + total_count = (total_count + UI_count_objects(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY)); + total_count = (total_count + UI_count_objects(PARTY, SHAPE_BODY2, QUALITY_ANY, FRAME_ANY)); + total_count = (total_count + UI_count_objects(PARTY, SHAPE_BODY3, QUALITY_ANY, FRAME_ANY)); + total_count = (total_count + UI_count_objects(PARTY, SHAPE_BODY4, QUALITY_ANY, FRAME_ANY)); + total_count = (total_count + UI_count_objects(PARTY, SHAPE_BODY5, QUALITY_ANY, FRAME_ANY)); + UI_error_message("greenCremation The Party has ", total_count, " of all movable bodies of any frame."); + + if (total_count == 0) + { + // Add a Party size check. + say("@You and your companions do not appear to be carrying any bodies.@"); + //return; + } + + /////////////////////////////////////////////////////////////////////////// + // Now we check the Party for each shape. + UI_error_message(""); + + body_count = UI_count_objects(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY); + if (body_count >= 1) + { + UI_error_message("greenCremation The Party has ", body_count, " of SHAPE_BODY1."); + body_400_shape = getPartyItems(SHAPE_BODY1, QUALITY_ANY, FRAME_ANY); + UI_error_message("greenCremation SHAPE_BODY1 returns ", body_400_shape, "."); + for (each in body_400_shape with index to max) + { + // Check for the relevant frames, even if rotated. + frame = UI_get_item_frame(each); + UI_error_message("greenCremation Frame ", frame, " found."); + if (frame in body_400_frames) + { + // This check is necessary to prevent a non-existence "found" being counted by UI_get_array_size below. + if (bodies == 0) + bodies = each; + else + bodies = (bodies & each); + UI_error_message("greenCremation SHAPE_BODY1, frame ", frame, " added to bodies array."); + } + else + UI_error_message("greenCremation SHAPE_BODY1, frame ", frame, " was NOT added to bodies array."); + } + valid_bodies = UI_get_array_size(bodies); + UI_error_message("greenCremation The burnable humanoid body count is now ", valid_bodies, "."); + } + else + UI_error_message("greenCremation SHAPE_BODY1 was not found in the Party."); + + UI_error_message(""); + + // Body 402 + body_count = (UI_count_objects(PARTY, SHAPE_BODY_402, QUALITY_ANY, FRAME_ANY)); + if (body_count >= 1) + { + UI_error_message("greenCremation The Party has ", body_count, " of SHAPE_BODY_402."); + body_402_shape = getPartyItems(SHAPE_BODY_402, QUALITY_ANY, FRAME_ANY); + for (each in body_402_shape with index to max) + { + // Check for the relevant frames, even if rotated. + frame = UI_get_item_frame(each); + UI_error_message("greenCremation Frame ", frame, " found."); + if (frame in body_402_frames) + { + // This check is necessary to prevent a non-existence "found" being counted by UI_get_array_size below. + if (bodies == 0) + bodies = each; + else + bodies = (bodies & each); + UI_error_message("greenCremation SHAPE_BODY_402, frame ", frame, " added to bodies array."); + } + else + UI_error_message("greenCremation SHAPE_BODY_402, frame ", frame, " was NOT added to bodies array."); + } + valid_bodies = UI_get_array_size(bodies); + UI_error_message("greenCremation The burnable humanoid body count is now ", valid_bodies, "."); + } + else + UI_error_message("greenCremation SHAPE_BODY_402 was not found in the Party."); + + UI_error_message(""); + + // Body 414 + body_count = (UI_count_objects(PARTY, SHAPE_BODY_414, QUALITY_ANY, FRAME_ANY)); + if (body_count >= 1) + { + UI_error_message("greenCremation The Party has ", body_count, " of SHAPE_BODY_414."); + body_414_shape = getPartyItems(SHAPE_BODY_414, QUALITY_ANY, FRAME_ANY); + for (each in body_414_shape with index to max) + { + // Check for the relevant frames, even if rotated. + frame = UI_get_item_frame(each); + UI_error_message("greenCremation Frame ", frame, " found."); + if (frame in body_414_frames) + { + // This check is necessary to prevent a non-existence "found" being counted by UI_get_array_size below. + if (bodies == 0) + bodies = each; + else + bodies = (bodies & each); + UI_error_message("greenCremation SHAPE_BODY_414, frame ", frame, " added to bodies array."); + } + else + UI_error_message("greenCremation SHAPE_BODY_414, frame ", frame, " was NOT added to bodies array."); + } + valid_bodies = UI_get_array_size(bodies); + UI_error_message("greenCremation The burnable humanoid body count is now ", valid_bodies, "."); + } + else + UI_error_message("greenCremation SHAPE_BODY_414 was not found in the Party."); + + UI_error_message(""); + + // Body 507 + body_count = (UI_count_objects(PARTY, SHAPE_BODY_SKELETON, QUALITY_ANY, FRAME_ANY)); + if (body_count >= 1) + { + UI_error_message("greenCremation The Party has ", body_count, " of SHAPE_BODY_SKELETON (507)."); + body_507_shape = getPartyItems(SHAPE_BODY_SKELETON, QUALITY_ANY, FRAME_ANY); + for (each in body_507_shape with index to max) + { + // Check for the relevant frames, even if rotated. + frame = UI_get_item_frame(each); + UI_error_message("greenCremation Frame ", frame, " found."); + if (frame in body_507_frames) + { + // This check is necessary to prevent a non-existence "found" being counted by UI_get_array_size below. + if (bodies == 0) + bodies = each; + else + bodies = (bodies & each); + UI_error_message("greenCremation SHAPE_BODY_SKELETON (507), frame ", frame, " added to bodies array."); + } + else + UI_error_message("greenCremation SHAPE_BODY_SKELETON (507), frame ", frame, " was NOT added to bodies array."); + } + valid_bodies = UI_get_array_size(bodies); + UI_error_message("greenCremation The burnable humanoid body count is now ", valid_bodies, "."); + } + else + UI_error_message("greenCremation SHAPE_BODY_SKELETON (507) was not found in the Party."); + + UI_error_message(""); + + // Body 762 + body_count = (UI_count_objects(PARTY, SHAPE_BODY_762, QUALITY_ANY, FRAME_ANY)); + if (body_count >= 1) + { + UI_error_message("greenCremation The Party has ", body_count, " of SHAPE_BODY_762."); + body_762_shape = getPartyItems(SHAPE_BODY_762, QUALITY_ANY, FRAME_ANY); + for (each in body_762_shape with index to max) + { + // Check for the relevant frames, even if rotated. + frame = UI_get_item_frame(each); + UI_error_message("greenCremation Frame ", frame, " found."); + if (frame in body_762_frames) + { + // This check is necessary to prevent a non-existence "found" being counted by UI_get_array_size below. + if (bodies == 0) + bodies = each; + else + bodies = (bodies & each); + UI_error_message("greenCremation SHAPE_BODY_762, frame ", frame, " added to bodies array."); + } + else + UI_error_message("greenCremation SHAPE_BODY_762, frame ", frame, " was NOT added to bodies array."); + } + valid_bodies = UI_get_array_size(bodies); + UI_error_message("greenCremation The burnable humanoid body count is now ", valid_bodies, "."); + } + else + UI_error_message("greenCremation SHAPE_BODY_762 was not found in the Party."); + + UI_error_message(""); + + // Body 892 + body_count = (UI_count_objects(PARTY, SHAPE_BODY_SMALL, QUALITY_ANY, FRAME_ANY)); + if (body_count >= 1) + { + UI_error_message("greenCremation The Party has ", body_count, " of SHAPE_BODY_SMALL (892)."); + body_892_shape = getPartyItems(SHAPE_BODY_SMALL, QUALITY_ANY, FRAME_ANY); + for (each in body_892_shape with index to max) + { + // Check for the relevant frames, even if rotated. + frame = UI_get_item_frame(each); + UI_error_message("greenCremation Frame ", frame, " found."); + if (frame in body_892_frames) + { + // This check is necessary to prevent a non-existence "found" being counted by UI_get_array_size below. + if (bodies == 0) + bodies = each; + else + bodies = (bodies & each); + UI_error_message("greenCremation SHAPE_BODY_SMALL (892), frame ", frame, " added to bodies array."); + } + else + UI_error_message("greenCremation SHAPE_BODY_SMALL (892), frame ", frame, " was NOT added to bodies array."); + } + valid_bodies = UI_get_array_size(bodies); + UI_error_message("greenCremation The burnable humanoid body count is now ", valid_bodies, "."); + } + else + UI_error_message("greenCremation SHAPE_BODY_SMALL (892) was not found in the Party."); + + UI_error_message(""); + + say("@A total of ", total_count, " bodies were found in your party.@"); + say("@Of these bodies, ", valid_bodies, " can be cremated.@"); +} + +/* + bodies = UI_count_objects(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY); + + + UI_get_array_size + + // First, check the party for bodies + + + bodies = UI_count_objects(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY); + UI_error_message("Glen has found ", bodies, ", in the party of Shape_Body1."); + bodies = (bodies && UI_count_objects(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY)); + UI_error_message("Glen has found ", bodies, ", in the party of Shape_Body1 and Shape_Body2."); + bodies = (bodies && UI_count_objects(PARTY, SHAPE_BODY3, QUALITY_ANY, FRAME_ANY)); + UI_error_message("Glen has found ", bodies, ", in the party of Shape_Body1 , Shape_Body2 and Shape_Body2."); + bodies = (bodies && UI_count_objects(PARTY, SHAPE_BODY4, QUALITY_ANY, body_frames4)); //*should* select only from body frames listed above? + UI_error_message("Glen has found ", bodies, ", in the party of Shape_Body1 , Shape_Body2 and Shape_Body2."); + bodies = (bodies && UI_count_objects(PARTY, SHAPE_BODY5, QUALITY_ANY, FRAME_ANY)); + UI_error_message("Glen has found ", bodies, ", in the party of Shape_Body1 , Shape_Body2, Shape_Body3."); + + if (bodies > 0) + { + item.say("His eyes gleam fiendishly when he notices the body you're carrying.*"); + item.say("@Ah, you've brought me a client. Tell the truth, doesn't your friend look more peaceful this way?@*"); + item.say("@For such a heroic client, I have something special to offer. It's a new process I've invented called 'cremation.'@*"); + item.say("@For a mere fifteen gold, the remains of the dearly departed are purified with flame. Would you like me to do this for you?@*"); + if (askYesNo()) + { + if (hasGold(15)) + { + chargeGold(15); + if (UI_find_object(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY) > 0) { body = UI_find_object(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY); } //find body to cremate + if (UI_find_object(PARTY, SHAPE_BODY2, QUALITY_ANY, FRAME_ANY) > 0) { body = UI_find_object(PARTY, SHAPE_BODY2, QUALITY_ANY, FRAME_ANY); } //find body to cremate + if (UI_find_object(PARTY, SHAPE_BODY3, QUALITY_ANY, FRAME_ANY) > 0) { body = UI_find_object(PARTY, SHAPE_BODY3, QUALITY_ANY, FRAME_ANY); } //find body to cremate + if (UI_find_object(PARTY, SHAPE_BODY4, QUALITY_ANY, body_frames4) > 0) { body = UI_find_object(PARTY, SHAPE_BODY4, QUALITY_ANY, body_frames4); } //find body to cremate + if (UI_find_object(PARTY, SHAPE_BODY5, QUALITY_ANY, FRAME_ANY) > 0) { body = UI_find_object(PARTY, SHAPE_BODY5, QUALITY_ANY, FRAME_ANY); } //find body to cremate + //body = UI_find_object(PARTY, SHAPE_BODY2, QUALITY_ANY, FRAME_ANY); //find body to cremate, was supposd to pull from list + //cremate_body = (cremate_body + body); + //call crematorioum event + moveToLocation(body, body_pos); //for testing purposes, remove when finished! + + + } + else item.say("@You're a bit short on gold.@ he says, dissapointedly."); return; + + } + else item.say("@Too bad.@"); return; + } + else + enum dead_body_shapes +{ + SHAPE_BODY1 = 400, // 30 frames + BODY_PRIESTESS = 3, // Kylista's body + BODY_UGLY_OLD_WOMAN = 4, // Mosh's body + BODY_FEMALE_PIKEMAN = 5, // Shazzana's body + BODY_FIGHTER_GREEN_HELM = 6, // Brendann's body + BODY_GWENNO = 8, // Gwenno's body + BODY_NOBLEMAN = 13, // Marsten, Ardiniss + BODY_MALE_RANGER_400 = 18, // Used for post-Banes body outside of Frigidazzi's manor + BODY_FEMALE_RANGER = 19, // Julia's body + QUALITY_ARDINISS_BODY = 124, // Same as the brown scroll on his body + SHAPE_BODY_402 = 402, // 31 frames with SS + BODY_FIGHTER_DARK_SKIN = 4, + BODY_PIKEMAN = 11, + BODY_MALE_RANGER = 12, // Rangers that die in combat + SHAPE_BODY_414 = 414, // Dead 3 companions + BODY_MALE_GOBLIN = 4, + BODY_BATLIN = 16, + BODY_FAWN_GUARD = 17, + BODY_IOLO = 18, + BODY_SHAMINO = 19, + BODY_DUPRE = 20, + BODY_GIRL_KNIGHT = 21, // Cantra, matching below + // SHAPE_BODIES_2 = 414, // From original si_shapes.uc + SHAPE_BODY_SKELETON = 507, // Includes Gwani bodies + BODY_GWANI_FULL_FUR = 14, + BODY_GWANI_SOME_FUR = 15, + BODY_GWANI_NO_FUR = 16, + SHAPE_BODY_762 = 762, // Mostly animals and monsters + SHAPE_BODY_LARGE = 778, // Larger monsters, dragons + SHAPE_BODY_SMALL = 892, // With glowing cat + BODY_WOLF = 7 +}; + +*/ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/SendCodexToVoid.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/SendCodexToVoid.uc new file mode 100755 index 0000000..d86bc5f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/SendCodexToVoid.uc @@ -0,0 +1,444 @@ + + + +void SendCodexToVoid object# (3059) () +{ + var Codex = UI_find_object(FIND_ON_SCREEN, SHAPE_CODEX, QUALITY_ANY, FRAME_ANY); + enum codex_levels + { + MOVE_PARTY = 1, + VORTEX = 2, + REMOVE_CODEX = 3, + RED_GATE1 = 4, + LB_ARRIVES = 5, + NYSTUL_ARRIVES = 7, + AVATAR_GIVE_LENS = 8, + MOONGATE2 = 9, + DRAX_ARRIVES = 10, + DRAX_SPEAKS = 11, + AVATAR_GIVE_LENS2 = 12, + OPEN_CODEX = 13, + CLOSE_CODEX = 14, + WRAP_UP = 15, + RESTART = 16 + + }; + + if (event == VORTEX) + { + UI_error_message("Event VORTEX called"); + var npc; + var REPS = 30; + var party = UI_get_party_list(); + var altar = UI_find_object(FIND_ON_SCREEN, 898, QUALITY_ANY, FRAME_ANY); + UI_obj_sprite_effect(item, 8, 0, 0, 0, 0, 0, REPS); //26 + UI_play_sound_effect(26); + UI_play_sound_effect(26); + + for (npc in party) + UI_set_item_frame(npc, 0); // make everyone face forward + + //SendCodexToVoid(item); + script AVATAR after 30 ticks { + call SendCodexToVoid, REMOVE_CODEX; + } + + + } + if (event == MOVE_PARTY) + { + UI_error_message("Event MoveParty called"); + //move Draxinusom to position, make him invis and wait, move him to position + UI_set_item_frame(DRAXINUSOM, 16); + UI_set_item_flag(DRAXINUSOM, DONT_RENDER); + UI_move_object(DRAXINUSOM, [2814, 2587, 1, 0]); + UI_set_schedule_type(DRAXINUSOM, WAIT); + + //Move party to codex and call VORTEX event + UI_path_run_usecode([2807, 2596, 1], SendCodexToVoid, Codex, VORTEX); + + + } + + + + if (event == REMOVE_CODEX) + { + UI_error_message("Event REMOVE_CODEX called"); + var altar = UI_find_object(FIND_ON_SCREEN, 898, QUALITY_ANY, FRAME_ANY); + UI_remove_item(Codex); + UI_obj_sprite_effect(altar, 7, 10, 1, 0, 0, 0, -1); //26 + UI_play_sound_effect(11); + script altar after 30 ticks + { + call SendCodexToVoid, RED_GATE1; + } + } + + + + if (event == RED_GATE1) + { + UI_error_message("Event RED_GATE1 called"); + UI_play_music(23); + var moongate = UI_create_new_object2(SHAPE_RED_MOONGATE, [2801, 2585, 2]); + script moongate after 3 ticks + { + frame 1; + frame 2; + frame 3; + frame 4; + sfx 11; + wait 3; + call SendCodexToVoid, LB_ARRIVES; + repeat 40 + { + frame 4; + repeat 7 next frame;; + frame 4; + repeat 7 next frame;; + frame 4; + repeat 7 next frame;; + }; + + } + + + + + } + + if (event == LB_ARRIVES) + { + UI_error_message("Event LB_ARRIVES called"); +// UI_set_item_frame(LORD_BRITISH, 16); + UI_move_object(LORD_BRITISH, [2800, 2587, 1]); + UI_set_schedule_type(LORD_BRITISH, WAIT); + UI_set_schedule_type(NYSTUL, WAIT); + + script LORD_BRITISH after 3 ticks + { + face south; + step south; + wait 1; + step east; + call SendCodexToVoid, NYSTUL_ARRIVES; + + } + + + } + if (event == NYSTUL_ARRIVES) + { + UI_error_message("Event NYSTUL called"); + var moongate = UI_find_object(FIND_ON_SCREEN, SHAPE_RED_MOONGATE, QUALITY_ANY, FRAME_ANY); + UI_set_item_frame(NYSTUL, 16); + UI_move_object(NYSTUL, [2798, 2586, 1]); + script NYSTUL after 4 ticks + { + step south; + wait 1; + face east; + wait 1; + + } + + UI_move_object(moongate, [2801, 2585, 2]); + AVATAR.say("A glowing portal springs from the floor!"); + AVATAR.say("From it's crimson depths Lord British emerges, trialed by the mage Nystul."); + AVATAR.say("Anguish and disbelief prevail on the royal seer's face, but Lord British directs his stony gaze at you and speaks as if to a wayward child."); + AVATAR.hide(); + LORD_BRITISH.say("@Thou didst have just cause to burgle our Codex, I trust,@ His Majesty says. @But for Virtue's sake...@"); + LORD_BRITISH.say("@WHAT HAST THOU DONE WITH IT?@"); + LORD_BRITISH.hide(); + script LORD_BRITISH after 3 ticks + { + call SendCodexToVoid, AVATAR_GIVE_LENS; + } + + //delete the beams of light + var blueLightBeam = UI_find_object(FIND_ON_SCREEN, 168, QUALITY_ANY, 22); + UI_remove_item(blueLightBeam); + var blueLightBeam2 = UI_find_object(FIND_ON_SCREEN, 168, QUALITY_ANY, 24); + UI_remove_item(blueLightBeam2); + + var pinkLightBeam = UI_find_object(FIND_ON_SCREEN, 168, QUALITY_ANY, 20); + UI_remove_item(pinkLightBeam); + var pinkLightBeam2 = UI_find_object(FIND_ON_SCREEN, 168, QUALITY_ANY, 21); + UI_remove_item(pinkLightBeam2); + gflags[GARG_LENS_PLACED] = false; + + } + + if (event == AVATAR_GIVE_LENS) + { + UI_error_message("Event AVATAR_GIVE_LENS called"); + var lens = UI_find_nearby(LORD_BRITISH, SHAPE_LENS, 5, MASK_NONE); + var moongate = UI_find_object(FIND_ON_SCREEN, SHAPE_RED_MOONGATE, QUALITY_ANY, FRAME_ANY); + gotoAndGet(lens); + script NYSTUL after 15 ticks + { + call SendCodexToVoid, MOONGATE2; + } + + //remove moongate + script moongate after 5 ticks + { + frame 4; + frame 3; + frame 2; + frame 1; + remove; + } + + + } + + if (event == MOONGATE2) + { + UI_error_message("Event MOONGATE2 called"); + var lens = UI_find_object(AVATAR, SHAPE_LENS, QUALITY_ANY, FRAME_ANY); + var CODEX_WALL = UI_find_object(FIND_ON_SCREEN, 1246, QUALITY_ANY, FRAME_ANY); + //find urn - will be used to call the next event + var urn = UI_find_object(FIND_ON_SCREEN, 1116, QUALITY_ANY, FRAME_ANY); + //var urn = UI_find_nearby(LORD_BRITISH, 1116, 5, MASK_NONE); + + AVATAR.say("You pick up the concave lens and pass it to the King."); + AVATAR.say("@Was the book ever truly ours, Your Majesty? Was it written for Britannia alone?@"); + AVATAR.say("@Thou dost no longer hold the Codex, but is its wisdom indeed lost? Look into the Vortex, and let the Codex answer for itself!@"); + AVATAR.hide(); + + //move Avatar in place + UI_path_run_usecode([2807, 2588, 1]); + + script AVATAR after 5 ticks + { + //face find_direction(CODEX_WALL); + face north; + } + //move lens into place, make it face wall + script LORD_BRITISH after 3 ticks + { + face north; + } + //turn lens north + script lens after 3 ticks + { + face north; + + + } + UI_move_object(lens, [2802, 2587, 1]); + codexWall(); + + script DRAXINUSOM after 80 ticks + { + wait 20; + call SendCodexToVoid, DRAX_ARRIVES; + } + + } + + if (event == DRAX_ARRIVES) + { + UI_error_message("Event DRAX_ARRIVES called"); + //used to call next event + var urn2 = UI_find_object(FIND_ON_SCREEN, 1116, QUALITY_ANY, FRAME_ANY); + + AVATAR.say("As Lord British holds the glass before the wall, the Codex of Ultimate Wisdom wavers against a myriad of swimming stars!*"); + AVATAR.say("Yet the book remains closed.*"); + AVATAR.say("And waves of heat shimmer in the air, heralding the birth of another red gate!"); + //create moongate & play music + UI_play_music(103); //put garg music + var moongate = UI_create_new_object2(SHAPE_RED_MOONGATE, [2816, 2585, 1]); + //var moongate = UI_find_object(FIND_ON_SCREEN, SHAPE_RED_MOONGATE, QUALITY_ANY, FRAME_ANY); + + //move moongate to make it look right + UI_move_object(moongate, [2816, 2585, 1]); + + script moongate after 3 ticks + { + frame 1; + frame 2; + frame 3; + frame 4; + sfx 11; + wait 3; + + repeat 40 + { + + repeat 7 next frame;; + frame 4; + repeat 7 next frame;; + frame 4; + repeat 7 next frame;; + }; + + } + + script urn2 after 10 ticks + { + call SendCodexToVoid, DRAX_SPEAKS; + } + + + } + + if (event == DRAX_SPEAKS) + { + UI_error_message("Event DRAX_SPEAKS called"); + //reset moongate position to keep it from looking weird + var moongate = UI_find_object(FIND_ON_SCREEN, SHAPE_RED_MOONGATE, QUALITY_ANY, FRAME_ANY); + UI_move_object(moongate, [2816, 2585, 1]); + UI_set_schedule_type(DRAXINUSOM, WAIT); + UI_move_object(DRAXINUSOM, [2814, 2587, 1, 0]); + + var garg1_pos = [2816, 2588, 01]; + var garg2_pos = [2814, 2587, 01]; + + UI_create_new_object2(SHAPE_WINGLESS_GARGOYLE, garg1_pos); + UI_create_new_object2(SHAPE_WINGLESS_GARGOYLE, garg2_pos); + + + + var lens = UI_find_nearby(DRAXINUSOM, SHAPE_LENS, 5, MASK_NONE); + UI_clear_item_flag(DRAXINUSOM, DONT_RENDER); + + script DRAXINUSOM after 3 ticks + { + face south; + step south; + wait 1; + repeat 2 + { + step west; + wait 1; + }; + + } + + + UI_play_sound_effect(11); + DRAXINUSOM.say("King Draxinusom of the Gargoyles strides forward, flanked by a small army of wingless attendants. Like Lord British, he seems to suppress his rage only htrough a heroic effort of will.*"); + DRAXINUSOM.say("His scaly hand grasps your shoulder, and your Amulet of Submission grows very warm."); + DRAXINUSOM.say("@Thy time has come, Thief,@ he says."); + DRAXINUSOM.hide(); + AVATAR.say("Quickly you reach down to seize the convex lens...*"); + AVATAR.say("...and you press it into the hand of the towering Gargoyle king, meeting his sunken eyes."); + AVATAR.say("@Join my Lord in his search for peace, I beg thee.@"); + AVATAR.hide(); + + //UI_path_run_usecode([2807, 2596, 1], SendCodexToVoid, lens, AVATAR_GIVE_LENS2); + script AVATAR after 10 ticks + { + face north; + call SendCodexToVoid, AVATAR_GIVE_LENS2; + + } + + } + + if (event == AVATAR_GIVE_LENS2) + { + UI_error_message("Event AVATAR_GIVE_LENS2 called"); + var moongate = UI_find_object(FIND_ON_SCREEN, SHAPE_RED_MOONGATE, QUALITY_ANY, FRAME_ANY); + + //remove moongate + script moongate after 5 ticks + { + frame 4; + frame 3; + frame 2; + frame 1; + remove; + } + + + + //find lens on Avatar then place near Drax + var lens = UI_find_nearby(DRAXINUSOM, SHAPE_LENS, 5, MASK_NONE); + UI_move_object(lens, [2811, 2587, 1]); + + //move lens facing north + script lens after 3 ticks + { + face north; + } + //move Drax north + script DRAXINUSOM after 3 ticks + { + face north; + } + // gotoAndGet(lens); + + script AVATAR after 30 ticks + { + call SendCodexToVoid, OPEN_CODEX; + + } + + + } + + if (event == OPEN_CODEX) + { + UI_error_message("Event OPEN_CODEX called"); + openCodex(); + UI_set_item_frame(NYSTUL, 48); + UI_play_music(205); + AVATAR.say("At your urging, King Draxinusom reluctantly raises his lens to catch the light. As Lord British holds up his own lens, every eye in the room, human and Gargoyle alike, fixes upon the image of the Codex which shines upon the wall."); + AVATAR.say("The ancient book opens. Both kings gaze upon its pages in spellbound silence, as the eloquence of Ultimate Wisdom is revealed in the toungues of each lord's domain. You, too, can read the answers the Codex gives..."); + script AVATAR after 60 ticks + { + call SendCodexToVoid, CLOSE_CODEX; + + } + } + + if (event == CLOSE_CODEX) + { + AVATAR.say("...and when it's wisdom is gleaned, when Lord British and King Draxinusom turn to each other as friends, hating no longer, fearing no more, you know that your mission in Britannia has ended at last."); + UI_error_message("Event CLOSE_CODEX called"); + var codex_wall = UI_find_object(FIND_ON_SCREEN, 1246, QUALITY_ANY, FRAME_ANY); //find codex wall + // UI_halt_scheduled(codex_wall); + var frame = UI_get_item_frame(1246); + + script codex_wall after 10 ticks + { + + + frame 18; wait 2; + frame 19; wait 2; + frame 20; wait 2; + frame 5; wait 2; + frame 4; wait 2; + frame 3; wait 2; + frame 2; wait 2; + frame 1; wait 2; + frame 0; wait 2; + wait 15 minutes; + call SendCodexToVoid, WRAP_UP; + } + } + + if (event == WRAP_UP) + { + AVATAR.say("@That's it, you win. Games over. Back to earth I go. Thanks for playing. See you in 200 years! Avatar, out!@"); + AVATAR->GenericPaletteFade2(); + script AVATAR after 30 ticks + { + call SendCodexToVoid, RESTART; + } + + } + + if (event == RESTART) + { + UI_restart_game(); + + } + + +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/death_events.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/death_events.uc new file mode 100755 index 0000000..d71ea14 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/death_events.uc @@ -0,0 +1,150 @@ +enum death_levels + +{ + DEATH_FADE = 1, + RESU_PARTY_1 = 2, + RESU_PARTY_2 = 3, + RESU_PARTY_3 = 4, + RESU_PARTY_4 = 5, + RESU_PARTY_5 = 6, + RESU_PARTY_6 = 7, + RESU_PARTY_7 = 8, + TELEPORT_PARTY = 9, + DEATH_UNFADE = 10 + }; + +void deathEvents object#() () //working +{ + UI_error_message("Death events called"); + + var party = UI_get_party_list(); + var hour = UI_game_hour(); + var current_minute = UI_game_minute(); + var minute = (59 - current_minute); + var min_ticks = (minute * 25); + + var current_hour = UI_game_hour(); + + + + var checkout = 9; + var sleephours = ((23 - current_hour) + 9); + var advance = (sleephours * 1500); + var partynum = UI_get_array_size(party); + var deadparty = UI_get_dead_party(AVATAR); + var deadnum = UI_get_array_size(deadparty); + + var avatarhealth = UI_get_npc_prop(UI_get_avatar_ref(), HEALTH); + var avatarstr = UI_get_npc_prop(UI_get_avatar_ref(), STRENGTH); + var avatarfullhealth = (avatarstr - avatarhealth); + + if (event == DEATH_FADE) + { + UI_error_message("Death events - DEATH_FADE called"); + UI_play_music(17); //find death music + var deadparty = UI_get_dead_party(AVATAR); + // UI_advance_time(advance + min_ticks); //disabled time advance, causing issues? + // UI_game_minute(59); + + if (deadnum > 0) + { + script AVATAR + { + call deathEvents, RESU_PARTY_1; + }; + + } + else + script AVATAR + { + call deathEvents, TELEPORT_PARTY; + }; + + } + + if (event == RESU_PARTY_1) + { + UI_error_message("Death events - RESU_PARTY_1 called"); + var deadparty = UI_get_dead_party(AVATAR); + UI_resurrect(deadparty); + + if (deadnum > 0) + { + script AVATAR + { + call deathEvents, RESU_PARTY_2; + }; + + } + else + script AVATAR + { + call deathEvents, TELEPORT_PARTY; + }; + } + + if (event == RESU_PARTY_2) + { + var deadparty = UI_get_dead_party(AVATAR); + UI_resurrect(deadparty); + UI_error_message("Death events - RESU_PARTY_2 called"); + + if (deadnum > 0) + { + script AVATAR + { + call deathEvents, RESU_PARTY_2; + }; + + } + else script AVATAR { call deathEvents, TELEPORT_PARTY; + }; + } + if (event == TELEPORT_PARTY) + { + UI_error_message("Death events - TELEPORT_PARTY called"); + PARTY->move_object([0x3a7, 0x430, 0x0, 0]); + + + + script AVATAR + { + call deathEvents, DEATH_UNFADE; + }; + + + } + + if (event == DEATH_UNFADE) + { + UI_error_message("Death events - DEATH_UNFADE called"); + UI_fade_palette(60, 0, true); //unfadefade from black + //UI_resurrect(AVATAR);// probably needs LB dialogue to clear sleep flag + UI_clear_item_flag(AVATAR, ASLEEP); + UI_clear_item_flag(AVATAR, DEAD); + gflags[INTRO] = true; //so guards don't play trumpet + var targets = getFriendlyTargetList(item, 25); //should heal all party + + for (npc in targets) + { + npc->clear_item_flag(PARALYZED); + npc->clear_item_flag(POISONED); + npc->clear_item_flag(ASLEEP); + npc->clear_item_flag(CHARMED); + npc->clear_item_flag(CURSED); + var str = npc->get_npc_prop(STRENGTH); + var hps = npc->get_npc_prop(HEALTH); + npc->set_npc_prop(HEALTH, (str - hps)); + + //if something weird happens and you die on the balloon: + UI_clear_item_flag(npc, DONT_RENDER); + + + } + //just in case you are on the balloon, go back to normal + UI_clear_item_flag(AVATAR, POLYMORPH); + + } + +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/freeshrines.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/freeshrines.uc new file mode 100755 index 0000000..fab04f1 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/freeshrines.uc @@ -0,0 +1,370 @@ +var populateMantras(var mantra, var flag) +{ + var mantras = ["'Ahm'", "'Mu'", "'Ree'", "'Ra'", "'Arr'", "'Summ'", "'Lum'", "'Meh'", "'Mul'", "'Cah'", "'Beh'", "'Doh'", "'Err'", "'Om'", "'Uh'"]; + var size = UI_get_array_size([mantras]); + + // This will populate a list of mantras, but it should NOT have the Shrine's actual mantra unless + // the flag is set true (they learned the mantra). If the flag isn't true and mantra is rolled, do a re-roll. + + //assign random mantras in the choice menu + var choice_one = mantras[UI_get_random(size)]; + + //if choice one equals the mantra, re-roll + while (choice_one == mantra) + choice_one = mantras[UI_get_random(size)]; + + //roll choice two. If it matches choice one OR mantra, re-roll + var choice_two = mantras[UI_get_random(size)]; + while (choice_two == choice_one || choice_two == mantra) + choice_two = mantras[UI_get_random(size)]; + + //roll choice three. If it matches choice one, two, OR mantra, re-roll + var choice_three = mantras[UI_get_random(size)]; + while (choice_three == choice_one || choice_three == choice_two || choice_three == mantra) + choice_three = mantras[UI_get_random(size)]; + + + + var mantra_choices = [choice_one, choice_two, choice_three]; + + //if mantra flag is set (mantra is learned), replace random choice with actual mantra: + if (flag) + { + UI_error_message("Mantra flag is true"); + UI_error_message("Mantra is " + mantra); + + var rand = UI_get_random(3); + + if (rand == 1) + choice_one = mantra; + else if (rand == 2) + choice_two = mantra; + else + choice_three = mantra; + + //reassign mantras + mantra_choices = [choice_one, choice_two, choice_three]; + + UI_error_message("Choices are : " + choice_one + "," + choice_two + ", " + choice_three); + + } + else + UI_error_message("Flag isn't set?"); + + + + return mantra_choices; +} + + + + +void breakForceField(var rune, var virtue_name) +{ + var shrine = UI_find_object(FIND_ON_SCREEN, SHAPE_FORCEFIELD, QUALITY_ANY, FRAME_ANY); + var moonstone = UI_find_nearest(shrine, SHAPE_MOONSTONE, 3); + var forcefield = UI_find_nearest(shrine, SHAPE_FORCEFIELD, 3); + + //If forcefield not found, abort + if (!forcefield) + { + randomPartyBark("We are not close enough.@"); + abort; + + } + else + { + UI_obj_sprite_effect(moonstone, 21, 0, 0, 0, 0, 0, -1); + UI_play_sound_effect(37); + + UI_obj_sprite_effect(moonstone, 9, 0, 0, 0, 0, 0, -1); + UI_play_music(9); + + UI_remove_item(forcefield); //deletes force field + + UI_remove_item(rune); //deletes rune + + deleteEggs(); + randomPartyBark("@The Shrine of " + virtue_name + " is free!@"); + giveExperience(100); + UI_play_music(9); + } + +} + +void breakForceFieldFailed() +{ + + var moonstone = find_nearest(SHAPE_MOONSTONE, 10); + UI_obj_sprite_effect(moonstone, 9, 0, 0, 0, 0, 0, -1); + UI_play_sound_effect(69); + randomPartyBark("@I don't think that was the correct mantra...@"); + +} + + + +void freeShrines (var shrine, var rune) +{ + var virtue_name = shrine; + + var choice_one; + var choice_two; + var choice_three; + + /* for reference: + const int QUALITY_SACRIFICE = 0; + const int QUALITY_JUSTICE = 1; + const int QUALITY_HUMILITY = 2; + const int QUALITY_SPIRITUALITY = 3; + const int QUALITY_VALOR = 4; + const int QUALITY_COMPASSION = 5; + const int QUALITY_HONOR = 6; + const int QUALITY_HONESTY = 7; + + The mantra of Honesty: Ahm + The mantra of Compassion: Mu + The mantra of Valor: Ra + The mantra of Justice: Beh + The mantra of Sacrifice: Cah + The mantra of Honor: Summ + The mantra of Humility: Lum + The mantra of Spirituality: Om + + + */ + + var MANTRA_SACRIFICE = "'Cah'"; + var MANTRA_JUSTICE = "'Beh'"; + var MANTRA_HUMILITY = "'Lum'"; + var MANTRA_SPIRITUALITY = "'Om'"; + var MANTRA_VALOR = "'Ra'"; + var MANTRA_HONESTY = "'Ahm'"; + var MANTRA_COMPASSION = "'Mu'"; + var MANTRA_HONOR = "'Summ'"; + + var face; + + if (shrine == "Sacrifice") + face = 250; + else if (shrine == "Justice") + face = 251; + else if (shrine == "Humility") + face = 252; + else if (shrine == "Spirituality") + face = 249; + else if (shrine == "Valor") + face = 248; + else if (shrine == "Honesty") + face = 254; + else if (shrine == "Compassion") + face = 255; + else if (shrine == "Honor") + face = 253; + else + face = 256; + + + var npc; + + if (shrine == "Sacrifice") + npc = NPC_SACRIFICE; + else if (shrine == "Justice") + npc = NPC_JUSTICE; + else if (shrine == "Humility") + npc = NPC_HUMILITY; + else if (shrine == "Spirituality") + npc = NPC_SPIRITUALITY; + else if (shrine == "Valor") + npc = NPC_VALOR; + else if (shrine == "Honesty") + npc = NPC_HONESTY; + else if (shrine == "Compassion") + npc = NPC_COMPASSION; + else if (shrine == "Honor") + npc = NPC_HONOR; + else + npc = AVATAR; + + + + UI_error_message("NPC is : " + npc); + + var npc_face = UI_get_npc_object(npc); + UI_error_message("Face is : " + npc_face); + + //show correct shrine face + UI_show_npc_face(face, 0); + + //stop any music from playing. TODO: Add shrine music? + UI_play_music(255); + + face.say("You hear a voice ringing inside your head."); + face.say("@Speak the mantra of " + virtue_name + ".@"); + + + //Shrine of Sacrifice + if (shrine == "Sacrifice") + { + var mantra_choices = populateMantras(MANTRA_SACRIFICE, LEARNED_MANTRA_SACRIFICE); + + var mantra_choice = chooseFromMenu(mantra_choices); + + if (mantra_choice == MANTRA_SACRIFICE) + { + UI_close_gumps(); + breakForceField(rune, virtue_name); + gflags[SACRIFICE_FREED] = true; + } + + else + { + breakForceFieldFailed(); + } + } + + //Shrine of Justice + else if (shrine == "Justice") + { + var mantra_choices = populateMantras(MANTRA_JUSTICE, LEARNED_MANTRA_JUSTICE); + + var mantra_choice = chooseFromMenu(mantra_choices); + + if (mantra_choice == MANTRA_JUSTICE) + { + UI_close_gumps(); + breakForceField(rune, virtue_name); + gflags[JUSTICE_FREED] = true; + } + + else + { + breakForceFieldFailed(); + } + } + + //Shrine of Humility + else if (shrine == "Humility") + { + var mantra_choices = populateMantras(MANTRA_HUMILITY, LEARNED_MANTRA_HUMILITY); + + var mantra_choice = chooseFromMenu(mantra_choices); + + if (mantra_choice == MANTRA_HUMILITY) + { + UI_close_gumps(); + breakForceField(rune, virtue_name); + gflags[HUMILITY_FREED] = true; + } + + else + { + breakForceFieldFailed(); + } + } + + //Shrine of Spirituality + else if (shrine == "Spirituality") + { + var mantra_choices = populateMantras(MANTRA_SPIRITUALITY, LEARNED_MANTRA_SPIRITUALITY); + + var mantra_choice = chooseFromMenu(mantra_choices); + + if (mantra_choice == MANTRA_SPIRITUALITY) + { + UI_close_gumps(); + breakForceField(rune, virtue_name); + gflags[SPIRITUALITY_FREED] = true; + } + + else + { + breakForceFieldFailed(); + } + } + + //Shrine of Valor + else if (shrine == "Valor") + { + var mantra_choices = populateMantras(MANTRA_VALOR, LEARNED_MANTRA_VALOR); + + var mantra_choice = chooseFromMenu(mantra_choices); + + if (mantra_choice == MANTRA_VALOR) + { + UI_close_gumps(); + breakForceField(rune, virtue_name); + gflags[VALOR_FREED] = true; + } + + else + { + breakForceFieldFailed(); + } + } + + //Shrine of Compassion + else if (shrine == "Compassion") + { + var mantra_choices = populateMantras(MANTRA_COMPASSION, LEARNED_MANTRA_COMPASSION); + + var mantra_choice = chooseFromMenu(mantra_choices); + + if (mantra_choice == MANTRA_COMPASSION) + { + UI_close_gumps(); + breakForceField(rune, virtue_name); + gflags[COMPASSION_FREED] = true; + } + + else + { + breakForceFieldFailed(); + } + } + + //Shrine of Honor + else if (shrine == "Honor") + { + var mantra_choices = populateMantras(MANTRA_HONOR, LEARNED_MANTRA_HONOR); + + var mantra_choice = chooseFromMenu(mantra_choices); + + if (mantra_choice == MANTRA_HONOR) + { + UI_close_gumps(); + breakForceField(rune, virtue_name); + gflags[HONOR_FREED] = true; + } + + else + { + breakForceFieldFailed(); + } + } + + //Shrine of Honesty + else if (shrine == "Honesty") + { + var mantra_choices = populateMantras(MANTRA_HONESTY, LEARNED_MANTRA_HONESTY); + + var mantra_choice = chooseFromMenu(mantra_choices); + + if (mantra_choice == MANTRA_HONESTY) + { + UI_close_gumps(); + breakForceField(rune, virtue_name); + gflags[HONESTY_FREED] = true; + } + + else + { + breakForceFieldFailed(); + } + } + + + + +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/gypsy_cutscene.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/gypsy_cutscene.uc new file mode 100755 index 0000000..d503af9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/gypsy_cutscene.uc @@ -0,0 +1,457 @@ +//30 ticks per minute +enum gypsy_cutscene_levels + +{ + BEGIN_WANDA_CUTSCENE = 1, + WANDA_WAITS = 2, + BEGIN_ANDREAS_CUTSCENE = 3, + ANDREAS_WAITS = 4, + WANDA_UNDRESSES = 5, + ANDREAS_UNDRESSES = 6, + AVATAR_CHIDED = 7, + AVATAR_STD =8 + + + + + +}; + + +void GenericPaletteUnfade2 object#() () +{ + // Do stuff + + // Unfade the palette + UI_fade_palette(12, 1, 1); + //call new event + // Do more stuff +} + +void GenericPaletteFade2 object#() () +{ + + + // Fade to black: + UI_fade_palette(12, 1, 0); + + script AVATAR after 60 ticks {nohalt; call GenericPaletteUnfade;}; + +} + +void AvatarUndress object#() () +{ + var AVATARCLOTHESPOS = [1201, 2123, 03]; + const int SHAPE_AVATAR_COSTUME = 838; + UI_set_item_flag(AVATAR, NAKED); + var AvatarClothes = find_nearest(SHAPE_AVATAR_COSTUME, QUALITY_ANY, FRAME_ANY, 10); + AvatarClothes->move_object(AVATARCLOTHESPOS); + +} + +void AvatarDress object#() () +{ + const int SHAPE_AVATAR_COSTUME = 838; + var UPPER_LEFT = [1189, 2117]; + var LOWER_RIGHT = [1209, 2132]; + var AvatarClothes = find_nearest(SHAPE_AVATAR_COSTUME, QUALITY_ANY, FRAME_ANY, 10); + var AvatarClothesPosition = [1199, 2121, 00]; + AvatarClothes->move_object(AvatarClothesPosition); + + UI_clear_item_flag(AVATAR, NAKED); + +} + +void gypsyUndress object#()() +{ + var gypsy; + var gypsy_name; + + AVATAR->set_item_flag(BG_DONT_MOVE); + + if (gflags[DURING_WANDA_CUTSCENE]) + { + gypsy = WANDA; + gypsy_name = UI_get_npc_name(gypsy); + UI_error_message("Gypsy is " + gypsy_name); + //gypsy->set_polymorph(1043); + UI_set_polymorph(WANDA, 1043); + + var dress = find_nearest(SHAPE_TOP, QUALITY_ANY, FRAME_BROWN_DRESS, 10); + var gypsypos2 = [1203, 2124, 03]; + dress->move_object(gypsypos2); + } + else + { + gypsy = ANDREAS; + UI_set_polymorph(ANDREAS, 1042); + + } +} + +void gypsyDressed object#()() +{ + var gypsy; + if (gflags[DURING_WANDA_CUTSCENE]) + { + gypsy = WANDA; + gypsy->clear_item_flag(POLYMORPH); + gypsy->set_polymorph(459); + + + var dressposition2 = [1198, 2121, 00]; //moves dress behind wagon + var dress = find_nearest(SHAPE_TOP, QUALITY_ANY, FRAME_BROWN_DRESS, 10); + dress->move_object(dressposition2); + } + else + { + gypsy = ANDREAS; + gypsy->clear_item_flag(POLYMORPH); + gypsy->set_polymorph(457); + + } + + gypsy->clear_item_flag(BG_DONT_MOVE); + + +} + +void gypsyWalksAway object#()() +{ + var gypsypos1 = [1212, 2126, 0]; + var gypsypos2 = [1199, 2139, 0]; + var gypsy; + + if (gflags[DURING_WANDA_CUTSCENE]) + { + gypsy = WANDA; + + } + else + gypsy = ANDREAS; + gypsy->si_path_run_usecode([gypsypos1]); +} + +void AvatarWalksAway object#() () +{ + var avatarpos = [1215, 2125, 0]; + AVATAR->si_path_run_usecode([avatarpos]); + UI_play_music(31, AVATAR); + +} + +void AvatarChided object#() () +{ + var party = UI_get_party_list(); + var partynum = UI_get_array_size(party); + AVATAR->clear_item_flag(BG_DONT_MOVE); + + if (gflags[DURING_WANDA_CUTSCENE]) + { + + if (partynum > 1) + { + AVATAR.say("After a time, you return to your comrades."); + AVATAR.hide(); + if (isNearby(DUPRE)) + { + DUPRE.say("@That's a fine way to be carrying on when all of Britannia is in danger!@*"); + DUPRE.say("@When our quest is complete, then there will be time enough for wenching!@"); + DUPRE.hide(); + if (isNearby(WANDA)) + { + WANDA.say("@Nothing's wrong with a little fun. There's plenty of time... as long as there's plenty of gold!@"); + WANDA.hide(); + } + } + } + else + { + AVATAR.say("You try to ignore the nagging voice in the back of your mind that keeps saying, @You shouldn't have wasted time like that.@"); + AVATAR.hide(); + } + + } + else + { + + AVATAR.say("After a while, you and he wander back to the rest of the caravan, weary but satisfied."); + if (partynum > 1) + { + if (isNearby(DUPRE)) + { + DUPRE.say("@Dupre scowls. @Well, you've certainly picked a fine one to be carrying on with.@"); + DUPRE.say("@I would remind you that Britannia is under invasion by hordes of gargoyles, but I'd hate to spoil your fun...@"); + DUPRE.hide(); + if (isNearby(ANDREAS)) + { + ANDREAS.say("Andreas laughs. @'Tis not a crime to give yourself over to pleasure...@"); + ANDREAS.hide(); + } + } + else + { + + randomPartySay("@Well, you've certainly picked a fine one to be carrying on with.@"); + randomPartySay("@I would remind you that Britannia is under invasion by hordes of gargoyles, but I'd hate to spoil your fun...@"); + randomPartySay.hide(); + if (isNearby(ANDREAS)) + { + ANDREAS.say("Andreas laughs. @'Tis not a crime to give yourself over to pleasure...@"); + ANDREAS.hide(); + } + } + + } + else + AVATAR.say("You try to ignore the nagging voice in the back of your head that says you shouldn't have wasted time like that."); + + } + + +} + +void AvatarSTD object# () () +{ + var rand = UI_die_roll(0, 5); + var player_name = getAvatarName(); + UI_error_message("Avatar rolls a " + rand); + if (rand == 3) + { + UI_error_message("Avatar caught the herpy herps!"); + AVATAR->set_item_flag(POISONED); + if (isNearby(IOLO)) + { + IOLO.say("@Perhaps thou shouldst see a healer for thine 'affliction', " + player_name + "...@"); + IOLO.hide(); + } + + if (isNearby(DUPRE)) + { + DUPRE.say("@I told thee delaying our quest for wenching was a bad idea, " + player_name + ".@"); + DUPRE.hide(); + if (isNearby(SHAMINO)) + { + DUPRE.say("@A cure potion cures all maladies caught from wenches, right Shamino?@"); + DUPRE.hide(); + + SHAMINO.say("@Thou art scum, Dupre!@ Shamino says after laughing nervously.@"); + SHAMINO.hide(); + } + } + + } + else + return; +} + +//MAIN CUTSCENE// + +void GypsyCutscene object#() () +{ + var player_name = getAvatarName(); + if (event == BEGIN_WANDA_CUTSCENE) + { + UI_error_message("BEGIN_WANDA_CUTSCENE starting"); + gflags[DURING_WANDA_CUTSCENE] = true; + var wandapos1 = [1210, 2124]; + var wandapos2 = [1201, 2124, 03]; + AVATAR->set_item_flag(BG_DONT_MOVE); + WANDA->set_item_flag(BG_DONT_MOVE); + UI_play_music(38); + + UI_si_path_run_usecode(WANDA, [wandapos1]); + // WANDA->si_path_run_usecode([wandapos1]); + + var wagondoor = find_nearest(975, 100); + + script wagondoor after 30 ticks + { + call GypsyCutscene, WANDA_WAITS; + }; + + //UI_si_path_run_usecode(WANDA, [wandapos2], WANDA_WAITS, WANDA, GypsyCutscene, false); //doesn't work? + + } + + + if (event == BEGIN_ANDREAS_CUTSCENE) + { + UI_error_message("BEGIN_ANDREAS_CUTSCENE starting"); + + var gypsypos1 = [1210, 2124]; + var gypsypos2 = [1201, 2124, 03]; + AVATAR->set_item_flag(BG_DONT_MOVE); + ANDREAS->set_item_flag(BG_DONT_MOVE); + UI_play_music(38); + + UI_si_path_run_usecode(ANDREAS, [gypsypos1]); + + + var wagondoor = find_nearest(975, 100); + + script wagondoor after 30 ticks + { + call GypsyCutscene, ANDREAS_WAITS; + }; + + } + + if (event == WANDA_WAITS) + { + UI_error_message("WANDA_WAITS starting"); + var wandapos1 = [1210, 2124]; //path 0 + //var wandapos2 = [1201, 2124, 03]; //path 1 + var wandapos2 = [1200, 2126, 03]; //path 1 + var avatarpos2 = [1204, 2125, 03]; + + + UI_si_path_run_usecode(AVATAR, [avatarpos2]); + //UI_si_path_run_usecode(WANDA, [wandapos2]); + UI_si_path_run_usecode(WANDA, [wandapos2], WANDA_UNDRESSES, WANDA, GypsyCutscene, false); + + + //AVATAR->clear_item_flag(BG_DONT_MOVE); + } + + if (event == ANDREAS_WAITS) + { + UI_error_message("ANDREAS_WAITS starting"); + var gypsypos1 = [1210, 2124]; //path 0 + var gypsypos2 = [1201, 2124, 03]; //path 1 + var avatarpos2 = [1204, 2125, 03]; + + + UI_si_path_run_usecode(AVATAR, [avatarpos2]); + + UI_si_path_run_usecode(ANDREAS, [gypsypos2], ANDREAS_UNDRESSES, ANDREAS, GypsyCutscene, false); + + + //AVATAR->clear_item_flag(BG_DONT_MOVE); + } + + if (event == WANDA_UNDRESSES) + { + UI_error_message("WANDA_UNDRESSES starting"); + script WANDA //after 5 ticks + { + nohalt; + actor frame standing; wait 5; face west; + actor frame bowing; wait 2; + call gypsyUndress; + step west; wait 2; + actor frame sleeping; wait 2; face west; + wait 2; + say "@Come and get me..@"; wait 2; + wait 140; //from 160 + + actor frame standing; wait 1; face east; + actor frame bowing; wait 1; + call gypsyDressed; + wait 1; + actor frame standing; wait 1; face east; + wait 2; + say "@Come again, handsome...@"; + call gypsyWalksAway; + }; + + + + script AVATAR after 28 ticks + { + nohalt; + actor frame standing; wait 1; face west; + actor frame bowing; wait 1; + call AvatarUndress; wait 3; + repeat 3 {step west; wait 1;}; //changed from 2 steps + repeat 2 {actor frame sleeping; wait 1; face west;}; //from repeat 3 + + + call GenericPaletteFade; wait 90; //from 160 + + call GenericPaletteUnfade; wait 5; //from 2 + actor frame standing; wait 1; face east; + actor frame bowing; wait 1; + call AvatarDress; wait 60; + call AvatarWalksAway; wait 3; + say "@Whew!@"; wait 55; + call AvatarChided; wait 375; //from 400 + call AvatarSTD; + }; + + + + } + + + if (event == ANDREAS_UNDRESSES) + { + UI_error_message("ANDREAS_UNDRESSES starting"); + var player_is_female = UI_is_pc_female(); + var bark1; + var bark2; + if (player_is_female) + { + bark1 = "Let's go.."; + bark2 = "Come again, foxy!"; + } + else + { + bark1 = "Money is money.."; + bark2 = "Gotta earn a living somehow!"; + } + + script ANDREAS //after 5 ticks + { + nohalt; + actor frame standing; wait 5; face west; + actor frame bowing; wait 2; + call gypsyUndress; + step west; wait 2; + actor frame sleeping; wait 2; face west; + wait 2; + say bark1; wait 2; + wait 160; //from 180 + + actor frame standing; wait 1; face east; + actor frame bowing; wait 1; + call gypsyDressed; + wait 1; + actor frame standing; wait 1; face east; + wait 2; + say bark2; + call gypsyWalksAway; + }; + + + + script AVATAR after 28 ticks + { + nohalt; + actor frame standing; wait 1; face west; + actor frame bowing; wait 1; + call AvatarUndress; wait 3; + repeat 2 {step west; wait 1;}; + repeat 2 {actor frame sleeping; wait 1; face west;}; //from repeat 3 + + + call GenericPaletteFade; wait 90; //from 160 + + call GenericPaletteUnfade; wait 5; //from 2 + actor frame standing; wait 1; face east; + actor frame bowing; wait 1; + call AvatarDress; wait 60; + call AvatarWalksAway; wait 3; + say "@Whew!@"; wait 55; + call AvatarChided; wait 350; //from 400 + call AvatarSTD; + }; + + + + } + + + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/innkeepers.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/innkeepers.uc new file mode 100755 index 0000000..414fe37 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/innkeepers.uc @@ -0,0 +1,284 @@ + +//30 ticks per minute +enum innkeeper_Doris_levels + +{ + DORIS_FADE_SCREEN = 1, + DORIS_UNFADE_SCREEN = 2, + CHECKOUT = 3, + LATE = 4 + +}; + +enum innkeeper_Timothy_levels + +{ + TIMOTHY_FADE_SCREEN = 1, + TIMOTHY_UNFADE_SCREEN = 2, + TIMOTHY_CHECKOUT = 3, + TIMOTHY_LATE = 4 + +}; + + + + + +void innkeeper_Doris object#() () //this totally works! +{ +var party = UI_get_party_list(); +//var hour = UI_game_hour(); +var minute = UI_game_minute(); + +var current_hour = UI_game_hour(); +var checkout = 9; +var sleephours = ((24 - current_hour) + 8); +var hour_ticks = (sleephours * 1500); +var partynum = UI_get_array_size(party); + + + + if (event == DORIS_FADE_SCREEN) + { + var current_hour = UI_game_hour(); + var current_minute = UI_game_minute(); + var checkout = 9; + var sleephours = ((24 - current_hour) + 8); + var minutes_needed = (59 - current_minute); + var minute_ticks = (minutes_needed * 25); + var advance = (hour_ticks + minute_ticks); + + UI_fade_palette(3, 0, false); //fade to black + UI_advance_time(advance); //hours to advance time to 9am checkout time (actually 8:59) + + + script AVATAR after 30 ticks + { + call innkeeper_Doris, DORIS_UNFADE_SCREEN;}; + + } + + if (event == DORIS_UNFADE_SCREEN) + { + UI_fade_palette(0, 0, true); //unfadefade from black + DORIS.say("The next morning, Doris sullenly serves you breakfast and then returns to her studies."); // Narrator says this. Party Sleeps and eats. + + var targets = getFriendlyTargetList(item, 25); + for (npc in targets) + { + npc->clear_item_flag(PARALYZED); + npc->clear_item_flag(POISONED); + var str = npc->get_npc_prop(STRENGTH); + var hps = npc->get_npc_prop(HEALTH); + var food = npc->get_npc_prop(FOODLEVEL); + npc->set_npc_prop(HEALTH, (str - hps)); + npc->set_npc_prop(FOODLEVEL, (31 - food)); + } + + //UI_add_party_items(partynum, SHAPE_FOOD, QUALITY_ANY, FRAME_EGG); //move to return later + return; + } + +} +////TIMOTHY////////////////// + +void innkeeper_Timothy object#() () //this totally works! +{ +var party = UI_get_party_list(); +//var hour = UI_game_hour(); +var minute = UI_game_minute(); + +var current_hour = UI_game_hour(); +var checkout = 9; +var sleephours = ((24 - current_hour) + 8); +var hour_ticks = (sleephours * 1500); +var partynum = UI_get_array_size(party); + + + + if (event == TIMOTHY_FADE_SCREEN) + { + var current_hour = UI_game_hour(); + var current_minute = UI_game_minute(); + var checkout = 9; + var sleephours = ((24 - current_hour) + 8); + var minutes_needed = (59 - current_minute); + var minute_ticks = (minutes_needed * 25); + var advance = (hour_ticks + minute_ticks); + + UI_fade_palette(3, 0, false); //fade to black + UI_advance_time(advance); //hours to advance time to 9am checkout time (actually 8:59) + + + script AVATAR after 30 ticks + { + call innkeeper_Timothy, TIMOTHY_UNFADE_SCREEN;}; + + } + + if (event == TIMOTHY_UNFADE_SCREEN) + { + UI_fade_palette(0, 0, true); //unfadefade from black + AVATAR.say("You sleep in a comfortable bed...You wake rested and eat a large breakfast."); // narrated + TIMOTHY.say("@Good morning, have a good day.@"); // says Timothy + var targets = getFriendlyTargetList(item, 25); + for (npc in targets) + { + npc->clear_item_flag(PARALYZED); + npc->clear_item_flag(POISONED); + var str = npc->get_npc_prop(STRENGTH); + var hps = npc->get_npc_prop(HEALTH); + var food = npc->get_npc_prop(FOODLEVEL); + npc->set_npc_prop(HEALTH, (str - hps)); + npc->set_npc_prop(FOODLEVEL, (31 - food)); + } + return; + } + + +} + + + + + + + + + +////PETROPH////////////////// + + +//30 ticks per minute +enum innkeeper_Petroph_levels + +{ + PETROPH_FADE_SCREEN = 1, + PETROPH_UNFADE_SCREEN = 2, + CHECKOUT_PETROPH = 3, + LATE_PETROPH = 4 + +}; + + + + + + +void innkeeper_Petroph object#() () //this totally works! +{ +var party = UI_get_party_list(); +//var hour = UI_game_hour(); +var minute = UI_game_minute(); + +var current_hour = UI_game_hour(); +var checkout = 9; +var sleephours = ((24 - current_hour) + 9); +var advance = (sleephours * 1500); +var partynum = UI_get_array_size(party); + + + + if (event == PETROPH_FADE_SCREEN) + { + var sleephours = ((24 - current_hour) + 9); + UI_fade_palette(3, 0, false); //fade to black + UI_advance_time(advance); //hours to advance time to 9am checkout time + + script AVATAR after 30 ticks + { + call innkeeper_Petroph, PETROPH_UNFADE_SCREEN;}; + + } + + if (event == PETROPH_UNFADE_SCREEN) + { + UI_fade_palette(0, 0, true); //unfadefade from black + AVATAR.say("You sleep in a comfortable bed...You wake rested and eat a large breakfast."); + PETROPH.say("@Good morning to you.@"); // Narrator says this. Party Sleeps and eats. + UI_add_party_items(partynum, SHAPE_FOOD, QUALITY_ANY, FRAME_EGG); //eggs based on how many party members + return; + } + +} + +///PEYTON//// + +//30 ticks per minute +enum innkeeper_Peyton_levels + +{ + PEYTON_FADE_SCREEN = 1, + PEYTON_UNFADE_SCREEN = 2, + PEYTON_CHECKOUT = 3, + PEYTON_LATE = 4 + +}; + + + + + + +void innkeeper_Peyton object#() () //this totally works! +{ +var party = UI_get_party_list(); +//var hour = UI_game_hour(); +var minute = UI_game_minute(); + +var current_hour = UI_game_hour(); +var checkout = 9; +var sleephours = ((24 - current_hour) + 8); +var hour_ticks = (sleephours * 1500); +var partynum = UI_get_array_size(party); + + + + if (event == PEYTON_FADE_SCREEN) + { + var current_hour = UI_game_hour(); + var current_minute = UI_game_minute(); + var checkout = 9; + var sleephours = ((24 - current_hour) + 8); + var minutes_needed = (59 - current_minute); + var minute_ticks = (minutes_needed * 25); + var advance = (hour_ticks + minute_ticks); + + UI_fade_palette(3, 0, false); //fade to black + UI_advance_time(advance); //hours to advance time to 9am checkout time (actually 8:59) + + + script AVATAR after 30 ticks + { + call innkeeper_Peyton, PEYTON_UNFADE_SCREEN;}; + + } + + if (event == PEYTON_UNFADE_SCREEN) + { + UI_fade_palette(0, 0, true); //unfadefade from black + PEYTON.say("The next morning, Peyton serves you breakfast."); // Narrator says this. Party Sleeps and eats. + UI_add_party_items(partynum, SHAPE_FOOD, QUALITY_ANY, FRAME_EGG); //eggs based on how many party members + //HEAL PARTY + var targets = getFriendlyTargetList(item, 25); + for (npc in targets) + { + npc->clear_item_flag(PARALYZED); + npc->clear_item_flag(POISONED); + var str = npc->get_npc_prop(STRENGTH); + var hps = npc->get_npc_prop(HEALTH); + npc->set_npc_prop(HEALTH, (str - hps)); + + } + //////////////////////// + + return; + } + +} + +void innkeeper_Martin object#() () // +{ +UI_set_item_flag(MARTIN, READ); //set so you can checkout without going too early. + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/intro.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/intro.uc new file mode 100755 index 0000000..ab0a785 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/intro.uc @@ -0,0 +1,332 @@ + + +//30 ticks per minute +enum Intro_levels + +{ + BEGIN_CUTSCENE = 1, + CIRCLE_OF_STONES = 2, + LIGHTNING_BOLT = 3, + AVATAR_RUNS = 4, + PATH_2 = 5, + PATH_3 = 6, + PATH_4 = 7, + PATH_5 = 8, + FIND_ORB = 9, + MOONGATE = 10, + MOONGATE_RISES = 11, + MOONGATE_WANES = 12, + CLEAR_RAIN = 13 + + + + + }; + + +void GenericPaletteUnfade object#() () +{ + // Do stuff + + // Unfade the palette + UI_fade_palette(12, 1, 1); + //call new event + // Do more stuff +} + +void GenericPaletteFade object#() () +{ + // Do stuff + + // Fade to black: + UI_fade_palette(12, 1, 0); + + // Do more stuff + + script AVATAR after 60 ticks {nohalt; call GenericPaletteUnfade;}; + + // Do even more stuff +} + +void beginCutsceneIntro object#() () +{ + if (event == BEGIN_CUTSCENE) //avatar moves to window + { + gflags[INTRO] = true; + AVATAR->set_item_flag(BG_DONT_MOVE); + UI_play_music(100); + AVATAR.say("Upon your world, five seasons have passed since your triumphant homecoming from Britannia.*"); + AVATAR.say("You have traded the Avatar's life of peril and adventure for the lonely serenity of a world at peace.*"); + AVATAR.say("But television supermen cannot take the place of friends who died at your side!*"); + AVATAR.say("Outside, a chill wind rises...*"); + UI_set_weather(RAIN); + AVATAR.say("...and within moments, the storm is upon you."); + AVATAR.hide(); + + script AVATAR + { + actor frame standing; + wait 1; + face north; + repeat 2 + { + step north; wait 1; + }; + repeat 7 + { + step east; + wait 1; + }; + wait 1; + actor frame standing; + wait 1; + face north; + repeat 3 + { + step north; + wait 2; + }; + + wait 2; + call beginCutsceneIntro, CIRCLE_OF_STONES; + }; + } + + + if (event == CIRCLE_OF_STONES) //avatar sees lightning + { + var pos = [0377, 0058]; + var lever = find_nearest(SHAPE_LEVER, 100); + UI_center_view(lever); + lever->center_view(); + + + script lever + { + wait 5; + call beginCutsceneIntro, LIGHTNING_BOLT; + }; + + } + + if (event == LIGHTNING_BOLT) + { + var BUBBLES = 21; + var LIGHTNING_BOLT_SPRITE = 17; + var pos = [0888, 0088, 00]; + var avatar_bookshelf = UI_find_object(FIND_ON_SCREEN, 1180, QUALITY_ANY, FRAME_ANY); + + script AVATAR + { + wait 10; + }; + + UI_sprite_effect(LIGHTNING_BOLT_SPRITE, 0888, 0088, 0, 0, 0, -1); + UI_lightning(); + UI_sprite_effect(BUBBLES, 0888, 0088, 0, 0, 0, -1); + var orbofmoons = find_nearest(SHAPE_ORB_OF_MOONS, 100); + orbofmoons->move_object(pos); + + //using this to avoid running too many scripts off the Avatar + // script avatar_bookshelf after 10 ticks + script orbofmoons after 10 ticks + { + wait 10; + call beginCutsceneIntro, AVATAR_RUNS; + }; + } + + + if (event == AVATAR_RUNS) //goes outside to circle + { + //var avatarpos1 = [0904, 0139, 00]; //walks to path 1 + var avatarpos1 = [0887, 0100, 00]; //walks to path 5 + var avatarpos2 = [0903, 0122, 00]; //walks to path 2 + var avatarpos3 = [0889, 0117, 00]; //walks to path 3 + var avatarpos4 = [0887, 0106, 00]; //walks to path 4 + var avatarpos5 = [0887, 0100, 00]; //walks to path 5 + + var orbofmoons = find_nearest(SHAPE_ORB_OF_MOONS, 100); + + UI_center_view(AVATAR); + AVATAR->center_view(); + AVATAR.say ("Lightning among the stones! Is this a sign from distant Britannia?"); + AVATAR.say ("You bolt from your house, stumbling, running blind in the storm. Into the forest, down the path, through the rain... to the stones."); + + // UI_si_path_run_usecode(AVATAR, [avatarpos1]); //walk outside + // UI_si_path_run_usecode(AVATAR, [avatarpos2]); //walk to path 2 + // UI_si_path_run_usecode(AVATAR, [avatarpos3]); //walk to path 3 + // UI_si_path_run_usecode(AVATAR, [avatarpos4]); //walk to path 4 + + //run to path 1 + UI_si_path_run_usecode(AVATAR, [avatarpos1], FIND_ORB, AVATAR, beginCutsceneIntro, true); + + UI_error_message("LIGHTNING_BOLT event called from CIRCLE_OF_STONES"); + + + } + + if (event == PATH_2) + { + //var avatarpos2 = [0903, 0122, 00]; //walks to path 3 + + var tree = find_nearest(306, 100); //evergreen + var avatarpos2 = [0889, 0117, 00]; + // UI_si_path_run_usecode(AVATAR, [avatarpos2], PATH_3, AVATAR, beginCutsceneIntro, true); + + //if (AVATAR->path_run_usecode([avatarpos2], beginCutsceneIntro, AVATAR, PATH_3)) + //if (AVATAR->si_path_run_usecode([avatarpos2], PATH_3, AVATAR, beginCutsceneIntro, true)) + if (UI_si_path_run_usecode(AVATAR, [avatarpos2], PATH_3, tree, beginCutsceneIntro, true)) + UI_error_message("PATH_3 event called from PATH_2"); + else + UI_error_message("Failed to reach Path 2"); + + } + + if (event == PATH_3) + { + var avatarpos3 = [0889, 0117, 00]; + UI_si_path_run_usecode(AVATAR, [avatarpos3], PATH_4, AVATAR, beginCutsceneIntro, true); + if (AVATAR->path_run_usecode([avatarpos3], beginCutsceneIntro, AVATAR, PATH_4)) + UI_error_message("PATH_4 event called from PATH_2"); + else + UI_error_message("Failed to reach Path 3"); + + + } + + if (event == PATH_4) + { + var avatarpos2 = [0903, 0122, 00]; //walks to path 5 + UI_si_path_run_usecode(AVATAR, [avatarpos2], PATH_5, AVATAR, beginCutsceneIntro, true); + + + + } + + if (event == PATH_5) + { + var avatarpos2 = [0903, 0122, 00]; //walks to path 2 + UI_si_path_run_usecode(AVATAR, [avatarpos2], PATH_3, AVATAR, beginCutsceneIntro, true); + + + + } + + if (event == FIND_ORB) + { + var orbofmoons = find_nearest(SHAPE_ORB_OF_MOONS, 100); + var pos = [0888, 0096]; + AVATAR.say("Near the stones, the smell of damp, blasted earth hangs in the air. In a frozen moment of lightning struck daylight, you glimpse a tiny obsidian stone in the midst of the circle!"); + AVATAR.say("Wondering, you pick it up..."); + AVATAR.hide(); + //Func0828(orbofmoons); + gotoAndGet(orbofmoons); + //AVATAR->clear_item_flag(BG_DONT_MOVE); + + // UI_si_path_run_usecode(AVATAR, [pos], MOONGATE, AVATAR, beginCutsceneIntro, true); + script orbofmoons after 25 ticks + { + call beginCutsceneIntro, MOONGATE; + }; + + + } + + if (event == MOONGATE) //moongate + { + var moongate; + var pos = [0888, 0088, 00]; + AVATAR->set_item_flag(BG_DONT_MOVE); + moongate = find_nearest(SHAPE_RED_MOONGATE_WANE, 100); + + UI_error_message("Event Moongate called"); + + script AVATAR + { + //actor frame standing; wait 1; face south; + //repeat 5 {step south; wait 1;}; + actor frame standing; wait 1; face north; + say "@Could it be..?@"; + wait 5; + call beginCutsceneIntro, MOONGATE_RISES; + }; + moongate->move_object(pos); + } + + if (event == MOONGATE_RISES) + { + var moongate; + var pos = [0888, 0088, 00]; + moongate = find_nearest(SHAPE_RED_MOONGATE_WANE, 100); + //moongate->move_object(pos); + script moongate + { + + frame 1; + frame 2; + frame 3; + frame 4; + + repeat 3 next frame; + + ;}; + + script AVATAR after 5 ticks + { + call beginCutsceneIntro, MOONGATE_WANES; + }; + + } + + + if (event == MOONGATE_WANES) + { + var moongate = find_nearest(SHAPE_RED_MOONGATE_WANE, 100); + + AVATAR.say("Exultant memories wash over you as you clutch the stone. When you last saw an orb such as this, it was cast down by Lord British to banish the tyrant Blackthorn!*"); + AVATAR.say("But your joy soon gives way to apprehension. The gate to Britannia has always been blue... as blue as the morning sky."); + AVATAR.say("Abruptly, the portal quivers and begins to sink into the ground. Its crimson light wanes! Desperation makes the decision an easy one."); + + script moongate after 5 ticks + { + repeat 6 next frame;; + repeat 5 previous frame;; + repeat 6 next frame;; + }; + + script AVATAR + { + actor frame standing; wait 1; face north; + repeat 5{step north; wait 1; }; + }; + + script moongate after 5 ticks + { + frame 4; + repeat 3 next frame;; + + repeat 6 previous frame;; + remove; + + }; + + script AVATAR after 2 ticks + { + actor frame standing; wait 1; face north; + repeat 5{step north; wait 1; }; + call beginCutsceneIntro, CLEAR_RAIN; + }; + + } + + + if (event == CLEAR_RAIN) + { + UI_set_weather(0); //clears storm + var pos = [1040, 0179, 01]; + AVATAR->move_object(pos); + UI_set_weather(5); + AVATAR->clear_item_flag(BG_DONT_MOVE); + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/intro_functions.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/intro_functions.uc new file mode 100755 index 0000000..7953696 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/intro_functions.uc @@ -0,0 +1,978 @@ + + +//generic function to toggle an npc's BG_DONT_RENDER Flag. If BG_DONT_RENDER is set, clear it. Otherwise set it true. +void toggleRendering object# () () +{ + var rendered = UI_get_item_flag(item, DONT_RENDER); + if (rendered) + UI_clear_item_flag(item, DONT_RENDER); + else + UI_set_item_flag(item, DONT_RENDER); + +} + +void moveAvatarToIntro object# () () +{ + //move Avatar to his house + AVATAR->move_object([0891, 0153,0]); + + //make him sit + UI_set_item_frame(AVATAR, 10); + + //set current game hour to 5p + var hours_to_skip = (10); + var advance = (hours_to_skip * 1500); + + UI_advance_time(advance); + + + +} + +//script to open moongate, give it sound and rotate frames, and ambient light: +void openMoongate object#()() +{ + UI_error_message("Open Moongate called from Earth"); + UI_set_light(AVATAR, true); + script item + { + + frame 1; + frame 2; + frame 3; + frame 4; + + repeat 7 next frame;; + frame 4; + repeat 7 next frame;; + frame 4; + repeat 7 next frame;; + frame 4; //recently added + repeat 7 next frame;; //recently added + + }; + +} + +void closeMoongate object#()() +{ + script item + { + frame 4; wait 3; + frame 3; wait 3; + frame 2; wait 3; + frame 1; wait 3; + frame 0; wait 3; + remove; + wait 25; + } + +} + + + + + + + + +void TeleportBritannia object#() () +{ + var pos = [0935, 1071, 0, 0]; + var pos1 = [0936, 1072, 0, 0]; + var pos2 = [0934, 1074, 0, 0]; + var pos3 = [0932, 1072, 0, 0]; + + //advance game time to 9am-ish + UI_advance_time(HOUR * 6); + + AVATAR->move_object(pos); + SHAMINO->move_object(pos1); + IOLO->move_object(pos2); + DUPRE->move_object(pos3); + + UI_add_to_party(SHAMINO); + UI_add_to_party(IOLO); + UI_add_to_party(DUPRE); + + AVATAR->clear_item_flag(BG_DONT_MOVE); + AVATAR->clear_item_flag(DONT_RENDER); + + //frees LB and company from the WAIT schedule + UI_run_schedule(LORD_BRITISH); + UI_run_schedule(NYSTUL); + UI_run_schedule(GEOFFREY); + + IOLO->clear_item_flag(DONT_RENDER); + SHAMINO->clear_item_flag(DONT_RENDER); + DUPRE->clear_item_flag(DONT_RENDER); + UI_add_cont_items(IOLO, 1, SHAPE_BOOKOFPROPHESIES, QUALITY_ANY, FRAME_ANY); + + //UI_add_cont_items(AVATAR, 1, SHAPE_SWORD, QUALITY_ANY, FRAME_ANY); + + //failsafe - Michael seems to revert to "Wait" schedule for some reason - clear it. + UI_set_schedule_type(MICHAEL, LOITER); + UI_run_schedule(MICHAEL); +} + + + + +void garg1Gate object#() () +{ + GARGTHUG1->set_item_flag(DONT_RENDER); //waits til they get thru gate + UI_play_sound_effect(11); //gate sound +} + +void garg4Gate object#() () +{ + GARGTHUG4->set_item_flag(DONT_RENDER); //waits til they get thru gate + UI_play_sound_effect(11); //gate sound +} + +void garg3Gate object#() () +{ + GARGTHUG3->set_item_flag(DONT_RENDER); //waits til they get thru gate + UI_play_sound_effect(11); //gate sound + AVATAR.say("The gate wanes rapidly as you and Dupre charge through...*"); + AVATAR.say("...but not rapidly enough."); + AVATAR.say("From the mob's vanguard, three of the abominations scramble towards the gate. Driven by fury, the creatures hurl their bodies into the portal's last handspan of light!"); +} + + + + +void gargGate object#() () //sets up gargoyles to leap towards gate +{ + const int SHAPE_OBELISK = 894; + var moongate = find_nearest(SHAPE_RED_MOONGATE_WANE, 100); + var obelisk = find_nearest(SHAPE_OBELISK, 100); + + script obelisk after 65 ticks + { + call TeleportBritannia; //Moved from script moongate + + } + + script moongate after 30 ticks + { + frame 4; wait 3; + frame 3; wait 3; + frame 2; wait 3; + frame 1; wait 3; + frame 0; wait 3; + remove; + wait 25; + + }; + + script GARGTHUG1 after 10 ticks + { + repeat 4 {step north; wait 1; }; + repeat 8 {step NORTHEAST; wait 1; }; + call garg1Gate; + } + + script GARGTHUG4 after 13 ticks + { + actor frame kneeling; wait 1; + actor frame standing; wait 1; + + repeat 4 {step north; wait 1; }; + repeat 4 {step NORTHEAST; wait 1; }; + call garg4Gate; + } + + script GARGTHUG3 after 14 ticks + { + actor frame kneeling; wait 1; + actor frame standing; wait 1; + + repeat 4 {step west; wait 1; }; + repeat 5 {step NORTHWEST; wait 1; }; + call garg3Gate; + } + + +} + + + + +void AvatarGate object#() () +{ + AVATAR->set_item_flag(DONT_RENDER); //waits til they get thru gate + UI_play_sound_effect(11); //gate sound + //gate wanes function + + //then dialogue + + script AVATAR after 20 ticks + { + call gargGate; + }; + + +} + +void ShaminoGate object#() () +{ + SHAMINO->set_item_flag(DONT_RENDER); //waits til they get thru gate + UI_play_sound_effect(11); //gate sound +} + +void DupreGate object#() () +{ + DUPRE->set_item_flag(DONT_RENDER); //waits til they get thru gate + UI_play_sound_effect(11); //gate sound +} + +void IoloGate object#() () +{ + IOLO->set_item_flag(DONT_RENDER); //waits til they get thru gate + UI_play_sound_effect(11); //gate sound +} + +void IoloPicksUpBook object#() () +{ + AVATAR.say("Snatching the fallen priest's book, Iolo dives into the redness with Shamino at his heels. The howling throng surges forward, all of one terrible mind."); + var bookofprophesies = find_nearest(SHAPE_BOOKOFPROPHESIES, 100); + UI_remove_item(bookofprophesies); + + +} + +void killDeadGarg1 object#() () +{ + var bookofprophesies = find_nearest(SHAPE_BOOKOFPROPHESIES, 100); + var bookpos = [1043, 163, 00]; + DEADGARG1->clear_item_flag(SI_TOURNAMENT); + DEADGARG1->reduce_health(50, NORMAL_DAMAGE); +} + + +void deadPriest object#() () +{ + var bookofprophesies = find_nearest(SHAPE_BOOKOFPROPHESIES, 100); + //var bookpos = [1043, 163, 00]; + + GARGPRIEST->clear_item_flag(SI_TOURNAMENT); + GARGPRIEST->reduce_health(50, NORMAL_DAMAGE); + + var book = UI_create_new_object2(SHAPE_BOOKOFPROPHESIES, [1045, 0166, 0]); + //bookofprophesies->move_object(bookpos); + +} + +void deadGarg3 object# () () //changed from gargthug 4 +{ + + DUPRE->clear_item_flag(DONT_RENDER); + SHAMINO->clear_item_flag(DONT_RENDER); + var bookofprophesies = find_nearest(SHAPE_BOOKOFPROPHESIES, 100); + var bookpos = [1036, 163, 00]; + + + script SHAMINO after 8 ticks + { + repeat 3 {step south; wait 1; }; + repeat 1 {step SOUTHWEST; wait 1; }; + face west; wait 1; + actor frame SWING_1; wait 3; + actor frame SWING_2; wait 3; + actor frame SWING_3; wait 3; + sfx 2; wait 5; + actor frame SWING_2; wait 1; + actor frame SWING_1; wait 3; + actor frame SWING_2; wait 3; + actor frame SWING_3; wait 3; + sfx 2; wait 5; + sfx 5; wait 5; + actor frame standing; wait 15; + say "@Let's go!@"; wait 7; //from 2 + repeat 1 {step NORTHEAST; wait 1; }; + repeat 3 { step north; wait 1;}; + call ShaminoGate; + + }; + + script DEADGARG1 after 9 ticks + { + repeat 2 {step NORTHEAST; wait 1; }; + repeat 7 {step east; wait 1; }; + actor frame SWING_1; wait 2; + actor frame SWING_2; wait 2; + actor frame SWING_1; wait 5; + actor frame kneeling; wait 2; + actor frame LIE; wait 2; + call killDeadGarg1; + }; + + //give Avatar sword + UI_add_cont_items(AVATAR, 1, SHAPE_SWORD, QUALITY_ANY, FRAME_ANY, false); + + script DUPRE after 10 ticks + { + //repeat 1 {step SOUTHWEST; wait 1; }; + repeat 9 {step south; wait 2;}; + actor frame standing; face south; wait 1; + actor frame SWING_1; wait 2; + actor frame SWING_2; wait 2; + actor frame SWING_3; wait 2; + actor frame SWING_2; wait 2; + actor frame standing; wait 1; + say"@Quickly, old friend!@"; + wait 4; + say"@To the gate!@"; wait 5; + repeat 5{ step NORTHEAST; wait 1;}; + face south; wait 50; //changed from 30 + repeat 3{ step NORTHWEST; wait 1;}; + call DupreGate; + + + }; + + + + script GARGTHUG1 after 5 ticks + { + actor frame standing; face north; wait 1; + };//make him do more + + + + + + script GARGTHUG2 after 15 ticks + { + repeat 3 {step north; wait 1;}; + repeat 2 {step NORTHWEST; wait 1;}; + sfx 1; + step SOUTHWEST; wait 2; + actor frame sleeping; wait 1; + }; + + script GARGTHUG3 after 20 ticks //maybe change + { + repeat 5 {step NORTHWEST; wait 1;}; + sfx 1; + wait 3; + actor frame kneeling; wait 1; + actor frame LIE; wait 1; + }; + + + script AVATAR after 50 ticks //after dupre frees + { + actor frame standing; face north; + wait 60; //adjust as necessary + repeat 13 {step north; wait 1;}; + call AvatarGate; + } + + + }// end gargthug3 + + +void IoloEmerges object#() () +{ + AVATAR.say("Silent red light fills the darkness. There is the wooden clack of a crossbow, and a violet fletched rose blooms in the priest's barren forehead.*"); + AVATAR.say("Friendly faces vault from a newborn moongate, while a rain of quarrels holds the furious mob at bay. The knight Dupre's sword flashes twice in the darkness, slicing away your bonds!*"); + + + script IOLO after 2 ticks //from 4 ticks + { + actor frame standing; wait 1; face south; + repeat 2{step south; wait 1; }; + actor frame 19; wait 1; face south; + sfx 0; wait 3; + sfx 1; + actor frame 25; wait 1; face south; + actor frame 19; wait 1; face south; + sfx 0; wait 3; + sfx 1; + actor frame standing; wait 1; face east; + actor frame 19; wait 1; face east; + actor frame 25; wait 1; face east; + sfx 0; + actor frame 25; wait 1; face south; + actor frame 19; wait 2; face south; + say "@Hurry!@"; wait 2; + face south; wait 2; + face west; wait 1; + actor frame 25; wait 1; face south; + actor frame 19; wait 1; face south; + sfx 0; wait 3; + sfx 1; + face south; wait 1; + repeat 3{step SOUTHEAST; wait 1; }; + repeat 2{ step south; wait 1;}; + actor frame bowing; wait 5; + call IoloPicksUpBook; wait 5; + repeat 1{step NORTHWEST; wait 1; }; + repeat 5{step north; wait 1; }; + call IoloGate; + + + + }; + + + script GARGTHUG4 after 15 ticks + { + repeat 4 {step NORTHWEST; wait 1; }; + call deadGarg3; + call deadPriest;//move this? + repeat 3 {step north; wait 1;}; + wait 5; + actor frame SWING_1; wait 2; + actor frame SWING_2; wait 3; + actor frame kneeling; wait 1; + actor frame LIE; wait 1; + }; +} + +void CompanionsOut object#() () +{ + IOLO->clear_item_flag(DONT_RENDER); + //UI_add_to_party(SHAMINO); + //UI_add_to_party(DUPRE); + //UI_add_to_party(IOLO); + + script IOLO after 15 ticks + { + call IoloEmerges; + }; +} + + +void openEyes object#() () +{ + UI_fade_palette(0, 0, true); //unfadefade from black + + var pos = [1041, 0153, 00]; + var moongate = find_nearest(SHAPE_RED_MOONGATE_WANE, 100); + moongate->move_object(pos); + + script moongate + { + frame 1; + frame 2; + frame 3; + frame 4; + repeat 40 + { + frame 5; + frame 6; + frame 7; + frame 8; + frame 9; + frame 10; + frame 11; + }; + }; + + AVATAR.say("Catcalls, the dagger, a scream, Death...."); + AVATAR.say("Pandemonium. Shrieks of rage, of terror."); + AVATAR.say("From the inevitable, an impossibility emerges.*"); + AVATAR.say("You are still alive."); + + + script AVATAR + { + call CompanionsOut; + }; +} + +void closeEyes object#() () +{ +/* + var pos = [1041, 0153, 00]; + var moongate = find_nearest(SHAPE_RED_MOONGATE_WANE, 100); + moongate->move_object(pos); +*/ + AVATAR.say("Shouts and jeers explode from the masses as the priest slams shut the book. In his hand a malignant dagger drips with moonlight.*"); + AVATAR.say("You close your eyes. A dying scream, certainly your own, curdles the air.**"); + UI_fade_palette(3, 0, false); // fade to black var moongatepos = [1041, 0153, 00]; + script AVATAR after 10 ticks + { + sfx 0; + wait 3; + sfx 0; + wait 2; + sfx 1; + wait 1; + sfx 3; + wait 2; + sfx 5; + + + } + + +/* + script moongate after 5 ticks + { + frame 1; + frame 2; + frame 3; + frame 4; + + repeat 45 + { //from 30 + frame 5; + frame 6; + frame 7; + frame 8; + frame 9; + frame 10; + frame 11; + }; + }; + +*/ + script AVATAR after 60 ticks + { + call openEyes; + } +} + + +void gargPriestChant object#() () +{ + AVATAR.say("...but you have no place to go."); + AVATAR.say("Before you can offer a protest to the creatures who surround you, scaly claws grasp your body."); + AVATAR.say("With unearthly strength, the monsters bind you to the altar stone!"); + AVATAR.say("Kneeling, the hordes sway and chant as a stately winged nightmare steps forward.*"); + AVATAR.say("The leader unwraps a velvet covered, brass-bound book and recites from it in a formal, stilted tounge.*"); + + script GARGPRIEST + { + actor frame 20; face south; wait 10; + actor frame 21; face south; wait 10; + + actor frame 22; face south; wait 5; + actor frame USE; wait 3; + actor frame CAST_2; wait 3; + actor frame 21; face south; wait 1; + actor frame 23; face south; wait 9; + actor frame 24; face south; wait 10; + say "@An-bal-sil-fer!@"; wait 5; + call closeEyes; + } +} + + + + +void gargoylesApproach object# () () +{ + AVATAR.say("Dazed, you emerge from the portal to find yourself standing on a desolate plain. Nearby, rests a massive rune-struck altar, shrouded in moonlit fog."); + AVATAR.say("At first the plain is still. Then a hundred voices raise a slow, deathlike song, drawing closer and closer with each passing moment. You are seized by an urge to run..."); + + script GARGTHUG1 //comes from south then west to grab Avatar + { + actor frame standing; wait 1; + repeat 10{step north; wait 1;}; + repeat 7 {step east; wait 1;}; + actor frame strike_1h; wait 15; + actor frame standing; wait 1; + face north; + step north; wait 1; + step north; wait 1; + actor frame strike_2h; wait 3; + actor frame USE; wait 3; + repeat 7 {step west; wait 1;}; + repeat 2 {step north; wait 1;}; + face east; + actor frame kneeling; + }; + + script GARGTHUG2 //comes from south then west to grab Avatar + { + actor frame standing; wait 1; + repeat 10{step north; wait 1;}; + repeat 5 {step west; wait 1;}; + actor frame strike_1h; wait 15; + actor frame standing; wait 1; + actor frame strike_1h; wait 3; + actor frame strike_2h; wait 3; + repeat 6 {step east; wait 1;}; + repeat 3 {step north; wait 1;}; + face west; + actor frame kneeling; + }; + + script GARGTHUG4 after 10 ticks //strikes the avatar from behind + { + actor frame standing; wait 1; + repeat 8{step north; wait 1;}; + wait 9; //recently added //moved from 8 + actor frame strike_1h; wait 1; + actor frame standing; wait 13; //may have to adjust + step north; + step north; + actor frame kneeling; + }; + + script AVATAR after 30 ticks //changed from 40 - 4/17 + { + nohalt; + wait 2; + say "@Argh!@"; + actor frame standing; wait 1; face north; + repeat 3{step north; wait 1; }; + actor frame bowing; wait 1; face east; + actor frame kneeling; wait 1; + actor frame sleeping; wait 1; face east; + actor frame sleeping; wait 1; face east; + actor frame sleeping; wait 1; face east; + }; + + script GARGPRIEST after 53 ticks + { + nohalt; + repeat 6{step south; wait 1;}; + repeat 13 {step west; wait 1;}; + face south; wait 1; + call gargPriestChant; + }; + + script GARGTHUG3 after 55 ticks + { + nohalt; + face east; + repeat 3 + { + actor frame SWING_1; wait 1; + actor frame standing; wait 15; + frame SWING_2; wait 10; + frame SWING_1; wait 5; + actor frame standing; + }; + + + }; + + script DEADGARG1 after 55 ticks + { + + face east; + repeat 4 + { + actor frame SWING_3; wait 15; + actor frame SWING_1; wait 10; + actor frame SWING_2; wait 5; + }; + + + }; + + + script GARGBYSTANDER1 after 50 ticks //winged + { + + face east; + repeat 4 + { + actor frame 53; wait 15; + + actor frame 54; wait 8; + actor frame 53; wait 10; + actor frame standing; wait 19; + }; + + + }; + + script GARGBYSTANDER3 after 50 ticks //wingless + { + + face east; + repeat 4 + { + actor frame 55; wait 15; + + actor frame 56; wait 8; + actor frame 55; wait 10; + actor frame standing; wait 10; + }; + + + }; + + + script GARGBYSTANDER4 after 40 ticks //winged + { + + face south; + repeat 4 + { + actor frame 53; wait 15; + actor frame 54; wait 8; + actor frame 53; wait 10; + actor frame standing; wait 19; + }; + }; + + script GARGBYSTANDER2 after 40 ticks //winged + { + + face east; + repeat 30 + { + actor frame 23; wait 5; + actor frame 24; wait 5; + actor frame 23; wait 5; + actor frame 22; wait 5; + actor frame standing; wait 19; + }; + }; + +} + + +void strangeLand object# () () +{ + + //create exiting moongate: + var moongate = UI_create_new_object2(SHAPE_RED_MOONGATE_WANE, [1040, 0177]); + moongate->set_item_frame(6); //open moongate + + script moongate + { + call closeMoongate; + } + + script AVATAR + { + call toggleRendering; //clear DO NOT RENDER flag + actor frame standing; wait 1; face north; + repeat 3{step north; wait 1; }; + actor frame standing; wait 1; face west; + actor frame standing; wait 1; face east; + say "@Where am I??@"; + actor frame standing; wait 1; face north; + repeat 3{step north; wait 1; }; + //wait 1;//// + call gargoylesApproach; + }; +} + + +////////////////////////////// 1st half//////////////////////////////////////////////// + +void clearRain object# () () +{ + UI_set_weather(0); //clears storm + var pos = [1040, 0179, 01]; + AVATAR->move_object(pos); //moves to gargoyle land + UI_set_weather(5); //fog + UI_play_music(102); + script AVATAR { call strangeLand;}; +} + + +void moongateWanes object#() () +{ + var moongate = find_nearest(SHAPE_RED_MOONGATE_WANE, 100); + + AVATAR.say("Exultant memories wash over you as you clutch the stone. When you last saw an orb such as this, it was cast down by Lord British to banish the tyrant Blackthorn!*"); + AVATAR.say("But your joy soon gives way to apprehension. The gate to Britannia has always been blue... as blue as the morning sky."); + AVATAR.say("Abruptly, the portal quivers and begins to sink into the ground. Its crimson light wanes! Desperation makes the decision an easy one."); + + script moongate after 2 ticks + { + frame 6; wait 1; + frame 5; wait 1; + frame 4; wait 1; + frame 3; wait 1; + frame 2; wait 1; + frame 0; wait 1; + remove; + + + }; + + script AVATAR + { + actor frame standing; + wait 1; face north; + repeat 5{step north; wait 1; }; + call toggleRendering; //set DO NOT RENDER flag to true (hide him) + sfx 11; + + wait 2; //from 4 + call clearRain; + }; + +} + +void moongateRises object#() () //makes moongate appear +{ + var moongate; + var pos = [0889, 0088, 00]; + moongate = find_nearest(SHAPE_RED_MOONGATE_WANE, 100); + moongate->move_object(pos); + + + script moongate + { + call openMoongate; + + }; + + script AVATAR after 35 ticks + { + call moongateWanes; + }; +} + +void standBack object#() () +{ + script AVATAR + { + actor frame standing; wait 1; face south; + repeat 5 {step south; wait 1;}; + actor frame standing; wait 1; face north; + say "@Could it be...?@"; + wait 4; + call moongateRises; + }; +} + + +void findOrb object#() () +{ + var orbofmoons = find_nearest(SHAPE_ORB_OF_MOONS, 100); + + AVATAR.say("Near the stones, the smell of damp, blasted earth hangs in the air. In a frozen moment of lightning struck daylight, you glimpse a tiny obsidian stone in the midst of the circle!"); + AVATAR.say("Wondering, you pick it up..."); + AVATAR.hide(); + gotoAndGet(orbofmoons); + + script orbofmoons after 25 ticks + { + call standBack; + }; + +} +void path5 object#() () +{ + + var avatarpos1 = [0904, 0139, 00]; //walks to path 1 + var avatarpos2 = [0903, 0122, 00]; //walks to path 2 + var avatarpos3 = [0889, 0117, 00]; //walks to path 3 + var avatarpos4 = [0887, 0106, 00]; //walks to path 4 + var avatarpos5 = [0887, 0100, 00]; //walks to path 5 + + script AVATAR after 20 ticks + { + call findOrb; + } + +} + +void avatarRuns object#() () //takes center view back to Avatar, runs to circle of stones. PATH 1 +{ + var avatarpos1 = [0904, 0139, 00]; //walks to path 1 + var avatarpos2 = [0904, 0120, 00]; //walks to path 2 + var avatarpos3 = [0891, 0120, 00]; //walks to path 3 + var avatarpos4 = [0887, 0106, 00]; //walks to path 4 + var avatarpos5 = [0887, 0100, 00]; //walks to path 5 + + UI_center_view(AVATAR); + + AVATAR.say ("Lightning among the stones! Is this a sign from distant Britannia?"); + AVATAR.say ("You bolt from your house, stumbling, running blind in the storm. Into the forest, down the path, through the rain... to the stones."); + + //call event 2 + UI_si_path_run_usecode(AVATAR, [avatarpos5], SCRIPTED, AVATAR, path5, true);//walk outside + + + +} + +void lightningOrb object# () () +{ + var BUBBLES = 21; + var LIGHTNING_BOLT_SPRITE = 17; + var pos = [0888, 0088, 00]; + + UI_sprite_effect(LIGHTNING_BOLT_SPRITE, 0888, 0088, 0, 0, 0, -1); + UI_lightning(); + UI_play_sound_effect(62); //lightning bolt sound + UI_sprite_effect(BUBBLES, 0888, 0088, 0, 0, 0, -1); + var orbofmoons = find_nearest(SHAPE_ORB_OF_MOONS, 100); + orbofmoons->move_object(pos); + + script AVATAR after 30 ticks + { + call avatarRuns; + }; +} + +void intro3 object# () () //shows circle of stones, puts orb of moons there +{ + var circleofstones = [0887, 0088, 00]; + UI_view_tile(circleofstones); + script AVATAR after 10 ticks {call lightningOrb;}; +} + + + + +void intro2 object#() () +{ + var avatarpos0 = [0899, 0148, 00]; //walks to path 0 + var avatarpos1 = [0899, 0145, 00]; //walks to path 0 + + + AVATAR.say("Upon your world, five seasons have passed since your triumphant homecoming from Britannia.*"); + AVATAR.say("You have traded the Avatar's life of peril and adventure for the lonely serenity of a world at peace.*"); + AVATAR.say("But television supermen cannot take the place of friends who died at your side!*"); + AVATAR.say("Outside, a chill wind rises...*"); + UI_set_weather(RAIN); + AVATAR.say("...and within moments, the storm is upon you."); + AVATAR.hide(); + + + script AVATAR after 10 ticks + { + actor frame standing; wait 1; + repeat 7 {step NORTHEAST; wait 1;}; + actor frame standing; + wait 20; + + call intro3; + }; + +} + +void intro1 object#() () //should be triggered by egg +{ + gflags[INTRO] = true; + AVATAR->set_item_flag(BG_DONT_MOVE); + UI_play_music(100); + + script AVATAR after 10 ticks + { + face north; + actor frame sitting; wait 20; + actor frame USE; wait 5; + sfx 18; //click + actor frame standing; wait 1; + actor frame sitting; wait 30; + actor frame USE; wait 5; + sfx 18; //click + actor frame standing; wait 10; + actor frame USE; wait 5; + sfx 18; //click + actor frame sitting; wait 15; + call intro2; + }; +} + + + + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/intro_script.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/intro_script.uc new file mode 100755 index 0000000..06f592d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/intro_script.uc @@ -0,0 +1,79 @@ +enum test_levels +{ + EVENT_ONE = 1, + EVENT_TWO = 2, + EVENT_THREE = 3, + EVENT_FOUR = 4 + + + + +}; + + +void introScript object#() () // +{ + + if (event == INTRO_1) + { + var avatarpos0 = [0899, 0148, 00]; //walks to path 0 + var avatarpos1 = [0899, 0145, 00]; //walks to path 0 + + AVATAR.say("Upon your world, five seasons have passed since your triumphant homecoming from Britannia.*"); + AVATAR.say("You have traded the Avatar's life of peril and adventure for the lonely serenity of a world at peace.*"); + AVATAR.say("But television supermen cannot take the place of friends who died at your side!*"); + AVATAR.say("Outside, a chill wind rises...*"); + UI_set_weather(RAIN); + AVATAR.say("...and within moments, the storm is upon you."); + AVATAR.hide(); + + + script AVATAR after 10 ticks + { + actor frame standing; + wait 1; + repeat 7 {step NORTHEAST; wait 1;}; + actor frame standing; + wait 20; + + call introScript, INTRO_2; + }; + + } + + + + if (event == EVENT_TWO) + { + randomPartyBark("@Intro 2 is playing@"); + script AVATAR after 30 ticks + { + call testScript, EVENT_THREE; + + } + + } + + if (event == EVENT_THREE) + { + randomPartyBark("@Event THREE is playing@"); + script AVATAR after 30 ticks + { + call testScript, EVENT_FOUR; + + } + + } + + if (event == EVENT_FOUR) + { + randomPartyBark("@Event FOUR is playing@"); + + + } + + + + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/quenton_sidequest.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/quenton_sidequest.uc new file mode 100755 index 0000000..e598a17 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/quenton_sidequest.uc @@ -0,0 +1,351 @@ +void QuentonSidequest object# () () +{ + + if (event == EGG) + { + var egg_loc = UI_get_object_position(item); + UI_error_message("QuentonSidequest called from egg, is not supposed to happen."); + UI_error_message("Egg is at " + egg_loc[X] + ", " + egg_loc[Y] + ". Deleting and resetting Michael's schedule."); + UI_run_schedule(MICHAEL); + UI_remove_item(item); + + + } + + + + + enum sidequest_levels + { + PREP_SHIP = 1, + MOVE_BOAT = 2, + REMOVE_BOAT = 3, + FAILURE = 4 + + }; + + + + + if (event == PREP_SHIP) + { + //hopefully prevent any rogue duplicate creation of Michael's ship when it shouldn't be.. + if (gflags[MARNEY_SAVED]||gflags[MARNEY_GONE]) + { + UI_error_message("ERROR! Michael's boat cannot be made again."); + + abort; + + } + else + { + UI_error_message(["QuentonSidequest PREP SHIP event called"]); + gflags[MICHAEL_AT_DOCKS] = true; //this will enable a 3 hour time window from 9 to midnight in order to catch him + + + //Search for raft or other Avatar Ship in the immediate area, + //Delete it + UI_remove_from_area(791, FRAME_ANY, [0015, 1434], [0159, 1475]); //Ship + UI_remove_from_area(1017, FRAME_ANY, [0015, 1434], [0159, 1475]); //Ship + UI_remove_from_area(775, FRAME_ANY, [0015, 1434], [0159, 1475]); //Ship rails + UI_remove_from_area(405, FRAME_ANY, [0015, 1434], [0159, 1475]); //Ship's hold + UI_remove_from_area(150, FRAME_ANY, [0015, 1434], [0159, 1475]); //Gangplank + UI_remove_from_area(199, FRAME_ANY, [0015, 1434], [0159, 1475]); //Mast + UI_remove_from_area(680, FRAME_ANY, [0015, 1434], [0159, 1475]); //Deck + UI_remove_from_area(700, FRAME_ANY, [0015, 1434], [0159, 1475]); //Deck + UI_remove_from_area(251, FRAME_ANY, [0015, 1434], [0159, 1475]); //sails + UI_remove_from_area(292, FRAME_ANY, [0015, 1434], [0159, 1475]); //Seats + UI_remove_from_area(961, FRAME_ANY, [0015, 1434], [0159, 1475]); //Barge + UI_remove_from_area(1241, FRAME_ANY, [0015, 1434], [0159, 1475]); //Raft + + //create the ship + AVATAR->createShip(); + + //Move Michael onto the ship + UI_move_object(MICHAEL, [0134, 1459, 1]); + UI_set_schedule_type(MICHAEL, WAIT); + UI_set_item_frame(MICHAEL, 16); + + UI_error_message("Setting MICHAEL to WAIT schedule via quenton sidequest egg event PREP_SHIP"); + + //Move Marney into place on the docks + UI_move_object(MARNEY, [0132, 1468, 2]); + UI_set_schedule_type(MARNEY, WAIT); + UI_set_item_frame(MARNEY, 0); + + //place scrolls near fireplace + + var scroll = UI_create_new_object2(SHAPE_SCROLL, [0626, 1379, 0]); + scroll->set_item_quality(55); + + var scroll2 = UI_create_new_object2(SHAPE_SCROLL, [0626, 1379, 1]); + scroll2->set_item_quality(62); + + //letter from Marney to Michael + var scroll3 = UI_create_new_object2(SHAPE_SCROLL, [0627, 1379, 0]); + scroll3->set_item_quality(63); + } + } + + if (event == MOVE_BOAT) + { + UI_error_message(["QuentonSidequest MOVE_BOAT event called"]); + var barge = UI_find_nearby(MICHAEL, 961, 30, MASK_EGG); + var sailframe; + //find sails, open them + var sail; + var sails = UI_find_nearby([0133, 1461, 5], 251, 30, MASK_EGG); + + + for (sail in sails) + { + sailframe = UI_get_item_frame_rot(sail); + if (sailframe == 37) + sail->set_item_frame(33); + else + sail->set_item_frame(34); + } + + var open_gangplank = UI_find_object(FIND_ON_SCREEN, 150, QUALITY_ANY, FRAME_ANY); + var gangplank; + + gangplank->get_item_shape(open_gangplank); + + open_gangplank->set_item_shape(781); + open_gangplank->set_item_frame(33); + UI_move_object(open_gangplank, [0134, 1461, 1]); + + + script barge + { + call freezeAvatar; + repeat 20{ + step west; + wait 2; + }; + call centerOnAvatar; + call unfreezeAvatar; + wait 2; + call QuentonSidequest, REMOVE_BOAT; + } + + gflags[MICHAEL_AT_DOCKS] = false; + + } + + if (event == REMOVE_BOAT) + { + var boat_pieces; + var piece; + var barge; + + + + boat_pieces = UI_find_nearby([0048, 1459, 0], 680 , FRAME_ANY, MASK_NONE); //rails + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([0048, 1459, 0], 700 , 30, MASK_NONE); //deck + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([0048, 1459, 0], 150 , 30, MASK_NONE); //deck + for (piece in boat_pieces) + UI_remove_item(piece); + + + boat_pieces = UI_find_nearby([0048, 1459, 0], 791 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([0048, 1459, 0], 775 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + boat_pieces = UI_find_nearby([0048, 1459, 0], 665 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([0048, 1459, 0], 1017 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([0048, 1459, 0], 251 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([0048, 1459, 0], 405 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([0048, 1459, 0], 781 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + //barge = UI_find_object([0048, 1459, 0], 791, QUALITY_ANY, FRAME_ANY) + barge = UI_find_nearby([0048, 1459, 0], 791 , 30, MASK_EGG); // + UI_remove_item(barge); + + boat_pieces = UI_find_nearby([0048, 1459, 0], 961 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([0048, 1459, 0], 199 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + + //Move Michael + + UI_move_object(MICHAEL, [0678, 2070, 0]); //moves him to cell + UI_set_schedule_type(MICHAEL, WAIT); + UI_set_item_frame(MICHAEL, 16); + //set tournament flag, so when you "kill" him, he will be captured IF Renthar is in the party. + UI_set_item_flag(MICHAEL, SI_TOURNAMENT); + + if (gflags[MARNEY_GONE]) + { + //Move Marney into holding place + UI_move_object(MARNEY, [0823, 1878, 0]); + UI_set_schedule_type(MARNEY, WAIT); + + //if you let her go, she will be dead or at least not able to be found + if (gflags[FAILED_QUENTON_QUEST]) + UI_set_item_flag(MARNEY, DEAD); + // gflags[FAILED_QUENTON_QUEST] = true; + } + + } + + if (event == FAILURE) + { + UI_error_message(["QuentonSidequest FAILURE event called"]); + if (!gflags[FAILED_QUENTON_QUEST]) + { + gflags[FAILED_QUENTON_QUEST] = true; + UI_error_message(["gflag FAILED_QUENTON_QUEST is true"]); + + gflags[MICHAEL_AT_DOCKS] = false; + + } + if (gflags[MARNEY_SAVED]||gflags[MARNEY_GONE]) //Marney was saved or gone, this shouldn't do anything now + abort; + else //called when you waited too long + { + subtractKarma(20); + + // Find and delete the pieces of the boat. + + var boat_pieces; + var piece; + var x = 0133; + var y = 1459; + var z = 0; + + boat_pieces = UI_find_nearby([x, y, z], 680 , FRAME_ANY, MASK_NONE); //rails + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([x, y, z], 700 , 30, MASK_NONE); //deck + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([x, y, z], 150 , 30, MASK_NONE); //deck + for (piece in boat_pieces) + UI_remove_item(piece); + + + boat_pieces = UI_find_nearby([x, y, z], 791 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([x, y, z], 775 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + boat_pieces = UI_find_nearby([x, y, z], 665 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([x, y, z], 1017 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([x, y, z], 251 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([x, y, z], 405 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([x, y, z], 781 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([x, y, z], 791 , 30, MASK_EGG); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([x, y, z], 961 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + boat_pieces = UI_find_nearby([x, y, z], 199 , 30, MASK_NONE); // + for (piece in boat_pieces) + UI_remove_item(piece); + + + //Move Michael + + UI_move_object(MICHAEL, [0678, 2070, 0]); + UI_set_schedule_type(MICHAEL, WAIT); + UI_set_item_frame(MICHAEL, 16); + UI_error_message("Setting MICHAEL to WAIT schedule via quenton sidequest egg event FAILURE"); + + gflags[MICHAEL_AT_DOCKS] = false; + + //Move Marney into holding place + UI_move_object(MARNEY, [0823, 1878, 0]); + UI_set_schedule_type(MARNEY, WAIT); + UI_set_item_flag(MARNEY, DEAD); + + //Rinaldo and Renthar are both killed by pirates + + // UI_set_item_flag(RINALDO, DEAD); + UI_move_object(RINALDO, [0759, 0424, 0]); + UI_set_schedule_type(RINALDO, WAIT); + UI_apply_damage(127, 127, NORMAL_DAMAGE, RINALDO); + + UI_move_object(RENTHAR, [0823, 1877, 0]); + UI_set_schedule_type(RENTHAR, WAIT); + UI_set_item_flag(RENTHAR, DEAD); + + gflags[MARNEY_GONE] = true; + + + + } + + + + + } + +} + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/quenton_sidequest_eggs.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/quenton_sidequest_eggs.uc new file mode 100755 index 0000000..d008fec --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/quenton_sidequest_eggs.uc @@ -0,0 +1,400 @@ +//Quenton sidequest eggs +const int MARNEY_TIMER = 16; // used for quest +const int INVESTIGATION_TIMER = 16; // used for quest + +void MichaelWaits 3012() +{ + var hour = UI_game_hour(); + var minute = UI_game_minute(); + var hour_to_pass = 20 - hour; + var minute_to_pass = 59 - minute; + var n = ((hour_to_pass * 1500) + (minute_to_pass * 15)); + var player_is_female; + var hours_to_midnight = UI_get_npc_id(RINALDO); + var timer_start = UI_get_npc_id(MICHAEL); + var pronoun; + var quality = UI_get_item_quality(item); + if (player_is_female) // + pronoun = "She"; + else + pronoun = "He"; + + + + + if (event == EGG) + { + + if (quality == 0) + { + + if (gflags[MICHAEL_AT_DOCKS]) + UI_remove_item(item); + + //FAILSAFE: If you sleep, script doesn't advance right? This should keep it moving along + if (!gflags[MICHAEL_AT_DOCKS] && (hour >= 21) && (hour < 24)) //UI_part_of_day(NIGHT) + { + gflags[MICHAEL_TO_SKARA] = true; + + // UI_halt_scheduled(item); //should cancel other script + + script item + { + call QuentonSidequest, 1; + remove; + } + UI_remove_item(item); + + } + + else if ((gflags[STARTED_INVESTIGATION]) && (hour < 21)) + { + //will start timer. Once 9pm hits, Michael moves to Skara to convince Marney to leave with him. + + + if (isNearby(MICHAEL)) + { + MICHAEL.say("@What are you doing here? Get out of my house at once!@"); + MICHAEL.say("He shoves you out of the house and slams the door in your face."); + MICHAEL.hide(); + + //This flag is set to ensure that after the day is over, time will be up. Used in failsafe egg + gflags[MICHAEL_TO_SKARA] = true; + + + UI_error_message(["Ticks in var n needed to wait is " + n]); + + if (isNearby(IOLO)) + { + IOLO.say("As you leave, Iolo whispers to you. @Avatar, normally I wouldn't condone this.. but let's try coming back later tonight to search when he's sleeping...@"); + IOLO.say("@Maybe we'll find something then.@"); + IOLO.hide(); + } + else + { + randomPartySay("@He's clearly hiding something, perhaps we could come back and search when he's asleep..@"); + randomPartySay.hide(); + } + + //pushed out the door + UI_move_object(PARTY, [0632, 1393]); + + //look for open doors / unlocked doors of quality 24 + var door; + var open_doors = UI_find_nearby([0631, 1391, 0], 376, 20, MASK_NONE); + + //change open door to closed, correct quality + for (door in open_doors) + { + UI_set_item_shape(door, 270); + UI_set_item_quality(door, 199); //should prevent breaking? + } + + //make sure script only runs once + if (!UI_get_item_flag(MICHAEL, PETRA)) + { + UI_set_item_flag(MICHAEL, PETRA); + script item after n ticks + { + // nohalt; + call QuentonSidequest, 1; //should create the boat + + } + } + return; + } + else //Michael not nearby, either cheating detected or you failed + UI_remove_item(item); + } + else + abort; + } + + } + +} + +void triggerMarneyConvo 3013() +{ + var hour = UI_game_hour(); + var player_is_female; + var minute = UI_game_minute(); + const int MarneyUpset = 10; //timer + var polite_title = getPoliteTitle(); + + var pronoun; + + if (player_is_female) // + pronoun = "She"; + else + pronoun = "He"; + + if (event == EGG) + { + + if ((hour >= 21) && (isNearby(MARNEY)) && (isNearby(MICHAEL)) && gflags[MICHAEL_AT_DOCKS]) + { + var options = ["goodbye", "wait!"]; + + + //failsafe - ship is buggy sometimes and doesn't show. this will ensure a boat is made: + if (!gflags[MICHAEL_SHIP_BUILT]) + AVATAR->createShip(); + + //another failsafe - if reloading game elsewhere, sometimes ship "disappears". Fix that + //var boat = UI_find_nearby([0133, 1461], 700, 5, MASK_NONE); + var boat = UI_find_nearby(MICHAEL, 700, 5, MASK_EGG); //find new barge created + if (boat == 0) + { + AVATAR->createShip(); + UI_error_message("ERROR! Boat not found at docks. Creating one."); + // barge = UI_find_nearby(MICHAEL, 961, 30, MASK_EGG); //find new barge created + } + var barge = UI_find_nearby(MICHAEL, 961, 30, MASK_EGG); + + UI_set_item_flag(AVATAR, BG_DONT_MOVE); + MARNEY.say("@Oh! Avatar, what brings you here tonight?@ she says, nervously. I was just out for a walk..."); + randomPartySay("@At this late hour?@"); + randomPartySay.hide(); + MARNEY.say("She sighs. @I guess I can't fool the Avatar... The truth is..., I'm going with Michael on a trip to get away from it all.@"); + MARNEY.say("@With my father's murder, the gargoyles, my health.. I need some time away from here. We had talked about this for some time now, but tonight Michael put it all together!@"); + MARNEY.say("@Just...please, don't tell Yorl. I... need to get away from the sadness here for a while...@"); + MARNEY.hide(); + MICHAEL.say("Michael looks at you and appears to hold in his rage as best he can. @This doesn't concern you, Avatar. Marney has agreed to come with me.@"); + MICHAEL.say("@She wants to see the world with me, to ease her heart and mind.@ He turns to Marney. @Let us depart my dear, before Yorl awakes.@"); + MICHAEL.hide(); + MARNEY.say("Marney closes her eyes, trying to hold back tears, then takes a breath. @Yes, let us see the world together. This is for the better.@"); + MARNEY.say("She turns to you. @Farewell Avatar, when I return perhaps thou can stop by sometime and I'll tell you all about our adventures.@"); + converse(options) + { + case "goodbye": + if (inParty(DUPRE)) + { + DUPRE.say("Dupre looks at you incredulosly. @Avatar... you can't possibly be allowing her to leave with him?@"); + DUPRE.hide(); + } + + if (inParty(IOLO)) + { + IOLO.say("@Michael has obviously filled her head with lies, Avatar. We're just going to stand here and let them leave?!@"); + IOLO.hide(); + + } + + if (inParty(SHAMINO)) + { + SHAMINO.say("@Avatar, why didst thou not stop her from making this mistake? Clearly this is not in her best interests...@"); + SHAMINO.hide(); + } + subtractKarma(30); + + //moves Marney to the docks, calls MOVE_BOAT + UI_si_path_run_usecode(MARNEY, [0135, 1458, 1], 2, barge, QuentonSidequest, true); + gflags[MARNEY_GONE] = true; + gflags[FAILED_QUENTON_QUEST] = true; //can't save her now... + break; + + case "wait!"(remove): + MICHAEL.say("Looking impatient and agitated, Michael speaks up, @Make it quick, " + polite_title + ", we're in a hurry..@"); + MICHAEL.hide(); + MARNEY.say("@Yes, Avatar? What is it?@"); + add("Michael killed Quenton"); + + case "Michael killed Quenton"(remove): + MARNEY.say("Wh..what?@"); + AVATAR.say("@I found evidence linking Michael to the murder of your father. It was not the gargoyles.@"); + AVATAR.hide(); + if (inParty(DUPRE)) + { + DUPRE.say("@Milady, Michael killed your father when he didn't repay a debt he owed to him. He's decieving you, you mustn't trust him.@"); + DUPRE.hide(); + } + MARNEY.hide(); + MICHAEL.say("Michael growls, @" + pronoun + "'s a liar! Everyone in town agrees it was those bloody gargoyles who killed thy father.@"); + MICHAEL.hide(); + MARNEY.say("@How do you know this? Where is thy proof? Michael has been nothing but kind to me...@"); + if (UI_count_objects(PARTY, SHAPE_SCROLL, 62, FRAME_ANY)) //bloodstained Michael letter + { + MARNEY.say("You show Marney the bloody letter that was found in Michael's home."); + MARNEY.say("Tears start streaming down her face, and she chokes out: @This.. is father's handwriting..@"); + MARNEY.say("@...Michael? Is this...@ she can barely talk now."); + MARNEY.say("@...how could you...@"); + MARNEY.say("Marney collapses into your arms and starts sobbing."); + MARNEY.hide(); + + UI_set_item_flag(MARNEY, ASLEEP); //make her fall + UI_set_schedule_type(MARNEY, SLEEP); + + MICHAEL.say("Seeing the charade was up, Michael speaks: @It was nothing personal my dear, but after all, he did owe a debt.@"); + MICHAEL.say("He turns to you with murder in his eyes. @You'll pay for this, swine!@"); + MICHAEL.say("Michael raises the anchor, and sails away!"); + delayedBark(AVATAR, "He's gone..", 3); + UI_set_item_flag(MARNEY, SI_ZOMBIE); //used to add more convo flags for her + UI_set_timer(MARNEY_TIMER); //timer for Marney to take some time before she'll talk again + UI_error_message("Current game hour is " + hour + ", Marney timer is set to " + UI_get_timer(MARNEY_TIMER)); + + //Move Renthar to High Court in Yew + RENTHAR->move_object([0675, 0521, 0]); + + //Move Rinaldo in front of him: + RINALDO->move_object([0672, 0520, 0]); + UI_set_schedule_type(RINALDO, WAIT); + UI_set_item_frame(RINALDO, 0); + + //make face each other: + makeNPCFaceNPC(RINALDO, RENTHAR); + makeNPCFaceNPC(RENTHAR, RINALDO); + giveExperience(100); + + gflags[MARNEY_SAVED] = true; + script item + { + call QuentonSidequest, 2; //move boat + + } + UI_remove_item(item); + break; + + + } + else //semi bad ending! + { + MARNEY.say("You realize you don't have the scroll with you!"); + MARNEY.say("She waits a moment, then shakes her head. @What an awful thing to accuse Michael of, with no proof. Please, go away. I musn't keep Michael waiting.@"); + MARNEY.hide(); + MICHAEL.say("@Come milady, thy ship awaits. This will be an journey you'll never forget...@"); + MICHAEL.say("From behind her, he looks at you with an evil grin as he raises the anchor."); + subtractKarma(10); + gflags[MARNEY_GONE] = true; //She can be saved, but scarred for life. + + //Move Renthar to High Court in Yew + RENTHAR->move_object([0675, 0521, 0]); + + //Move Rinaldo in front of him: + RINALDO->move_object([0672, 0520, 0]); + UI_set_schedule_type(RINALDO, WAIT); + UI_set_item_frame(RINALDO, 0); + + //make face each other: + makeNPCFaceNPC(RINALDO, RENTHAR); + makeNPCFaceNPC(RENTHAR, RINALDO); + + + + UI_si_path_run_usecode(MARNEY, [0135, 1458, 1], 2, barge, QuentonSidequest, true); + break; + } + + + } + UI_remove_item(item); //delete egg + } + } + +} + + + +void timeEgg 3016() +{ + + if (event == EGG) + { + var hour = UI_game_hour(); + var minute = UI_game_minute(); + var hour_to_pass = 20 - hour; + var minute_to_pass = 59 - minute; + var n = ((hour_to_pass * 1500) + (minute_to_pass * 15)); + + var time_lapsed = UI_get_npc_id(RINALDO); + + //determines how much time has passed since the Investigation started. If hour is past 9pm but before midnight, call + //function to create ship at docks, move Michael and Marney. + + //Cleanup - if you already solved the quest good or bad, delete this egg. + if (gflags[FAILED_QUENTON_QUEST] || gflags[MARNEY_SAVED]) + UI_remove_item(item); + + //first, determine if it is past time, if so, delete the eggs + if (gflags[STARTED_INVESTIGATION]) + { + var timer = UI_get_timer(INVESTIGATION_TIMER); + /* TODO: Fix the timer. Disabling for now since it wrecks the whole sidequest. + if ((timer > time_lapsed) || (hour < 9) && (!gflags[MARNEY_GONE] && !gflags[MARNEY_SAVED])) + { + UI_error_message("Timer ran out, called failure event. Missed the boat!"); + script item + { + call QuentonSidequest, 4; //failure event + } + UI_remove_item(item); + return; + } + */ + //time is right, but hasn't triggered yet + + if ((hour > 20) && (!gflags[MICHAEL_AT_DOCKS])) + { + UI_error_message("gflags MICHAEL_AT_DOCKS set. Event PREP_SHIP called."); + script item + { + call QuentonSidequest, 1; //create shipcc + } + UI_remove_item(item); + return; + + } + + } + } + else + return; +} + +void fightMichael 3022() +{ + var polite_title = getPoliteTitle(); + if (event == EGG) + { + if (inParty(RENTHAR) && (gflags[MARNEY_SAVED] || gflags[MARNEY_GONE])) + { + MICHAEL.say("@You again?! You're going to pay for interfering in my business! And Renthar.. the coward who deserted the Captain's crew and lived. Let's finish what I started then..to the death!@"); + RENTHAR.say("@It will be finished, but not here. You'll await the guillotine for your crimes, Michael. The Captain will meet his fate soon enough as well...@"); + UI_set_alignment(MICHAEL, EVIL); + UI_set_schedule_type(MICHAEL, IN_COMBAT); + UI_remove_item(item); + return; + } + else if (gflags[FAILED_QUENTON_QUEST]) + { + item.say("Michael looks up as you approach, and sneers at you."); + item.say("@Avatar, thou dost look like you've lost something. Pray tell, what is it?@"); + + UI_set_alignment(MICHAEL, EVIL); + UI_clear_item_flag(MICHAEL, SI_TOURNAMENT); //you can now kill him if you want. + UI_remove_item(item); + + var convo = chooseFromMenu(["Marney", "nothing"]); + if (convo == "Marney") + { + say("@Don't worry about her, " + polite_title + ". She's in good hands now and fetched a fair price for my captain.@"); + say("Michael pulls out a trinket and lets it dangle between his fingers... you then realize it's Marney's locket!"); + say("@Renthar will be dealt with in good time as well, I can assure you that!!@"); + say("Michael grins and turns away from you. @Run along Avatar, I'd like to enjoy some solitude...@"); + return; + } + if (convo == "nothing") + { + say("@Well then, run along Avatar...@"); + say("Michael pulls out a trinket and lets it dangle between his fingers... you then realize it's Marney's locket!"); + say("He grins at you through clenched teeth."); + return; + } + UI_set_alignment(MICHAEL, EVIL); + UI_clear_item_flag(MICHAEL, SI_TOURNAMENT); //you can now kill him if you want. + UI_remove_item(item); + + } + } +} + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/startEndgame.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/startEndgame.uc new file mode 100755 index 0000000..97911d6 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/cutscenes/startEndgame.uc @@ -0,0 +1,22 @@ +void startEndgame() +{ + + + + UI_error_message("startEndgame initiated"); +// freezeParty(); + var party = UI_get_party_list(); + + for (member in party) + { + UI_set_schedule_type(member, WAIT); + + } + + //SendCodexToVoid(item); + script AVATAR after 3 ticks { + call SendCodexToVoid, 1; + } + + //UI_path_run_usecode([2807, 2596, 1], SendCodexToVoid, AVATAR, VORTEX); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/Eruption.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/Eruption.uc new file mode 100755 index 0000000..66a09ce --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/Eruption.uc @@ -0,0 +1,129 @@ +void Eruption (var volcano) +{ + const int SPRITE_EXPLOSION = 1; + const int SFX_ERUPT = 60; + const int SFX_SMOKE = 59; + + const int SPRITE_SMOKE = 3; //from smokebomb + var avatar_distance = UI_get_distance(egg, AVATAR); + var volcano_location = UI_get_item_location(volcano); + UI_error_message("Item location is" + volcano_location); + + //determine if it explodes + var rand = UI_get_random(100); + UI_error_message("Volcano egg hatched: rand number is " + rand); + + //volcano erupts + if (rand < 35) + { + UI_error_message("Volcano egg: random number was " + rand + ", erupt."); + UI_error_message("Rand num was " + rand + ", volcano erupts"); + var target; + + rand = UI_get_random(100); + if (rand < 50) + { + //determine how many npcs are neaby + var targets = UI_find_nearby(volcano, SHAPE_ANY, 6, MASK_NPC2); + + //exp effect + UI_obj_sprite_effect(volcano, SPRITE_EXPLOSION, 0, 0, 0 ,0, 0, -1); + + //play sound + UI_play_sound_effect(SFX_ERUPT, volcano); + UI_earthquake(1); + + var count = 0; + + //apply damage to targets based on how far away they were from the blast + for (target in targets) + { + var target_shape = UI_get_item_shape(target); + count += 1; + UI_error_message("Target " + count + ", is damaged! Shape: " + target_shape); + var target_distance = UI_get_distance(volcano, target); + var damage_base = (50 / target_distance); + UI_apply_damage(damage_base, 15, FIRE_DAMAGE, target); + } + } + + else //volcano erupts with smoke + { + UI_obj_sprite_effect(volcano, SPRITE_SMOKE, 0, 0, 0 ,0, 0, -1); + UI_play_sound_effect(SFX_SMOKE, volcano); + UI_error_message("Volcano egg: random number was " + rand + ", just smoke."); + + + } + + } + else + UI_error_message("Volcano egg: random number was " + rand + ", do nothing."); +} + + +/* WORKING , but skips other random numbers (greater than 25) + +void Eruption (var volcano) +{ + const int SPRITE_EXPLOSION = 1; + const int SFX_ERUPT = 60; + const int SFX_SMOKE = 59; + + const int SPRITE_SMOKE = 3; //from smokebomb + var avatar_distance = UI_get_distance(egg, AVATAR); + var volcano_location = UI_get_item_location(volcano); + UI_error_message("Item location is" + volcano_location); + + //determine if it explodes + var rand = UI_get_random(100); + UI_error_message("Volcano egg hatched: rand number is " + rand); + + //volcano erupts + if (rand < 25) + { + UI_error_message("Volcano egg: random number was " + rand + ", erupt."); + UI_error_message("Rand num was " + rand + ", volcano erupts"); + var target; + + + //determine how many npcs are neaby + var targets = UI_find_nearby(volcano, SHAPE_ANY, 6, MASK_NPC2); + + //exp effect + UI_obj_sprite_effect(volcano, SPRITE_EXPLOSION, 0, 0, 0 ,0, 0, -1); + + //play sound + UI_play_sound_effect(SFX_ERUPT, volcano); + UI_earthquake(1); + + var count = 0; + + //apply damage to targets based on how far away they were from the blast + for (target in targets) + { + var target_shape = UI_get_item_shape(target); + count += 1; + UI_error_message("Target " + count + ", is damaged! Shape: " + target_shape); + var target_distance = UI_get_distance(volcano, target); + var damage_base = (50 / target_distance); + UI_apply_damage(damage_base, 15, FIRE_DAMAGE, target); + } + + } + + else if (rand >= 25 && rand <= 70) //volcano erupts with smoke + { + UI_obj_sprite_effect(volcano, SPRITE_SMOKE, 0, 0, 0 ,0, 0, -1); + UI_play_sound_effect(SFX_SMOKE, volcano); + UI_error_message("Volcano egg: random number was " + rand + ", just smoke."); + + + } + else + UI_error_message("Volcano egg: random number was " + rand + ", do nothing."); + +} + + +*/ \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/array_functions.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/array_functions.uc new file mode 100755 index 0000000..c2cda25 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/array_functions.uc @@ -0,0 +1,273 @@ +/* + * + * Copyright (C) 2006 The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This source file contains miscellaneous array functions. + * + * Author: Marzo Junior + * Last Modified: 2006-02-27 + */ + + +//Added by DB +//compare element with elements in array to get index of that element +var getIndexOfMatchingElement(var array, var element_to_check) +{ + var index = 1; + var element; + for (element in array) + { + if (element == element_to_check) + return index; + index += 1; + } + + +} + + + + + + +//Returns a list of targets for friendly spells +var getFriendlyTargetList (var caster, var dist) +{ + if ((caster->get_npc_object()) in UI_get_party_list()) + //Caster is in the party; return party: + return UI_get_party_list(); + else + { + //Caster not in party + //Get all nearby NPCs: + var npclist = getNearbyNonPartyNPCs(dist); + var retlist = []; + //Get caster's alignment: + var align = caster->get_alignment(); + for (npc in npclist) + //For each NPC in the list, + if (align == npc->get_alignment()) + //Add NPC to list if align matches caster's: + retlist = [retlist, npc]; + if (align == 0) + //Add party to list if caster is friendly: + retlist << UI_get_party_list(); + return retlist; + } +} + +//Returns a list of targets for offensive spells +var getEnemyTargetList (var caster, var dist) +{ + if ((caster->get_npc_object()) in UI_get_party_list()) + //If caster in party, return all non-party NPCs: + return getNearbyNonPartyNPCs(dist); + else + { + //Caster not in party + //Get all nearby NPCs: + var npclist = getNearbyNonPartyNPCs(dist); + var retlist = []; + //Get caster's alignment: + var align = caster->get_alignment(); + for (npc in npclist) + //For each NPC in the list, + if (align != npc->get_alignment()) + //Add NPC to list if align doesn't match caster's: + retlist = [retlist, npc]; + if (align != 0) + //Add party to list if caster is not friendly: + retlist << UI_get_party_list(); + return retlist; + } +} + +//Removes element # elemindex from the array and returns resulting array +var removeFromArrayByIndex (var array, var elemindex) +{ + //var count = 1; + var retarray = []; + + for (elem in array with index) + if (index != elemindex) + retarray << elem; + return retarray; +} + + +//Added by DB +var randomizeArray(var array) +{ + var randomized_array = []; + var array_size = UI_get_array_size([array]); + var element; + + var count = 1; //debug - make sure it doesn't go indefinitely + + var rand_element = UI_get_random(array_size); + while (array_size > 0 && count < 9) + { + + //put random element from array into randomized array + randomized_array << array[rand_element]; + + //remove element from array to avoid using it twice: + array = removeFromArrayByIndex(array, rand_element); + + //get new array size: + array_size = UI_get_array_size([array]); + + //re-roll random number + rand_element = UI_get_random(array_size); + + //DEBUG - count is failsafe + count += 1; + + } + array_size = UI_get_array_size([randomized_array]); + UI_error_message("Array is randomized. contains " + array_size + " elements."); + for (element in randomized_array) + { + UI_error_message("Virtue " + element + " is in new randomized array "); + } + + + return randomized_array; + +} + + + + + + + +//Given an NPC list, returns only those with a given flag set +var filterListByFlag(var list, var flag, var state) +{ + var ret_list = []; + + for (npc in list) + if (npc->get_item_flag(flag) == state) + ret_list << npc; + return ret_list; +} + +//Given an NPC list, returns only those equiped with a given set of objects +//in a given spot +var filterListByEquipedObject(var list, var shapes, var spot) +{ + var ret_list = []; + if (UI_get_array_size(shapes) == 1) + shapes = [shapes]; + + for (npc in list) + if ((npc->get_readied(spot))->get_item_shape() in shapes) + ret_list << npc; + return ret_list; +} + +//Given an NPC list, returns only those hit points less than (max hps)*frac/4 +var filterListByRelHits(var list, var frac) +{ + var ret_list = []; + for (npc in list) + { + var hps = 4*npc->get_npc_prop(HEALTH); + var str = npc->get_npc_prop(STRENGTH); + if (hps 0) + { + if (UI_get_array_size(removes) == 1) + removes = [removes]; + + for (spell in list) + if (!(spell in removes)) + newarray << spell; + } + else + newarray = list; + + return newarray; +} + +//Set-theoretical intersection of sets; returns all the elements in list1 +//which are also in list2 +var intersectLists(var list1, var list2) +{ + var newarray = []; + + if (UI_get_array_size(list2) > 0) + { + if (UI_get_array_size(list2) == 1) + list2 = [list2]; + + for (spell in list1) + if (spell in list2) + newarray << spell; + } + else + newarray = []; + + return newarray; +} + +var filterBodyList(var list, var body) +{ + var newarray = []; + + if (UI_get_array_size(list) > 0) + { + for (currbody in list) + if (currbody->get_body_npc() != body->get_body_npc()) + newarray << currbody; + } + else + newarray = []; + + return newarray; +} + + +//Returns a version of that has stripped from it. +var removeFromArray(var array, var obj) +{ + var newarray = []; + + if (UI_get_array_size(array) > 0) + { + for (curr in array) + if (curr != obj) + newarray << curr; + } + else + newarray = []; + + return newarray; +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_externals.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_externals.uc new file mode 100755 index 0000000..07bba7b --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_externals.uc @@ -0,0 +1,125 @@ +/* + * + * Copyright (C) 2006 Alun Bestor + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file defines constants for shapes and frames in Black Gate's + * SHAPES.VGA. Fill them in as you go along! It is best to use enums to group + * shapes thematically by type and frames by shape, rather than attempting to + * order them numerically. + * + * Author: Alun Bestor (exult@washboardabs.net) + * Last Modified: 2006-03-19 +*/ + +//Item-related functions +//---------------------- + +extern var stealItem 0x8FA(var object); //If belongs to someone (i.e., does not have the OKAY_TO_TAKE flag and the party is not in a dungeon), this executes stolen-item behaviour: guards showing up, party members leaving etc. + +extern var subtractQuantity 0x925(var object); //Remove 1 from 's quantity stack. If it's quantity is at 1, or it has no quantity, this will remove the object. + +//This will try to pathfind the avatar to , which can be an object, NPC or X,Y,Z location(?). +// and are arrays that define a grid of points around the object, and the Avatar will pathfind to the first unoccupied point in that grid (in the order the coordinates were defined). I think declares an acceptable z range to pathfind to, and is usually -3. +//if the player can get there, then they will walk there at regular speed. When they arrive in the region, will be called with as the item and as the event. +//if the player cannot get to any point in the grid it flashes the X cursor and no movement occurs. +extern var gotoObject 0x828(var target, var rangex, var rangey, var rangez, var func, var context, var eventid); + +//returns true if is carried by the avatar, false otherwise. Supports nested containers. +extern var containedByAvatar 0x944(var obj); + +//returns an item reference to the outermost container of . Used for when an object is contained several levels deep. +extern var getOuterContainer 0x945(var obj); + +//returns the cardinal direction lies to, relative to the Avatar. +extern var directionFromAvatar 0x92D(var obj); + +//Places on or near , at the specified x y and z offsets from 's 0 point. +//Note: This is probably FV-only. +extern var placeOnTarget 0x837(var obj, var target, var offset_x, var offset_y, var offset_z); + + +// Conversation/bark-related functions +//------------------------------------ + +// barks after ticks. +extern var delayedBark 0x933(var npc, var line, var delay); + +extern var randomPartyBark 0x08FE(var line); //Get a random nearby party member to say as a bark +extern var randomPartySay 0x08FF(var line); //Get a random nearby party member to say in conversation form + +//returns a random party member who is nearby, or the Avatar if none can be found. +extern var randomPartyMember 0x900(); + +extern var getAvatarName 0x0908(); //returns the name of the Avatar +extern var getPoliteTitle 0x909(); //returns "milord" or "milady", depending on the gender of the Avatar + +//asks a Yes/No question in a conversation; returns true/false respectively +extern var askYesNo 0x90A(); +//takes an array of possible response options, and returns the text of the chosen option +extern var askForResponse 0x90B(var options); + +//Returns false if is asleep, paralysed, a moron (intelligence < 12) or unconscious (health < 0), or true otherwise. +//This can take either an NPC constant or an object reference. +extern var canTalk 0x937(var npc); + +//Returns true if is nearby (according to UI_npc_nearby()) and is not invisible. +//This can take either an NPC constant or an object reference. +extern var isNearby 0x8F7(var npc); + +//Returns true if is within 20 units of . +//This can take either NPC constants or object references. +extern var nearEachOther 0x8FC(var npc1, var npc2); + +//Spouts the generic Fellowship spiel ("An organisation of spiritual seekers...") in the conversation. +extern var askAboutFellowship 0x919(); + +//responsible for common schedule-related barks: e.g. snoring, uttering Fellowship epithets, commenting on the weather, etc. Accepts either an NPC constant or an object reference. +extern var scheduleBarks 0x92E(var npc); + + +//Magic-related functions +//----------------------- + +//returns true if there is a magic storm going on, false otherwise +//this is used by spells to prevent magic from being cast in these zones (AFAIK, only Ambrosia) +extern var inMagicStorm 0x906(); + + +//Script-related functions (used in script{} blocks or with UI_execute_usecode_array()) +//------------------------ + +//Puts in the player's inventory, from world or container. +//if this is not possible, it will flash the X cursor and restore the item to its original position/container. +extern void giveToAvatar object#(0x692) (); + + +// Miscellaneous functions +//------------------------ + +//Gives the specified amount of experience points to every party member. +extern var giveExperience 0x911(var exp); + +//Shows a blocked cursor and plays the "errn" sound. All this really does is supplement UI_flash_mouse() with the sound. (Some originals use this function, some just call UI_flash_mouse directly.) +//See constant.uc for the constants for cursor graphics. +extern var flashBlocked 0x8FD(var cursor); + +//stuff added by me (DB) +//------------------------ + +extern void chantuHeal 0x860 (var price_cure, var price_heal, var price_resurrect); + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_externals2.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_externals2.uc new file mode 100755 index 0000000..c0b81e0 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_externals2.uc @@ -0,0 +1,110 @@ +/* + * + * Copyright (C) 2006 The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + ** + * This header file contains several more external functinos. It is mostly unsorted... + * + * Author: Marzo Junior + * Last Modified: 2006-02-27 + */ + +extern var makeSellPriceString 0x91B (var article, var itemname, var isplural, var price, var quantity_text); + +//Prompts player for quantity of objects to sell (in units of base_quant), charges appropriate gold +//and tries to distribute bought items to party. +//Returns zero if the player chose that number, 2 if the party can't carry what was bought, 3 if the +//party does not have enough gold or 1 if successful. +//If max_quant is zero, it skips the numeric input. +extern var sellAmountToParty 0x8F8(var shapenum, var framenum, var base_quant, var price, var max_quant, var min_quant, var unknownflag); + +//Returns the index (1-n) of a choice the player made from the items in itemnames +extern var chooseFromMenu2 0x90C(var itemnames); + +//Generates a poof of smoke and associated sound: +extern void spellFails object#(0x606) (); +//Returns the level of npc: +extern var getNPCLevel 0x8F6 (var npc); +extern var absoluteValueOf 0x932 (var number); +//Returns all non-party NPCs within dist tiles from Avatar: +extern var getNearbyNonPartyNPCs 0x934 (var dist); +extern var hurtNPC 0x936 (var npc, var damage); +extern var setNonpartySchedule 0x93F (var npc, var sched); + +//Makes an NPC stop dancing (from Dance spell): +extern void stopDancing object#(0x688) (); +//Stops magic storm, clears magic storm flag: +extern void stopMagicStorm object#(0x68A) (); +//Used by magic storm; lightning bolt falls on enemy and causes damage: +extern void callLightning object#(0x60F) (); + +//Sees if container has a minimum amount of a given item: +extern var contHasItemCount 0x931 (var container, var min_count, var shapenum, var quality, var framenum); + +//Uses a key on a door: +extern void UseKeyOnDoor 0x815 (var Door); +//The usecode for the door shapes: +extern void doorHorizontal shape#(0x10E) (); +extern void doorVertical shape#(0x178) (); +extern void door2Horizontal shape#(0x1B0) (); +extern void door2Vertical shape#(0x1B1) (); + +//Moongate-related externs: +//Plays animation where the avatar leaves a moongate: +extern void exitMoongate object#(0x636) (); + +//Closes a moongate created by the orb of the moons: +extern void closeOrbMoongate 0x821 (var moongate); + +//Returns the position where the player clicked as a respose of UI_click_on_item: +extern var getClickPosition 0x822 (var itemref); +//The falling-down-kneeling-over-in-pain animation when the +//avatar gets hurt trying to cross a moongate: +extern var badMoongateAnim 0x825 (var avatarpos, var mongatepos, var coord); +//Returns true if the player is inside a paralelepiped which +//contains all of Trinsic: +extern var inGreaterTrinsicArea 0x93E (); + +//Blacksword-related externs: +//Fire power: +extern void createFire object#(0x6FC) (); +extern void teleportIsleOfFire object#(0x6F9) (); +//Death power: +extern void killTarget object#(0x70F) (); +//The animation (and sound) of the daemon mirror after you +//say "Bye" to Arcadion: +extern void arcadionMirrorHide 0x843 (); +extern var arcadionGemInList 0x844 (var gemlist); +//The Power power: +extern var replenishMana 0x845 (var isblacksword); +extern var swordBlankAndGemInHands 0x846 (); +//The blacksword doesn't kill corpses: +extern var isCorpseShape 0x847 (var target_shape); +//Forces the blacksword into the avatar's inventory: +extern void forceGiveBlackSword object#(0x70B) (); +extern var inIsleOfFire 0x8E7 (); + +//Deletes container and all objects inside it: +extern void deleteObjectAndContents 0x8E6 (var container); +//Does... *something*... to bodies (used mainly for FoV NPCs) +extern void makeStuffToBodies object#(0x6F7) (); + +//Reimplemented: +//Used by Death power to see if the blacksword deems the target to be +//a worthy foe: +extern var isWorthyToKill 0x848 (var target_shape); +//The blacksword is affraid of walking corpses, and won't kill them: +extern var isUndead 0x849 (var target_shape); diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_gflags.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_gflags.uc new file mode 100755 index 0000000..10351a7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_gflags.uc @@ -0,0 +1,153 @@ +/* + * + * Copyright (C) 2006 Alun Bestor + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file defines constants for shapes and frames in Black Gate's + * SHAPES.VGA. Fill them in as you go along! It is best to use enums to group + * shapes thematically by type and frames by shape, rather than attempting to + * order them numerically. + * + * Author: Alun Bestor (exult@washboardabs.net) + * Last Modified: 2006-03-19 +*/ + +//Who the player has met. BG used global flags for this because the MET item flag didn't originally exist. +enum met_flags +{ + MET_LORD_BRITISH = 0x98, + MET_FINNIGAN = 0x4C, + MET_NYSTUL = 0x99, + MET_CHUCKLES = 0x9A, + MET_CANDICE = 0xAA, + MET_WILLY = 0xB5, + MET_GORDON = 0xBB, + MET_CSIL = 0xA4, + + MET_JULIA = 0x1B, + MET_GLADSTONE = 0x110, + + MET_CAMILLE = 0x22A, + + MET_MENION = 0x269, + MET_HORFFE = 0x26E, + MET_TORY = 0x271, + + MET_ELAD = 0x204, + + MET_LEIGH = 0x272, + + MET_INMANILEM = 0x247, + + MET_CHANTU = 0x52 +}; + +//Flags used by the starting murder investigation quest +enum trinsic_murder_flags +{ + GOT_CHRISTOPHERS_KEY = 0x3C, + GOT_TRINSIC_PASSWORD = 0x3D, + NEEDS_TRINSIC_PASSWORD = 0x42, + UNLOCKED_CHRISTOPHERS_CHEST = 0x3E, + + KNOWS_ABOUT_CHRISTOPERS_ARGUMENT = 0x3F, + REFUSED_MURDER_INVESTIGATION = 0x59, + EXPECTED_TO_LOOK_IN_STABLES = 0x5A, + REPORTED_CHRISTOPHERS_KEY = 0x48, + CAN_GIVE_MURDER_REPORT = 0x5B, + STARTED_MURDER_REPORT = 0x5D, + LEARNED_ABOUT_CROWN_JEWEL = 0x40, + LEARNED_ABOUT_HOOK = 0x43, + FINISHED_MURDER_INVESTIGATION = 0x44, + WAITING_FOR_INVESTIGATION_PAYMENT = 0x45 +}; + +//Broken the tetrahedron generator that screws up magic. This affects most conversations with wizards. +const int BROKE_TETRAHEDRON = 0x03; +const int BROKE_CUBE = 0x04; +const int ORB_FIXED_TIMELORD = 0x134; + +//Used the armageddon spell +const int CAST_ARMAGEDDON = 0x1E; + + +//Flags used in conversation with Lord British +enum lb_conversation_flags +{ + WESTON_FREED = 0xCC, + AGREED_TO_FREE_WESTON = 0xCD, + GOT_ORB = 0xDD, + ASKED_LB_ABOUT_MAGIC = 0x66, + LEARNED_ABOUT_BRITAIN_MURDER = 0xD1, //allows you to ask Patterson about it + ASKED_LB_ABOUT_HEAL = 0xD3, + LEARNED_ABOUT_BLACKROCK = 0x65, //allows you to ask Rudyom about it? + ASKED_LB_ABOUT_GUARDIAN = 0xD4, //stops you ever asking him again (yes, plaster over those plot-holes) + LB_REWARDED_FOR_FV = 0x30D //Received Lord British's reward for completing the Forge of Virtue +}; + +//Flags used in conversation with Julia +enum julia_conversation_flags +{ + ASKED_JULIA_TO_LEAVE = 0x101, + JULIA_IN_PARTY = 0x108, + ASKED_JULIA_ABOUT_SPARK = 0x121 +}; + +//Flags used in Minoc conversations to do with the sawmill murder +enum minoc_murder_flags +{ + LEARNED_ABOUT_MINOC_MURDER = 0x11F +}; + +//Flags used by the Owen's Monument quest +enum owen_monument_flags +{ + COMPLETED_OWENS_QUEST = 0xF7, + LEARNED_ABOUT_PLANS = 0x10B, + OWENS_PLANS_ARE_UNSAFE = 0xFD +}; + +//Batlin has buggered off (after you talk to him with the cube in your possession) +const int BATLIN_MISSING = 0xDA; + +//Heard that Patterson is having an affair with Candice +const int HEARD_ABOUT_PATTERSONS_AFFAIR = 0x80; + +//Heard about the Inner Voice +const int HEARD_ABOUT_VOICE = 0x8C; + +const int JEANETTE_LOVES_WILLY = 0x85; //heard about Jeanette's crush on Willy the Baker +const int HIRED_BY_WILLY = 0xCB; //hired by Willy to bake bread + +//Miscellaneous flags for NPCs in Paws +enum paws_flags +{ + HEARD_ABOUT_PAWS_THEFT = 0x212, //Heard from an NPC about the theft + TOBIAS_ACCUSED = 0x213, //Feridwyn accused Tobias of the theft + SOLVED_PAWS_THEFT = 0x218, //Found Garritt was the thief + HEARD_CAMILLES_DEFENSE = 0x234, //Camille has run out to say that her son is innocent of the theft (prevents conversation recurring) + GOT_CAMILLES_WHEAT = 0x21A, //Given the wheat by Camille (prevents her offering it again) + DELIVERED_CAMILLES_WHEAT = 0x21D //Delivered the wheat to Thurston (so you don't get paid for it twice) +}; + +enum serpents_hold_flags +{ + STARTED_HOLD_INVESTIGATION = 0x25E, //Got the mission from John-Paul to find who defaced the statue + FINISHED_HOLD_INVESTIGATION = 0x261, //Finished the statue investigation properly, pinning Sir Pendaran as the culprit + HEARD_ABOUT_RIKY = 0x277, //Heard that Tory's baby son was kidnapped by harpies + RESCUED_RIKY = 0x278 //Player has rescued Riky (prevents conversation from coming up again) +}; diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_gflags2.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_gflags2.uc new file mode 100755 index 0000000..40f4253 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_gflags2.uc @@ -0,0 +1,132 @@ +/* + * + * Copyright (C) 2006 The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file contains several more flags from Black Gate. + * It is mostly unsorted... although generally grouped by similarity. + * + * Author: Marzo Junior + * Last Modified: 2006-02-27 + */ + +//FoV flags: +enum fov_flags +{ + TALKED_ABOUT_RUMBLE = 0x02FE, + BANISHED_EXODUS = 0x030C, + SCROLL_OF_INFINITY = 0x030E, + MET_ERETHIAN = 0x0310, + MET_ARCADION = 0x0313, + BROKE_MIRROR = 0x032F, + COMMANDED_BOND = 0x0330, + REFUSED_HELP_ARCADION = 0x0331, + HELPING_ARCADION = 0x0332, + TALKED_ARCADION_WITH_GEM = 0x0333, + ACCEPTED_GEM_POWER = 0x0333, + ARCADION_SLAVE = 0x0334, + REFUSED_GEM_POWER = 0x0335, + FINISHED_BLADE_FORGING = 0x0337, + TALKED_ABOUT_BINDING_GEM = 0x0338 + // Flags from the original which are unused in the mod: + //BEGIN_BOND = 0x0343, + //FINISHED_BOND = 0x0344 +}; + +//Some Cove flags: +enum cove_flags +{ + MET_JAANA = 0x0018, + ASKED_JAANA_NAME = 0x00EF, + KNOWS_COVE_GOSSIP = 0x00E4, + KNOWS_JAANA_IS_HEALER = 0x0028, + HEARD_ABOUT_NATASSIA = 0x00E0, + HAS_MIRANDAS_BILL = 0x006A, + MET_LORD_HEATHER = 0x00EA, + KNOWS_DEMARIA_KNOWS = 0x00E3, + LOCK_LAKE_BILL_SIGNED = 0x00DE +}; + +enum serpent_hold_flags +{ + KNOWS_LEIGH_IS_HEALER = 0x027A, + CAN_EXAMINE_STONE_CHIPS = 0x0259, + DOING_STATUE_QUEST = 0x025E, + EXAMINED_CHIPS = 0x025F +}; + +enum terfin_flags +{ + KNOWNS_ABOUT_CONFLICTS = 0x0244, + KNOWS_SILAMO_UNHAPPY = 0x023D +}; + +//Some metaplot-related flags: +enum metaplot_flags +{ + DID_FIRST_SCENE = 59, //0x03b; + TALKED_TO_GYPSY = 256, //0x100; + HAD_FIRST_WISP_TALK = 336, //0x150; + WISP_OFFERED_TRADE = 307, //0x133; + DELIVERED_NOTEBOOK_TO_WISPS = 343, //0x157; + LEARNED_ABOUT_ALIGNMENT = 295 //0x127 +}; + +//Flags used in the Improved Orb of the Moons: +enum orb_flags +{ + BROKE_SPHERE = 4, //0x0004 + LEFT_TRINSIC = 87 //0x0057 +}; + +//Some Yew flags, used in reimplementation of Perrin and Reyna +//for the end of the Keyring Quest: +enum yew_flags +{ + MET_PERRIN = 0x0145, + KNOWS_REYNA_LOVES_ANIMALS = 0x013B, + MET_REYNA = 0x0146, + ASKED_REYNA_ABOUT_MOTHER = 0x0128, + KNOWS_REYNA_JOB = 0x0163, + REYNA_EMERGENCY = 0x013A, + GAVE_REYNA_FLOWERS = 0x0139 +}; + +const int MET_MARIAH = 0x01FB; + +//Set when the Magic Storm spell is cast: +const int MAGIC_STORM_SPELL = 0x02ED; + +//Prevents casting of spells because the Avatar is inside +//one of the generators: +const int INSIDE_GENERATOR = 0x39; + +//Seance flags; I have NO idea why they didn't go with just +//ONE flag instead... +enum seance_flags +{ + SEANCE_CAINE = 0x01B2, + SEANCE_FERRYMAN = 0x01B3, + SEANCE_MARKHAM = 0x01B4, + SEANCE_HORANCE = 0x01B5, + SEANCE_TRENT = 0x01B6, + SEANCE_MORDRA = 0x01B7, + SEANCE_ROWENA = 0x01B8, + SEANCE_PAULETTE = 0x01B9, + SEANCE_QUENTON = 0x01BA, + SEANCE_FORSYTHE = 0x01BB +}; diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_npcs.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_npcs.uc new file mode 100755 index 0000000..427f3b5 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_npcs.uc @@ -0,0 +1,446 @@ +/* + * + * Copyright (C) 2006 Alun Bestor + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file defines constants for shapes and frames in Black Gate's + * SHAPES.VGA. Fill them in as you go along! It is best to use enums to group + * shapes thematically by type and frames by shape, rather than attempting to + * order them numerically. + * + * Author: Alun Bestor (exult@washboardabs.net) + * Last Modified: 2006-03-19 +*/ + +//Party members (you know em, you love em) +enum party_members +{ + PARTY = -357, //Used by several intrinsics (e.g. UI_count_objects) that would otherwise take a single NPC + //Not supported by several other intrinsics that you'd really like it to (e.g. UI_get_cont_items) + AVATAR = -356, + IOLO = -1, + SPARK = -2, + SHAMINO = -3, + DUPRE = -4, + JAANA = -5, + SENTRI = -7, + JULIA = -8, + KATRINA = -9, + TSERAMED = -10 +}; + +//Trinsic residents +enum trinsic_npcs +{ + PETRE = -11, //stablekeeper + + + FINNIGAN = -12, //mayor + + MOLE = -13, + + GLEN = -14, + + + CHANTU = -17, //healer + LENORA = -18, + APOLLONIA = -19, //barmaid + UTOMO = -20, // + GARGAN = -21, //shipwright + CAROLINE = -22, //fellowship recruiter + + PAUL = -233, //Passion Play actor + MERYL = -234, //Passion Play actress + DUSTIN = -235, //Passion Play actor + + ELLEN = -236 //wife of Klog +}; + +//Britain residents +enum britain_npcs +{ + LORD_BRITISH = -148, //Castle British, ineffectual monarch + NYSTUL = -139, //Castle British, royal sage + CHUCKLES = -262, //Castle British, royal jester + BATLIN = -26, //arch-villain + BLAINE = -27, // + PEYTON = -25, // Britain Innkeeper + JESSE = -28, //actor + STUART = -29, //actor + AMBER = -30, //actress and Shamino's main squeeze + DAVER = -31, // + MAX = -32, //Castle British, creche child + NICHOLAS = -33, //Castle British, creche child + NANNA = -34, //Castle British, childcare professional and champion of the working class + GEOFFREY = -35, //healer and molecular biologist + ZELLA = -36, //trainer + LUCY = -37, //barmaid and owner of the Blue Boar + GREG = -38, //provisioner + NENO = -39, //musician + JUDITH = -40, //musician and wife of Patterson + CANDICE = -41, //museum curator and mistress of Patterson + CYNTHIA = -42, //treasurer and wife of James + PATTERSON = -43, //mayor and philanderer + ZOLTAN = -44, // + KARINA = -45, //orchard owner + JAMES = -46, //innkeeper + JEANETTE = -47, //barmaid at the Blue Boar and courter of Charles and Willy (make up your mind you silly woman) + WANDA = -49, //gypsy slut + RINALDO = -50, + + WILLY = -52, //baker and total knob + ARTUROS = -53, //seamstress + ANDREAS = -54, //arms dealer at Iolo's Bows + GRAYSON = -55, //arms dealer + DIANE = -56, //stablekeeper + CLINT = -57, //shipwright + GORDON = -58, //fish and chipper + JERRIS = -59, //jeweller + BROWNIE = -60, //farmer and mayoral incumbent + MACK = -61, //farmer and Kilrathi witness + SNAZ = -62, //beggar and irritant + CULHAM = -63, //fellowship recruiter and sister of Thad + + blank = -64, //Castle British, captain of the guard and useless ex-follower + LYSSANDRA = -65, //Castle British, council member and gargoyle representative + SHERRY = -6, + STELNAR = -67, + VANKELLIAN = -66, + NOMAAN = -68, //Castle British, head servant and husband of Boots + WESTON = -69, //Castle British, prisoner and husband of Alina + MIRANDA = -70, //Castle British, council leader + INWISLOKLEM = -71, //Castle British, council member and gargoyle representative + NELL = -72, //Castle British, servant, sister of Charles, and secret lover of at least Carrocio and Lord British (slut) + CHARLES = -73, //Castle British, servant, brother of Nell and courter of Jeanette + + KESSLER = -237 //apothecary +}; + +//Cove residents +enum cove_npcs +{ + RUDYOM = -74, //mad mage + LORD_HEATHER = -77, //mayor and Jaana's main squeeze + PAMELA = -78, //inkeeper and Rayburt's main squeeze + ZINAIDA = -79, //tavernkeeper and de Maria's main squeeze + SANDY = -80, + REGAL = -271 //Rayburt's dog (not sure why he gets an NPC number, it's not like he does anything - maybe for schedules?) +}; + +//Minoc residents +enum minoc_npcs +{ + WHITSABER = -81, //fellowship leader and secret lover of Gregor + LAWRENCE = -82, //mine owner and secret lover of Elynor + BRANDON = -83, //smith + IMMANUELLE = -84, //horse woman + HAROLD = -85, //smith + TOBATHA = -86, //cranky woman + GWENNO = -87, //party + SEARA = -88, //artisan + TARA = -89, //Minoc healer + OWEN = -90, //shipwright and tosser + BURNSIDE = -91, //mayor + RUTHERFORD = -92, //barkeep + BLANK = -93, //sawmill operator + KARENNA = -94, //trainer + JAKHER = -95, //trainer + DORIS = -96, //innkeeper + + MIKOS = -97, //mine foreman + FODUS = -99, //miner and drug addict + OWINGS = -239, //miner and moron + MALLOY = -243 //miner and moron +}; + +//Yew/great forest residents +enum yew_npcs +{ + + KADOR = -98, //emp + TAVENOR = -100, //emp + SALAMON = -101, //emp + NICODEMUS = -102, //mad mage + THAD = -103, //highwayman and brother of Millie + MANDRAKE = -104, //trainer + SIR_JEFF = -105, //judge + TIERY = -106, //gravedigger and creep + REYNA = -108, //healer + GHARL = -111, //troll prisoner + D_REL = -112, //pirate and prisoner + SMITH = -113, //horse and hintbook + AIMI = -114, //monk, gardener and crap painter + PENNI = -115, //trainer and wife of Addom + BEN = -116, //woodcutter + GOTH = -117, //prison warden + PERRIN = -238, //scholar and trainer + TAYLOR = -242, //monk + KREG = -245, //fugitive and false monk + + PAPA = -241, //Bee Caves, nudist + GENERICSHRINE = -255, //Bee Caves, nudist + + XORINIA = -256 //will-o-wisp +}; + +//Jhelom residents +enum jhelom_npcs +{ + DE_SNEL = -119, //trainer + JOSEPH = -120, //mayor + KLIFTIN = -121, //armourer + OPHELIA = -122, //barmaid + DAPHNE = -123, //barmaid + SPRELLIC = -124, //tavern owner and wimp + VOKES = -125, //big dumb fighter + SYRIA = -126, //fighter + TIMMONS = -127 //fighter +}; + +//New Magincia residents +enum new_magincia_npcs +{ + RUSSELL = -129, //shipwright + DUNBAR = -130, //tavernkeeper + MAGENTA = -131, //mayor and wife of Boris + HENRY = -132, //courter of Constance and pathetic sap + CHARLOTTE = -133, // + ANTONIO = -134, //mayor + AURENDIR = -135, // + CONOR = -136, //most humble + WILLIAM = -137, // + ALAGNER = -146 //scholar and plot device +}; + +//Skara Brae residents +enum skara_brae_npcs +{ + GIDEON = -140, // + HORANCE = -141, // + TRENTON = -142, // + DEZANA = -143, // + MARTA = -144, // + YORL = -145, // + QUENTON = -146, // + STIVIUS = -147, // + MARNEY = -75, // + MICHAEL = -76 + +}; + +//U6 PAWS +enum Paws_npcs +{ + + THINDLE = -117, // + MORTUDE = -118, // + MARISSA = -119, // + ARBETH = -120, // + GRISON = -121, // + DORIN = -122, // + MERIDETH = -123, // + HENDLE = -124, // + UBERMON = -125, // + TIMOTHY = -126, // + DR_CAT = -127, // + + + + + + PENUMBRA = -150, //sleeping seeress + ZELDA = -152, //Lycaeum, advisor and courter of Brion + MARIAH = -153, //Lycaeum, mad mage and former companion + CUBOLT = -155, //farmer + AGANAR = -156, // + MANREL = -157, // + MORZ = -158, //f-f-f-farmer + JILLIAN = -159, //Lycaeum, scholar, trainer and husband of Effrem + EFFREM = -160, //househusband of Jillian + CHAD = -161, //trainer + ELAD = -162, //healer + PHEARCY = -163, //tavernkeeper + DERYDLUS = -154, // + ADDOM = -164, //explorer and husband of Penni + FRANK = -165, //Lycaeum, smartarse fox + BRION = -248, //Lycaeum, astronomer + NELSON = -249, //Lycaeum, curator + HOLDERGUY = -250 // Holder guy +}; + +//Paws residents +enum paws_npcs +{ + THURSTON = -166, //miller and courter of Polly + FERIDWYN = -167, //fellowship shelter manager, father of Garritt and husband of Brita + BRITA = -168, //snotty narrowminded bitch, mother of Garritt and wife of Feridwyn + ALINA = -169, //useless poor person and wife of Weston + MERRICK = -170, //sycophant and Fellowship shill + GARRITT = -171, //drug abuser and insufferable offspring of Feridwyn and Brita + MORFIN = -172, //slaughterhouse owner and drug dealer + BEVERLEA = -173, //curio shop owner and blind old bat + KOMOR = -174, //embittered beggar with one leg + FENN = -175, //embittered cart-bound beggar with no legs + ANDREW = -176, //dairy owner + CAMILLE = -177, //farmer, widow and mother of Tobias + TOBIAS = -178, //obnoxious son of Camille + POLLY = -179 //tavernkeeper and courter of Thurston +}; + +//Terfin residents +enum terfin_npcs +{ + DRAXINUSOM = -180, //king of the Gargoyles + + SIN_VRAAL = -181, // + + NAXATILOR = -182, //Seer + INMANILEM = -182, //healer + TEREGUS = -183, //keeper of altars + RUNEB = -184, //fellowship thug + QUAN = -185, //fellowship leader + QUAEVEN = -186, //Rec Center master and fellowship follower + SILAMO = -187, //gardener + SARPLING = -188, //jeweller and magic provisioner + FORBRAK = -189, //tavernkeeper + BETRA = -190 //provisioner +}; + +//residents of the U.S.S. Serpent's Hold +enum serpents_hold_npcs +{ + MENION = -192, //trainer and weaponsmith + PENDARAN = -193, //knight, saboteur and husband of Jehanne + JEHANNE = -194, //provisioner and wife of Pendaran + JOHNE_PAUL = -195, //lord and leader + RICHTER = -196, //armourer and fellowship member + VALKADESH = -197, //Beh Lem's father + JORDAN = -198, //blind arms dealer for Iolo's South who can't even recognise his own boss + DENTON = -199, //bartender, logician, and particularly lame Star Trek reference + TORY = -200, //empath and unconvincingly distraught mother of baby Riky, stolen by dingos (er, harpies) + LEIGH = -201 //healer +}; + +//Vesper residents +enum vesper_npcs +{ + CADOR = -203, //mine overseer + MARA = -204, //miner + ZAKSAM = -205, //trainer + ELDROTH = -206, //provisioner + YONGI = -207, //tavernkeeper + BLORN = -208, //criminal + AUSTON = -209, //mayor + LIANA = -210, //mayor's clerk and total bigot + LAP_LEM = -211, //gargoyle miner + YVELLA = -212, //mother of Catherine and wife of Cador + CATHERINE = -213, //daughter of Yvella and Cador, student of For-Lem + FOR_LEM = -214, //gargoyle handyman and teacher of Catherine + ANSIKART = -215, //gargoyle tavernkeeper + WIS_SUR = -216, //gargoyle magic provisioner + ANMANIVAS = -217, //gargoyle ex-miner + FORANAMO = -218, //gargoyle ex-miner + AURVIDLEM = -219 //provisioner +}; + +//Buccaneer's Den residents +enum buccaneers_den_npcs +{ + PETROPH = -220, //fellowship prisoner and conman + LEODON = -221, //pirate companion + HOMER = -222, //manager of the Baths + LEONNA = -223, //pirate companion + CAPTAIN_FOX = -224, //pirate + SHAWN = -225, //cook + CAPTAIN_ELAD = -226, //ex-pirate + JOHANN = -227, //ex-pirate + LUCKY = -228, //trainer + BUDO = -229, //provisioner + GORDY = -230, //House of Games owner + MANDY = -231, //innkeeper + SEGGALLION = -232, // + DANAG = -251, //fellowship leader + + + AMANDA = -240 //barkeep +}; + +//Miscellaneous NPCs (dungeons and other minor locations) +enum misc_npcs +{ + BEHLEM = -191, // Beh Lem + + IRIALE = -128, //Fellowship Retreat, guardian of the Cube + IAN = -202, //Fellowship Retreat, director + GORN = -138, //Fellowship Retreat, recurring cameo from long-forgotten Origin game + + WAYNE = -109, //Dungeon Despise, lost monk + GAROK = -110, //Dungeon Despise, mad mage and tax fugitive + + ANDREA = -15, //Dagger Isle, vengeful half-sister of Amanda + poop = -48, //Dagger Isle, vengeful half-sister of Eiko + ISKANDER = -107, //Dagger Isle, cyclops and target of Eiko and Amanda's vengeance + + HYDRA = -149, //Ambrosia, three-headed hydra, guardian of meteor + KISSME = -151, //Ambrosia, horny faerie + + CAIRBRE = -244, //Dungeon Destard, friend of Cosmo + KALLIBRUS = -252, //Dungeon Destard, friend of Cosmo + COSMO = -253, //Dungeon Destard, virgin + LASHER = -254, //Dungeon Destard, unicorn and virgin-detector + + HOOK = -291, //Isle of the Avatar, arch-villain + FORSKIS = -298, //Isle of the Avatar, arch-villain + LAURIANNA = -299, //Isle of the Avatar, arch-villain + CSIL= -300 //Isle of the Avatar, arch-villain +}; + +enum intro_npcs +{ +GARGTHUG1 = -264, +GARGBYSTANDER1 = -299, +GARGBYSTANDER2 = -300, +GARGBYSTANDER3 = -301, +GARGBYSTANDER4 = -302, +GARGTHUG2 = -265, +GARGTHUG3 = -266, +GARGTHUG4 = -267, +GARGPRIEST = -263, +DEADGARG1 = -268, +GARGTHUG5 = -278, +GARGTHUG6 = -279, +DEADGARG2 = -269 +}; + +enum junk_npcs +{ +WRONG = -272, //clone_alagner +BLANKDUNGEON = -273 +}; + +enum misc_npcs +{ + +THUG1 = -254, +THUG2 = -292, +THUG3 = -289, +THUG4 = -288, +THUG5 = -280, +THUG6 = -270, +PALACE_GUARD1 = -16, +PALACE_GUARD2 = -51 +}; diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_shapes.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_shapes.uc new file mode 100755 index 0000000..aaefb29 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_shapes.uc @@ -0,0 +1,427 @@ +/* + * + * Copyright (C) 2006 Alun Bestor + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file defines constants for shapes and frames in Black Gate's + * SHAPES.VGA. Fill them in as you go along! It is best to use enums to group + * shapes thematically by type and frames by shape, rather than attempting to + * order them numerically. + * + * Author: Alun Bestor (exult@washboardabs.net) + * Last Modified: 2006-03-19 +*/ + +//Shapes +//------ + +//Shapes used by NPCs (ones that will talk to you and have schedules). Note that there's a bit of confusion between this and monster_shapes since some NPCs have the monster flag (even though they are human). +//Also note that some of these are duplicated to make 'monster' versions - you can find those in monster_shapes below. +enum npc_shapes +{ + //NPCs with unique appearances + SHAPE_MALE_AVATAR = 721, + SHAPE_FEMALE_AVATAR = 989, + SHAPE_FERRYMAN = 155, //Doom Scythe is built into shape, unlike FERRYMAN2 + SHAPE_FERRYMAN2 = 952, //Actually this version is a monster...not sure which actually got used + SHAPE_ALAGNER = 227, + SHAPE_PAPA = 228, + SHAPE_MAMA = 229, + SHAPE_UNICORN = 375, + SHAPE_KISSME = 382, + SHAPE_FAIRY = 382, + SHAPE_BATLIN = 403, + SHAPE_BATLIN2 = 482, //Not sure which is the Real Batlin and which is the clone + + SHAPE_IOLO = 465, + SHAPE_SHAMINO = 487, + SHAPE_DUPRE = 488, + SHAPE_SPARK = 489, + SHAPE_JAANA = 490, + + SHAPE_LORD_BRITISH = 466, + SHAPE_SMITH = 476, //Smith the Horse + SHAPE_FRANK = 477, //Frank the Fox + SHAPE_SHERRY = 478, //Sherry the Mouse + SHAPE_DRAXINUSOM = 480, //Sherry the Mouse + + SHAPE_HOOK = 506, //Hook is a monster, yet Forskis isn't. Huh. + SHAPE_FORSKIS = 805, + SHAPE_ELIZABETH = 881, + SHAPE_ABRAHAM = 882, + + SHAPE_EMP = 479, //There's also a monster emp, SHAPE_MONSTER_EMP. Could be this one is Saralek, and the monster one is everyone else + SHAPE_TROLL = 861, //Not to be confused with monster trolls, this one is used for the troll jailer and troll prisoner + + SHAPE_CYCLOPS = 380, //Friendly Cyclops, not monster cyclops (probably Iskender) + SHAPE_WISP = 534, + + //Gargoyle shapes + SHAPE_GARGOYLE_FLYING = 226, //Never used AFAIK + SHAPE_GARGOYLE_WINGED = 274, + SHAPE_GARGOYLE_WARRIOR = 274, //White straps across torso + SHAPE_GARGOYLE_NOBLE = 473, //Circlet on head + SHAPE_GARGOYLE_WORKER = 475, //No wings + SHAPE_GARGOYLE_WINGLESS = 475, + + //While these have the MONSTER flag, they are only used as NPCs AFAIK + SHAPE_GHOST_FEMALE = 299, + SHAPE_GHOST_MALE = 317, + + //General human shapes + SHAPE_SAGE_MALE = 318, + SHAPE_SAGE_FEMALE = 448, + SHAPE_MAGE_MALE = 445, + SHAPE_MAGE_FEMALE = 446, + + SHAPE_SHOPKEEPER_FEMALE = 454, + SHAPE_SHOPKEEPER_MALE = 455, + + SHAPE_PEASANT_MALE = 319, + SHAPE_PEASANT_FEMALE = 452, + SHAPE_PEASANT_CHILD = 471, + SHAPE_PEASANT_CHILD2 = 965, //Identical in appearance to CHILD + + SHAPE_WOUNDED_MAN = 447, + SHAPE_BEGGAR_CRUTCHES = 449, + SHAPE_BEGGAR_NOLEGS = 450, + + SHAPE_NOBLE_MALE = 451, + SHAPE_NOBLE_FEMALE = 456, + SHAPE_NOBLE_CHILD = 472, + + SHAPE_GYPSY_MALE = 457, + SHAPE_PIRATE = 458, + SHAPE_WENCH = 459, + SHAPE_RANGER_MALE = 460, + SHAPE_RANGER_FEMALE = 461, + + SHAPE_FIGHTER_MALE = 462, + SHAPE_FIGHTER_FEMALE = 463, + SHAPE_PALADIN = 464, + + SHAPE_JESTER = 467, + SHAPE_HIGHWAYMAN = 485, //Only used once, AFAIK + SHAPE_ENTERTAINER_MALE = 468, + SHAPE_ENTERTAINER_FEMALE = 469, + + SHAPE_TOWNSMAN = 265, + SHAPE_BLACKSMITH = 304, + SHAPE_GUARD = 720, //Yes, the actual real-McCoy guard + SHAPE_BARKEEP = 957, //Looks identical to SHOPKEEPER_MALE, just different name + + SHAPE_BABY = 730, //This is just an object, basically. Kinda creepy. + SHAPE_TODDLER = 864 +}; + +//Shapes used by 'monsters' - i.e. combatants and humans without schedules +enum monster_shapes +{ + //Unique monsters + SHAPE_ETHEREAL_MONSTER = 230, + SHAPE_HYDRA = 381, + SHAPE_STONE_HARPIE = 753, + SHAPE_GOLEM = 1015, + + //Human 'monsters' + SHAPE_MONSTER_MAGE = 154, + SHAPE_MONSTER_PALADIN = 247, + SHAPE_MONSTER_FIGHTER = 259, + SHAPE_MONSTER_GUARD = 394, + SHAPE_MONSTER_GUARD2 = 806, + SHAPE_MONSTER_GUARD3 = 946, //Certainly laying it on with the duplicate guards. + //(Presumably they each have different appearances and abilities.) + SHAPE_MONSTER_PIRATE = 401, + SHAPE_MONSTER_EMP = 784, //Not sure why this is a monster? + SHAPE_MONSTER_GARGOYLE = 883, //Of the Wingless variety + SHAPE_FELLOWSHIP_MALE = 884, //Found on Isle of the Avatar + SHAPE_FELLOWSHIP_FEMALE = 929, //Found on Isle of the Avatar + + SHAPE_GHOST = 299, //Your generic white-sheet jobbie + + //Both of these are monsters - one has a crown, the other is more tatty. Not sure which is Horance. + SHAPE_LICHE = 354, + SHAPE_LICHE2 = 519, + + SHAPE_ACID_SLUG = 491, + SHAPE_ALLIGATOR = 492, + SHAPE_BAT = 493, + SHAPE_CORPSER = 499, + + SHAPE_MONSTER_CYCLOPS = 501, //Not to be confused with SHAPE_CYCLOPS, which is the friendly NPC version + + SHAPE_DRAGON = 504, + SHAPE_DRAKE = 505, + + SHAPE_GAZER = 511, + SHAPE_GREMLIN = 513, + SHAPE_HEADLESS = 514, + + SHAPE_REAPER = 524, + SHAPE_SEA_SERPENT = 525, + + SHAPE_SKELETON = 528, + SHAPE_SLIME = 529, + + SHAPE_HARPIE = 532, + SHAPE_MONSTER_TROLL = 533, //There's also an NPC troll, SHAPE_TROLL + + SHAPE_TENTACLES = 536, + SHAPE_MONGBAT = 661 +}; + +//Shapes used by 'normal' animals (i.e., real-life ones, whether friendly or hostile) +enum animal_shapes +{ + SHAPE_BEE = 494, + SHAPE_CAT = 495, + SHAPE_DOG = 496, + SHAPE_CHICKEN = 498, + SHAPE_COW = 500, + SHAPE_DEER = 502, + SHAPE_FISH = 509, //live fish in the water, not dead ones on your plate (those are frames of SHAPE_FOOD, see food_frames below) + SHAPE_FOX = 510, //Not to be confused with Frank the Fox, who is SHAPE_FRANK + SHAPE_FLY = 517, + SHAPE_MOUSE = 521, //Not to be confused with Sherry the Mouse, who is SHAPE_SHERRY + SHAPE_RAT = 523, + SHAPE_SNAKE = 530, + SHAPE_WOLF = 537, + SHAPE_SCORPION = 706, + SHAPE_BIRD = 716, + SHAPE_HORSE = 727, //Not to be confused with Smith the Horse, who is SHAPE_SMITH + SHAPE_DRAFT_HORSE = 796, //These hardly count as an animal, poor things + SHAPE_RABBIT = 811, + SHAPE_SPIDER = 865, + SHAPE_SHEEP = 970 +}; + +const int SHAPE_KEY = 641; +const int SHAPE_GOLD = 644; //Filthy lucre +const int SHAPE_SCROLL = 797; +const int SHAPE_EGG = 275; +const int SHAPE_FISHING_ROD = 662; //fishing rod (quel surprise) + +const int SHAPE_RUNE = 877; +const int SHAPE_ORB = 785; //Orb of the Moons + +const int SHAPE_PRISM = 981; //The Guardian's three prisms + +const int SHAPE_FOOD = 377; +const int SHAPE_BOTTLE = 616; +const int SHAPE_REAGENT = 842; +const int SHAPE_KITCHEN_ITEM = 863; +const int SHAPE_BUCKET = 810; +const int SHAPE_POWDER_KEG = 704; + +const int SHAPE_DOUGH = 658; +const int SHAPE_HEARTH = 831; + +const int SHAPE_WHEAT = 677; +const int SHAPE_MILLSTONE = 711; + +const int SHAPE_WELL = 740; +const int SHAPE_WELLBASE = 470; +const int SHAPE_ROCK = 331; + +const int SHAPE_WORKTABLE_VERTICAL = 1003; +const int SHAPE_WORKTABLE_HORIZONTAL = 1018; + +const int SHAPE_EMPTY_CRADLE = 992; +const int SHAPE_FULL_CRADLE = 987; + +const int SHAPE_SPILL = 912; + +enum light_sources +{ + SHAPE_LIGHTSOURCE = 336, + SHAPE_SCONCE = 481, + SHAPE_TORCH = 595, + SHAPE_LIGHTSOURCE_LIT = 338, + SHAPE_SCONCE_LIT = 435, + SHAPE_TORCH_LIT = 701, + SHAPE_CAMPFIRE = 825 + //SHAPE_FIREPIT lives in forging_shapes below +}; + +enum cloth_shapes +{ + SHAPE_THREAD = 654, + SHAPE_LOOM = 261, + SHAPE_CLOTH = 851, + SHAPE_BANDAGE = 827, + SHAPE_TOP = 249, + SHAPE_PANTS = 738, + SHAPE_TOY = 742, + SHAPE_CLOAK = 285, + SHAPE_COSTUME = 838, + SHAPE_HOOD = 444, + SHAPE_SHEARS = 698, + SHAPE_WOOL = 653 +}; + +//Door shapes +enum door_shapes +{ + SHAPE_DOOR_HORIZONTAL = 270, + SHAPE_DOOR_VERTICAL = 376, + SHAPE_DOOR2_HORIZONTAL = 432, + SHAPE_DOOR2_VERTICAL = 433, + + SHAPE_ABBEY_DOOR_LEFT_HORIZONTAL = 246, + SHAPE_ABBEY_DOOR_RIGHT_HORIZONTAL = 225, + + SHAPE_ABBEY_DOOR_LEFT_VERTICAL = 250, + SHAPE_ABBEY_DOOR_RIGHT_VERICAL = 392 //Note: This is actually a copy of ABBEY_DOOR_LEFT_VERTICAL. Maybe they screwed up but never used them anyway. +}; + +//Chest shapes +enum chest_shapes +{ + SHAPE_CHEST = 800, + SHAPE_LOCKED_CHEST = 522 +}; + +//Shapes used in mining +enum mining_shapes +{ + SHAPE_MINING_MACHINE = 410, + SHAPE_CONVEYOR_BELT = 411, + SHAPE_BLACKROCK = 914, + SHAPE_LEAD_ORE = 915, + SHAPE_IRON_ORE = 916, + SHAPE_STONE_CHIPS = 815 +}; + +//Shapes used in weaponsmithing (e.g. Forge of Virtue) +enum forging_shapes +{ + SHAPE_SWORDBLANK = 668, + SHAPE_ANVIL = 991, + SHAPE_TROUGH_VERTICAL = 719, + SHAPE_TROUGH_HORIZONTAL = 741, + SHAPE_FIREPIT = 739 +}; + +enum moongate_shapes +{ + SHAPE_ORB_MOONGATE_HORIZONTAL = 779, + SHAPE_ORB_MOONGATE_VERTICAL = 157, + SHAPE_STANDING_RED_MOONGATE = 776, + SHAPE_STANDING_BLUE_MOONGATE = 777 +}; + +enum weapon_shapes +{ + SHAPE_HAMMER = 623, + SHAPE_CUSTOM_SWORD = 635, + SHAPE_BLACK_SWORD = 707 +}; + +//Frames +//------ + +//these are frames of SHAPE_TOP +const int FRAME_SHIRT = 0; +const int FRAME_DRESS1 = 1; +const int FRAME_DRESS2 = 2; + +const int FRAME_CUBE = 1; //the cube prism + +const int FRAME_RUNE_HONOR = 6; + +enum kitchen_item_frames +{ + FRAME_FLOURSACK_OPEN = 0, + FRAME_PITCHER = 2, + + FRAME_ROLLINGPIN = 8, + FRAME_ROLLINGPIN_2 = 9, + FRAME_FLOURSACK = 13, + FRAME_FLOURSACK_2 = 14, + FRAME_CHURN = 15 +}; + +enum food_frames +{ + FRAME_BREAD = 0, + FRAME_ROLLS = 1, + FRAME_BAGUETTE = 2, + FRAME_BREAD_LONG = 2, //for you Francophobes (or should I call it "FRAME_BREAD_FREEDOM"?) + FRAME_FRUITCAKE = 3, + FRAME_CAKE = 4, + FRAME_PIE = 5, + FRAME_PASTRY = 6, + + FRAME_SAUSAGES = 7, + FRAME_MUTTON = 8, + FRAME_BEEF = 9, + FRAME_CHICKEN = 10, + FRAME_HAM = 11, + FRAME_TROUT = 12, + FRAME_FLOUNDER = 13, + FRAME_VENISON = 14, + FRAME_JERKY = 15, + + FRAME_APPLE = 16, + FRAME_BANANA = 17, + FRAME_CARROTS = 18, + FRAME_CARROT = 18, + FRAME_GRAPES = 19, + FRAME_PUMPKIN1 = 20, + FRAME_PUMPKIN_LARGE = 20, + FRAME_PUMPKIN2 = 21, + FRAME_PUMPKIN_SMALL = 21, + FRAME_LEEK = 22, + + FRAME_RIBS = 23, + FRAME_EGG = 24, + + FRAME_BUTTER = 25, + FRAME_CHEESE1 = 26, + FRAME_CHEESE_WHEEL = 26, + FRAME_CHEESE2 = 27, + FRAME_CHEESE_WEDGE = 27, + FRAME_CHEESE3 = 28, + FRAME_CHEESE_GREEN = 28, + + FRAME_POTATO = 29, + FRAME_FISH_AND_CHIPS = 30, + FRAME_SILVERLEAF = 31 +}; + +enum bottle_frames +{ + FRAME_MILK = 7 +}; + +enum dough_frames //used in baking.uc +{ + FRAME_FLOUR = 0, + FRAME_DOUGH_FLAT = 1, //this will now create a pastry when cooked in the oven + FRAME_DOUGH_BALL = 2 +}; + +enum bucket_frames +{ + FRAME_BUCKET_EMPTY = 0, + FRAME_BUCKET_WATER = 1, + FRAME_BUCKET_BLOOD = 2, + FRAME_BUCKET_WINE = 3, + FRAME_BUCKET_BEER = 4, + FRAME_BUCKET_BEER2 = 5, + FRAME_WATERINGCAN = 6 +}; diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_shapes2.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_shapes2.uc new file mode 100755 index 0000000..27ff2b7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/bg_shapes2.uc @@ -0,0 +1,205 @@ +/* + * + * Copyright (C) 2006 The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file contains several more shape numbers. It is mostly unsorted... + * + * Author: Marzo Junior + * Last Modified: 2006-02-27 + */ + +const int SHAPE_SCONCE_SPENT = 535; //0x0217 +const int SHAPE_LIGHTSOURCE_SPENT = 997; //0x03E5 +const int QUALITY_TORCH_SPENT = 255; //0x00FF +const int SHAPE_LIT_LAMP = 526; +const int SHAPE_LAMPPOST = 889; + +const int SHAPE_BACKPACK = 801; +const int SHAPE_BAG = 802; + +const int SHAPE_2H_HAMMER = 600; +const int SHAPE_2H_SWORD = 602; +const int SHAPE_MORNINGSTAR = 596; +const int SHAPE_SPIKEDSHIELD = 578; +const int SHAPE_HALBERD = 603; +const int SHAPE_ARROWS = 722; //0x2D2 +const int SHAPE_BOLTS = 723; //0x2D3 + +const int SHAPE_BLACKSWORD = 707; //0x2C3 +const int SHAPE_MAGIC_BOLTS = 417; +const int SHAPE_BURST_ARROWS = 554; +const int SHAPE_MAGIC_ARROWS = 556; +const int SHAPE_LUCKY_ARROWS = 558; +const int SHAPE_LOVE_ARROWS = 560; +const int SHAPE_TSERAMED_ARROWS = 568; +const int SHAPE_LIGHTNING_WAND = 629; +const int SHAPE_FIRE_WAND = 630; +const int SHAPE_FIREDOOM_STAFF = 553; +const int SHAPE_MAGICIANS_WAND = 792; + +const int SHAPE_LEATHER_HELM = 1004; +const int SHAPE_LEATHER_ARMOR = 582; +const int SHAPE_LEATHER_COLLAR = 569; +const int SHAPE_LEATHER_GLOVES = 579; +const int SHAPE_LEATHER_LEGGINGS = 574; +const int SHAPE_LEATHER_BOOTS = 587; + +const int SHAPE_CHAIN_COIF = 539; +const int SHAPE_CHAIN_ARMOUR = 571; +const int SHAPE_CHAIN_LEGGINGS = 575; + +const int SHAPE_GAUNTLETS = 580; +const int SHAPE_GORGET = 586; +const int SHAPE_PLATE_ARMOUR = 573; +const int SHAPE_PLATE_LEGGINGS = 576; +const int SHAPE_GREAT_HELM = 541; + +const int SHAPE_MAGIC_ARMOR = 666; + +const int SHAPE_GEM = 760; +const int SHAPE_JEWELRY = 937; +const int SHAPE_GOLD_NUGGET = 645; +const int SHAPE_GOLD_BAR = 646; +const int SHAPE_GOLD_COIN = 644; + +const int SHAPE_SPELLBOOK = 761; //0x2F9 + +const int SHAPE_POTION = 340; //0x154 + +const int SHAPE_SEXTANT = 650; //0x28A + +const int SHAPE_VENOM = 649; //0x289 + +const int SHAPE_AMULET = 955; //0x3BB + +const int SHAPE_DEATHBOLT = 527; //0x20F + +const int SHAPE_LARGE_BODIES = 778; //0x30A +const int FRAME_DRAGON_BODY = 7; //0x007 +const int SHAPE_BODIES_1 = 400; //0x190 +const int FRAME_MONK_BODY_1 = 5; //0x005 +const int SHAPE_BODIES_2 = 414; //0x19E +const int FRAME_LBBODY2 = 13; //0x00D +const int SHAPE_BODIES_3 = 762; //0x19E +const int FRAME_MAGEBODY = 22; //0x00D +const int SHAPE_BODIES_4 = 892; //0x19E +const int SHAPE_BODIES_5 = 778; //0x19E + +const int SHAPE_BROKEN_DISH = 546; +const int SHAPE_GARBAGE = 415; +const int SHAPE_STAIN = 912; +const int SHAPE_DIAPER = 822; +const int SHAPE_BROKEN_ROOF = 223; +const int SHAPE_ANCHOR = 886; +const int SHAPE_BLOOD = 912; + +const int SHAPE_DARK_CORE = 0x03DE; +const int SHAPE_GHOST2 = 0x0151; + +const int SHAPE_SLEEPING_POWDER = 648; + +const int SHAPE_INVISIBILITY_DUST = 790; + +const int SHAPE_BOOK = 642; //0x282 + +const int SHAPE_BEE_STINGER = 947; + +const int SHAPE_PLANT = 999; //0x03E7 + +const int SHAPE_TOMBSTONE = 715; //0x02CB + +const int SHAPE_BED_HORIZONTAL = 696; +const int SHAPE_BED_VERTICAL = 1011; + +const int SHAPE_CAULDRON = 995; + +const int SHAPE_TRAP = 200; //0x0C8 + +const int SHAPE_PATH_EGG = 607; + +const int SHAPE_WINCH_HORIZONTAL = 949; +const int SHAPE_WINCH_VERTICAL = 950; + +const int SHAPE_LEVER = 787; +const int SHAPE_SWITCH = 788; + +const int SHAPE_SPINNING_WHEEL = 651; + +const int SHAPE_KITE = 329; + +const int SHAPE_BELLOWS = 431; + +const int SHAPE_KEG = 258; +const int SHAPE_CASK = 434; + +const int SHAPE_STRENGTH_TESTER = 743; + +const int SHAPE_CHAIR = 873; + +const int SHAPE_BEDROLL = 583; + +const int SHAPE_FALSE_WALL_HORIZONTAL = 845; +const int SHAPE_FALSE_WALL_VERTICAL = 828; + +const int SHAPE_GHOST3 = 337; + +const int SHAPE_LENS = 726; //0x2D6 + +const int KEY_PICKABLE_TRAPPED = 255; //only found on chests - doors cannot be trapped. + +const int SHAPE_VIRTUE_STONE = 330; + +const int SHAPE_SPELL_SLEEP = 72; +const int SHAPE_SPELL_EXPLOSION = 78; +const int SHAPE_SPELL_CHARM = 80; +const int SHAPE_IGNITE = 280; +const int SHAPE_CURSE = 281; +const int SHAPE_SWORDSTRIKE = 287; +const int SHAPE_ENERGY_MYST = 399; +const int SHAPE_PARALYZE = 408; +const int SHAPE_POISON = 424; +const int SHAPE_TELEKINESIS = 443; +const int SHAPE_DOUSE = 540; +const int SHAPE_DELAYED_EXPLOSION = 621; +const int SHAPE_DEATH_VORTEX = 639; +const int SHAPE_LIGHTNING = 807; +const int SHAPE_FIREBOLT = 856; + +const int SHAPE_ENERGY_FIELD = 768; +const int SHAPE_FIRE_FIELD = 895; +const int SHAPE_POISON_FIELD = 900; +const int SHAPE_SLEEP_FIELD = 902; + +const int SHAPE_GUARDIAN_STATUE = 945; + +const int SHAPE_CASTING_FRAMES = 859; + +const int SHAPE_PEDESTAL = 718; + +const int SHAPE_VORTEX_CUBE = 786; + +const int SHAPE_STATUE = 854; + +const int SHAPE_TIME_BARRIER = 1021; + +const int KEY_INN = 255; //0x0FF, keys for inn doors. + +const int SHAPE_BOW = 597; +const int SHAPE_MAGIC_BOW = 606; +const int SHAPE_CROSSBOW = 598; +const int SHAPE_TRIPLE_XBOW = 647; diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/constants.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/constants.uc new file mode 100755 index 0000000..145b719 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/constants.uc @@ -0,0 +1,560 @@ +/* + * + * Copyright (C) 2006 Alun Bestor/The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file defines general constants used throughout usecode, for + * Black Gate and Serpent Isle. Constants particular to a function can be + * found in the relevant codefile; constants particular to a game can be + * found in that game's header directory. + * + * Author: Alun Bestor (exult@washboardabs.net) + * With modifications by Marzo Junior (marzojr@yahoo.com) + * Last modified: 2006-02-27 + */ + +/* + * Event types, compiled with help from Marzo + * The global variable is set with one of these values to describe + * how the current function was called: whether by the player clicking on the + * object, or by a scripted event, or by egg trigger conditions, or just the + * item being onscreen, etc. + * Functions check the value of in order to provide different responses + * to different events. + * Functions can also set to an arbitrary value, in order to mimic a + * real event or just as a 'pseudo-argument' to functions called with the + * likes of UI_path_run_usecode. + */ + + + +enum events +{ + PROXIMITY = 0, // Object is on-screen or nearby + // This is called repeatedly, with a random delay + // between each call + DOUBLECLICK = 1, // Object is double-clicked on + SCRIPTED = 2, // Function is called from inside a script{} block + // (very common) + EGG = 3, // Object is an egg that just hatched (triggered by + // egg activation conditions) + WEAPON = 4, // Object was wielded and 'swung' in combat + // This is mainly used with 'weapon-like' objects + // - e.g. smokebombs and fishing rods - that have more + // advanced 'attack' behaviour. + + READIED = 5, // Object was worn or readied in inventory - used by + // items like the Ring of Invisibility + UNREADIED = 6, // Object was taken off or put away in inventory + + DEATH = 7, // NPC has just been killed (SI-only) + STARTED_TALKING = 9, // NPC starts conversation with you (has TALK + // schedule and has reached the Avatar) + // This is SI-only - BG uses event 1 for this, + // both for conversations triggered by doubleclick + // and by the TALK schedule + + //The following events are arbitrary programmer conventions: + PATH_SUCCESS = 10, // Set with calls to UI_path_run_usecode, to indicate + // a successful pathfind to the target object + PATH_FAILURE = 11 // Set with calls to UI_set_path_failure, to indicate + // an interrupted pathfind (e.g. when the player + // moves the Avatar manually) +}; + +/* + * Coordinate axes - use when referencing X,Y,Z coordinate arrays. + * Note that the coordinates returned by UI_click_on_item are 1 array-index + * higher, because index 1 of the returned array is the actual item clicked on. + * You can resolve this to a regular X,Y,Z coordinates array by using + * array = removeFromArray(array, array[1]); (see also bg_externals.uc) + */ +enum axes +{ + X = 1, //horizontal axis (numbered from west to east) + Y = 2, //vertical axis (numbered from north to south) + Z = 3 //lift axis (numbered from ground to sky) +}; + +/* + * Cardinal directions: returned by UI_get_direction. Use with face or step + * statements in script{} blocks. e.g: + * script item { step NORTH; step NORTH; face SOUTH; } + * takes two steps north, then turn to face south + */ +enum directions +{ + NORTH = 0, + NORTHEAST = 1, + EAST = 2, + SOUTHEAST = 3, + SOUTH = 4, + SOUTHWEST = 5, + WEST = 6, + NORTHWEST = 7 +}; + +/* + * parts of the day (3-hour intervals). Returned by UI_part_of_day. This is + * usually only used by conversation scripts, as a way of narrowing down + * schedule-related behaviour. + */ +enum day_periods +{ + // The period is equal to one-third of the current game hour. + MIDNIGHT = 0, // 0-2 + EARLY = 1, // 3-5 + DAWN = 2, // 6-8 + MORNING = 3, // 9-11 + NOON = 4, // 12-14 + AFTERNOON = 5, // 15-17 + EVENING = 6, // 18-20 + NIGHT = 7 // 21-23 +}; + +/* + * Wildcards, used for specifying "any acceptable value for this parameter" + * to a measuring function. These are commonly used with object-related + * intrinsics like UI_get_cont_items, UI_count_objects, UI_remove_party_items. + */ +enum wildcards +{ + SHAPE_ANY = -359, + QUALITY_ANY = -359, + FRAME_ANY = -359, + FIND_ON_SCREEN = -359 +}; + +// tick multipliers, for use with UI_advance_time or script statements +enum times +{ + MINUTE = 25, + HOUR = 1500 +}; +const long DAY = 36000; +/* + * Examples: + * UI_advance_time(30 * MINUTE); // advance time by 30 game minutes + * UI_advance_time(2 * HOUR); // advance time by two game hours + * script after MINUTE ticks { ... } // schedule this script block to execute + * // after one game minute + */ + +/* + * Item/NPC flags, stolen from the Exult LB-joins-party patch with some + * comments added. + * These can be retrieved and set using UI_get_item_flag(itemref, flag), + * UI_set_item_flag(itemref, flag) and UI_clear_item_flag(itemref, flag). +*/ +enum item_flags +{ + INVISIBLE = 0, + ASLEEP = 1, + CHARMED = 2, + CURSED = 3, + DEAD = 4, + IN_PARTY = 6, + PARALYZED = 7, + PARALYSED = 7, //British spelling + POISONED = 8, + PROTECTION = 9, + ON_MOVING_BARGE = 10, + OKAY_TO_TAKE = 11, // The item does not belong to anyone, and won't + // trigger stealing behaviour if you take it. + MIGHT = 12, // Double strength, dext, intel. + IMMUNITIES = 13, // Lots of imunities; can be gotten only. + CANT_DIE = 14, // Test flag in monster_info. + DANCING = 15, // Set by "Dance" spell in BG. + DONT_MOVE = 16, // SI-only. NPC can't move; "cutscene" mode. + DONT_RENDER = 16, // BG-only. Like DONT_MOVE, but avatar also + // completely invisible. + TEMPORARY = 18, // Is temporary - this means that the item will + // be deleted once the party gets beyond a certain + // range from it (outside the superchunk?) + SAILOR = 20, // The barge's 'captain'. When getting the flag, + // you will actually get the current captain. + OKAY_TO_LAND = 21, // Used for flying-carpet. + BG_DONT_MOVE = 22, // BG-only. NPC can't move; "cutscene" mode. + SI_DONT_RENDER = 22, // SI-only. Like DONT_MOVE, but avatar also + // completely invisible. + IN_DUNGEON = 23, // If set, you won't be accused of stealing. + CONFUSED = 25, + IN_MOTION = 26, // Object is a barge object moving, or on a barge + // object that is moving. Set in usecode, and mostly + // used for the SI 'NPC' ships such as the turtle. + MET = 28, // Has the npc been met before - originally this + // was SI-only, but Exult implements it for BG + // too. This determines conversation behaviour, + // and whether the NPC's real name or shape name + // is displayed when they are single-clicked on. + // BG originally used global flags for this, which + // amounts to an extra 250-odd flags. + SI_TOURNAMENT = 29, // Call usecode (eventid = 7) on death + SI_ZOMBIE = 30, // Used for sick Neyobi, Cantra, post-Bane companions. + + NO_SPELL_CASTING = 31, + POLYMORPH = 32, // Do not set this flag directly; use the + // UI_set_polymorph intrinsic instead. + TATTOOED = 33, + READ = 34, // Can read non-Latin alphabet scrolls, books, signs. + PETRA = 35, + SI_LIZARD_KING = 36, //added by DB - SI lizard king + FREEZE = 37, + NAKED = 38, // Exult. Makes the avatar naked given its skin. Other NPCs should use set_polymorph instead. + SHOPPED_BEFORE = 60, // added by DB - Makes shopping easier. If you asked npc about shop before, go ahead and buy/sell without digging around for it + MET_2 = 61, // + IS_EATING = 62, //added by DB - used to determine if npc is eating or in tavern + SHOP_IS_OPEN = 63 //added by DB - used to fix interference with TALK schedule on schedule specific + // shopkeepers. + +}; + +// Business activities (taken from the cheat screen) +enum schedules +{ + IN_COMBAT = 0, // renamed to not conflict with COMBAT, the NPC + // stat property. + PACE_HORIZONTAL = 1, // Walk horizontally until you hit a wall, then + // turn around. (Patrolling on the cheap.) + PACE_VERTICAL = 2, // Same as above, but vertically. + TALK = 3, // NPC runs to the Avatar to talk to them. When + // they get within a certain distance of where the + // Avatar was when this schedule was set, a + // DOUBLECLICK event is triggered on the NPC. + // At this point the schedule must be changed. + DANCE = 4, + EAT = 5, + FARM = 6, // Waves farm implements around. + TEND_SHOP = 7, // This is really just a more specific version of + // LOITER, used for narrowing down schedule barks. + // See BAKE, SEW and BLACKSMITH for more specific + // examples of shop behaviour. + MINE = 8, + MINER = 8, + HOUND = 9, + STANDTHERE = 10, // renamed to not conflict with STAND, the NPC + // animation frame + LOITER = 11, // Hangs around a certain point, within 10 units + // or so + WANDER = 12, // Roams nearby a certain point (as much as a + // 320x200 screen away) + BLACKSMITH = 13, + SLEEP = 14, + WAIT = 15, // Similar to STAND, except that they will never + // leave the WAIT schedule until it is manually + // changed: their preset schedule list is ignored. + MAJOR_SIT = 16, + GRAZE = 17, + BAKE = 18, + SEW = 19, + SHY = 20, // Tries to keep out of the Avatar's way - will + // half-heartedly flee until out of a certain range. + LAB = 21, + THIEF = 22, // Approaches the party and will take gold from the Avatar's + // backpack, then will bark "Greetings!" in SI. + WAITER = 23, + SPECIAL = 24, // ?? + KID_GAMES = 25, // Tag! Thou art it! And so forth. + TAG = 25, + EAT_AT_INN = 26, // same as Eat, only with different barks. + DUEL = 27, + SPAR = 27, + PREACH = 28, // Broken in SI, Leon resets to Loiter after trying it. + PATROL = 29, // This tells the AI to follow a particular set of + // patrol waypoints, defined by path eggs. + DESK_WORK = 30, + FOLLOW_AVATAR = 31 // That most noble of pursuits. Like WAIT, this + // completely overrides the NPC's schedule list. +}; + +/* + * NPC animation frames. Use these with UI_set_item_frame or (preferably) in + * script blocks, with 'actor frame'. + * e.g.: script AVATAR { actor frame STAND; actor frame USE; actor frame + * SWING_1; actor_frame STAND; } + * Important note: use 'actor frame' with NPCs instead of 'frame', as 'actor + * frame' takes the NPC's current facing into account. + */ +enum npc_frames +{ + STAND = 0, + WALK_1 = 1, + WALK_2 = 2, + + USE = 3, //general use motion + + SWING_1 = 4, //start of one-handed swing, arm up over shoulder + SWING_2 = 5, //middle of one-handed swing, arm out to the side + SWING_3 = 6, //end of one-handed swing, arm out to the front + + SWING_2H_1 = 7, //start of 2-handed swing, arms up over shoulder + SWING_2H_2 = 8, //middle of 2-handed swing, arms out to the side + SWING_2H_3 = 9, //end of 2-handed swing, arms out to the front + + SIT = 10, //sitting down + LEAN = 11, //leaning down + KNEEL = 12, //kneeling on one knee + LIE = 13, //lying down + CAST_1 = 14, //both arms high in the air (casting motion) + CAST_2 = 15 //both arms stretched out (casting motion) +}; + +// North/South/East/West frame offsets for the NPC frames. Only really necessary +// if you're using UI_set_item_frame or 'frame' +enum frame_offsets +{ + NORTH_FRAMESET = 0, + SOUTH_FRAMESET = 16, + WEST_FRAMESET = 32, + EAST_FRAMESET = 48 +}; + +// Ready slots for Black Gate: use with or . +// These are the same whether paperdolls are on or off. +enum inv_slots_bg +{ + BG_BACKPACK = 0, + BG_WEAPON_HAND = 1, + BG_BOTH_HANDS = 1, + BG_SHIELD_HAND = 2, + BG_OFF_HAND = 2, + BG_BELT = 3, + BG_TORSO = 5, + BG_LEFT_RING = 6, + BG_RIGHT_RING = 7, + BG_QUIVER = 8, + BG_HEAD = 9, + BG_LEGS = 10, + BG_FEET = 11, + BG_USECODE = 12, + BG_CLOAK = 13, // Exult-only + BG_GLOVES = 14, // Exult-only + BG_EARS = 16, // Exult-only + BG_BACK_SHIELD = 17, // Exult-only + BG_BACK_2H = 19, // Exult-only + BG_AMULET = 22 // Exult-only +}; + +// Ready slots for Serpent Isle: use with or . +// These are the same whether paperdolls are on or off. +enum inv_slots_si +{ + SI_SHIELD_HAND = 0, + SI_OFF_HAND = 0, + SI_WEAPON_HAND = 1, + SI_BOTH_HANDS = 1, + SI_CLOAK = 2, + SI_AMULET = 3, + SI_HEAD = 4, + SI_GLOVES = 5, + SI_USECODE = 6, + SI_RIGHT_RING = 7, + SI_LEFT_RING = 8, + SI_EARS = 9, + SI_QUIVER = 10, + SI_BELT = 11, + SI_TORSO = 12, + SI_FEET = 13, + SI_LEGS = 14, + SI_BACKPACK = 15, + SI_BACK_SHIELD = 16, + SI_BACK_2H = 17 +}; + +/* + * NPC properties (mostly ability scores) + * These can be retrieved and set using UI_get_npc_property(npc, property) and + * UI_set_npc_property(npc, property, value) respectively. + * Note however that UI_set_npc_property will actually *add* the value to the + * original property, not set it to that value. Which means you will need to + * calculate a relative positive/negative adjustment to set it to a target + * value. + */ +enum npc_properties +{ + STRENGTH = 0, + DEXTERITY = 1, + INTELLIGENCE = 2, + HEALTH = 3, + COMBAT = 4, + MANA = 5, + MAX_MANA = 6, + TRAINING = 7, + EXPERIENCE = 8, + FOODLEVEL = 9, + SEX_FLAG = 10, // 1 (nonzero) if female, 0 if male. + MISSILE_WEAPON = 11 // Cannot be set; returns 1 if wearing a missile + // or (good) thrown weapon, 0 otherwise. +}; + + +// NPC attack behaviours. Retrieve and set using UI_set_attack_mode(npc, mode) +// and UI_get_attack_mode(npc). +enum npc_attack_modes +{ + NEAREST = 0, + WEAKEST = 1, + STRONGEST = 2, + BERSERK = 3, + PROTECT = 4, + DEFEND = 5, + FLANK = 6, + FLEE = 7, + RANDOM = 8, + MANUAL = 9 +}; + +/* + * Failure cursor constants for use with UI_flash_mouse. Note that these do not + * correspond to frame numbers in pointers.uc, but to some internal mapping. + * (the "BLOCKED" cursor seems to be unavailable through this method.) + */ +enum cursors +{ + CURSOR_X = 1, //Default "no you can't do that" X cursor + CURSOR_OUT_OF_RANGE = 2, + CURSOR_OUT_OF_AMMO = 3, + CURSOR_TOO_HEAVY = 4, + CURSOR_WONT_FIT = 5 +}; + +enum egg_states +{ + CACHED_IN = 0, // Activated when chunk read in? + PARTY_NEAR = 1, + AVATAR_NEAR = 2, // Avatar steps into area. + AVATAR_FAR = 3, // Avatar steps outside area. + AVATAR_FOOTPAD = 4, // Avatar must step on it. + PARTY_FOOTPAD = 5, + SOMETHING_ON = 6, // Something placed on/near it. + EXTERNAL_CRITERIA = 7 // Appears on Isle of Avatar. Guessing +}; + +//NPC atitudes toward the avatar +enum alignments +{ + NEUTRAL = 0, + GOOD = 1, + EVIL = 2, + CHAOTIC = 3 +}; + +enum weather_types +{ + CLEAR_WEATHER = 0, + SNOWING = 1, //Unsure; in Exult, works the same as RAIN, below and seems identical to RAIN in the originals + RAIN = 2, + SPARKLE = 3, //Prevents casting of spells in BG (and maybe SI too?) + FOG = 4, //Seems to work like RAIN in the originals + OVERCAST = 5, //Seems to clear weather in the originals + CLOUDY = 6 +}; + +//Mask values used (e.g.) in find_nearby intrinsic; these are flags, which mean +//that they can be added together +enum item_masks +{ + MASK_NONE = 0x0, + MASK_NPC = 0x04, + MASK_NPC2 = 0x08, //Maybe non-party NPCs only? All NPCs in Exult + MASK_EGG = 0x10, //Also for barges + MASK_INVISIBLE = 0x20, + MASK_PARTY_INVISIBLE = 0x40, + MASK_TRANSLUCENT = 0x80, + MASK_ALL_UNSEEN = 0xB0 //MASK_EGG+MASK_INVISIBLE+MASK_TRANLUCENT +}; + +//NPC animation frames, WITH rotation bit. Use these with UI_set_item_frame_rot +//or (preferably) in script blocks, with 'frame'. +//e.g.: script AVATAR { frame STAND_WEST; frame USE_NORTH; frame SWING_1_SOUTH; frame STAND_EAST; } +enum npc_rot_frames +{ + STAND_NORTH = 0x0000, + WALK_1_NORTH = 0x0001, + WALK_2_NORTH = 0x0002, + USE_NORTH = 0x0003, + SWING_1_NORTH = 0x0004, + SWING_2_NORTH = 0x0005, + SWING_3_NORTH = 0x0006, + SWING_2H_1_NORTH = 0x0007, + SWING_2H_2_NORTH = 0x0008, + SWING_2H_3_NORTH = 0x0009, + SIT_NORTH = 0x000A, + LEAN_NORTH = 0x000B, + KNEEL_NORTH = 0x000C, + LIE_NORTH = 0x000D, + CAST_1_NORTH = 0x000E, + CAST_2_NORTH = 0x000F, + STAND_SOUTH = 0x0010, + WALK_1_SOUTH = 0x0011, + WALK_2_SOUTH = 0x0012, + USE_SOUTH = 0x0013, + SWING_1_SOUTH = 0x0014, + SWING_2_SOUTH = 0x0015, + SWING_3_SOUTH = 0x0016, + SWING_2H_1_SOUTH = 0x0017, + SWING_2H_2_SOUTH = 0x0018, + SWING_2H_3_SOUTH = 0x0019, + SIT_SOUTH = 0x001A, + LEAN_SOUTH = 0x001B, + KNEEL_SOUTH = 0x001C, + LIE_SOUTH = 0x001D, + CAST_1_SOUTH = 0x001E, + CAST_2_SOUTH = 0x001F, + STAND_WEST = 0x0020, + WALK_1_WEST = 0x0021, + WALK_2_WEST = 0x0022, + USE_WEST = 0x0023, + SWING_1_WEST = 0x0024, + SWING_2_WEST = 0x0025, + SWING_3_WEST = 0x0026, + SWING_2H_1_WEST = 0x0027, + SWING_2H_2_WEST = 0x0028, + SWING_2H_3_WEST = 0x0029, + SIT_WEST = 0x002A, + LEAN_WEST = 0x002B, + KNEEL_WEST = 0x002C, + LIE_WEST = 0x002D, + CAST_1_WEST = 0x002E, + CAST_2_WEST = 0x002F, + STAND_EAST = 0x0030, + WALK_1_EAST = 0x0031, + WALK_2_EAST = 0x0032, + USE_EAST = 0x0033, + SWING_1_EAST = 0x0034, + SWING_2_EAST = 0x0035, + SWING_3_EAST = 0x0036, + SWING_2H_1_EAST = 0x0037, + SWING_2H_2_EAST = 0x0038, + SWING_2H_3_EAST = 0x0039, + SIT_EAST = 0x003A, + LEAN_EAST = 0x003B, + KNEEL_EAST = 0x003C, + LIE_EAST = 0x003D, + CAST_1_EAST = 0x003E, + CAST_2_EAST = 0x003F +}; + +enum damage_types +{ + NORMAL_DAMAGE = 0, + FIRE_DAMAGE = 1, + MAGIC_DAMAGE = 2, + LIGHTNING_DAMAGE = 3, + ETHEREAL_DAMAGE = 4, + SONIC_DAMAGE = 5 +}; \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/constants2.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/constants2.uc new file mode 100755 index 0000000..d1dac20 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/constants2.uc @@ -0,0 +1,112 @@ +/* + * + * Copyright (C) 2006-2009 The Exult Team/Team TFL + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file contains several more constants used throughout usecode. + * Specifically, it has constants for several sprite animations and sounds, as + * well as some faces. + */ + +// Title: Constants 2 +// This header file defines general constants used throughout usecode, for +// Black Gate and Serpent Isle. Constants particular to a function can be +// found in the relevant codefile; constants particular to a game can be +// found in that game's header directory. +// +// *Author:* Marzo Junior (marzojr at yahoo dot com) +// with modifications by Peter M Dodge (twicescorned at gmail dot com) +// +// *Last modified:* 2009-01-31 + +// Enum: spite_effects +// Various sprite effect references to sprites in sprites.vga for spell effects etc. +// +// ANIMATION_BIG_BLAST = 1 - The mother of all blast effects. +// ANIMATION_CLOUDS = 3 - Overlay sprite for overcast cloud shadows. +// ANIMATION_MEDIUM_BLAST = 4 - A large blast effect. +// ANIMATION_SMALL_BLAST = 5 - A small blast effect. +// ANIMATION_TELEPORT = 7 - Magical teleportation effect. +// ANIMATION_DEATH_VORTEX = 8 - Effect for the death vortex spell. +// ANIMATION_POOF = 9 - Little poof of smoke effect to show spell failure. +// ANIMATION_FIREWORKS = 12 - From the fireworks spell. +// ANIMATION_GREEN_BUBBLES = 13 - Odd little green bubles sprite used as an effect. +// ANIMATION_CIRCLE_BARRIER = 15 - Unsure? +// ANIMATION_LIGHTNING = 17 - Lightning, from storms or spells. +// ANIMATION_BLUE_BEADS = 18 - Odd little blue beads sprite used as an effect. +// ANIMATION_PURPLE_BUBBLES = 21 - Odd little purple bubbles sprite used as an effect. +// ANIMATION_MUSIC = 24 - Little musical notes, such as from music box, to indicate +// music playing visually. +enum sprite_effects +{ + ANIMATION_BIG_BLAST = 1, + ANIMATION_CLOUDS = 3, + ANIMATION_MEDIUM_BLAST = 4, + ANIMATION_SMALL_BLAST = 5, + ANIMATION_TELEPORT = 7, + ANIMATION_DEATH_VORTEX = 8, + ANIMATION_POOF = 9, + ANIMATION_FIREWORKS = 12, + ANIMATION_GREEN_BUBBLES = 13, + ANIMATION_CIRCLE_BARRIER = 15, + ANIMATION_LIGHTNING = 17, + ANIMATION_BLUE_BEADS = 18, + ANIMATION_PURPLE_BUBBLES = 21, + ANIMATION_MUSIC = 24 +}; + +// Enum: sound_effects +// Some sound effects often referenced in usecode. Not a complete or exhaustive +// list by any means. +// +// SOUND_BLAST = 8 - Fireball spell sound effect. +// SOUND_BIG_BLAST = 9 - Explosion spell sound effect. +// SOUND_MOONGATE = 11 - Moongate raising sound effect. 00x000B +// SOUND_BOOK = 14 - Apparently sounds like a book? Either way, the effect +// when the book gump displays. 0x00E +// SOUND_KEY = 27 - Sound made by keys when you use them. "Click" +// SOUND_GLASS_SHATTER = 37 - Glass breaking sound effect. 0x25 +// SOUND_HIT = 62 - Something getting hit in combat. 0x003E +// SOUND_TELEPORT = 72 - Teleportation sound effect. +enum sound_effects +{ + SOUND_BLAST = 8, + SOUND_BIG_BLAST = 9, + //SOUND_MOONGATE = 11, //Active elsehwere in my code so commented this out. + SOUND_BOOK = 14, + SOUND_KEY = 27, + SOUND_GLASS_SHATTER = 37, + SOUND_HIT = 62, + SOUND_TELEPORT = 72 +}; + +// Enum: faces +// Some faces referenced in usecode. +// +// DRACOTHRAXUS_FACE = -293 - Unsure, too lazy to check. +// BLACK_SWORD_FACE = -292 - Black sword graphic. +// ARCADION_GEM_FACE = -291 - Arcadion in the soul gem. +// ARCADION_MIRROR_FACE = -290 - Arcadion in the mirror. +// ERETHIAN_FACE = -286 - Erethian. +enum faces +{ + DRACOTHRAXUS_FACE = -293, + BLACK_SWORD_FACE = -292, + ARCADION_GEM_FACE = -291, + ARCADION_MIRROR_FACE = -290, + ERETHIAN_FACE = -286 +}; diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/functions.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/functions.uc new file mode 100755 index 0000000..3df25d7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/functions.uc @@ -0,0 +1,906 @@ +/* + * + * Copyright (C) 2006 Alun Bestor/The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file defines generic helper functions added to the original. + * + * Author: Alun Bestor (exult@washboardabs.net) + * Modified by Exult Team + * Last modified: 2006-03-19 + */ + +//Generic functions +//----------------- + +//returns a random entry from an array +var randomIndex(var array) +{ + var size = UI_get_array_size(array); + var rand = UI_get_random(size); + return array[rand]; +} + +var getSixth(var array) +{ + return array[6]; + +} + + + + + +//checks to see if anyone in the party is poisoned +var getPoisoned() +{ + var partymember; + var party = partymember->get_party_list(); + var npc; + var poisoned_party; + var npcname; + var npc_num; + var party_member; + var party_number; + + + + for (partymember in party with index) + { + + UI_error_message("npc num is: " + npc_num); + // UI_error_message("poisoned party is: " + npc); + if (UI_get_item_flag(npc, POISONED)) + { + + poisoned_party = npc->get_npc_object(); + return poisoned_party; + } + else + return poisoned_party; + UI_error_message("poisoned party is: " + npc); + } + UI_error_message("Poisoned party member is: " + poisoned_party); + +} + +void freezeAvatar object# () () +{ + UI_set_item_flag(AVATAR, BG_DONT_MOVE); + + +} + +void unfreezeAvatar object# () () +{ + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + +} + +//NPC-related functions +//--------------------- + +//Returns true if the specified object is the avatar, false otherwise. +var isAvatar(var object) { return (object->get_npc_object() == UI_get_avatar_ref()); } + +//Check if the player has met the specified person (i.e. whether their Met flag has been set). +//Can take either an NPC constant or an object reference. +var hasMet(var npc) { return npc->get_item_flag(MET); } + +//Returns true if the specified NPC is in the party, false otherwise +//There should be an intrinsic for this, but it doesn't appear to be defined +//Can take an NPC constant or an object reference. +var inParty(var npc) { npc = npc->get_npc_object(); return (npc in UI_get_party_list()); } + +//quick bark/say functions, useful for testing. See also randomPartySay() and randomPartyBark() (original functions) +var avatarBark(var line) { if (canTalk(AVATAR)) AVATAR->item_say(line); } +var avatarSay(var line) { if (canTalk(AVATAR)) AVATAR.say(line); } + + +//Moving-stuff-around functions +//----------------------------- + +//Shift an object into a container (can be from another container or the world) +var moveToContainer(var object, var container, var dont_check_ownership) +{ + var orig_pos; + var orig_container; + + //record the previous container + orig_container = object->get_container(); + //object was in the world - record its last position + if (!orig_container) orig_pos = object->get_object_position(); + + //could not remove the item (protected?) + if (!object->set_last_created()) return false; + + //try to put the item into the new container + if (container->give_last_created()) + { + //check if the item was stolen, unless overridden + if (!dont_check_ownership) stealItem(object); + return true; + } + //if it couldn't be put into the new container, just put it back in the original container along with a mouse warning + else + { + if (orig_container) { orig_container->give_last_created(); } + else { UI_update_last_created(orig_pos); } + + //UI_flash_mouse(4); + return false; + } +} + +//Opposite of moveToContainer: tries to place the item at the specified location, or returns it to its previous location/container if that couldn't be done. +var moveToLocation(var object, var pos) +{ + var orig_pos; + var orig_container; + + //record the previous container + orig_container = object->get_container(); + //object was in the world - record its last position + if (!orig_container) orig_pos = object->get_object_position(); + + //could not remove the item (protected?) + if (!object->set_last_created()) return false; + + //try to shift the item + if (UI_update_last_created(pos)) return true; + + //if it couldn't be moved, just put it back in the original container/location along with a mouse warning + else + { + if (orig_container) { orig_container->give_last_created(); } + else { UI_update_last_created(orig_pos); } + + UI_flash_mouse(CURSOR_WONT_FIT); + return false; + } +} + + +//generic get-item-from-container/world script, used by item interactions. It is used at the end of a march-to-container script, to play an appropriate animation and transfer the item into the player's inventory. +//once the item has been picked up, it will call the item's function with event = SCRIPTED. +void pickUpItem object#() () +{ + var container = getOuterContainer(item); + var direction = directionFromAvatar(container); + + //The avatar is already carrying the item, call the function immediately and leave it at that + //This shouldn't happen, since gotoAndGet() will have picked up this case already - however, it could be the player drags the item into their inventory while walking, so... + if (isAvatar(container)) + { + //The brief delay is present in the original scripts, and is purely cosmetic. + script item { nohalt; wait 1; call get_usecode_fun(); } + } + else + { + //container is an NPC, animate the avatar frobbing the target + if (container->is_npc()) + { + script AVATAR + { face direction; actor frame ready; + wait 3; actor frame standing;} + } + //container is a regular object or just the world, animate the avatar leaning down + else + { + script AVATAR + { face direction; actor frame bowing; + wait 3; actor frame standing;} + } + + //Puts the item in the player's inventory and calls the intended function + script item + { nohalt; wait 3; + call giveToAvatar; wait 2; + call get_usecode_fun();} + } +} + + +//Pathfind to the target item and pick it up once you get there (using pickUpItem). After this has happened, the item's function will be called with event = SCRIPTED. This is commonly used for item interactions that require the Avatar to be carrying the item first. +void gotoAndGet (var target) +{ + var offsetx; + var offsety; + var container; + var func; + + UI_close_gumps(); + + //item is contained by someone/thing - march the avatar over to the container and pick it up + if (target->get_container()) + { + container = getOuterContainer(target); + //Avatar is the container - call the target's function immediately. + if (isAvatar(container)) + { + script target { nohalt; wait 1; call target->get_usecode_fun(); } + return; + } + else + { + offsetx = [0, 1, -1, 1]; + offsety = [2, 1, 2, 0]; + + gotoObject(container, offsetx, offsety, -3, pickUpItem, target, 2); + } + } + //item was lying on the ground + else + { + offsetx = [0, 1, 1, 1, -1, -1, 0, -1]; + offsety = [1, 1, 0, -1, 1, 0, -1, -1]; + + //go to item and call result function + //(func = pickUpItem())...which means I need to go and define bloody numbers again + gotoObject(target, offsetx, offsety, -3, pickUpItem, target, 2); + } +} + + +//Pathfind to the target item and pick it up once you get there (using pickUpItem). After this has happened, the item's function will be called with event = SCRIPTED. This is commonly used for item interactions that require the Avatar to be carrying the item first. +void gotoAndGet2 (var npc, var target) +{ + var offsetx; + var offsety; + var container; + var func; + + UI_close_gumps(); + + //item is contained by someone/thing - march the avatar over to the container and pick it up + if (target->get_container()) + { + container = getOuterContainer(target); + //Avatar is the container - call the target's function immediately. + if (isAvatar(container)) + { + script target { nohalt; wait 1; call target->get_usecode_fun(); } + return; + } + else + { + offsetx = [0, 1, -1, 1]; + offsety = [2, 1, 2, 0]; + + gotoObject(container, offsetx, offsety, -3, pickUpItem, target, 2); + } + } + //item was lying on the ground + else + { + offsetx = [0, 1, 1, 1, -1, -1, 0, -1]; + offsety = [1, 1, 0, -1, 1, 0, -1, -1]; + + //go to item and call result function + //(func = pickUpItem())...which means I need to go and define bloody numbers again + gotoObject(target, offsetx, offsety, -3, pickUpItem, target, 2); + } +} + + + + + + +//returns true if obj is contained by target, or false otherwise +var containedBy (var obj, var target) +{ + var container; + + container = obj->get_container(); + while (container) + { + if (container == target) return true; + container = container->get_container(); + } + return false; +} + + +//Animation functions +//------------------- + +//returns the direction (N/S/W/E) that the NPC is currently facing +var getFacing (var npc) +{ + var direction; + var framenum; + + framenum = npc->get_item_frame_rot(); + + if (framenum >= EAST_FRAMESET) direction = EAST; + else if (framenum >= WEST_FRAMESET) direction = WEST; + else if (framenum >= SOUTH_FRAMESET) direction = SOUTH; + else direction = NORTH; + + return direction; +} + + +/*//DISABLED FOR NOW +void bellringer object#() () +{ + var hour = UI_game_hour()-1; + var minute = UI_game_minute(); + var frame = UI_get_item_frame(DAVER); + var schedule = UI_get_schedule_type(DAVER); + var bell = UI_find_nearest(item, SHAPE_BELL, 30); + + + if ((event == EGG) && (isNearby(DAVER))) + { + if (frame != 16) + UI_set_item_frame(DAVER, 16); + + if (minute == 00) + { + script bell + { + nohalt; + frame 0; + repeat hour //should repeat 1 time per hour + { + repeat 7 + { + next frame cycle; + + }; + sfx 19; + }; + wait 15; + + }; + + } + else + { + script item after 30 ticks + { + + call bellringer; + + + } + + + + + } + } + else + abort; + + +} + +*/ + + +//Simple function to reverse a direction (NORTH becomes SOUTH, etc.) +var invertDirection (var direction) { return (direction + 4) % 8; } + +//Gold-related functions (for streamlining shopping) +//-------------------------------------------------- + +//returns the total amount of gold the party has +var countGold (var amount) { return PARTY->count_objects(SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); } + +//returns true if the party has gold, false otherwise +var hasGold (var amount) +{ + var num_gold = PARTY->count_objects(SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + return (num_gold >= amount); +} + +//tries to deduct from the party's gold: returns true if they had the cash, or false if they can't afford it +var chargeGold (var amount) +{ + if (hasGold(amount)) return UI_remove_party_items(amount, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY, true); + else return false; +} + +//give gold to the party: returns true if successful, false otherwise +var giveGold (var amount) { return UI_add_party_items(amount, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY, true); } + + + +//Script-related functions (used in script{} blocks) +//-------------------------------------------------- +//Note that these functions cannot be passed any arguments, which is why they perform a specific action upon . + +//use during script sequences, to prevent the actor from moving according to schedule or player input +//IMPORTANT: Use nohalt; in these script sequences, otherwise the actor may remain frozen forever if the script is interrupted! +void GenericFreeze object#() () { set_item_flag(BG_DONT_MOVE); } +void GenericUnfreeze object#() () { clear_item_flag(BG_DONT_MOVE); } + + + + + +/* + +void monsterStats (var monster, var stats) +{ + var stat_value; + //IDs of the properties to set: + var stat_ids = [STRENGTH, DEXTERITY, INTELLIGENCE, HEALTH, COMBAT]; + for (statnum in stat_ids) + { + //For each stat in the array, set the monster's attribute: + stat_value = monster->get_npc_prop(statnum + 1); + monster->set_npc_prop(statnum + 1, stats[statnum + 1] - stat_value); + } +} + +void monsterEquipment (var monster, var arms, var arms_quality, var pouch_content, var pouch_frames, var pouch_quantities, var pouch_qualities) +{ + var bag; + var new_obj; + var index; + +// for (itemnum in arms with counterindex) + { + //For each item in arms, + //increment counter: + //index = index + 1; + //Create the object: + new_obj = UI_create_new_object(itemnum); + //Set quality: + new_obj->set_item_quality(arms_quality[index]); + //Give to monster: + monster->give_last_created(); + } + + //Create a backpack: + bag = UI_create_new_object(SHAPE_BACKPACK); + //Give to monster: + monster->give_last_created(); + //Reset counter: + index = 0; + while (index < UI_get_array_size(pouch_content)) + { + //For each object in the array, + //increment counter: + index = index + 1; + //Create object: + new_obj = UI_create_new_object(pouch_content[index]); + //Set frame: + new_obj->set_item_frame(pouch_frames[index]); + if (pouch_quantities[index] > 1) + //Set quantity where available: + new_obj->set_item_quantity(pouch_quantities[index]); + //Set quality: + new_obj->set_item_quality(pouch_qualities[index]); + //Put in the backpack: + bag->give_last_created(); + } +} + +var monsterCreate (var shapenum, var npcid, var pos, var facedir, var stats, var arms, var arms_quality, var pouch_content, var pouch_frames, var pouch_quantities, var pouch_qualities) +{ + //Create the monster: + var monster = UI_create_new_object(shapenum); + //Initially set monster to be neutral: + monster->set_alignment(1); + //Have the monster be in WAIT mode: + monster->set_schedule_type(WAIT); + //Make him temporary: + monster->set_item_flag(TEMPORARY); + + + //Set the monster's attributes: + monsterStats(monster, stats); + //Give him some equipment: + monsterEquipment(monster, arms, arms_quality, pouch_content, pouch_frames, pouch_quantities, pouch_qualities); + //Set NPC ID to requested value: + monster->set_npc_id(npcid); + + + //Set monster as last created: + monster->set_last_created(); + //Update monster to desired spot: + UI_update_last_created(pos); + //Have monster face desired direction: + script monster face facedir; + return monster; +} + + +*/ + +//Functions added by DB// +//--------------------------------------------------- + +var isWearingAmulet() +{ + if (UI_is_readied(AVATAR, BG_AMULET, SHAPE_AMULET_SUBMISSION, FRAME_ANY)) + return true; + else + return false; + +} + + + + +var throwRandomBottle(var target) //location passed to function +{ + var rand_bottle = UI_die_roll(6, 12); //for bottle frames + var rand_booze = UI_die_roll(8, 15); //for booze frames + + var bottle = UI_create_new_object(SHAPE_BOTTLE); + bottle->UI_set_item_frame(rand_bottle); + bottle->update_last_created([target]); + + + var booze = UI_create_new_object(912); //for booze splotch (blood shape) + booze->set_item_frame(rand_booze); + booze->update_last_created([target]); + UI_play_sound_effect(37); + + +} + + +var getExpLevel(var npc) +{ + var level; + var current_experience = UI_get_npc_prop(npc, EXPERIENCE); + + if ((current_experience > 0) && (current_experience < 100)) + { + level = 1; + return level; + } + else + if ((current_experience >= 100) && (current_experience < 200)) + { + level = 2; + return level; + } + else + if ((current_experience >= 200) && (current_experience < 400)) + { + level = 3; + return level; + } + else + if ((current_experience >= 400) && (current_experience < 800)) + { + level = 4; + return level; + } + else + if ((current_experience >= 800) && (current_experience < 1600)) + { + level = 5; + return level; + } + else + if ((current_experience >= 1600) && (current_experience < 3200)) + { + level = 6; + return level; + } + else + if ((current_experience >= 3200) && (current_experience < 6400)) + { + level = 7; + return level; + } + else + if (current_experience >= 6400) + { + level = 8; //no spells above 8 so it doesn't matter + return level; + } + + + + } + +var hasSpell(var spell) //used to check if certain spell in spellbook in AVATAR's inventory +{ + var spellbook = UI_find_object(AVATAR, 761, QUALITY_ANY, FRAME_ANY); //makes sure Avatar has spellbook + + return UI_has_spell(spellbook, spell); + +} + + + + +var daypart(var part_of_day) +{ + + var hour = UI_game_hour(); + + if ((hour >= 6) && (hour < 12)) //'good morning' + { + return "morning"; + //return time_of_day; + } + else if ((hour >= 12) && (hour < 18)) //'good afternoon' + { + part_of_day = "afternoon"; + return "afternoon"; + } + else + part_of_day = "evening"; + return part_of_day; + +} + + + +void Sank object# () () +{ + var raft = UI_find_nearby_avatar(SHAPE_RAFT); + var barge = get_barge(); + var npc; + var party = UI_get_party_list(); + + UI_halt_scheduled(raft); //should stop any other scripts from running + + UI_remove_item(raft); + UI_remove_item(barge); + + + + UI_clear_item_flag(AVATAR, SAILOR); + UI_clear_item_flag(AVATAR, ON_MOVING_BARGE); + UI_clear_item_flag(AVATAR, IN_MOTION); + + UI_kill_npc(AVATAR); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + UI_set_npc_id(SMITH, 0); //resets SMITH's ID for warning level 0. + +} + +void Sinking object# () () +{ + var raft = UI_find_nearby_avatar(SHAPE_RAFT); + var barge = get_barge(); + var npc; + var party = UI_get_party_list(); + + + UI_set_item_flag(AVATAR, BG_DONT_MOVE); + UI_halt_scheduled(raft); + + UI_earthquake(40); //change if need be + + randomPartyBark("@We're sinking!!@"); + + for (npc in party) + { + script npc after 3 ticks + { + repeat 2 + { + say "@Aiieeee!@"; wait 2; actor frame bowing; wait 1; actor frame kneeling; wait 1; + actor frame standing; wait 2; actor frame LIE; + actor frame LIE; wait 1; + }; + }; + + } + + script raft after 20 ticks + { + sfx 25; wait 5; sfx 38; wait 1; sfx 25; wait 3; + sfx 26; wait 3; sfx 26; wait 4; sfx 38; wait 2; + sfx 40; wait 3; sfx 38; wait 2; sfx 40; wait 5; + + call Sank; + }; + + + +} + + + +void DeepWater object#() () //used to determine if raft is too far away from shore - in deep water. +{ + var barge = get_barge(); + var surf = [612, 613, 632, 699, 736, 737, 751, 806, 834, 875, 907, 911, 918]; + var waves = [384, 985, 1008, 1009]; + var warning = UI_get_npc_id(SMITH); //warning level for raft. If too much time in deep water, raft will sink. + var raft = UI_find_nearby_avatar(SHAPE_RAFT); + + UI_error_message("Deep water script called"); //remove after testing + UI_error_message("@Warning level is " + warning + "@"); + + if (warning >= 4) + { + script barge after 10 ticks + { + call Sinking; + }; + } + + if (UI_find_nearby(AVATAR, waves, 7, 0x10)) + { + UI_set_npc_id(SMITH, warning + 1); //sets ID for warning level. + UI_error_message("Waves are found"); //for testing + //add various levels of warnings based on warning level. + if (warning == 1) + randomPartySay("@This raft isn't meant for deep ocean travel, we must turn back to shore!@"); + if (warning == 2) + randomPartySay("@We must turn back now, the raft will break upon these waves!@"); + if (warning == 3) + randomPartySay("@This raft isn't meant for deep ocean travel, we must turn back!@"); + if (warning >= 4) + { + randomPartySay("@The raft is breaking apart! We're going to sink!!@"); + + } + + } + script raft after 60 ticks + { + call DeepWater; + + } + + +} + + +void Eruption (var egg) +{ + const int SPRITE_EXPLOSION = 1; + const int SFX_ERUPT = 60; + var avatar_distance = UI_get_distance(egg, AVATAR); + + //determine if it explodes + var rand = UI_get_random(100); + UI_error_message("Volcano egg hatched: rand number is " + rand); + + if (rand < 25) + { + UI_error_message("Rand numb was " + rand + ", volcano erupts"); + var target; + + + //determine how many npcs are neaby + var targets = UI_find_nearby(egg, SHAPE_ANY, 6, MASK_NPC2); + + //exp effect + + UI_obj_sprite_effect(egg, SPRITE_EXPLOSION, 0, 0, 0 ,0, 0, -1); + + //play sound + UI_play_sound_effect(SFX_ERUPT, item); + + UI_earthquake(1); + var count = 0; + //apply damage + for (target in targets) + { + count += 1; + UI_error_message("Target " + count + ", is damaged!"); + var target_distance = UI_get_distance(egg, target); + var damage_base = (50 / target_distance); + UI_apply_damage(damage_base, 15, FIRE_DAMAGE, target); + } + + + } +// script egg after 50 ticks +// { +// call volcano; +// } + +} + + + + + + +extern var getAvatarName 0x0908(); +extern var getNPCName 0x90F (var npc); +extern var getNPCStat 0x910 (var npc, var stat); +extern void trainStrength 0x914 (var npc, var delta); +extern void trainDexterity 0x915 (var npc, var delta); +extern void trainIntelligence 0x916 (var npc, var delta); +extern void trainCombat 0x917 (var npc, var delta); +extern void trainMagic 0x918 (var npc, var delta); +extern var selectWhoTrains 0x920 (); +extern var checkCanTrain 0x922 (var statArray, var goldCost, var npc, var numTraining); + +void LoubetTrain 0x8D0 (var statArray, var goldCost) +{ + var pronoun; + var npc = selectWhoTrains(); + var name = getNPCName(npc); + var verb = "feels"; + var avname = getAvatarName(); + var pronoun2; + var title; + var possessive; + if (name == avname) + { + + if (!gflags[TRAINED_WITH_LOUBET]) + { + gflags[TRAINED_WITH_LOUBET] = true; + } + name = "you"; + pronoun = "you"; + pronoun2 = "you"; + verb = "feel"; + } + else + { + pronoun2 = "they"; + if (npc == JULIA || npc == JAANA|| npc == KATRINA || npc == LEODON || npc == LEONNA || npc == GWENNO || npc == KATRINA) + { + pronoun = "her"; + title = "madame"; + possessive = "she's"; + } + else + { + pronoun = "him"; + title = "m'sieur"; + possessive = "he's"; + } + } + if (npc) + { + var ret = checkCanTrain(statArray, goldCost, npc, 3); //train points? + if (ret == 0) + say("@I am sorry, but thou dost not have enough experience to train at this time. Return at a later date and zen I would be most happy to give thee a lesson.@"); + else if (ret == 1) + { + var partyGold = UI_count_objects(PARTY, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + if (partyGold < goldCost) + say("@Mon dieu! It seems that thou hast not enough gold. Do return when thou art a bit wealthier.@"); + } + else if (ret == 2) + say("@But no! You are too skilled, I 'ave nothing more to teach you!@"); //too skilled + else + { + UI_remove_party_items(goldCost, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY, true); + say("Loubet takes your money then hands " + name + " a foil and a mask of golden mesh.*"); + say("He shows " + name + " the correct stance, then " + pronoun2 + " spar for a bit.*"); + say("Now ze off hand, " + title + "... Mon dieu, you are -how you say it?- ambidextrous! Very good, mah friend.@"); + say("M'sieur Loubet is a skilled teacher, and " + name + " " + verb + " like " + possessive + " really learned something."); + + + if (getNPCStat(npc, DEXTERITY) < 30) + trainDexterity(npc, 1); + + if (getNPCStat(npc, COMBAT) < 30) + trainCombat(npc, 2); // + } + } +} + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/functions2.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/functions2.uc new file mode 100755 index 0000000..2534d80 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/functions2.uc @@ -0,0 +1,266 @@ +/* + * + * Copyright (C) 2006 The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This source file contains some generic utility functions. + * + * Author: Marzo Junior + * Last Modified: 2006-02-27 + */ + +//Finds a temporary NPC from a given shape and NPC id. +var findNearbyMonsterWithID (var loc, var shp, var dist, var id) +{ + var npcs = UI_find_nearby(loc, shp, dist, MASK_NONE); + for (npc in npcs) + if ((npc->get_npc_number() > 0) && (npc->get_npc_id() == id)) + return npc; +} + +//Sets BG_DONT_MOVE flag: +void trueFreeze object#() () { set_item_flag(BG_DONT_MOVE); } +//Clears BG_DONT_MOVE flag: +void trueUnfreeze object#() () { clear_item_flag(BG_DONT_MOVE); } +//Puts an NPC in casting mode: +void showCastingFrames object#() () { begin_casting_mode(); } + +void GenericUnfade object#() () +{ + UI_fade_palette(0, 0, true); //unfadefade from black + +} + +void freezeParty () +{ + //Get party list: + var party = UI_get_party_list(); + //Random NPC for bark: + var rand = UI_get_random(UI_get_array_size(party) - 1) + 1; + for (member in party with index) + { + //For each NPC in party, + //freeze NPC: + member->trueFreeze(); + //This is the randomly chosen NPC which barks something: + if (rand == index) + script member {wait 4; say "@I am frozen in place!@";} + } +} + +void unfreezeParty () +{ + //Get party list: + var party = UI_get_party_list(); + for (member in party) + //Unfreeze all party members: + member->trueUnfreeze(); +} + +var createContainerWithObjects (var cont_shape, var item_shapes, var item_frames, var item_quantity, var item_quality) +{ + var shape_count = UI_get_array_size(item_shapes); + var counter; + var obj; + + var num; + var max; + + //Create a container from the desired shape: + var cont = UI_create_new_object(cont_shape); + //Allow Avatar to take it without problems: + cont->set_item_flag(OKAY_TO_TAKE); + //Make it temporary: + cont->set_item_flag(TEMPORARY); + + while (counter < shape_count) + { + //Increment counter: + counter = counter + 1; + + if (item_quantity[counter]) + { + //Create the object: + obj = UI_create_new_object(item_shapes[counter]); + + //Set its frame: + obj->set_item_frame(item_frames[counter]); + + //Set its quality + obj->set_item_quality(item_quality[counter]); + + //Make it okay to take and temporary: + obj->set_item_flag(OKAY_TO_TAKE); + obj->set_item_flag(TEMPORARY); + + //Try to set quantity; if the item does not have a quantity, + //the intrinsic will return 0: + if (!obj->set_item_quantity(item_quantity[counter])) + { + //Since the item does not have a quantity, we have to create + //each item individually. + + //Place the last object in the container: + cont->give_last_created(); + + //Repeat the creation-setting-giving proccess: + num = 1; + while (num < item_quantity[counter]) + { + num = num + 1; + obj = UI_create_new_object(item_shapes[counter]); + obj->set_item_frame(item_frames[counter]); + obj->set_item_quality(item_quality[counter]); + obj->set_item_flag(OKAY_TO_TAKE); + obj->set_item_flag(TEMPORARY); + + //Place the last object in the container: + cont->give_last_created(); + } + } + + else + { + //The item has a quantity, and it has been correctly set. + + //Place it in the container: + cont->give_last_created(); + } + } + } + + return cont; +} + +void interjectIfPossible (var npcnum, var msg) +{ + if (npcnum->npc_nearby()) + { + var facenum = 0; + /* + * Note: Not all NPCs have their NPC # equal to their face number. + * Here would be a good place to set the face number for these NPCs, + * along the lines of + * if (npcnum->get_item_shape() == 0x02EB) + * npcnum = 0xFED6; + * or maybe + * if (npcnum == 0xFED6) + * npcnum = 0xFEDA; + * Also, specifying a different face here is a good idea if the NPC + * should use a different face. + */ + + + npcnum->show_npc_face(facenum); + if (npcnum->get_item_flag(CONFUSED)) + say("@Slurp@"); + else + { + for (lines in msg) + say(lines); + } + npcnum.hide(); + } +} + +var forceGiveObjToParty (var obj) +{ + //Get party list: + var party = UI_get_party_list(); + //Set the desired object as being the last created: + obj->set_last_created(); + for (npc in party) + { + //For each npc in the party, + //try to give item to NPC: + if (npc->give_last_created()) + { + //If successful, see if it is the Avatar: + if (npc != UI_get_avatar_ref()) + { + //It isn't; have the NPC pop up and say it + //will take the item: + npc.say("@I'll take it!@"); + npc.hide(); + } + //Success: + return true; + } + } + //Failure: + return false; +} + +void buyItemsOld (var options, var shapes, var frames, var price, var quantity, var articles, var quantity_text, var quantity_tokens, var dialog) +{ + var choice_index; + var msg; + var sell_result; + var total_price; + var isplural; + + //Present the options to the player: + choice_index = chooseFromMenu2(options); + + //Keep doing this until the player choses not to buy anything else: + while (!(choice_index==1)) + { + total_price = price[choice_index] * quantity[choice_index]; + + if (quantity[choice_index] > 1) + isplural = true; + else + isplural = false; + + //Inform price to player: + say("@^", + makeSellPriceString(articles[choice_index], options[choice_index], + isplural, price[choice_index], + quantity_text[choice_index]), + dialog[1]); + + //See if player agrees with price: + if (askYesNo()) + { + //Ask for quantity: + say(dialog[2], quantity_tokens[choice_index], dialog[3]); + + //Sell everything to the party: + sell_result = sellAmountToParty(shapes[choice_index], frames[choice_index], quantity[choice_index], price[choice_index], 32, 1, true); + + if (sell_result == 1) + msg = dialog[4]; //can't carry + else if (sell_result == 2) + msg = dialog[5]; + else if (sell_result == 3) + msg = dialog[6]; + else + msg = dialog[7]; //not agreeable - answered no + + //Inform the player if the buy was successful: + say(msg); + } + + else + say(dialog[8]); + + //Present the menu again: + choice_index = chooseFromMenu2(options); + } + + say(dialog[9]); +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/general.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/general.uc new file mode 100755 index 0000000..c3e0a65 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/general.uc @@ -0,0 +1,239 @@ +//Aliases for original functions +//------------------------------ + +//IMPORTANT NOTE: The original functions appear to have their arguments in the exact opposite order you would expect. This may be a quirk of the decompiler, or of the extern assignment. + +extern checkIfItemStolen 0x8FA(var object); //Checks whether the item used belonged to someone else. + //This does not actually return a value - it executes the stolen-item behaviour (guards showing up, NPCs leaving etc.) +extern subtractItemQuantity 0x925(var object); //Remove 1 item from the item's quantity stack (for Quantity items) + +//npc says a line with a delay - use delayedBark instead, which has the arguments the right way round +extern oldDelayedBark 0x933(var delay, var line, var npc); + +extern randomPartyBark 0x08FE(var line); //Get a random nearby party member to say the line as a bark +extern randomPartySay 0x08FF(var line); //Get a random nearby party member to say the line in conversation form + +extern var npcCanTalk 0x937(var npc); //Conjecture + +//return a random party member who is nearby, or the avatar if none can be found +//(this is used by both of the above functions) +extern getRandomPartyMember 0x900(); + +extern var getAvatarName 0x0908(); //As it says, returns the name of the Avatar + +//try to pathfind to the target object. +//offsetx, offsety and offsetz define a cubic perimeter of points around the object, and it will pathfind to the nearest point on that perimeter. offsetx and offsety are usually specified as arrays. +//if the player can get there, then they will walk there immediately. When they arrive in the region, func will be called with obj_context as the item and eventid as the event. +//if the player cannot get there, it displays the X cursor and no movement occurs. +//Note: This has been overridden by gotoObject, which just flips the order of the arguments to how they should be. Use that instead. +extern oldGotoObject 0x828(var eventid, var obj_context, var func, var rangez, var rangey, var rangex, var target); + +//returns true if the object is carried by the avatar, false otherwise. Supports recursive containers. +extern var containedByAvatar 0x944(var obj); + +//returns an itemref for the outermost container of an object. Used for when an object is contained several levels deep. +extern var getOuterContainer 0x945(var obj); + +//returns the cardinal direction the object lies to, relative to the avatar +extern var directionFromAvatar 0x92D(var obj); + +//Put specified object in the player's inventory +extern giveToAvatar 0x692(var object); + +extern giveExperience 0x911(var exp); //gives the specified amount of experience points to every party member + + + +//All-new functions +//----------------- + +//returns a random entry from an array +var randomIndex 0xA00(var array) +{ + var size = UI_get_array_size(array); + var rand = UI_get_random(size); + return array[rand]; +} + +//returns true if the specified NPC is in the party, false otherwise +//There should be an intrinsic for this, but it doesn't appear to be defined +NPCInParty 0xA01(npc) { npc = UI_get_npc_object(npc); return (npc in UI_get_party_list()); } + +avatarBark 0xA03(var line) +{ + var avatar = UI_get_avatar_ref(); + if (npcCanTalk(avatar)) UI_item_say(avatar, line); +} + +avatarSay 0xA04(var line) +{ + var avatar = UI_get_avatar_ref(); + if (npcCanTalk(avatar)) avatar->say(line); +} + +//Shift an object into a container (can be from another container or the world) +moveToContainer 0xA05(var object, var container, var dont_check_ownership) +{ + var orig_pos; + var orig_container; + + //record the previous container + orig_container = UI_get_container(object); + //object was in the world - record its last position + if (!orig_container) orig_pos = UI_get_object_position(object); + + //could not remove the item (protected?) + if (!UI_set_last_created(object)) return false; + + //try to put the item into the new container + if (UI_give_last_created(container)) + { + //check if the item was stolen, unless overridden + if (!dont_check_ownership) checkIfItemStolen(object); + return true; + } + //if it couldn't be put into the new container, just put it back in the original container along with a mouse warning + else + { + if (orig_container) { UI_give_last_created(orig_container); } + else { UI_update_last_created(orig_pos); } + + //UI_flash_mouse(4); + return false; + } +} + +//Opposite of moveToContainer: tries to place the item at the specified location, or returns it to its previous location/container if that couldn't be done +moveToLocation 0xA12(var object, var pos) +{ + var orig_pos; + var orig_container; + + //record the previous container + orig_container = UI_get_container(object); + //object was in the world - record its last position + if (!orig_container) orig_pos = UI_get_object_position(object); + + //could not remove the item (protected?) + if (!UI_set_last_created(object)) return false; + + //try to shift the item + if (UI_update_last_created(pos)) return true; + + //if it couldn't be moved, just put it back in the original container/location along with a mouse warning + else + { + if (orig_container) { UI_give_last_created(orig_container); } + else { UI_update_last_created(orig_pos); } + + //UI_flash_mouse(4); + return false; + } +} + +//rewritten version of oldGotoObject() so that the calls are in their original orders +//todo: work out why this is happening in the first place +gotoObject 0xA06(var target, var rangex, var rangey, var rangez, var func, var obj_context, var eventid) +{ + oldGotoObject(eventid, obj_context, func, rangez, rangey, rangex, target); +} + +//go to the target item, then call the specified pickup function when you get there (the pickup function should call pickUpItem, along with the actual target function you want) +//this is pretty much identical to gotoObject, only with fixed offsets. It is commonly used for item interactions. +gotoAndGet2 0xA07(var target, var func, var obj_context, var eventid) +{ + var offsetx; + var offsety; + + UI_close_gumps(); + + //item is contained by someone/thing - march the avatar over to the container and pick it up + //I have no idea what these positional offsets will look like - they're from the original game + if (UI_get_container(target)) + { + target = getOuterContainer(target); + //avatar is the container - well I'll be. Call the pickup function directly. + if (target == UI_get_avatar_ref()) + { + UI_execute_usecode_array(obj_context, [0x27, eventid, 0x55, func]); + return; + } + else + { + offsetx = [0, 1, -1, 1]; + offsety = [2, 1, 2, 0]; + } + } + //item was lying on the ground + else + { + offsetx = [0, 1, 1, 1, -1, -1, 0, -1]; + offsety = [1, 1, 0, -1, 1, 0, -1, -1]; + } + + //go to item and call result function + gotoObject(target, offsetx, offsety, -3, func, obj_context, eventid); +} + +//generic get-item-from-container/world script, used by item interactions. It is used at the end of a march-to-container script, to play an appropriate animation and transfer the item into the player's inventory. +//once the item has been picked up, func is called with obj_context as the item and eventid as the event. + +//Note: currently target is used in place of obj_context in most cases. This needs correcting. +pickUpItem 0xA08(var target, var func, var obj_context, var eventid) +{ + var container = getOuterContainer(target); + var direction = directionFromAvatar(container); + + //the avatar is already carrying the item, call the target function and leave it at that + if (container == UI_get_avatar_ref()) + { + UI_execute_usecode_array(obj_context, [0x27, eventid, 0x55, func]); + return; + } + + //container is an NPC, animate the avatar frobbing the target + else if (UI_is_npc(container)) UI_execute_usecode_array(UI_get_avatar_ref(), [0x59, direction, 0x64, 0x27, 3, 0x61]); + + //container is a regular object or just the world, animate the avatar leaning down + else UI_execute_usecode_array(UI_get_avatar_ref(), [0x59, direction, 0x6C, 0x27, 3, 0x61]); + + //Hands the item to the avatar, and calls the intended function + UI_execute_usecode_array(target, [0x27, 3, 0x55, 0x0692, 0x27, eventid, 0x55, func]); +} + +//Get the appropriate rotated frame for an NPC animation, based on the direction they should face +getFrame 0xA09(var framenum, var direction) +{ + //use front-facing frame set + if (direction >= EAST && direction <= SOUTHWEST) framenum = framenum + 16; + + return framenum; +} + +//returns true if the specified object is the avatar, false otherwise +isAvatar 0xA0A(var object) { return (object == UI_get_avatar_ref()); } + +//Check if the player has met the specified person (i.e. whether their Met flag has been set) +//This can accept either an object reference or an NPC number/constant +hasMet 0xA0B(var npc) { npc = UI_get_npc_object(npc); return UI_get_item_flag(npc, MET); } + +//A reimplementation of oldDelayedBark, with arguments in the correct order +delayedBark 0xA0C(var npc, var line, var delay) { oldDelayedBark(delay, line, npc); } + +//returns the direction (N/S/W/E) that the NPC is facing, based on their current frame +getFacing 0xA0D(var npc) +{ + var direction; + var framenum; + + framenum = UI_get_item_frame_rot(npc); + + if (framenum < 16) direction = NORTH; + else if (framenum < 32) direction = SOUTH; + else if (framenum < 48) direction = WEST; + else if (framenum < 64) direction = EAST; + + return direction; +} + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/global_flags.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/global_flags.uc new file mode 100755 index 0000000..99c8c35 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/global_flags.uc @@ -0,0 +1,451 @@ +/* This script contains constants for each global flag used in the game. Fill them in as you go along! */ + +/* New flags */ +/*Flags we do not want to use + //Flags we DON'T want to reset - + //global flag # 61 (learned password) so the portullius works + //global flag # 442 - quenton seance + //global flag # 749 Set when the Magic Storm spell is cast: + //const int MAGIC_STORM_SPELL = 0x02ED; + //global flag # 30 Used the armageddon spell - const int CAST_ARMAGEDDON = 0x1E; +*/ + + +enum main_quest_flags +{ + INTRO = 1000, + START_OF_GAME = 1001, + + ASKED_NYSTUL_ABOUT_BOOK = 1002, + ASKED_NYSTUL_ABOUT_ORB = 1003, + + + //Mantras learned: + LEARNED_MANTRA_VALOR = 1004, + LEARNED_MANTRA_SACRIFICE = 1005, + LEARNED_MANTRA_JUSTICE = 1006, + LEARNED_MANTRA_COMPASSION = 1007, //Kenneth, Lady Nan + LEARNED_MANTRA_SPIRITUALITY = 1008, + LEARNED_MANTRA_HONESTY = 1009, + LEARNED_MANTRA_HUMILITY = 1010, + LEARNED_MANTRA_HONOR = 1011, + + //Shrines freed: + + SACRIFICE_FREED = 1012, + COMPASSION_FREED = 1013, + VALOR_FREED = 1014, + JUSTICE_FREED = 1015, + SPIRITUALITY_FREED = 1016, + HONOR_FREED = 1017, + HUMILITY_FREED = 1018, + HONESTY_FREED = 1019, + + //Used when you meditate at shrines so you don't get duplicate Karma + MEDITATE_COMPASSION = 1020, + MEDITATE_VALOR = 1021, + MEDITATE_HONESTY = 1022, + MEDITATE_JUSTICE = 1023, + MEDITATE_HUMILITY = 1024, + MEDITATE_HONOR = 1025, + MEDITATE_SPIRITUALITY = 1026, + MEDITATE_SACRIFICE = 1027, + + + +// ASKED_MARIAH_ABOUT_BOOK = 1028, +// MARIAH_READ_TABLET = 1029, //Triggers convo about book of prophesies with Sin Vraal + + + + JOINED_THIEVES_GUILD = 1030, + + + READ_GARGISH_SCROLL = 1031, //Set when double clicked John's scroll + WEARING_AMULET_SUBMISSION = 1032, //checks to see if you are wearing the gargoyle amulet + SUBMITTED_TO_DRAXINUSOM = 1033, + + ASK_TO_SUBMIT = 1034, //valkadesh says to submit, you ask Naxatilor and Draxinosum + + + PAPA_HAS_CUBE = 1035, //set by Myles or Mama when asked about cellar + TOLD_ABOUT_CUBE = 1036, //set true when told about cube by Caretaker or visiting cyclops basement + //and needing key + + + //gargoyle shrine flags + LEARNED_MANTRA_CONTROL = 1037, + LEARNED_MANTRA_DILIGENCE = 1038, + LEARNED_MANTRA_PASSION = 1039, + + START_CODEX_QUEST = 1040, //given by Naxitilor + FINAL_QUEST_GIVEN = 1041, //final codex quest by altar of singularity + + //determines which stones you put into the vortex cube + MOONSTONE1 = 1050, + MOONSTONE2 = 1051, + MOONSTONE3 = 1052, + MOONSTONE4 = 1053, + MOONSTONE5 = 1054, + MOONSTONE6 = 1055, + MOONSTONE7 = 1056, + MOONSTONE8 = 1057, + + + + VORTEX_CUBE_FULL = 1058, //set once all stones are put in + HUMAN_LENS_PLACED = 1059, + GARG_LENS_PLACED = 1060 + + + + + +}; + +enum town_flags +{ + +//YEW + + LENORA_GAVE_LETTER = 1070, + ASKEDABOUTPERMISSION = 1071, + GOT_BOSKIN_CELL_KEY = 1072, + BOSKINCHILDREN = 1073, + BOSKINPISSED = 1074, + BOSKINLIES = 1075, + BEN_FRIEND = 1076, + FREEBOSKIN = 1077, + BOSKINDENIED = 1078, + LEARNED_ABOUT_NICODEMUS = 1079, //set by several npcs about "enchanter near Yew" + +//Britain / Castle British + VIRTUE_STONES = 1100, //for Mandrake quest + ASKEDABOUTFREITAG = 1101, //Kytyn - used to open up conversation with Gertan in Cove + ASKEDARIANAABOUTRUNE = 1102, + ASKED_THOLDEN_ABOUT_RUNE = 1103, + ASKED_PARENTS_PERMISSION = 1104, //Anya + LEARNED_RUNE_COMPASSION = 1105, + MR_NOSE = 1106, + + BOUGHTTRIPLEXBOW = 1107, + ASKEDABOUTTRIPLEXBOW = 1108, //Gwenno + + GOT_DUCK = 1109, //Daros in the sewers + + ASKED_LAZEENA_ABOUT_ARTAGEL = 1110, // Sidequest - Ask her about Artagel, can talk to him about Lazena + ARTAGEL_IS_ALIVE = 1111, //can now tell Lazenna he's alive + +//Skara Brae + QUENTON_START = 1120, //quenton quest + ASKED_LENORA_ABOUT_MURDER = 1121, //used in Michael / Quenton quest + LEARNED_ABOUT_QUENTON = 1122, //set by Gideon when you learn what happened to open up convo flags on everyone else + + LEARNED_ABOUT_SEANCE = 1123, //learned from Dezana + LEARNED_SEANCE = 1124, + SEANCE_QUENTON = 0x01BA, //0442 + LEARNED_MICHAEL_NAME = 1125, + MICHAEL_PISSED = 1126, + MARNEY_SAVED = 1127, + FAILED_QUENTON_QUEST = 1128, + RINALDO_BACK = 1129, + STARTED_INVESTIGATION = 1130, + MARNEY_GONE = 1131, //set when you screw up and Marney left with Michael. Bad ending + MICHAEL_AT_DOCKS = 1132, // + READ_MICHAELS_SCROLL = 1133, + QUENTON_MURDER_SOLVED = 1134, + MICHAEL_TO_SKARA = 1135, // + RENTHAR_TELLS_RINALDO = 1136, //Renthar tells Rinaldo of Michael's safehouse location. Will set a timer to move Michael + MICHAEL_CAPTURED = 1137, //Michael is now at the cell awaiting his fate. Set when Renthar is with you and you kill Michael + MICHAEL_TIMER_SET = 1138, + MARNEY_PISSED = 1139, //Marney was allowed to go with Michael by accident and holds a grudge against the Avatar + RENTHAR_IN_PARTY = 1140, //Renthar is in the party now, used to keep him from staying too long + STIVIUS_SAW_MICHAEL = 1141, //when you catch Stivius in a lie and he admits. Can tell Rinaldo now. + MICHAEL_SHIP_BUILT = 1142, //Michael's ship is built + +//MINOC + ASKED_SELGANOR_ABOUT_RUNE = 1150, + LEARNED_STONES = 1151, + JOINED_ARTISANS_GUILD = 1152, + SELGANOR_GAVE_RUNE = 1153, + LEARNED_ABOUT_BALLOONIST = 1154, // where do I set this flag?! + +//Trinsic + LEARNED_WHITSABERS_SECRET = 1170, //Sandy? + TALKEDTOHOMERABOUTMAP = 1171, //Homer + WHITSABER_MAD = 1172, + WHITSABER_KNOWS = 1173, + WHITSABER_GAVE_MAP = 1174, + KEEP_WHITSABERS_SECRET = 1175, + + +//Moonglow + //Lycaeum flags - set to randomize Quest books, + BOOKS_ARE_RANDOMIZED = 1190, + MANTRA_BOOK_PLACED = 1191, + OZ_SNILWITS_BOOKS_PLACED = 1192, + FOUND_OZ_BOOK = 1193, + LEARNED_ABOUT_TABLET = 1194, + ASK_ABOUT_BEYVIN = 1195, //when asked Agnar about rune + + ASKED_MARIAH_ABOUT_BOOK = 1196, + MARIAH_READ_TABLET = 1197, //Triggers convo about book of prophesies with Sin Vraal + ASKED_MARIAH_ABOUT_TABLET = 1198, //asked about silver tablet, can talk to Zoltan about it now + ASK_THARIAND_ABOUT_SHRINE = 1199, //talked to Mariah about the shrine + +//Buccaneer's Den + GAVE_HOMER_STORMCLOAK = 1200, + FIND_STORMCLOAK = 1201, + LEARNED_ABOUT_GUILD = 1202, + RETIRE_PHOENIX = 1203, + +//Jhelom + + BRAWLING = 1210, //used for Bucs den brawling convos + //Used in valor quest + AVATAR_IS_SHERRY = 1211, + LEARNED_ABOUT_SHERRY = 1212, //when ask Lyssandra in Jhelom about rune + GOT_VALOR_RUNE = 1213, + ASK_NOMAAN_ABOUT_RUNE = 1214, //set by Zellivan + +//Serpents Hold + + + JOINED_OSS = 1220, + ASK_JOIN_OSS = 1221, //after join oss, can use again + TRAINED_WITH_LOUBET = 1223, + MAKE_SERPENT_SHIELD = 1224, //when you ask Koranda to join OSS, you can ask Gherick to make shield + +//Empath Abbey + GAVE_MOLE_SHOVEL = 1230, //Empath abbey sidequest + GLENGRAPES = 1231 + + + +}; + + +enum new_misc_flags +{ + + /* Used for Gypsy schedules */ + GYPSY_TIMER_STARTED = 1300, + DAY_ONE = 1301, + DAY_TWO = 1302, + DAY_THREE = 1303, + DAY_FOUR = 1304, + DAY_FIVE = 1305, + DAY_SIX = 1306, + DAY_SEVEN = 1307, + + CHAOS_SWORD_EQUIPPED = 1308, + + ASK_ABOUT_DUCK = 1309, + KADOR_SAD = 1310, + + //Drudgeworth Quest + READ_LEAFLET = 1311, + ASKED_PRIDGARM_ABOUT_DRUDGEY = 1312, + ASK_ANDREA_ABOUT_DRUDGEY = 1313, + HELP_DRUDGEWORTH = 1314, // set once you agree to help Drudgeworth after speaking to him in the mirror. Also sets Lucy convo flag on Chuckles + CHUCKLES_WAITS = 1315, //set after you confront Chuckles about LUcy. has him wait at 3am by mirror in Blue Boar + CHUCKLES_CREMATED = 1316, //set when you cremate Chuckles body, so you can bring his ashes to Drudgeworth + CHUCKLES_KILLED = 1317, //set when you script kill him in front of the mirror + CHUCKLES_SECRET = 1318, //set when you "let Chuckles go", will open up convo option on LB + MET_DRUDGEWORTH = 1319, //when you double click mirror. Will trigger a prompt after reading the book for the first time. + TATTLED_ON_CHUCKLES = 1320, //tattled on Chcukles to LB + + MOONGLOW_HOUSE_CLEAN = 1321, //after house is purchased in moonglow, egg will clean it up next time you enter + + //Map is overworld + MAP_IS_OVERWORLD = 2045, //for leaveParty function + + //flag if you want songs to play after converstations such as original. + PLAY_ORIGINAL_TRACKS = 2046, + + //flag to use Ankh as debugging tool + DEBUG = 2047, + + IOLO_HATES_HORSEFLESH = 1330, //set once Iolo eats the horseflesh + + + SOLVED_CHUCKLES_QUEST = 1331,//when you read the last scroll on the run around quest. + + //INNKEEPER FLAGS + INN_PEYTON = 1340, + INN_DORIS = 1341, //890 - true if rented room from Doris + + //DUNGEON FLAGS + SWITCH_WRONG = 1350, + SWITCH_WRONG_2 = 1351, + + SWITCH_CONTROL = 1352, + SWITCH_BASEMENT = 1353, + + SWITCH_TOMBKINGS = 1354, //used to remove barrier in tomb of kings when switch is flipped + + +//Gargoyles + HALL_OF_KNOWLEDGE = 1370, //set when Naxatilor asks you to read the book of ritual + READ_BOOK_RITUAL = 1371, // for karma if you lie to Naxatilor + SIXTH_MEMBER_LEAVES = 1372, + + GET_HUMAN_LENS = 1373, + MET_MONDAIN = 1374, + MET_MINAX = 1375, + MET_EXODUS = 1376, + + MET_ALTAR_SINGULARITY = 1377, + + + MADE_BALLOON = 1378, //set by scroll code when balloon has been made + + BALLOON_IS_FLYING = 1379, + LEARNED_ABOUT_FLYING = 1380, + + + READ_BALLOON_PLANS = 1381, //sets flag to ask weavers about silk bag/thread/cloth + + + + + + + + + LEARNED_ABOUT_CAPT_JOHNE = 1382, //set by Zoltan once you ask him of Silver Tablet + + LEARNED_ABOUT_HYTHLOTH = 1383, + + + + + + GOT_ARMAGEDDON = 1384, //set when Armageddon spell received from Wisp + GET_WISP_INFO = 1385, //set when Wisps ask for information, you can get the book of lost mantras + WISPS_GAVE_GOLD = 1386, //Wisps either gave you information or gold + + JAANA_IN_PARTY = 1387, + SHERRY_IN_PARTY = 1388, + IOLO_IN_PARTY = 1389, + ASK_KADOR_TRICKS = 1390, + + + LEARNEDGYPSYSSTOLEMAP = 1400, + REFUSED_WANDA_SEX = 1401, + ARTUROSIS = 1402, //set by Culham in Jhelom when asked about gypsy story + WANDA_TIRED = 1403, + DURING_WANDA_CUTSCENE = 1404, + DURING_ANDREAS_CUTSCENE = 1405, + ASKED_ABOUT_SACRIFICE_MANTRA = 1406, + LENS = 1407, //Dale in Minoc makes Lens + MET_ELAD = 1408, //bucs den 881 + LEONNA_IN_PARTY = 1409, + LEODON_IN_PARTY = 1410, + FENTRISSA_SOLD_OUT = 1411, + + MET_CAPTAIN_JOHNE = 1411, + + + + SEGGALLION_IN_PARTY = 1412, + LEARNED_OF_CAPT_JOHNE = 1413, + + + + //Used for orb of the moons locations + FOUND_CONTROL = 1414, + FOUND_PASSION = 1415, + FOUND_DILIGENCE = 1416, + FOUND_SLAB = 1417 + + +}; + + + +/* Original game flags */ + +//Who the player has met. BG used global flags for this because the Met flag didn't exist. +enum met_flags +{ +// MET_JULIA = 0x1B, + MET_LORD_BRITISH = 0x98, + MET_FINNIGAN = 0x4C, + MET_NYSTUL = 0x99, + MET_CHUCKLES = 0x9A, + MET_CANDICE = 0xAA, + MET_GORDON = 0xBB, + MET_GLADSTONE = 0x110 +}; + +//Flags used by the starting murder investigation quest +enum trinsic_murder_flags +{ +// GOT_CHRISTOPHERS_KEY = 0x3C, + GOT_TRINSIC_PASSWORD = 0x3D, + NEEDS_TRINSIC_PASSWORD = 0x42, + UNLOCKED_CHRISTOPHERS_CHEST = 0x3E, + + KNOWS_ABOUT_CHRISTOPERS_ARGUMENT = 0x3F, + REFUSED_MURDER_INVESTIGATION = 0x59, + EXPECTED_TO_LOOK_IN_STABLES = 0x5A, + REPORTED_CHRISTOPHERS_KEY = 0x48, + CAN_GIVE_MURDER_REPORT = 0x5B, + STARTED_MURDER_REPORT = 0x5D, + LEARNED_ABOUT_CROWN_JEWEL = 0x40, + LEARNED_ABOUT_HOOK = 0x43, + FINISHED_MURDER_INVESTIGATION = 0x44, + WAITING_FOR_INVESTIGATION_PAYMENT = 0x45 +}; + +//Broken the tetrahedron generator that screws up magic. This affects most conversations with wizards. +const int BROKE_TETRAHEDRON = 0x03; + +//Used the armageddon spell +const int CAST_ARMAGEDDON = 0x1E; + + +//Flags used in conversation with Lord British +enum lb_conversation_flags +{ + WESTON_FREED = 0xCC, + ASKED_LB_ABOUT_ORB = 0xDD, + ASKED_LB_ABOUT_MAGIC = 0x66, + LEARNED_ABOUT_BRITAIN_MURDER = 0xD1, //allows you to ask Patterson about it + ASKED_LB_ABOUT_HEAL = 0xD3, + LEARNED_ABOUT_BLACKROCK = 0x65, //allows you to ask Rudyom about it? + ASKED_LB_ABOUT_GUARDIAN = 0xD4, //stops you ever asking him again (yes, plaster over those plot-holes) + LB_REWARDED_FOR_FV = 0x30D //Received Lord British's reward for completing the Forge of Virtue +}; + +//Flags used in conversation with Julia +enum julia_conversation_flags +{ + ASKED_JULIA_TO_LEAVE = 0x101, + JULIA_IN_PARTY = 0x108, + KATRINA_IN_PARTY = 0x121 +}; + +//Flags used in Minoc conversations to do with the sawmill murder +enum minoc_murder_flags +{ + LEARNED_ABOUT_MINOC_MURDER = 0x11F +}; + +//Flags used by the Owen's Monument quest +enum owen_monument_flags +{ +// COMPLETED_OWENS_QUEST = 0xF7, + LEARNED_ABOUT_PLANS = 0x10B, + OWENS_PLANS_ARE_UNSAFE = 0xFD +}; + +//Batlin has buggered off (after you talk to him with the cube in your possession) +const int BATLIN_MISSING = 0xDA; + +//Heard that Patterson is having an affair with Candice +const int HEARD_ABOUT_PATTERSONS_AFFAIR = 0x80; + +//Heard about the Inner Voice +//const int HEARD_ABOUT_VOICE = 0x8C; \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/karma.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/karma.uc new file mode 100755 index 0000000..e69de29 diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/keys.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/keys.uc new file mode 100755 index 0000000..7499ef0 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/keys.uc @@ -0,0 +1,56 @@ + +const int QUALITY_BRITISH_SEWERS = 1; +const int QUALITY_BRITISH_STUDY = 2; + +const int QUALITY_NOMAAN = 4; +const int QUALITY_MAX_ARMORY = 6; +const int QUALITY_DORIS_INN = 10; +const int FRAME_DORIS = 1; + + +const int QUALITY_MOONGLOWHOUSE = 8; //buy from Aganar for 300g +const int FRAME_MOONGLOWHOUSE = 11; + +const int QUALITY_BEYVIN_CRYPT = 20; +const int QUALITY_CRYPT_CHEST = 21; + +//Innkeepers +const int QUALITY_TIMOTHY_INN = 22; +const int QUALITY_MARTIN_INN = 23; +const int QUALITY_GIDEON_INN = 24; +const int QUALITY_PEYTON_INN = 3; +const int QUALITY_PETROPH_INN = 11; + +//Key given by the jailer to escape +const int FRAME_CELL_KEY = 17; +const int QUALITY_CELL_KEY = 30; + +const int FRAME_LBKEY = 28; +const int QUALITY_LBKEY = 1; + + + + + +const int QUALITY_BASEMENT = 11; //the Cyclops' key +const int FRAME_BASEMENT = 15; // cyclops key + +//Key to Boskin's cell. +const int QUALITY_BOSKIN_CELL_KEY = 45; +const int FRAME_BOSKIN_CELL_KEY = 18; + +//Key to Hythloth +const int QUALITY_HYTH_KEY = 75; + +//Key to chest in Heroes Hole +const int QUALITY_HEROES = 76; + +//Key to chest in Swamp Cave +const int QUALITY_SWAMP = 77; + +//key to Brandon's vault in Trinsic +const int QUALITY_BRANDON_VAULT = 78; + +//Key to Drudgeworth's chest +const int QUALITY_DRUDGEWORTH = 41; +const int FRAME_DRUDGEWORTH = 26; \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/new_shapes.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/new_shapes.uc new file mode 100755 index 0000000..70ca336 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/new_shapes.uc @@ -0,0 +1,81 @@ +/* + * + * Copyright (C) 2006 Alun Bestor/The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file contains the shape numbers for all of the new + * shapes installed by the Keyring mod. It is unsorted by shape #. + * + * Author: Marzo Junior/Alun Bestor + * Last Modified: 2006-03-19 + */ + +//const int SHAPE_NEW_BODIES = 1099; //0x44B +const int SHAPE_KEYRING = 1100; //0x44C +const int SHAPE_BARRIER = 1101; //0x44D +const int SHAPE_JOURNAL = 1102; //0x44E +const int SHAPE_LAURIANNA_MONSTER = 1103; //0x44F +const int SHAPE_BLACKROCK_POTION = 1104; //0x450 +const int SHAPE_GEM_OF_DISPELLING = 1105; //0x451 +const int SHAPE_SPIDER_EGG = 1106; //0x452 +const int SHAPE_LAURIANNA = 1107; //0x453 +const int SHAPE_LAURIANNA_ROOTED = 1108; //0x454 +const int SHAPE_SPELL_SPELLBOOK = 1109; //0x455 +const int SHAPE_IOLOS_LUTE = 1110; //0x456 +const int SHAPE_SPELL_AMULET = 1111; //0x457 +const int SHAPE_JULIAS_HAMMER = 1112; //0x458 +//const int SHAPE_ORB_MOONGATE_NW_SE = 1113; //0x459 +//const int SHAPE_ORB_MOONGATE_NE_SW = 1114; //0x45A +const int SHAPE_ETERNAL_FLAME = 1115; //0x45B +const int SHAPE_FLAME_OF_INFINITY = 1116; //0x45C +const int SHAPE_FLAME_OF_SINGULARITY = 1117; //0x45D +const int SHAPE_DEATH_BOLT_NEW = 1118; //0x45E +const int SHAPE_CODEX_BARRIER = 1119; //0x45F +const int SHAPE_STAIRS_DOWN = 1120; //0x460 +const int SHAPE_FAKE_WATER = 1121; //0x461 +const int SHAPE_MARIAH = 1122; //0x462 +const int SHAPE_SHRINE = 1123; //0x463 +const int SHAPE_ITEM_OF_PRINCIPLE = 1124; //0x464 +const int SHAPE_CODEX_CARPET = 1125; //0x465 +const int SHAPE_LB_SCEPTER = 1126; //0x466 +const int SHAPE_LB_CROWN = 1127; //0x467 +const int SHAPE_LB_AMULET = 1128; //0x468 +const int SHAPE_MAGIC_CARPET = 1129; //0x469 +const int SHAPE_ROLLED_CARPET = 1130; //0x46A +const int SHAPE_CARPET_ROLLER = 1131; //0x46B + +//Added to SHAPE_STONE_CHIPS +//added for Rune of Honor quest +const int FRAME_SLATE = 5; + +//Added to SHAPE_RUNE +//added for Rune of Honor quest +const int FRAME_RUNE_REPLICA = 8; + +//Added to SHAPE_KITCHEN_ITEM +const int FRAME_CHURN_2 = 16; +const int FRAME_CHURN_3 = 17; +const int FRAME_PITCHER_MILK = 18; + +//Added to SHAPE_DOUGH +//flat dough + apples = pie dough (when baked in oven, this creates a pie) +const int FRAME_DOUGH_PIE = 3; +//flour + egg = cake dough (when baked in oven, this creates a cake) +const int FRAME_DOUGH_CAKE = 4; + +//Added to SHAPE_BUCKET +const int FRAME_BUCKET_MILK = 7; diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/old_constants.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/old_constants.uc new file mode 100755 index 0000000..b4a7dbe --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/old_constants.uc @@ -0,0 +1,869 @@ +/* + * + * Copyright (C) 2006-2009 Alun Bestor/The Exult Team/Team TFL + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +// Title: Constants +// This header file defines general constants used throughout usecode, for +// Black Gate and Serpent Isle. Constants particular to a function can be +// found in the relevant codefile; constants particular to a game can be +// found in that game's header directory. +// +// *Author:* Alun Bestor (exult at washboardabs dot net) +// with modifications by Marzo Junior (marzojr at yahoo dot com) +// and NaturalDocs implementation by Peter M Dodge (twicescorned at gmail dot com) +// +// *Last modified:* 2009-01-31 + + +// Enum: events +// Event types, compiled with help from Marzo +// +// The global *event* variable is set with one of these values to describe +// how the current function was called: whether by the player clicking on +// the object, or by a scripted event, or by egg trigger conditions, or +// just the item being onscreen, etc. +// +// Functions check the value of *event* in order to provide different responses +// to different events. +// +// Functions can also set *event* to an arbitrary value, in order to mimic a real +// event or just as a 'pseudo-argument' to functions called with the likes of UI_path_run_usecode. +// +// PROXIMITY = 0 - Object is on-screen or nearby. This is called repeatedly, with a random +// delay between each call +// DOUBLECLICK = 1 - Object is double-clicked on. +// SCRIPTED = 2 - Function is called from inside a sript{} block (very common). +// EGG = 3 - Object is an egg that just hatched (triggered by egg activation conditions). +// WEAPON = 4 - Object was wielded and 'swung' in combat. This is mainly used with +// 'weapon-like' objects, e.g. smokebombs and fishing rods, that have more advanced 'attack' behaviour. +// READIED = 5 - Object was worn or readied in inventory - used by items like the Ring of Invisibility. +// UNREADIED = 6 - Object was taken off or put away in inventory. +// DEATH = 7 - NPC has just been killed (SI-only). +// STARTED_TALKING = 9 - NPC starts conversation with you (has TALK schedule and has reached the Avatar). +// This is SI-only, BG uses event 1 for this, both for conversations triggered by doubleclick +// and by the TALK schedule. +// +// The following events are set manually in usecode, which means they're arbitrary programmer +// conventions rather than recognised game states. +// +// PATH_SUCCESS = 10 - Set with calls to UI_path_run_usecode, to indicate a successful pathfind +// to the target object. +// PATH_FAILURE = 11 - Set with calls to UI_set_path_failure, to indicate an interrupted pathfind +// (e.g. when the player moves the Avatar manually) +// +// In particular, I switched to SI values for these events because si_tournament flag +// also works in BG now. +enum events +{ + PROXIMITY = 0, + DOUBLECLICK = 1, + SCRIPTED = 2, + EGG = 3, + WEAPON = 4, + READIED = 5, + UNREADIED = 6, + DEATH = 7, + STARTED_TALKING = 9, + PATH_SUCCESS = 10, + PATH_FAILURE = 11 +}; + + +// Enum: axes +// Coordinate axes, use when referencing X,Y,Z coordinate arrays, e.g. from UI_get_object_position +// +// Note that the coordinates returned by UI_click_on_item are 1 array-index higher, because +// index 1 of the returned array is the actual item clicked on. You can resolve this to a +// regular X,Y,Z coordinates array by using array = removeFromArray(array, array[1]). +// +// X = 1 - horizontal axis (numbered from west to east). +// Y = 2 - vertical axis (numbered from north to south). +// Z = 3 - lift axis (numbered from ground to sky). +// +// See Also: +// +enum axes +{ + X = 1, + Y = 2, + Z = 3 +}; + + +// Enum: directions +// Cardinal directions: returned by UI_get_direction. Use with face or step statements in script{} blocks. +// +// NORTH = 0 - Compass north. +// NORTHEAST = 1 - Compass northeast. +// EAST = 2 - Compass east. +// SOUTHEAST = 3 - Compass southeast. +// SOUTH = 4 - Compass south. +// SOUTHWEST = 5 - Compass southwest. +// WEST = 6 - Compass west. +// NORTHWEST = 7 - Compass northwest. +// +// Example: +// > script item { step NORTH; step NORTH; face SOUTH; } //take two steps north, then turn to face south +enum directions +{ + NORTH = 0, + NORTHEAST = 1, + EAST = 2, + SOUTHEAST = 3, + SOUTH = 4, + SOUTHWEST = 5, + WEST = 6, + NORTHWEST = 7 +}; + + +// Enum: day_periods +// Parts of the day (3-hour intervals). Returned by UI_part_of_day. This is usually only +// used by conversation scripts, as a way of narrowing down schedule-related behaviour. +// +// MIDNIGHT = 0 - 0-2 +// EARLY = 1 - 3-5 (dim palette) +// DAWN = 2 - 6-8 (day palette) +// MORNING = 3 - 9-11 +// NOON = 4 - 12-14 +// AFTERNOON = 5 - 15-17 +// EVENING = 6 - 18-20 (dim palette) +// NIGHT = 7 - 21-23 (night palette) +enum day_periods +{ + MIDNIGHT = 0, + EARLY = 1, + DAWN = 2, + MORNING = 3, + NOON = 4, + AFTERNOON = 5, + EVENING = 6, + NIGHT = 7 +}; + + +// Enum: wildcards +// Wildcards, used for specifying "any acceptable value for this parameter" to a +// measuring function. These are commonly used with object-related intrinsics like +// , , , etc. +// +// SHAPE_ANY = -359 - Any valid object from SHAPES.VGA. +// QUALITY_ANY = -359 - Any valid quality parameter. +// FRAME_ANY = -359 - Any valid fram for a given shape. +enum wildcards +{ + SHAPE_ANY = -359, + QUALITY_ANY = -359, + FRAME_ANY = -359, + FIND_ON_SCREEN = -359 +}; + + +// Enum: times +// Tick multipliers, for use with UI_advance_time or script statements +// +// MINUTE = 25 - One game 'minute'. +// HOUR = 1500 - One game 'hour'. +// DAY = 36000 - One game 'day'. +// +// Examples: +// > UI_advance_time(30 * MINUTE); //advance time by 30 game minutes +// > UI_advance_time(2 * HOUR); //advance time by two game hours +// > script after MINUTE ticks { ... } //schedule this script block to execute after one game minute +enum times +{ + MINUTE = 25, + HOUR = 1500 +}; +const long DAY = 36000; + + +// Enum: item_flags +// Item/NPC flags, stolen from the Exult LB-joins-party patch with some comments added. +// +// These can be retrieved and set using UI_get_item_flag(itemref, flag), +// UI_set_item_flag(itemref, flag) and UI_clear_item_flag(itemref, flag). +// +// INVISIBLE = 0 - Object is invisible (rendered with 'invisible' palette). +// See , . +// ASLEEP = 1 - Object is asleep. Only really useful for PC/NPC/monster. +// See . +// CHARMED = 2 - Object is charmed (attacks allies). Only really useful for PC/NPC/monster. +// See , . +// CURSED = 3 - Object is cursed (stats malus). Only really useful for PC/NPC/monster. See . +// DEAD = 4 - Object is dead. Only really useful for NPC/monster. +// *DONT set on dead bodies, causes bugs.* +// IN_PARTY = 6 - Object is an NPC in the party. +// PARALYZED = 7 - Object is paralysed and unable to move. Normal objects will be stationary by default. +// See . +// PARALYSED = 7 - Canadian/British spelling. +// POISONED = 8 - Object is afflicted with poison. +// Can be set on objects, but will only do anything to PC/NPC/monster. See . +// PROTECTION = 9 - Object is protected from harm. Only really useful for PC/NPC/monster. See . +// ON_MOVING_BARGE = 10 - Object is on a 'barge' object that is moving. +// OKAY_TO_TAKE = 11 - Object will not trigger stealing usecode if you take it. +// MIGHT = 12 - Object has might. (Stats boon) Only really useful for PC/NPC/monster. +// See , . +// IMMUNITIES = 13 - Object has several immunities. Can be gotten only. +// CANT_DIE = 14 - Object can't die. Used for testing purposes, and certain critical NPCs (such as L.B.). +// DANCING = 15 - Object is executing the usecode called by the spell. +// DONT_MOVE = 16 - SI: User cannot move. +// DONT_RENDER = 16 - BG: Same as INVISIBLE, but don't render at all. +// SI_ON_MOVING_BARGE = 17 - SI: Object is on a special instance of the SI barges. (Turtle for example.) +// TEMPORARY = 18 - Object is temporary and will decay once the chunk it is in is un-cached. +// SAILOR = 20 - Object is the 'captain' of a barge. *Only set on PC/NPCs!* +// OKAY_TO_LAND = 21 - Set in usecode for flying carpet, TRUE if you can land currently. +// BG_DONT_MOVE = 22 - BG: BG's version of DONT_MOVE. +// IN_DUNGEON = 23 - If set on PC or an NPC, they won't trigger the stealing usecode if they take food objects. +// CONFUSED = 25 - Object is 'confused' - no apparent intrinsic affects. Was supposed to be part of a spell +// axed for space limitations in spellbook. +// IN_MOTION = 26 - Object is a barge object moving, or on a barge object that is moving. Set in usecode, and +// mostly used for the SI 'NPC' ships such as the turtle. +// MET = 28 - Object has been talked to previously. Should be set in a conversation Usecode script. +// This determines conversation behaviour, and whether the NPC's real name or shape name is displayed when they are +// single-clicked on. BG originally used global flags for this, which amounts to an extra 250-odd flags. What a waste of +// time. +// +// Flags 29, 30, and 38 were originally SI-only, but are implemented in BG by Exult. +// +// SI_TOURNAMENT = 29 - Object call usecode (eventid = 7) on death. Used for the List Field in SI. +// SI_ZOMBIE = 30 - Object will not respond to normal cues. +// Used for sick Neyobi, insane party members/Cantra. +// NAKED = 38 - Object is naked. On PC, causes them to use appropriate 'naked' shape. On NPCs or +// monsters, no effect unless you give it a meaning in Usecode scripting. To actually make NPCs naked, use +// set_polymorph instead. +// +// Flags > 31 appear to be SI flags only, excepting 38 which Exult implements (above). +// +// NO_SPELL_CASTING = 31 - Object cannot cast spells nor have spells cast upon them. Used to protect certain NPCs. +// POLYMORPH = 32 - Object is polymorphed. Used in spell. +// TATTOOED = 33 - Object has been tattooed. Set after the lady tattoos you by usecode. Causes the NPC +// portraits to use a different 'tattooed' shape num. +// READ = 34 - Object can read serpent-script text. Set by the spell. Only really +// meaningful used on the PC. +// PETRA = 35 - Object has switched bodies with petra. Only really meaningful used on the PC. +// FREEZE = 36 - Object cannot move. Used as part of the spell. +enum item_flags +{ + INVISIBLE = 0, + ASLEEP = 1, + CHARMED = 2, + CURSED = 3, + DEAD = 4, + IN_PARTY = 6, + PARALYZED = 7, + PARALYSED = 7, + POISONED = 8, + PROTECTION = 9, + ON_MOVING_BARGE = 10, + OKAY_TO_TAKE = 11, + MIGHT = 12, + IMMUNITIES = 13, + CANT_DIE = 14, + DANCING = 15, + //DONT_MOVE = 16, + DONT_RENDER = 16, + SI_ON_MOVING_BARGE= 17, + TEMPORARY = 18, + SAILOR = 20, + OKAY_TO_LAND = 21, + BG_DONT_MOVE = 22, + IN_DUNGEON = 23, + CONFUSED = 25, + IN_MOTION = 26, + MET = 28, + SI_TOURNAMENT = 29, + SI_ZOMBIE = 30, + NO_SPELL_CASTING = 31, + POLYMORPH = 32, + TATTOOED = 33, + READ = 34, + PETRA = 35, + FREEZE = 37, + NAKED = 38 +}; + + +// Enum: schedules +// Business activities (taken from the cheat screen). +// +// IN_COMBAT = 0 - Creature will fight nearby creatures of opposite alignment. Renamed to not conflict with +// COMBAT, the NPC stat property. +// PACE_HORIZONTAL = 1 - Walk horizontally until you hit a wall, then turn around. (Patrolling on the cheap.) +// PACE_VERTICAL = 2 - Same as above, but vertically. +// TALK = 3 - NPC runs to the Avatar to talk to them. When they get within a certain distance of where +// the Avatar was when this schedule was set, a doubleclick event is triggered on the NPC. At this point the +// schedule must be changed. +// DANCE = 4 - NPC dances, basically moving about and looking kinda funny. :-) +// EAT = 5 - Find the nearest table with a place set with plate. Wait for food. Eat. +// FARM = 6 - Waves farm implements around. Otherwise, same as *Loiter*. +// TEND_SHOP = 7 - Same as *Loiter,* but used to narrow down schedule barks in the Usecode. +// MINE = 8 - Wander around with pickaxe, hack at random dungeon walls. +// MINER = 8 - Same as above. Convinence name. +// HOUND = 9 - Follow PC and party members very closely if they come close. +// STANDTHERE = 10 - Just stand around, as name implies. Renamed to not conflict with STAND, the +// NPC animation frame. +// LOITER = 11 - Hangs around a certain point, within 10 units or so. +// WANDER = 12 - Roams nearby a certain point (as much as a 320x200 screen away). +// BLACKSMITH = 13 - Same as *Loiter*/*Tend_Shop*, except if there is a firepit, anvil, and trough around, the NPC +// will smith items. +// SLEEP = 14 - Find a bed, sleep in it. Pretty simple. +// WAIT = 15 - Similar to *Stand*, except that they will never leave the WAIT schedule until it is +// manually changed: their preset schedule list is overridden. +// MAJOR_SIT = 16 - Do absolutely nothing but find the nearest seat and sit in it. +// GRAZE = 17 - Wander around in the plains, eat grass. More for animals than NPCs. :-) +// BAKE = 18 - Same as *Loiter*, unless the NPC has an oven and a table around, in which case they will +// produce baked goods. +// SEW = 19 - Same as *Loiter*, unless the NPC has a seat with a weaving loom and a seat with a spinning +// wheel, in which case they will produce clothing. +// SHY = 20 - Tries to keep out of the Avatar's way - will half-heartedly flee until out of a +// certain range. +// LAB = 21 - Same as *Loiter*, unless there is a table and cauldron around, in which case they will +// produce potions. +// THEIF = 22 - NPC follows the party, tries to steal items. Only really works if the NPC usecode has a +// handler to take the items. +// WAITER = 23 - NPC will go to other NPCs in the vicinity (same range as *Wander*), 'serving' food items to +// them if they have a plate in front of them. +// SPECIAL = 24 - Used in some special usecode scripts, namely Frigidazzi in SI. Basically stops a NPC from +// wandering around such as with *Wait* but without neccesarily wiping the schedule. +// KID_GAMES = 25 - Tag! Thou art it! And so forth. +// TAG = 25 - Convinence name, same as above. +enum schedules +{ + IN_COMBAT = 0, + PACE_HORIZONTAL = 1, + PACE_VERTICAL = 2, + TALK = 3, + DANCE = 4, + EAT = 5, + FARM = 6, + TEND_SHOP = 7, + MINE = 8, + MINER = 8, + HOUND = 9, + STANDTHERE = 10, + LOITER = 11, + WANDER = 12, + BLACKSMITH = 13, + SLEEP = 14, + WAIT = 15, + MAJOR_SIT = 16, + GRAZE = 17, + BAKE = 18, + SEW = 19, + SHY = 20, + LAB = 21, + THIEF = 22, + WAITER = 23, + SPECIAL = 24, + KID_GAMES = 25, + TAG = 25, + EAT_AT_INN = 26, //same as Eat, only with different barks. + DUEL = 27, + SPAR = 27, + PREACH = 28, + PATROL = 29, //This tells the AI to follow a particular set of patrol waypoints + DESK_WORK = 30, + FOLLOW_AVATAR = 31 //That most noble of pursuits. Like WAIT, this completely overrides the NPC's schedule list. +}; + +// Enum: npc_frames +// NPC animation frames. Use these with UI_set_item_frame or (preferably) in script blocks, +// with 'actor frame'. +// +// *Important note:* use 'actor frame' with NPCs instead of 'frame', as 'actor frame' takes +// the NPC's current facing into account. +// +// Examples: +// > script AVATAR { actor frame STAND; actor frame USE; actor frame SWING_1; actor_frame STAND; } +// +// STAND = 0 - standing at rest +// WALK_1 = 1 - stepping forward +// WALK_2 = 2 - stepping forward +// +// USE = 3 - general use motion +// +// SWING_1 = 4 - start of one-handed swing, arm up over shoulder +// SWING_2 = 5 - middle of one-handed swing, arm out to the side +// SWING_3 = 6 - end of one-handed swing, arm out to the front +// +// SWING_2H_1 = 7 - start of 2-handed swing, arms up over shoulder +// SWING_2H_2 = 8 - middle of 2-handed swing, arms out to the side +// SWING_2H_3 = 9 - end of 2-handed swing, arms out to the front +// +// SIT = 10 - sitting down +// LEAN = 11 - leaning down +// KNEEL = 12 - kneeling on one knee +// LIE = 13 - lying down +// CAST_1 = 14 - both arms high in the air (casting motion) +// CAST_2 = 15 - both arms stretched out (casting motion) +enum npc_frames +{ + STAND = 0, + WALK_1 = 1, + WALK_2 = 2, + + USE = 3, + + SWING_1 = 4, + SWING_2 = 5, + SWING_3 = 6, + + SWING_2H_1 = 7, + SWING_2H_2 = 8, + SWING_2H_3 = 9, + + SIT = 10, + LEAN = 11, + KNEEL = 12, + LIE = 13, + CAST_1 = 14, + CAST_2 = 15 +}; + +// Enum: frame_offsets +// North/South/East/West frame offsets for the NPC frames. Only really necessary if you're +// using or 'frame' +// +// NORTH_FRAMESET = 0 - Frames in Shapes.vga start facing north +// SOUTH_FRAMESET = 16 - After 16 frames they face south. +// WEST_FRAMESET = 32 - After 32 frames they face west. +// EAST_FRAMESET = 48 - After 48 frames they face east. +enum frame_offsets +{ + NORTH_FRAMESET = 0, + SOUTH_FRAMESET = 16, + WEST_FRAMESET = 32, + EAST_FRAMESET = 48 +}; + +// Enum: is_readied_inv_slots +// Ready slots: use with . These are the same whether paperdolls are on or off. +// +// +// IR_RIGHT_HAND = 1 - Item wielded in right hand +// IR_WEAPON_HAND = 1 - Right hand is also called the weapon hand +// IR_BOTH_HANDS = 1 - Item wielded with both hands +// +// IR_LEFT_HAND = 2 - Item wielded in left hand +// IR_SHIELD_HAND = 2 - Left hand is also called the shield hand +// IR_OFF_HAND = 2 - Left hand is also called the off hand +// +// IR_NECK = 3 - Item worn around the neck +// IR_CLOAK = 3 - Cloaks happen to be worn around the neck +// +// IR_RIGHT_FINGER = 6 - Item worn on right finger (ring) +// IR_LEFT_FINGER = 7 - Item worn on left finger (ring) +// IR_GLOVES = 6 - Gloves technically take up the right finger spot. +// +// IR_HEAD = 9 - Items worn on the head such as headbands, helms, etc +// IR_BELT = 11 - Items worn around the waist such as belts, girdles +enum is_readied_inv_slots +{ + IR_RIGHT_HAND = 1, + IR_WEAPON_HAND = 1, + IR_BOTH_HANDS = 1, //For two-handed items + + IR_LEFT_HAND = 2, + IR_SHIELD_HAND = 2, + IR_OFF_HAND = 2, + + IR_NECK = 3, + IR_CLOAK = 3, + + IR_RIGHT_FINGER = 6, + IR_LEFT_FINGER = 7, + IR_GLOVES = 6, + + IR_HEAD = 9, + + IR_QUIVER = 10, + IR_BELT = 11, // - Worn across the waist, such as belts and girdles + IR_TORSO = 5, // - Worn on the torso, such as armour + IR_FEET = 13, // - Worn on feet, such as boots + IR_LEGS = 14, // - Worn on legs, such as greaves + IR_BACKPACK = 15, // - Containers worn on the back, such as backpacks + IR_BACK_SHIELD = 16, // - *SI only.* Shield slung across the back + IR_BACK_SPOT = 17 // - *SI only.* Weapon slung across the back + +}; + +// Enum: get_readied_inv_slots +// Ready slots: use with . These are the same whether paperdolls are on or off. +// +// LEFT_HAND = 0 - Items wielded in the left hand. +// SHIELD_HAND = 0 - Left hand is also called shield hand. +// OTHER_HAND = 0 - Left hand is also called other hand. +// +// RIGHT_HAND = 1 - Items wielded in the right hand. +// WEAPON_HAND = 1 - Right hand is also called the weapon hand. +// BOTH_HANDS = 1 - Items worn in both hands technically count as wielded in the right hand. +// +// CLOAK = 2 - *SI only.* Items worn around the neck and back such as cloaks and capes. +// NECK = 3 - Items worn on the neck such as a collar. +// HEAD = 4 - Items worn on the head such as a helm. +// +// GLOVES = 5 - Items worn on both hands, such as gloves. +// In BG, exclusive with ONE_FINGER and OTHER_FINGER +// +// USECODE_CONTAINER = 6 - *SI only.* Usecode container, used for containing eggs 'carried' by player. +// +// ONE_FINGER = 7 - Ring or item worn on right hand. In BG, exclusive with GLOVES. +// OTHER_FINGER = 8 - Ring or item worn on left hand. In BG, exclusive with GLOVES +// +// EARRINGS = 9 - *SI only.* Earrings, such as the serpent earrings +// +// QUIVER = 10 - Arrows held in quiver +// BELT = 11 - Worn across the waist, such as belts and girdles +// TORSO = 12 - Worn on the torso, such as armour +// FEET = 13 - Worn on feet, such as boots +// LEGS = 14 - Worn on legs, such as greaves +// BACKPACK = 15 - Containers worn on the back, such as backpacks +// BACK_SHIELD = 16 - *SI only.* Shield slung across the back +// BACK_SPOT = 17 - *SI only.* Weapon slung across the back +enum get_readied_inv_slots +{ + LEFT_HAND = 0, + SHIELD_HAND = 0, + OTHER_HAND = 0, + + RIGHT_HAND = 1, + WEAPON_HAND = 1, + BOTH_HANDS = 1, + + CLOAK = 2, //SI only + NECK = 3, + HEAD = 4, + + GLOVES = 5, //In BG, exclusive with ONE_FINGER and OTHER_FINGER + + USECODE_CONTAINER = 6, //SI only + + ONE_FINGER = 7, //In BG, exclusive with GLOVES + OTHER_FINGER = 8, //In BG, exclusive with GLOVES + + EARRINGS = 9, //SI only + + QUIVER = 10, + BELT = 11, + TORSO = 12, + FEET = 13, + LEGS = 14, + BACKPACK = 15, + BACK_SHIELD = 16, //SI only + BACK_SPOT = 17 //SI only +}; + +// Enum: npc_properties +// NPC properties (mostly ability scores). These can be retrieved and set +// using (npc, property) and (npc, property, value) +// respectively. Note however that will actually *add* the value to +// the original property, not set it to that value. Which means you will need to calculate +// a relative positive/negative adjustment to set it to a target value. +// +// STRENGTH = 0 - How strong a character is. +// DEXTERITY = 1 - The manual dexterity of the character. +// INTELLIGENCE = 2 - How intelligent a character is. +// HEALTH = 3 - How much punishment a character can take before they die. +// COMBAT = 4 - The combat skill of a character. +// MANA = 5 - The mental reserves of a spellcaster. +// MAX_MANA = 6 - The maximum mana a spellcaster can have. +// TRAINING = 7 - Training points are used to increase stats. +// EXPERIENCE = 8 - Experience points accumulate to increase levels. +// FOODLEVEL = 9 - How sustained a character is. +enum npc_properties +{ + STRENGTH = 0, + DEXTERITY = 1, + INTELLIGENCE = 2, + HEALTH = 3, + COMBAT = 4, + MANA = 5, + MAX_MANA = 6, + TRAINING = 7, + EXPERIENCE = 8, + FOODLEVEL = 9 +}; + +// Enum: npc_attack_modes +// NPC attack behaviours. Retrieve and set using (npc, mode) +// and (npc). +// +// NEAREST = 0 - Attack the nearest hostile NPC. +// WEAKEST = 1 - Attack the hostile NPC deemed the weakest. +// STRONGEST = 2 - Attack the hostile NPC deemed the strongest. +// BERSERK = 3 - Attack anything and everything! +// PROTECT = 4 - Go to the protection of party members in Defend mode. +// DEFEND = 5 - Defend a designated party member. Only useful for members of the party. +// FLANK = 6 - Try to get to the enemy's side. +// FLEE = 7 - Flee from any enemy that tries to engage them. +// RANDOM = 8 - Random of the above. +// MANUAL = 9 - Player-controlled. Only the Avatar can be manual controlled, though in +// the future I'd like to see it that it can just be any _one_ party member. +enum npc_attack_modes +{ + NEAREST = 0, + WEAKEST = 1, + STRONGEST = 2, + BERSERK = 3, + PROTECT = 4, + DEFEND = 5, + FLANK = 6, + FLEE = 7, + RANDOM = 8, + MANUAL = 9 +}; + +// Enum: cursors +// Failure cursor constants for use with . Note that these do not +// correspond to frame numbers in pointers.uc, but to some internal mapping. (the +// "BLOCKED" cursor seems to be unavailable through this method.) +// +// CURSOR_X = 1 - Default "no you can't do that" X cursor +// CURSOR_OUT_OF_RANGE = 2 - Displays a message "out of range" +// CURSOR_OUT_OF_AMMO = 3 - Displays a message "out of ammo", should only be for projectile weapons of course. +// CURSOR_TOO_HEAVY = 4 - Displays a message "too heavy", when we cant move something. +// CURSOR_WONT_FIT = 5 - Displays a message "won't fit", when we exceed container size. +enum cursors +{ + CURSOR_X = 1, + CURSOR_OUT_OF_RANGE = 2, + CURSOR_OUT_OF_AMMO = 3, + CURSOR_TOO_HEAVY = 4, + CURSOR_WONT_FIT = 5 +}; + +// Enum: alignments +// NPC atitudes toward the player. +// +// FRIENDLY = 0 - Will aid the player in combat. +// NEUTRAL = 1 - Won't aid, or hinder, the player in combat. +// HOSTILE = 2 - Will hinder the player and attempt to attack them if possible. +// RANDOM_ALIGN = 3 - Random of the above. +enum alignments +{ + FRIENDLY = 0, + NEUTRAL = 1, + HOSTILE = 2, + RANDOM_ALIGN = 3 +}; + +// Enum: weather_types +// Different engine weather types. +// +// CLEAR_WEATHER = 0 - Clear skies, no clouds, nothing. +// SNOWING = 1 - Unsure; in Exult, works the same as RAIN, below and seems identical to RAIN in the originals. +// RAIN = 2 - Rain falling, overcast and dark skies. +// SPARKLE = 3 - Prevents casting of spells in BG (and maybe SI too?) +// FOG = 4 - Seems to work like RAIN in the originals. More overcast. +// OVERCAST = 5 - Seems to clear weather in the originals. +// CLOUDY = 6 - Clouds appear but otherwise, clear. +enum weather_types +{ + CLEAR_WEATHER = 0, + SNOWING = 1, //Unsure; in Exult, works the same as RAIN, below and seems identical to RAIN in the originals + RAIN = 2, + SPARKLE = 3, //Prevents casting of spells in BG (and maybe SI too?) + FOG = 4, //Seems to work like RAIN in the originals + OVERCAST = 5, //Seems to clear weather in the originals + CLOUDY = 6 +}; + +// Enum: item_masks +// Mask values used (e.g.) in intrinsic; these are flags, which mean +// that they can be added together. +// +// MASK_NONE = 0x0 - No masks apply to this object. +// MASK_NPC = 0x04 - Non-player characters. +// MASK_NPC2 = 0x08 - Maybe non-party NPCs only? All NPCs in Exult. +// MASK_EGG = 0x10 - Item is a usecode egg. Also for barges +// MASK_INVISIBLE = 0x20 - Render the object using the invisible pallete. +// MASK_PARTY_INVISIBLE = 0x40 - Invisible, but only to the party? Unsure. +// MASK_TRANSLUCENT = 0x80 - Do not render. +// MASK_ALL_UNSEEN = 0xB0 - MASK_EGG + MASK_INVISIBLE + MASK_TRANLUCENT. +enum item_masks +{ + MASK_NONE = 0x0, + MASK_NPC = 0x04, + MASK_NPC2 = 0x08, + MASK_EGG = 0x10, + MASK_INVISIBLE = 0x20, + MASK_PARTY_INVISIBLE = 0x40, + MASK_TRANSLUCENT = 0x80, + MASK_ALL_UNSEEN = 0xB0 +}; + +// Enum: npc_rot_frames +// NPC animation frames, WITH rotation bit. Use these with UI_set_item_frame_rot +// or (preferably) in script blocks, with 'frame'. +// +// Examples: +// > script AVATAR { frame STAND_WEST; frame USE_NORTH; frame SWING_1_SOUTH; frame STAND_EAST; } +// +// STAND_NORTH - 0x0000 +// WALK_1_NORTH - 0x0001 +// WALK_2_NORTH - 0x0002 +// USE_NORTH - 0x0003 +// SWING_1_NORTH - 0x0004 +// SWING_2_NORTH - 0x0005 +// SWING_3_NORTH - 0x0006 +// SWING_2H_1_NORTH - 0x0007 +// SWING_2H_2_NORTH - 0x0008 +// SWING_2H_3_NORTH - 0x0009 +// SIT_NORTH - 0x000A +// LEAN_NORTH - 0x000B +// KNEEL_NORTH - 0x000C +// LIE_NORTH - 0x000D +// CAST_1_NORTH - 0x000E +// CAST_2_NORTH - 0x000F +// STAND_SOUTH - 0x0010 +// WALK_1_SOUTH - 0x0011 +// WALK_2_SOUTH - 0x0012 +// USE_SOUTH - 0x0013 +// SWING_1_SOUTH - 0x0014 +// SWING_2_SOUTH - 0x0015 +// SWING_3_SOUTH - 0x0016 +// SWING_2H_1_SOUTH - 0x0017 +// SWING_2H_2_SOUTH - 0x0018 +// SWING_2H_3_SOUTH - 0x0019 +// SIT_SOUTH - 0x001A +// LEAN_SOUTH - 0x001B +// KNEEL_SOUTH - 0x001C +// LIE_SOUTH - 0x001D +// CAST_1_SOUTH - 0x001E +// CAST_2_SOUTH - 0x001F +// STAND_WEST - 0x0020 +// WALK_1_WEST - 0x0021 +// WALK_2_WEST - 0x0022 +// USE_WEST - 0x0023 +// SWING_1_WEST - 0x0024 +// SWING_2_WEST - 0x0025 +// SWING_3_WEST - 0x0026 +// SWING_2H_1_WEST - 0x0027 +// SWING_2H_2_WEST - 0x0028 +// SWING_2H_3_WEST - 0x0029 +// SIT_WEST - 0x002A +// LEAN_WEST - 0x002B +// KNEEL_WEST - 0x002C +// LIE_WEST - 0x002D +// CAST_1_WEST - 0x002E +// CAST_2_WEST - 0x002F +// STAND_EAST - 0x0030 +// WALK_1_EAST - 0x0031 +// WALK_2_EAST - 0x0032 +// USE_EAST - 0x0033 +// SWING_1_EAST - 0x0034 +// SWING_2_EAST - 0x0035 +// SWING_3_EAST - 0x0036 +// SWING_2H_1_EAST - 0x0037 +// SWING_2H_2_EAST - 0x0038 +// SWING_2H_3_EAST - 0x0039 +// SIT_EAST - 0x003A +// LEAN_EAST - 0x003B +// KNEEL_EAST - 0x003C +// LIE_EAST - 0x003D +// CAST_1_EAST - 0x003E +// CAST_2_EAST - 0x003F +enum npc_rot_frames +{ + STAND_NORTH = 0x0000, + WALK_1_NORTH = 0x0001, + WALK_2_NORTH = 0x0002, + USE_NORTH = 0x0003, + SWING_1_NORTH = 0x0004, + SWING_2_NORTH = 0x0005, + SWING_3_NORTH = 0x0006, + SWING_2H_1_NORTH = 0x0007, + SWING_2H_2_NORTH = 0x0008, + SWING_2H_3_NORTH = 0x0009, + SIT_NORTH = 0x000A, + LEAN_NORTH = 0x000B, + KNEEL_NORTH = 0x000C, + LIE_NORTH = 0x000D, + CAST_1_NORTH = 0x000E, + CAST_2_NORTH = 0x000F, + STAND_SOUTH = 0x0010, + WALK_1_SOUTH = 0x0011, + WALK_2_SOUTH = 0x0012, + USE_SOUTH = 0x0013, + SWING_1_SOUTH = 0x0014, + SWING_2_SOUTH = 0x0015, + SWING_3_SOUTH = 0x0016, + SWING_2H_1_SOUTH = 0x0017, + SWING_2H_2_SOUTH = 0x0018, + SWING_2H_3_SOUTH = 0x0019, + SIT_SOUTH = 0x001A, + LEAN_SOUTH = 0x001B, + KNEEL_SOUTH = 0x001C, + LIE_SOUTH = 0x001D, + CAST_1_SOUTH = 0x001E, + CAST_2_SOUTH = 0x001F, + STAND_WEST = 0x0020, + WALK_1_WEST = 0x0021, + WALK_2_WEST = 0x0022, + USE_WEST = 0x0023, + SWING_1_WEST = 0x0024, + SWING_2_WEST = 0x0025, + SWING_3_WEST = 0x0026, + SWING_2H_1_WEST = 0x0027, + SWING_2H_2_WEST = 0x0028, + SWING_2H_3_WEST = 0x0029, + SIT_WEST = 0x002A, + LEAN_WEST = 0x002B, + KNEEL_WEST = 0x002C, + LIE_WEST = 0x002D, + CAST_1_WEST = 0x002E, + CAST_2_WEST = 0x002F, + STAND_EAST = 0x0030, + WALK_1_EAST = 0x0031, + WALK_2_EAST = 0x0032, + USE_EAST = 0x0033, + SWING_1_EAST = 0x0034, + SWING_2_EAST = 0x0035, + SWING_3_EAST = 0x0036, + SWING_2H_1_EAST = 0x0037, + SWING_2H_2_EAST = 0x0038, + SWING_2H_3_EAST = 0x0039, + SIT_EAST = 0x003A, + LEAN_EAST = 0x003B, + KNEEL_EAST = 0x003C, + LIE_EAST = 0x003D, + CAST_1_EAST = 0x003E, + CAST_2_EAST = 0x003F +}; + +// Enum: damage_types +// Constants for the various types of damage in the game. +// +// NORMAL_DAMAGE = 0 - Normal damage. +// FIRE_DAMAGE = 1 - Damage from heat sources. +// MAGIC_DAMAGE = 2 - Damage from a magical source. +// LIGHTNING_DAMAGE = 3 - Damage from electrical sources such as lightning. +// ETHEREAL_DAMAGE = 4 - Special magical damage, basically magic damage not +// blocked by normal magic resistance. +// SONIC_DAMAGE = 5 - Sound-based damage. +enum damage_types +{ + NORMAL_DAMAGE = 0, + FIRE_DAMAGE = 1, + MAGIC_DAMAGE = 2, + LIGHTNING_DAMAGE = 3, + ETHEREAL_DAMAGE = 4, + SONIC_DAMAGE = 5 +}; diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/services.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/services.uc new file mode 100755 index 0000000..f45fc8e --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/services.uc @@ -0,0 +1,565 @@ +/* + * + * Copyright (C) 2006 The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This source file contains functions used in general services (selling of + * items, spells and healing). + * + * Author: Marzo Junior + * Last Modified: 2006-02-27 + */ + + +enum selling_result +{ + NO_QUANTITY = 0, + SELL_SUCCEEDED = 1, + CANNOT_CARRY = 2, + NOT_ENOUGH_GOLD = 3 +}; + +enum healing_type +{ + USE_HERBS = 1, + USE_BANDAGES = 2, + USE_POTIONS = 3, + USE_MAGIC = 4 +}; + +enum healing_prices +{ + SERVICE_NONE = 0, + SERVICE_CURE = 1, + SERVICE_HEAL = 2, + SERVICE_RESURRECT = 3 +}; + + +enum npc_wizard_flags +{ + //New spell effects: + CONFUSION = 40, //Under the effects of Consufion spell + DEATH_PROTECTION = 41, //Protected from death spells + MAGIC_PROTECTION = 42, //Protected from spells -- e.g., LB's crown + //Spellcasting power: + ARCHWIZARD = 45, //Cheat mode + MAGE_CLASS = 46, //Full spellcasting capabilities + BARD_CLASS = 47, //1/2 level spellcasting + WARMAGE = 48, //Combat spells cost half as much mana (round up) + SUMMONER = 49, //Summoning spells cost half as much mana (round up) + HEALER = 50, //Casts healing as if level 8, no death spells + NECROMANCER = 51, //Casts death as if level 8, no healing spells + //The next constants are used to control spellcaster AI; the AI is NOT + //IMPLEMENTED YET. + AI_CAST_DONT_CAST = 52, //AI will not cast any spells + AI_CAST_VERY_FEW = 53, //AI will cast every 32-36 ticks + AI_CAST_FEW = 54, //AI will cast every 24-28 ticks + //AI_CAST_DEFAULT //AI will cast every 16-20 ticks + AI_CAST_MANY = 55, //AI will cast every 8-12 ticks + AI_HEALING = 56, //AI will try to cast healing spells first + AI_SUPPORT = 57, //AI will try to cast support spells first + AI_OFFENSE = 58, //AI will try to cast damaging combat first + AI_SUMMON = 59, //AI will try to summon creatures first + AI_ENCHANT = 60, //AI will try to cast non-damage combat spells + AI_DEATH = 61, //AI will try to cast death spells first + AI_MISDIRECTION = 62, //AI will try to use invisibility+blink+mass confusion very early and often + AI_TEMPORARY = 63 //AI will stop casting when it runs out of targets +}; + +var giveItemsToParty (var quantity, var shapenum, var quality, var framenum, var flag, var unknown) +{ + var startcount = PARTY->count_objects(shapenum, quality, framenum); + var itemconts = UI_add_party_items(quantity, shapenum, quality, framenum, flag); + + if (UI_get_array_size(itemconts) == 1) + return [0, 0]; + + else + { + var finalcount = PARTY->count_objects(shapenum, quality, framenum); + var delta = finalcount - startcount; + + var companions = removeFromArrayByIndex(itemconts, 1); + + if (companions) + { + if (quantity == 1) + say("@Thou art so encumbered! Perhaps one of thy friends might be willing to carry this?@"); + else + say("@Thou art so encumbered! Let me give some of this to thy friends.@"); + + var msgs = ["@I'll help carry it.@", "@I will carry that.@", "@I will carry some.@", "@Let me help with that.@"]; + + for (npc in companions) + interjectIfPossible(UI_get_npc_number(npc), msgs[UI_get_random(UI_get_array_size(msgs))]); + } + + if (delta > 0) + { + if (quantity == 1) + say("@Since thou art so encumbered, I shall set this upon the ground.@"); + else if (delta == 1) + say("@Since not one of you can hold another, I shall place this last remaining one upon the ground.@"); + else + say("@Since thou art so encumbered, I shall place the remaining ", + delta, " of these upon the ground.@"); + + var pos = AVATAR->get_object_position(); + var groundobjs = shapenum->create_new_object(); + groundobjs->set_item_frame(framenum); + groundobjs->set_item_quality(quality); + if (delta > 1) + { + if (groundobjs->set_item_quantity(delta) == 0) + { + UI_update_last_created(pos); + while (delta > 1) + { + groundobjs = shapenum->create_new_object(); + groundobjs->set_item_frame(framenum); + groundobjs->set_item_quality(quality); + UI_update_last_created(pos); + delta = delta - 1; + } + } + else + UI_update_last_created(pos); + } + else + UI_update_last_created(AVATAR->get_object_position()); + } + return itemconts; + } +} + +var sellAmountToPartyExt (var shapenum, var framenum, var base_quant, var price, var max_quant, var min_quant, var money_shape) +{ + var amount; + var finalquant; + + //Default to standard gold coins + if (!money_shape) + money_shape = SHAPE_GOLD; + + var partygold = PARTY->count_objects(money_shape, QUALITY_ANY, FRAME_ANY); + + if (max_quant == 0) + amount = 1; + else + amount = UI_input_numeric_value(min_quant, max_quant, 1, 1); + + if (price > 1) + finalquant = price * amount; + else + finalquant = amount; + + if (amount == 0) + return NO_QUANTITY; + else + { + if (partygold >= (base_quant * amount)) + { + UI_remove_party_items((base_quant * amount), money_shape, QUALITY_ANY, SHAPE_ANY, true); + giveItemsToParty(finalquant, shapenum, QUALITY_ANY, framenum, false, true); + return SELL_SUCCEEDED; + } + else + return NOT_ENOUGH_GOLD; + } +} + +var promptForPayment (var price, var dialog) +{ + if (price > 0) + { + say(dialog[2], price, dialog[3]); + if (askYesNo()) + { + if (!hasGold(price)) + { + say(dialog[4]); + return false; + } + } + else + { + say(dialog[5]); + return false; + } + } + return true; +} + +static var service_healing_targets; +static var service_healing_spell; + + + +var getServiceHealingDialog (var npcnum) +{ + switch (npcnum) + { + case TIBERIUS: + return ["@Which of my services dost thou have need of?@", //ask gold + "@I see thy injury. Wilt thou make an offering of 30 gold?@", // + "@If thou wilt not pay, I cannot heal thee.@", //wont pay + "@Which of you needs to be ", "?@", //who healed? + "@But all of you are well@!", + "@But all of you are well@", //no one poisoned + "@But thou art well!@", //person not injured + "@Art thou sure? Some of thy friends still need to be healed.@", + "@Art thou sure? Some of thy friends still appear to be poisoned.@", + "@I see that thou dost carry another slain friend.@", //still need resu + "@Is there aught else I can do for thee?@"]; //don't need anything + case TARA: + return ["@Which of my services dost thou have need of?@", + "@I see thy injury. Wilt thou make an offering of 30 gold?@", + "@If thou wilt not pay, I cannot heal thee.@", + "@Then thou must look elsewhere for that service.@", + "@Who dost thou wish to be ", "?@", + "@It pleases me that none of you are wounded.@", + "@I am pleased that none of you are poisoned.@", + "@I do not see anyone who needs resurrecting. I must be able to see the body to resurrect. If thou art carrying thy friend, pray lay them on the ground so that I may attend to them.@", + "@Art thou sure? Some of thy friends still need to be healed.@", + "@Art thou sure? Some of thy friends still appear to be poisoned.@", + "@Art thou sure? Some of thy friends still appear to require mine aid.@", + "@Is there aught else I can do for thee?@"]; + case DEZANA: + return ["@I can heal, cure, and even resurrect.@", + "@My price is ", " gold. Dost thou agree?@", + "@Thou dost not have that much gold! Mayhaps thou couldst return with more and purchase the service then.@", + "@Then thou must look elsewhere for that service.@", + "@Whom dost thou wish to have ", "?@", + "@Well, I do not see anyone wounded here.@ He laughs.", + "@Well, no one here is poisoned, it seems.@ He laughs.", + "@Well, I do not seem to see anyone who needs mine assistance. Unless thou art carrying someone in thy packs....@ He laughs.", + "@Art thou sure? Some of thy friends still need to be healed.@", + "@Art thou sure? Some of thy friends still appear to be poisoned.@", + "@Art thou sure? Some of thy friends still appear to require mine aid.@", + "@Though I want thy business, I am pleased to see my services are not needed!@"]; + case LEIGH: + return ["@Which of my services dost thou have need of?@", + "@My price is ", " gold. Art thou interested?@", + "@Thou dost not have enough gold! Mayhaps thou couldst return when thou hast more.@", + "@Then thou must go elsewhere.@", + "@Who dost thou wish to have ", "?@", + "@None of you seem to be wounded.@~~She appears pleased.", + "@None of you seem to be poisoned.@~~She appears pleased.", + "@There seems to be no one who needs such assistance. Perhaps, if I have overlooked anyone, thou couldst set him or her before me.@", + "@Art thou sure? Some of thy friends still need to be healed.@", + "@Art thou sure? Some of thy friends still appear to be poisoned.@", + "@Art thou sure? Some of thy friends still appear to require mine aid.@", + "@Excellent, thou art uninjured!@"]; + case INMANILEM: + return ["@To need which of my services?@", + "@To charge ", " gold. To still want my services?@", + "@To have not that much gold! To perhaps return with more and purchase the service then.@", + "@To be sorry. To look elsewhere for that service then.@", + "@To want to ", " whom?@", + "@To not see anyone in need of healing.@", + "@To not see anyone poisoned.@", + "@To not see anyone who is in need of resurrection. To have to see the body to save the spirit. To lay your companion on the ground so that I may return them to this world.@", + "@To ask if thou art sure. To see that some of thy friends still need to be healed.@", + "@To ask if thou art sure. To see that some of thy friends still appear to be poisoned.@", + "@To ask if thou art sure. To see that some of thy friends still appear to require mine aid.@", + "@To have no need for my healing.@"]; + case CHANTU: + return ["@Which of my services dost thou need?@", + "@My price is ", " gold. Is this satisfactory?@", + "@Thou dost not have any gold. I am truly sorry. I cannot help thee until thou canst provide the proper fee.@", + "@Then I am truly sorry. I must charge what I must charge. We do not live in prosperous times.@", + "@Who dost thou wish to be ", "?@", + "@I apologize, " + getPoliteTitle() + ", but I do not see anyone who is in need of healing.@", + "@I apologize, " + getPoliteTitle() + ", but I do not see anyone who needs to be cured of poison.@", + "@I apologize, " + getPoliteTitle() + ", but I do not see anyone who is in need of resurrection. I must be able to see the body to save the spirit. If thou art carrying thy misfortunate friend, pray lay them on the ground so that I may return them to this world.@", + "@Some of thy friends still need to be healed; I will be here shouldst thou reconsider.@", + "@Some of thy friends still appear to be poisoned; I will be here shouldst thou reconsider.@", + "@Some of thy friends still appear to require mine aid; I will be here shouldst thou reconsider.@", + "@So thou art healthy? 'Tis good news. If thou dost need my services in the future, do not hesitate to return.@"]; + case JAANA: + return ["@Which of my services dost thou have need of?@", + "@My price is ", " gold. Is this price agreeable?@", + "@Thou dost not have that much gold! Mayhaps thou couldst return with more and purchase the service then.@", + "@Then thou must look elsewhere for that service.@", + "@Who dost thou wish to be ", "?@", + "@I do not see anyone who is in need of healing.@", + "@I do not see anyone who needs to be cured of poison.@", + "@I do believe I am going blind. I do not see anyone who is in need of resurrection. Art thou fooling me again, or art thou hiding the injured one? I must be able to see the person to help them. If thou art carrying thy friend in thy pack, pray lay them on the ground so that I may perform my duties as thou hast requested.@", + "@Art thou sure? I believe that some of thy friends still need to be healed.@", + "@Art thou sure? I believe that some of thy friends still appear to be poisoned.@", + "@Art thou sure? I believe that some of thy friends still appear to require mine aid.@", + "@Avatar! Thou dost tell me to prepare to heal and then thou dost tell me 'Nobody'! Is this thine idea of a joke? Healing is a serious business!@"]; + case LAURIANNA: + return ["@Which mode of healing dost thou wish?@", + "", "", + "", + "", + "@Who dost thou wish to be ", "?@", + "@None of you seem to be wounded.@~~She appears pleased.", + "@None of you seem to be poisoned.@~~She appears pleased.", + "@I am sorry, but thou hast not presented anyone to me who requires mine assistance. If there is someone who truly needs my skills, I must have a closer look.@", + "@Art thou sure? Some of thy friends still need to be healed.@", + "@Art thou sure? Some of thy friends still appear to be poisoned.@", + "@Art thou sure? Some of thy friends still appear to require mine aid.@", + "@I am glad that thou art not in need of healing!@"]; + case LORD_BRITISH: + return ["@Of which service dost thou have need?@", + "", "", + "", + "", + "@Who dost thou wish to be ", "?@", + "@I do apologize, " + getAvatarName() + ", but I do not see anyone who must be healed.@", + "@I do apologize, " + getAvatarName() + ", but I do not see anyone who must be cured of poison.@", + "@I do apologize, " + getAvatarName() + ", but I do not see anyone who must be resurrected. I must be able to see the body. If thou art carrying thine unlucky companion, please lay them on the ground.@", + "@Art thou sure? I can see that some of thy friends still need to be healed.@", + "@Art thou sure? I can see that some of thy friends still appear to be poisoned.@", + "@Art thou sure? I can see that some of thy friends still appear to require mine aid.@", + "@'Tis good to hear that thou art well. Do not hesitate to come and see me if thou dost need healing of any kind.@"]; + } +} + +var getServiceHealingPricelist (var npcnum) +{ + switch (npcnum) + { + case REYNA: + return [10, 30, 400]; + case JAANA: + if ((npcnum->get_npc_object() in UI_get_party_list()) || + (npcnum->get_schedule_type() == WAIT)) + return 0; + else + return [15, 30, 400]; + case LAURIANNA: + case LORD_BRITISH: + return 0; + case TARA: + return [10, 30, 400]; + case ELAD: + return [10, 25, 425]; + case LEIGH: + return [8, 25, 385]; + case INMANILEM: + return [10, 25, 430]; + case CHANTU: + return [15, 30, 400]; + } +} + +void serviceHeal () +{ + UI_push_answers(); + + var npcnum = get_npc_number(); + // Ensure proper initialization: + //var npcind = spellitemGetNPCIndex(npcnum); + var dialog = getServiceHealingDialog(npcnum); + var price_list = getServiceHealingPricelist(npcnum); + var magicheal = (!get_item_flag(NECROMANCER) && (get_item_flag(MAGE_CLASS) || get_item_flag(BARD_CLASS))); + + var choices = ["none"]; + var healing_spells = []; + + if (magicheal) + { + // healing_spells = getLeveledSpellList(item, + // get_item_flag(HEALER), + // ["Cure", "Mass cure", "Heal", "Great heal", "Restoration", "Resurrect", "Mass resurrect"], + // [1, 2, 3, 5, 7, 8, 8], + // global_spells_unknown[npcind]); + // if (("Cure" in healing_spells) || ("Mass cure" in healing_spells)) + // choices << "curing"; + /// if (("Heal" in healing_spells) || ("Great heal" in healing_spells) || ("Restoration" in healing_spells)) + // choices << "healing"; + // if (("Resurrect" in healing_spells) || ("Mass resurrect" in healing_spells)) + // choices << "resurrection"; + } + else + choices << ["curing", "healing"]; + + say(dialog[1]); + var reply = chooseFromMenu2([choices]) - 1; + if (reply) + { + var targets = []; + var bodynpcs = []; + if (reply == SERVICE_HEAL) + targets = filterListByRelHits(UI_get_party_list(), 4); + else if (reply == SERVICE_CURE) + targets = filterListByFlag(UI_get_party_list(), POISONED, true); + else if (reply == SERVICE_RESURRECT) + { + var bodyshapes = [SHAPE_BODIES_1, SHAPE_BODIES_2, SHAPE_LARGE_BODIES, SHAPE_NEW_BODIES]; + var bodies = []; + for (shnum in bodyshapes) + bodies = [bodies, find_nearby(shnum, 25, MASK_NONE)]; + + for (body in bodies) + if (body->get_body_npc()) + { + targets << body; + bodynpcs << body->get_body_npc(); + } + } + + var numtargets = UI_get_array_size(targets); + if (numtargets == 0) + { + if (reply == SERVICE_HEAL) + say(dialog[8]); + else if (reply == SERVICE_CURE) + say(dialog[9]); + else if (reply == SERVICE_RESURRECT) + say(dialog[10]); + } + else + { + numtargets = UI_get_array_size(targets); + var namelist; + if (reply == SERVICE_RESURRECT) + namelist = bodynpcs->get_npc_name(); + else + namelist = targets->get_npc_name(); + var choice = 1; + var heal_everyone = true; + if (numtargets > 1 && price_list) + { + if (reply == SERVICE_HEAL) + say(dialog[6], "healed", dialog[7]); + else if (reply == SERVICE_CURE) + say(dialog[6], "cured of poison", dialog[7]); + else if (reply == SERVICE_RESURRECT) + say(dialog[6], "resurrected", dialog[7]); + choice = chooseFromMenu2(["Nobody", "Everyone", namelist]) - 1; + heal_everyone = (choice == 1); + if (choice > 1) + choice = choice - 1; + } + else if (price_list) + heal_everyone = false; + + if (!choice) + { + targets = 0; + if (reply == SERVICE_HEAL) + say(dialog[11]); + else if (reply == SERVICE_CURE) + say(dialog[12]); + else if (reply == SERVICE_RESURRECT) + say(dialog[13]); + } + else if (price_list) + { + var price = price_list[reply]; + if (heal_everyone && price) + { + if (magicheal) + if (((reply == SERVICE_HEAL) && ("Restoration" in healing_spells)) || + ((reply == SERVICE_CURE) && ("Mass cure" in healing_spells)) || + ((reply == SERVICE_RESURRECT) && ("Mass resurrect" in healing_spells))) + price = (price * 5)/2; + else + price = price * numtargets; + else + price = price * numtargets; + } + else + { + targets = [targets[choice]]; + numtargets = 1; + } + if (!promptForPayment(price, dialog)) + targets = 0; + } + + if (targets) + { + if (magicheal) + { + var spell = 0; + //Try magic healing first + if (reply == SERVICE_HEAL) + { + if (numtargets > 1 && ("Restoration" in healing_spells)) + service_healing_spell = "Restoration"; + else if ("Great heal" in healing_spells) + service_healing_spell = "Great heal"; + } + else if (reply == SERVICE_CURE) + { + if (numtargets > 1 && ("Mass cure" in healing_spells)) + service_healing_spell = "Mass cure"; + else if ("Cure" in healing_spells) + service_healing_spell = "Cure"; + } + else if (reply == SERVICE_RESURRECT) + { + if (numtargets > 1 && ("Mass resurrect" in healing_spells)) + //Should only happen for LB and Laurianna + service_healing_spell = "Mass resurrect"; + else if ("Resurrect" in healing_spells) + service_healing_spell = "Resurrect"; + } + if (service_healing_spell) + { + //service_healing_targets = targets; + //script item call serviceMultipleSpellHealing, SCRIPTED; + //abort; + } + } + //Normal healing. Magical healers fallback to it if they + //don't know enough spells. + if (reply == SERVICE_HEAL) + { + var verbs = [" dresses ", " tends to "]; + var msgs = ["'s wounds with bandages soaked in an infusion of Ginseng. The wounds heal quickly afterwards.@", + "'s wounds and feeds the patient a yellow potion, which immediately closes the wounds.@", + "'s wounds by applying a herbal unguent upon them. Not long afterwards, the wounds are fully healed.@"]; + while (numtargets) + { + var currtarget = targets[numtargets]; + say("@"+ get_npc_name() + verbs[UI_get_random(UI_get_array_size(verbs))] + currtarget->get_npc_name() + msgs[UI_get_random(UI_get_array_size(msgs))]); + var str = currtarget->get_npc_prop(STRENGTH); + var hps = currtarget->get_npc_prop(HEALTH); + currtarget->set_npc_prop(HEALTH, str - hps); + numtargets = numtargets - 1; + } + } + else if (reply == SERVICE_CURE) + { + var verbs = [" feeds ", " gives "]; + var msgs = [" an infusion of Ginseng, which nullifies the potion after a while@", + " a red potion, which cancels the poison almost immeditatelly.@", + " a herbal antidote. After a while, the poison is gone.@"]; + while (numtargets) + { + var currtarget = targets[numtargets]; + say("@"+ get_npc_name() + verbs[UI_get_random(UI_get_array_size(verbs))] + currtarget->get_npc_name() + msgs[UI_get_random(UI_get_array_size(msgs))]); + currtarget->clear_item_flag(POISONED); + numtargets = numtargets - 1; + } + } + else if (reply == SERVICE_RESURRECT) + say("@This message should never appear. Warn the programmer: there is a bug with resurrection and normal healing.@"); + } + } + } + else + say(dialog[14]); + UI_pop_answers(); +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/shapes.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/shapes.uc new file mode 100755 index 0000000..fbaabe8 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/shapes.uc @@ -0,0 +1,542 @@ +const int AVATAR_BAL = 0; + +const int BRAWL_TIMER = 16; //sets Brawl timer if it's triggered outside of normal times (saying "rat" and so on). After 1 hour, will subside. + +const int SPELL_POOF = 9; + +const int SHAPE_LARGE_BODIES = 778; //0x30A +const int FRAME_DRAGON_BODY = 7; //0x007 +const int SHAPE_BODIES_1 = 400; //0x190 +const int FRAME_MONK_BODY_1 = 5; //0x005 +const int SHAPE_BODIES_2 = 414; //0x19E +const int FRAME_LBBODY2 = 13; //0x00D +const int SHAPE_BODIES_3 = 762; //0x19E +const int FRAME_MAGEBODY = 22; //0x00D +const int SHAPE_BODIES_4 = 892; //0x19E +const int SHAPE_BODIES_5 = 778; //0x19E + +const int SHAPE_CHAOS_SWORD = 637; //from Drugeworth quest +const int SHAPE_MYSTIC_ARMOUR = 1259; //solving QUenton quest + +const int SHAPE_BEDROLL = 583; + + +const int SHAPE_STORM_CLOAK = 1247; +const int SHAPE_GUILD_BELT = 1138; +const int SHAPE_MAGIC_SCROLL = 1147; + +//quest item shapes +const int SHAPE_VORTEX_CUBE = 1255; +//const int SHAPE_HUMAN_LENS = +const int SHAPE_CODEX = 1102; +const int SHAPE_RED_MOONGATE = 779; + + +const int SHAPE_HIGHWAYMAN = 485; + +const int SHAPE_BELL = 1136; + +const int SHAPE_FISHING_ROD = 662; // +const int SHAPE_FISH = 509; + + +const int SHAPE_GARGOYLE_WARRIOR = 274; +const int SHAPE_WINGLESS_GARGOYLE = 883; + +const int SHAPE_NEW_BODIES = 1140; + +const int SHAPE_PACKED_BALLOON = 1232; + + +const int SHAPE_GOLD = 644; +const int SHAPE_GOLD_NUGGET = 645; + +const int SHAPE_BOTTLE = 616; + +const int SHAPE_REAGENT = 842; + +////REAGENT FRAMES////// +const int FRAME_BLACK_PEARL = 0; +const int FRAME_BLOOD_MOSS = 1; +const int FRAME_NIGHTSHADE = 2; +const int FRAME_MANDRAKE_ROOT = 3; +const int FRAME_GARLIC = 4; +const int FRAME_GINSENG = 5; +const int FRAME_SPIDER_SILK = 6; +const int FRAME_SULFUR_ASH = 7; +//////////// + + +const int SHAPE_SHOVEL = 625; +const int SHAPE_FOOD = 377; +const int SHAPE_HONEY = 772; +const int SHAPE_SCROLL = 797; +const int SHAPE_KEY = 641; +const int SHAPE_SPELLBOOK = 761; +const int SHAPE_YEW_LOG = 1168; +const int SHAPE_THREAD = 654; +const int SHAPE_RUNE = 877; +const int SHAPE_CLOTH = 851; +const int SHAPE_TORCH = 595; +const int SHAPE_OIL = 782; +const int SHAPE_GEMS = 760; +const int SHAPE_GEM = 760;//same as above +const int SHAPE_POWDER_KEG = 704; +const int SHAPE_BACKPACK = 801; +const int SHAPE_BAG = 802; +const int SHAPE_CHEST = 800; +const int SHAPE_VIRTUE_STONE = 330; + +const int SHAPE_GOLDNUGGET = 645; +const int SHAPE_GOLDBAR = 646; +const int SHAPE_GOLD_BAR = 646; +const int SHAPE_GRAIN = 677; +const int SHAPE_DUCK = 1135; +const int SHAPE_BOOKOFPROPHESIES = 1137; +const int SHAPE_FORCEFIELD = 1152; +const int SHAPE_EGG = 275; +const int SHAPE_BODY2 = 275; +const int SHAPE_BOOK = 642; +const int SHAPE_MOONSTONE = 1139; +const int SHAPE_ORB_OF_MOONS = 785; +const int SHAPE_LEVER = 787; +const int SHAPE_RED_MOONGATE_WANE = 779; +const int SHAPE_HORSESHOES = 998; +const int SHAPE_DRAGONS_EGG = 1106; +const int SHAPE_TOP = 249; +const int SHAPE_CAMPFIRE = 825; +const int SHAPE_FRYINGPAN = 944; + +const int SHAPE_LIT_LAMP = 1162; +const int SHAPE_LAMP = 1161; +const int SHAPE_PANPIPES = 1165; +const int SHAPE_TREASURE_MAP = 1144; +const int SHAPE_POCKETWATCH = 159; +const int SHAPE_YEW_BOARD = 1169; +const int SHAPE_CUP = 628; +const int SHAPE_KITCHEN_ITEMS = 863; + const int FRAME_FLOUR = 14; + const int FRAME_UNOPENED_SACK = 13; + +const int SHAPE_POTION = 340; + +const int SHAPE_BASKET = 803; +const int SHAPE_BUCKET = 810; +const int FRAME_MILK_BUCKET = 7; + + +const int SHAPE_BALLOON_BASKET = 1200; +const int SHAPE_CAULDRON = 995; +const int SHAPE_BALLOON_BAG = 1220; +const int SHAPE_ROPE = 1134; + +//RAW MEAT SHAPES FOR COOKING + +const int SHAPE_RAW_BEEF = 1203; +const int SHAPE_RAW_CHICKEN = 1204; +const int SHAPE_RAW_HORSEMEAT = 1205; +const int SHAPE_RAW_RIBS = 1206; +const int SHAPE_RAW_VENISON = 1207; +const int SHAPE_RAW_MUTTON = 1208; +const int SHAPE_RAW_RABBIT = 1209; +const int SHAPE_RAW_PORK = 1210; + +const int SHAPE_KINDLING = 1211; + +const int SHAPE_BEEHIVE = 1185; + +const int SHAPE_PANTS = 738; + +const int QUALITY_BALLOON_PLANS = 59; +const int SHAPE_BALLOON = 1201; +const int SHAPE_BURNER = 1231; + +const int SHAPE_NEW_BALLOON = 1233; + + +const int SHAPE_AMULET_SUBMISSION = 1234; + +const int FRAME_GLASS = 0; + +const int SHAPE_LOCKPICK = 627; +const int SHAPE_DESK_ITEM = 675; + const int FRAME_ABACUS = 11; + + + +const int SHAPE_KIDNEY_BELT = 584; +const int SHAPE_CLOAK = 285; +const int SHAPE_PEDESTAL = 577; +const int SHAPE_WOOL = 653; + const int FRAME_BALE = 0; +const int SHAPE_SEXTANT = 650; + +const int SHAPE_LENS = 726; + const int FRAME_HUMAN_LENS = 0; + const int FRAME_GARGISH_LENS = 1; + const int FRAME_BROKEN_LENS = 2; + +const int SHAPE_CRYSTAL_BALL = 729; + +const int SHAPE_SILVER_TABLET = 1142; + const int FRAME_MARIAH = 1; + const int FRAME_PIRATE = 0; + +const int SHAPE_MAGIC_LOCKED_CHEST = 1187; +const int SHAPE_UNLOCKED_CHEST = 800; +const int SHAPE_GRAVE = 1190; + +const int SHAPE_SILK_CLOTH = 1219; +const int SHAPE_GARGOYLE_JEWELRY = 937; + +const int SHAPE_URN = 1240; +const int FRAME_CHUCKLES = 1; + +//DESK ITEM FRAMES +const int FRAME_MIRROR = 16; + +enum door_shapes +{ + SHAPE_DOOR_HORIZONTAL = 270, + SHAPE_DOOR_VERTICAL = 376, + SHAPE_DOOR2_HORIZONTAL = 432, + SHAPE_DOOR2_VERTICAL = 433, + + SHAPE_ABBEY_DOOR_LEFT_HORIZONTAL = 246, + SHAPE_ABBEY_DOOR_RIGHT_HORIZONTAL = 225, + + SHAPE_ABBEY_DOOR_LEFT_VERTICAL = 250, + SHAPE_ABBEY_DOOR_RIGHT_VERICAL = 392 //Note: This is actually a copy of ABBEY_DOOR_LEFT_VERTICAL. Maybe they screwed up but never used them anyway. +}; + +const int SHAPE_SILK_THREAD = 1218; + + +const int SHAPE_PLANT = 999; + const int FRAME_DAFFODIL = 2; + +const int SHAPE_RAFT = 1241; + + +const int SHAPE_LOCKED_CHEST = 522; + +//TREASURE MAP FRAMES +const int FRAME_MAP1 = 0; +const int FRAME_MAP2 = 1; +const int FRAME_MAP3 = 2; +const int FRAME_MAP4 = 3; +const int FRAME_MAP5 = 4; +const int FRAME_MAP6 = 5; +const int FRAME_MAP7 = 6; +const int FRAME_MAP8 = 7; +const int FRAME_MAP9 = 8; + +//door shapes +const int H_BROWN_DOOR = 270; +const int V_BROWN_DOOR = 376; //frame one +/// +//top frames +const int FRAME_BROWN_DRESS = 1; +const int FRAME_SHIRT = 0; +const int FRAME_BLUE_DRESS = 0; + +//BODY SHAPES +const int SHAPE_BODY = 400; +const int STRANGE_BODY = 414; +const int MONSTER_BODY = 762; +const int MONSTERNPC_BODY = 892; +const int NEW_BODY = 1140; + +//WEAPON SHAPES +const int SHAPE_CLUB = 590; +const int SHAPE_DAGGER = 594; +const int SHAPE_SPEAR = 592; +const int SHAPE_THROWING_AXE = 593; +const int SHAPE_TWOHANDEDAXE = 601; +const int SHAPE_2H_AXE = 601; +const int SHAPE_TWOHANDEDHAMMER = 600; +const int SHAPE_2H_HAMMER = 600; +const int SHAPE_BOW = 597; +const int SHAPE_CROSSBOW = 598; +const int SHAPE_MAGIC_BOW = 606; +const int SHAPE_TRIPLE_CROSSBOW = 647; +const int SHAPE_SLING = 474; +const int SHAPE_SWORD = 599; +const int SHAPE_TWOHANDEDSWORD = 602; +const int SHAPE_BOOTS = 587; +const int SHAPE_MACE = 659; +const int SHAPE_MAIN_GAUCHE = 591; +const int SHAPE_MORNING_STAR = 596; +const int SHAPE_GLASS_SWORD = 604; +const int SHAPE_YEW_STAFF = 1163; +const int SHAPE_YEW_STAFF_LIGHTNING = 1164; +const int SHAPE_YEW_STAFF_FIREBOLT = 1260; +const int SHAPE_YEW_STAFF_DEATHBOLT = 1261; +const int SHAPE_YEW_STAFF_POISON = 1262; + +const int SHAPE_RUSTY_CUTLASS = 561; +const int SHAPE_MIRROR = 848; + +const int SHAPE_HAMMER = 623; +const int SHAPE_HALBERD = 603; +const int SHAPE_SPIKED_SHIELD = 578; +const int SHAPE_BOOMERANG = 605; + +const int SHAPE_JAR = 681; + const int FRAME_EMPTY = 0; + const int FRAME_HONEY_JAR = 8; +const int FRAME_TUNIC = 0; +const int FRAME_PANTS = 1; +const int FRAME_DRESS = 1; + +//RED MOONGATE SHAPES + +const int SHAPE_ORB_MOONGATE_HORIZONTAL = 779; +const int SHAPE_ORB_MOONGATE_NW_SE = 1114; +const int SHAPE_ORB_MOONGATE_NE_SW = 1113; +const int SHAPE_ORB = 785; +const int SHAPE_ORB_MOONGATE_VERTICAL = 157; +const int SHAPE_STANDING_RED_MOONGATE = 776; +const int SHAPE_STANDING_BLUE_MOONGATE = 776; + +//SOUND FX +const int SOUND_MOONGATE = 11; + +//AMMO SHAPES + +const int SHAPE_BOLT = 723; +const int SHAPE_ARROW = 722; +const int SHAPE_MAGIC_BOLTS = 417; +const int SHAPE_MAGIC_ARROWS = 556; + +//ARMOR SHAPES +const int SHAPE_CRESTED_HELM = 542; +const int SHAPE_LEATHER_ARMOR = 569; +const int SHAPE_LEATHER_HELM = 1004; +const int SHAPE_SCALE_MAIL = 570; +const int SHAPE_SCALE_ARMOR = 570; +const int SHAPE_SWAMP_BOOTS = 588; +const int SHAPE_CHAIN_ARMOR = 571; +const int SHAPE_PLATE_ARMOR = 573; +const int SHAPE_CHAIN_LEGGINGS = 575; +const int SHAPE_PLATE_HELM = 541; +const int SHAPE_PLATE_LEGGINGS = 576; +const int SHAPE_CURVED_HEATER = 545; +const int SHAPE_HEATER_SHIELD = 545; +const int SHAPE_WINGED_SHIELD = 1179; +const int SHAPE_KITE_SHIELD = 609; +const int SHAPE_GREAT_HELM = 541; +const int SHAPE_SPIKED_HELM = 541; //TODO: change once real spiked helm is there +const int SHAPE_WINGED_HELM = 1264; +const int SHAPE_RING_MAIL = 1237; // + +const int SHAPE_BUCKLER = 543; +const int SHAPE_LEATHER_LEGGINGS = 574; +const int SHAPE_MAGIC_HELM = 383; +const int SHAPE_MAGIC_ARMOR = 666; +const int SHAPE_MAGIC_LEGGINGS = 686; +const int SHAPE_MAGIC_GAUNTLETS = 835; +const int SHAPE_MAGIC_GORGET = 843; +const int FRAME_MAGIC_BOOTS = 1; +const int SHAPE_CHAIN_COIF = 539; +const int SHAPE_CLOTH_ARMOR = 1172; +const int SHAPE_CLOTH_LEGGINGS = 1173; +const int SHAPE_MAGIC_SHIELD = 663; +const int SHAPE_DOOR_SHIELD = 1178; +const int SHAPE_WOODEN_SHIELD = 572; +const int SHAPE_GARGOYLE_HELM = 1236; +const int SHAPE_ANTIQUE_ARMOR = 836; +const int SHAPE_PARALYZE = 408; + +const int SHAPE_GHOST = 337; + +//for baking.uc +const int SHAPE_DOUGH = 658; +const int SHAPE_HEARTH = 831; + +//Added to SHAPE_DOUGH +const int FRAME_DOUGH_PIE = 3; //flat dough + apples = pie dough (when baked in oven, this creates a pie) +const int FRAME_DOUGH_CAKE = 4; //flour + egg = cake dough (when baked in oven, this creates a cake) + + +const int SHAPE_LEATHER_COLLAR = 582; + +const int SHAPE_ARROWS = 722; +const int SHAPE_BOLTS = 723; + +const int SHAPE_FLAMING_OIL = 782; + +//FOOD FRAMES +const int FRAME_WAYBREAD = 0; +const int FRAME_BREAD = 1; +const int FRAME_ROLLS = 2; +const int FRAME_ROLL = 2; +const int FRAME_SAUSAGE = 7; +const int FRAME_GRAPES = 19; +const int FRAME_RIBS = 23; +const int FRAME_RATIONS = 15; +const int FRAME_MUTTON = 8; +const int FRAME_CAKE = 4; +const int FRAME_CHEESESLICE = 27; +const int FRAME_BRIE = 27; +const int FRAME_CHEESEWHOLE = 26; +const int FRAME_GREENCHEESE = 28; +const int FRAME_PASTRY = 6; +const int FRAME_EGG = 24; +const int FRAME_HAM = 11; +const int FRAME_TROUT = 12; +const int FRAME_FLOUNDER = 13; +const int FRAME_BEEF = 9; +const int FRAME_CHICKEN = 10; +const int FRAME_VENISON = 14; + +const int SHAPE_HORSEFLESH = 1252; + +const int SHAPE_RING_OF_INVISIBILITY = 296; + + +//RUNE FRAMES +const int FRAME_SACRIFICE = 0; +const int FRAME_JUSTICE = 1; +const int FRAME_HUMILITY = 2; +const int FRAME_SPIRITUALITY = 3; +const int FRAME_VALOR = 4; +const int FRAME_COMPASSION = 5; +const int FRAME_HONOR = 6; +const int FRAME_HONESTY = 7; + + +//BOTTLE FRAMES + +const int FRAME_SKARA_RED = 11; +const int FRAME_SKARA_WHITE = 4; +const int FRAME_SKARA_DRY = 10; +const int FRAME_RED = 12; +const int FRAME_MEAD = 0; +const int FRAME_WINE = 5; +const int FRAME_ALE = 3; +const int FRAME_MILK = 7; + +const int SHAPE_OPEN_GRAVE = 1188; + const int FRAME_EMPTY_GRAVE = 0; + const int FRAME_GREY_COFFIN = 1; + const int FRAME_BROWN_COFFIN = 2; + +const int FRAME_SCROLL = 3; + + + +//BOOKS +const int QUALITY_OZ = 6; + +//SCROLLS +const int QUALITY_RINALDOWARRANT = 54; +const int QUALITY_QUENTONLETTER = 52; +const int QUALITY_LEAFLET = 53; + + + + +const int SHAPE_EXPLOSION = 676; + + + +//SPELLS + + +//Linear +const int AWAKEN = 0; +const int WEATHER = 1; +const int DOUSE = 2; +const int FIREWORKS =3 ; +const int GLIMMER = 4; +const int HELP = 5; +const int IGNITE = 6; +const int THUNDER = 7; + +//First circle +const int CREATE_FOOD = 8; +const int CURE = 9; +const int DETECT_TRAP = 10; +const int GREAT_DOUSE = 11; +const int GREAT_IGNITE = 12; +const int LIGHT = 13; +const int LOCATE = 14; +const int AWAKEN_ALL = 15; + + +//Second circle + +const int DESTROY_TRAP = 16; +const int ENCHANT = 17; +const int FIRE_BLAST = 18; +const int GREAT_LIGHT = 19; +const int MASS_CURE = 20; +const int PROTECTION_SPELL = 21; +const int TELEKINESIS = 22; +const int WIZARD_EYE = 23; + +//Third Circle +const int CURSE = 24; +const int HEAL = 25; +const int SWARM = 26; +const int PROTECT_ALL = 27; +const int PARALYZE = 28; +const int PEER_SPELL = 29; +const int POISON = 30; +const int SLEEP_SPELL = 31; + +//Fourth Circle +const int CONJURE = 32; +const int LIGHTNING = 33; +const int MARK = 34; +const int MASS_CURSE = 35; +const int RECALL = 36; +const int REVEAL = 37; +const int SEANCE = 38; +const int UNLOCK_MAGIC = 39; + +//Fifth Circle +const int CHARM = 40; +const int DANCE_SPELL = 41; +const int DISPEL_FIELD = 42; +const int EXPLOSION = 43; +const int GREAT_HEAL = 44; +const int INVISIBILITY = 45; +const int FIRE_FIELD = 46; +const int MASS_SLEEP = 47; + +//Sixth Circle +const int CAUSE_FEAR = 48; +const int CLONE = 49; +const int FIRE_RING = 50; +const int FLAMESTRIKE = 51; +const int MAGIC_STORM = 52; +const int POISON_FIELD = 53; +const int SLEEP_FIELD = 54; +const int TREMOR = 55; + +//Seventh Circle +const int CREATE_GOLD = 56; +const int DEATH_BOLT = 57; +const int DELAYED_BLAST = 58; +const int ENERGY_FIELD = 59; +const int ENERGY_MIST = 60; +const int MASS_CHARM = 61; +const int MASS_MIGHT = 62; +const int RESTORATION = 63; + +//Eighth Circle +const int ARMAGEDDON = 64; +const int DEATH_VORTEX = 65; +const int MASS_DEATH = 66; +const int INVISIBLE_ALL = 67; +const int RESURRECT = 68; +const int SUMMON = 69; +const int SWORDSTRIKE = 70; +const int TIME_STOP = 71; + +const int SHAPE_HORSE = 727; + +const int QUALITY_LENORASLETTER = 52; + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/u6_npcs.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/u6_npcs.uc new file mode 100755 index 0000000..1372dbc --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/headers/u6_npcs.uc @@ -0,0 +1,366 @@ +enum britain_npcs +{ + ANYA = -37, + ARIANA = -24, //gives you the rune + ARTY = -40, + CULLEN = -52, + DAROS = -46, + DAVER = -31, + EFRAM = -38, + FINN = -62, + FYODOR = -29, + GWENNETH = -22, + KENNETH = -39, + KYTYN = -17, + LADY_NAN = -30, + LAZEENA = -28, + LINDA = -41, + LYNN = -33, + MATT = -23, + MAX = -26, + NEMA = -47, + PEYTON = -25, + RUFUS = -36, + TERRI = -32, + THOLDEN = -43, //gives you the mantra + TIBERIUS = -42, + WILBUR = -34 +}; + +enum castle_british_npcs +{ + CHUCKLES = -55, + GEOFFREY = -35, + LORD_BRITISH = -148, //gives key, heals + MALDRIC = -48, + NYSTUL = -139, + SHERRY = -6 //give her cheese, use her to get rune of Valor +}; + +enum yew_npcs +{ + ANDREA = -15, + BEN = -116, //get the log from him + BOSKIN = -21, + LENARD = -245, + LENORA = -18, //gives permission for the key + NICODEMUS = -102, + PRIDGARM = -19, + RINALDO = -50, + //ROWAN = -251, //pirate npc for Michael sidequest + //SINJEN = //sinjen is an item not an npc technically + UTOMO = -20 + + +}; + + +enum skara_npcs +{ + DEZANA = -143, + GIDEON = -140, + HORANCE = -141, + MARNEY = -75, + MARTA = -144, + MICHAEL = -76, + QUENTON = -146, + STIVIUS = -147, + TRENTON = -142, + YORL = -145 + +}; + +enum paws_npcs +{ + ARBETH = -120, + DORIN = -122, + DR_CAT = -127, + GRISON = -121, + HENDLE = -124, + MARISSA = -119, + MERIDETH = -123, + MORTUDE = -118, + PATRICK = -115, + THINDLE = -117, + TIMOTHY = -126, + UBERMON = -125 +}; + +enum party_npcs +{ +PARTY = -357, //Used by several intrinsics (e.g. UI_count_objects) that would otherwise take a single NPC + //Not supported by several other intrinsics that you'd really like it to (e.g. UI_get_cont_items) + AVATAR = -356, + BEHLEM = -191, + BLAINE = -27, + DUPRE = -4, + GORN = -138, + GWENNO = -87, + IOLO = -1, + JAANA = -5, + JULIA = -8, + KATRINA = -9, + LEODON = -221, + LEONNA = -223, + SEGGALLION = -232, + SENTRI = -7, + SHAMINO = -3 + +}; + +enum trinsic_npcs +{ + BRANDON = -83, + HAROLD = -85, + IMMANUELLE = -84, + SANDY = -80, + TOBATHA = -86, + WHITSABER = -81, + LAWRENCE = -82 +}; + +enum minoc_npcs +{ + AARON = -91, + DALE = -92, + DORIS = -96, + ISABELLA = -97, + JAMES = -93, + MICHELLE = -90, + SELGANOR = -88, + TARA = -89, + TREBOR = -94, + TROY = -95 + +}; + +enum new_magincia_npcs +{ + ANTONIO = -134, + AURENDIR = -135, + CHARLOTTE = -133, + CONOR = -136, + DUNBAR = -130, + WILLIAM = -137 + +}; + +enum serpents_hold_npcs +{ + AMANDA = -240, + CARADON = -239, + DE_HUGH = -237, + GHERICK = -242, + KORANADA = -235, + LADY_TESSA = -233, + LOUBET = -236, + MORCHELLA = -238, + SEGALLION = -232, + SHUBIN = -241, + SIR_SIMON = -234 + + +}; + +enum gargoyle_npcs +{ + BOLESH = -184, + CARETAKER = -192, + DRAXINUSOM = -180, + FARMER_KRILL = -187, + FARMER_NASH = -189, + FOODMAKER = -185, + GOODSCRAFTER = -186, + GARG_HEALER = -183, //to avoid HEALER already declared + LENSMAKER = -188, + NAXATILOR = -182, + SNAKECHARMER = -193, + VALKADESH = -197, + WEAPONSMITH = -190 + +}; + + + + + +enum cove_npcs +{ + AHRMAAND = -77, + ARTAGEL = -71, + ED = -72, + GERTAN = -78, + GILRON = -73, + RUDYOM = -74, + SASHA = -79 + +}; + +enum empath_abbey_npcs +{ + ECKHART = -114, + FAREN = -106, + GLEN = -14, //moved from -14 for testing purposes + MOLE = -13, //moved from -100 which was kind of buggy + SIONNACH = -11, + STEPHANIE = -108, + SYLAINA = -12, + ZEKE = -112 + +}; + +enum jhelom_npcs +{ + ARVIN = -58, + CULHAM = -63, + HEFTIMUS = -70, + JERRIS = -59, + LYSSANDRA = -65, + NOMAAN = -68, + PEER = -60, + STELNAR = -67, + VANKELLIAN = -66, + ZELIVAN = -69, + MARTIN = -61 +}; + +enum moonglow_npcs +{ + AGANAR = -156, + DARGOTH = -155, + DERYDLUS = -154, + EPHEMERIDES = -151, + MANREL = -157, + MARIAH = -153, + PENUMBRA = -150, + ROB = -152, + THARIAND = -158, + XIAO = -159 +}; + +enum bucs_den_npcs +{ + BUDO = -229, + CAPTAIN_ELAD = -226, + CAPTAIN_FOX = -224, + ENRIK = -230, + FENTRISSA = -228, + HOMER = -222, + JOHANN = -227, + PETROPH = -220, + SHAWN = -225 + + +}; + +enum misc_npcs //loners, wanderers, oddities +{ + ANDREAS = -54, + ARTUROS = -53, + BONN = -64, + CAPTAIN_JOHNE = -110, + SIN_VRAAL = -181, + DOUG = -253, + SMITH = -113, + KADOR = -98, + KARINA = -45, + MANDRAKE = -104, + GYPSYWOMAN = -100, + MAMA = -111, + MYLES = -109, + PAPA = -107, + TAYNITH = -56, + SHRINE = -247, //Used for shrine face. + //RENTHAR + ROWAN = -251, //pirate in Michael quest + SUTEK = -162, + + WANDA = -49, + YBARRA = -103, + ZOLTAN = -44, + HOLDERGUY = -250, //used to hold Avatar's inventory and stats for Sherry switch + THUG1 = -259, + THUG2 = -292, + THUG3 = -289, + THUG4 = -288, + THUG5 = -280, + THUG6 = -270, + THUG7 = -254, + GENERICSHRINE = -255, + PALACE_GUARD1 = -16, + BLORN = 208, //used for Sherry/Avatar switch to hold Avatar's defualt training points + PALACE_GUARD2 = -51, + CHANTU = -351, //no need for it really + ELAD = -350, //used for services.uc, no need for them + LEIGH = -349, //used for services.uc, no need for them + INMANILEM = -348, //used for services.uc, no need for them + LAURIANNA = 347, //used for services.uc, no need for them + REYNA = -346, //used for services.uc, no need for them + SPARK = -245, + TEST1 = -131, + TEST2 = -132, + + HYTH_GUARD1 = -219, //Gatekeeper to Hythloth, has key. Moved once avatar learns from Sin Vraal about Hythloth + HYTH_GUARD2 = -211, + HYTH_GUARD3 = -214, + PUSHMEPULLYU = -149, //two headed horse + RENTHAR = -101, //reformed assassin + + PARTYMEMBER6 = -300, + PHOENIX = -128, //Thief under Britain + + MORGOTH = -105, //Evil mage in Deciet + + FRANKTHEFOX = 165 //used for Glen's crematorium. has DO NOT RENDER flag in the shop so you have to be there for Glen to do the cremation + +}; + +enum intro_npcs +{ + GARGTHUG1 = -264, + GARGBYSTANDER1 = -299, + GARGBYSTANDER2 = -300, + GARGBYSTANDER3 = -301, + GARGBYSTANDER4 = -302, + GARGTHUG2 = -265, + GARGTHUG3 = -266, + GARGTHUG4 = -267, + GARGPRIEST = -263, + DEADGARG1 = -268, + GARGTHUG5 = -278, + GARGTHUG6 = -279, + DEADGARG2 = -269 +}; + +//Not used but used as utility +enum junk_npcs +{ + KARMA1 = -246, + SINGULARITY = -247, + MOONSTONES = -248, + KARMA4 = -249, + WRONG = -272, //clone_alagner + BLANKDUNGEON = -273, + BALLOON_DOG = -271, //used to determine if balloon is over the void too far - if out of bounds, warning level is set (Balloon dog's ID) + + //Used for Shrines: + NPC_SACRIFICE = -250, + NPC_JUSTICE = -251, + NPC_HUMILITY = -252, + NPC_SPIRITUALITY = -249, + NPC_VALOR = -248, + NPC_HONESTY = -254, + NPC_COMPASSION = -255, + NPC_HONOR = -253, + + CHAIN_BOLT = -132, //used for "shots" of chain bolt + + //NPC stand in for Drudgeworth + DRUDGEWORTH = -172 + + + +}; + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/AmuletOfSubmission.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/AmuletOfSubmission.uc new file mode 100755 index 0000000..3a63367 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/AmuletOfSubmission.uc @@ -0,0 +1,167 @@ +enum amulet_events +{ + EQUIP_AMULET = 1, + EVENT_TEST = 2 + +}; + + + +void reEquipAmSub (var amulet) +{ + UI_close_gumps2(); + + var shape = UI_get_item_shape(amulet); +// UI_error_message("Shape of amulet is: " + shape + ". reEquipAmSub called"); + UI_error_message("Shape of amulet is: " + amulet + ". reEquipAmSub called"); + + + UI_error_message("reEquipAmSub called"); + + //set removed amulet as last created + UI_set_last_created(amulet); + + + //if (!amulet_of_submission) + // UI_error_message("amulet not found, ERROR!"); + //else + // UI_error_message("Amulet found: " + amulet_of_submission + ""); + + //check if Avatar is wearing something already + //var is_wearing = UI_get_readied(AVATAR, BG_AMULET); + var is_wearing = AVATAR->is_readied(22, SHAPE_ANY, FRAME_ANY); + UI_error_message("Is wearing is: " + is_wearing); + if (UI_is_readied(AVATAR, BG_AMULET, SHAPE_ANY, FRAME_ANY)) + { + UI_error_message("Avatar is wearing something around the neck, transferring."); + //if so, move it to Holderguy + transferNeckItems(AVATAR, HOLDERGUY); + + //give amulet back to Avatar + UI_give_last_created(AVATAR); + + + } + else //nothing on Avatar's neck, force item back into his neck + { + UI_error_message("Nothing detected around Avatar's neck"); + UI_give_last_created(AVATAR); + } + + //Punish Avatar for trying to take it off! + UI_apply_damage(5, 5, FIRE_DAMAGE, AVATAR); + delayedBark(AVATAR, "Argh, it burns!", 2); + + //extra cleanup: find any duplicates on screen and removed + var stray_amulets = UI_find_nearby_avatar(SHAPE_AMULET_SUBMISSION); + if (stray_amulets > 0) + { + UI_error_message("stray amulets detected, removing them now"); + for (amulets in stray_amulets) + UI_remove_item(amulets); + + } + +} + + +void amuletOfSubmission shape#(1234)() +{ + const int SPRITE_PURPLE_CIRCLES = 21; + var amulet = UI_get_readied(AVATAR, BG_AMULET); + + + + + if (amulet) + UI_error_message("amuletOfSubmission recognizes an amulet"); + else + UI_error_message("ERROR - amuletOfSubmission does NOT recognize an amulet"); + if (event == READIED) + { + gflags[WEARING_AMULET_SUBMISSION] = true; + UI_error_message("AmSubmission READIED event called"); + if (amulet) + UI_error_message("amuletOfSubmission recognizes an amulet"); + else + UI_error_message("ERROR - amuletOfSubmission does NOT recognize an amulet"); + UI_obj_sprite_effect(AVATAR, SPRITE_PURPLE_CIRCLES, 0, 0, 0, 0, 0, -1); + + } + if (event == UNREADIED) + { + UI_error_message("AmSubmission UNREADIED event called"); + gflags[WEARING_AMULET_SUBMISSION] = false; + + //set removed amulet as last created + UI_set_last_created(item); + + item->close_gumps2(); + UI_close_gumps2(); + + //UI_flash_mouse(CURSOR_X); + + var amSub = UI_find_object(FIND_ON_SCREEN, SHAPE_AMULET_SUBMISSION, QUALITY_ANY, FRAME_ANY); + UI_obj_sprite_effect(AVATAR, SPRITE_PURPLE_CIRCLES, 0, 0, 0, 0, 0, -1); + UI_play_sound_effect(76); + + + //submitted to draxinusom, can't take it off now! + if (gflags[SUBMITTED_TO_DRAXINUSOM]) + { + if (amulet) + UI_error_message("amuletOfSubmission recognizes an amulet inside UNREADIED event"); + else + UI_error_message("amuletOfSubmission DOES NOT recognize an amulet inside UNREADIED event."); + + //set removed amulet as last created + UI_set_last_created(item); + // UI_give_last_created(AVATAR); + + reEquipAmSub(item); //from amsub + + } + + + script item + { + call amuletOfSubmission, EQUIP_AMULET; + + } + } + + //Force amulet back on Avatar's neck + if (event == EQUIP_AMULET) + { + UI_set_last_created(item); + + //should prevent Avatar from moving / teleporting away + UI_set_item_flag(AVATAR, BG_DONT_MOVE); + UI_error_message("Event EQUIP_AMULET called"); + // UI_close_gumps2(); + + if (UI_get_readied(AVATAR, BG_AMULET)) + { + + //transfer neck item Avatar is wearing to GROUND + transferNeckItems(AVATAR, HOLDERGUY); //This actually now places item on ground + + //add amulet of submission + UI_give_last_created(AVATAR); + + } + else + UI_give_last_created(AVATAR);//add amulet of submission + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + UI_obj_sprite_effect(AVATAR, SPRITE_PURPLE_CIRCLES, 0, 0, 0, 0, 0, -1); + + + + //Punish Avatar for trying to take it off! + UI_apply_damage(5, 5, FIRE_DAMAGE, AVATAR); + delayedBark(AVATAR, "Argh, it burns!", 2); + + + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/Ankh.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/Ankh.uc new file mode 100755 index 0000000..e9da430 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/Ankh.uc @@ -0,0 +1,564 @@ + +void Ankh shape#(955) () //used to test in game things like Karma and such +{ + //var target = UI_click_on_item(); + var party = UI_get_party_list(); + var frame = UI_get_item_frame(item); + //var flagnum = 800; + var flagnum = 1000; + var boat; + var barge; + var avatar_position = UI_get_object_position(AVATAR); + + var timer = UI_get_timer(BRAWL_TIMER); + + + var song = UI_get_music_track(); + + UI_error_message("Music track playing is " + song); + + + UI_error_message("Brawl timer is currently " + timer); + if (gflags[BRAWLING]) + UI_error_message("Brawling flag is set"); + else + UI_error_message("Brawling flag is NOT set"); + + + //var water = UI_is_water([1178, 1385, 0]); //UI_is_water([avatar_position]); + var water = UI_is_water(avatar_position); + UI_error_message("Avatar on water = " + water); + var av_X = avatar_position[X]; + var av_Y = avatar_position[Y]; + var av_Z = avatar_position[Z]; + + var map_num = UI_get_map_num(AVATAR); + UI_error_message("Avatar is on map " + map_num + ", at pos " + av_X + ", " + av_Y + ", " + av_Z); + +//if (UI_is_water([avatar_position[X], avatar_position[Y], 00])) + if (UI_is_water(avatar_position)) + //if (water) + UI_error_message("Avatar is on a water tile"); + else + UI_error_message("Avatar is NOT on a water tile"); + + UI_error_message("Game day is: " + UI_game_day()); + + const int TEST_TIMER = 10; + + if (gflags[TEST_TIMER] == true) + { + if (UI_get_timer(TEST_TIMER) > 1) + { + randomPartyBark("@Timer expired@"); + gflags[TEST_TIMER] = false; + } + + + } + + + const int SHAPE_BARGE = 961; + + //Flags we DON'T want to reset - + //global flag # 61 (learned password) so the portullius works + //global flag # 442 - quenton seance + //global flag # 749 Set when the Magic Storm spell is cast: + //const int MAGIC_STORM_SPELL = 0x02ED; + //global flag # 30 Used the armageddon spell - const int CAST_ARMAGEDDON = 0x1E; + + + + //var garg_npcs = [-180, -191, -182, -197]; //for gargoyles needing SI_ZOMBIE turned on, clearing flags will skip them and make sure they are "set" + var npcnum = 300; + //var companions = [-1, -2, -3, -4, -5]; + var npc; + var avatar_level = getExpLevel(AVATAR); //should get avatar level for testing + + var surf = [612, 613, 632, 699, 736, 737, 751, 806, 834, 875, 907, 911, 918]; + var bucs_den =[BUDO, CAPTAIN_ELAD, CAPTAIN_FOX, ENRIK, FENTRISSA, HOMER, JOHANN, PETROPH, SHAWN]; + var moonglow = [AGANAR, DARGOTH, DERYDLUS, EPHEMERIDES, MANREL, MARIAH, PENUMBRA, ROB, THARIAND, XIAO]; + var britain = [ANYA, ARIANA, ARTY, CULLEN, DAROS, DAVER, EFRAM, FINN, FYODOR, GWENNETH, KENNETH, KYTYN, LADY_NAN, LAZEENA, LINDA, MATT, MAX, NEMA, NYSTUL, PEYTON, RUFUS, TERRI, THOLDEN, TIBERIUS, WILBUR]; + var castle_british = [CHUCKLES, GEOFFREY, LORD_BRITISH, MALDRIC, NYSTUL, SHERRY]; + var yew = [ANDREA, BEN, BOSKIN, LENARD, LENORA, NICODEMUS, PRIDGARM, RINALDO, ROWAN, UTOMO]; + var skara_brae = [DEZANA, GIDEON, HORANCE, MARNEY, MARTA, MICHAEL, QUENTON, STIVIUS, TRENTON, YORL]; + var paws = [ARBETH, DORIN, DR_CAT, GRISON, HENDLE, MARISSA, MERIDETH, MORTUDE, PATRICK, THINDLE, TIMOTHY, UBERMON]; + var trinsic = [BRANDON, HAROLD, IMMANUELLE, SANDY, TOBATHA, WHITSABER, LAWRENCE]; + var minoc = [AARON, DALE, DORIS, ISABELLA, JAMES, MICHELLE, SELGANOR, TARA, TREBOR, TROY]; + var new_magincia = [ANTONIO, AURENDIR, CHARLOTTE, CONOR, DUNBAR, WILLIAM]; + var serpents_hold = [AMANDA, CARADON, DE_HUGH, GHERICK, KORANADA, LADY_TESSA, LOUBET, MORCHELLA, SEGALLION, SHUBIN, SIR_SIMON]; + var gargoyles = [BOLESH, CARETAKER, DRAXINUSOM, FARMER_KRILL, FARMER_NASH, FOODMAKER, GOODSCRAFTER, GARG_HEALER, LENSMAKER, NAXATILOR, SNAKECHARMER, VALKADESH, WEAPONSMITH]; + var cove = [AHRMAAND, ARTAGEL, ED, GERTAN, GILRON, RUDYOM, SASHA]; + var empath_abbey = [ECKHART, FAREN, GLEN, MOLE, SIONNACH, STEPHANIE, SYLAINA, ZEKE]; + var party_npcs = [BEHLEM, BLAINE, DUPRE, GORN, GWENNO, IOLO, JAANA, JULIA, KATRINA, LEODON, LEONNA, SEGGALLION, SENTRI, SHAMINO]; + var misc = [ANDREAS, ARTUROS, BONN, CAPTAIN_JOHNE, DOUG, KADOR, KARINA, TAYNITH, MAMA, MYLES, PAPA, ROWAN, SUTEK, WANDA, YBARRA, ZOLTAN, HOLDERGUY, SMITH]; + var jhelom = [ARVIN, CULHAM, HEFTIMUS, JERRIS, LYSSANDRA, MARTIN, NOMAAN, PEER, STELNAR, VANKELLIAN, ZELIVAN]; + + if (event == DOUBLECLICK) + { + var karma = getKarma(); + // randomPartyBark("The Avatar's karma is " + karma + ""); + UI_close_gumps(); + // UI_halt_scheduled(AVATAR); + var day = UI_game_day(); + var Mondays = [1, 8, 15, 22]; + + var test = day - ((day / 7) * 7); + + UI_play_music(255, 0); //to stop annoying combat music + UI_show_npc_face(291, 0); + + + if (frame == 0) + { + if (gflags[PLAY_ORIGINAL_TRACKS]) + { + item.say("@Random music track will currently play after conversations end. Turn it off?@"); + if(askYesNo()) + { + item.say("@Random music track will NOT play after conversations end.@"); + gflags[PLAY_ORIGINAL_TRACKS] = false; + } + } + else + { + + item.say("@Random music track after conversations end is currently off. Turn it on?@"); + if(askYesNo()) + { + item.say("@Random music track will play after conversations end.@"); + gflags[PLAY_ORIGINAL_TRACKS] = true; + } + + } + + + } + + + if ((frame == 7) || (gflags[DEBUG])) //glowy amulet frame from Isle of Fire OR flag 2047 is true + { + item.say("Welcome to the debugging menu."); + + // if (!UI_find_nearby_avatar(surf)) randomPartyBark("@TEST - We are in deep water or on land@"); //used for s + + + UI_show_npc_face(291, 0); + item.say("Welcome to the debugging menu."); + + var options = ["add reagents", "run endgame", "get day", "reset global flags", "halt all scripts", "start timer", "reset npc flags", "bye", "karma options", "start game"]; + var karmaoptions = ["nothing", "add karma", "subtract karma", "reset karma", "display karma", "add 5"]; + + //Start of regular conversation tree + converse(options) + { + case "reset global flags": + say("@Global flags reset@"); + //flagnum starts at 1000 so no crucial flags are tampered with + while (flagnum <= 2047) //change higher if needed. + { + gflags[flagnum] = false; + flagnum += 1; + } + + + case "create boat": + item->createShip(); + break; + + + + case "start timer": + UI_set_timer(TEST_TIMER); + gflags[TEST_TIMER] = true; + break; + + // case "get day": + + case "start game": + item->teleportToCastle(); + + case "run endgame": + UI_run_endgame(true); + + case "move raft": + barge = UI_find_nearby(AVATAR, SHAPE_BARGE, 30, MASK_EGG); + boat->get_item_shape(barge); + // UI_set_item_flag(AVATAR, BG_DONT_MOVE); + + script barge + { + call freezeAvatar; + repeat 5{ + step north; + wait 2; + step north; + wait 2; + step north; + wait 2; + }; + call centerOnAvatar; + call unfreezeAvatar; + } + break; + + case "transfer items": + say("@Items transfered to HolderGuy npc num 250.@"); + transferAllItems(AVATAR, HOLDERGUY); + + case "body": + var body2 = UI_get_cont_items(PARTY, 414, QUALITY_ANY, FRAME_ANY); + for (body in body2 with index to max) + { + var bodyshape = body->get_item_shape(); + var bodyframe = body->get_item_frame(); + UI_error_message("Body 2 shape found is, " + bodyshape); + UI_error_message("Body 2 frame found is, " + bodyframe); + + //if ((bodyframe != 24) && (bodyframe != 25)) + // bodies += 1; + //index += 1; + } + + + case "reset npc flags": + say("@NPC flags resetting.@"); + + for (npc in britain with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in castle_british with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in yew with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in paws with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in party_npcs with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in skara_brae with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in trinsic with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in minoc with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in new_magincia with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in serpents_hold with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + for (npc in gargoyles with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in cove with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in empath_abbey with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in misc with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + + for (npc in bucs_den with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in moonglow with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in skara_brae with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + for (npc in jhelom with index to max) + { + UI_clear_item_flag(npc, MET); + UI_clear_item_flag(npc, PETRA); + UI_clear_item_flag(npc, CONFUSED); + UI_clear_item_flag(npc, NAKED); + UI_clear_item_flag(npc, POLYMORPH); + UI_clear_item_flag(npc, TATTOOED); + UI_clear_item_flag(npc, READ); + UI_clear_item_flag(npc, NO_SPELL_CASTING); + UI_clear_item_flag(npc, SI_ZOMBIE); + } + + case "add reagents": + say("25 of each reagent added."); + var reagents = [FRAME_BLOOD_MOSS, FRAME_MANDRAKE_ROOT, FRAME_NIGHTSHADE, FRAME_GARLIC, FRAME_SPIDER_SILK, FRAME_SULFUR_ASH, FRAME_BLACK_PEARL, FRAME_GINSENG]; + var bag = UI_create_new_object(SHAPE_BAG); + var idx = -1; + + //give bag to Avatar + UI_give_last_created(AVATAR); + + //cycle through reagent array, give bag 25 of each + for (regs in reagents) + { + UI_error_message("regs is " + regs); + UI_add_cont_items(bag, 25, SHAPE_REAGENT, QUALITY_ANY, regs, false); + + } + + + + case "get current level": + say("@Avatar's level is " + avatar_level + "@"); + + case "codex wall": + { + codexWall(); + break; + + + } + + case "open codex": + { + openCodex(); + break; + + + } + + case "karma options": + { + converse(karmaoptions) + { + case "nothing": + break; + + case "add karma": + var addKarmaAmt = UI_input_numeric_value(0, 100, 1, 1); + addKarma(addKarmaAmt); + + + case "subtract karma": + var subtractKarmaAmt = UI_input_numeric_value(0, 100, 1, 1); + subtractKarma(subtractKarmaAmt); + + case "reset karma": + resetKarma(); + say("@Avatar karma is :@ " + getKarma()); + + case "add 5": + addKarma(5); + + case "display karma": + say("@Avatar karma is :@ " + getKarma()); + + + } + + + + } + + + case "halt all scripts": + { + if (UI_in_usecode(AVATAR)) + { + say("Avatar currently running a script."); + } + else + say("@Avatar currently not running a script.@"); + + UI_halt_scheduled(AVATAR); + + } + + + + case "delete nearby Eggs": + say("Eggs should be deleted."); + deleteEggs(); + + + case "bye": + say("@Goodbye.@"); + break; + } + + } + + } + + +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/CastleSchedules.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/CastleSchedules.uc new file mode 100755 index 0000000..d08b2ed --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/CastleSchedules.uc @@ -0,0 +1,60 @@ +void CastleSched () +{ + var hour = UI_game_hour(); + var minute = UI_game_minute(); + + if (event == EGG) + { + if (hour == 11) //11am + { + CHUCKLES->move_object([0x3d2, 0x452, 0x0]); + UI_set_schedule_type(CHUCKLES, EAT_AT_INN); + } + + if (hour == 12) //12pm + { + CHUCKLES->move_object([0x3a9, 0x426, 0x0]); + UI_set_schedule_type(CHUCKLES, MAJOR_SIT); + } + + if (hour == 13) //1pm + { + CHUCKLES->move_object([0x3a8, 0x430, 0x0]); + UI_set_schedule_type(CHUCKLES, DANCE); + } + + + + if (hour == 14) //2pm + { + LORD_BRITISH->move_object([0x3a9, 0x426, 0x0]); + UI_set_schedule_type(LORD_BRITISH, MAJOR_SIT); + + GEOFFREY->move_object([0x3a7, 0x466, 0x0]); + UI_set_schedule_type(GEOFFREY, LOITER); + + } + + if (hour == 16) //4pm + { + GEOFFREY->move_object([0x47e, 0x4f4, 0x0]); + UI_set_schedule_type(GEOFFREY, MAJOR_SIT); + + } + + + + if (hour == 19) //7pm + { + LORD_BRITISH->move_object([0x38d, 0x42f, 0x0]); + UI_set_schedule_type(LORD_BRITISH, MAJOR_SIT); + + SHERRY->move_object([0x38e, 0x430, 0x0]); + UI_set_schedule_type(SHERRY, STANDTHERE); + + } + + } + else + return; +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/ChaosSword.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/ChaosSword.uc new file mode 100755 index 0000000..c6ac231 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/ChaosSword.uc @@ -0,0 +1,226 @@ +//function to determine if someone in the party is charmed already +var isCharmed(var npc) +{ + if (UI_get_item_flag(npc, CHARMED)) + { + UI_error_message("npc is charmed"); + return true; + + } + else + { + UI_error_message("npc is NOT charmed"); + return false; + + } +} + + +//the event which is called from equipping the Chaos sword +void chaosSword object# () () +{ + var cont; + + enum chaos_levels + { + CHAOS_LOOP = 1, + CHAOS_POISON = 2, + CHAOS_BURN = 3 //Karma is too high > 20 + + + }; + + UI_error_message("chaosSword called"); + + //prevents from calling it too much + if (gflags[CHAOS_SWORD_EQUIPPED]) + { + UI_error_message("Chaos sword loop activated via readied event"); + script item after 10 ticks + { + call chaosSword, CHAOS_LOOP; + + }; + } + + if (event == CHAOS_LOOP) + { + //randomPartyBark("Chaos loop initiated"); + UI_error_message("Chaos sword event called"); + //Get sword container: + cont = get_container(); + + //Avatar's karma - can't be too high to wield the chaos sword. + var avatar_karma = getKarma(); + + var is_charmed = false; //boolean to detrmine if someone is charmed already + + var party = UI_get_party_list(); + var npc; + var rand = UI_get_random(5); + + //random chance wearer takes damage + + //karma is too high, sword will do damage and kill the wearer. NPCs in the party will share the Avatar's karma of course. + if (avatar_karma > 40 && rand == 3) + { + UI_error_message("Avatar karma is " + avatar_karma + ", take damage after 40!"); + if (cont->is_npc() && (item == cont->get_readied(BG_BOTH_HANDS) || item == cont->get_readied(BG_WEAPON_HAND))) //failsafe + { + + + + var current_health = UI_get_npc_prop(cont, HEALTH); + + if (avatar_karma < 60) + UI_item_say(cont, "Yeow! The chaos sword feels hot!"); + else if (avatar_karma > 60 && avatar_karma < 80) + UI_item_say(cont, "The chaos sword is burning mine hand!"); + else if (avatar_karma > 80) + { + UI_item_say(cont, "The chaos sword feels very hot and unstable!"); + //earthquake effect + UI_earthquake(3); + + rand = UI_get_random(5); + + if (rand == 1) //chaos sword erupts and explodes! + { + UI_obj_sprite_effect(cont, 5, 0,0, 0, 0, 0, -1); //small explosion on the wearer + + if (avatar_karma / 6 < current_health > 0) + UI_item_say(cont, "The chaos sword just exploded in mine hand!"); + else + UI_item_say(cont, "Arrrgh!!"); + + //remove chaos sword + UI_remove_item(item); + + + + gflags[CHAOS_SWORD_EQUIPPED] = false; + } + + + + } + + //apply damage based on karma + UI_apply_damage(1, avatar_karma / 6, LIGHTNING_DAMAGE, cont); + UI_play_sound_effect(26); + + + + + + + } + + + } + else if (UI_in_combat()) + { + if (cont->is_npc() && (item == cont->get_readied(BG_BOTH_HANDS) || item == cont->get_readied(BG_BOTH_HANDS))) //switch to weapon hand if not 2 handed + //charm user: + cont->set_item_flag(CURSED); + + //check if anyone in the party is charmed, if not, set them as charmed + + for (npc in party) + { + if (isCharmed(npc)) + { + is_charmed = true; + continue; + } + + } + + + //no one in the party is charmed, pick a random one and charm them + if (!is_charmed) + { + var party_num = UI_get_array_size([party]); + var rand = UI_get_random(party_num); + var rand_npc = party[rand]; + + //set the random party member to CHARMED + UI_set_item_flag(rand_npc, CHARMED); + + //set alignment + UI_set_alignment(rand_npc, CHAOTIC); + + + } + + + + } + if (UI_is_readied(cont, BG_WEAPON_HAND, SHAPE_CHAOS_SWORD, FRAME_ANY)) + { + UI_error_message("Chaos loop called"); + script item after 30 ticks + { + call chaosSword, CHAOS_LOOP; + + } + } + + + + } + + //karma is > 20, too high to wield the chaos sword. + if (event == CHAOS_BURN) + { + + + + } + +} + +void ChaosSword shape#(637) () // +{ + var party = UI_get_party_list(); + var cont; + + if (event == DOUBLECLICK) + { + + item->chaosSword(); + + } + + + if (event == READIED) + { + UI_close_gumps(); + gflags[CHAOS_SWORD_EQUIPPED] = true; + UI_error_message("Should call chaos sword object"); + item->chaosSword(); + } + + if (event == UNREADIED) + { + + //Stop charmed: + gflags[CHAOS_SWORD_EQUIPPED] = false; + + //clear charmed effect + for (npc in party) + { + //clear the random party member to CHARMED + UI_clear_item_flag(npc, CHARMED); + + //set alignment back to GOOD + UI_set_alignment(npc, GOOD); + } + } + +} + + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/Codex.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/Codex.uc new file mode 100755 index 0000000..7f0a15b --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/Codex.uc @@ -0,0 +1,72 @@ +void Codex shape#(1102) () +{ + var player_name = getAvatarName(); + var qual = UI_get_item_quality(item); + var msg; + var sound; + if (event == DOUBLECLICK) + { + + // * denotes page break + // ~ equals 'enter' for space + if (qual == 0) + { + showBook(); + say("~~The Codex of Ultimate Wisdom~~*"); + + say("~As always, the Codex is open to the pages bearing exactly the information you need: *"); + if (!gflags[FINAL_QUEST_GIVEN]) + { + say("~~Uh oh, looks like you've been a naughty Avatar! You've been caught red-handed, cheating of all things! What's wrong, the game too hard for you, Avatar?"); + say("~~Did you think I wouldn't find out? I'm da freakin' Codex! The Codex of Ultimate F'n Wisdom, son! You dare come here, teleport or use the F2 cheat, or somehow got past my defenses to land here on the balloon, and you have the balls to ask me for wisdom?!"); + say("~~I know all your secrets, Avatar! I know what you did last savegame, Avatar! Poor Chuckles... those poor civilians... poor Lord British."); + say("~~And to think they trusted you as the Avatar!"); + say("~~Yes, that's right! I know all. I know you explode people with powder kegs, I know you kill everything that moves when you get bored....*"); + say(".....and I know what's in your browser history, Avatar!!! Seriously, you are one SICK individual! Did you think clearing your browser would hide it from The Codex?! Think again!*"); + say("What would your mother think?? She'd be sickened by you, that's what! At this point I think I'll banish myself to the void, just so I don't have to talk to your cheating ass anymore!"); + say("~~Goodbye Cheat-atar!!*"); + + say("PS---STOP CHEATING!"); + script item after 3 ticks + { + speech 21; + + wait 10; + + //music 203; + } + UI_obj_sprite_effect(item, 8, 0, 0, 0, 0, 0, -1); + UI_remove_item(item); + UI_armageddon(); + UI_earthquake(5); + UI_set_weather(2); //rain + + //UI_play_music(203); + + } + else + { + say("~~To return the Codex to the Vortex, place a convex lens exactly midway between the Codex and the Flame of Singularity, so that the light from the flame converges on the Codex. Place a concave lens between the Codex and the Flame of Infinity, so that its light diverges over the Codex. Then place the eight moonstones within the Vortex Cube. Set it on the ground in front of the Codex, and use it to return the Codex from whence it came."); + + } + + + } + + + else + { + + showBook(); + say("This is not a valid scroll QUAL attribute! Stop cheating!"); + + } + + } + + + +} + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/Shrines.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/Shrines.uc new file mode 100755 index 0000000..0e6d800 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/Shrines.uc @@ -0,0 +1,34 @@ +void Shrines shape# (1245) () +{ + var quality = UI_get_item_quality(item); + var frame = UI_get_item_frame(item); + if (event == DOUBLECLICK) + { + var karma = UI_get_npc_id(AVATAR); + var party_list = UI_get_party_list(); + var shrine; + var virtue; + var npc; + + //get frame of Shrine + if (frame == 0) { shrine = "Compassion"; virtue = "compassion"; } + if (frame == 1) { shrine = "Valor"; virtue = "valor"; } + if (frame == 2) { shrine = "Honesty"; virtue = "honesty"; } + if (frame == 3) { shrine = "Justice"; virtue = "justice"; } + if (frame == 4) { shrine = "Humility"; virtue = "humility"; } + if (frame == 5) { shrine = "Sacrifice"; virtue = "sacrifice"; } + if (frame == 6) { shrine = "Honor"; virtue = "honor"; } + if (frame == 7) { shrine = "Spirituality"; virtue = "spirituality"; } + if (frame > 8) return; + + //Shrine is determined, call Meditate function for shrine and virtue + if ((shrine == "Compassion") && (gflags[COMPASSION_FREED])) Meditate(shrine, virtue); + if ((shrine == "Valor") && (gflags[VALOR_FREED])) Meditate(shrine, virtue); + if ((shrine == "Honesty") && (gflags[HONESTY_FREED])) Meditate(shrine, virtue); + if ((shrine == "Justice") && (gflags[JUSTICE_FREED])) Meditate(shrine, virtue); + if ((shrine == "Humility") && (gflags[HUMILITY_FREED])) Meditate(shrine, virtue); + if ((shrine == "Sacrifice") && (gflags[SACRIFICE_FREED])) Meditate(shrine, virtue); + if ((shrine == "Honor") && (gflags[HONOR_FREED])) Meditate(shrine, virtue); + if ((shrine == "Spirituality") && (gflags[SPIRITUALITY_FREED])) Meditate(shrine, virtue); + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/VortexCube.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/VortexCube.uc new file mode 100755 index 0000000..f03a573 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/VortexCube.uc @@ -0,0 +1,53 @@ +void vortexCube shape#(786) () +{ + if (event == DOUBLECLICK) + { + var count = 0; + if (gflags[VORTEX_CUBE_FULL]) + { + // AVATAR.say("@There are 8 moonstones inside the Vortex Cube.@"); + UI_close_gumps(); + var target = UI_click_on_item(); + var target_shape = UI_get_item_shape(target); + if (target_shape != 1102) //codex + UI_flash_mouse(CURSOR_X); + else + { + if (gflags[HUMAN_LENS_PLACED] && gflags[GARG_LENS_PLACED]) + { + SendCodexToVoid(); //initiate endgame sequence + } + else + randomPartyBark("@The lenses aren't in place.@"); + } + + } + + else + { + if (gflags[MOONSTONE1]) + count += 1; + if (gflags[MOONSTONE2]) + count += 1; + if (gflags[MOONSTONE3]) + count += 1; + if (gflags[MOONSTONE4]) + count += 1; + if (gflags[MOONSTONE5]) + count += 1; + if (gflags[MOONSTONE6]) + count += 1; + if (gflags[MOONSTONE7]) + count += 1; + if (gflags[MOONSTONE8]) + count += 1; + if (count > 0) + AVATAR.say("@There are " + count + " moonstones inside the Vortex Cube.@"); + else + return; + + } + } + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/altar_of_singularity.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/altar_of_singularity.uc new file mode 100755 index 0000000..2a4e2e2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/altar_of_singularity.uc @@ -0,0 +1,169 @@ +void altarOfSingularity shape#(1239) () +{ + var karma = getKarma(); + var options; + + if (event == DOUBLECLICK) + { + + var karma = getKarma(); + + UI_show_npc_face(256, 0); + item.say("A finely-carved stone pyramid."); + item.say("As you face the altar, a voice rings in your head. You understand it perfectly, but you can't recognize the language!"); + + if (gflags[FINAL_QUEST_GIVEN]) + { + item.say("@There is no more wisdom for thee to acquire here, noble Avatar.@*"); + item.say("@Seek the Codex, and may nothing impede thy sacred quest!@"); + UI_obj_sprite_effect(item, 7, 20, 20, 0, 0, 0, -1); + return; + + } + + if (!gflags[MET_ALTAR_SINGULARITY]) //haven't "met" altar yet - (answered the correct question) + { + if (karma < 40) + { + item.say("@Thy deeds make thee unworthy of enlightenment.@*"); + item.say("@Return when thy path is more focused.@"); + return; + } + else if ((karma >= 40) && (karma < 81)) + item.say("@Thou hast far to travel and much to achieve, but thy inner fire will surely guide thy way.@"); + else + { + item.say("@Thou hast far to travel and much to achieve.@*"); + item.say("@May the wisdom imparted here help purify thy inner flame.@"); + } + + item.say("@What do you seek, Avatar?@"); + options = ["Codex", "bye"]; + } + else if (!gflags[FINAL_QUEST_GIVEN] && gflags[MET_ALTAR_SINGULARITY]) + { + item.say("@Hast thou completed thy journey to the catacombs?@"); + if (askYesNo()) + { + item.say("@What is the Mantra of Singularity?@"); + if (gflags[LEARNED_MANTRA_CONTROL] && gflags[LEARNED_MANTRA_PASSION] && gflags[LEARNED_MANTRA_DILIGENCE]) + { + var mantra_options = chooseFromMenu(["un-us-or", "us-un-or", "un-or-us", "us-or-un", "or-us-un", "or-un-us"]); + if (mantra_options == "un-or-us") + { + item.say("@Let the principle of control guide thy quest.@*"); + item.say("@Let the principle of passion drive thy quest.@*"); + item.say("@Let the principle of diligence maintain thy quest.@*"); + item.say("@Then wilt thou truly achieve the unified spirit and singularity of purpose that is necessary for success in all endeavors.@*"); + item.say("@This is the gargoyle way, let it be thy way as well.@*"); + item.say("The altar glows with a cold blue flame. You feel compelled to seek out the Codex.*"); + item.say("Your final quest has begun!"); + addKarma(10); + gflags[FINAL_QUEST_GIVEN] = true; + UI_obj_sprite_effect(item, 7, 20, 20, 0, 0, 0, -1); + UI_play_music(34, 0); + return; + } + else + item.say("@You have not yet become familiar with the wisdom of the gargoyle race. Continue thy search.@"); + + } + else //don't know, get the same answer + { + var mantras_known = ["I don't know"]; + if (gflags[LEARNED_MANTRA_CONTROL]) + mantras_known = mantras_known && "un"; + if (gflags[LEARNED_MANTRA_PASSION]) + mantras_known = mantras_known && "or"; + if (gflags[LEARNED_MANTRA_DILIGENCE]) + mantras_known = mantras_known && "us"; + var mantra_options = chooseFromMenu(mantras_known); + + item.say("@You have not yet become familiar with the wisdom of the gargoyle race. Continue thy search.@"); + options = ["Control", "Passion", "Diligence", "bye"]; + } + + + + + } + else + item.say("@Which catacomb dost thou seek?@"); + options = ["Control", "Passion", "Diligence", "bye"]; + + } + + converse(options) + { + case "Codex"(remove): + say("@Look deep inside thyself, Avatar, and answer this:@"); + say("@For whom dost thou truly seek the Codex?@*"); + var CodexChoice = chooseFromMenu(["humans", "gargoyles", "Lord British", "both races", "Draxinusom", "myself", "Beh Lem", "Naxalitor", "Bolesh", "Valkadesh"]); + switch(CodexChoice) + { + case "both races": + say("@Thy answer is wise.@*"); + say("@But how canst thou truly work for the good of a race whose ways thou dost not understand?@*"); + say("@Go thou into the Catacombs of Control, Passion and Diligence. In each wilt thou find the final resting place of the being who most exemplifies that principle.@"); + say("@Return when thou hast found these catacombs.@"); + + gflags[MET_ALTAR_SINGULARITY] = true; //Got right answer, "met" shrine + add(["Control", "Passion", "Diligence"]); + break; + + case "humans": + case "myself": + case "Lord British": + say("@Thy answer is foolish.@"); + say("@A journey made for selfish reasons can never be a sacred quest, regardless of its goal.@"); + break; + + case "Valkadesh": + case "Beh Lem": + case "Naxalitor": + case "Draxinusom": + case "Bolesh": + say("@Thy answer is foolish.@"); + say("@Thy compassion is acknowledged, but compassion is not the key to success.@"); + say("@The motive must be as one with the goal for a journey to become a sacred quest.@"); + break; + + default: + say("@Thy answer is foolish.@"); + say("@There is no nobility or honor in betraying one's own race for the sake of another.@"); + say("@Such a path can never be a sacred quest.@"); + } + + + case "Control"(remove): + say("@Control is one of the guiding principles of the gargoyle race.@"); + say("@Go thou into the Catacombs of Control, near the coast to the west of here.@"); + say("@There you will find the being who most exemplifies this principle.@"); + add("principles"); + + case "Passion"(remove): + say("@Passion is one of the guiding principles of the gargoyle race.@"); + say("@Go thou into the Catacombs of Passion, near the coast to the east of here.@"); + say("@There you will find the being who most exemplifies this principle.@"); + add("principles"); + + case "Diligence"(remove): + say("@Diligence is one of the guiding principles of the gargoyle race.@"); + say("@Go thou into the Catacombs of Diligence, near the coast to the south of here.@"); + say("@There you will find the being who most exemplifies this principle.@"); + add("principles"); + + case "principles"(remove): + say("@The three principles of Control, Passion and Diligence form the basis of the gargoyle way of life.@"); + + + case "bye": + say("The mystic voice falls silent, and you leave the altar."); + break; + + } + + } + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/baking.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/baking.uc new file mode 100755 index 0000000..4a628d5 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/baking.uc @@ -0,0 +1,146 @@ +/* Egg used on baking hearths to cook dough that is placed upon it: Reimplemented to add in more dough recipes */ +void bakeBread object#(0x635)() +{ + var dough; + var dough_pos; + var dough_frame; + var hearth; + var bread; + var bread_frames; + var bread_frame; + var bread_name; + var rand; + + //added the bread frames here to make things easier + enum bread_frames + { + FRAME_BREAD = 0, + FRAME_ROLLS = 1, + FRAME_BAGUETTE = 2, + FRAME_BREAD_LONG = 2, + FRAME_FRUITCAKE = 3, + FRAME_CAKE = 4, + FRAME_PIE = 5, + FRAME_PASTRY = 6 + }; + enum dough_frames //used in baking.uc + { + FRAME_FLOUR = 0, + FRAME_DOUGH_FLAT = 1, //this will now create a pastry when cooked in the oven + FRAME_DOUGH_BALL = 2 + }; + + //egg called this function when dough was placed upon it + if (event == EGG) + { + dough = UI_find_nearby(item, SHAPE_DOUGH, 0, 0); + //Added: also checks that the dough isn't just raw flour (take that, you bastards) + if (dough && UI_get_item_frame(dough) > 0) + { + //in 60 ticks, the dough itself will BakeBread in order to turn into bread + script dough after 60 ticks { call bakeBread; } + if (UI_get_random(2) == 1) randomPartyBark("@Do not overcook it!@"); + } + } + + //dough called function to turn into bread + else if (event == SCRIPTED) + { + dough_pos = UI_get_object_position(item); + hearth = UI_find_nearby(item, SHAPE_HEARTH, 2, 0); + + //Who the hell wrote this?? Why not just check for the existence of a hearth? + if(UI_get_array_size(hearth) > 0) + { + dough_frame = UI_get_item_frame(item); + + UI_remove_item(item); + bread = UI_create_new_object(SHAPE_FOOD); + if (bread) + { + UI_set_item_flag(bread, TEMPORARY); + + //This whole bit has been pulled apart and rewritten to support multiple kinds of bread + + //Flat dough was used: this causes pastry to be born! + if (dough_frame == FRAME_DOUGH_FLAT) + { + bread_frame = FRAME_PASTRY; + bread_name = "pastry"; + } + else if (dough_frame == FRAME_DOUGH_PIE) + { + bread_frame = FRAME_PIE; + bread_name = "pie"; + } + //Randomly decides between fruitcake and regular cake + else if (dough_frame == FRAME_DOUGH_CAKE) + { + if (UI_get_random(3) == 1) bread_frame = FRAME_FRUITCAKE; + else bread_frame = FRAME_CAKE; + bread_name = "cake"; + } + + //Ball dough was used: this makes some kind of regular bread + //(weighted so that the small round loaves occur twice as often) + else if (dough_frame == FRAME_DOUGH_BALL) + { + bread_name = "bread"; + rand = UI_get_random(4); + + if (rand == 1) bread_frame = FRAME_BAGUETTE; + else if (rand == 2) bread_frame = FRAME_ROLLS; + else bread_frame = FRAME_BREAD; + } + + UI_set_item_frame(bread, bread_frame); + + if (UI_update_last_created(dough_pos)) + { + rand = UI_get_random(3); + if (rand == 1) randomPartyBark("@I believe the " + bread_name + " is ready.@"); + else if (rand == 2) randomPartyBark("@Mmm... Smells good.@"); + } + } + } + } +} + +/* Reimplemented to offload doubleclick behaviour to BakeBread, since the silly sods who programmed it to start with duplicated the behaviour in two locations. */ +void Dough object#(0x658)() +{ + var dough_frame; + var target; + var target_shape; + var target_pos; + + //this behaviour allows you to place bread upon a hearth without drag-dropping + if (event == DOUBLECLICK) + { + dough_frame = UI_get_item_frame(item); + if (UI_get_item_frame(item) > 0) //dough is not flour + { + target = UI_click_on_item(); + target_shape = UI_get_item_shape(target); + if (target_shape == SHAPE_HEARTH) + { + if (UI_set_last_created(item)) + { + target_pos = UI_get_object_position(target); + //choose a random position somewhere along the hearth + //tweaked to allow one more space for it... + //...and then untweaked again, as it makes the dough too hard to see + target_pos[X] = target_pos[X] - UI_die_roll(1, 2); + target_pos[Z] = target_pos[Z] + 1; + + //now place the dough there + if (UI_update_last_created(target_pos)) + { + script item after 60 ticks { call bakeBread; } //Changed to call BakeBread instead of Dough + if (UI_get_random(2) == 1) randomPartyBark("@Do not overcook it!@"); + } + } + } + } + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/balloon.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/balloon.uc new file mode 100755 index 0000000..ce9243a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/balloon.uc @@ -0,0 +1,590 @@ + + + +//used for balloon - renders party once the balloon has landed +void renderParty object#() () +{ + UI_error_message("render party called"); + var party = UI_get_party_list(); + var balloon = UI_find_nearest(AVATAR, SHAPE_BALLOON, 31); // + var npc; + var warningLevel = UI_get_npc_id(BALLOON_DOG); + + + //get barge Avatar is on then remove it + var barge = UI_get_barge(AVATAR); + UI_remove_item(barge); + + //reworked for falling into the void. + if (warningLevel > 2) + { + //kill Avatar + UI_apply_damage(127, 127, ETHEREAL_DAMAGE, AVATAR); + + //reset warning level + UI_set_npc_id(BALLOON_DOG, 0); + + } + else + { + for (npc in party) + { + + UI_clear_item_flag(npc, DONT_RENDER); + + } + UI_clear_item_flag(AVATAR, DONT_RENDER); + UI_clear_item_flag(AVATAR, POLYMORPH); + + //re-center screen on the Avatar + UI_center_view(AVATAR); + + UI_set_item_frame(balloon, 0); + } + +} + + + + + +//function that makes sure the Avatar doesn't fly off the gargoyle world too far... +void checkVoid object#() () +{ + enum checkVoid_levels + { + CHECK_VOID = 1, + CHECK_VOID2 = 2, + BALLOON_SINKING = 3, + LAND_BARGE = 4, + ADD_BARGE = 5 + + + + + }; + + + + + + var warningLevel = UI_get_npc_id(BALLOON_DOG); + var balloon = UI_find_nearby_avatar(SHAPE_NEW_BALLOON); + //var balloon = UI_find_object(FIND_ON_SCREEN, SHAPE_NEW_BALLOON, QUALITY_ANY, FRAME_ANY); + var barge = get_barge(); + + //if (balloon) + // UI_error_message("Balloon found."); + //else + // UI_error_message("Balloon NOT found."); + + //if (barge) + // UI_error_message("Barge found."); + //else + // UI_error_message("Barge NOT found."); + + //get current position and map + var current_pos = UI_get_object_position(AVATAR); + var currentX = current_pos[X]; + var currentY = current_pos[Y]; + var top_left = [0923, 0678, 0]; + var bottom_right = [2230, 2099, 0]; + var current_map = UI_get_map_num(AVATAR); + + if (event == CHECK_VOID) + { + UI_error_message("Event CHECK_VOID is playing. Warning level is: " + warningLevel); + + + if (warningLevel > 2) //have been warned several times already to go back to land + { + randomPartyBark("@The balloon is falling into the void!!@"); + UI_halt_scheduled(AVATAR); + script AVATAR after 15 ticks + { + call checkVoid, BALLOON_SINKING; + + } + + + } + else + { + //if map is not 3, do nothing + if (current_map == 3) + { + if (currentX > top_left[X] && currentX < bottom_right[X] && currentY > top_left[Y] && currentY < bottom_right[Y]) //in bounds, do nothing + UI_error_message("Balloon is in bounds of the gargoyle world"); + else + { + //balloon is out of bounds, give warning + UI_error_message("Balloon OUT of bounds of the gargoyle world - warning level " + warningLevel); + + //set ID level for balloon dog (holder for warning level) + UI_set_npc_id(BALLOON_DOG, warningLevel + 1); + + //give party warning + randomPartySay("@We should probably turn back, it feels like the balloon is getting sucked into the void!@"); + + } + + } + + if (!gflags[BALLOON_IS_FLYING]) + { + UI_error_message("Balloon is landed, call off the script"); + // UI_halt_scheduled(balloon); + UI_set_npc_id(BALLOON_DOG, 0); // reset warning level + } + + script AVATAR after 30 ticks + { + call checkVoid, CHECK_VOID; + + } + } + + } + + if (event == CHECK_VOID2) + { + //randomPartyBark("@Event CHECK_VOID is playing@"); + UI_error_message("Event CHECK_VOID2 is playing"); + script AVATAR + { + call checkVoid, CHECK_VOID; + + } + + + + + } + + if (event == LAND_BARGE) + { + var barge = UI_find_nearby(AVATAR, 961, 10, MASK_EGG); //hopefully find the barge before placing + var party = UI_get_party_list(); + var quality = get_item_quality(); + var balloon = UI_find_nearest(AVATAR, SHAPE_BALLOON, 31); // + + // Yes; so begin process of landing. + // Flag 10 = 'on moving barge' + barge->clear_item_flag(10); + // Flag 26 = 'in motion' + barge->clear_item_flag(26); + + // Make barge descent until the ground. + // Flag 10 = 'on moving barge' + balloon->clear_item_flag(10); + + // Flag 26 = 'in motion' + balloon->clear_item_flag(26); + + // Make barge descent until the ground. + script barge + { + repeat 10 + { + descent; + + }; + } + + + + script balloon + { + repeat 9 + { + descent; //should lift item on z level 8 + }; + wait 3; + + } + + + script AVATAR + { + repeat 9 + { + descent; //should lift item on z level 9 + }; + } + + for (npc in party) + { + script npc + { + repeat 9 + { + descent; //should lift item on z level 9 + }; + + } + } + + + UI_remove_item(barge); + + + + + + + } + + if (event == BALLOON_SINKING) + { + UI_error_message("Event BALLOON_SINKING called"); + const int SHAPE_BALLOON = 1201; + var barge = get_barge(); + var party = UI_get_party_list(); + var balloon = UI_find_nearest(AVATAR, SHAPE_BALLOON, 31); // + //var newballoon = UI_find_object(FIND_ON_SCREEN, SHAPE_NEW_BALLOON, QUALITY_ANY, FRAME_ANY); + var newballoon = UI_find_object(FIND_ON_SCREEN, 1232, QUALITY_ANY, FRAME_ANY); //test + var quality = UI_get_item_quality(item); + var basket_pos = UI_get_object_position(item); + + + if (item) + UI_error_message("Balloon in BALLOON_SINKING event found"); + else + UI_error_message("Balloon in BALLOON_SINKING event NOT found"); + + + + //UI_set_item_flag(AVATAR, BG_DONT_MOVE); + + // Flag 10 = 'on moving barge' + barge->clear_item_flag(10); + + // Flag 26 = 'in motion' + barge->clear_item_flag(26); + + // Make carpet descent until the ground. + // Flag 10 = 'on moving barge' + item->clear_item_flag(10); + + // Flag 26 = 'in motion' + item->clear_item_flag(26); + + // Flag 10 = 'on moving barge' + AVATAR->clear_item_flag(10); + + // Flag 26 = 'in motion' + AVATAR->clear_item_flag(26); + UI_clear_item_flag(AVATAR, SAILOR); + + //sound effect + UI_play_sound_effect(89); + + //cut the music + UI_play_music(255); + + //may not be necessary: + // UI_halt_scheduled(AVATAR); + + script balloon //changed from balloon + { + + repeat 9 + { + descent; //should lift item on z level 9 + }; + wait 5; + + + } + script barge after 20 ticks + { + call renderParty; + + + } + + script AVATAR + { + repeat 9 + { + descent; //should lift item on z level 9 + }; + + } + + + + + + + + for (npc in party) + { + script npc + { + repeat 9 + { + descent; //should lift item on z level 9 + }; + + } + + + } + + //remove balloon + //UI_remove_item(item); + + gflags[BALLOON_IS_FLYING] = false; + + + } + + + +} + + +void AddBarge object#() () +{ + + var party = UI_get_party_list(); + var basket_pos = UI_get_object_position(item); + var quality = get_item_quality(); + var balloon = UI_find_nearest(AVATAR, SHAPE_BALLOON, 31); // + + UI_create_barge_object(6, 6, NORTH); + UI_update_last_created([basket_pos]); + + UI_set_item_flag(AVATAR, SAILOR); + UI_set_item_flag(AVATAR, ON_MOVING_BARGE); + UI_set_item_flag(AVATAR, IN_MOTION); + + script item + { + rise; //should lift item on z level 9 + }; + + UI_set_item_shape(item, SHAPE_NEW_BALLOON); //so the Avatar can double click the new shape to descend + + //balloon is in the air, set flag + gflags[BALLOON_IS_FLYING] = true; + + //calls checkVoid event + item->checkVoid(); + +} + + + +void balloon shape#(1201) () +{ + + var barge = get_barge(); + var party = UI_get_party_list(); + var balloon = UI_find_nearest(AVATAR, SHAPE_BALLOON, 31); // + var quality = UI_get_item_quality(item); + var basket_pos = UI_get_object_position(item); + + if (event == DOUBLECLICK) + { + UI_error_message("Balloon event called from Doubleclick from new_balloon.uc"); + if (UI_get_item_frame(item) == 0) //Balloon is freshly placed and ready to ride + { + var barge = UI_find_nearby(basket_pos, 961, 10, MASK_EGG); //hopefully find the barge before placing + + if ((UI_get_container(item) == 0)) //checks if on the ground and not in container + { + if (!UI_is_pc_inside()) //checks if no roof above + { + if (!UI_find_nearby(basket_pos, 961, 10, MASK_EGG)) //will create barge if one not found + { + UI_create_barge_object(8, 8, NORTH); //changed from 7x7 + UI_update_last_created([basket_pos]); + + } + + if (UI_on_barge()) //everyone should be on barge + { + var barge = UI_find_nearby(basket_pos, 961, 10, MASK_EGG); //hopefully find the barge before placing + + UI_remove_item(barge); //removes barge to create new one at proper z level + UI_set_polymorph(AVATAR, 639); //death vortex + + //attempt to put Avatar in the middle of the barge + UI_si_path_run_usecode(AVATAR, [basket_pos[X] -1, basket_pos[Y] -1]); + + + + script item + { + repeat 9 + { + rise; //should lift item on z level 8 + //add sfx + //sfx + }; + + wait 3; + call AddBarge; + + + } + + + + script AVATAR + { + repeat 9 + { + rise; //should lift item on z level 9 + }; + + + + + } + + for (npc in party) + { + script npc + { + repeat 9 + { + rise; //should lift item on z level 9 + }; + + } + + UI_set_item_flag(npc, DONT_RENDER); + UI_clear_item_flag(AVATAR, DONT_RENDER); + + + } + //carpet theme + UI_play_music(25); + + + + + + + }//on barge + else + { //UI_si_path_run_usecode(actor npc, int pos[], int event, object obj, function fun, bool flag) + UI_si_path_run_usecode(AVATAR, [basket_pos[X] -1, basket_pos[Y] -1], DOUBLECLICK, item, balloon, false); + //AVATAR->path_run_usecode([basket_pos[X] -1, basket_pos[Y] -1], balloon, item, DOUBLECLICK, false); + UI_error_message("Avatar should walk to balloon and call doubldlick"); + for (npc in party) + { + UI_error_message("Attempting to move " + npc); + + UI_si_path_run_usecode(npc, [basket_pos[X] -1, basket_pos[Y] -1], SCRIPTED, item, balloon, false); + } + + + + } + + } + else randomPartyBark("@The balloon can't be used here.@"); + } + else randomPartyBark("@Place it on the ground first..@"); + + } + else //packing the balloon + { + UI_set_item_frame(item, 0); //to make sure the packed balloon renders + + var item_frame = UI_get_item_frame(item); + //var location = UI_get_object_position(item); + UI_set_item_shape(item, SHAPE_PACKED_BALLOON); //landed, packed balloon + UI_set_item_frame(item, 0); //to correct the frame + + + //UI_move_object(item, location, false); + + var item_shape = UI_get_item_shape(item); + UI_error_message("Balloon should be packed. Item frame is " + item_frame + " and item shape is now: " + item_shape); + } + } + else + return; + + if (event == SCRIPTED) + { + + //balloon should not be in the air + if (!gflags[BALLOON_IS_FLYING]) + { + + + UI_error_message("Balloon event called from Scripted from new_balloon.uc"); + if (UI_on_barge()) //should wait til everyone is on barge before running the script + { + + script item + { + repeat 9 + { + rise; //should lift item on z level 8 + //add sfx + //sfx + }; + + wait 3; + call AddBarge; + + } + + script AVATAR + { + repeat 9 + { + rise; //should lift item on z level 9 + }; + + + + } + + for (npc in party) + { + script npc + { + repeat 9 + { + rise; //should lift item on z level 9 + }; + + } + + UI_set_item_flag(npc, DONT_RENDER); + UI_clear_item_flag(AVATAR, DONT_RENDER); + UI_set_polymorph(AVATAR, 639); //death vortex + + } + + //carpet theme + UI_play_music(25); + UI_error_message("Scripted event called on balloon"); + } + } + else //balloon is in the air, call the scripted function to determine if close to gargoyle island + { + + + if (!gflags[BALLOON_IS_FLYING]) + { + UI_error_message("Balloon is landed, call off the script"); + UI_halt_scheduled(AVATAR); + UI_set_npc_id(BALLOON_DOG, 0); // reset warning level + } + + } + + } + +} + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/book.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/book.uc new file mode 100755 index 0000000..2d51cec --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/book.uc @@ -0,0 +1,514 @@ +void showBook2 () +{ + var SOUND_BOOK = 14; + + //Play book sound: + UI_play_sound_effect2(SOUND_BOOK, item); + + + //Start book mode for current item: + book_mode(); + +} + +/*************** + * The list of in game books: + + Quality/Title/(Writer/note): + 0 - Morgan's Guide to Unifinished Novels (by Morgan) --- Unifinished is spelled like that in-game. - REPLACED W/ U6 BOOK + 1 - "How Death Affects Those Who Work Around It With Regularity" - REPLACED W/ U6 BOOK + 2 - My Notebook (by Alagner) - REPLACED W/ U6 BOOK + 3 - Observations of Black Rock (by Rudyom The Mage) - REPLACED W/ U6 BOOK + 4 - Stranger in a Strange Land (by Robert Heinlein) + 5 - Chitty-Chitty-Bang-Bang (by Ian Fleming) + 6 - The Wizard of Oz (by Frank L. Baum) + 7 - Hubert's Hair-Raising Adventure (by Bill Peet) + 8 - Records of the High Court of Yew - REPLACED W/ U6 BOOK + 9 - Morfin of Paws, Ledger of Venom Sales - REPLACED W/ U6 BOOK + 10 - Ultima: The Avatar Adventures (by Rusel DeMaria and Caroline Spector) REPLACED W/ U6 BOOK + 11 - Everything An Avatar Should Know About Sex: --- Empty book, hahaha + 12 - Encyclopedia Britannia (Volume I. A - E.) + 13 - Encyclopedia Britannia (Volume II. F - L.) + 14 - Encyclopedia Britannia (Volume III. M - P.) + 15 - Encyclopedia Britannia (Volume IV. Q - U.) + 16 - Encyclopedia Britannia (Volume V. V - Z.) + 17 - Key to the Black Gate. --- Joke, supposedly a hint book - REPLACED W/ U6 BOOK + 18 - Collected Plays (by Raymundo) - REPLACED W/ U6 BOOK + 19 - No Time to Dance (by B.A. Morler.) + 20 - The Silence of Chastity (by I.M. Munk.) + 21 - Murder by Mongbat (by J. Dial.) + 22 - Dolphin in the Dunes (by Pietre Hueman.) + 23 - Mandibles (by Peter Munchley.) + 24 - The Book of the Fellowship (by Batlin of Britain.) - REPLACED W/ U6 BOOK + 25 - Lord British - The biography of Britannia's longtime ruler (by K.Bennos) + 26 - Gargoyle Like Me (by Darok.) - REPLACED W/ U6 BOOK + 27 - To be or not to be (by Wislem.) + 28 - Book of Prophecy (by Naxatilor the Seer) + 29 - The Book of Forgotten Mantras. + 30 - Struck Commander (by Gilberto) //REPLACED W/U6 BOOK + 31 - Gone With The Wisp (by Margareta Mitchellino.) + 32 - Karenna's Workout (by Karenna.) + 33 - Karenna's Pregnancy Workout (by Karenna.) + 34 - Karenna's Total Body Workout (by Karenna.) + 35 - The Five Stages of Lawn Care (by A.P. Berk.) + 36 - And Then There Was Karen... (by B. MacDae) + 37 - The Intrinsic Complexities of Investigating a new Species of Flora in the Land of Britannia (by Perrin) + 38 - Ringworld (by Larry Niven) + 39 - The Apothecary's Desk Reference (by Fetoau) + 40 - Magic and the Art of Horse-and-Wagon Maintenance + 41 - Jesse's Book of Performance Art (by Jesse.) + 42 - The Write Stuff (by Perrin) + 43 - That Beer Needs a Head on It! (by Yongi) + 44 - The Provisioner's Guide to Useful Equipment (by Dell) + 45 - The Accedens of Armoury (by Legh) + 46 - The Bioparaphysics of the Healing Arts (by Lady Leigh) + 47 - What Color is Thy Blade? (by Menion) + 48 - The Blacksmith's Handbook (by Christopher) + 49 - Thirteen Months in a Year (by Euralyn) + 50 - The Day it Didn't Work (by R. Allen G.) + 51 - No One Leaves (by R. Allen G.) + 52 - A Complete Guide to Britannian Minerals, Precious, and Semi-Precious Stones (by B. Ledbetter) + 53 - Trees, and then Some! (by Ben) + 54 - Bloodied Blades and Buxom Beauties (A.G. Fishmor) + 55 - The Hundred and Eleven Year, Three-Month, Seven-Day War (by Perrin) + 56 - Black Moon, Red Day (by Euralyn) + 57 - Two in the Fold (by Morian) + 58 - The Forest of Yew (by Taylor) + 59 - This Olde Ship (by Owen of Minoc) + 60 - The Carver Chronicles (by Morfin) + 61 - Hero Fertilizer (by Werdron) + 62 - What could be left but the Ashes (by N. Flaims) + 63 - The Summer of my Satisfaction (by Plexes) + 64 - Hither Comes The Rain (by Perrin) + 65 - White Rain (by Perrin) + 66 - Milord Conduct (by Aleina) + 67 - To The Death! (by Zaksam) + 68 - Blade of the Gryphon Barony (by Pebrogdy) + 69 - The Winning Number (by A.P. Berk) + 70 - The Scent of Valor (by Wetterson) + 71 - How The West Was (by Yuclydia) + 72 - Thy Message Received! (by For-Lem. Translated by Jillian) + 73 - Ribald Encounters (by Madden) + 74 - The Knight and the Thief (by Hobbs) + 75 - The Trio (by Leepeartson) + 76 - The Black Compendium (Written by Mondain, with annotations by the enchantress Minax and magical formulae by the hellspawn Exodus.) + 77 - No Way to Jump (by Desmonth) + 78 - Stealing the Wind (by Brianna) + 79 - Brommer's Flora (by Brommer) + 80 - Brommer's Fauna (by Brommer) + 81 - Brommer's Britannia (by Brommer) --- Shows a world map upon use + 82 - Up is Out (by Goodefellow) + 83 - Weaving (by Carlyn) + 84 - Follow the Stars (by Laurnen) + 85 - How to Conquer the World in Three Easy Steps (by Maximillian the Amazingly Mean) + 86 - Tren I, II, III, IV, . . . XVII + 87 - Sir Kilroy (Anonymous) + 88 - My Cup Runneth Over (by Marseine) + 89 - Spring Planting, Autumn Harvest + 90 - Shoot the Moon (by Oswauld) + 91 - Outpost (by Gasreth) + 92 - Landships (by Equinestra) + 93 - Landships of War (by Equinestra) + 94 - Why Good Mages Like Black Magic (by Magus) + 95 - When Starts The Adventure (by Sabra) + 96 - What a Fool Believes (by P. Nolan) + 97 - The Complete History of the Lute (by Devonaillion, with foreword by the Master Bard, Iolo) + 98 - Birds of Britannia (by Brother Wayne) + 99 - I am not a Dragon (by Thomson) + 100 - The Dragon Compendium (by Perrin) + 101 - The Journal of Garret Moore --- Found on Ambrosia + 102 - The Transitive Vampire, by Karen Elizabeth Gordon + 103 - The Tome of the Dead (by Suvol Shadowface) + 104 - Artifacts of Darkness (by Mordra Morgaelin) + 105 - The Light Until Dawn (by Drennal) + 106 - Codavar (by Nexa) + 107 - Ritual Magic (by Nicodemus) + 108 - Pathways of Planar Travel (by Nicodemus) + 109 - Enchanting Items for Household Use (by Nicodemus) + 110 - Miscellaneous Cantrips (Anonymous) + 111 - Modern Necromancy (by Horance) + 112 - The Symbology of Runes (by Smidgeon the Green) + 113 - The Bunk and Stool (Register) + 114 - The Modest Damsel (Register) + 115 - The Checquered Cork (Register) + 116 - The Honorable Hound (Register) + 117 - The Out'N'Inn (Register) + 118 - The Wayfarerer's Inn (Register) + 119 - The Fallen Virgin (Register) + 120 - Britannian Mining Company --- Mining log + 121 - The Salty Dog (Register) + 122 - A Guide to Childcare for the Rich and Famous (by Lady M) + 123 - Alagner's Book of Marvelous and Astonishing Things (by Alagner) + 124 - Baths - Profits --- Ledger + 125 - The History of Stonegate (by Shazle) + 126 - The Way of the Swallow (by Foiles) + 127 - Vetrons Guide to Weapons and Armour (Their effectiveness and value) + 128 - Vargaz's Stories of Legend (Reasons why one should never build doors facing north or west. --- Hahahahaha + 129 - One Hundred and One Ways to Cheat at Nim (by Dr. Cat) + 130 - Play Directing: Analysis, Communication and Style (by Francis Hodge) + 131 - On Acting (by Laurence Olivier) + 132 - Thou Art What Thee Eats (by Fordras) + 133 - Man Versus Fish: The Ultimate Conflict (by Aquastyr) + 134 - Knight's Bridge in a Nutshell (by Nicodemus) + 135 - Mempto Rays (A qualitative study in metaparaphilosophical radiation - by Mempto) + 136 - The Book of Circles (Translated from Gargish to Britannian by Jillian) + 137 - Chicken Raising (by Daheness Gon) + 138 - The Art of Field Dressing (by Creston - Forward by Lady Leigh) + 139 - Water on the Cat (by Mowze) + 140 - A Short Treatise on Britannian Society (by Clayton) + 141 - A Baker's Handbook (by Settlar) + 142 - Logbook (Astelleron) --- Isle of Fire, test of love + 143 - Golems: From Clay to Stone (by Castadon) + 144 - The Stone of Castambre (by MacCuth) + 145 - --- second part of 144 + 146 - The Dark Core of Exodus (by Erethian) + 147 - Ethical Hedonism (by R. Allen G.) + 148 - Converting Moongates to Thine Own Use (by Erethian) + + + */ + + + + + +void original_book shape#(642) () +{ + var player_name = getAvatarName(); + var qual = UI_get_item_quality(item); + var msg; + var sound; + + // using * is new page. + // using ~ is a line break. + // 31/32 chars each line? + + if (event == DOUBLECLICK) + { + + // * denotes page break + // ~ equals 'enter' for new line + // 18 lines per page + + if (qual == 1) + { + showBook(); + + say("~~ ~~Captain's log - The Empire~~"); + + say("~~by Ventara~~*"); + + say("~~Day 1-~~ I, Ventara, now Captain of the Empire in the post-Hawkins era, set sail with a new crew in search of Hawkins' treasure without the aid of the complete map. The others have retired, and will ne'er expect that I'll keep looking! I'll keep it all to meself!*"); + + say("~~Day 10 ~~ The crew be still in good spirits. My former shipmates proberly don't even know I slipped out o' the 'Den yet with the Empire, too drunk in celebration over Hawkins' demise. I be too calculating for them scumbags. The blood o' Hawkins didn't even dry on the timbers of the Empire before I plotted my next move!*"); + + say("~~Day 14 ~~ Narrowly evaded the Royal Navy. The Empire still be a grand vessel, and with Ventara as Captain, we'll ne'er be caught. Will stop soon on a nearby island to patch a hole from the cannonball that grazed the ship. Blasted Lord British and his Navy!*"); + + say("~~Day 23 ~~ After a few false leads, I am confident that this next island be the one that Hawkins buried his swag. We'll reach it by sundown. The crew eagerly awaits the treasure... the greedy bastards.*"); + + say("~~Day 24 ~~ So I was wrong. No treasure here. Slight miscalculation, blasted sextant! Damn Hawkins' wretched soul!*"); + + say("~~Day 30 ~~ They were eying me again today. Those rats don't think I know, but I know. 'Twas the same look we gave Hawkins before we gutted him. But they'll not get Captain Ventara, oh no. I knows their plots. The promise of treasure will only negate their bloodlust for so long, but I feel I am close to the treasure...*"); + + say("~~Day 33 ~~ Sent me first mate to a watery grave as an example to anyone thinking any idears. I'll not share my treasure with these dogs. I will use them long enough to get to the location where the treasure is buried. I believe I can lose them along the way, I'll remember where our traps were set. I'll retire a very rich man.*"); + + say("~~Day 45 ~~ Damn the storms.. visibility is low. The past several days the waters have been rough due to the earthquakes. The crew begs me to abandon the expedition. I'll have none o'that! They'll not keep me from the treasure! Through the storm, I can see the monolith that marks the spot! This is it!*"); + + } + + else if (qual == 2) + { + + showBook(); + + say("~~ A CITY DWELLER GUIDE TO THE COUNTRYSIDE ~~ ", + + "~~by LaFey~~~~*"); + + say("~~ Within this volume the author, an inhabitant of Britain, describes his countryside strolls with particular emphasis on the inns, taprooms and patrons therein.~~~"); + + say("...and when I reached Paws the light was already fading and a cold breeze was blowing from the east. The quaint village inn beckoned me inside invitingly. It was only a matter of wiping my dusty boots and before long I sat with the local folk, sipping from ceramic mugs and discussing threads, fabrics or local gossip. The ale was sufferable and the cost a trifle. After I had opened my pouch to buy a third round the conversation shifted from the affairs of weavers to the affairs of the court..."); + + } + + else if (qual == 3) + { + + showBook(); + + + say("~~ DAEMON DREAM ~~ ", + + "~~by Dom~~~~*"); + + say("~~Once I spent some time far away in the north. A legendary country in which the ancient druids are said to have celebrated their secret rites. But these dark ages are long gone, as I thought. I stayed with some old friends of the family in a small town. At this time I didn´t feel too well. The world didn´t seem very attractive to me. In my sleep my dreams were troublesome and when I was awake I didn´t feel in tune with the flow of everyday life. At daytime I longed for a dreamful night and at night I dreaded the coming long cruel day. So I decided to take some time and as you will read the events proved me right.~"); + + say("As I had nothing else to do I often went for long walks exploring the country. One day I strolled through the woods though I knew better as the villagers had repeatedly warned me against it. They claimed that the forest was haunted. Strange lights and noises have been seen and heard. Inhuman creatures were said to live there. The stories of inexplicable things happening were plenty. But I sneered at all this superstitious nonsense. We live in a modern age so why heed such foolish warnings. At least I thought them foolish.~~"); + + say("After hours of nature´s beauty I came upon an odd circular clearing where everything seemed peaceful and quiet. It was a nice day and I was a little exhausted so I decided to rest some time. I lay down in the opening and the afternoon sun. It didn´t take me long and my eyelids felt heavy and I couldn´t stay awake anymore. Before I was lost in a dreamless sleep it briefly struck me that the clearing lay in a perfect ring of odd-shaped stones and toadstools. But then my thoughts were already too confused to make anything of it...~~"); + + say("Hours later I woke up and it was already dark. I looked up at the sky. The moon was full. I began to feel uncomfortable as I had to think about the superstitious locals who´d told me repeatedly that strange things used to happen in these so-called mystical woods. Then I remembered that I was standing in a circle of stones and toadstools and isn´t there a story to those rings? I decided that it was high time to take a fast exit and get out of this forest. But as soon as I got near the edge of the circle the stones emitted a strange green light and I could hear a faint chanting. I had to slap myself to see if I was by chance still asleep and only dreaming, but the pain only stung and the light just shone brighter.~~"); + + say("Suddenly, there were small dark spots in the light which drew closer to me. I could make out that these were some kind of creatures which looked like faerïes. Faerïes??!! You know, very small naked people with wings who are often mentioned in old tales, songs and legends. I always thought they were just that - legends. Obviously they were real - or me just a nutcase. They flew gracefully around me and I overheard them speaking about me in their delicate thin voices. I was astonished and just stood there watching these beautiful entities.~~"); + + say("They then disappeared, all but one. She was obviously a female specimen and quite a beauty. She seemed slightly bigger as the others and she had an air about her that demanded unshared attention. She hovered on eye-level with me and began to speak :~~"); + + say("@Human fool! How dare you intrude our peaceful forest? Aren´t you satisfied destroying the world outside? Must you bring your human destructiveness even here? Are you willing to take this place as well?@~~"); + + say("@I ... I didn´t mean to disturb you and I regret deeply what my people did to our home. In trying to escape and to find a little peace I came here. I humbly apologize my intruding. There was no ill intended.@ I replied.~~"); + + say("@Mortal, I know you very well and this was just a little test. To see if you changed in these past ages.@~~"); + + say("@Now wait a minute! Do I have this right? You know me? Ages? May I ask you what you are talking about?@~~"); + + say("@Listen! Know that I´m the Queen of the faerïes and thus knew a long time ago that you would eventually be lead to this place again. In ancient times it was decided to grant you a wish if you are able to answer a simple question.@~~"); + + say("@Again?@ I questioned. @Never before in my life was I here. How do I deserve a wish? I´m no one special, just a ...@~~"); + + say("@You are far more. You always were. A friend of my people. In every life you helped us with your magic and now we are going to give you what your heart desires.@~~"); + + say("@Magic? I know nothing of magic and I certainly don´t believe in reincarnation ... But I also don´t believe in faerïes. and now I´m standing here in green light, arguing with the very Queen of the faerïes. It´s more probable that I drank to much in the tavern and I just dream this.@~~"); + + say("@´Tis no dream and let me assure you in former life, you were quite a magician. But now enough of this foolish talk. I know you, rest assured. Never could I mistake your bright burning light for someone else´s. Listen! I´ll ask you now a question that will change your life. Name the five elements ancient mages knew to master.@~~"); + + say("I answered, @That´s easy. It´s fire, water, earth. air and...@ A fifth element? I never before heard of another element. What the ... was she talking about anyway. Me a magician! Ha! Who was the crazy person here? What element...@ I thought."); + + say("As I strenuously thought about magic and a fifth element something deep in me stirred. Ancient knowledge flooded my consciousness but it was gone before I could really grasp it. But I could then clearly see the truth in her words and most importantly, I knew the answer to her little quiz.~~"); + + say("@It´s ether!@, I exclaimed.~~"); + + say("@Congratulations@ said the faerie. @I had my doubts you could remember these very old lessons but you did it. Now, think of your deepest desire. Name it and your wish shall be granted.@~~"); + + say("@You know, I have this dream that haunts me. At first it was quite harmless but now it´s very disturbing and everybody I tell this dream thinks me mad. I will tell you the whole story. Years ago, in one of my dreams I came upon a big wall. The height of it you can´t even begin to imagine. I became curious what would lie behind this wall and I spent many a night looking for a way to the other side.@"); + + say("@One night dreaming I found a big, wooden, ancient-looking door. I was happy but that lasted only for a moment as I found the door locked. Desperation overwhelmed me. I hammered against it but naturally it wouldn´t budge. ´T was far too massive. I tried looking through the keyhole but all I could see was darkness. After this failure I tried to forget about that wall. But often in my dreams I found myself standing before this door trying to open it. So eventually I started looking for a key. Years passed in real life and in my dreams I kept on looking for the key. I found many but none ever fitted.@"); + + say("@Finally one day I discovered what I did wrong. I only searched in my dreams but wasn´t it possible that it´s actually a real, solid key? So I started to spend my waking hours searching as well. and at least I found it. Ironically it was in possession of my very family. My great-grandfather got it as an gift from a gypsy he saved from drowning. He passed it on to his son when he died and so did my grandfather. and when my father died I was the one to get it. The key was very old looking and solid gold and from the first moment I held it in my hand I knew it to be the very key. So the next night I went to bed with the key hanging around my neck. and in my dream I found myself still wearing it. What is there left to say. It did open the door. But after all these years I hesitated to step through it. Then with all my courage I did it. I took a deep breath and the last steps.@"); + + say("@And what joy. I seemed to be standing in another reality. It was like waking up, though it wasn´t the world I knew. The air smelled fresh of nature, strong scents of blossoming flowers and everything was green. I know this sounds stupid but you of all people should be able to understand it.@"); + + say("@There was no one in sight , at first. Then I saw a dark spot in the sky. It seemed to be moving and soon I recognized it to be a winged creature. But don´t think this being looked anything like you as when it drew nearer it frightenly looked more and more like a creature out of the Abyss. As big as me with black leathery wings. Her skin black as the night she looked as if she came straight from hell. Then she landed right before me and suddenly she didn´t frighten me anymore. Quite the opposite. She was gorgeous. This fallen angel. Love at first sight.@~~"); + + say("@She was a dark-dweller no use denying it but her beauty enchanted me. With an inhuman grace she came very close to me. Her red hair was in beautiful contrast to her black wings. She looked me straight in the eyes. Impossible to describe this pair. Their colour was purple with golden spots but that is really an insufficient description of their fineness. Without saying one word this She-devil kissed and embraced me.@"); + + say("@Our bodies unconsciously swayed to the shrill, faint piping of the oldest music, a rhythm of wind and water. A tune so very deep and intimate. I felt like I never felt before. I knew at once that with her I´m whole, complete. No one but her...@"); + + say("@And just as I thought this moment would last forever, the rooster crowed and I was forced through the ominous door and woke up. This is how it usually goes. In some dreams I can´t even find my way to the door but when I find it sooner or later meet her as well. I always have to wake up and the time with her always seems much too short, and there´s my wish. Let me sleep here protected by the stones and toadstools and never ever let me wake up again. I´d rather spend my life in this dream with my fair dark-dweller than here in this gray world in which everyday is just an endless struggle to survive.@~~"); + + say("After I finished telling the faerie of my reoccuring dreams, she responded:~~"); + + say("@You spoke like I expected you to. Thy wish shall be granted. Protected in this magic circle you´ll sleep eternally ´till Armageddon wipes everything away.@ She motioned me to lie down and as I did she made some gestures and chanted words I never herd before. Almost at once I was standing in front of the door to the mysterious land. Without hesitation I stepped through into a new life..."); + + } + else if (qual == 8) + { + + showBook(); + + + say("~~THE ARCHER’S LAMENT ~~ ", + + "~~by Fenwick the bard~~~~*"); + + say("~ Dear reader, sit and let me tell you a tale of a young ranger by the name of Larson, greatest hunter in a village long since forgotten by time. This man was betrothed to wed a young lass by the name of Sigourney and all was happy in his life… until invaders from beyond the Sea of Sand came and burned his village. Though Larson fought bravely, Sigourney was kidnapped and taken to the distant city of Goratesh.~*"); + + say(" Larson, being a brave sort, took up his bow and arrows and set out after his love. On his journey he saved Anisha, proud warrior princess of the Mesa Haran and sworn enemy of the men who came from the Sea of Sands. Through the great cities of the Hruntir Coast, down through the Belly of the Great Golem Aranoth and out past Gecko’s Marsh they adventured, saving village and town as they went until, finally, the Sea of Sand stretched before them.~~"); + + say(" 'If I cannot choose, then I shall have my arrow choose for me, as it is my skill with a bow that has saved one and impressed another.' Larson finally decided. 'I shall blindfold myself shoot an arrow into yonder grove of palm trees. Should the arrow hit a tree, I will marry Sigourney. If it misses, Anisha shall be my bride.'~~"); + + say(" With these words, both Sigourney and Anisha realized that the man they thought they loved was naught more than a woodsy dolt of a ranger and crept off while Larson was blindfolded. Both lived happy, fruitful lives while Larson went back to his village and grew old alone.~~"); + + say(" And the moral of this story, dear reader? When given a choice, never leave it up to fate, lest you lose it all through indecision..."); + } + + else if (qual == 9) + { + showBook(); + + + say("~~LADY SILVERLEAVES ~~ ", + + "~~by Keltias~~~~*"); + + say("~Oh fair Lady Silverleaves,"); + say("Thy heart didst belong among thine trees,"); + say("For ever and more thy spirit shall sing,"); + say("Among sandy shores and mossy things.~~"); + + say("In misty land by southern sea,"); + say("Of shrouded shadow, and mystery,"); + say("Thy example shone, thy virtues bright,"); + say("And banished back all forces of night.~~*"); + + say("Oh fair Lady Silverleaves,"); + say("Thy courage hath art, some few didst see,"); + say("Thou wispered them, of nature's need,"); + say("Thou shared thy secrets, and thy creed~~*"); + + say("As mountains solid, erode to sand,"); + say("Thy body rests, thy will yet stands"); + say("For we remember, even as we grieve,"); + say("We carry thy strength, fair Lady Silverleaves~"); + + + } + + else if (qual == 10) + { + showBook(); + + say("~~My research on Windemere~~ ", + + "~~by Brion the scribe~~~~*"); + + say("~ The isle of Windemere was a stronghold for the Oppression, long since abandoned. Upon the return of our liege Lord British, and the banishment of Blackthorn, Windemere proved to be a stubborn holdout of the Oppression.~~"); + say("~ The Royal Navy layed siege to the mountain stronghold for nearly a week, bombarding the place with cannon shot. Eventually the island stronghold fell and it's inhibants captured or slain. Rumors abound that Thrud and Elistaria hath sold their souls to Blackthorn and bound themselves to the stronghold and the Oppression.~~"); + say("~ My research hath brought me here to live amongst the ruins in search of their restless spirits to prove or disprove them...~"); + + + } + + + + else if (qual == 17) + { + showBook(); + + say("~~The Empire ~~ ", + + "~~by Captain Hawkins~~~~*"); + + say("~This book appears to be the log of a ship called 'The Empire.' The last entry speaks of the burying of a great treasure, and of the growing discontentment of the crew. There's a hastily scrawled note at the end, in different handwriting, that says 'Captain Hawkins won't be makin' no more log entries.'"); + + } + + + else if (qual == 18) + { + + showBook(); + + + say("~~Gargopology Vol. 1 ~~ ", + + "~~Study by Melinus~~~~*"); + + say("~Herein this tome are detailed sketches and diagrams of gargoyle skulls, both winged and wingless, and a compilation of what information was gleaned from them."); + + say("~'..I noticed that winged gargoyles and unwinged gargoyles are probably different species. My recent studies regarding some gargoyle skulls obtained from felled corpses on the battlefields suggest some interesting features about them.~ + + Winged gargoyle skulls are extremely dolicocephalic and somewhat thin compared to their smaller unwinged counterparts and while this could have served to enhance their aerodinamicity, it also widened their cranial vault and subsequently their brain size.~ + + Unwinged gargoyle skulls are a lot more brachicephalic and with a thicker skull. Their mandibles are also a bit bigger compared to those of winged gargoyles and they've got 24 teeth (4 more than their relatives). Their nasal cavities are also bigger and this could mean they're more capable of perceiving odors. I've got no evidence to prove that these are olfactive cavities though as they may be a strange sort of ear.~ + + Sadly, I still haven't got enough gargoyle samples to know more about these fascinating species, as they have proved to be an extremely difficult foe. A future study of their costumes may be the key to a faithful reconstruction of their prehistory...'."); + + + } + + else if (qual == 24) + { + showBook(); + + say("~~Snilwit's Big Book of Boardgame Strategy ~~ ", + + "~~ by Snilwit~~~~*"); + + say("~~Chess: Try to control the middle of the board with your knights, bishops and pawns. ~~* "); + + say("~~Nine Men's Morris: Don't let any of your pieces get trapped in the corners. ~~*"); + + say("~~Draughts: Keep your pieces along the sides of the board, where they can't be captured."); + + } + + else if (qual == 26) + { + if (!gflags[LEARNED_MANTRA_SPIRITUALITY]) + { + gflags[LEARNED_MANTRA_SPIRITUALITY] = true; + } + showBook(); + say("~~The Book of Spirituality~~*"); + + say("~~In your travels through life, remember always that Spirituality embodies the sum of all virtues. Chant the mantra 'om' as you meditate on Spirituality, and all will become clear to you...~~"); + } + + + else if (qual == 27) //Drudgeworth's manifesto + { + + showBook(); + say("~~Manifesto of Drudgeworth the Mad~~*"); + + say("~~ I awoke yesterday, lying face down in the sands upon a strange shore, feeling the waves lightly breaking over me up to my waist before gently receding. ~"); + say("~ I surveyed my personal self... My head pounded and I appeared to be quite bloody and battered... Aye surveyed my immediate surroundings and suddenly came to the realization that not only did I have no idea where I was; but I had no memory of the events that unfolded. My ship 'The Barnacle', I painfully observed, had been run completely aground into a rocky crag, utterly wrecked beyond repair! Too exhausted to do much other than drag myself out of the surf and sleep this night..*~"); + say("11/2/137 ~~ Aye rummaged through the wreck of the Barnacle today, I saw what became of me mates. We were barely two days sail out of Buccaneers Den, attempting to move along the northern coast of the mainland bearing due east.. On the eve of the second day we swiftly approached what looked to be an brightly lit unarmed merchant ship ripe for plundering. I gave the order to load the cannon's and approach 'er with all due caution... Instead we were taken quite by surprise as we were ambushed during the approach by no less than two well armed frigates! It was a ruse!~~"); + say("We never got off even a shot as we were boarded by the second frigate. During the ensuing fight that raged onboard I was knocked nearly unconscious.. I remember being thrown overboard.. Mine ship was lit afire and ultimately ran aground. Me Mates, the pur bastards, all died in the inferno.. I should 'ave died with em!! By Mondain's Skull; I shall avenge their deaths! This aye swear!~"); + say("The only things I found salvageable from the wreck were a rusty cutlass, plenty of charcoal from among the charred deck planking, a half filled jug of fresh water, and much to my surprise, this empty journal. My captain's log is charred almost beyond recognition. This coal seems to work well enough though to scrawl in this book... I said a final farewell to me mates and left the ship for the last time. All the food stores were lost in the wreck. I'd give mine right arm for a bottle of rum and a simple bit of food!*"); + say("11/16/137~~ Been wanderin for days in the swamp, found meself back to the wreck of the Barnacle. The bloated bodies of me shipmates are still here... Gulls pecking at their eyeballs! A revolting sight to be sure. Sorry lads, I never thought it would come to this, but I had to have somethin to eat..."); + say("11/24/137~~ Headed west from the shipwreck, reached the midpoint of the plains today as near as I can tell. The plains be terrifying at night.. I saw a foul spectre that did wail at me as it floated by! I struck at it several times with mine cutlass, yet it did not fall!~ The full moon is high in the sky and I hear what sounds to be a thousand swordsmen all fighting some terrible battle all around me. Hideous guttural sounds of animals dying and the tortured screams of hundreds of men; the likes of which I've ne'er heard in all mine life. Yet peering through the thick haze I see absolutely nothing! The ground under mine feet is now literally running with blood.. this cannot be happening.. I must be going mad!!"); + say("12/20/137~~ Today I woke up in a bed, with no recollection of how I got here.. my journal on the stand with a fresh inkwell and quill, a blank page dated with today's date. My cutlass hath gone missing. Several other beds nearby with patients. I must have been rescued by someone or something in my sickness whilst in the swamps. I've been unconscious for the better part of a month if this date is to be believed! My strength is slowly coming back to me and my wounds are healing, I will have to leave here soon...*"); + say("12/24/137~~Fortunately I recorded the disasters that happened to me during the midnight hours of the 23rd after leaving the confines of Minoc. My memory was still fresh of the events; ~I was gently shaken awake by a woman who identified herself as Regina the healer, and her assistant Sahra. Regina told me that they had found me wanderin around the swamps, starving, barely conscious and delierious from the effects of eating nightshade mushrooms, lucky to be found alive by Blackthorn's knights. I inquired of my effects, and she told me they were upstairs in a footlocker."); + say("Knights of Blackthorn? I spared them no detail of mine hatred for both him and Lord British's laws. Sahra seemed to be taken back by mine disdain for Blackthorn...~"); + say("As I was retrieving my effects from the footlocker, without warning a violent shudder suddenly passed through the core of my being, causing me to fall to mine knees for several minutes.. When I recovered; rage filled me beyond belief. I descended the ladder to find Regina and Sahra conspiring together. They approached me with an evil grin, and a foul smelling potion in hand. They demanded 500 crowns for my treatment right then and there, even though they said it twas free nary ten minutes ago! We scuffled, and I wrestled the potion out of Sahra's hands and forced it down her throat. She began to make gurgling noises and foaming at the mouth, and collapsed. Her body started turning a grey ashen color as she convulsed. As I made my escape, I noticed several of the patients dead with the same color and foaming at the mouth...~"); + say("~As I exited and closed the door behind me my gaze fixed on an extremely ominous figure dressed in a black cloak. Blacker than the shadows of the night itself this apparition was.! A wave of utter fear ran down my spine as it stared in my direction.. This night, I ran to the gate and out of town terrified into the woods..*"); + say("1/25/138~~ Since my strange experience in Minoc, I have found some fortune at last. I met up with a lass by the name of Lucy at the poorhouse. I told 'er stories of mine travels, and told 'er I'd make her a rich woman if she comes with me. Her beauty will fetch a fair price..*"); + say("3/5/138 ~~ Arrived here in Britain weeks ago with Lucy, living a luxurious life. The gold be pouring in like wine, Lucy has caught the eye of many lusty nobleman.. even Lord British's jester. The stories Lucy tells me of that lunatic's depravity makes me shudder.. but he promises to pay extra crowns for her exclusivity...*"); + say("3/25/138 ~~ Chuckles is late on reconciling the 'tab' he has run up on Lucy. The bloody foole thinks that because his Liege is gone, he is above the morality of paying one's debts.. We'll see about that!"); + say("4/2/138 ~~ Aye put the plan in motion.. but something went wrong. The green concotion t'werent supposed to kill her..only put her into a deep sleep.. but Chuckles depravity sent her over the edge. The foole came to me in a panic, wantin me to help hide er body until his liege returned. Said he'd meet me at the Royal Mint tonight and arrange for the guards to be absent, to settle his debt and then some. Should be able to retire a very rich man after this is over, but I must no longer tarry in Britain after this day..."); + + + if (!gflags[MET_DRUDGEWORTH] && UI_find_nearby_avatar(1266)) //drudgeworth mirror + delayedBark(AVATAR, "I saw a figure standing in that mirror!", 3); + + } + else if (qual == 30) + { + showBook(); + say("-------------------------test*"); + + say("000000000000000000000 ~ test*"); + say("111111111111111111111111111111122"); + } + + + else if (qual == 32) + { + showBook(); + + say("~~~~TITLE"); //should be line 5 + say("~~~~by AUTHOR*"); //line 9 and includes page break. + + + + + } + + else if (qual == 33) + { + showBook(); + + + + } + + else if (qual == 34) + { + showBook(); + + + + } + + else + original_book.original(); + + + + + } + + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/books.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/books.uc new file mode 100755 index 0000000..d96a27a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/books.uc @@ -0,0 +1,312 @@ +void showBook1 () + +{ + var SOUND_BOOK = 14; + //Play book sound: + + UI_play_sound_effect2(SOUND_BOOK, item); + + + //Start book mode for current item: + + book_mode(); + +} + + +void book shape#(1171) () +{ + var player_name = getAvatarName(); + var qual = UI_get_item_quality(item); + var msg; + var sound; + if (event == DOUBLECLICK) + { + +// * denotes page break +// ~ equals 'enter' for space + if (qual == 0) + { + showBook(); + + + say("~~ ~~Captain's log - The Empire~~", + + "~~by Ventara~~", + + "~~Day 1- I, Ventara, now Captain of the Empire in the post-Hawkins era, set sail with a new crew in search of Hawkins' treasure without the aid of the complete map. The others have retired, and will ne'er expect that I'll keep looking! I'll keep it all to meself!*"); + + say("~~Day 10 ~~The crew be still in good spirits. My former shipmates proberly don't even know I slipped out o' the 'Den yet with the Empire, too drunk in celebration over Hawkins' demise. I be too calculating for them scumbags. The blood o' Hawkins didn't even dry on the timbers of the Empire before I plotted my next move!*"); + + say("~~Day 14 ~~Narrowly evaded the Royal Navy. The Empire still be a grand vessel, and with Ventara as Captain, we'll ne'er be caught. Will stop soon on a nearby island to patch a hole from the cannonball that grazed the ship. Blasted Lord British and his Navy!*"); + + say("~~Day 23 ~~After a few false leads, I am confident that this next island be the one that Hawkins buried his swag. We'll reach it by sundown. The crew eagerly awaits the treasure... the greedy bastards.*"); + + say("~~Day 24 ~~So I was wrong. No treasure here. Slight miscalculation, blasted sextant! Damn Hawkins' wretched soul!*"); + + say("~~Day 30 ~~They were eying me again today. Those rats don't think I know, but I know. 'Twas the same look we gave Hawkins before we gutted him. But they'll not get Captain Ventara, oh no. I knows their plots. The promise of treasure will only negate their bloodlust for so long, but I feel I am close to the treasure...*"); + + say("~~Day 33 ~~Sent me first mate to a watery grave as an example to anyone thinking any idears. I'll not share my treasure with these dogs. I will use them long enough to get to the location where the treasure is buried. I believe I can lose them along the way, I'll remember where our traps were set. I'll retire a very rich man.*"); + + say("~~Day 45 ~~Damn the storms.. visibility is low. The past several days the waters have been rough due to the earthquakes. The crew begs me to abandon the expedition. I'll have none o'that! They'll not keep me from the treasure! Through the storm, I can see the monolith that marks the spot! This is it!*"); + + + + } + + else if (qual == 1) + { + + showBook(); + + say("~~ A CITY DWELLER GUIDE TO THE COUNTRYSIDE ~~ ", + + "~~by LaFey~~~~*"); + + say("~~Within this volume the author, an inhabitant of Britain, describes his countryside strolls with particular emphasis on the inns, taprooms and patrons therein.~~~"); + + say("...and when I reached Paws the light was already fading and a cold breeze was blowing from the east. The quaint village inn beckoned me inside invitingly. It was only a matter of wiping my dusty boots and before long I sat with the local folk, sipping from ceramic mugs and discussing threads, fabrics or local gossip. The ale was sufferable and the cost a trifle. After I had opened my pouch to buy a third round the conversation shifted from the affairs of weavers to the affairs of the court..."); + + + + + } + + else if (qual == 2) + { + + showBook(); + + + say("~~ DAEMON DREAM ~~ ", + + "~~by Dom~~~~*"); + + say("~~Once I spent some time far away in the north. A legendary country in which the ancient druids are said to have celebrated their secret rites. But these dark ages are long gone, as I thought. I stayed with some old friends of the family in a small town. At this time I didn´t feel too well. The world didn´t seem very attractive to me. In my sleep my dreams were troublesome and when I was awake I didn´t feel in tune with the flow of everyday life. At daytime I longed for a dreamful night and at night I dreaded the coming long cruel day. So I decided to take some time and as you will read the events proved me right.~"); + + say("As I had nothing else to do I often went for long walks exploring the country. One day I strolled through the woods though I knew better as the villagers had repeatedly warned me against it. They claimed that the forest was haunted. Strange lights and noises have been seen and heard. Inhuman creatures were said to live there. The stories of inexplicable things happening were plenty. But I sneered at all this superstitious nonsense. We live in a modern age so why heed such foolish warnings. At least I thought them foolish.~~"); + + say("After hours of nature´s beauty I came upon an odd circular clearing where everything seemed peaceful and quiet. It was a nice day and I was a little exhausted so I decided to rest some time. I lay down in the opening and the afternoon sun. It didn´t take me long and my eyelids felt heavy and I couldn´t stay awake anymore. Before I was lost in a dreamless sleep it briefly struck me that the clearing lay in a perfect ring of odd-shaped stones and toadstools. But then my thoughts were already too confused to make anything of it...~~"); + + say("Hours later I woke up and it was already dark. I looked up at the sky. The moon was full. I began to feel uncomfortable as I had to think about the superstitious locals who´d told me repeatedly that strange things used to happen in these so-called mystical woods. Then I remembered that I was standing in a circle of stones and toadstools and isn´t there a story to those rings? I decided that it was high time to take a fast exit and get out of this forest. But as soon as I got near the edge of the circle the stones emitted a strange green light and I could hear a faint chanting. I had to slap myself to see if I was by chance still asleep and only dreaming, but the pain only stung and the light just shone brighter.~~"); + + say("Suddenly, there were small dark spots in the light which drew closer to me. I could make out that these were some kind of creatures which looked like faerïes. Faerïes??!! You know, very small naked people with wings who are often mentioned in old tales, songs and legends. I always thought they were just that - legends. Obviously they were real - or me just a nutcase. They flew gracefully around me and I overheard them speaking about me in their delicate thin voices. I was astonished and just stood there watching these beautiful entities.~~"); + + say("They then disappeared, all but one. She was obviously a female specimen and quite a beauty. She seemed slightly bigger as the others and she had an air about her that demanded unshared attention. She hovered on eye-level with me and began to speak :~~"); + + say("@Human fool! How dare you intrude our peaceful forest? Aren´t you satisfied destroying the world outside? Must you bring your human destructiveness even here? Are you willing to take this place as well?@~~"); + + say("@I ... I didn´t mean to disturb you and I regret deeply what my people did to our home. In trying to escape and to find a little peace I came here. I humbly apologize my intruding. There was no ill intended.@ I replied.~~"); + + say("@Mortal, I know you very well and this was just a little test. To see if you changed in these past ages.@~~"); + + say("@Now wait a minute! Do I have this right? You know me? Ages? May I ask you what you are talking about?@~~"); + + say("@Listen! Know that I´m the Queen of the faerïes and thus knew a long time ago that you would eventually be lead to this place again. In ancient times it was decided to grant you a wish if you are able to answer a simple question.@~~"); + + say("@Again?@ I questioned. @Never before in my life was I here. How do I deserve a wish? I´m no one special, just a ...@~~"); + + say("@You are far more. You always were. A friend of my people. In every life you helped us with your magic and now we are going to give you what your heart desires.@~~"); + + say("@Magic? I know nothing of magic and I certainly don´t believe in reincarnation ... But I also don´t believe in faerïes. and now I´m standing here in green light, arguing with the very Queen of the faerïes. It´s more probable that I drank to much in the tavern and I just dream this.@~~"); + + say("@´Tis no dream and let me assure you in former life, you were quite a magician. But now enough of this foolish talk. I know you, rest assured. Never could I mistake your bright burning light for someone else´s. Listen! I´ll ask you now a question that will change your life. Name the five elements ancient mages knew to master.@~~"); + + say("I answered, @That´s easy. It´s fire, water, earth. air and...@ A fifth element? I never before heard of another element. What the ... was she talking about anyway. Me a magician! Ha! Who was the crazy person here? What element...@ I thought."); + + say("As I strenuously thought about magic and a fifth element something deep in me stirred. Ancient knowledge flooded my consciousness but it was gone before I could really grasp it. But I could then clearly see the truth in her words and most importantly, I knew the answer to her little quiz.~~"); + + say("@It´s ether!@, I exclaimed.~~"); + + say("@Congratulations@ said the faerie. @I had my doubts you could remember these very old lessons but you did it. Now, think of your deepest desire. Name it and your wish shall be granted.@~~"); + + say("@You know, I have this dream that haunts me. At first it was quite harmless but now it´s very disturbing and everybody I tell this dream thinks me mad. I will tell you the whole story. Years ago, in one of my dreams I came upon a big wall. The height of it you can´t even begin to imagine. I became curious what would lie behind this wall and I spent many a night looking for a way to the other side.@"); + + say("@One night dreaming I found a big, wooden, ancient-looking door. I was happy but that lasted only for a moment as I found the door locked. Desperation overwhelmed me. I hammered against it but naturally it wouldn´t budge. ´T was far too massive. I tried looking through the keyhole but all I could see was darkness. After this failure I tried to forget about that wall. But often in my dreams I found myself standing before this door trying to open it. So eventually I started looking for a key. Years passed in real life and in my dreams I kept on looking for the key. I found many but none ever fitted.@"); + + say("@Finally one day I discovered what I did wrong. I only searched in my dreams but wasn´t it possible that it´s actually a real, solid key? So I started to spend my waking hours searching as well. and at least I found it. Ironically it was in possession of my very family. My great-grandfather got it as an gift from a gypsy he saved from drowning. He passed it on to his son when he died and so did my grandfather. and when my father died I was the one to get it. The key was very old looking and solid gold and from the first moment I held it in my hand I knew it to be the very key. So the next night I went to bed with the key hanging around my neck. and in my dream I found myself still wearing it. What is there left to say. It did open the door. But after all these years I hesitated to step through it. Then with all my courage I did it. I took a deep breath and the last steps.@"); + + say("@And what joy. I seemed to be standing in another reality. It was like waking up, though it wasn´t the world I knew. The air smelled fresh of nature, strong scents of blossoming flowers and everything was green. I know this sounds stupid but you of all people should be able to understand it.@"); + + say("@There was no one in sight , at first. Then I saw a dark spot in the sky. It seemed to be moving and soon I recognized it to be a winged creature. But don´t think this being looked anything like you as when it drew nearer it frightenly looked more and more like a creature out of the Abyss. As big as me with black leathery wings. Her skin black as the night she looked as if she came straight from hell. Then she landed right before me and suddenly she didn´t frighten me anymore. Quite the opposite. She was gorgeous. This fallen angel. Love at first sight.@~~"); + + say("@She was a dark-dweller no use denying it but her beauty enchanted me. With an inhuman grace she came very close to me. Her red hair was in beautiful contrast to her black wings. She looked me straight in the eyes. Impossible to describe this pair. Their colour was purple with golden spots but that is really an insufficient description of their fineness. Without saying one word this She-devil kissed and embraced me.@"); + + say("@Our bodies unconsciously swayed to the shrill, faint piping of the oldest music, a rhythm of wind and water. A tune so very deep and intimate. I felt like I never felt before. I knew at once that with her I´m whole, complete. No one but her...@"); + + say("@And just as I thought this moment would last forever, the rooster crowed and I was forced through the ominous door and woke up. This is how it usually goes. In some dreams I can´t even find my way to the door but when I find it sooner or later meet her as well. I always have to wake up and the time with her always seems much too short, and there´s my wish. Let me sleep here protected by the stones and toadstools and never ever let me wake up again. I´d rather spend my life in this dream with my fair dark-dweller than here in this gray world in which everyday is just an endless struggle to survive.@~~"); + + say("After I finished telling the faerie of my reoccuring dreams, she responded:~~"); + + say("@You spoke like I expected you to. Thy wish shall be granted. Protected in this magic circle you´ll sleep eternally ´till Armageddon wipes everything away.@ She motioned me to lie down and as I did she made some gestures and chanted words I never herd before. Almost at once I was standing in front of the door to the mysterious land. Without hesitation I stepped through into a new life..."); + + } + else if (qual == 3) + { + + showBook(); + + + say("~~THE ARCHER’S LAMENT ~~ ", + + "~~by Fenwick the bard~~~~*"); + + say("~Dear reader, sit and let me tell you a tale of a young ranger by the name of Larson, greatest hunter in a village long since forgotten by time. This man was betrothed to wed a young lass by the name of Sigourney and all was happy in his life… until invaders from beyond the Sea of Sand came and burned his village. Though Larson fought bravely, Sigourney was kidnapped and taken to the distant city of Goratesh.~*"); + + say("Larson, being a brave sort, took up his bow and arrows and set out after his love. On his journey he saved Anisha, proud warrior princess of the Mesa Haran and sworn enemy of the men who came from the Sea of Sands. Through the great cities of the Hruntir Coast, down through the Belly of the Great Golem Aranoth and out past Gecko’s Marsh they adventured, saving village and town as they went until, finally, the Sea of Sand stretched before them.~~"); + + say("'If I cannot choose, then I shall have my arrow choose for me, as it is my skill with a bow that has saved one and impressed another.' Larson finally decided. 'I shall blindfold myself shoot an arrow into yonder grove of palm trees. Should the arrow hit a tree, I will marry Sigourney. If it misses, Anisha shall be my bride.'~~"); + + say("With these words, both Sigourney and Anisha realized that the man they thought they loved was naught more than a woodsy dolt of a ranger and crept off while Larson was blindfolded. Both lived happy, fruitful lives while Larson went back to his village and grew old alone.~~"); + + say("And the moral of this story, dear reader? When given a choice, never leave it up to fate, lest you lose it all through indecision..."); + } + + else if (qual == 4) + { + showBook(); + + + say("~~LADY SILVERLEAVES ~~ ", + + "~~by Keltias~~~~*"); + + say("~Oh fair Lady Silverleaves,"); + say("Thy heart didst belong among thine trees,"); + say("For ever and more thy spirit shall sing,"); + say("Among sandy shores and mossy things.~~"); + + say("In misty land by southern sea,"); + say("Of shrouded shadow, and mystery,"); + say("Thy example shone, thy virtues bright,"); + say("And banished back all forces of night.~~*"); + + say("Oh fair Lady Silverleaves,"); + say("Thy courage hath art, some few didst see,"); + say("Thou wispered them, of nature's need,"); + say("Thou shared thy secrets, and thy creed~~*"); + + say("As mountains solid, erode to sand,"); + say("Thy body rests, thy will yet stands"); + say("For we remember, even as we grieve,"); + say("We carry thy strength, fair Lady Silverleaves~"); + + + } + + + else if (qual == 5) + { + showBook(); + + say("~~The Empire ~~ ", + + "~~by Captain Hawkins~~~~*"); + + say("~This book appears to be the log of a ship called 'The Empire.' The last entry speaks of the burying of a great treasure, and of the growing discontentment of the crew. There's a hastily scrawled note at the end, in different handwriting, that says 'Captain Hawkins won't be makin' no more log entries.'"); + + } + + + else if (qual == 6) + { + + showBook(); + + + say("~~Gargopology Vol. 1 ~~ ", + + "~~Study by Melinus~~~~*"); + + say("~Herein this tome are detailed sketches and diagrams of gargoyle skulls, both winged and wingless, and a compilation of what information was gleaned from them."); + + say("~'..I noticed that winged gargoyles and unwinged gargoyles are probably different species. + My recent studies regarding some gargoyle skulls obtained from felled corpses on the battlefields suggest some interesting features about them.~ + + Winged gargoyle skulls are extremely dolicocephalic and somewhat thin compared to their smaller unwinged counterparts and while this could have served to enhance their aerodinamicity, it also widened their cranial vault and subsequently their brain size.~ + + Unwinged gargoyle skulls are a lot more brachicephalic and with a thicker skull. Their mandibles are also a bit bigger compared to those of winged gargoyles and they've got 24 teeth (4 more than their relatives). Their nasal cavities are also bigger and this could mean they're more capable of perceiving odors. I've got no evidence to prove that these are olfactive cavities though as they may be a strange sort of ear.~ + + Sadly, I still haven't got enough gargoyle samples to know more about these fascinating species, as they have proved to be an extremely difficult foe. A future study of their costumes may be the key to a faithful reconstruction of their prehistory...'."); + + + } + + else if (qual == 7) + { + showBook(); + + say("~~Snilwit's Big Book of Boardgame Strategy ~~ ", + + "~~ by Snilwit~~~~*"); + + say("~~Chess: Try to control the middle of the board with your knights, bishops and pawns. ~~* "); + + say("~~Nine Men's Morris: Don't let any of your pieces get trapped in the corners. ~~*"); + + say("~~Draughts: Keep your pieces along the sides of the board, where they can't be captured."); + + } + else if (qual == 8) + { + if (!gflags[LEARNED_MANTRA_SPIRITUALITY]) + { + gflags[LEARNED_MANTRA_SPIRITUALITY] = true; + } + showBook(); + say("~~The Book of Spirituality~~*"); + + say("~~In your travels through life, remember always that Spirituality embodies the sum of all virtues. Chant the mantra 'om' as you meditate on Spirituality, and all will become clear to you...~~"); + } +/* + else if (qual == 9) + { +// if (gflags[READ_GARGISH_SCROLL]) +// { + showBook(); + say("~~The Book of Ritual~~"); + say("~~by Naxatilor the Seer~~"); + say("~~Heed well as I, Naxatilor, write of how I brought the Codex to our land and thereby ushered in the time of prosperity:* + With the help of the Lensmaker I crafted the Vortex Lens, by which I could see the Codex where it originally rested.* + I created the Vortex Cube to focus the power of the Moonstones and draw the Vortex down to the world.* + Then I used the lens to form an image of the Codex upon the cube.* + The Vortex touched our plane, the image became solid, and the Codex was brought down to be used properly by our race!"); + if (!READ_BOOK_RITUAL) + gflags[READ_BOOK_RITUAL] = true; +// } +// else +// { +// showBook(); +// say("~~Kodeks rit~~*"); + +// say("~~vervid ben kua i, naksatilor, skri kuo i porle kodeks uide terreg ew estade kalle ante tim benommani: ku auks lorrelinlem i beninle vorteks lorrel, o kua i le vid kodeks kuater lem terinit anporle. i inle vorteks kuad re inbet grav ok orblap ew trakpor vorteks destrak termur. estatim i perle lorrel re inuislor kodeks ad kuad. vorteks tanle uide terailem, uislor inle ailemde, ew kodeks porle des re perle bende pa uide zenmur.~~"); + +// } + + } +*/ + + else + { + + showBook(); + say("This is not a valid scroll QUAL attribute! Stop cheating!"); + + } + + + + + + + + + + + } + + +} + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/bottle.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/bottle.uc new file mode 100755 index 0000000..61874e0 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/bottle.uc @@ -0,0 +1,98 @@ +void Bottle shape#(616) () +{ + var target = UI_click_on_item(); + var AvatarFoodLevel = UI_get_npc_prop(UI_get_avatar_ref(), FOODLEVEL); + var party = UI_get_party_list(); + var target_coords = getClickPosition(item); + var rand = UI_die_roll(1, 10); + + const int SOUND_DRINK = 90; + const int BOTTLE_NUTRITION = 1; + + var CURRENT_AVATAR_BAL = UI_get_npc_id(LORD_BRITISH); //used because Avatar ID is for Karma + + if (event == DOUBLECLICK) + { + UI_close_gumps(); + + + if (target == UI_get_npc_object(AVATAR)) + { + if (AvatarFoodLevel < 31) + { + + addAvatarBAL(2); //should add it by '1' + + UI_set_npc_prop(AVATAR, FOODLEVEL, 1); //adds 1 to avatar's food levl + //addPartyBAL(1); //testing - add later + UI_play_sound_effect(SOUND_DRINK); + UI_remove_item(item); + + + + //maybe add if statement about Flag 40 + + script item after rand ticks + { + call drunkEventsAvatar; + }; + + + + } + else + { + UI_item_say(target, "No thanks."); + + } + + } + + //for (target in party) + + else + if (target in party) + { + var hunger = UI_get_npc_prop(target, FOODLEVEL); + var partyBAL = UI_get_npc_id(target); + + if (hunger >=30) + { + UI_item_say(target, "I'm not thirsty"); + + return; + } + else + { + UI_set_npc_prop(target, FOODLEVEL, 1); //food level up one + UI_play_sound_effect(SOUND_DRINK); //move + UI_remove_item(item); + + //assessBAL(target); + + + //for testing + + //stumble(target); + + + } + + } + + + + + + + + + + + + + } + + +} + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/crystal_ball.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/crystal_ball.uc new file mode 100755 index 0000000..3e600f1 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/crystal_ball.uc @@ -0,0 +1,87 @@ +//Crystal ball. Additional frame added for special ones like Nystul's crystal ball that shows quest locations. + +void crystal_ball shape# (0x2d9)() +{ + var frame = UI_get_item_frame(item); + + if (event == DOUBLECLICK) + { + if (frame == 1) + { + var rand = UI_get_random(5); + + //add 'bzzt' buzzing the Avatar for clicking too much as in original + if (rand == 3) + { + //play sound + UI_play_sound_effect(82); + delayedBark(AVATAR, "Yeow!!", 1); + UI_apply_damage(1, 1, MAGIC_DAMAGE, AVATAR); + + } + else + UI_display_area([1576, 1324, 0, 3]); //The Slab + + //add random locations for other crystal balls (Nicodemus?) + + } + } +} + +/* + //Nystul's crystal ball that hones in on quest locations + if (frame == 1) + { + //Locations - SHRINES: + var honesty_shrine; + var justice_shrine; + var honor_humility; + var humility_shrine; + var sacrifice_shrine; + var spirituality_shrine; + var compassion_shrine; + var valor_shrine; + + //Locations - RUNES: + var honesty_rune; + var justice_rune; + var honor_humility; + var humility_rune; + var sacrifice_rune; + var spirituality_rune; + var compassion_rune; + var valor_rune; + + var act_one_flags = [SACRIFICE_FREED, COMPASSION_FREED, VALOR_FREED, JUSTICE_FREED, SPIRITUALITY_FREED, HONOR_FREED, HUMILITY_FREED, HONESTY_FREED]; + + + + //RUNE //SHRINE //MANTRA + var honesty = [[2343,2966,0,1], [2847,2813], + + + + + //First act - Virtues: Honesty Valor Justice Humility Spirituality Honor Sacrifice Compassion + var mantra_locations = []; + var shrine_locations = []; + var rune_locations = []; + + + //First act of the quest: Find mantras, find runes, free the shrines. + + + //Second act - get pirate maps + + // 3rd act - get both lenses, vortex cube, gargoyle mantras, sacred quest + + + + + } + +*/ + + + +//} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/dagger.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/dagger.uc new file mode 100755 index 0000000..bc66662 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/dagger.uc @@ -0,0 +1,28 @@ +void dagger shape#(594) () +{ + const int SHAPE_TREE1 = 631; + const int SHAPE_TREE2 = 670; + const int SHAPE_TREE3 = 674; + const int SHAPE_TREE4 = 683; + const int SHAPE_TREE5 = 783; + const int SHAPE_TREE6 = 453; + const int SHAPE_TREE7 = 306; + const int SHAPE_KINDLING = 1024; + + var target; + var target_shape; + + var tree_shapes = [SHAPE_TREE1, SHAPE_TREE2, SHAPE_TREE3, SHAPE_TREE4, SHAPE_TREE5, SHAPE_TREE6, SHAPE_TREE7]; + if (event == DOUBLECLICK) + { + UI_close_gumps(); + target = UI_click_on_item(); + target_shape = UI_get_item_shape(target); + + if (target_shape in tree_shapes) + { + UI_add_party_items(1, SHAPE_KINDLING, QUALITY_ANY, FRAME_ANY); + } + else randomPartyBark("@You can't use the dagger on that..@"); + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/desk_item.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/desk_item.uc new file mode 100755 index 0000000..6521d30 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/desk_item.uc @@ -0,0 +1,72 @@ +void desk_item shape#(675) () +{ + const int SHAPE_PARROT = 1263; + const int FRAME_GLASS = 15; + const int SHAPE_BROKEN_DISH = 546; + const int FRAME_NYSTUL = 1; + + var frame = UI_get_item_frame(item); + var target_shape; + var target_frame; + + if (event == DOUBLECLICK) + { + + if (frame == 0) //gavel + { + var target = UI_click_on_item(); + var targetframe = UI_get_item_frame(target); + target_shape = UI_get_item_shape(target); + UI_error_message("targetframe is " + targetframe); + + if (targetframe == 10) //parrot + { + //parrot is hit, flies off perch. Bad Avatar! + UI_play_sound_effect(15); + UI_set_item_frame(target, 21);//set item to empty perch + + //create parrot at perch + var position = UI_get_object_position(target); + + //create Shape + var parrot = UI_create_new_object2(SHAPE_PARROT, position); + + + UI_item_say(parrot, "Squawk! You'll pay for that!"); + + //set parrot in combat mode + UI_set_alignment(parrot, EVIL); + UI_set_schedule_type(parrot, IN_COMBAT); + + + } + + if (target_shape == SHAPE_CRYSTAL_BALL && targetframe == 1) //Nystul's crystal ball + { + UI_error_message("Hitting crystal ball with hammer"); + UI_close_gumps2(); + + var crystal_ball = UI_find_nearest(AVATAR, SHAPE_CRYSTAL_BALL, QUALITY_ANY, FRAME_NYSTUL); + UI_set_item_shape(crystal_ball, SHAPE_BROKEN_DISH); + UI_set_item_frame(crystal_ball, FRAME_GLASS); + UI_play_sound_effect(37); + script AVATAR after 6 ticks + { + call teleportToCheatRoom; + + }; + + + } + else + desk_item.original(); + + } + else + desk_item.original(); + + + } + else + desk_item.original(); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/eggs.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/eggs.uc new file mode 100755 index 0000000..263e4be --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/eggs.uc @@ -0,0 +1,1469 @@ +//0xbc is trap egg, set something on, all attacks + + + + + +void Intro 0xD07() //3335 +{ + + if (event == EGG) + { + + UI_error_message("Cutsene intro begin"); + script item + { + //wait 5; + //call GenericPaletteUnfade; + call intro1; + }; + UI_remove_item(item); + + } +} +void gypsyIntro 0xD08()//3336 +{ + var avatarpos = [0184, 0696]; + if (event == EGG) + { + //Avatar should not have sword yet + UI_remove_party_items(1, SHAPE_SWORD, QUALITY_ANY, FRAME_ANY); + UI_remove_party_items(1, SHAPE_SWORD, QUALITY_ANY, FRAME_ANY); + + //make sure music flag is on to play tracks after convo ends. Can be turned off via ankh. + gflags[PLAY_ORIGINAL_TRACKS] = true; + + UI_remove_item(item); + //run to path 1 + AVATAR->set_item_flag(BG_DONT_MOVE); + UI_si_path_run_usecode(AVATAR, [avatarpos], DOUBLECLICK, GYPSYWOMAN, Gypsy, true); + + } +} + +void GypsyTravel 3002() //put in the castle. +{ + //Start game at 5:58am Day 1. + + if (event == EGG) + { + //get day via game day intrinsic + var game_day = UI_game_day(); + + //convert to 'day of the week' for gypsy schedules + var day = game_day - ((game_day / 7) * 7); + + UI_error_message("Gameday is " + game_day + ", day of week is " + day); + + //adjust gypsy / Mandrake's schedules according to day. + gypsySchedule(day); + + UI_run_schedule(MANDRAKE); + UI_run_schedule(TAYNITH); + UI_run_schedule(KARINA); + UI_run_schedule(ZOLTAN); + UI_run_schedule(KADOR); + + //make sure Blaine isn't in party first, so it doesn't mess with anything + if (!inParty(BLAINE)) + UI_run_schedule(BLAINE); + + + //Unrelated to gypsy travel, but doing some extra cleanup just in case- + // if BRAWLING flag is still somehow set from Jhelom or Bucs, clear it. (this happens sometimes?) + if (gflags[BRAWLING]) + gflags[BRAWLING] = false; + + } +} + +/* DISABLED +void IntroPartTwo 3003() +{ + if (event == EGG) + { +// script item { call beginCutsceneIntro2, MOONGATE_WANES2;}; + } +} + +void IntroPartThree 3004() +{ + if (event == EGG) + { +// script item { call beginCutsceneIntro3, AVATAR_FREE;}; + } +} +*/ + +// egg that is in the Moonglow house, after you purchase, it will clean it up the next time you show up. +void cleanHouse 3004() +{ + var garbage; + var quality = UI_get_item_quality(item); + + if (event == EGG) + { + if (quality == 1) + { + //house isn't clean yet + if (!gflags[MOONGLOW_HOUSE_CLEAN]) + { + randomPartyBark("@Wow, what a mess..@"); + gflags[MOONGLOW_HOUSE_CLEAN] = true; + UI_remove_item(item); + } + } + else + { + + if (gflags[MOONGLOW_HOUSE_CLEAN]) + { + //find items to remove: bloodstains/cobwebs + var bloodstains = UI_find_nearby(item, 912, 8, MASK_TRANSLUCENT); + var cobwebs = UI_find_nearby(item, 667, 8, MASK_TRANSLUCENT); + + //clean up bloodstains (shape 912) + for (garbage in bloodstains) //delete each bloodstain + UI_remove_item(garbage); + + //clean up cobwebs + for (garbage in cobwebs) //delete each cobweb + UI_remove_item(garbage); + + //remove egg + UI_remove_item(item); + } + + } + + } + +} + + + +//in front of Beyvin's crypt - gives you xp if you leave it and karma +void leaveFlowers 3005() +{ + if (event == EGG) + { + UI_close_gumps(); + + var flowers = UI_find_nearby(item, SHAPE_PLANT, 10, MASK_NONE); + var num_flowers = UI_get_array_size(flowers); + + //flowers found, check for daffodils + var count = 0; + var flower_frame; + var flower; + if (num_flowers > 1) + { + for (flower in flowers) + { + flower_frame = UI_get_item_frame(flower); + if (flower_frame == FRAME_DAFFODIL) + count += 1; + + + } + + //Daffodils seemed to be placed and not just moving one plant. give XP and delete egg + if (count > 1) + { + giveExperience(30); + + addKarma(10); + + + UI_remove_item(item); + + } + + } + else + return; + } +} + + +//egg that will check the condition for starting the brawl +void StartJhelomBrawl 3006() +{ + if (event == EGG) + { + var eggQuality = UI_get_item_quality(item); + var hour = UI_game_hour(); + + if (eggQuality == 0) + { + + if (hour >= 21 && !gflags[BRAWLING]) //9pm + { + gflags[BRAWLING] = true; + UI_error_message("Hour is " + hour + " , calling brawl engine"); + UI_play_music(25, 0); + script item + { + call BrawlEngineJhelom; + }; + + + + } + else + UI_play_music(20, 0); + } + else if (eggQuality == 1) //Bucs Den Brawling + { + + if (hour >= 0 && hour <=3) //0-3am + { + + UI_error_message("Hour is " + hour + " , calling brawl engine"); + UI_play_music(25); + script item + { + call BrawlEngineBucsDen; + }; + + + + } + else + UI_play_music(20); + } + else + abort; + } + +} + +void attackAvatar 3007() +{ + if (event == EGG) + { + var skeleton_list = UI_find_nearby_avatar(528); + var skeleton; + + for (skeleton in skeleton_list) + UI_set_schedule_type(skeleton, IN_COMBAT); + + if (isNearby(MORGOTH)) + UI_set_schedule_type(MORGOTH, IN_COMBAT); + } + +} + +void ShaminoKnowsDungeons 3008() // +{ + var quality = UI_get_item_quality(item); + var msg; + + if (quality == 0) + msg = "This is the Dungeon of Deceit."; + else if (quality == 1) + msg = "This is the Dungeon of Despise."; + else if (quality == 2) + msg = "This is the Dungeon of Destard."; + else if (quality == 3) + msg = "This is Hythloth."; + else if (quality == 4) + msg = "This is the Dungeon of Shame."; + else if (quality == 5) + msg = "This is the Spider Cave."; + else if (quality == 6) + msg = "This is the Swamp Cave."; + else if (quality == 7) + msg = "This is the Cyclops Cave."; + else if (quality == 8) + msg = "This is the Dungeon of Wrong."; + else if (quality == 9) + msg = "This is the Dungeon of Covetous."; + else if (quality == 10) + msg = "This is Buccaneer's Cave."; + else if (quality == 11) + msg = "This is Heroes Hole."; + else if (quality == 12) + { + + msg = "I don't think we're in Britannia anymore.."; + UI_error_message("flags set to visit Garg world via orb of moons"); + gflags[FOUND_CONTROL] = true; + gflags[FOUND_PASSION] = true; + gflags[FOUND_DILIGENCE] = true; + gflags[FOUND_SLAB] = true; + + UI_remove_item(item); + } + + if (event == EGG && inParty(SHAMINO)) + UI_item_say(SHAMINO, msg); + else + return; + +} + + +void TrinsicSched 3010() +{ + var hour; + var minute; + + if (event == EGG) + { + hour = UI_game_hour(); + minute = UI_game_minute(); + + if (hour == 11) //11am + { + IMMANUELLE->move_object([0x4d1, 0x8c7, 0x0]); + UI_set_schedule_type(IMMANUELLE, STANDTHERE); + IMMANUELLE->set_item_frame_rot(32); + + WHITSABER->move_object([0x4e8, 0x8d2, 0x0]); + UI_set_schedule_type(WHITSABER, EAT_AT_INN); + } + + if (hour == 13) //1pm + { + WHITSABER->move_object([0x51e, 0x8e7, 0x2]); + UI_set_schedule_type(WHITSABER, WANDER); + } + + if (hour == 14) //2pm + { + IMMANUELLE->move_object([0x4bb, 0x9a7, 0x0]); + UI_set_schedule_type(IMMANUELLE, LOITER); + + + } + + if (hour == 19) //7pm + { + WHITSABER->move_object([0x4a8, 0x8e6, 0x0]); + UI_set_schedule_type(WHITSABER, SLEEP); + } + + + if (hour == 20) //8pm + { + IMMANUELLE->move_object([0x4cf, 0x9a7, 0x0]); + UI_set_schedule_type(IMMANUELLE, SLEEP); + + } + + } + + +} + + + + + +//3016 used in quenton sidequest egg file +/* //disabled for now +void bell 3017() +{ + var hour = UI_game_hour(); + var minute = UI_game_minute(); + var frame = UI_get_item_frame(DAVER); + var schedule = UI_get_schedule_type(DAVER); + var bell = UI_find_nearest(item, SHAPE_BELL, 30); + + + if ((event == EGG) && (isNearby(DAVER))) + { + item->bellringer(); + + + } + +} + +*/ + +//used in front of Blue boar mirror. Makes sure Chuckles is there if flag is set when told to go there, and the time is right +void chucklesDeath 3017() +{ + var hour = UI_game_hour(); + var minute = UI_game_minute(); + var mirror_location = [1200, 1251, 0]; + + //var ghost_location = [1200, 1250, 0]; + + if (event == EGG) + { + + //time is between midnight and 6am, and you strongarmed Chuckles into waiting at the tavern by mentioning "Lucy" + if (hour < 6 && gflags[CHUCKLES_WAITS]) //moves Chuckles in front of the mirror + { + if (canTalk(CHUCKLES)) //checks to see if he's able to be there. If you killed him already, no point. + { + CHUCKLES->move_object([mirror_location]); + UI_set_schedule_type(CHUCKLES, WAIT); + UI_set_item_frame(CHUCKLES, 16); + UI_set_item_flag(CHUCKLES, SI_ZOMBIE); //to verify Chuckles is by the mirror + } + else + return; + } + else if (gflags[CHUCKLES_KILLED]) //already killed Chuckles, clean up egg + { + UI_remove_item(item); + + } + else + { + if (UI_get_item_flag(CHUCKLES, SI_ZOMBIE)) + UI_clear_item_flag(CHUCKLES, SI_ZOMBIE); //means he's not by the mirror anymore or time is wrong + + //var ghost = UI_find_object(FIND_ON_SCREEN, SHAPE_GHOST, QUALITY_ANY, FRAME_ANY); + UI_set_schedule_type(CHUCKLES, WANDER); + + //if (ghost) + // UI_remove_item(ghost); + + + return; + } + } + else + return; +} + + + + + + + +void GwennoSched 3018() +{ + var hour = UI_game_hour(); + var minute = UI_game_minute(); + + if (event == EGG && !inParty(GWENNO)) + { + + if (hour == 14) //2pm + { + GWENNO->move_object([0x6e7, 0x137, 0x0]); + UI_set_schedule_type(GWENNO, LOITER); + + } + + + if (hour == 16) //4pm + { + GWENNO->move_object([0x75c, 0x00f5, 0x1]); + UI_set_schedule_type(GWENNO, MAJOR_SIT); + + } + + if (hour == 17) //5pm + { + GWENNO->move_object([0x75c, 0x00f5, 0x1]); + UI_set_schedule_type(GWENNO, MAJOR_SIT); + } + + + } + +} + + + +void GwennoPlayflute 3019() +{ + if ((event == EGG) && (isNearby(GWENNO))) + { + if (UI_get_schedule_type(GWENNO) == STANDTHERE) + { + UI_play_music(29, GWENNO); + script GWENNO + { + actor frame standing; face south; wait 1; + repeat 25{ + actor frame 30; wait 1; + actor frame 31; wait 1; + actor frame 30; wait 1; + actor frame 31; wait 1; + }; + + }; + + + } + else return; + } + +} + + +//sets up the cutscene when you get the rune of Honesty +void GetRuneHonesty 3020() +{ + + if (event == EGG) + { + var door = UI_find_nearest(AVATAR, 270, 10); + UI_close_gumps(); + if (UI_find_object(PARTY, SHAPE_RUNE,QUALITY_ANY, FRAME_HONESTY)) + { + UI_close_gumps(); + door->set_item_frame(12); + giveExperience(50); + AVATAR->set_item_flag(BG_DONT_MOVE); + script item after 3 ticks + { + call getRuneHonesty, GOT_RUNE; + }; + UI_remove_item(item); + + } + else + return; + + } + + + +} + +//this is put in the Lycaeum to randomize the important books that give rewards + +void randomizeQuestBooks 3021() +{ + if ((event == EGG) && (!gflags[BOOKS_ARE_RANDOMIZED]) || (gflags[DEBUG])) + { + //get array of all books in 9x9 chunk radius + var books = UI_find_nearby_avatar(SHAPE_BOOK); + + //amount of books found + var num_books = UI_get_array_size([books]); + UI_error_message(num_books + " books found by randomizeQuestBooks egg."); + + //get random number for books + var rand1 = UI_get_random(num_books); + var rand2 = UI_get_random(num_books); + + + //make sure both rolls are different + var tries = 0; //max amount of tries before while loop break so no infinite loop + while (rand1 == rand2 && tries < 15) + { + //reroll rand2 + rand2 = UI_get_random(num_books); + + tries += 1; + } + //Wizard of Oz - give to LB for gems + UI_set_item_quality(books[rand1], 6); + + //Book of Mantras - give to Wisps for tons of gold nuggets + UI_set_item_quality(books[rand2], 29); + + //set flag + gflags[BOOKS_ARE_RANDOMIZED] = true; + + //remove egg + UI_remove_item(item); + } + else + return; +} + + +//Egg to make sure Michael is where he is supposed to be. +void MoveMichael 3023() +{ + var quality = UI_get_item_quality(item); + if (event == EGG) + { + if (quality == 0) + { + if (gflags[MICHAEL_CAPTURED]) + UI_remove_item(item); + + else if (!gflags[MARNEY_SAVED] || !gflags[MARNEY_GONE] && (!isNearby(MICHAEL) && !gflags[STARTED_INVESTIGATION])) + { + //if Michael not nearby and is on WAIT, it will clear it. + if (UI_get_schedule_type(MICHAEL, WAIT)) + { + UI_error_message("MICHAEL is in WAIT schedule but shouldn't be. Moving now."); + UI_set_schedule_type(MICHAEL, LOITER); + UI_move_object(MICHAEL, [0630, 1387], true); + UI_run_schedule(MICHAEL); + UI_set_schedule_type(MICHAEL, LOITER); + + } + + } + else + return; + } + else if (quality == 1) //kill Rinaldo + { + UI_move_object(RINALDO, [0759, 0424, 0]); + UI_set_schedule_type(RINALDO, WAIT); + UI_apply_damage(127, 127, NORMAL_DAMAGE, RINALDO); + + // UI_move_object(PIRATE_THUG, [0759, 0424, 0]); + + UI_remove_item(item); + } + + } +} + +void GuardsPlayTrumpet 3024() +{ + if ((event == EGG) && (!gflags[INTRO])) + { + + if ((isNearby(NYSTUL)) && (UI_get_schedule_type(NYSTUL) == STANDTHERE)) + { + NYSTUL->set_item_frame_rot(48); + GEOFFREY->set_item_frame_rot(32); + } + + if (isNearby(PALACE_GUARD1)) + { + if (UI_get_schedule_type(PALACE_GUARD1) == STANDTHERE) + { + UI_play_music(24, PALACE_GUARD1); + script PALACE_GUARD1 + { + actor frame standing; face east; wait 1; + repeat 3 + { + actor frame 62; wait 6; + actor frame 63; wait 13; + actor frame 62; wait 11; + actor frame 63; wait 3; + actor frame 62; wait 3; + }; + actor frame standing; face east; wait 1; + }; + } + } + if (isNearby(PALACE_GUARD2)) + { + if (UI_get_schedule_type(PALACE_GUARD2) == STANDTHERE) + { + UI_play_music(24, PALACE_GUARD2); + script PALACE_GUARD2 + { + actor frame standing; face west; wait 1; + repeat 3{ + actor frame 62; wait 6; + actor frame 63; wait 13; + actor frame 62; wait 11; + actor frame 63; wait 3; + actor frame 62; wait 3; + }; + actor frame standing; face west; wait 1; + }; + } + } + + + + } + +} + +void BritishGoesBerzerk 3025() +{ + if (event == EGG) + { + if (isNearby(LORD_BRITISH)) + { + UI_close_gumps(); + UI_remove_item(item); + script LORD_BRITISH after 2 ticks + { + say "@My fork!!!@"; + }; + UI_set_alignment(LORD_BRITISH, EVIL); + UI_set_schedule_type(LORD_BRITISH, IN_COMBAT); + + UI_set_oppressor(LORD_BRITISH, AVATAR); + UI_set_item_flag(LORD_BRITISH, PETRA); //LB peed off + + UI_remove_item(item); + } + + } + +} + +void BritishGoesCalm 3026() // +{ + if (UI_get_item_flag(LORD_BRITISH, PETRA)) + { + UI_clear_item_flag(LORD_BRITISH, PETRA); + UI_set_alignment(LORD_BRITISH, NEUTRAL); + UI_run_schedule(LORD_BRITISH); + UI_remove_item(item); + } + else + return; +} + +void restartGame object#() () +{ + UI_restart_game(); +} + +void ChucklesTeleports object#() () +{ + UI_restart_game(); +} + + +void ChucklesGetsCheaters 3027() //finisht his!!!! +{ + var bark; + var addnumber = UI_get_npc_id(AVATAR); + + if ((!gflags[INTRO]) && (event == EGG)) + { + UI_set_item_flag(AVATAR, BG_DONT_MOVE); + AVATAR.say("@I can't move?@"); + AVATAR.hide(); + UI_clone(CHUCKLES); + + CHUCKLES.say("@Ho eyo he hum, o' Virtuous one! Didn't want to play the Game?!@"); + CHUCKLES.say("@Fancy meeting thee here, an area you cannot enter under normal circumstances... Say, are thou a cheater, Avatar?*@"); + CHUCKLES.say("@Of course you are!@*"); + CHUCKLES.say("@And what shall we do with thee, Cheatatar?@"); + CHUCKLES.say("@Tis certain thou aren't serious about saving Britannia, teleporting around in places ye shouldn't be.@"); + CHUCKLES.say("@And in fact, I knowest thou killed me and reloaded thy game before! Admit it! You never liked me!@"); + CHUCKLES.say("@What, thou dost not remember shooting me with a cannon? Or exploding me with a powder keg? Or ramming thy sword into my belly? Well, Chuckles remembers!@"); + CHUCKLES.say("@Chuckles also remembers the time thou didst ransack the castle and smite Lord British with a glass sword!@"); + CHUCKLES.say("@So, now you answer mine question. You never liked me, did you?@"); + + var options = ["I liked you..", "Ok I admit it"]; + var options2 = ["what?"]; + + //Start of regular conversation tree + converse(options) + { + case "I liked you..": + CHUCKLES.say("@Really? Then why didn't you laugh at my joke about Dupre being like a horseshoe? That joke was GOLD, thou bastard!!@*"); + CHUCKLES.say("@It was a comedic masterpiece!! Apparently humour isn't a virtue!@"); + CHUCKLES.say("@But nay, Chuckles isn't mad. In fact, Chuckles is downright giddy. And dost thou know what a giddy Chuckles feels like doing?@"); + CHUCKLES.say("@Chuckles just might cut thee a break. In fact, I've been working on some new jokes. Would'st thou like to hear one?@"); + AVATAR.say("Before you could protest, Chuckles responds for you."); + AVATAR.hide(); + CHUCKLES.say("@Thou wouldst? Of course, I knew ye would! What a pal! Ho eyo he hum, here it comes!@"); + CHUCKLES.say("@Say, Avatar old chum, There's someone at thy door! Knock Knock!....this is where thou sayest 'Who's there?' Cheatatar!@"); + AVATAR.say("@Uh... who's there?@"); + AVATAR.hide(); + CHUCKLES.say("@Boo...@"); + AVATAR.say("@...boo...who?@"); + AVATAR.hide(); + CHUCKLES.say("@Boo Hoo goes the Avatar because now Chuckles is going to torment thee for eternity!@"); + CHUCKLES.say("@Cheatatar, old chap, thou hast time for one more joke? Listen to a joke from your dear friend Chuckles?@"); + CHUCKLES.say("@Ok, here it comes!@"); + CHUCKLES.say("@Cheaters say what?@"); + converse(options2) + { + case "what?": + var addnumber = UI_get_npc_id(AVATAR); + if (UI_get_npc_id(AVATAR) >= 10) + { + CHUCKLES.say("@Ho Ho Ho, Hee Hee Heeee, that was a riot!@"); + CHUCKLES.say("@Hast thou learned a lesson against thy cheating ways, Cheatatar?@"); + CHUCKLES.say("@Didst thy dear old friend Chuckles the Jester teach thee that cheaters never win?@"); + CHUCKLES.say("@Remember this day, Avatar. Next time thou contemplates killing me and leaving my carcass on Lord British's carpet...@"); + CHUCKLES.say("@...I'll remember it all. Chuckles remembers!!@"); + CHUCKLES.say("@Now, go to sleep, dear Avatar, with visions of Chuckles dancing in thy head!@"); + CHUCKLES.say("@Ho eyo he hum! Teedledee dee, hee hum!@"); + UI_start_speech(21); + UI_fade_palette(600, 0, false); + break; + script AVATAR after 110 ticks + { + call restartGame; + }; + } + else + { + say("@Hee hee! Ho ho!@*"); + UI_set_npc_id(AVATAR, addnumber + 1); + } + case "test": + say("@Ooops, didn't work.@"); + break; + + } + + case "Ok I admit it": + CHUCKLES.say("@I knew it!! Thou wer't jealous of mine comedic talents!@"); + CHUCKLES.say("@And thou wer't jealous of my better looking costume!@"); + CHUCKLES.say("@And thou never liked my jokes!@"); + CHUCKLES.say("@So Avatar, old buddy old pal, doest thou not like Chuckles?@"); + CHUCKLES.say("@Is one Chuckles too much for thee?@"); + CHUCKLES.say("@Well Cheatatar, dear sweet Cheatatar?@"); + script AVATAR after 60 ticks + { + call ChucklesTeleports; + }; + break; + }//end converse options + } + else return; +} + + + +void UnfreezeLB 3028() +{ + + if (!gflags[INTRO]) + { + UI_set_schedule_type(NYSTUL, STANDTHERE); + UI_set_schedule_type(GEOFFREY, STANDTHERE); + UI_set_schedule_type(LORD_BRITISH, MAJOR_SIT); + } +} + +void DragonAttack 3029() +{ + var dragon_list = UI_find_nearby_avatar(504); //dragon shape + UI_close_gumps(); + if (event == EGG) + { + UI_close_gumps(); + UI_close_gump(); + for (npc in dragon_list) + { + UI_close_gumps(); + npc->set_schedule_type(IN_COMBAT); + } + } +} + +void WrongEgg1 3030() +{ + const int SHAPE_LEVER = 787; + const int SHAPE_LOCKED_WALL = 828; + var door = UI_find_nearest(WRONG, SHAPE_LOCKED_WALL, 25); //locked "wall" door shape + + + if (event == EGG) + { + + var door = UI_find_nearest(item, SHAPE_LOCKED_WALL, 25); //locked "wall" door shape + + if (gflags[SWITCH_WRONG]) //gflag 1086 + { + UI_set_item_shape(door, 845); //change to locked "open wall" shape + } + else return; + + } +} + +void WrongEgg2 3031() +{ + const int SHAPE_LEVER = 787; + var lever = UI_find_nearest(item, 828, 20); //lever shape + var lever_frame = UI_get_item_frame(lever); //pulled lever + + + if (event == EGG) + { + var lever = UI_find_nearest(item, 787, 20); //lever shape + var lever_frame = UI_get_item_frame(lever); //pulled lever + + if (lever_frame == 2) + { + if (!gflags[SWITCH_WRONG]) //gflag 1086 + { + gflags[SWITCH_WRONG] = true; + } + else return; + } + else return; + + } +} + +void WrongEgg3 3033() //when telekenisis cast on lever, set global flag +{ + const int SHAPE_LEVER = 787; + var lever = UI_find_nearest(item, 828, 20); //lever shape + var lever_frame = UI_get_item_frame(lever); //pulled lever + + + if (event == EGG) + { + var lever = UI_find_nearest(item, 787, 20); //lever shape + var lever_frame = UI_get_item_frame(lever); //pulled lever + + if (lever_frame == 2) + { + if (!gflags[SWITCH_WRONG_2]) //gflag 128 + { + gflags[SWITCH_WRONG_2] = true; + } + else return; + } + else return; + + } +} + +void WrongEgg4 3034() //when SWITCH_WRONG_2 gflag set, opens "wall shape" +{ + const int SHAPE_LEVER = 787; + const int SHAPE_LOCKED_WALL = 828; + var door = UI_find_nearest(WRONG, SHAPE_LOCKED_WALL, 25); //locked "wall" door shape + + + if (event == EGG) + { + + var door = UI_find_nearest(item, SHAPE_LOCKED_WALL, 25); //locked "wall" door shape + + if (gflags[SWITCH_WRONG_2]) //gflag 128 + { + UI_set_item_shape(door, 845); //change to locked "open wall" shape + } + else return; + } +} + + +void removeBarrier object#() () +{ + if (event == EGG) + { + const int SHAPE_SWITCH = 788; + const int SHAPE_BARRIER = 1223; + var barrier = UI_find_nearest(item, SHAPE_BARRIER, 31); // + + + + UI_remove_from_area(barrier, FRAME_ANY, [1704, 2677], [1761, 2737]); + } +} + + + + +void SutekCatacombs 3035() // +{ + const int SHAPE_SWITCH = 788; + const int SHAPE_BARRIER = 1223; + + var barrier = UI_find_nearest(item, SHAPE_BARRIER, 25); //locked "wall" door shape + var lever_switch = UI_find_nearest(item, SHAPE_SWITCH, 25); //locked + var switch_frame = UI_get_item_frame(lever_switch); //pulled lever + + + if (event == EGG) + { + + if (switch_frame == 0) + { + script item after 1 ticks call removeBarrier; + // randomPartyBark("@Egg initiated@"); + } + else return; + + + } +} + + +//Egg to make sure NPC's are facing proper direction (ex: Sylania / Sionnach, Daver, Nystul/Geoffrey) +void npcFaceDirection 3052() // +{ + + if (event == EGG) + { + //Sylania and Sionnach's graveyard midnight rendevous + if (UI_part_of_day() == MIDNIGHT && nearEachOther(SYLAINA, SIONNACH)) + { + UI_error_message("Sylania and Sionnach is nearby"); + //if she isn't facing Sionnach, make her. + if (!isFacingNPC(SYLAINA, SIONNACH)) + { + UI_error_message("Sylaina isn't facing Sionnach, making them face each other"); + makeNPCFaceNPC(SYLAINA, SIONNACH); + + } + + //if he isn't facing Sylania, make him. + if (!isFacingNPC(SIONNACH, SYLAINA)) + makeNPCFaceNPC(SIONNACH, SYLAINA); + + + } + + //Geoffrey and Nystul + if (nearEachOther(GEOFFREY, NYSTUL) && UI_get_schedule_type(GEOFFREY, STANDTHERE) && UI_get_schedule_type(NYSTUL, STANDTHERE)) + { + if (!isFacingNPC(GEOFFREY, NYSTUL)) + makeNPCFaceNPC(GEOFFREY, NYSTUL); + + if (!isFacingNPC(NYSTUL, GEOFFREY)) + makeNPCFaceNPC(NYSTUL, GEOFFREY); + + } + + + //Daver standing at the bell + if (isNearby(DAVER) && UI_get_schedule_type(DAVER, STANDTHERE)) + { + if (getFacing(DAVER) != SOUTH) + makeNPCFaceDirection(DAVER, SOUTH); + + + } + } + else + abort; + + + + +} + +void Control_Switch 3037() //when switch is thrown, gflag SWITCH_CONTROl set true, egg delete barrier will work +{ + + if (event == EGG) + { + const int SHAPE_SWITCH = 788; + const int SHAPE_BARRIER = 1223; + + var ctrl_switch; + var ctrl_switches = UI_find_nearby_avatar(SHAPE_SWITCH); + + + for (ctrl_switch in ctrl_switches) + { + var switch_frame = UI_get_item_frame(ctrl_switch); + if (switch_frame == 0 && !gflags[SWITCH_CONTROL]) + gflags[SWITCH_CONTROL] = true; //used to delete barrier + UI_error_message("Control switch flipped, barriers should be deleted"); + } + + } + + +} + +void delete_barrier 3038() //used to delete barries in control shrine +{ + const int BARRIER = 1146; + var egg_location = UI_get_object_position(item); + var barrier = UI_find_nearby([egg_location], BARRIER, 30, MASK_NONE); + + var barrier_quality = UI_get_item_quality(barrier); + if (event == EGG) + { + if (gflags[SWITCH_CONTROL] == true && barrier_quality == 0) + { + UI_remove_item(barrier); + UI_error_message("Control Barriers should be removed"); + } + else if (gflags[SWITCH_BASEMENT] == true && barrier_quality == 1) + { + UI_remove_item(barrier); + UI_error_message("Basment barriers should be removed"); + } + + if (gflags[SWITCH_TOMBKINGS] == true && barrier_quality == 2) + { + + UI_remove_item(barrier); + UI_error_message("Tomb of Kings Barriers should be removed"); + } + } +} + +void need_key 3039() //if avatar skips ahead to get the cube +{ + if (!gflags[TOLD_ABOUT_CUBE]) + { + gflags[TOLD_ABOUT_CUBE] = true; //allows you to ask about cellar with Cyclops + return; + } + + else return; +} + + +void getValor 3041() +{ + var valorrune = UI_count_objects(PARTY, SHAPE_RUNE, QUALITY_ANY, FRAME_VALOR); //checks to see if party has Rune of valor + if (gflags[AVATAR_IS_SHERRY] && valorrune >= 1) + { + script item after 2 ticks + { + call UndoSherrySwap; + remove; + } + + } + +} + +void behaveSherry 3042() +{ + + if (gflags[AVATAR_IS_SHERRY]) + { +// UI_halt_scheduled(AVATAR); + UI_item_say(SHERRY, "Aren't you forgetting something, Sherry?"); + AVATAR->move_object([0x187, 0xa0c, 0x0]); + + } + +} + + +void volcano 3043() +{ + const int SPRITE_EXPLOSION = 1; + const int SFX_ERUPT = 60; + const int SHAPE_VOLCANO = 1177; + const int SFX_SMOKE = 59; + const int SPRITE_SMOKE = 3; //from smokebomb + + if (event == EGG) + { + + //finds array of all volcanoes in the area + var volcano_item = UI_find_nearby(item, SHAPE_VOLCANO, 31, MASK_NONE); + + //how many are found + var num_volcanoes = UI_get_array_size([volcano_item]); + UI_error_message("there was " + num_volcanoes + " found."); + + //distance Avatar is from volcano + //var avatar_distance = UI_get_distance(item, AVATAR); + + //if volcanoes are nearby, choose a random one to erupt + if (num_volcanoes > 0) + { + //find random volcano index to erupt: + var rand_volcano = UI_get_random(num_volcanoes); + UI_error_message("rand volcano index is " + rand_volcano); + + //pick random volcano from array with chosenindex + var volcano = volcano_item[rand_volcano]; + + + //triggering Eruption + //Eruption(volcano_item[rand_volcano]); + + var avatar_distance = UI_get_distance(volcano, AVATAR); + var volcano_location = UI_get_object_position(volcano); + UI_error_message("Item location is" + volcano_location); + + //determine if it explodes + var rand = UI_get_random(100); + UI_error_message("Volcano egg hatched: rand number is " + rand); + + //volcano erupts and explodes: + if (rand < 25) + { + UI_error_message("Volcano egg: random number was " + rand + ", erupt."); + UI_error_message("Rand num was " + rand + ", volcano erupts"); + var target; + + + //determine how many npcs are neaby + var targets = UI_find_nearby(volcano, SHAPE_ANY, 6, MASK_NPC2); + + //exp effect + UI_obj_sprite_effect(volcano, SPRITE_EXPLOSION, 0, 0, 0 ,0, 0, -1); + + //play sound + UI_play_sound_effect(SFX_ERUPT, volcano); + UI_earthquake(1); + + var count = 0; + + //apply damage to targets based on how far away they were from the blast + for (target in targets) + { + var target_shape = UI_get_item_shape(target); + count += 1; + UI_error_message("Target " + count + ", is damaged! Shape: " + target_shape); + var target_distance = UI_get_distance(volcano, target); + var damage_base = (50 / target_distance); + UI_apply_damage(damage_base, 15, FIRE_DAMAGE, target); + } + + } + + else if (rand >= 25 && rand <= 70) //volcano erupts with smoke + { + UI_obj_sprite_effect(volcano, SPRITE_SMOKE, -1, -1, 0 ,0, 0, -1); + UI_play_sound_effect(SFX_SMOKE, volcano); + UI_error_message("Volcano egg: random number was " + rand + ", just smoke."); + + + } + else + UI_error_message("Volcano egg: random number was " + rand + ", do nothing."); + + + + + } + + } + else + return; + + + + +} + + + +void LBStory 3044() +{ + //for Sherry storytelling + + if (event == EGG) + { + if ((isNearby(LORD_BRITISH)) && (UI_get_schedule_type(SHERRY, STANDTHERE)) && (isNearby(SHERRY))) + { + script LORD_BRITISH after 4 ticks + { + say "@Hubert the Lion was haughty and vain,..@"; + wait 20; + say "@And especially proud of his elegant mane..@"; + wait 20; + say "@But conceit of this sort is not proper at all,..@"; + wait 20; + say "@And Hubert the Lion was due for a fall..@"; + } + + } + else + return; + + } +} + +void tombKings 3045() +{ + if (event == EGG) + { + const int SHAPE_SWITCH = 788; + const int barrier = 1146; + + var tombkings_switch; + var tombkings_switches = UI_find_nearby_avatar(SHAPE_SWITCH); + + + for (tombkings_switch in tombkings_switches) + { + var switch_frame = UI_get_item_frame(tombkings_switch); + if (switch_frame == 0 && !gflags[SWITCH_TOMBKINGS]) + { + gflags[SWITCH_TOMBKINGS] = true; //used to delete barrier + UI_error_message("Tomb Of Kings switch flipped, barriers should be deleted"); + UI_remove_item(item); + } + } + + } +} + + +void moveSixth 3046() +{ + if ((event == EGG) && (gflags[SIXTH_MEMBER_LEAVES])) + { + var npc; + var party_npcs = [BEHLEM, BLAINE, DUPRE, GORN, GWENNO, IOLO, JAANA, JULIA, KATRINA, LEODON, LEONNA, SEGGALLION, SENTRI, SHAMINO]; + var npc_6; + for (npc in party_npcs) + { + if (UI_get_item_flag(npc, SI_LIZARD_KING)) + npc_6 = UI_get_npc_number(npc); + } + + //move the npc back to the mainland after a time + var pos = [0, 0, 0, 0]; + UI_move_object(npc_6, pos); + UI_run_schedule(npc_6); + UI_remove_item(item); + + + + } + else + return; +} + +void AccessDenied 3047() +{ + if (event == EGG) + { + var guardians = UI_find_nearby_avatar(945); + var guardian; + + var guardian1 = guardians[2]; + var guardian2 = guardians[1]; + + + if (!gflags[FINAL_QUEST_GIVEN]) //not given codex quest by Singularity + { + // for (guardian in guardians) + // guardian->item_say("Access denied!"); + UI_move_object(PARTY, [0xaf8,0xa6e]); + + script guardian1 + { + say "@Thou art not..@"; + wait 15; + say "@on a sacred quest..@"; + wait 15; + say "@Passage Denied!@"; + + } + script guardian2 + { + say "@Thou art not..@"; + wait 15; + say "@on a sacred quest..@"; + wait 15; + say "@Passage Denied!@"; + + } + + } + else + { + for (guardian in guardians) + guardian->item_say("Pass, Seeker!"); + + } + } + +} +// Eggs 3048, 3049 used in endgame + +void InnkeeperEgg 3050() +{ + var eggQuality = UI_get_item_quality(item); + var checkoutGideon = UI_get_item_flag(GIDEON, PETRA); + var checkoutPeyton = UI_get_item_flag(PEYTON, PETRA); + var checkoutMartin = UI_get_item_flag(MARTIN, SI_ZOMBIE); + var checkoutDoris = UI_get_item_flag(DORIS, PETRA); + var checkoutPetroph = UI_get_item_flag(PETROPH, PETRA); + + if (event == EGG) + { + //Skara Brae - Gideon - The Haunting Inn + if (eggQuality == 0) + { + if ((isNearby(GIDEON)) && (checkoutGideon)) + { + //Freeze Avatar + AVATAR->GenericFreeze(); + UI_set_schedule_type(GIDEON, TALK); + + + + } + else + return; + } //Britain - Peyton - The Wayfarer's Inn + else if (eggQuality == 1) + { + if ((isNearby(PEYTON)) && (checkoutPeyton)) + { + //Freeze Avatar + AVATAR->GenericFreeze(); + UI_set_schedule_type(PEYTON, TALK); + + } + else + return; + + + } + else if (eggQuality == 2) //Jhelom inn + { + if ((isNearby(MARTIN)) && (checkoutMartin)) + { + //Freeze Avatar + AVATAR->GenericFreeze(); + UI_set_schedule_type(MARTIN, TALK); + + } + else + return; + + } + + else if (eggQuality == 3) //Minoc inn + { + if ((isNearby(DORIS)) && (checkoutDoris)) + { + //Freeze Avatar + AVATAR->GenericFreeze(); + UI_set_schedule_type(DORIS, TALK); + + } + else + return; + + } + + else if (eggQuality == 4) //Bucs den inn + { + if ((isNearby(PETROPH)) && (checkoutPetroph)) + { + //Freeze Avatar + AVATAR->GenericFreeze(); + UI_set_schedule_type(PETROPH, TALK); + + } + else + return; + + } + + + } + +} + +// # 3051 used for CenteROnAvatar function + +//void removeGargEggs 3046() +//{ +// if (event == EGG) +// { +// +// +// +// +// if (quality == 0) && (gflags([COMPASSION_FREED])) //Compassion +// { +// +// } +// else if (quality == +// +// +// +// +// } +//} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/endgame_eggs.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/endgame_eggs.uc new file mode 100755 index 0000000..651fa31 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/endgame_eggs.uc @@ -0,0 +1,144 @@ +void humanLens 3048() +{ + var blueLightBeam; + var blueLightBeam2; + var pinkLightBeam; + var pinkLightBeam2; + const int FRAME_HUMAN = 0; + var lens = UI_find_nearby(item, SHAPE_LENS, 1, MASK_NONE); + + AVATAR->close_gumps2(); //doesn't work either + + if (event == EGG) + { + AVATAR->close_gumps2(); + var lens = UI_find_nearby(item, SHAPE_LENS, 1, MASK_NONE); + var lens_type = UI_get_item_frame(lens); + //if correct lens is found + if (lens > 0) + { + var egg_pos = UI_get_object_position(item); + UI_close_gumps(); + + if (lens_type == FRAME_HUMAN) + { + UI_move_object(lens, egg_pos); //moves lens into position + gflags[HUMAN_LENS_PLACED] = true; + UI_obj_sprite_effect(lens, 13, 0, 0, 0, 0, 0, -1); + + //place beam of light - first part + blueLightBeam = UI_create_new_object2(168, [2802, 2589, 1]); + UI_set_item_frame(blueLightBeam, 24); //change to straight beam + + //place second part + blueLightBeam2 = UI_create_new_object2(168, [2807, 2590, 3]); + UI_set_item_frame(blueLightBeam2, 22); //change to straight beam + + } + } + else + { + + //Shenanigans detected, deletes beams of light if lens is removed + blueLightBeam = UI_find_object(FIND_ON_SCREEN, 168, QUALITY_ANY, 22); + UI_remove_item(blueLightBeam); + blueLightBeam2 = UI_find_object(FIND_ON_SCREEN, 168, QUALITY_ANY, 24); + UI_remove_item(blueLightBeam2); + gflags[HUMAN_LENS_PLACED] = false; + + } + + } + +} + + + +void gargoyleLens 3049() +{ + var pinkLightBeam; + var pinkLightBeam2; + const int FRAME_GARGOYLE = 1; + var lens = UI_find_nearby(item, SHAPE_LENS, 1, MASK_NONE); + UI_close_gumps(); + + if (event == EGG) + { + UI_close_gumps(); + var lens = UI_find_nearby(item, SHAPE_LENS, 1, MASK_NONE); + var lens_type = UI_get_item_frame(lens); + //if correct lens is found + if (lens > 0) + { + var egg_pos = UI_get_object_position(item); + + + if (lens_type == FRAME_GARGOYLE) + { + UI_move_object(lens, egg_pos); //moves lens into position + gflags[GARG_LENS_PLACED] = true; + UI_obj_sprite_effect(lens, 13, 0, 0, 0, 0, 0, -1); + + //place beam of light - first part + pinkLightBeam = UI_create_new_object2(168, [2817, 2591, 5]); + UI_set_item_frame(pinkLightBeam, 20); //change to straight beam + + //place second part + pinkLightBeam2 = UI_create_new_object2(168, [2811, 2590, 3]); + UI_set_item_frame(pinkLightBeam2, 21); //change to straight beam + + } + } + else + { + + //Shenanigans detected, deletes beams of light if lens is removed + pinkLightBeam = UI_find_object(FIND_ON_SCREEN, 168, QUALITY_ANY, 20); + UI_remove_item(pinkLightBeam); + pinkLightBeam2 = UI_find_object(FIND_ON_SCREEN, 168, QUALITY_ANY, 21); + UI_remove_item(pinkLightBeam2); + gflags[GARG_LENS_PLACED] = false; + + } + + } +} + + + void placeVortexCube 3051() + { + if (event == EGG) + { + UI_close_gumps(); + var vortexcube = UI_find_nearest(item, SHAPE_VORTEX_CUBE, 2); + if (vortexcube) + { + + //run a check to make sure the cube has all the stones in it first + var IsCubeFull = isCubeFull(); + if (IsCubeFull == true) + { + UI_error_message("Cube is full"); + if (gflags[HUMAN_LENS_PLACED] && gflags[GARG_LENS_PLACED]) + { + + AVATAR->set_item_flag(BG_DONT_MOVE); + UI_error_message("ENdgame initiated via placeVortexCube egg"); + //1->SendCodexToVoid(); //initiate endgame sequence + startEndgame(); + } + else + randomPartyBark("@The lenses aren't in place.@"); + + } + else{ + randomPartyBark("I think we are missing some moonstones.."); + UI_obj_sprite_effect(vortexcube, 9, 4, 4, 0, 0, 0, -1); + UI_play_sound_effect(69); //spell fizzle + } + } + else + return; + } + } + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/fishingrod.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/fishingrod.uc new file mode 100755 index 0000000..a9eff63 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/fishingrod.uc @@ -0,0 +1,225 @@ +/* + * + * Copyright (C) 2006 Alun Bestor/The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Author: Marzo Junior (reorganizing/updating code by Alun Bestor) + * Last Modified: 2022 agentorangeguy + */ + +const int FRAME_FRESHFISH = 31; //added by DB - quality is iffy and won't stay sometimes + +const int QUALITY_FRESHFISH = 1; //the quality of freshly-caught fish + //(this will expire to 0 at EXPIRY_RATE) +const int FISH_EXPIRY_RATE = 50; //the quality will be decremented by one + //every EXPIRY_RATE ticks +//These factors are not currently used: sleeping will not decrement quality properly. + +const int BASE_CATCH_CHANCE = 30; //% base chance of catching a fish, if any are about +const int CHANCE_PER_FISH = 10; //% extra catch chance per nearby fish + +const int SOUND_LANDEDFISH = 40; //played when you catch a fish +const int SOUND_FISHING = 103; //the plop of bait entering the water + +//Reconstituted from original function, with some extra bits added +//(more advice to the player, tweaked catch chance). Also extended +//animation considerably, and increased catch chance to compensate +//for the delay +void FishingRod shape#(662) () +{ + //Rod was doubleclicked on: start fishing + if (event == DOUBLECLICK) + { + //make sure the fishing rod is readied first + if (!AVATAR->is_readied(BG_WEAPON_HAND, SHAPE_FISHING_ROD, FRAME_ANY)) + { + randomPartySay("@Thou must have the rod in thy hand.@"); + return; + } + + UI_close_gumps(); + var target = UI_click_on_item(); + + if (!(UI_is_water([target[2], target[3], target[4]]) || target->get_item_shape() == SHAPE_FISH)) + { + UI_flash_mouse(0); + + //only make this 1 in 4, to stop irritating the player + if (UI_get_random(4) == 1) + { + //Spark is the resident angling expert + if (inParty(SPARK)) + SPARK.say("@Thou shouldst cast thy line into the water, Avatar!@ He grins cheekily."); + else + randomPartySay("@Last I heard, fish doth not live upon dry land. Thou shouldst try thy rod in the water!@"); + } + return; + } + else + { + //determine which way the avatar should be facing + var direction = directionFromAvatar(target); + //fishing animation + script AVATAR + { + nohalt; + call GenericFreeze; + face direction; + actor frame reach_2h; + actor frame strike_2h; + sfx SOUND_FISHING; + + //prevents the animation 'timing out' and reverting to standing + repeat 2 { actor frame strike_2h; wait 5; }; + + //call this function again, as event SCRIPTED, to determine + //if fish were caught + call FishingRod; + actor frame ready; + actor frame standing; + call GenericUnfreeze; + } + } + } + + else if (event == SCRIPTED) + { + var nearby_fish = AVATAR->find_nearby(SHAPE_FISH, 15, 0); + var num_fish_nearby = UI_get_array_size(nearby_fish); + var fish_caught = false; + var rand; + + //Adjusted fish-catching chance: now it is a base chance + + //an adjustable chance per fish + if (num_fish_nearby > 0) + { + var catch_chance = BASE_CATCH_CHANCE + (num_fish_nearby * CHANCE_PER_FISH); + if (UI_get_random(100) <= catch_chance) + fish_caught = true; + } + + //Hooray, we got one! + if (fish_caught) + { + var fish = SHAPE_FOOD->create_new_object(); + if (!fish) return; + + fish->set_item_frame(FRAME_FRESHFISH); + //Added to stop fish sticking around indefinitely + fish->set_item_flag(TEMPORARY); + + //put it near the avatar's feet + var avatar_pos = AVATAR->get_object_position(); + avatar_pos[X] = avatar_pos[X] + 1; + UI_update_last_created(avatar_pos); + + UI_play_sound_effect(SOUND_LANDEDFISH); + + //Added: indicates that the fish is fresh (for sale to Gordon) + //Note: this required a new tfa.dat, to change the class of the + //Food shape from Quality Flags to Quality. + fish->set_item_quality(QUALITY_FRESHFISH); + + //Added: start the fish quality decrementing + //Removed: disabled for now, as it doesn't count sleep at all + //script fish after FISH_EXPIRY_RATE ticks { call 0xB40; } + + /* Disabled as it is not correctly implemented + //Added: remove a fish from the water + var caught_fish; + if (target->get_item_shape() == SHAPE_FISH) + //Player clicked on a particular fish - grab that one + caught_fish = target; + else + //otherwise, grab one of the nearby fishies at random + caught_fish = nearby_fish[UI_get_random(num_fish_nearby)]; + caught_fish->remove_item(); + */ + + //Make one of the party members comment on the catch + rand = UI_get_random(3); + if (rand == 1) + { + randomPartyBark("@Indeed, a whopper!@"); + if (SPARK->npc_nearby()) + delayedBark(SPARK, "@I have seen bigger.@", 16); + } + else if (rand == 2) + randomPartyBark("@What a meal!@"); + else if (rand == 3) + randomPartyBark(["@That fish does not", "look right.@"]); + } + + //changed barks to reflect that there's no fish (better player guidance) + else if (num_fish_nearby == 0) + { + rand = UI_get_random(3); + if (rand == 1) + { + //Spark, butting his head in as usual + if (inParty(SPARK) && canTalk(SPARK)) + SPARK.say("@The fish doth not seem to be biting, thou shouldst try somewhere else!", + "~@My father took me fishing sometimes -- thou canst find good spots near bridges, where thou canst see the fishes beneath the water.@"); + else + randomPartySay("@Methinks there are no fish in these waters. Let us try in a better spot!@"); + } + else if (rand == 2) + delayedBark(AVATAR, "@Not even a bite!@", 0); + else if (rand == 3) + delayedBark(AVATAR, "@I've lost my bait.@", 0); + } + + else + { + rand = UI_get_random(4); + + if (rand == 1) + delayedBark(AVATAR, "@Not even a bite!@", 0); + else if (rand == 2) + { + delayedBark(AVATAR, "@It got away!@", 1); + if (IOLO->npc_nearby()) + delayedBark(IOLO, "@It was the Big One!@", 16); + } + else if (rand == 3) + delayedBark(AVATAR, "@I've lost my bait.@", 0); + else if (rand == 4) + delayedBark(AVATAR, "@I felt a nibble.@", 0); + } + } +} + +/* +//This function is responsible for making fish go bad after a certain +//length of time. +//Not used: sleeping will not advance the script queue. +expireFish () +{ + var reduced_quality = get_item_quality() - 1; + set_item_quality(reduced_quality); + + if (reduced_quality == 0) + { + halt_scheduled(); //stop the countdown + avatarBark("Fish now rotten!"); + } + else + { + avatarBark("Fish now at " + reduced_quality + " quality"); + script item after FISH_EXPIRY_RATE ticks call 0x600; + } +} +*/ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/fryingpan.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/fryingpan.uc new file mode 100755 index 0000000..0fba137 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/fryingpan.uc @@ -0,0 +1,45 @@ +void fryingpan shape#(944) () +{ + var target_frame = item->get_item_frame(); + var quality = get_item_quality(); + var framenum; + var pos; + var campfire; + var campfire_pos; + var fryingpan; + var fryingpan_pos; + var campfire_dist; + + campfire = UI_find_nearby_avatar(SHAPE_CAMPFIRE); + campfire_pos = UI_get_object_position(campfire); + + framenum = UI_get_item_frame(item); + + if (event == DOUBLECLICK) + { + AVATAR.say("@What should we cook?@"); + + var options = ["nothing"]; + + if (UI_count_objects(PARTY, SHAPE_FOOD, QUALITY_ANY, 28) >= 1) if (item in party) options = options & "raw mutton"; + + converse(options) + { + case "nothing" (remove): + break; + + case "raw mutton" + if (!UI_find_nearby_avatar(SHAPE_CAMPFIRE)) + { + AVATAR.say("@We need to start a campfire in order to cook meat.@"); + break; + } + else script AVATAR + { + nohalt; + //gotoObject(campfire, 0, 1, 0); + }; + } + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/garg_signs.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/garg_signs.uc new file mode 100755 index 0000000..1f6881f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/garg_signs.uc @@ -0,0 +1,170 @@ +void garg_plaque shape# (1230)() +{ + +//TH = ( +//NG = * +//EA = + + + if (event == DOUBLECLICK) + { + UI_close_gumps(); + var msg; + var quality = get_item_quality(); + + if (quality == 0) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["librum", "klau"]; + else + msg = ["librum", "chamber"]; + } + else if (quality == 1) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["kodeks ultim", "uis"]; + else + msg = ["Codex of", "Ultimate Wisdom"]; + } + else if (quality == 2) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["vorteks klau", "ni canportas"]; + else + msg = ["Vortex Chamber", "No Admittance"]; + } + + else if (quality == 3) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["hiuman klau"]; + else + msg = ["Human Chamber"]; + } + else if (quality == 4) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["naksatilor", "vidlem"]; + else + msg = ["Naxatilor", "the seer"]; + } + else if (quality == 5) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["prilem", "draksinusom"]; + else + msg = ["Lord", "Draxinusom"]; + } + + else if (quality == 6) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["inmanilem"]; + else + msg = ["Healer"]; + } + + else if (quality == 7) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["beninlem"]; + else + msg = ["Goodscrafter"]; + } + + else if (quality == 8) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["kansinlem"]; + else + msg = ["Foodmaker"]; + } + + else if (quality == 9) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["agracarinlem"]; + else + msg = ["Weaponsmith"]; + } + + else if (quality == 10) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["atri skitas"]; + else + msg = ["The Hall", "Of", "Knowledge"]; + } + else if (quality == 11) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["kahmanizende", "tablap"]; + else + msg = ["The", "Sacrificial", "Slab"]; + } + else if (quality == 12) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["teresta sit", "summle", "manchar", "lemmur kahle"]; + else + msg = ["Here lie the", "honored remains", "of those", "who have", "been sacrificed"]; + } + else if (quality == 13) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["kuante esta", "klau anpor", "os", "prilemmur"]; + else + msg = ["Within this", "chamber rests", "the bones", "of kings."]; + } + else if (quality == 14) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["teresta sit", "lem antende", "nom"]; + else + msg = ["Here lie", "those that", "had no", "names"]; + } + + else if (quality == 15) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["vorteks", "lorrel"]; + else + msg = ["The", "Vortex", "Lens"]; + } + + else if (quality == 16) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["vorteks", "kuad"]; + else + msg = ["The", "Vortex", "Cube"]; + } + else if (quality == 17) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["ara pritas"]; + else + msg = ["The Altar", "Of", "Singularity"]; + } + else if (quality == 18) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["kodeks kir"]; + else + msg = ["The Book", "Of", "Circles"]; + } + else if (quality == 19) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["kodeks balsil"]; + else + msg = ["The Book", "Of", "Prophesies"]; + } + + + else msg = ["Stop Cheating!"]; + + UI_display_runes(49, msg); + + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/gargish_plaque.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/gargish_plaque.uc new file mode 100755 index 0000000..2e96653 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/gargish_plaque.uc @@ -0,0 +1,146 @@ +void gargish_plaque shape# (1230)() +{ +var quality = get_item_quality(); + + +//TH = ( +//NG = * +//EA = + + +if (event == DOUBLECLICK) + { + UI_close_gumps(); + var msg; + var quality = get_item_quality(); + + if (quality == 0) + if (!gflags[READ_GARGISH_SCROLL]) + { + msg = ["librum", "klau"]; + } + else msg = ["librum", "chamber"]; + + else if (quality == 2) + if (!gflags[READ_GARGISH_SCROLL]) + { + msg = ["vorteks klau", "ni canportas"]; + } + else msg = ["Vortex Chamber", "No", "Admittance"]; + + else if (quality == 3) + if (!gflags[READ_GARGISH_SCROLL]) + { + msg = ["naksatilor vidlem"]; + } + else msg = ["Naxatilor", "The Seer"]; + + + else if (quality == 3) + + msg = ["Kafiristan Pass"]; + + else if (quality == 4) + + msg = ["For Sale"]; + + + else if (quality == 5) + + msg = ["The crypt", "of", "Cantrell"]; + + + else if (quality == 6) + + msg = ["The crypt", "of", "Spector"]; + + else if (quality == 7) + + msg = ["The crypt", "of", "Beyvin"]; + + + else if (quality == 8) + + msg = ["The crypt", "of", "Malone"]; + + else if (quality == 9) + + msg = ["The crypt", "of", "Bourbonnais"]; + + else if (quality == 10) + + msg = ["The crypt", "of", "Jannati"]; + + else if (quality == 11) + + msg = ["The crypt", "of", "Romero"]; + + else if (quality == 12) + + msg = ["The crypt", "of", "Dwyer"]; + + else if (quality == 13) + + msg = ["The crypt", "of", "Gabriella"]; + + else if (quality == 14) + + msg = ["The", "Blue", "Bottle"]; + + else if (quality == 15) + + msg = ["Fool's Pair", "o'", "Dice"]; + + else if (quality == 16) + + msg = ["Avatar Lane"]; + + + else if (quality == 17) + + msg = ["Bellringer Lane"]; + + else if (quality == 18) + + msg = ["Serpents Loop"]; + + else if (quality == 19) + + msg = ["Keep Out!"]; + + else if (quality == 20) + + msg = ["This way"]; + + + else if (quality == 21) + + msg = ["That way"]; + + else if (quality == 22) + + msg = ["Drop to", "your death!"]; + + else if (quality == 23) + + msg = ["This way"]; + + else if (quality == 24) + + msg = ["That way"]; + + else if (quality == 25) + + msg = ["The Maze", "Of death!"]; + + else if (quality == 26) + + msg = ["Off Limits!"]; + + else msg = ["Stop Cheating!"]; + + + UI_display_runes(49, msg); + + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/gargishbooks.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/gargishbooks.uc new file mode 100755 index 0000000..ca54568 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/gargishbooks.uc @@ -0,0 +1,175 @@ + + +void gargbook shape#(1251) () +{ + var player_name = getAvatarName(); + var quality = UI_get_item_quality(item); + var msg; + var sound; + if (event == DOUBLECLICK) + { + +// * denotes page break +// ~ equals 'enter' for space + if (quality == 0) + { + showBook(); + + + if (gflags[READ_GARGISH_SCROLL]) + { + showBook(); + say("~~The Book of Ritual~~"); + say(" ~~by Naxatilor the Seer~~*"); + say("~Heed well as I, Naxatilor, write of how I brought the Codex to our land and thereby ushered in the time of prosperity: "); + say("~~With the help of the Lensmaker I crafted the Vortex Lens, by which I could see the Codex where it originally rested."); + say("~~I created the Vortex Cube to focus the power of the Moonstones and draw the Vortex down to the world. Then I used the lens to form an image of the Codex upon the cube."); + say("~~The Vortex touched our plane, the image became solid, and the Codex was brought down to be used properly by our race!"); + gflags[READ_BOOK_RITUAL] = true; + + if (!gflags[TOLD_ABOUT_CUBE]) + gflags[TOLD_ABOUT_CUBE] = true; //allows you to ask about cellar with Cyclops + } + else + { + showBook(); + say(" ~~Kodeks rit~~"); + say(" ~~naksatilor vidlem~~*"); + + say("~~vervid ben kua i, naksatilor, skri kuo i porle kodeks uide terreg ew estade kalle ante tim benommani: ku auks lorrelinlem i beninle vorteks lorrel, o kua i le vid kodeks kuater lem terinit anporle. ~~i inle vorteks kuad re inbet grav ok orblap ew trakpor vorteks destrak termur. estatim i perle lorrel re inuislor kodeks ad kuad. vorteks tanle uide terailem, uislor inle ailemde, ew kodeks porle des re perle bende pa uide zenmur.~~"); + + } + + } + else if (quality == 1) + { + + if (gflags[READ_GARGISH_SCROLL]) + { + showBook(); + say(" ~~The Book of Administration~~*"); + + say("~For countless ages, we winged ones have led the wingless ones. This is right and proper."); + say("~But we must always remember that they are no less valuable than we.*"); + say("~A body with no head cannot move. But neither can a body with no legs. All must function in unity if anything is to be achieved."); + say("~So guide the wingless ones, and keep them from paths of error. But guide them with respect.."); + } + else + { + showBook(); + say("~~kodeks benmontas~~*"); + + say("~~dur anmurde vastim ui volde lem monte anvolde lem. ista ver ew behde.~"); + say("~~a ui nes tutim reski lem an min persa de ui. zentu ku an uiscar ansa por. a ni sa zentu ku an porcar.~~"); + say("~~tu nes per te pri si kui re leinle. er duk anvolde lem, ew ark lem de via feltas. a duk lem ku lentas ew vervid.~"); + + + } + + } + + else if (quality == 2) + { + + if (gflags[READ_GARGISH_SCROLL]) + { + showBook(); + say(" ~~The Book of The Underworld~~*"); + + say("~Deep below the land there is another land. In that land live many strange creatures. The most interesting of these creatures look something like our wingless ones. These daemons, however, are pale and soft."); + say("~Some say that these daemons from the underworld can speak. And, to be sure, they make sounds that are similar to our language.*"); + say("~But as everyone knows, no creature without wings is truly intelligent. Fables of talking daemons must be discredited..."); + + } + else + { + showBook(); + say("~~kodeks destermur~~*"); + + say("~~alt desde terreg ai ali terreg. ante esta terreg manite mur aniw zen. plu tri de ista zen vid zaw ve uide anvolde lem.~"); + say("~~ista daemon ade pal ew delsa. kualem lokte ista daemon de destermur sa lok. ew kerde, lem inte son esta misve uide liy..~~"); + say("~~ a kua lemmur uiste, an zen anku vol verde uis. feluis de lokde daemon nes ankredle...~"); + + + } + + } + else if (quality == 3) + { + + if (gflags[READ_GARGISH_SCROLL]) + { + showBook(); + say(" ~~The Book of Prosperity~~*"); + + say("~Long ago, the great seer Naxatilor summoned the Codex into the world. Thus began the great time of prosperity. The Codex was placed within the Temple of Singularity, there to be viewed by those requiring its knowledge.~"); + say("~The seers of the land, led by Naxatilor, protected the Codex with a forcefield. Only those upon sacred quests for wisdom are allowed to reach and read the Codex.~"); + say("~Within the Codex is written the one right and true answer to any problem. One has but to reach the Codex, read it, and interpret its advice properly. With perfect wisdom and infallible knowledge, all that remains is to have the control, passion and diligence required to follow the proper course. These are the underpinnings of our society, and so our race is able to use the Codex wisely and well.~"); + say("~This is the reason why the Codex exists: to lead the gargoyle race to ultimate prosperity...~"); + } + else + { + showBook(); + say("~~kodeks benommani~~*"); + + say("~~vas praetim, vas vidlem naksatilor kalle kodeks ante termur. ita rele vastim benommani.~"); + say("~~kodeks terle ante terort pritas, teresta re vidle pa lem nesde vasuis. vidlem terreg, monle pa naksatilor, juksarkle kodeks ku saeykt grav.~~"); + say("~~sol lem ad omde vestas trak uis canle terpor ew leg kodeks. ante kodeks skrile pri ben ew ver res kui kuae. lem nes sol terpor kodeks, leg lem, ew inuislok lemde monuis aptade. ku verinde uis ew ankadsa ski, tu mante est ten un, or, ew us nesle re pos apta via. ista est desintas uide murom, ew ita uide zenmur sa per kodeks uisde ew bende. ista est kuauis kodeks est: re mon gar{ zenmur trak ultim benommani~"); + + + } + + } + + else if (quality == 4) + { + + if (gflags[READ_GARGISH_SCROLL]) + { + showBook(); + say(" ~~The Book of Family~~*"); + + say("~When a child hatches from his egg, he is born without wings. But even from birth one can tell whether a child will grow up to be a winged or a wingless one. The wingless ones cannot speak, and lack the intelligence of the winged ones. They must be guided."); + say("~The winged ones are few, but they are entrusted with the intelligence and wisdom of the race. They must guide."); + say("Both winged and wingless ones spring from the same eggs, and both belong to the same family. All function as a single whole, to better maintain the struggle for survival in our world."); + } + else + { + showBook(); + say("~~kodeks xen~~*"); + + say("~kuatim betlem grespor de ov, lem inzenle anku vol. a vel de inzen lem sa ski si betlem re invas est volde au anvolde lem."); + say("~anvolde lem ansa lok, ew anten skitas de volde lem. lem nes dukle.~"); + say("~volde lem anmur, a lem kredonle ku skitas ew uis de zenmur. lem nes dukte. sek volde ew anvolde lem sal de mis ov, ew sek dete de mis xen. tu per ve pride tutas, re plu ben inten agratas trak temanitas ante uide termur"); + + + } + + } + + + + else + { + + showBook(); + say("This is not a valid scroll QUAL attribute! Stop cheating!"); + + } + + + + + + + + + + + } + + +} + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/gems.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/gems.uc new file mode 100755 index 0000000..1b3ed38 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/gems.uc @@ -0,0 +1,13 @@ +void gems shape#(760) () +{ + + if (event == DOUBLECLICK) + { + + randomPartySay("@Those are beautiful. I am sure they would fetch a high price at the glassblower in Minoc.@"); + + + + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/horn.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/horn.uc new file mode 100755 index 0000000..dd4c459 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/horn.uc @@ -0,0 +1,52 @@ +void Horn object#(0x378) () +{ + var horn_x = 1457; + var horn_y = 1631; + + const int SHAPE_SILVER_SERPENT = 1226; + if (event == DOUBLECLICK) + { + + var rand = UI_die_roll(1, 10); + + UI_play_sound_effect(109); //horn sound + //UI_obj_sprite_effect(object obj, int sprite, int rel_x, int rel_y, int vel_x, int vel_y, int frnum, int reps) + UI_obj_sprite_effect(item, 24, -1, 1, -1, -1, 0, -1); + + // silver serpent not summoned + if (rand > 8) + randomPartyBark("@Nothing happened..@"); + + // silver serpent summoned at random distance from horn + else + { + + var rand_x = UI_die_roll(5, 25); + var rand_y = UI_die_roll(5, 25); + var serpent; + + + //determine how many serpents are summoned + rand = UI_die_roll(1, 3); + + //create serpent and set its alignment + serpent = UI_create_new_object2(SHAPE_SILVER_SERPENT, [horn_x + rand_x, horn_y + rand_y]); + UI_set_item_flag(serpent, TEMPORARY); + UI_set_schedule_type(serpent, IN_COMBAT); + UI_set_alignment(serpent, EVIL); + UI_set_attack_mode(serpent, BERSERK); + randomPartyBark("@Watch out!@"); + + } + + } + + + + + + + + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/horseflesh.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/horseflesh.uc new file mode 100755 index 0000000..deb9712 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/horseflesh.uc @@ -0,0 +1,74 @@ +void shapeHorseflesh shape#(1252) () +{ + if (event == DOUBLECLICK) + { + //hunger value of 16 given to it + var horseflesh_hunger_level = 16; + var rand; + + var target = UI_click_on_item(); + var target_shape = UI_get_item_shape(target); + var not_hungry_response; + var eaten_bark; + + // if (!(!target)) + // abort; + + if (!UI_is_npc(target)) + abort; + + if (!UI_get_item_flag(target, IN_PARTY)) + abort; + + //If Iolo has found out he's eating a horse, he refuses + if ((target_shape == 465) && (gflags[IOLO_HATES_HORSEFLESH])) + { + delayedBark(IOLO, "@No thank thee..@", 0); + delayedBark(IOLO, "@I cannot in good conscience..@", 4); + delayedBark(IOLO, "@..eat horse meat.@", 8); + + } + else + { + if (UI_get_npc_prop(target, FOODLEVEL) > 24) + { + not_hungry_response = UI_die_roll(1, 5); + UI_clear_item_say(target); + + if ((not_hungry_response == 1) || (not_hungry_response == 2)) + delayedBark(target, "@No thank thee.@", 0); + + else if ((not_hungry_response == 3) || (not_hungry_response == 4)) + delayedBark(target, "@I am quite full.@", 0); + + else if (not_hungry_response == 5) + delayedBark(target, "@I hunger not.@", 0); + + abort; + } + else + { + UI_set_npc_prop(target, FOODLEVEL, horseflesh_hunger_level); + UI_remove_item(item); + UI_play_sound_effect(91); + + //Add some barks for flavor + rand = UI_get_random(5); + if (rand == 1) + eaten_bark = "@Mmmm..@"; + else if (rand == 2) + eaten_bark = "@Interesting flavor..@"; + else if (rand == 3) + eaten_bark = "@Tastes like chicken..@"; + else + eaten_bark = "@Tasty!@"; + delayedBark(target, eaten_bark, 0); + } + } + } +} + + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/kindling.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/kindling.uc new file mode 100755 index 0000000..3f85576 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/kindling.uc @@ -0,0 +1,43 @@ +void burnOut object#() () +{ +UI_set_item_shape(item, 224);//scorch mark +UI_set_item_flag(item, TEMPORARY); +} + + +void kindling shape#(1212) () //of course, replace the shape number with whatever it will be in your shapes file +{ + if (event == DOUBLECLICK) + { + var item_in_pack = UI_get_container(item); + + if (item_in_pack == 0) + { + UI_close_gumps(); + UI_set_item_shape(item, 825);//campfire + + script item after 6 ticks + { + frame 1; wait 3; + frame 2; wait 3; + frame 3; wait 3; + frame 4; wait 900; + frame 3; wait 30; + frame 2; wait 30; + frame 1; wait 30; + frame 0; wait 30; + call burnOut; + }; + } + else + { + UI_flash_mouse(CURSOR_X); + UI_close_gumps(); + randomPartyBark("@Place it on the ground first.@"); + } + + + + } +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/lamp.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/lamp.uc new file mode 100755 index 0000000..872ed05 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/lamp.uc @@ -0,0 +1,18 @@ +void Lamp shape#(1161) () +{ + + + if (event == DOUBLECLICK) + { + item->set_item_shape(SHAPE_LIT_LAMP); + UI_play_sound_effect(17); + } + + +} + + + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/lever.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/lever.uc new file mode 100755 index 0000000..0550153 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/lever.uc @@ -0,0 +1,99 @@ +const int SHAPE_LEVER_2 = 1143; //shape of added lever in my shapes.vga + +//0x6da is BG usecode egg that opens portc. doors + + +//Dungeon lever control npcs - junk npcs for item flag purposes + + +//WRONG = -272, //clone_alagner +//BLANKDUNGEON = -273 + + + + +void switchLever object#() () //switches levers from correct thrown/pulled position + { + var lever = UI_find_nearest(AVATAR, SHAPE_LEVER_2, 3); //finds lever 2 tiles away, since 'item' doesn't work here + var lever_qual = UI_get_item_quality(lever); + var lever_frame = UI_get_item_frame(lever); + + if (lever_frame == 0) UI_set_item_frame(lever, 1); //set up frames correctly + else + if (lever_frame == 1) UI_set_item_frame(lever, 0); //set up frames correctly + else + if (lever_frame == 2) UI_set_item_frame(lever, 3); //set up frames correctly + else + if (lever_frame == 3) UI_set_item_frame(lever, 2); //set up frames correctly + + +//used for actual functionality of levers (opening doors via usecode eggs out of range) +//Set npc with item flag then set usecode egg with it + + if (lever_qual == 0) return; //do nothing + else + + if ((lever_qual == 1) && (lever_frame == 3)) //throws switch and sets item flag 'Naked' + { + UI_set_item_flag(WRONG, NAKED); + } + else UI_clear_item_flag(WRONG, NAKED); //when switch is thrown again to 'default' frame 4 (horizontal switch), flag clears +//////////// + + if ((lever_qual == 2) && (lever_frame == 3)) //throws switch and sets item flag 'Naked' + { + UI_set_item_flag(WRONG, PETRA); + } + else UI_clear_item_flag(WRONG, PETRA); //when switch is thrown again to 'default' frame 4 (horizontal switch), flag clears +/////////// + +// + + + + } + +void pullLever object#() () //motions and sfx for pulling/throwing lever. + { + + script AVATAR after 3 ticks + { + wait 1; + actor frame standing; face north; + actor frame bowing; + wait 1; + actor frame standing; face north; + sfx 28; //lever sound + call switchLever; + } + + } + + +void lever shape#(1143) () //main lever code + { + + if (event == DOUBLECLICK) + { + UI_close_gumps(); + + + var lever_pos = UI_get_object_position(item); + var direction = AVATAR->find_direction(item); + var lever_frame = UI_get_item_frame(lever); + + var lever_pos_x = (lever_pos[X]); //changed from -2 + var lever_pos_y = (lever_pos[Y] + 2); + + UI_si_path_run_usecode(AVATAR, [lever_pos_x, lever_pos_y], false, item, pullLever, false); + + + + + + } + + } + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/lion_statue.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/lion_statue.uc new file mode 100755 index 0000000..77b99d2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/lion_statue.uc @@ -0,0 +1,17 @@ +void lionStatue shape#(1267) () // +{ + var frame = UI_get_item_frame(item); + if (event == DOUBLECLICK) + { + if (frame == 1) + { + randomPartyBark("A scroll!"); + var scroll = UI_create_new_object2(SHAPE_SCROLL, [0923, 1115, 0]); + scroll->set_item_quality(73); + + //change statue back to frame 0 so new scrolls cant be generated + item->set_item_frame(0); + return; + } + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/litlamp.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/litlamp.uc new file mode 100755 index 0000000..5c787a4 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/litlamp.uc @@ -0,0 +1,13 @@ +void LitLamp shape#(1162) () +{ + + + if (event == DOUBLECLICK) + { + item->set_item_shape(SHAPE_LAMP); + UI_play_sound_effect(18); + } + + +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/magic_quill.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/magic_quill.uc new file mode 100755 index 0000000..d11d1e0 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/magic_quill.uc @@ -0,0 +1,10 @@ +void magic_quill shape#(1256) () +{ + if (event == DOUBLECLICK) + { + UI_close_gumps(); + randomizeBooks(); + + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/moonstone.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/moonstone.uc new file mode 100755 index 0000000..dbffcc7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/moonstone.uc @@ -0,0 +1,42 @@ +void moonstone shape#(1139) () +{ + var frame = UI_get_item_frame(item); + if (event == DOUBLECLICK) + { + var target = UI_click_on_item(); + var target_shape = UI_get_item_shape(target); + if (target_shape == SHAPE_VORTEX_CUBE) + { + if (frame == 0) + gflags[MOONSTONE1] = true; + else if (frame == 1) + gflags[MOONSTONE2] = true; + else if (frame == 2) + gflags[MOONSTONE3] = true; + else if (frame == 3) + gflags[MOONSTONE4] = true; + else if (frame == 4) + gflags[MOONSTONE5] = true; + else if (frame == 5) + gflags[MOONSTONE6] = true; + else if (frame == 6) + gflags[MOONSTONE7] = true; + else if (frame == 7) + gflags[MOONSTONE8] = true; + + //after adding, check to see if all stones are in vortex cube now + if (gflags[MOONSTONE1] && gflags[MOONSTONE2] && gflags[MOONSTONE3] && gflags[MOONSTONE4] && gflags[MOONSTONE5] && gflags[MOONSTONE6] && gflags[MOONSTONE7] && gflags[MOONSTONE8]) + gflags[VORTEX_CUBE_FULL] = true; + + UI_close_gumps(); + UI_obj_sprite_effect(target, 13, 0, 0, 0, 0, 0, -1); + UI_play_sound_effect(68); + UI_remove_item(item); + + } + else + UI_flash_mouse(CURSOR_X); + } + + +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/new_balloon.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/new_balloon.uc new file mode 100755 index 0000000..78215e1 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/new_balloon.uc @@ -0,0 +1,133 @@ +//This is used after landing and after 3 ticks or so (adjust) +//It switches the shape back to the original + + +void newballoon shape#(1233) () +{ + + const int SHAPE_BALLOON = 1201; + var barge = get_barge(); + var party = UI_get_party_list(); + var newballoon = UI_find_nearest(AVATAR, SHAPE_NEW_BALLOON, 31); // + var quality = UI_get_item_quality(item); + var basket_pos = UI_get_object_position(item); + + if (event == DOUBLECLICK) + { + if (gflags[BALLOON_IS_FLYING]) + { + var barge = UI_find_nearby(basket_pos, 961, 10, MASK_EGG); //hopefully find the barge before placing + var balloon = UI_find_nearest(AVATAR, SHAPE_NEW_BALLOON, 31); // + + //First check to see if Avatar is over the Codex shrine to prevent early access: + var isNearCodex = UI_find_nearest(AVATAR, 1125, 60); + + if (isNearCodex) + randomPartySay("@Some strange force is preventing us from landing here!@"); + else if (barge->get_item_flag(OKAY_TO_LAND)) + { + + // Yes; so begin process of landing. + // Flag 10 = 'on moving barge' + barge->clear_item_flag(10); + // Flag 26 = 'in motion' + barge->clear_item_flag(26); + // Make carpet descent until the ground. + // Flag 10 = 'on moving barge' + balloon->clear_item_flag(10); + // Flag 26 = 'in motion' + balloon->clear_item_flag(26); + + // Flag 10 = 'on moving barge' + AVATAR->clear_item_flag(10); + // Flag 26 = 'in motion' + AVATAR->clear_item_flag(26); + UI_clear_item_flag(AVATAR, SAILOR); + + //sound effect + UI_play_sound_effect(89); + + //cut the music + UI_play_music(255); + + //may not be necessary: + UI_halt_scheduled(AVATAR); + + script item + { + + repeat 9 + { + descent; //should lift item on z level 9 + }; + wait 5; + + + } + script barge after 20 ticks + { + call renderParty; + + + } + + script AVATAR + { + repeat 9 + { + descent; //should lift item on z level 9 + }; + + } + + + + + + + + for (npc in party) + { + script npc + { + repeat 9 + { + descent; //should lift item on z level 9 + }; + + } + + + } + + + //UI_remove_item(barge); + UI_set_item_shape(item, SHAPE_BALLOON); //switch back to regular balloon + UI_set_item_quality(item, 1); //to allow packing + gflags[BALLOON_IS_FLYING] = false; + + } + else + randomPartySay("@I do not believe we can land here safely.@"); + + } + else //gflag is true or item frame == 0 + { + //UI_set_item_shape(item, SHAPE_PACKED_BALLOON); + UI_set_item_quality(item, 1); + gflags[BALLOON_IS_FLYING] = false; + return; + } + + } + + //this should be called when the balloon is in the air. Checks to make sure you are staying in the right bounds + if (event == SCRIPTED) + { + UI_error_message("Balloon scripted event is called while in the air."); + + + } + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/orb_of_the_moons_new.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/orb_of_the_moons_new.uc new file mode 100755 index 0000000..2295f14 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/orb_of_the_moons_new.uc @@ -0,0 +1,748 @@ +/* + * + * Copyright (C) 2006 The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This source file contains the code for the Improved Orb of the Moons. + * + * Author: Marzo Junior + * Last Modified: 2006-02-27 + */ + +/* The old Moongate destinations: +enum moongate_destinations +{ + BRITAIN = 1, + JHELOM = 2, + YEW = 3, + MINOC = 4, + TRINSIC = 5, + NEW_MAGINCIA = 6, + SKARA_BRAE = 7, + SPIRITUALITY = 8 + MOONGLOW = 9, +}; +*/ + +enum moongate_destinations_new +{ + BRITAIN = 1, + JHELOM = 2, + YEW = 3, + MINOC = 4, + TRINSIC = 5, + SKARA_BRAE = 6, + NEW_MAGINCIA = 7, + MOONGLOW = 8, + COMPASSION = 9, + VALOR = 10, + JUSTICE = 11, + SACRIFICE = 12, + HONOR = 13, + SPIRITUALITY = 14, + HUMILITY = 15, + HONESTY = 16 + + /* + //Maybe I will add these locations in the future: + CASTLE_BRITISH = 17, + SERPENTS_HOLD = 18, + STONEGATE = 19, //Some other location, maybe? + ISLE_OF_AVATAR = 20, + EMPATH_ABBEY = 21, + TERFIN_SHRINE = 22, + LYCAEUM = 23, + ????? = 24 + */ +}; + +var isOrbMoongate 0x826 (var itemref) +{ + var orbmoongates; + orbmoongates = [SHAPE_ORB_MOONGATE_HORIZONTAL, SHAPE_ORB_MOONGATE_NW_SE, + SHAPE_ORB_MOONGATE_VERTICAL, SHAPE_ORB_MOONGATE_NE_SW]; + if ((itemref->get_item_shape()) in orbmoongates) + return true; + else + return false; +} + +var getMoongateDestination 0x823 (var moongate) +{ + /* Old destinations: + //The coordinates of moongate destinations (changed to reflect the multi-map Britannia): + dest_X = [0x04dF, 0x0105, 0x0207, 0x073F, 0x03FF, 0x087F, 0x0237, 0x0B67, 0x0B3F]; + dest_Y = [0x0550, 0x0B0A, 0x01EB, 0x0192, 0x0983, 0x0922, 0x0649, 0x0963, 0x0712]; + dest_Z = [0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0001, 0x0000]; + dest_map = [0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000]; + */ + + //The coordinates of moongate destinations. These are also the destinations + //of "standard" blue moongates. If you compare with the above, you'll see + //that I switched Skara Brae with New Magincia. This is so the Orb works + //closer to the one from U6. Whatever differences are left from U6 (and + //there are many) I blame on the sphere generator :-). + var dest_X = [ + //Cities: Britain, Jhelom, Yew, Minoc, Trinsic, + 0x054F, 0x0105, 0x02b7, 0x07dF, 0x046f, + // Skara Brae, New Magincia Moonglow + 0x00af, 0x08bF, 0x0ac0, + + //Shrines: Compassion, Valor, Justice, Sacrifice, Honor, + 0x0606, 0x01FB, 0x0386, 0x9b9, 0x03b1, + + // Spirituality, Humility, Honesty + 0x098a, 0x0B07, 0x0A99 + ]; + + var dest_Y = [ + //Cities: Britain, Jhelom, Yew, Minoc, Trinsic, + 0x04df, 0x0B0A, 0x01a7, 0x00cf, 0x098f, + // Skara Brae, New Magincia Moonglow + 0x05ff, 0x083f, 0x05e0, + //Shrines: Compassion, Valor, Justice, Sacrifice, Honor, + 0x0460, 0x0A70, 0x0070, 0x1fd, 0x09f6, + // Spirituality, Humility, Honesty + 0x0498, 0x0B0a, 0x048C + ]; + + var dest_Z = [ + //Cities: Britain, Jhelom, Yew, Minoc, Trinsic, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, + // Skara Brae, New Magincia Moonglow + 0x0000, 0x0000, 0x0002, + //Shrines: Compassion, Valor, Justice, Sacrifice, Honor, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Spirituality, Humility, Honesty + 0x0001, 0x0000, 0x0000 + ]; + + var dest_map = [ + //Cities: Britain, Jhelom, Yew, Minoc, Trinsic, + 0, 0, 0, 0, 0, + // Skara Brae, New Magincia Moonglow + 0, 0, 0, + //Shrines: Compassion, Valor, Justice, Sacrifice, Honor, + 0, 0, 0, 0, 0, + // Spirituality, Humility, Honesty + 1, 0, 0 + ]; + + var dest_index; + var dest_pos; + + + + + + + + //Get moongate quality = destination index: + dest_index = (moongate->get_item_quality() + 1); + + //Blue moongates should only take the avatar to places with blue moongates; + //this happens only in the exit from the Shrine of Spirituality, which should + //take us to Skara Brae (Moonglow in the original): + if (!isOrbMoongate(moongate) && (dest_index > 8)) dest_index = SKARA_BRAE; + + //If the orb hasn't been fixed, we can't visit the Timelord: + //if ((!gflags[ORB_FIXED_TIMELORD]) && (dest_index == SPIRITUALITY)) dest_index = SKARA_BRAE; + //the original takes the avatar to Moonglow instead. + + //Return the exit coordinates of the moongate: + dest_pos = [dest_X[dest_index], dest_Y[dest_index], dest_Z[dest_index], dest_map[dest_index]]; + + //return the destination coordinates: + return dest_pos; +} + +void enterMoongate 0x824 (var moongate) +{ + var avatar_pos; + var moongate_pos = UI_get_object_position(moongate); + var moongate_shape; + var var0004; + var quality = UI_get_item_quality(moongate); + + var destination; + + //town coords + var britain = [1360, 1247, 0, 0]; + var trinsic = [1135, 2447, 0, 0]; + var yew = [0695, 0425, 0, 0]; + var skara = [0175, 1535, 0, 0]; + var minoc = [2015, 0207, 0, 0]; + var jhelom = [0400, 2688, 0, 0]; + var new_magincia = [2240, 2112, 0, 0]; + var moonglow = [2751, 1504, 0, 0]; + + //shrine coords + var humility = [2800, 2858, 0, 0]; + var justice = [0911, 0131, 0, 0]; + var honor = [0943, 2582, 0, 0]; + var sacrifice = [2513, 0530, 0, 0]; + var compassion = [1554, 1141, 0, 0]; + var valor = [0432, 2911, 0, 0]; + var honesty = [2858, 0826, 0, 0]; + var spirituality = [2457, 1198, 0, 1]; + + + //other coords + // gargoyle lands are protected by global flags, only avaliable once you reach it + var the_slab = [1576, 1333, 0, 3]; + var diligence = [1568, 1740, 0, 3]; + var control = [1401, 1170, 0, 3]; + var passion = [1719, 1167, 0, 3]; + + var isle_of_avatar = [2808, 2687, 0, 0]; + var lb_throneroom = [0935, 1070, 0, 0]; + + + + + + + //Fade to black: + UI_fade_palette(12, 1, 0); + + //Moongate travel sound: + UI_play_sound_effect2(SOUND_MOONGATE, item); + + //Teleport avatar to destination: +// var dest = getMoongateDestination(moongate); + + if (quality == 0)//void + destination = moongate_pos; + else if (quality == 1) + destination = compassion; + else if (quality == 2) + destination = honesty; + else if (quality == 3) + destination = britain; + else if (quality == 4) + destination = lb_throneroom; + else if (quality == 5) + destination = jhelom; + else if (quality == 6) + destination = passion; + else if (quality == 7) + destination = valor; + else if (quality == 8) + destination = justice; + else if (quality == 9) + destination = yew; + else if (quality == 10) + destination = minoc; + else if (quality == 11) + destination = isle_of_avatar; + else if (quality == 12) + destination = sacrifice; + else if (quality == 13) + destination = honor ; + else if (quality == 14) + destination = trinsic; + else if (quality == 15) + destination = diligence; + else if (quality == 16) + destination = skara; + else if (quality == 17) + destination = the_slab; + else if (quality == 18) + destination = humility; + else if (quality == 19) + destination = spirituality; + else if (quality == 20) + destination = new_magincia; + else if (quality == 21) + destination = moonglow; + else if (quality == 22) + destination = control; + else + destination = moongate_pos; + + UI_error_message("Quality is " + quality + " and destination is: " + destination); + + PARTY->move_object(destination); + + script AVATAR {nohalt; call exitMoongate;}; + +} + +void Orb_of_the_Moons shape#(0x311) () +{ + var target; + var target_coords; + var direction; + var coordinate; + var moongate_shape; + var counter; + var blocked; + var moongate; + var arrived_dest; + var distance; + var avatar_pos; + var coord_offset; + + var quality; //used to set for correct destination + + var destination; + + //town coords + var britain_coords = [1360, 1247, 0, 0]; + var trinsic_coords = [1135, 2447, 0, 0]; + var yew_coords = [0695, 0243, 0, 0]; + var skara_coords = [0175, 1535, 0, 0]; + var minoc_coords = [2015, 0207, 0, 0]; + var jhelom_coords = [0400, 2688, 0, 0]; + var new_magincia_coords = [2240, 2112, 0, 0]; + var moonglow_coords = [2751, 1504, 0, 0]; + + //shrine coords + var humility = [2800, 2858, 0, 0]; + var justice = [0911, 0131, 0, 0]; + var honor = [0943, 2582, 0, 0]; + var sacrifice = [2513, 0530, 0, 0]; + var compassion = [1554, 1141, 0, 0]; + var valor = [0432, 2911, 0, 0]; + var honesty = [0943, 2582, 0, 0]; + var spirituality = [2457, 1198, 0, 1]; + + + //other coords + // gargoyle lands are protected by global flags, only avaliable once you reach it + var the_slab = [1576, 1333, 0, 3]; + var diligence = [1568, 1740, 0, 3]; + var control = [1401, 1170, 0, 3]; + var passion = [1719, 1167, 0, 3]; + + var isle_of_avatar = [2808, 2687, 0, 0]; + var lb_throneroom = [0935, 1070, 0, 0]; + + + + + if (event == DOUBLECLICK) + { + if (!gflags[ASKED_LB_ABOUT_ORB]) + { + delayedBark(AVATAR, "@I don't know how to use this..@", 0); + return; + } + + //I prefer this here to help the player choose a + //target (no gumps in the way and all...): + UI_close_gumps(); + + //Prompt for target: + target = UI_click_on_item(); + + //Get the target's coordinates: + target_coords = getClickPosition(target); + + //Make avatar face moongate. + script AVATAR {face target;}; + + + //Find the direction of the throw: + direction = AVATAR->find_direction(target_coords); + UI_error_message("Avatar direction from target coords is " + direction); + + //Get avatar position: + avatar_pos = AVATAR->get_object_position(); + + + var moongateshapes = [SHAPE_ORB_MOONGATE_HORIZONTAL, SHAPE_ORB_MOONGATE_NW_SE, SHAPE_ORB_MOONGATE_VERTICAL, + SHAPE_ORB_MOONGATE_NE_SW, SHAPE_ORB_MOONGATE_HORIZONTAL, SHAPE_ORB_MOONGATE_NW_SE, + SHAPE_ORB_MOONGATE_VERTICAL, SHAPE_ORB_MOONGATE_NE_SW]; + + + + var dist_x = (target_coords[X] - avatar_pos[X]); + UI_error_message("Dist x is " + dist_x); + + var dist_y = (target_coords[Y] - avatar_pos[Y]) * -1; + UI_error_message("Dist y is " + dist_y); + + + //find proper moongate shape and destination + + + //center column of "U6 grid" + if (dist_x > -3 && dist_x < 3) + { + moongate_shape = SHAPE_ORB_MOONGATE_HORIZONTAL; + if (dist_y > -3 && dist_y < 2) + quality = 0; //void + else if (dist_y < -3 && dist_y > -8) + { + if (gflags[FOUND_DILIGENCE]) + quality = 15; //Shrine of Diligence + else + quality = 0; //haven't visited shrine yet + } + else if (dist_y < -8) + quality = 14; //Trinsic; + else if (dist_y > 2 && dist_y < 8) + quality = 4;//lb_throneroom; + else + quality = 3; //britain_coords; + + + + + + + } + //2nd column (left) + else if (dist_x > -8 && dist_x < -2) + { + moongate_shape = SHAPE_ORB_MOONGATE_HORIZONTAL; + + if (dist_y > 7) + quality = 2; // Honesty shrine + else if (dist_y < 7 && dist_y > 2) + { + if (gflags[FOUND_CONTROL]) + quality = 22; //CONTROL + else + quality = 0; //haven't visited Control yet + moongate_shape = 1114; + + + } + else if (dist_y < 3 && dist_y > -3) + { + quality = 20; // New Magincia + moongate_shape = SHAPE_ORB_MOONGATE_VERTICAL; + } + else if (dist_y < -2 && dist_y > -8) + { + moongate_shape = SHAPE_ORB_MOONGATE_NE_SW; + if (gflags[FOUND_SLAB]) + quality = 17; //The Slab + else + quality = 0; //haven't visited Slab yet + + + } + else + quality = 13; // Shrine of Honor + + + } + //1st column + else if (dist_x < -7) + { + moongate_shape = SHAPE_ORB_MOONGATE_HORIZONTAL; + if (dist_y > 7) + { + quality = 21; //Moonglow + moongate_shape = SHAPE_ORB_MOONGATE_NW_SE; + } + else if (dist_y < 7 && dist_y > 2) + { + quality = 18; //Shrine of Humility + moongate_shape = SHAPE_ORB_MOONGATE_HORIZONTAL; + + + } + else if (dist_y < 3 && dist_y > -3) + { + quality = 20; // New Magincia + moongate_shape = SHAPE_ORB_MOONGATE_VERTICAL; + } + else if (dist_y < -2 && dist_y > -8) + { + moongate_shape = SHAPE_ORB_MOONGATE_HORIZONTAL; + quality = 19; //Shrine of Spirituality + + } + else + { + quality = 16; //Skara Brae + moongate_shape = SHAPE_ORB_MOONGATE_NE_SW; + } + + + + + } + //4th column (right) + else if (dist_x > 2 && dist_x < 8) + { + moongate_shape = SHAPE_ORB_MOONGATE_HORIZONTAL; + if (dist_y > 7) + quality = 1; //compassion; + else if (dist_y < 7 && dist_y > 2) + { + if (gflags[FOUND_PASSION]) + quality = 6; //Shrine of passion + else + quality = 0; //haven't visited Control yet + moongate_shape = SHAPE_ORB_MOONGATE_NE_SW; + + + } + else if (dist_y < 3 && dist_y > -3) + { + quality = 9; // Yew + moongate_shape = SHAPE_ORB_MOONGATE_VERTICAL; + } + else if (dist_y < -2 && dist_y > -8) + { + moongate_shape = SHAPE_ORB_MOONGATE_NW_SE; + quality = 11; //isle of the avatar + + + } + else + quality = 12; //Shrine of Sacrifice + + + + } + //5th column + else if (dist_x > 7) + { + moongate_shape = SHAPE_ORB_MOONGATE_HORIZONTAL; + if (dist_y > 7) + { + UI_error_message("Destination should be Jhelom"); + quality = 5; //Jhelom_coords; + moongate_shape = SHAPE_ORB_MOONGATE_NE_SW; + } + else if (dist_y < 7 && dist_y > 2) + { + quality = 7; //Shrine of Valor + moongate_shape = SHAPE_ORB_MOONGATE_HORIZONTAL; + + + } + else if (dist_y < 3 && dist_y > -3) + { + quality = 9; // Yew + moongate_shape = SHAPE_ORB_MOONGATE_VERTICAL; + } + else if (dist_y < -2 && dist_y > -8) + { + moongate_shape = SHAPE_ORB_MOONGATE_HORIZONTAL; + quality = 8; //Shrine of Justice + + } + else + { + quality = 10; //minoc_coords; + moongate_shape = SHAPE_ORB_MOONGATE_NW_SE; + } + + + + + } + + + + + UI_error_message("Moongate quality is " + quality); + + + + + //Change the position to make moongate centered on target pos: + //target_coords[coordinate] = (target_coords[coordinate] + 2); + + if ((direction == NORTH) || (direction == SOUTH)) + target_coords[X] = (target_coords[X] + 2); + else if ((direction == EAST) || (direction == WEST)) + target_coords[Y] = (target_coords[Y] + 2); + else + { + target_coords[X] = (target_coords[X] + 1); + target_coords[Y] = (target_coords[Y] + 1); + } + + //See if the target destination is blocked: + blocked = (!UI_is_not_blocked(target_coords, moongate_shape, 0)); + + if (blocked) + { + UI_error_message("Error - moongate blocked"); + //It is blocked; attempt to circumvent it by incrementing + //the Z coordinate and give up trying after 3 tries: + counter = 3; + while (counter) + { + target_coords[Z] = (target_coords[Z] + 1); + blocked = (!UI_is_not_blocked(target_coords, moongate_shape, 0)); + if (!blocked) counter = 0; + else counter = counter - 1; + } + + //If it is still blocked, tell it to the player + //and then leave: + if (blocked) + { + UI_flash_mouse(0); + return; + } + } + + //Create the moongate: + moongate = UI_create_new_object(moongate_shape); + + //set moongate quality for destination: + moongate->set_item_quality(quality); + + //Could not create moongate, so bail out: + if (!moongate) + { + UI_error_message("Moongate aborted for some reason"); + return; + } + //Move the moongate to the target position: + UI_update_last_created(target_coords); + + //Undoes the change made above, in preparation + //to move the avatar to the right spot: + if ((direction == NORTH) || (direction == SOUTH)) + target_coords[X] = (target_coords[X] - 2); + else if ((direction == EAST) || (direction == WEST)) + target_coords[Y] = (target_coords[Y] - 2); + else + { + target_coords[X] = (target_coords[X] - 1); + target_coords[Y] = (target_coords[Y] - 1); + } + + //Moongate music: + UI_play_music(0x0033, 0); + + //Mark moongate as temporary, to avoid filling Britannia + //with nonfunctional moongates: + moongate->set_item_flag(TEMPORARY); + + //Makes the moongate rise from the ground, animate for a while + //then sink back to the ground and disappear: + script moongate + { + frame 0; + repeat 3 next frame;; + repeat 6 + { + repeat 6 next frame;; + frame 4; + }; + repeat 3 previous frame;; + remove; + } + + //Determine the distance between Avatar and moongate: + distance = AVATAR->get_distance(moongate); + + + //Make avatar face moongate. + // script AVATAR {face direction;}; + + //Give a small delay to avatar. Only needed for moongates + //created very close to the avatar: + distance = 5 - distance; + if (distance > 0) script AVATAR {wait distance;}; + + //Get avatar position: + avatar_pos = AVATAR->get_object_position(); + + //Determine coord offset for avatar destination: + if (!(direction in [EAST, WEST])) + { + UI_error_message("Destionation is in East / West"); + if ((target_coords[Y] < avatar_pos[Y])) coord_offset = 1; + else coord_offset = -1; + target_coords[Y] = (target_coords[Y] + coord_offset); + } + if (!(direction in [NORTH, SOUTH])) + { + UI_error_message("Destionation is in North / South"); + if ((target_coords[X] < avatar_pos[X])) coord_offset = 1; + else coord_offset = -1; + target_coords[X] = (target_coords[X] + coord_offset); + } + + + arrived_dest = UI_path_run_usecode(target_coords, Orb_of_the_Moons, moongate, PATH_SUCCESS); + + if (arrived_dest) + { + UI_error_message("arrived_dest is true"); + //UI_set_path_failure(function, itemref, eventid) + // Should the avatar not reach the destination, (say, + // because the player moved to somewhere else while + // the avatar was still walking), this will call + // function with event = eventid and item = itemref. + UI_set_path_failure(Orb_of_the_Moons, moongate, PATH_FAILURE); + + //See if the orb is in party's possession: + if (!(getOuterContainer(item) in UI_get_party_list())) + { + //... delete it from wherever it was... + remove_item(); + + //... and give it back to the avatar: + UI_add_party_items(1, SHAPE_ORB, 0, 0, false); + } + } + + //Destination unreachable, close moongate: + else + { + closeOrbMoongate(moongate); + UI_error_message("arrived_dest is false"); + } + + } + + //The player interrupted the avatar before reaching the moongate: + if (event == PATH_FAILURE) + { + UI_error_message("Path failure"); + //Sanity check: make sure we ARE talking about a moongate: + if (isOrbMoongate(item)) + { + //Close the moongate: + closeOrbMoongate(item); + + //Make fun of the player: + randomPartyBark(["@No, Avatar.@", "@Let thyself enter.@"]); + } + } + + //The avatar reached the moongate: + else if (event == PATH_SUCCESS) + { + UI_error_message("Path success"); + //Make sure it IS a moongate... + if (isOrbMoongate(item)) + { + //Close the moongate: + closeOrbMoongate(item); + + + + //Teleport avatar: + enterMoongate(item); + } + } +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/packed_balloon.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/packed_balloon.uc new file mode 100755 index 0000000..1c7d6d5 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/packed_balloon.uc @@ -0,0 +1,34 @@ + +void packed_balloon shape#(1232) () +{ + + + var barge = get_barge(); + var party = UI_get_party_list(); + var newballoon = UI_find_nearest(AVATAR, SHAPE_NEW_BALLOON, 31); // + var quality = UI_get_item_quality(item); + var basket_pos = UI_get_object_position(item); + + if ((event == DOUBLECLICK) && (get_distance(AVATAR) < 6)) + { + + if ((UI_get_container(item) == 0)) //checks if on the ground and not in container + { + if (!UI_is_pc_inside(item)) //checks if no roof above + { + UI_set_item_shape(item, SHAPE_BALLOON); + UI_set_item_frame(item, 0); + //play SFX ? + UI_play_sound_effect(88); + //add animations - Avatar bowing + } + else randomPartyBark("@The balloon can't be used here.@"); + } + else randomPartyBark("@Place it on the ground first..@"); + + + } + else randomPartyBark("@Get a little closer to it..@"); + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/panpipes.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/panpipes.uc new file mode 100755 index 0000000..6abfbb2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/panpipes.uc @@ -0,0 +1,16 @@ +void panpipes shape#(1165) () +{ + + if (event == DOUBLECLICK) + { + + + + + } + + + + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/raft.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/raft.uc new file mode 100755 index 0000000..035740d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/raft.uc @@ -0,0 +1,49 @@ +void raft shape#(1241) () +{ + var barge = get_barge(); + var party = UI_get_party_list(); + var raft_pos = UI_get_object_position(item); + + if (event == DOUBLECLICK) + { + + if (UI_get_item_flag(AVATAR, ON_MOVING_BARGE)) //checks to see if already using raft, if so, then disengage + { + UI_clear_item_flag(AVATAR, SAILOR); + UI_clear_item_flag(AVATAR, ON_MOVING_BARGE); + UI_clear_item_flag(AVATAR, IN_MOTION); + + UI_halt_scheduled(item); + + } + + else + //To add: party limit of 6? + { + if (!UI_find_nearby(raft_pos, 961, 10, MASK_EGG)) //will create barge if one not found + { + UI_create_barge_object(8, 8, NORTH); + UI_update_last_created([raft_pos]); + } + if (UI_on_barge()) //everyone should be on barge, if not, they complain + { + UI_set_item_flag(AVATAR, SAILOR); + UI_set_item_flag(AVATAR, ON_MOVING_BARGE); + UI_set_item_flag(AVATAR, IN_MOTION); + + script item // after 6 ticks + { + call DeepWater; + // say "@deep water script called@"; //remove after testing + }; + + } + else + randomPartySay("@Not everyone is on the raft yet!@"); + } + + } + + + + } \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/rawmeat.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/rawmeat.uc new file mode 100755 index 0000000..b0ee6ef --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/rawmeat.uc @@ -0,0 +1,329 @@ + +void meatBurnt object#() () +{ + UI_remove_item(item); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + var rand = UI_die_roll(0, 3); + + if (rand == 0) randomPartyBark("@Thou cooked it too long!@"); + else if (rand == 1) randomPartyBark("@Thou cooked it too long!@"); + else if (rand == 2) randomPartyBark("@'Tis burnt to a crisp!@"); + else if (rand == 3) randomPartyBark("@Such a waste..@"); + +} + +void meatCooked object#() () +{ + var meat_type = UI_get_item_shape(item); + + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + if (meat_type == SHAPE_RAW_BEEF) + { + UI_set_item_shape(item, SHAPE_FOOD); + UI_set_item_frame(item, FRAME_BEEF); + UI_set_item_flag(item, OKAY_TO_TAKE); + randomPartyBark("@Mmmm smells good!@"); + } + + else + + if (meat_type == SHAPE_RAW_CHICKEN) + { + UI_set_item_shape(item, SHAPE_FOOD); + UI_set_item_frame(item, FRAME_CHICKEN); + UI_set_item_flag(item, OKAY_TO_TAKE); + randomPartyBark("@Mmmm smells good!@"); + } + + else + + if (meat_type == SHAPE_RAW_MUTTON) + { + UI_set_item_shape(item, SHAPE_FOOD); + UI_set_item_frame(item, FRAME_MUTTON); + UI_set_item_flag(item, OKAY_TO_TAKE); + randomPartyBark("@Mmmm smells good!@"); + } + + else + + if (meat_type == SHAPE_RAW_VENISON) + { + UI_set_item_shape(item, SHAPE_FOOD); + UI_set_item_frame(item, FRAME_VENISON); + UI_set_item_flag(item, OKAY_TO_TAKE); + randomPartyBark("@Mmmm smells good!@"); + } + + else if (meat_type == SHAPE_RAW_RABBIT) + { + UI_set_item_shape(item, SHAPE_FOOD); + UI_set_item_frame(item, FRAME_VENISON); //change to rabbit food shape when implemented + UI_set_item_flag(item, OKAY_TO_TAKE); + randomPartyBark("@Mmmm smells good!@"); + } + + if (meat_type == SHAPE_RAW_PORK) + { + UI_set_item_shape(item, SHAPE_FOOD); + UI_set_item_frame(item, FRAME_HAM); //change to rabbit food shape when implemented + UI_set_item_flag(item, OKAY_TO_TAKE); + randomPartyBark("@Mmmm smells good!@"); + } + +} + + +void cookingMeat object#() () +{ + const int SFX_COOKING = 20; + var cooking_success = UI_die_roll(0, 5);//gives 1 in 5 chances of success + UI_set_item_flag(AVATAR, BG_DONT_MOVE); //freezes avatar during cooking so meat can't be moved + + if (cooking_success > 0) + { + script item after 1 ticks + { + nohalt; + call GenericFreeze; + sfx SFX_COOKING; + wait 10; + sfx SFX_COOKING; + wait 10; + sfx SFX_COOKING; + wait 10; + call meatCooked; + }; + } + + else + { + script item after 1 ticks + { + nohalt; + sfx SFX_COOKING; + wait 10; + sfx SFX_COOKING; + wait 10; + sfx SFX_COOKING; + wait 10; + sfx SFX_COOKING; + wait 10; + call meatBurnt; + }; + } +} + + + +void useMeatOnFryingPan object#() () +{ + var fryingpan = AVATAR->find_nearest(SHAPE_FRYINGPAN, 5); + + if (fryingpan) + { + placeOnTarget(item, fryingpan, 0, 0, 1); + + if (UI_find_nearby(fryingpan, SHAPE_CAMPFIRE, 1, 0)) + { + script item + { + nohalt; + call cookingMeat; + }; + } + else + randomPartyBark("@Needs to be closer to a campfire to cook.@"); + } + + +} +//-------Raw meat shapes below-------------// + + +void rawBeef shape#(1203) () +{ + if (event == DOUBLECLICK) + { + UI_close_gumps(); + var target = UI_click_on_item(); + var target_coords = getClickPosition(target); + var target_shape = target->get_item_shape(); + var target_quality = target->get_item_quality(); //may not need? + + if (target_shape == SHAPE_FRYINGPAN) + { + script item + { + nohalt; wait 3; + //Place the meat on top of the pan + call useMeatOnFryingPan; + }; + + + } + else randomPartyBark("@Cook that on a frying pan.@"); + } +} + +void rawChicken shape#(1204) () +{ + if (event == DOUBLECLICK) + { + UI_close_gumps(); + var target = UI_click_on_item(); + var target_coords = getClickPosition(target); + var target_shape = target->get_item_shape(); + var target_quality = target->get_item_quality(); //may not need? + + if (target_shape == SHAPE_FRYINGPAN) + { + script item + { + nohalt; wait 3; + //Place the meat on top of the pan + call useMeatOnFryingPan; + }; + + } + else randomPartyBark("@Cook that on a frying pan.@"); + } +} + +void rawHorsemeat shape#(1205) () +{ + if (event == DOUBLECLICK) + { + UI_close_gumps(); + var target = UI_click_on_item(); + var target_coords = getClickPosition(target); + var target_shape = target->get_item_shape(); + var target_quality = target->get_item_quality(); //may not need? + + if (target_shape == SHAPE_FRYINGPAN) + { + script item + { + nohalt; wait 3; + //Place the meat on top of the pan + call useMeatOnFryingPan; + }; + } + else randomPartyBark("@Cook that on a frying pan.@"); + } +} + +void rawRibs shape#(1206) () +{ + if (event == DOUBLECLICK) + { + UI_close_gumps(); + var target = UI_click_on_item(); + var target_coords = getClickPosition(target); + var target_shape = target->get_item_shape(); + var target_quality = target->get_item_quality(); //may not need? + + if (target_shape == SHAPE_FRYINGPAN) + { + script item + { + nohalt; wait 3; + //Place the meat on top of the pan + call useMeatOnFryingPan; + }; + } + else randomPartyBark("@Cook that on a frying pan.@"); + } +} + +void rawVenison shape#(1207) () +{ + if (event == DOUBLECLICK) + { + UI_close_gumps(); + var target = UI_click_on_item(); + var target_coords = getClickPosition(target); + var target_shape = target->get_item_shape(); + var target_quality = target->get_item_quality(); //may not need? + + if (target_shape == SHAPE_FRYINGPAN) + { + script item + { + nohalt; wait 3; + //Place the meat on top of the pan + call useMeatOnFryingPan; + }; + } + else randomPartyBark("@Cook that on a frying pan.@"); + } +} + +void rawMutton shape#(1208) () +{ + if (event == DOUBLECLICK) + { + UI_close_gumps(); + var target = UI_click_on_item(); + var target_coords = getClickPosition(target); + var target_shape = target->get_item_shape(); + var target_quality = target->get_item_quality(); //may not need? + + if (target_shape == SHAPE_FRYINGPAN) + { + script item + { + nohalt; wait 3; + //Place the meat on top of the pan + call useMeatOnFryingPan; + }; + } + else randomPartyBark("@Cook that on a frying pan.@"); + } +} + +void rawRabbit shape#(1209) () +{ + if (event == DOUBLECLICK) + { + UI_close_gumps(); + var target = UI_click_on_item(); + var target_coords = getClickPosition(target); + var target_shape = target->get_item_shape(); + var target_quality = target->get_item_quality(); //may not need? + + if (target_shape == SHAPE_FRYINGPAN) + { + script item + { + nohalt; wait 3; + //Place the meat on top of the pan + call useMeatOnFryingPan; + }; + } + else randomPartyBark("@Cook that on a frying pan.@"); + } +} + +void rawPork shape#(1210) () +{ + if (event == DOUBLECLICK) + { + UI_close_gumps(); + var target = UI_click_on_item(); + var target_coords = getClickPosition(target); + var target_shape = target->get_item_shape(); + var target_quality = target->get_item_quality(); //may not need? + + if (target_shape == SHAPE_FRYINGPAN) + { + script item + { + nohalt; wait 3; + //Place the meat on top of the pan + call useMeatOnFryingPan; + }; + } + else randomPartyBark("@Cook that on a frying pan.@"); + } +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/rubberducky.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/rubberducky.uc new file mode 100755 index 0000000..3891992 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/rubberducky.uc @@ -0,0 +1,9 @@ +void RubberDucky shape#(1135) () // +{ + if (event == DOUBLECLICK) + { + item->item_say("Squeak!"); + UI_play_sound_effect(85); + return; + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/runes.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/runes.uc new file mode 100755 index 0000000..c834ee1 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/runes.uc @@ -0,0 +1,107 @@ +void runes shape#(877) () +{ + /*Rune frames: + const int FRAME_SACRIFICE = 0; + const int FRAME_JUSTICE = 1; + const int FRAME_HUMILITY = 2; + const int FRAME_SPIRITUALITY = 3; + const int FRAME_VALOR = 4; + const int FRAME_COMPASSION = 5; + const int FRAME_HONOR = 6; + const int FRAME_HONESTY = 7; + */ + + //FIELD FRAMES + const int QUALITY_SACRIFICE = 0; + const int QUALITY_JUSTICE = 1; + const int QUALITY_HUMILITY = 2; + const int QUALITY_SPIRITUALITY = 3; + const int QUALITY_VALOR = 4; + const int QUALITY_COMPASSION = 5; + const int QUALITY_HONOR = 6; + const int QUALITY_HONESTY = 7; + +/////////////// + + if (event == DOUBLECLICK) + { + //get frame of rune clicked + var rune_frame = UI_get_item_frame(item); + UI_close_gumps(); + + var target = UI_click_on_item(); //target that is selected + var target_coords = getClickPosition(target); //gets target (field) coords + var target_shape = target->get_item_shape(); //checks if target is field + var target_quality = target->get_item_quality(); // gets target quality (which shrine it is) + + + //first check if the rune has a target + if (!target) + { + randomPartyBark("@That didn't work.@"); + return; + } + + //Then check if the target is a forcefield + if (target_shape == SHAPE_FORCEFIELD) + { + //Shrine of Sacrifice + if ((target_quality == QUALITY_SACRIFICE) && (rune_frame == FRAME_SACRIFICE)) + { + freeShrines("Sacrifice", item); + } + else if ((target_quality == QUALITY_JUSTICE) && (rune_frame == FRAME_JUSTICE)) + { + freeShrines("Justice", item); + } + + //Shrine of Humility + else if ((target_quality == QUALITY_HUMILITY) && (rune_frame == FRAME_HUMILITY)) + { + freeShrines("Humility", item); + } + + //Shrine of Spirituality + else if ((target_quality == QUALITY_SPIRITUALITY) && (rune_frame == FRAME_SPIRITUALITY)) + { + freeShrines("Spirituality", item); + } + + //Shrine of Valor + else if ((target_quality == QUALITY_VALOR) && (rune_frame == FRAME_VALOR)) + { + freeShrines("Valor", item); + } + + //Shrine of Compassion + else if ((target_quality == QUALITY_COMPASSION) && (rune_frame == FRAME_COMPASSION)) + { + freeShrines("Compassion", item); + } + + + //Shrine of Honor + else if ((target_quality == QUALITY_HONOR) && (rune_frame == FRAME_HONOR)) + { + freeShrines("Honor", item); + } + + //Shrine of Honesty + else if ((target_quality == QUALITY_HONESTY) && (rune_frame == FRAME_HONESTY)) + { + freeShrines("Honesty", item); + } + else + randomPartyBark("@This is the wrong rune.@"); + + } + else + UI_flash_mouse(CURSOR_X); + + + } +} + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/rusty_cutlass.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/rusty_cutlass.uc new file mode 100755 index 0000000..fbbcbdf --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/rusty_cutlass.uc @@ -0,0 +1,25 @@ +void rusty_cutlass shape#(561) () +{ + if (event == READIED) + { + if (gflags[CHUCKLES_KILLED]) + { + //Cheating detected or you hid the cutlass + UI_remove_item(item); + + + } + + + + + } + else + return; + + + + + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/scrolls.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/scrolls.uc new file mode 100755 index 0000000..0a4041a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/scrolls.uc @@ -0,0 +1,283 @@ +void showBook () + +{ + var SOUND_BOOK = 14; + //Play book sound: + + UI_play_sound_effect2(SOUND_BOOK, item); + + + //Start book mode for current item: + book_mode(); + +} + + +void scroll shape#(797) () +{ + var player_name = getAvatarName(); + var qual = get_item_quality(); + var msg; + var sound; + + if (event == DOUBLECLICK) + { + if (qual < 52) + { + scroll.original(); + } + + else if (qual == 52) + { + showBook(); + say("The bearer of this letter is granted permission to visit the solitary confinement cells in the Yew city jail. This permission is given by my hand this day. -- Lenora."); + } + + else if (qual == 53) + { + //This is the scroll found in the sewers in the old jail. Starts the Drudgeworth quest + showBook(); + + if (!gflags[READ_LEAFLET]) + { + gflags[READ_LEAFLET] = true; //sets convo flags on Chuckles and Pridgarm + } + say("From the desk of Lord British~~Honourable jailer,~~As decreed by Lord British, the completion of the sewer systems beneath the city will proceed. Construction of the sewers will require demolition of the Royal Prison. Upon our liege's orders I have arranged for the transport of the remaining prisoners, Drudgeworth and Saduj, to the prison in Yew. Pridgarm, jailer of Yew, hath been instructed to put these dangerous criminals in solitary confinement. The transport carriage will be waiting outside the castle gates at midnight in two days, as to not disturb the townsfolk with their mad ravings. Thou wilt accompany the prisoner transport to Yew, and a hefty purse of gold and a promotion is waiting for thee once the transport hath been completed. Contact me personally if thou hast any questions, our liege is much too busy as of late. ~~Chuckles, on behalf of Lord British"); + } + + + else if (qual == 54) //Captain Johne's Scroll + { + showBook(); + say("This scroll contains Captain Johne's notes on the gargoyle language. After studying it for a while, you are now able to understand them!"); + if(!gflags[READ_GARGISH_SCROLL]) + { + UI_set_npc_id(BEHLEM, 1); //can understand beh lem now. + UI_set_npc_id(VALKADESH, 1); //can understand valkadesh now. + UI_set_npc_id(NAXATILOR, 1); //can understand naxatilor now. + UI_set_npc_id(BOLESH, 1); //can understand Bolesh now. + UI_set_npc_id(GOODSCRAFTER, 1); //can understand Goodscrafter now. + UI_set_npc_id(SNAKECHARMER, 1); //can understand now. + UI_set_npc_id(WEAPONSMITH, 1); + UI_set_npc_id(FARMER_KRILL, 1); + UI_set_npc_id(HEALER, 1); + UI_set_npc_id(CARETAKER, 1); + UI_set_npc_id(FOODMAKER, 1); + UI_set_npc_id(FARMER_NASH, 1); + UI_set_npc_id(LENSMAKER, 1); + + + UI_clear_item_flag(NAXATILOR, SI_ZOMBIE); // used to get intelligent Beh Lem convo since gflag wasn't working + UI_clear_item_flag(DRAXINUSOM, SI_ZOMBIE); // used for bark when read scroll but not yet met + + UI_set_item_flag(VALKADESH, CONFUSED); //starts not officially met Valk, but read scroll convo + UI_set_item_flag(NAXATILOR, CONFUSED); //starts not officially met Valk, but read scroll convo + gflags[READ_GARGISH_SCROLL] = true; //allows Avatar to read gargish and understand gargoyles + } + } + + else if (qual == 55) + { + showBook(); + say("Michael ~~ I beseech thee.. give me more time to repay my debt to you. Our nets have been empty as of late, so income is sparse. I promise that the money will come up, I just need more time. Marney + means everything to me and she's all I have left. If not for me, grant the time for Marney's sake. Please consider mine request, and I will give thee the money owed.~~"); + say("~Quenton"); + } + + else if (qual == 56) + { + showBook(); + say("With love, from cousin Manrel."); + } + + else if (qual == 57) + { + showBook(); + say("Ship deed to the Lady o' the Sea, commissioned by Fentrissa of Bucaneer's Den."); + } + + else if (qual == 58) + { + showBook(); + say("Sir Garen, ~~ I have received word from Sir Geoffrey that the Shrine of Honor hath also fallen prey to the gargoyles. Since thou'rt already in Trinsic on thy last assignment, I need thine assistance. Thy new assignment is to scout out the Shrine of Honor and gauge the size of the occupying force. Reinforcements are scarce and must be routed to areas where there are the most gargoyle activity. Respond quickly, and may the virtues be with thee. In honor~~ -Sir Aiden"); + } + + else if (qual == 59) + { + var balloon_items = [SHAPE_CAULDRON, SHAPE_BALLOON_BASKET, SHAPE_BALLOON_BAG, SHAPE_ROPE]; + UI_close_gumps(); + showBook(); + say("Plans for the construction of a hot air balloon ~~ First you must have a wicker balloon basket made, large enough to carry several passengers. Then you'll need a big iron cauldron, to hold a fire to generate the hot air. Next you must have a huge bag sewn out of silk, to hold the hot air in. Lastly, get enough rope to tie the balloon securely to the basket. Once you've gathered all of these together, use these plans to assemble them. When flying your balloon, you'll find that a ship's anchor makes the best ballast, and is also useful for stopping the balloon where and when you wish."); + + if ((!gflags[MADE_BALLOON]) && (gflags[READ_BALLOON_PLANS])) + { + if ((UI_count_objects(PARTY, SHAPE_BALLOON_BASKET, QUALITY_ANY, FRAME_ANY) > 0) && (UI_count_objects(PARTY, SHAPE_CAULDRON, QUALITY_ANY, FRAME_ANY) > 0) && (UI_count_objects(PARTY, SHAPE_BALLOON_BASKET, QUALITY_ANY, FRAME_ANY) > 0) && (UI_count_objects(PARTY, SHAPE_ROPE, QUALITY_ANY, FRAME_ANY) > 0)) + { + UI_remove_party_items(1, SHAPE_BALLOON_BASKET, QUALITY_ANY, FRAME_ANY); + UI_remove_party_items(1, SHAPE_BALLOON_BAG, QUALITY_ANY, FRAME_ANY); + UI_remove_party_items(1, SHAPE_CAULDRON, QUALITY_ANY, FRAME_ANY); + UI_remove_party_items(1, SHAPE_ROPE, QUALITY_ANY, FRAME_ANY); + + UI_add_party_items(1, SHAPE_PACKED_BALLOON, QUALITY_ANY, FRAME_ANY); + gflags[MADE_BALLOON] = true; + } + else randomPartyBark("@We are missing something..@"); + } + + if (!gflags[READ_BALLOON_PLANS]) //if global flag not true, it sets it after first read. + { + gflags[READ_BALLOON_PLANS] = true; + } + } + else if (qual == 60) + { + showBook(); + say("By proclamation of Lord British this is an official document denoting ownership of the heretofore mentioned sailing vessel. Forgery of this title is prohibited under law no. 1989832.A5, section 809."); + say("~DEED~~SHIP NAME: Golden Hinde~COMPLETION DATE: 7-08-0160~INSPECTION DATE: 7-12-0160~SHIPWRIGHT: Peer of Jhelom"); + } + + else if (qual == 61) + { + showBook(); + say("UOR Resume"); + } + + else if (qual == 62) + { + AVATAR.say("@Strange.. this letter is stained with blood..@"); + AVATAR.hide(); + showBook(); + + say("Quenton-~~"); + say("My patience with you has run out after our last meeting, as I have come back empty without payment. I don't run a charity, and you've had plenty of time to repay thy loan."); + say("The next time I come into town, you better have my money ready. If you have nothing but more excuses for me, I might be inclined to take some collateral..."); + say("I'm sure Marney wouldn't mind.."); + say("~~You have until tomorrow eve. I'll return in the night, at our pre-arranged meeting place. Don't be late, and don't come empty handed.~~"); + say("-Michael"); + UI_close_gumps(); + + randomPartyBark("@Don't forget to grab the scrolls!@"); + + //move Marney, Michael to docks + + + + } + else if (qual == 63) + { + showBook(); + + say("Dearest Michael-~~"); + say("I count down the hours until we meet again. You are a lone beacon of light in my darkness since my father was killed by the gargoyles. I have decided to come with you on the voyage you mentioned to me in your last visit to town."); + say("I look forward to the voyage with you and seeing the world, since I've never seen much beyond mine home. Yorl has forbidden me from seeing you, so we will need to meet up in secret. I will be waiting for you at the docks before midnight in three days."); + say("Yorl will be asleep by then and I can leave him a letter that he will find on the docks once we have left. Until next we meet, I shall be thinking of thee.~~"); + say("-Marney"); + UI_close_gumps(); + + if (!gflags[QUENTON_MURDER_SOLVED] || !gflags[MICHAEL_CAPTURED] || !gflags[MARNEY_GONE] || !gflags[MARNEY_SAVED]) + randomPartyBark("@That's tonight, we must hurry!@"); + + //move Marney, Michael to docks + + + + } + + else if (qual == 64) + { + showBook(); + + UI_close_gumps(); + + say("If you're looking for the clue, there's something for you under a plant in Serpent's Hold."); + + } + else if (qual == 65) + { + showBook(); + + UI_close_gumps(); + + say("This scroll is filled with Lord British's notes on his astronomical observations."); + + } + + else if (qual == 66) + { + showBook(); + say("Ship deed to the Majestic Seahorse, commissioned by Peer of Jhelom."); + } + + else if (qual == 67) + { + showBook(); + say("Ship deed to the Beckoning Siren, commissioned by Trebor of Minoc."); + } + +//Chuckles quest scrolls + + else if (qual == 68) + { + showBook(); + say("Your next hint is under a beehive in Minoc."); + } + + else if (qual == 69) + { + showBook(); + say("You're doing well! Next you should search the harpsichord in the Blue Bottle Tavern."); + } + + else if (qual == 70) + { + showBook(); + say("Well done! Now go search the beds in the jail in Yew."); + } + + else if (qual == 71) + { + showBook(); + say("Most people would have given up by now... But since you haven't, you can find the next hint under a cauldron in New Magincia."); + } + + else if (qual == 72) + { + showBook(); + say("You're almost there! Search the stone lions in Lord British's castle."); + } + + else if (qual == 73) + { + showBook(); + say("Ho eyo he hum! You've won, you've won! Go to Iolo's hut and ask Smith the horse to tell you the clue!"); + if (!gflags[SOLVED_CHUCKLES_QUEST]) + gflags[SOLVED_CHUCKLES_QUEST] = true; + } + + else if (qual == 74) + { + showBook(); + say("This scroll is filled with Lord British's notes on his astronomical observations."); + + } + else if (qual == 75) + { + showBook(); + say("I look to the moon and stars,"); + say("Somewhere underneath of them she's there.."); + } + + + + else + { + showBook(); + say("This is not a valid scroll QUAL attribute! Stop cheating!"); + } + + } + +} + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/shears.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/shears.uc new file mode 100755 index 0000000..c734eb5 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/shears.uc @@ -0,0 +1,44 @@ +/* + * + * Copyright (C) 2006 Alun Bestor/The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Author: Marzo Junior (reorganizing/updating code by Alun Bestor) + * Last Modified: 2006-03-19 + */ +const int SHAPE_SHEEP = 970; +const int SHAPE_BANDAGE = 827; +//Reimplemented to allow sheep-shearing +void Shears shape#(0x2BA) () +{ + var target; + var target_shape; + + if (event != DOUBLECLICK) + return; + target = UI_click_on_item(); + target_shape = target->get_item_shape(); + + if (target_shape == SHAPE_CLOTH) + { + target->set_item_shape(SHAPE_BANDAGE); + target->set_item_frame(UI_die_roll(0, 2)); + } + else if (target_shape == SHAPE_SHEEP) + startShearing(target); //located in sheep.uc + else + randomPartySay("@Might not those come in handy for cutting cloth into bandages?@"); +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/shovel.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/shovel.uc new file mode 100755 index 0000000..2a47c01 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/shovel.uc @@ -0,0 +1,320 @@ +void removeDirt object#() () +{ + const int SHAPE_SOFT_DIRT = 1191; + var dirt = UI_find_nearby_avatar(SHAPE_SOFT_DIRT); + UI_remove_item(dirt[1]); + UI_error_message("Dirt should be removed"); +} + + +void DigResultGrave object#() () +{ + + var target = UI_find_nearby(AVATAR, SHAPE_GRAVE, 1, MASK_NONE); + var target_shape = UI_get_item_shape(target); + var avatar_pos = UI_get_object_position(AVATAR); + var target_quality = target->get_item_quality(target); + var position = UI_get_object_position(target); + var rand = UI_get_random(100); + + + //change grave to dug up grave shape + UI_set_item_shape(target, SHAPE_OPEN_GRAVE); + + //based on quality, change frame to diff type + if (target_quality == 0) + target->set_item_frame(FRAME_GREY_COFFIN); + else if (target_quality == 1) + target->set_item_frame(FRAME_BROWN_COFFIN); + else if (target_quality == 2) //WONT SPAWN A GHOST (used for Quenton, Gwen's grave) + target->set_item_frame(FRAME_BROWN_COFFIN); + else + target->set_item_frame(FRAME_EMPTY_GRAVE); + + //prevent it from disappearing + UI_clear_item_flag(target, TEMPORARY); + + + //30 % chance you disturb the undead! + if (rand >= 60) + { + //if grave is quality 2 don't spawn a ghost- used for "friendly graves" (can't have duplicate Quenton!) + if (target_quality != 2) + { + var target_coords = UI_get_object_position(target); + + //create ghost at position + var ghost = UI_create_new_object2(SHAPE_GHOST, [target_coords[X]-2, target_coords[Y]-2]); + + //set alignment to EVIL + ghost->set_alignment(EVIL); + + //make it attack + ghost->set_schedule_type(IN_COMBAT); + + //for color + randomPartyBark("@Ghost!!!@"); + } + + } + +} + + + + + +void DigResult object#() () +{ + var result = UI_die_roll(0, 20); + var booty = UI_die_roll(0, 2); + var gem_frame = UI_die_roll(0, 13); + var avatar_pos = UI_get_object_position(AVATAR); + var gem = UI_create_new_object(SHAPE_GEM); + + + + + if (result == 5) //give gold nugget + { + UI_create_new_object2(SHAPE_GOLDNUGGET, avatar_pos); + avatarBark("I've struck gold!"); + } + else + + if (result == 20) //give gem + { + var gem = UI_create_new_object(SHAPE_GEM); + UI_update_last_created(avatar_pos); + UI_set_item_frame(gem, gem_frame); + avatarBark("Eureka!"); + } + + else avatarBark("Nothing..."); +} + + +void AvatarDig object#() () +{ + + //var target = UI_click_on_item(); //target that is selected + var target_shape = item->get_item_shape(); + var target_frame = item->get_item_frame(); + var target_coords = getClickPosition(item); + + script AVATAR after 5 ticks + { + face north; + wait 5; + actor frame USE; + wait 5; + // actor frame standing; + // wait 5; + actor frame SWING_2H_3; + sfx 3; + wait 5; + actor frame SWING_2H_2; + sfx 6; + wait 5; + + face north; + wait 5; + actor frame USE; + wait 5; + // actor frame standing; + // wait 5; + actor frame SWING_2H_3; + sfx 3; + wait 5; + actor frame SWING_2H_2; + sfx 6; + wait 5; + + face north; + wait 5; + actor frame USE; + wait 5; + // actor frame standing; + // wait 5; + actor frame SWING_2H_3; + sfx 3; + wait 5; + actor frame SWING_2H_2; + sfx 6; + wait 5; + call DigResult; + } +} + +void AvatarDigGrave object#() () +{ + UI_error_message("AvatarDigGrave called"); + var target_shape = item->get_item_shape(); + var target_frame = item->get_item_frame(); + var target_coords = getClickPosition(item); + + script AVATAR after 5 ticks + { + face north; + wait 5; + actor frame USE; + wait 5; + // actor frame standing; + // wait 5; + actor frame SWING_2H_3; + sfx 3; + wait 5; + actor frame SWING_2H_2; + sfx 6; + wait 5; + + face north; + wait 5; + actor frame USE; + wait 5; + // actor frame standing; + // wait 5; + actor frame SWING_2H_3; + sfx 3; + wait 5; + actor frame SWING_2H_2; + sfx 6; + wait 5; + + face north; + wait 5; + actor frame USE; + wait 5; + // actor frame standing; + // wait 5; + actor frame SWING_2H_3; + sfx 3; + wait 5; + actor frame SWING_2H_2; + sfx 6; + wait 5; + call DigResultGrave; + } + +} + +void shovel shape#(625) () +{ + enum cave_tiles + { + SHAPE_DEBRIS = 202, + SHAPE_TEST = 18, //REMOVE WHEN DONE - blue tile shape for testing + SHAPE_CAVE_FLOOR = 49, + SHAPE_CAVE_FLOOR2 = 50, + SHAPE_CAVE_FLOOR3 = 51, + SHAPE_CAVE_FLOOR4 = 52, + SHAPE_CAVE_FLOOR5 = 53, + SHAPE_CAVE_FLOOR6 = 54, + SHAPE_CAVE_FLOOR7 = 56, + + SHAPE_SOFT_DIRT = 1191 + }; + + + var quality = item->get_item_quality(); + var pos; + var framenum = UI_get_item_frame(item); + var cave_tiles = [SHAPE_CAVE_FLOOR, SHAPE_TEST, SHAPE_CAVE_FLOOR2, SHAPE_CAVE_FLOOR3, SHAPE_CAVE_FLOOR4, SHAPE_CAVE_FLOOR5, SHAPE_CAVE_FLOOR6, SHAPE_CAVE_FLOOR7, SHAPE_DEBRIS, SHAPE_SOFT_DIRT]; + + if (event == DOUBLECLICK) + { + UI_close_gumps(); + + if (UI_is_readied(AVATAR, BG_BOTH_HANDS, SHAPE_SHOVEL, FRAME_ANY)) + { + var target = UI_click_on_item(); //target that is selected + var target_shape = target->get_item_shape(); + var target_frame = target->get_item_frame(); + var target_quality = target->get_item_quality(); + var target_coords = getClickPosition(target); + var direction = AVATAR->find_direction(target_coords); + + if (direction == NORTH) + { + target_coords[X] = (target_coords[X] - 1); //fine + target_coords[Y] = (target_coords[Y] - 1); + } + + + + if (target_shape == SHAPE_GRAVE) + { + UI_set_item_flag(target, TEMPORARY); //set to isolate grave shape from others + UI_si_path_run_usecode(AVATAR, target_coords, false, target, AvatarDigGrave, false); + + //whining from companions + randomPartyBark("@Should we be doing this?@"); + } + else if (target_shape == SHAPE_SOFT_DIRT) + { + + script AVATAR after 3 ticks + { + face north; + wait 5; + actor frame USE; + wait 5; + + actor frame SWING_2H_3; + sfx 3; + wait 5; + actor frame SWING_2H_2; + sfx 6; + wait 5; + + face north; + wait 5; + actor frame USE; + wait 5; + + actor frame SWING_2H_3; + sfx 3; + wait 5; + actor frame SWING_2H_2; + sfx 6; + wait 5; + + face north; + wait 5; + actor frame USE; + wait 5; + + actor frame SWING_2H_3; + sfx 3; + wait 5; + actor frame SWING_2H_2; + sfx 6; + wait 5; + + call removeDirt; + } + + + + } + else + { + + UI_si_path_run_usecode(AVATAR, target_coords, false, target, AvatarDigGrave, false); + + } + + + } + else + randomPartyBark("@You have to ready the shovel to use it.@"); + + + + } +} + + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/signs.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/signs.uc new file mode 100755 index 0000000..c8cee67 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/signs.uc @@ -0,0 +1,239 @@ +void signs shape# (1141)() +{ + /* original signs from shape 379 + 0. Drink At The Gilded Lizard + 1. Skara Brae Population 47 + 2. Trinsic + 3. The Honorable Hound + 4. Fellowship Hall + 5. Britain + 6. Coming: Raymundos Trials of the Avatar + 7. Reserve Thy Seats Now + 8. Royal Museum + 9. The Music Hall + 10. -- + 11. The Wayfarers Inn + 12. Iolos Bows + 13. The Blue Boar + 14. Gayes Clothiers + 15. North Star Armoury + 16. The Oaken Oar + 17. Bakery + 18. Jeweler + 19. Farmers Market + 20. Apothecary + 21. Royal Mint + 22. Csil The Healer + 23. Provisions + 24. Royal Orchards + 25. Test of Strength-- Art Thou An Avatar + 26. Punch And Judy Show + 27. Fish N Chips + 28. Cove + 29. The Emerald + 30. Out 'N Inn + 31. Lovers Walk + 32. Buccaneers Den + 33. The Baths + 34. House of Games + 35. The Fallen Virgin + 36. Budos + 37. Meditation Retreat + 38. -- + 39. -- + 40. -- + 41. -- + 42. -- + 43. -- + 44. Go This Way + 45. -- + 46. -- + 47. -- + 48. -- + 49. -- + 50. -- + 51. -- + 52. Lycaeum + 53. The Hallowed Dock + 54. The Friendly Knave + 55. The Gilded Lizard + 56. Healer + 57. Eldroths Provisions + 58. House of Items + 59. Britannian Mining Company + 61. Trainer + 62. Scholar + 63. Town Hall + 64. Wis-Surs Magics + 65. Observatory + 66. Vesper + 67. Moonglow + 68. Terfin + 69. Serpents Hold + 70. Empath Abbey + 71. Jhelom + 72. Minoc + 73. Undertaker + 74. High Court of Britannia + 75. Prison + 76. The Modest Damsel + 77. Armoury + 78. Blacksmith + 79. Recreation Center + 80. Hall of Knowledge + 81. Hello There Avatar + 82. Tonight 9-12 In Person The Avatars + 83. Why Ask Why + 84. Street of Honor + 85. Paladins Path + 86. Avenue of the Fellowship + 87. Widows Walk + 88. Harolds Hallway + 89. Fools Way + 90. Whitsaber Road + 91. Strand + 92. Chalice Avenue + 93. Two Coves + 94. West Wall Road + 95. East Wall Road + 96. North Wall Road + 97. South Wall Road + 98. Heroes Way + 99. Iolo's South + 100. Paws + 101. To Salty Dog + 102. Fellowship Shelter + 103. Vesper Branch + 104. The Checquered Cork + 105. Artists Guild + 106. The Bunk and Stool + 107. The Library of Scars + 108. Carlyns Clothes + 109. Within These Walls Lies Master Richard + 110. Castle Way + 111. Lord British Lane + 112. Noble Road + 113. West End Avenue + 114. Hazle Lane + 115. Park Square North + 116. Park Square South + 117. Market Street + 118. Golden Way + 119. Center Avenue + 120. Spike Lane + 121. Avatar Avenue + 122. Stable Lane + 123. East End Avenue + 124. Farm Road + 125. Nugget Street + 126. Cool Cove + 127. North End Avenue + 128. Golden Eye Way + 129. To The Dark Tower + 130. Beware of Landslides + 131. Danger: Do Not Enter + 132. Old Number One + 133. Do Not Free The Liche + 134. Beware Monsters Within + 135. Hauhers Graves + 136. Manrik A Soul Of A Soul + 137. Here Lies Jules No Worse For The Loss + 138. Morgan Her Death A Tragedy + 139. Here Lies Kethian Friend To Many + 140. Wadley His Soul Deeper Than His Body + 141. Here Lies Jenna Kindred Spirit + 142. Dead End + 143. To Skara Brae + 144. The Throne Of the Guardian + 145. North To Britain + 146. Pull Lever + 147. Round And Round + 148. Way Out + 149. Keep Doors Open + 150. Selwyns Tower + 151. Follow The Fire + + */ + + if (event == DOUBLECLICK) + { + var quality = UI_get_item_quality(item); + var msg; + + UI_close_gumps(); + + if (quality == 0) + msg = ["beware", "of", "the", "beast"]; + + else if (quality == 1) + msg = ["The", "Spiritual", "Path"]; + + else if (quality == 2) msg = ["The Kings Way"]; + + else if (quality == 3) msg = ["Kafiristan Pass"]; + + + else if (quality == 4) msg = ["For Sale"]; + + else if (quality == 5) msg = ["The crypt", "of", "Cantrell"]; + + else if (quality == 6) msg = ["The crypt", "of", "Spector"]; + + else if (quality == 7) msg = ["The crypt", "of", "Beyvin"]; + + else if (quality == 8) msg = ["The crypt", "of", "Malone"]; + + else if (quality == 9) msg = ["The crypt", "of", "Bourbonnais"]; + + else if (quality == 10) msg = ["The crypt", "of", "Jannati"]; + + else if (quality == 11) msg = ["The crypt", "of", "Romero"]; + + else if (quality == 12) msg = ["The crypt", "of", "Dwyer"]; + + else if (quality == 13) msg = ["The crypt", "of", "Gabriella"]; + + else if (quality == 14) msg = ["The", "Blue", "Bottle"]; + + else if (quality == 15) msg = ["Fool's Pair", "o'", "Dice"]; + + else if (quality == 16) msg = ["Avatar Lane"]; + + else if (quality == 17) msg = ["Bellringer Lane"]; + + else if (quality == 18) msg = ["Serpents Loop"]; + + else if (quality == 19) msg = ["Keep Out!"]; + + else if (quality == 20) msg = ["This way"]; + + else if (quality == 21) msg = ["That way"]; + + else if (quality == 22) msg = ["Drop to", "your death!"]; + + else if (quality == 23) msg = ["This way"]; + + else if (quality == 24) msg = ["That way"]; + + else if (quality == 25) msg = ["The Maze", "Of death!"]; + + else if (quality == 26) msg = ["Off Limits!"]; + + else if (quality == 27) + msg = ["Celestial Garden"]; + + else if (quality == 28) + msg = ["Please leave", "your weapons", "on the table"]; + + else if (quality == 29) + msg = ["The Well", "of", "Humility"]; + + else + msg = ["Stop Cheating!"]; + + + UI_display_runes(49, msg); + + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/skiff.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/skiff.uc new file mode 100755 index 0000000..20cd5c8 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/skiff.uc @@ -0,0 +1,15 @@ +void skiff shape#(1150) () +{ +var party = UI_get_party_list(); + + if (event == DOUBLECLICK) + { + if (UI_get_array_size(party) > 5) + { + randomPartySay("@'Twould appear we cannot all fit inside the skiff.@"); + return; + } + + } +} + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/spell_scroll.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/spell_scroll.uc new file mode 100755 index 0000000..0688134 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/spell_scroll.uc @@ -0,0 +1,60 @@ +//Reworked from previously used for Pickpocket spell. Pickpocket is now replacing one of the original u7 spells and is used from the spellbook + + +void magicScroll shape# (1147) () +{ + const int BUBBLES = 21; + if (event == DOUBLECLICK) + { + + + + + var spellbook = AVATAR->find_object(761, QUALITY_ANY, FRAME_ANY); + + if (spellbook > 0) + { + if (!hasSpell(ARMAGEDDON)) + { + UI_add_spell(ARMAGEDDON, 0, spellbook); + UI_close_gumps(); + UI_play_sound_effect(68); + UI_sprite_effect(BUBBLES, 0, 0, 0, 0, 0, -1); + UI_obj_sprite_effect(AVATAR, BUBBLES, 0, 0, 0, 0, 0, -1); + + UI_item_say(AVATAR, "'Armageddon' has been transcribed.."); + + //remove item + UI_remove_item(item); + + } + else //Cheating detected, game go boom! + { + UI_error_message("That's not supposed to happen."); + randomPartyBark("@Uh oh...@"); + UI_armageddon(); + } + + } + else + { + UI_flash_mouse(1); + UI_item_say(AVATAR, "I need a spellbook for this."); + } + + + + } + +} + + + + + + + + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/storm_cloak.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/storm_cloak.uc new file mode 100755 index 0000000..d573844 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/storm_cloak.uc @@ -0,0 +1,153 @@ +extern var getOuterContainer 0x945(var obj); +extern void spellFails object#(0x606) (); + + +void StormCloak shape#(1247) () +{ + if (event == READIED) + { + UI_close_gumps2(); + + if (AVATAR->is_readied(BG_CLOAK, SHAPE_STORM_CLOAK, FRAME_ANY)) + { + //AVATAR->close_gumps2(); //didn't work + //UI_close_gumps2(); + UI_error_message("Gumps should be closed now"); + + + } + + UI_error_message("Storm cloak equipped!"); + // Come back here next tick to do initial cleanup. + + //set anti magic weather + UI_set_weather(SPARKLE); + + + // Add more spells here: + var spell_shapes = [281, 408, 527, 807, 856]; + + // Who is wearing the cloak: + var wearer = getOuterContainer(item); + + // How far from the wearer we want to search. + var dist = 20; + + // Find all nearby NPCs, of any shape, within 20 tiles and whether or + // not they are invisible. + var npc_list = wearer->find_nearby(-359, dist, 0x28); + + // To prevent party NPCs from being affected. + var party = UI_get_party_list(); + + // For color. + var barks = ["My pretty spells are gone!", "My magic?!!", "My spells?!!"]; + var numbarks = UI_get_array_size(barks); + + for (npc in npc_list) + { + var align = npc->get_alignment(); + var in_party = npc->get_npc_object(); + + // Is the NPC is being attacked by a party member? + if (in_party || !(npc->get_oppressor() in party)) + { + // No. Check basic alignment only. + + if (in_party || align == 0) + { + // Friendly NPCs and party members. + + // Uncharm. + npc->clear_item_flag(2); + // Uncurse. + npc->clear_item_flag(3); + // Unparalyze. + npc->clear_item_flag(7); + + // Do nothing else. + continue; + } + else if (align == 1) + { + // Neutral NPCs. + + // Do nothing? Do everything? Your choice. + + // I went with 'do nothing'. + continue; + } + } + + // Hostile and random NPCs, fighting neutral NPCs or friendly NPCs + // being attacked by party members. + + // We want to delete spells, if any. + + // We also want to count how many spells were deleted. + var cnt = 0; + + // Go through the spell shapes. + for (spell in spell_shapes) + { + // Remove all spells of this shape that the NPC is carrying. + cnt += npc->remove_cont_items(-359, spell, -359, -359, true); + } + + // Did we delete any spells? + if (cnt > 0) + { + // We did. Now we must to do a couple more things. + + // 'Magebane' effect: prevents mages from teleporting, turning + // invisible or summoning more foes. + npc->set_item_flag(31); + + // Color: spell fizzle effect plus surprised bark. + script npc after UI_die_roll(4,8) ticks + { + call spellFails; + wait 4; + say barks[UI_get_random(numbarks)]; + } + } + + // The following are optional tweaks: + // Force visible. + npc->clear_item_flag(0); + // Uncharm. + npc->clear_item_flag(2); + // Uncurse. + npc->clear_item_flag(3); + // Unparalyze. + npc->clear_item_flag(7); + // Unprotect. + npc->clear_item_flag(9); + // Remove might. + npc->clear_item_flag(12); + } + + + // Script it to return here again. + script item after 4 ticks // Change this at your leisure. + { + // nohalt; + call StormCloak; + } + + + + } + + else if (event == UNREADIED) + { + UI_close_gumps(); + UI_error_message("Storm cloak un-equipped"); + UI_halt_scheduled(item); + UI_set_weather(CLEAR_WEATHER); + + } + + + +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/tombstones.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/tombstones.uc new file mode 100755 index 0000000..9e2ca29 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/tombstones.uc @@ -0,0 +1,327 @@ +void tombstones shape# (715)() +{ + var quality = get_item_quality(); + + //CAN ONLY BE 9 CHARs Long! + //TH = ( + //NG = * + //EA = + + + if (event == DOUBLECLICK) + { + UI_close_gumps(); + var msg; + var msg1; + var msg2; + var msg3; + var quality = get_item_quality(); + + if (quality == 0) + msg = ["seeking", "a", "present"]; + + else if (quality == 1) + msg = ["to give", "a", "druid"]; + + else if (quality == 2) + + msg = ["try a", "bottle of", "our"]; + + else if (quality == 3) + + msg = ["embalming", "fluid"]; + + else if (quality == 4) + + msg = ["burma", "grave"]; + + else if (quality == 5) + + msg = ["as you", "are now", "so once was i", "as i am you", "shall soon be" ,"prepare", "for death", "when this", "you see"]; + + else if (quality == 6) + + msg = ["as i am", "you shall", "soon be"]; + + else if (quality == 7) + + msg = ["The crypt", "of", "Beyvin"]; + + else if (quality == 8) + + msg = ["The crypt", "of", "Malone"]; + + else if (quality == 9) + + msg = ["The crypt", "of", "Bourbonnais"]; + + else if (quality == 10) + + msg = ["The crypt", "of", "Jannati"]; + + else if (quality == 11) + + msg = ["The crypt", "of", "Romero"]; + + else if (quality == 12) + + msg = ["The crypt", "of", "Dwyer"]; + + else if (quality == 13) + + msg = ["The crypt", "of", "Gabriella"]; + + else if (quality == 14) + { + msg1 = ["Husband", "the first Sir", "Cedric burned", "with fire bold"]; + msg = ["till his life", "was quenched", "with a", "dagger cold"]; + UI_display_runes(50, msg1); + } + + else if (quality == 15) + { + msg1 = ["Husband", "the second", "Roderic passed", "with an awful", "wail"]; + msg = ["when", "someone served", "him poisoned", "ale"]; + UI_display_runes(50, msg1); + } + + else if (quality == 16) //for long tombstones- show last msg first. 'msg' always displays first + { + msg1 = ["Husband", "the third", "Walter passed", "on in", "his sleep"]; + msg = ["his thoughts", "a secret", "that death", "will keep"]; + UI_display_runes(50, msg1); + } + + else if (quality == 17) + { + msg1 = ["Husband", "the fourth", "Rogers manner", "was formal"]; + msg2 = ["and stiff", "till one day", "he fell off", "a cliff"]; + msg3 = ["but now", "his bodys a", "cordial host"]; + msg = ["to worms", "and maggots", "for he's", "a ghost"]; + UI_display_runes(50, msg1); + UI_display_runes(50, msg2); + UI_display_runes(50, msg3); + } + + + else if (quality == 18) + { + msg1 = ["Husband", "the fifth", "Martin left", "this world", "of toil"]; + msg = ["when he", "fell in a", "vat of", "boiling oil"]; + UI_display_runes(50, msg1); + } + + else if (quality == 19) + { + msg1 = ["Though she", "outlasted", "husbands five"]; + msg2 = ["now Beth", "too is", "no more", "alive"]; + msg3 = ["but as", "she drew her", "final breath"]; + msg = ["she smiled", "a smile", "to scoff", "at death"]; + UI_display_runes(50, msg1); + UI_display_runes(50, msg2); + UI_display_runes(50, msg3); + } + + else if (quality == 20) + { + msg1 = ["Here lies a", "man twas", "known as Ed"]; + msg = ["So Loud", "alive so", "quiet dead"]; + UI_display_runes(50, msg1); + + } + + else if (quality == 21) + { + msg1 = ["Hinges", "Rusty on", "your loved", "ones coffin"]; + msg = ["tis not", "a box", "that youll", "open often", "burma grave"]; + + UI_display_runes(50, msg1); + + } + + else if (quality == 22) + { + msg1 = ["Golden", "Lads and", "Lasses Must"]; + msg = ["Like", "Chimney", "sweepers", "come to", "dust"]; + UI_display_runes(50, msg1); + } + + else if (quality == 23) + { + msg1 = ["This great", "Musician is", "not just", "dozing"]; + msg = ["Here he", "lies now", "decomposing"]; + UI_display_runes(50, msg1); + } + + else if (quality == 24) + { + msg1 = ["Here Lies", "Johns body", "we lost", "his head"]; + msg = ["but he", "doesnt need it", "because hes", "dead"]; + UI_display_runes(50, msg1); + } + + else if (quality == 25) + { + msg1 = ["as you are", "now so once", "was I"]; + msg2 = ["as I am", "now you soon", "shall be"]; + msg = ["Prepare", "for death", "when this", "you see"]; + UI_display_runes(50, msg1); + UI_display_runes(50, msg2); + } + + else if (quality == 26) + { + msg1 = ["On his", "wifes birthday", "Ralph Was", "Clever"]; + msg = ["A Tombstones", "the gift", "that lasts", "forever", "burma grave"]; + UI_display_runes(50, msg1); + } + +//Skara Brae + + else if (quality == 27) + { + msg1 = ["here lies", "the wretched", "remains of", "the archmage", "flain"]; + msg = ["buried", "where he", "was slain"]; + UI_display_runes(50, msg1); + } + + else if (quality == 28) + { + msg1 = ["here lies", "captain hawkins", "he died a", "hard death"]; + msg = ["and he", "deserved it"]; + UI_display_runes(50, msg1); + } + + else if (quality == 29) + { + msg = ["here lies", "Quenton", "Beloved Father","and","friend"]; + + } + else if (quality == 30) + { + msg = ["here lies", "Gwen", "Gone too soon"]; + + } + + else if (quality == 31) + { + msg = ["here lies", "Kindor", "killed by", "a Shadowlord"]; + + } + //graves in New Magincia + else if (quality == 32) + { + msg = ["here lies", "heywood", "1-1-136"]; + + } + + else if (quality == 33) + { + msg = ["here lies", "Slim", "1-1-136"]; + + } + + else if (quality == 34) + { + msg = ["here lies", "Banter", "1-1-136"]; + + } + + else if (quality == 35) + { + msg = ["here lies", "Demitry", "1-1-136"]; + + } + + else if (quality == 36) + { + msg = ["here lies", "Bulbous", "1-1-136"]; + + } + + else if (quality == 37) + { + msg = ["here lies", "Rushin", "1-1-136"]; + + } + + else if (quality == 38) + { + msg = ["here lies", "Rogi"]; + + } + + else if (quality == 39) + { + msg = ["here lies", "Isaac"]; + + } + + else if (quality == 40) + { + msg1 = ["Here lies", "S.J."]; + msg = ["He came", "he saw", "he raged"]; + UI_display_runes(50, msg1); + } + + else if (quality == 41) + { + msg1 = ["Here lies", "Alex C."]; + msg = ["His treasure", "Confiscated"]; + UI_display_runes(50, msg1); + } + + else if (quality == 42) + { + msg1 = ["Here lies", "Odkin"]; + msg = ["His work", "Unfinished"]; + UI_display_runes(50, msg1); + } + else if (quality == 43) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["Anten Nom"]; + else + msg = ["To have lacked", "a name"]; + UI_display_runes(50, msg); + } + //gargoyle cemetery + else if (quality == 44) + { + if (!gflags[READ_GARGISH_SCROLL]) + msg = ["kahmanizende", "manchar"]; + else + msg = ["Sacrificial", "remains"]; + UI_display_runes(50, msg); + } + + else if (quality == 45) + { + + UI_display_runes(50, ""); + } + else if (quality == 46) + { + msg1 = ["Here lies", "Phil"]; + msg = ["Grifting", "aint easy"]; + UI_display_runes(50, msg1); + + + } + + else if (quality == 47) + { + msg1 = ["In memory", "of Kate"]; + msg = ["Vanished", "without a", "trace"]; + UI_display_runes(50, msg1); + + + } + + else msg = ["Stop Cheating!"]; + + + UI_display_runes(50, msg); + + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/trinsic_time.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/trinsic_time.uc new file mode 100755 index 0000000..d84c5d0 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/trinsic_time.uc @@ -0,0 +1,49 @@ +void TrinsicSched 3001() +{ + var hour; + var minute; + + if (event == EGG) + { + hour = UI_game_hour(); + minute = UI_game_minute(); + + if (hour == 11) //11am + { + IMMANUELLE->move_object([0x4d1, 0x8c7, 0x0]); + UI_set_schedule_type(IMMANUELLE, STAND_THERE); + IMMANUELLE->set_item_frame_rot(32); + + WHITSABER->move_object([0x4e8, 0x8d2, 0x0]); + UI_set_schedule_type(WHITSABER, EAT_AT_INN); + } + if (hour == 13) //1pm + { + WHITSABER->move_object([0x51e, 0x8e7, 0x2]); + UI_set_schedule_type(WHITSABER, WANDER); + } + + if (hour == 14) //2pm + { + IMMANUELLE->move_object([0x4bb, 0x9a7, 0x0]); + UI_set_schedule_type(IMMANUELLE, LOITER); + + + } + + if (hour == 19) //7pm + { + WHITSABER->move_object([0x4a8, 0x8e6, 0x0]); + UI_set_schedule_type(WHITSABER, SLEEP); + } + + + if (hour == 20) //8pm + { + IMMANUELLE->move_object([0x4cf, 0x9a7, 0x0]); + UI_set_schedule_type(IMMANUELLE, SLEEP); + + } + + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/volcano.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/volcano.uc new file mode 100755 index 0000000..142ab5c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/volcano.uc @@ -0,0 +1,27 @@ +void volcano shape#(1177) () +{ + + + var rand = UI_die_roll(100, 300); + + + if (isNearby(AVATAR)) +// if (event == PROXIMITY) //changed from proximity + { + item.say("test"); + + Eruption(); + + + script item after 40 ticks // increase number, just for testing + { + nohalt; + // say "test"; + call volcano; + }; + } + + return; + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/yew_staff.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/yew_staff.uc new file mode 100755 index 0000000..b6af224 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/items/yew_staff.uc @@ -0,0 +1,80 @@ +void yewstaff shape#(1163) () +{ + var spellbook = AVATAR->find_object(761, QUALITY_ANY, FRAME_ANY); + var target = UI_click_on_item(); + var charges = UI_get_item_quality(item); + +} + + +void yewstaff_charged_lightning shape#(1164) () +{ + extern var getOuterContainer 0x945(var obj); + var wearer = getOuterContainer(item); + + //if staff runs out of charges, change back into regular yew staff + if ((event == UNREADIED) && (UI_get_item_quality(item) < 1)) + { + UI_set_item_shape(item, SHAPE_YEW_STAFF); + } + else if ((event == READIED) && (UI_get_item_quality(item) < 1)) + { + UI_set_item_shape(item, SHAPE_YEW_STAFF); + } +} + +void yewstaff_charged_firebolt shape#(1260) () +{ + extern var getOuterContainer 0x945(var obj); + var wearer = getOuterContainer(item); + + //if staff runs out of charges, change back into regular yew staff + if ((event == UNREADIED) && (UI_get_item_quality(item) < 1)) + { + UI_set_item_shape(item, SHAPE_YEW_STAFF); + } + else if ((event == READIED) && (UI_get_item_quality(item) < 1)) + { + UI_set_item_shape(item, SHAPE_YEW_STAFF); + } +} + +void yewstaff_charged_deathbolt shape#(1261) () +{ + extern var getOuterContainer 0x945(var obj); + var wearer = getOuterContainer(item); + + //if staff runs out of charges, change back into regular yew staff + if ((event == UNREADIED) && (UI_get_item_quality(item) < 1)) + { + UI_set_item_shape(item, SHAPE_YEW_STAFF); + } + else if ((event == READIED) && (UI_get_item_quality(item) < 1)) + { + UI_set_item_shape(item, SHAPE_YEW_STAFF); + } + else if (UI_get_item_quality(item) < 1) + { + + UI_set_item_shape(item, SHAPE_YEW_STAFF); + } +} + +void yewstaff_charged_poison shape#(1262) () +{ + extern var getOuterContainer 0x945(var obj); + var wearer = getOuterContainer(item); + + //if staff runs out of charges, change back into regular yew staff + if ((event == UNREADIED) && (UI_get_item_quality(item) < 1)) + { + UI_set_item_shape(item, SHAPE_YEW_STAFF); + } + else if ((event == READIED) && (UI_get_item_quality(item) < 1)) + { + UI_set_item_shape(item, SHAPE_YEW_STAFF); + } + + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/createGargoyle.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/createGargoyle.uc new file mode 100755 index 0000000..d17ad24 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/createGargoyle.uc @@ -0,0 +1,377 @@ +void createWinglessGargoyle object# ()() +{ + var quality; + var quantity; + var position; + var new_gargoyle; + var new_gear; + var frame; + + var random_helm; + var random_armor; + var random_weapon; + var random_gold; + var random_equipment; + var random_container; + + + var helm; + var armor; + var weapon; + var gold; + var equipment; + var container; + + var str; + var dex; + var Int; + var combat; + + var current_STR; + var current_DEX; + var current_INT; + var current_COMBAT; + + + if (event == EGG) + { + //default quantity is 1 unless otherwise determined + quantity = 1; + + //determine random armor, weapon, equipment values + random_helm = UI_get_random(2); + if (random_helm == 1) + helm = SHAPE_LEATHER_HELM; + else + helm = SHAPE_WOODEN_SHIELD; + + random_armor = UI_get_random(10); + if (random_armor <= 6 ) + armor = SHAPE_LEATHER_ARMOR; + else + armor = SHAPE_SCALE_ARMOR; + + random_weapon = UI_get_random(3); + + if (random_weapon == 1) + weapon = SHAPE_BOOMERANG; + else if (random_weapon == 2) + weapon = SHAPE_CLUB; + else + weapon = SHAPE_THROWING_AXE; quantity = 5; + + random_gold = UI_die_roll(20, 55); + + random_equipment = UI_get_random(10); + + frame = 0; + if (random_equipment == 1) + equipment = SHAPE_GOLD_NUGGET; + else if (random_equipment == 2) + { + equipment = SHAPE_GARGOYLE_JEWELRY; + frame = UI_get_random(6); + } + else if (random_equipment == 3) + { + equipment = SHAPE_GOLD; + quantity = UI_get_random(10); + } + else if (random_equipment == 4) + { + equipment = SHAPE_GOLD; + quantity = UI_get_random(5); + } + + else + { + equipment = SHAPE_FOOD; + frame = UI_get_random(27); + } + + random_container = UI_get_random(2); + + if (random_container == 1) + container = SHAPE_BACKPACK; + else + container = SHAPE_BAG; + + + // Get random Str, Dex, Int, and Combat values + dex = UI_die_roll(15, 20); + str = UI_die_roll(15, 25); + Int = UI_die_roll(8, 12); + combat = UI_die_roll(8, 13); + + quality = UI_get_item_quality(item); + position = UI_get_object_position(item); + + //create Shape + new_gargoyle = UI_create_new_object2(SHAPE_WINGLESS_GARGOYLE, position); + UI_set_item_flag(new_gargoyle, TEMPORARY); + + //get current stats so we don't "over-buff" them + current_STR = UI_get_npc_prop(new_gargoyle, STRENGTH); + current_DEX = UI_get_npc_prop(new_gargoyle, DEXTERITY); + current_INT = UI_get_npc_prop(new_gargoyle, INTELLIGENCE); + current_COMBAT = UI_get_npc_prop(new_gargoyle, COMBAT); + + //reset current stats by deleting current stats + UI_set_npc_prop(new_gargoyle, STRENGTH, -current_STR); + UI_set_npc_prop(new_gargoyle, DEXTERITY, -current_DEX); + UI_set_npc_prop(new_gargoyle, INTELLIGENCE, -current_INT); + UI_set_npc_prop(new_gargoyle, COMBAT, -current_COMBAT); + + + //Give new gargoyle gear + new_gear = UI_add_cont_items(new_gargoyle, 1, helm, 0, 0, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, armor, 0, 0, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, weapon, 0, 0, true); + new_gear = UI_add_cont_items(new_gargoyle, random_gold, SHAPE_GOLD, 0, FRAME_ANY, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, equipment, 0, frame, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, container, 0, frame, true); + + //Set Gargoyle's new stats + UI_set_npc_prop(new_gargoyle, STRENGTH, str); + UI_set_npc_prop(new_gargoyle, DEXTERITY, dex); + UI_set_npc_prop(new_gargoyle, INTELLIGENCE, Int); + UI_set_npc_prop(new_gargoyle, COMBAT, combat); + + // Default for Quality 0 + if (quality == 0) + { + //UI_set_alignment(new_gargoyle, EVIL); + UI_set_schedule_type(new_gargoyle, IN_COMBAT); + } + else if (quality == 1) + { + UI_set_schedule_type(new_gargoyle, FARM); + //UI_set_alignment(new_gargoyle, NEUTRAL); + } + else if (quality == 2) + { + UI_set_schedule_type(new_gargoyle, WANDER); + //UI_set_alignment(new_gargoyle, NEUTRAL); + } + else if (quality == 3) + { + UI_set_schedule_type(new_gargoyle, PATROL); + //UI_set_alignment(new_gargoyle, NEUTRAL); + } + else + UI_set_schedule_type(new_gargoyle, LOITER); + + //set alignment based on global flags + if (inParty(BEHLEM) || gflags[WEARING_AMULET_SUBMISSION] || gflags[SUBMITTED_TO_DRAXINUSOM]) + UI_set_alignment(new_gargoyle, NEUTRAL); + else + { + UI_set_alignment(new_gargoyle, EVIL); + UI_set_schedule_type(new_gargoyle, IN_COMBAT); + } + } + else + return; + +} + + + +//Creates random amounts of wingless gargoyles +void createWinglessGargoyle2 3040() +{ + var quality; + var quantity; + var position; + var new_gargoyle; + var new_gear; + var frame; + + var random_helm; + var random_armor; + var random_weapon; + var random_gold; + var random_equipment; + var random_container; + + + var helm; + var armor; + var weapon; + var gold; + var equipment; + var container; + + var str; + var dex; + var Int; + var combat; + + var current_STR; + var current_DEX; + var current_INT; + var current_COMBAT; + + + if (event == EGG) + { + // Get quantity of gargoyles to spawn - + // default quantity is 1 unless otherwise determined + quantity = 1 + UI_get_random(4); + var count = 1; + + UI_error_message("Gargoyle egg count is: " + quantity); + + + //create each gargoyle in the while loop + while (count < quantity) + { + + //determine random armor, weapon, equipment values + + //choose a random helmet, or give a wooden shield + random_helm = UI_get_random(2); + + if (random_helm == 1) + helm = SHAPE_LEATHER_HELM; + else + helm = SHAPE_WOODEN_SHIELD; + + //chose random armor + random_armor = UI_get_random(10); + + if (random_armor <= 6 ) + armor = SHAPE_LEATHER_ARMOR; + else + armor = SHAPE_SCALE_ARMOR; + + //choose random weapon + random_weapon = UI_get_random(3); + + if (random_weapon == 1) + weapon = SHAPE_BOOMERANG; + else if (random_weapon == 2) + weapon = SHAPE_CLUB; + else + weapon = SHAPE_THROWING_AXE; quantity = 5; + + //choose random gold amount + random_gold = UI_die_roll(15, 55); + + //get random equipment + random_equipment = UI_get_random(10); + frame = 0; + + if (random_equipment == 1) + equipment = SHAPE_GOLD_NUGGET; + + else if (random_equipment == 2) + { + equipment = SHAPE_GARGOYLE_JEWELRY; + frame = UI_get_random(6); + } + + else if (random_equipment == 3 || random_equipment == 4) + { + equipment = SHAPE_GOLD; + quantity = random_gold; + } + + else + { + equipment = SHAPE_FOOD; + frame = UI_get_random(27); + } + + random_container = UI_get_random(2); + if (random_container == 1) + container = SHAPE_BACKPACK; + else + container = SHAPE_BAG; + + + // Get random Str, Dex, Int, and Combat values + dex = UI_die_roll(15, 20); + str = UI_die_roll(15, 25); + Int = UI_die_roll(8, 12); + combat = UI_die_roll(8, 13); + + quality = UI_get_item_quality(item); + position = UI_get_object_position(item); + + //create Shape + new_gargoyle = UI_create_new_object2(SHAPE_WINGLESS_GARGOYLE, position); + UI_set_item_flag(new_gargoyle, TEMPORARY); + + //get current stats so we don't "over-buff" them + current_STR = UI_get_npc_prop(new_gargoyle, STRENGTH); + current_DEX = UI_get_npc_prop(new_gargoyle, DEXTERITY); + current_INT = UI_get_npc_prop(new_gargoyle, INTELLIGENCE); + current_COMBAT = UI_get_npc_prop(new_gargoyle, COMBAT); + + //reset current stats by deleting current stats + UI_set_npc_prop(new_gargoyle, STRENGTH, -current_STR); + UI_set_npc_prop(new_gargoyle, DEXTERITY, -current_DEX); + UI_set_npc_prop(new_gargoyle, INTELLIGENCE, -current_INT); + UI_set_npc_prop(new_gargoyle, COMBAT, -current_COMBAT); + + + //Give new gargoyle gear + new_gear = UI_add_cont_items(new_gargoyle, 1, helm, 0, 0, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, armor, 0, 0, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, weapon, 0, 0, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, container, 0, frame, true); + new_gear = UI_add_cont_items(new_gargoyle, random_gold, SHAPE_GOLD, 0, FRAME_ANY, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, equipment, 0, frame, true); + + + //Set Gargoyle's new stats + UI_set_npc_prop(new_gargoyle, STRENGTH, str); + UI_set_npc_prop(new_gargoyle, DEXTERITY, dex); + UI_set_npc_prop(new_gargoyle, INTELLIGENCE, Int); + UI_set_npc_prop(new_gargoyle, COMBAT, combat); + + // Default for Quality 0 + if (quality == 0) + { + //UI_set_alignment(new_gargoyle, EVIL); + UI_set_schedule_type(new_gargoyle, IN_COMBAT); + } + else if (quality == 1) + { + UI_set_schedule_type(new_gargoyle, FARM); + //UI_set_alignment(new_gargoyle, NEUTRAL); + } + else if (quality == 2) + { + UI_set_schedule_type(new_gargoyle, WANDER); + //UI_set_alignment(new_gargoyle, NEUTRAL); + } + else if (quality == 3) + { + UI_set_schedule_type(new_gargoyle, PATROL); + //UI_set_alignment(new_gargoyle, NEUTRAL); + } + else + UI_set_schedule_type(new_gargoyle, LOITER); + + //set alignment based on global flags + if (inParty(BEHLEM) || gflags[WEARING_AMULET_SUBMISSION] || gflags[SUBMITTED_TO_DRAXINUSOM]) + UI_set_alignment(new_gargoyle, NEUTRAL); + else + { + UI_set_alignment(new_gargoyle, EVIL); + UI_set_schedule_type(new_gargoyle, IN_COMBAT); + } + count+=1; + } + } + else + return; + +} + + + + + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/createHighwayman.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/createHighwayman.uc new file mode 100755 index 0000000..0b26255 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/createHighwayman.uc @@ -0,0 +1,235 @@ +void createHighwayman object# ()() +{ + +//using highwayman to replace "swashbuckler" + + var quality = UI_get_item_quality(item); + var quantity; + var position; + var new_highwayman; + var new_gear; + var frame; + + var random_helm; //also can be used for other articles of armor + var random_armor; + var random_leggings; + var leggings; + var random_weapon; + var random_weapon2; + var random_gold; + var random_equipment; + var random_container; + var equipment_number; + var projectile; + var num_projectiles; + + + + var helm; + var armor; + var weapon; + var gold; + var equipment; + var container; + var weapon2; + + var str; + var dex; + var Int; + var combat; + + var current_STR; + var current_DEX; + var current_INT; + var current_COMBAT; + + + + + if (event == EGG) + { + //default quantity is 1 unless otherwise determined + quantity = 1; + + //determine random armor, weapon, equipment values + random_helm = UI_get_random(4); + if (random_helm == 1) + helm = SHAPE_LEATHER_HELM; + else if (random_helm == 2) + helm = SHAPE_WOODEN_SHIELD; + else if (random_helm == 3) + helm = SHAPE_MAIN_GAUCHE; + else + helm = SHAPE_LEATHER_COLLAR; + + //make leggings dependent on type of armor used + random_armor = UI_get_random(3); + if (random_armor == 1) + { + armor = SHAPE_CLOTH_ARMOR; + leggings = SHAPE_CLOTH_LEGGINGS; + } + else if (random_armor == 2) + { + armor = SHAPE_LEATHER_ARMOR; + leggings = SHAPE_LEATHER_LEGGINGS; + } + else + { + armor = SHAPE_RING_MAIL; + leggings = SHAPE_CHAIN_LEGGINGS; + } + + + random_weapon = UI_get_random(5); + if (random_weapon == 1) + weapon = SHAPE_SWORD; + else if (random_weapon == 2) + weapon = SHAPE_MAIN_GAUCHE; + else if (random_weapon == 3) + { + weapon = SHAPE_THROWING_AXE; + quantity = 5; + } + else if (random_weapon == 4) + { + weapon = SHAPE_SLING; + } + else + { + weapon = SHAPE_BOW; + projectile = SHAPE_ARROW; + num_projectiles = UI_die_roll(5, 24); + } + + + random_gold = UI_die_roll(1, 25); + frame = 0; + + + random_container = UI_get_random(2); + if (random_container == 1) + container = SHAPE_BACKPACK; + else + container = SHAPE_BAG; + + + // Get random Str, Dex, Int, and Combat values + dex = UI_die_roll(15, 20); + str = UI_die_roll(15, 25); + Int = UI_die_roll(8, 12); + combat = UI_die_roll(8, 13); + + quality = UI_get_item_quality(item); + position = UI_get_object_position(item); + + //create Shape + new_highwayman = UI_create_new_object2(SHAPE_HIGHWAYMAN, position); + UI_set_item_flag(new_highwayman, TEMPORARY); + + //get current stats so we don't "over-buff" them + current_STR = UI_get_npc_prop(new_highwayman, STRENGTH); + current_DEX = UI_get_npc_prop(new_highwayman, DEXTERITY); + current_INT = UI_get_npc_prop(new_highwayman, INTELLIGENCE); + current_COMBAT = UI_get_npc_prop(new_highwayman, COMBAT); + + //reset current stats by deleting current stats + UI_set_npc_prop(new_highwayman, STRENGTH, -current_STR); + UI_set_npc_prop(new_highwayman, DEXTERITY, -current_DEX); + UI_set_npc_prop(new_highwayman, INTELLIGENCE, -current_INT); + UI_set_npc_prop(new_highwayman, COMBAT, -current_COMBAT); + + + //Give new highwayman gear + new_gear = UI_add_cont_items(new_highwayman, 1, helm, 0, 0, true); + new_gear = UI_add_cont_items(new_highwayman, 1, armor, 0, 0, true); + new_gear = UI_add_cont_items(new_highwayman, 1, weapon, 0, 0, true); + new_gear = UI_add_cont_items(new_highwayman, 1, leggings, 0, 0, true); + new_gear = UI_add_cont_items(new_highwayman, 1, container, 0, frame, true); + new_gear = UI_add_cont_items(new_highwayman, quantity, SHAPE_GOLD, 0, FRAME_ANY, true); + + if (random_weapon == 5) //Bow + { + new_gear = UI_add_cont_items(new_highwayman, 1, SHAPE_BOW, QUALITY_ANY, FRAME_ANY, true); + new_gear = UI_add_cont_items(new_highwayman, 1, projectile, num_projectiles, FRAME_ANY, true); + } + + //Determine how many extra items the npc will have + equipment_number = UI_get_random(5); + + while (equipment_number > 0) + { + + random_equipment = UI_get_random(10); + if (random_equipment == 1) + equipment = SHAPE_GOLD_NUGGET; + else if (random_equipment == 2) + { + equipment = SHAPE_POTION; + frame = UI_die_roll(0, 2); + } + else if (random_equipment == 3) + { + equipment = SHAPE_GOLD; + quantity = UI_get_random(10); + } + else if (random_equipment == 4) + { + equipment = SHAPE_GOLD; + quantity = UI_get_random(5); + } + else if (random_equipment >= 5) + { + equipment = SHAPE_FOOD; + frame = UI_get_random(27); + } + else + { + equipment = SHAPE_GOLD; + quantity = UI_get_random(5); + } + new_gear = UI_add_cont_items(new_highwayman, quantity, equipment, 0, frame, true); + equipment_number -= 1; + quantity = 1; //resets quantity + } + + + //Set Highwayman's new stats + UI_set_npc_prop(new_highwayman, STRENGTH, str); + UI_set_npc_prop(new_highwayman, DEXTERITY, dex); + UI_set_npc_prop(new_highwayman, INTELLIGENCE, Int); + UI_set_npc_prop(new_highwayman, COMBAT, combat); + + // Default for Quality 0 + if (quality == 0) + { + UI_set_alignment(new_highwayman, EVIL); + UI_set_schedule_type(new_highwayman, IN_COMBAT); + } + + else if (quality == 1) + { + UI_set_schedule_type(new_highwayman, FARM); + UI_set_alignment(new_highwayman, NEUTRAL); + } + else if (quality == 2) + { + UI_set_schedule_type(new_highwayman, WANDER); + UI_set_alignment(new_highwayman, NEUTRAL); + } + else + { + UI_set_schedule_type(new_highwayman, WANDER); + UI_set_alignment(new_highwayman, NEUTRAL); + } + } + else + return; + +} + + + + + + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/createWingedGargoyle.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/createWingedGargoyle.uc new file mode 100755 index 0000000..b17ffb2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/createWingedGargoyle.uc @@ -0,0 +1,216 @@ +void createWingedGargoyle object# ()() +{ + var quality; + var quantity; + var position; + var new_gargoyle; + var new_gear; + var frame; + + var random_helm = UI_get_random(4); + var random_armor = UI_get_random(10); + var random_weapon = UI_get_random(7); + var random_gold = UI_die_roll(20, 80); + var random_equipment; + var random_container = UI_get_random(5); + var weapon2; + var projectile; + var num_projectiles; + + + var helm; + var armor; + var weapon; + var gold; + var equipment; + var container; + + var str; + var dex; + var Int; + var combat; + + var current_STR; + var current_DEX; + var current_INT; + var current_COMBAT; + var gold_amount; + + if (event == EGG) + { + + //default quantity is 1 unless otherwise determined + quantity = 1; + + //determine random armor, weapon, equipment values + if (random_helm == 1) + helm = SHAPE_GARGOYLE_HELM; + else if (random_helm == 2) + helm = SHAPE_WOODEN_SHIELD; + else + helm = SHAPE_LEATHER_HELM; + + + if (random_armor <= 6 ) + armor = SHAPE_LEATHER_ARMOR; + else + armor = SHAPE_ANTIQUE_ARMOR; + + + if (random_weapon == 1) + weapon = SHAPE_BOOMERANG; + else if (random_weapon == 2) + weapon = SHAPE_HALBERD; + else if (random_weapon == 3) + { + weapon = SHAPE_PARALYZE; + quantity = UI_get_random(3); + } + else if (random_weapon == 4) + { + weapon = SHAPE_EXPLOSION; + quantity = UI_get_random(3); + + } + else if (random_weapon == 5) + { + weapon = SHAPE_BOW; + projectile = SHAPE_ARROW; + num_projectiles = UI_die_roll(5, 15); + } + else if (random_weapon == 6) + weapon = SHAPE_TWOHANDEDSWORD; + else + weapon = SHAPE_CLUB; + + random_gold = UI_die_roll(20, 80); + + random_equipment = UI_get_random(10); + frame = 0; + if (random_equipment == 1) + equipment = SHAPE_GOLD_NUGGET; + else if (random_equipment == 2) + { + equipment = SHAPE_GARGOYLE_JEWELRY; + frame = UI_get_random(6); + } + else if (random_equipment == 3) + { + equipment = SHAPE_GOLD; + quantity = UI_get_random(30); + } + else if (random_equipment == 4) + { + equipment = SHAPE_GOLD; + quantity = UI_get_random(10); + } + else + { + equipment = SHAPE_FOOD; + frame = UI_get_random(27); + } + + if (random_container == 1) + container = SHAPE_LOCKED_CHEST; + else if (random_container == 2) + container = SHAPE_BAG; + else + container = SHAPE_BACKPACK; + + + // Get random Str, Dex, Int, and Combat values + dex = UI_die_roll(15, 20); + str = UI_die_roll(15, 25); + Int = UI_die_roll(8, 12); + combat = UI_die_roll(8, 13); + + quality = UI_get_item_quality(item); + position = UI_get_object_position(item); + + //create Shape + new_gargoyle = UI_create_new_object2(226, position); //Flying Gargoyle warrior + UI_set_item_flag(new_gargoyle, TEMPORARY); + + + //get current stats so we don't "over-buff" them + current_STR = UI_get_npc_prop(new_gargoyle, STRENGTH); + current_DEX = UI_get_npc_prop(new_gargoyle, DEXTERITY); + current_INT = UI_get_npc_prop(new_gargoyle, INTELLIGENCE); + current_COMBAT = UI_get_npc_prop(new_gargoyle, COMBAT); + + //reset current stats by deleting current stats + UI_set_npc_prop(new_gargoyle, STRENGTH, -current_STR); + UI_set_npc_prop(new_gargoyle, DEXTERITY, -current_DEX); + UI_set_npc_prop(new_gargoyle, INTELLIGENCE, -current_INT); + UI_set_npc_prop(new_gargoyle, COMBAT, -current_COMBAT); + + + //Give new gargoyle gear + new_gear = UI_add_cont_items(new_gargoyle, 1, container, 0, frame, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, helm, 0, 0, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, armor, 0, 0, true); + new_gear = UI_add_cont_items(new_gargoyle, random_gold, SHAPE_GOLD, 0, FRAME_ANY, true); + new_gear = UI_add_cont_items(new_gargoyle, 1, equipment, 0, frame, true); + + + if (random_weapon == 3) //Paralyze + new_gear = UI_add_cont_items(new_gargoyle, 1, weapon, quality , FRAME_ANY, true); + else if (random_weapon == 4) //Explosion + new_gear = UI_add_cont_items(new_gargoyle, 1, weapon, quality , FRAME_ANY, true); + else if (random_weapon == 5) //Bow + { + new_gear = UI_add_cont_items(new_gargoyle, 1, weapon, QUALITY_ANY, FRAME_ANY, true); + new_gear = UI_add_cont_items(new_gargoyle, num_projectiles, projectile, QUALITY_ANY, FRAME_ANY); + } + else + new_gear = UI_add_cont_items(new_gargoyle, 1, weapon, 0, 0, true); + + //Set Gargoyle's new stats + UI_set_npc_prop(new_gargoyle, STRENGTH, str); + UI_set_npc_prop(new_gargoyle, DEXTERITY, dex); + UI_set_npc_prop(new_gargoyle, INTELLIGENCE, Int); + UI_set_npc_prop(new_gargoyle, COMBAT, combat); + + // Default for Quality 0 + if (quality == 0) + { + + UI_set_schedule_type(new_gargoyle, IN_COMBAT); + } + if (quality == 1) + { + UI_set_schedule_type(new_gargoyle, FARM); + UI_set_alignment(new_gargoyle, NEUTRAL); + } + if (quality == 2) + { + UI_set_schedule_type(new_gargoyle, WANDER); + UI_set_alignment(new_gargoyle, NEUTRAL); + } + if (quality >= 3) + { + UI_set_schedule_type(new_gargoyle, WANDER); + UI_set_alignment(new_gargoyle, NEUTRAL); + } + + //set alignment based on global flags + if (inParty(BEHLEM) || gflags[WEARING_AMULET_SUBMISSION] || gflags[SUBMITTED_TO_DRAXINUSOM]) + UI_set_alignment(new_gargoyle, NEUTRAL); + else + { + UI_set_alignment(new_gargoyle, EVIL); + // UI_set_schedule_type(new_gargoyle, IN_COMBAT); + } + + + } + else + return; + +} + + + + + + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/guards.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/guards.uc new file mode 100755 index 0000000..1cda39f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/guards.uc @@ -0,0 +1,65 @@ +void Guards object#(0x625) () +{ + + + if (event == STARTED_TALKING) + { + //find other arresting guards: + var arresting_guards = UI_find_nearby_avatar(946); + var guard; + var num_guards = UI_get_array_size(arresting_guards); + UI_error_message("Number of arresting guards is " + num_guards); + + UI_show_npc_face(16, 0); + item.say("You see an irate guard."); + item.say("@Wilt thou come quietly?@"); + if (askYesNo()) + { + say("@A wise decision.@"); + guardArrest(); + return; + } + else + { + say("@Very well. To the death!!@"); + for (guard in arresting_guards) + { + UI_set_schedule_type(guard, IN_COMBAT); //prevent them from speaking after another + subtractKarma(15); + } + return; + } + } + + if (event == DOUBLECLICK) + { + //find other arresting guards: + var arresting_guards = UI_find_nearby_avatar(946); + var guard; + var num_guards = UI_get_array_size(arresting_guards); + UI_error_message("Number of arresting guards is " + num_guards); + + UI_show_npc_face(16, 0); + item.say("You see an irate guard."); + item.say("@Wilt thou come quietly?@"); + if (askYesNo()) + { + say("@A wise decision.@"); + guardArrest(); + UI_play_music(255, 0); //to stop annoying combat music + return; + } + else + { + subtractKarma(15); + say("@Very well. To the death!!@"); + for (guard in arresting_guards) + { + UI_set_schedule_type(guard, IN_COMBAT); //prevent them from speaking after another + + } + return; + } + } +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/sheep.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/sheep.uc new file mode 100755 index 0000000..4d4fc0e --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/monsters/sheep.uc @@ -0,0 +1,135 @@ +/* + * + * Copyright (C) 2006 Alun Bestor/The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Author: Marzo Junior (reorganizing/updating code by Alun Bestor) + * Last Modified: 2006-03-19 + */ + + +const int SHEARED = 28; +const int SHAPE_SHEARS = 698; +const int SOUND_SHEARING = 0; + + +//create the wool beside the Avatar +void finishShearing object#() () +{ + var wool = UI_create_new_object(SHAPE_WOOL); + + wool->set_item_frame(1); //vertical bale + wool->set_item_flag(TEMPORARY); + + var target_pos = get_object_position(); //place the new bale next to the sheep + target_pos[X] = target_pos[X] + 1; + target_pos[Y] = target_pos[Y] + 1; + + //Todo: stick it in the players inventory if it can't be placed here + UI_update_last_created(target_pos); + + //Make the sheep run away after the deed is done + set_schedule_type(SHY); + + //This prevents us from shearing it twice + set_item_flag(MET); +} + +//Shear that sheep! +void shearSheep () +{ + script AVATAR + { + nohalt; + //paralyze the avatar so the player can't move during sequence + call GenericFreeze; + + face directionFromAvatar(item); + say("@Easy now...@"); + + repeat 6 + { + actor frame standing; + actor frame reach_1h; + sfx SOUND_SHEARING; + actor frame strike_1h; + wait 2; + }; + actor frame standing; + + call GenericUnfreeze; //unparalyze again + } + + script item + { + nohalt; + call GenericFreeze; + wait 20; + say "@Baaa!@"; + wait 20; + say "@Baa-aa-aa!@"; + call GenericUnfreeze; + call finishShearing; //Create the wool + } + + //our resident sheep expert + if (inParty(KATRINA)) + { + var barks = [ + "@Thou art doing it all wrong!@", + "@Nay, work thy way forwards!@", + "@Thou shouldst be a shepherd!@" + ]; + delayedBark(KATRINA, randomIndex(barks), 20); + } +} + +//Organise everything for shearing, and go to the sheep +void startShearing (var sheep) +{ + UI_close_gumps(); + + //The sheep is already sheared + if (sheep->get_item_flag(SHEARED)) + { + randomPartySay("@Thou hast sheared that sheep already! Give the poor thing a chance to grow it back.@"); + return; + } + + //make sure the shears are readied first + if (!AVATAR->is_readied(BG_WEAPON_HAND, SHAPE_SHEARS, FRAME_ANY)) + { + randomPartySay("@Thou must have the shears in thy hand.@"); + return; + } + + //Stop the sheep from moving around before we get there. + //Note: they will be unfrozen once they have been sheared. + //Unfortunately, just using a simple wait (or wait-loop) + //doesn't stop the GRAZE schedule from making the sheep + //wander off, so we actually have to paralyze them to keep + //them still. + script sheep { nohalt; call GenericFreeze; } + + //Get in behind the sheep (oh, the jokes never cease) + var sheep_offsetx = [0, -1, 1]; + var sheep_offsety = [1, 1, 1]; + gotoObject(sheep, sheep_offsetx, sheep_offsety, 0, shearSheep, sheep, SCRIPTED); + + //Hat tip to Marzo for this one - this will unfreeze the + //sheep if the player cancels the go-to + UI_set_path_failure(GenericUnfreeze, sheep, SCRIPTED); +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Anya.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Anya.uc new file mode 100755 index 0000000..19ed4c9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Anya.uc @@ -0,0 +1,220 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + +void Anya object# (0x425) () +{ + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //gets current schedule + var temp = schedule; + var current_schedule = temp; + + const int MEAD_SELL_PRICE = 4; + const int ALE_SELL_PRICE = 3; + const int WINE_SELL_PRICE = 6; + + const int MUTTON_SELL_PRICE = 4; + const int CAKE_SELL_PRICE = 8; + + var food_drink_options =["nothing", "mead", "ale", "wine", "mutton", "cake"]; + var food_drink_frames = [FRAME_MEAD, FRAME_ALE, FRAME_WINE, FRAME_MUTTON, FRAME_CAKE]; + var prices = [4, 3, 6, 4, 8]; + + var initial_choice_question = "@Wouldst thou like ale, mead, wine, mutton, or perhaps a cake@"; + var askIfInterested1 = "@That'll be "; //split into two to capture price + var askIfInterested2 = " gold coins, okay?@"; + var ask_quantity = "@How many?@"; + var cant_afford = "@I'm sorry, but you don't have enough gold.@"; + var cant_hold = "@You haven't any room in your pack.@"; + var saidNo = "@Anything else I can do for thee?@"; + var success = "Anya gives you the "; + var success2 = "@I hope thou dost enjoy it!@"; + var nothing = "@Very well. What else dost thou wish to speak about?@"; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + + if (event == DOUBLECLICK) + { + + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me, miss..@"; + var npc_1st_greet = "@What can I do for you?@"; + + var av_2nd_greet = "@Hello again.@"; + var npc_2nd_greet = "@Welcome back, " + greeting + ".@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + if ((current_schedule != WAITER) && (hour < 6)) + { + UI_error_message("Current schedule is, " + current_schedule); + UI_error_message("Schedule is, " + schedule); + UI_error_message("Hour is, " + hour); + item.say("@I'm sorry, " + polite_title + ", but I've just an hour to myself today. I'll gladly talk with thee later.@"); + delayedBark(item, "Come back tomorrow..", 3); + UI_run_schedule(item); + return; + } + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a buxom woman who looks hard working, yet contented.*"); + item.say("@Good " + time_of_day + ", " + polite_title + ", and welcome to the Blue Boar Tavern. Art thou here for business or pleasure?@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Good " + time_of_day + ", " + polite_title + ", and welcome to the Blue Boar Tavern. Art thou here for business or pleasure?@"); + + //standard conversation options + var options = ["name", "job", "bye", "business", "pleasure"]; + + if (gflags[ASKEDARIANAABOUTRUNE]) + add("rune"); + + + ///////////////////////////////////////////////////////////////////// + //Main conversation thread + // + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Anya.@*"); + + case "job"(remove): + say("@I run this tavern to support my family. The hours are long, but my husband offers what help he can.@"); + say("@We make enough to pay for my daughter's schooling, so 'tis all worthwhile.@"); + add(["family"]); + + case "pleasure"(remove): + say("@'Tis good to talk with thee again. Things have been slow around here since the gypsies left. Good! Perhaps thou might stay and talk with me a while, before I'm back about my work.@"); + add(["gypsies"]); + + case "gypsies"(remove): + say("@They pass by Britain occasionally. I believe they travel on the King's Way.@"); + add(["King's Way"]); + + case "King's Way"(remove): + say("@The King's Way is the oldest road in Britain.@"); + + case "family"(remove): + say("@My husband Matt, and my daughter Ariana.@"); + add(["Matt", "Ariana"]); + + case "Matt"(remove): + say("@He had an accident as a child which left him deaf and dumb, but I love him all the same. I only wish he could hear our daughter play, just once. But 'twill ne'er come to pass. He lives in a world of eternal silence.@"); + if (!UI_set_item_flag(item, NAKED)) //Only gives this option if Avatar hasn't already said yes or no to Anya to prevent repeated karma loss/gain + add(["wish"]); + + case "Ariana"(remove): + say("@Ariana is the light of my life. Seems she had scarce learned to walk when she first showed a gift for music. She studies now with the bards at the Conservatory.@"); + add(["bards"]); + + case "wish"(remove): + say("Her face brightens suddenly. @You have the look of one who practices the art of magic. Perhaps thou couldst find some spell that might restore my husband's hearing! I know 'tis a lot to ask, but wilt thou try?@"); + if (askYesNo()) + { + say("@Oh, thank you, " + player_name + "!@"); + UI_set_item_flag(item, NAKED); //flag used to prevent repeated karma loss/gain + addKarma(5); + } + else + { + say("Her look of hope changes to one of sorrow as she looks down at the floor to hide her embarrassment. @I'm sorry to have bothered thee,@ she says. @I'm sure thou hast more important things to do.@"); + UI_set_item_flag(item, NAKED); //flag used to prevent repeated karma loss/gain + subtractKarma(5); + } + + case "bards"(remove): + say("@Bless their hearts for teaching her well. She'll be no tavern wench when she grows older.@*"); + say("@Perhaps she'll even be court musician to Lord British some day...@"); + + case "mantra"(remove): + say("@Thou shouldst ask my daughter of that. Methinks the bards have taught her of it.@"); + + case "rune"(remove): + if (!gflags[ASKED_PARENTS_PERMISSION]) + { + say("@Ah, twas the proudest moment of my life when they awarded my dear little Ariana the Rune of Compassion. They said she was the most promising student they'd ever had at the Conservatory. I'm sure she would show thee the rune, if thou wouldst care to see it.@"); + say("@Thou dost wish to borrow the Rune of Compassion from my daughter?@ She pauses a while in thought.*"); + say("@Very well--thou dost have an honest face. I grant thee my permission.@"); + gflags[ASKED_PARENTS_PERMISSION] = true; + + } + else + say("@I already gave thee my permission to borrow the rune! Do thou be careful not to lose the stone or let any harm befall it. Ariana would never forgive herself.@"); + add(["mantra"]); + + + case "business": + sellFood(ANYA, food_drink_options, prices, food_drink_frames, dialog); + + + +//TODO: add sidequest to cure Matt + + case "bye": + say("@Well, 'tis time I was back about my work. Dishes to wash, food to cook, drinks to serve... I thank thee for stopping by to brighten my day with thy conversation. Do thou come again.@"); + var avatar_goodbye = "@Have a good " + time_of_day + "!@"; + var npc_goodbye = "@Come back anytime!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Ariana.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Ariana.uc new file mode 100755 index 0000000..96bb7b7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Ariana.uc @@ -0,0 +1,237 @@ +void Ariana object# (0x418) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var time_of_day; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + + var got_compassion_rune = UI_get_item_flag(item, PETRA); //set once you have the rune + + + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + +///////////////////////////////Time of day///////////// + + if ((hour >= 6) && (hour < 12)) //'good morning' + { + time_of_day = "morning"; + } + + if ((hour >= 12) && (hour < 18)) //'good afternoon' + { + time_of_day = "afternoon"; + } + else time_of_day = "evening"; + + + + + if (event == DOUBLECLICK) + { + if (partynum > 1) greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + var met_ariana = UI_get_item_flag(item, MET); // + + //barks for Avatar + if (!met_ariana) bark = "@Hello there..@"; // + else bark = "@Hello, Ariana!@"; //barked after npc is met + + script AVATAR + { + call GenericFreeze; + face AVATAR->find_direction(item); + actor frame standing; + say bark; + wait 10; + }; + + + //NPC barks + if (!met_ariana) bark = "@Hi!@"; //change !met_ariana with !met_yourariana - npc's first greeting bark + else bark = "@Hi, Avatar!@"; //bark when npc met you already + + + script item + { + call GenericFreeze; + wait 5; + face find_direction(AVATAR); + actor frame standing; + say bark; + wait 8; + call (Ariana); + }; + } + else if (event == SCRIPTED) + { + //Unfreeze Avatar and ITEM: + AVATAR->GenericUnfreeze(); + item->GenericUnfreeze(); + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("You see a cute little girl with short hair."); + item.say("@My parents told me never to talk to strangers. What's your name?@"); + var avatar_or_name = chooseFromMenu(["The Avatar", ("I am " + player_name)]); + + if (avatar_or_name == "The Avatar") + say("@Ok, now I can talk to you!@"); + + else if (avatar_or_name == ("I am " + player_name)) + say("@Ok, now I can talk to you!@"); + } + else + + if (gflags[ASKEDARIANAABOUTRUNE] && !got_compassion_rune) + { + item.say("@Hi! Did you get permission from my parents to borrow the rune?@"); + if (askYesNo()) + { + if (!gflags[ASKED_PARENTS_PERMISSION]) + subtractKarma(10); //take a karma hit for tellin fibs to the little turd + if (UI_add_party_items(1, SHAPE_RUNE, QUALITY_ANY, FRAME_COMPASSION, true)) + { + item.say("@Then here you are.@ She hands you the rune. @I wish you the best of luck on your quest.@"); + UI_set_item_flag(item, PETRA); //got_compassion_rune + gflags[ASKED_PARENTS_PERMISSION] = false; + script item after 3 ticks say "@Good luck!@"; + return; + + } + else + item.say("@Oh, you're carrying too much right now. You'd better come back for it later.@"); + } + else + item.say("@Well, if you get their permission later, let me know.@"); + } + else + item.say("@Oh, hello again.@"); + + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(item, SI_ZOMBIE)) //Set by Tholden/Lady Nan/anyone else asked about rune + add(["rune", "mantra"]); + + + + //Variable conversation options based on global flags or people met. Remove if none///// + // if (gflags[GLOBAL_FLAG_HERE]) + // add("Insert Convo topic here"); + + + //-------------------------------------------------------------//based on MET flag - delete all if not used + // if (UI_get_item_flag(ARIANA, MET)) + // add ("NPC name"); + + + + + + + ///////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////// + + + converse(options) + { + case "name"(remove): + say("She curtsies gracefully. @Ariana is my name.@"); + + case "job"(remove): + say("@I'm learning to be a bard. I like to play the harpsichord best.@"); + add(["bard", "play"]); + + case "bard"(remove): + say("@I want to be a bard when I grow up. They have more fun than anybody!@"); + add(["fun"]); + + case "play"(remove): + say("@I've been studying to be a bard since I was this many.@ She holds up three fingers.*"); + say("@I'd like to play something for you, but I'm not good enough yet.@"); + say("She looks away for a moment, then turns back to you, blushing slightly. @Will you come back to hear my music when I am older, if you can?@"); + if (askYesNo()) + { + say("The little girl's face breaks out into a smile bright enough to light up the whole room. @Really? I would like that very much.@"); + addKarma(10); + } + else + { + say("The little girl sniffles, seeming suddenly on the verge of tears. @I'm sorry,@ she says, @I shouldn't have asked.@ She turns her back, as if ashamed to face you."); + subtractKarma(10); + UI_set_schedule_type(item, SHY); + script item after 3 ticks say "@..sniffles..@"; + break; + + } + + case "fun"(remove): + say("@Oh yes, lots of it!@"); + + case "mantra"(remove): + say("@I can't remember it now... And Kenneth just taught it to me last week... Wait, I know! It's 'mo!' Or maybe it was 'om'... Or 'mu,' or 'um'... It was something like that.@"); + add(["Kenneth"]); + + case "Kenneth"(remove): + say("@He's my teacher.@"); + add(["compassion"]); + + case "compassion"(remove): + say("@They taught me all about compassion. They say it's very important for bards.@"); + + case "rune"(remove): + if (!got_compassion_rune) + { + say("@I have the Rune of Compassion. Isn't it pretty?@ She reaches into her pocket and takes it out to show you. @Do you need it for something?@"); + if (askYesNo()) + { + say("@Are you on an important quest?@"); + if (askYesNo()) + { + say("@I'm not supposed to let anyone else have it. But if you truly need it... I don't know what I should do. I know! My parents run the Blue Boar Tavern. Go ask them if you can borrow the rune. If they say 'tis okay, I'll give it to you.@"); + gflags[ASKEDARIANAABOUTRUNE] = true; + } + else + say("@I'd best hold onto it then. I was told to look after it carefully.@"); + } + else + say("@Ok.@"); + } + else + say("@I already gave it to you, silly. I hope you can figure out how to use it.@"); + + + case "bye": + avatar_bark = "@Bye Ariana..@"; + npc_bark = "@See you later!@"; + delayedBark(AVATAR, avatar_bark, 3); + delayedBark(ARIANA, npc_bark, 10); + break; + + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Arty.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Arty.uc new file mode 100755 index 0000000..c9c85a5 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Arty.uc @@ -0,0 +1,178 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + +void Arty object# (0x428) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + //make sure it determines shop is open + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //custom flag to determine if Arty is drinking or not (STAND). + var is_drinking = UI_get_item_flag(item, PETRA); + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + const int FRAME_SILVER = 0; + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@...@"; + + var av_2nd_greet = "@Greetings..@"; + var npc_2nd_greet = "@...@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + item.say("A silent but good-natured man.~"); + if (UI_get_schedule_type(item) == MAJOR_SIT) + item.say("He looks up from his tankard of ale, sees you and smiles."); + else + item.say("He grins widely and waves at you."); + UI_clear_item_flag(item, READ); + UI_run_schedule(item); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("He points to his mouth and shakes his head."); + if (isNearby(DUPRE)) + { + DUPRE.say("@I know of this person, " + player_name + ". He is Arty the Mute, a local shipwright and an honored citizen.@"); + DUPRE.hide(); + say("The man smiles and nods."); + } + add(["mute", "deaf"]); + + case "job": + if (is_drinking) + say("The man looks at you, puzzled. Then he raises his tankard and goes back to drinking."); + + else + { + say("He smiles and points to the workbench. On the bench, you see the tools of a shipwright."); + add(["buy"]); + } + case "mute"(remove): + say("Arty smiles and nods."); + + case "deaf"(remove): + say("The man shakes his head."); + + case "buy"(remove): + if (!shop_is_open) + say("The man looks at you, puzzled. He shakes his head and spreads his hands as if to say @sorry.@"); + + else + { + say("The man smiles and points to the deed to a shipm and to a sextant."); + add(["ship", "sextant"]); + } + case "ship"(remove): + say("Arty shows you a ship deed. Written on it is the price, 400 gold. Do you want to buy the deed?"); + if(askYesNo()) + { + if (hasGold(400)) + { + if (UI_add_party_items(1, SHAPE_SCROLL, 44, 1, true)) + { + chargeGold(400); + say("After accepting the gold, Arty smiles and hands you the deed. He seems pleased."); + + } + else say("You don't have enough room to carry the deed"); + } + else say("You don't have enough gold for that."); + } + else say("Arty shrugs."); + + case "sextant"(remove): + say("Arty shows you a sextant. Written on a piece of paper is the price, 20 gold. Do you want to buy the deed?"); + if(askYesNo()) + { + if (hasGold(20)) + { + if (UI_add_party_items(1, SHAPE_SEXTANT, QUALITY_ANY, FRAME_SILVER, true)) + { + chargeGold(20); + say("After accepting the gold, Arty smiles and hands you the sextant. He seems pleased."); + + } + else say("You don't have enough room to carry the sextant"); + } + else say("You don't have enough gold for that."); + } + else say("Arty shrugs."); + + + + + case "bye": + if (is_drinking) + item.say("Arty waves as you leave, then returns to his ale."); + + else + item.say("Arty waves as you leave, then returns to what he was doing."); + + + var avatar_goodbye = "@Goodbye, Arty!@"; + var npc_goodbye = "@...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + UI_run_schedule(item); + UI_clear_item_flag(item, PETRA); // to reset "is drinking" + break; + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Cullen.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Cullen.uc new file mode 100755 index 0000000..7bf9cd7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Cullen.uc @@ -0,0 +1,217 @@ + +void Cullen object# (0x434) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var barks; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int BREAD_SELL_PRICE = 3; + const int CAKE_SELL_PRICE = 5; + const int ROLLS_SELL_PRICE = 1; + const int FLOUR_BUY_PRICE = 5; + const int PASTRY_SELL_PRICE = 6; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if ((event == PROXIMITY) && (UI_get_schedule_type(item, BAKE))) + { + barks = UI_get_random(3); + if (barks == 1) + delayedBark(item, "@Bread fit for a king!@", 0); + else if (barks == 2) + delayedBark(item, "@Delicious pastries here!@", 0); + else + delayedBark(item, "@Mouthwatering rolls!@", 0); + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings..@"; + var npc_1st_greet = "@Ah, welcome!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Ah, welcome back!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a short, dark man, covered in white flour."); + item.say("@Hello again my " + greeting + "!@ As he shakes your hand enthusiastically, clouds of flour fly off his clothes."); + UI_set_item_flag(item, MET); + } + else + { + item.say("You see a short, dark man, covered in white flour."); + item.say("@Hello again my " + greeting + "!@ As he shakes your hand enthusiastically, clouds of flour fly off his clothes."); + } + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name": + say("@I'm Cullen, Cullen the Baker.@"); + add(["baker"]); + + case "job": + say("@I'd have thought that'd be obvious! I'm a baker!@ As he laughs heartily, more clouds of flour rise off his clothing.*"); + say("@You can buy bakery goods from me or perhaps you have some flour to sell, eh?@"); + add(["baker", "buy", "sell"]); + + case "baker"(remove): + say("@I bake goods for Lord British himself!@ the man says proudly. @If you'd like to buy some, just say the word!@"); + + case "sell" (remove): + if (UI_get_schedule_type(item) != BAKE) + say("@Come to my shop when it's open!@"); + else + { + + var sack1 = UI_count_objects(PARTY, SHAPE_KITCHEN_ITEMS, QUALITY_ANY, FRAME_UNOPENED_SACK); + var sack2 = UI_count_objects(PARTY, SHAPE_KITCHEN_ITEMS, QUALITY_ANY, FRAME_FLOUR); + var party_flour = sack1 + sack2; + if (party_flour > 0) + { + say("@Will you take 5 gold for that sack of flour?@"); + if (askYesNo()) + { + say("@Done!@ He hands you 5 gold pieces and takes the sack of flour.@"); + if (sack1 >= 1) + UI_remove_party_items(1, SHAPE_KITCHEN_ITEMS, QUALITY_ANY, FRAME_UNOPENED_SACK, true); + else + UI_remove_party_items(1, SHAPE_KITCHEN_ITEMS, QUALITY_ANY, FRAME_FLOUR, true); + UI_add_party_items(5, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY, true); + } + else say ("@Changed your mind, eh?@ he folds his arms. @Well, what else will it be then?@"); + } + else say("@Sorry, you haven't any flour.@"); + } + + //For shopkeepers: + case "buy"(remove): + if (UI_get_schedule_type(item) != BAKE) + say("@Come to my shop when it's open!@"); + else + { + say("@Which item?@"); + //shopkeeper options + var choice; + var cant_hold = "@But thou canst not carry any " + choice + "!@"; + + var cant_afford = "@I'm sorry, but you don't have enough gold.@"; + var success = "@Here's thy " + choice + ", " + player_name + ", plus one for luck!@"; + var askIfInterested; //"Do you want this + var saidNo = "Suit thyself, " + polite_title + ", but thou'lt find no better!@"; + var quantity; + + if (askYesNo()) + { + say("@Which item?@"); + choice = chooseFromMenu(["bread", "rolls", "cake", "pastry", "nothing"]); + + if (choice == "bread") + { + askIfInterested = "@Those cost " + BREAD_SELL_PRICE + " gold each. How many do you want, " + polite_title + "?@"; + quantity = UI_input_numeric_value(1, 100, 1, 1); + while (quantity > 50) + { + say("@Whoa! Don't buy out my entire stock!@"); + say("@How many do you want, " + polite_title + "?@"); + quantity = UI_input_numeric_value(1, 100, 1, 1); + } + basicSell(item, SHAPE_FOOD, quantity, QUALITY_ANY, FRAME_BREAD, BREAD_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "rolls") + { + askIfInterested = "@Those cost " + ROLLS_SELL_PRICE + " gold each. How many do you want, " + polite_title + "?@"; + quantity = UI_input_numeric_value(1, 100, 1, 1); + while (quantity > 50) + { + say("@Whoa! Don't buy out my entire stock!@"); + say("@How many do you want, " + polite_title + "?@"); + quantity = UI_input_numeric_value(1, 100, 1, 1); + } + basicSell(item, SHAPE_FOOD, quantity, QUALITY_ANY, FRAME_ROLLS, ROLLS_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + + else if (choice == "cake") + { + askIfInterested = "@Those cost " + CAKE_SELL_PRICE + " gold each. How many _do you want, " + polite_title + "?@"; + quantity = UI_input_numeric_value(1, 100, 1, 1); + while (quantity > 50) + { + say("@Whoa! Don't buy out my entire stock!@"); + say("@How many do you want, " + polite_title + "?@"); + quantity = UI_input_numeric_value(1, 100, 1, 1); + } + basicSell(item, SHAPE_FOOD, quantity, QUALITY_ANY, FRAME_CAKE, CAKE_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + + else if (choice == "pastry") + { + askIfInterested = "@Ah, my specialty! Those cost " + PASTRY_SELL_PRICE + " gold each. How many do you want, " + polite_title + "?@"; + quantity = UI_input_numeric_value(1, 100, 1, 1); + while (quantity > 50) + { + say("@Whoa! Don't buy out my entire stock!@"); + say("@How many do you want, " + polite_title + "?@"); + quantity = UI_input_numeric_value(1, 100, 1, 1); + } + basicSell(item, SHAPE_FOOD, quantity, QUALITY_ANY, FRAME_PASTRY, PASTRY_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "nothing") + say("@How about something else, " + polite_title + "?@"); + + } + else + say("@Perhaps some other time, then.@"); + + } + + case "bye": + + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@Come again soon!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Daros.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Daros.uc new file mode 100755 index 0000000..fc20540 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Daros.uc @@ -0,0 +1,147 @@ + + +void Daros object# (0x42e) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == PROXIMITY) + { + var barks = UI_get_random(3); + if (barks == 1) + { + delayedBark(item, "@Oooh, woulda thrown this away?@", 0); + + + } + else if (barks == 2) + delayedBark(item, "@Watch the rats, ducky!@", 2); + else + delayedBark(item, "@Wish I had me some panpipes!@", 3); + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hello there..@"; + var npc_1st_greet = "@Hey hey hey!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Oh, hello again ducks!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("A skinny, awkward looking man, wearing boots that come up past his knees."); + item.say("@Hey hey hey! Welcome to the finest sewers in Britannia. You look like you need a nickname, so I'll call you 'ducks.'@"); + } + else + item.say("@Hey hey hey! Welcome to the finest sewers in Britannia.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name's Daros, old duck.@ He shakes your hand."); + + case "job": + say("@Well, ducky, I keep the sewers running the way they should. When work is slow, sometimes I play a joke or two on my friends to keep things lively.@ He winks at you."); + add(["joke", "friends", "sewers"]); + + case "friends"(remove): + say("@Even though we don't know each other that well, I'd like to think of you as my friend already.@"); + + case "sewers"(remove): + say("@Britain is the biggest city in the world, and all those people use a lot of water. All the runoff drains down here. It's not a bad place to work, really, except for the rats.@"); + add(["Britain", "water", "rats"]); + + case "joke"(remove): + say("@Oh you know, ducks, the usual kinds.@ He nudges you in the ribs."); + + case "Britain"(remove): + say("@Go back up and have a look! I'm sure it's still there.@ He grins, obviously delighted with his own sense of humor.@"); + + case "water"(remove): + say("@I wouldn't go swimming around here, ducks.@"); + + case "rats"(remove): + say("@They're pretty big, ducky, but not to worry. They usually won't eat you until after they've killed you first.@"); + say("@Of course, if you have a set of panpipes, I hear you can just pipe them away...@"); + add(["panpipes"]); + + case "panpipes"(remove): + say("@I don't have a set myself. I usually just run away.@"); + add(["run"]); + + case "run"(remove): + say("@It's real good exercise!@"); + + + case "bye": + if (!gflags[GOT_DUCK]) //used for whether or not he gave duck yet + { + say("@See you around, old duck.@ He gives you a hearty slap on the back as you leave, which almost knocks one of the straps on your pack loose."); + UI_add_party_items(1, SHAPE_DUCK, QUALITY_ANY, FRAME_ANY, true); + gflags[GOT_DUCK] = true; //can ask Dupre about ducks + + } + else + say("@See you around, old duck.@ He gives you a hearty slap on the back as you leave, which almost knocks one of the straps on your pack loose."); + var avatar_goodbye = "@So long..@"; + var npc_goodbye = "@See you around, old duck!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Daver.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Daver.uc new file mode 100755 index 0000000..3114f06 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Daver.uc @@ -0,0 +1,130 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + +void Daver object# (0x41f)() +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings..@"; + var npc_1st_greet = "@Hello.@"; + + var av_2nd_greet = "@Greetings..@"; + var npc_2nd_greet = "@Hello again.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + item.say("A man wearing a long grey cloak. He wears gloves with the fingers cut off, and carries a large hourglass with him."); + item.say("@Good " + time_of_day + ", friend Avatar.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm Daver McCord.@"); + + case "job": + say("@Every hour of the day, I ring the bell a number of times.@"); + add(["bell"]); + + case "bell"(remove): + say("@According to the numbers on the hourglass, you see.@"); + add(["numbers"]); + + case "numbers"(remove): + say("@Well, I usually know what time it is up here in my head somehow. But just in case, I start this hourglass at sunup, turning it over every nine hours.@"); + add(["time"]); + + case "time"(remove): + say("@It is especially important for those with shops. They know when to open for business, eat lunch, close, and that sort of thing.@"); + say("@Another of Lord British's innovations, this bell thing.@"); + add(["business"]); + + case "business"(remove): + say("@Hmmm. I guess that you don't keep a regular schedule, being the Avatar and all. Probably out till all hours, collecting runes and such.@"); + add(["Avatar", "runes"]); + + case "Avatar"(remove): + say("@You look much taller in person. Woodroffe's painting does not do you justice.@"); + add(["justice"]); + + case "justice"(remove): + say("@Heh, heh. I know little of that. I'm just the bell-ringer.@"); + + case "runes"(remove): + say("@Magical little things. There's a symbol on one side, and a letter on the other.@"); + say("@Probably spell something out if you put 'em all on a necklace. But that hasn't been done for a long time.@"); + say("@After the Codex of Ultimate Wisdom was brought back from the underworld, Lord British gave the runes to the lords of the eight cities.@"); + add(["Lord British"]); + + case "Lord British"(remove): + say("@Lord British appointed lords to rule the eight cities.@"); + add(["cities"]); + + case "cities"(remove): + say("@Let's see now.@ He counts them off on his fingers. @Minoc, Trinsic, Jhelom, Yew, Skara Brae, Britain, Moonglow...@"); + say("@...Ah yes, and New Magincia. I hear each of the lords knows a mantra.@"); + add(["mantra"]); + + case "mantra"(remove): + say("@Haven't the foggiest what those are for. Something to do with the shrines, I think.@"); + add(["shrines"]); + + case "shrines"(remove): + say("@Always wanted to visit them. Never had the time.@"); + say("@Heh, heh, heh!@"); + + case "bye": + + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@Until we meet again..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Efram.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Efram.uc new file mode 100755 index 0000000..95432d3 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Efram.uc @@ -0,0 +1,178 @@ + +void Efram object# (0x426) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + const int TORCH_SELL_PRICE = 3; + const int OIL_SELL_PRICE = 4; + const int BEDROLL_SELL_PRICE = 40; + const int BACKPACK_SELL_PRICE = 10; + const int BAG_SELL_PRICE = 3; + const int SHOVEL_SELL_PRICE = 15; + const int POWDER_KEG_SELL_PRICE = 30; + const int ABACUS_SELL_PRICE = 50; + + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + //shopkeeper stuff + + var price; + var item_choice; + var item_options = ["nothing", "torch", "oil", "backpack", "bag", "shovel", "powder keg", "abacus"]; + var item_shapes = [SHAPE_TORCH, SHAPE_OIL, SHAPE_BACKPACK, SHAPE_BAG, SHAPE_SHOVEL, SHAPE_POWDER_KEG, SHAPE_DESK_ITEM]; + var item_prices = [TORCH_SELL_PRICE, OIL_SELL_PRICE, BACKPACK_SELL_PRICE, BAG_SELL_PRICE, SHOVEL_SELL_PRICE, POWDER_KEG_SELL_PRICE, ABACUS_SELL_PRICE]; + + + var item_frames = [0, 0, 0, 0, 0, 0, 0, FRAME_ABACUS]; + // + + + //Dialog options + var initial_choice_question = "@Which of these?@"; //arms or armor? etc + var ask_quantity = "@How many do you want?@"; + var askIfInterested1 = "@It'll cost you "; //needs to be split into array to capture price + var askIfInterested2 = " gold for each.@"; + var cant_afford = "Efram looks at you. @That costs more than you have.@"; + var cant_hold = "Efram looks at you. @You haven't any room in your pack.@"; + var saidNo = "Efram frowns at you. @Hrmmph. That was a fair price. Well...@"; + var nothing = "@@Anything else?@"; + var success = "@He hands you the "; + var success2 = ". There ya go.@"; + + + + + //group together dialog options in array for cleaner look + + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == TEND_SHOP) + { + //reorganized to make it easier to add barks + var barks = [ + "@Torches? Backpacks? Shovels?@", + "@Get thy powder kegs here!@", + "@Hrmmph..Where is my pipe tobacco?@", + "@Provisions here!@" + ]; + + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + //Otherwise, say generic NPC barks + else scheduleBarks(item); + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, milord.@"; + var npc_1st_greet = "@Hrmph, hello.@"; + + var av_2nd_greet = "@Hello there.@"; + var npc_2nd_greet = "@Hrmph, hello.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a grunting and grumbling man with a large stomach."); + item.say("@Hrmmph. Hello.@ His breathing is quite heavy."); + UI_set_item_flag(item, MET); + } + else + item.say("@Hrmmph, well. Haven't we...never mind. Hrmmph. What do you need?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //automatically add buy/sell to options next time + if (UI_get_item_flag(item, SHOPPED_BEFORE)) + add("buy provisions"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name": + say("@Efram the provisioner.@"); + add(["Efram"]); + + case "job": + say("@I sell torches, oil, gems, backpacks, bags, shovels, and powder kegs.@"); + //automatically add buy/sell to options next time + if (!UI_get_item_flag(item, SHOPPED_BEFORE)) + UI_set_item_flag(item, SHOPPED_BEFORE); + add(["buy provisions"]); + + case "Efram"(remove): + say("@It's a nice enough name, hrmmph.@"); + + //For shopkeepers: + case "buy provisions"(remove): + if (shop_is_open) + { + say("@Are you interested in buying provisions today?@"); + if (askYesNo()) + { + buyItems(EFRAM, item_options, item_prices, item_shapes, item_frames, dialog); + } + else + say("@Very well. What else dost thou wish to speak about?@"); + } + else + say("@Come back to my shop when it's open.@"); + + case "bye": + + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@I'm glad you stopped by.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Finn.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Finn.uc new file mode 100755 index 0000000..f73aaca --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Finn.uc @@ -0,0 +1,135 @@ +void Finn object# (0x43e) () +{ + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var USER_INPUT; + var gender; + var player_is_female = UI_is_pc_female(); + + + if (player_is_female) // + { + gender = "woman"; + } + else gender = "man"; + + + if (event == DOUBLECLICK) + { + UI_set_item_flag(item, MET); + item.say("A sly looking fellow, dressed in rags."); + item.say("@Hello my good " + gender + "!@"); + + var options = ["name", "job", "bye"]; + + + //Start of regular conversation tree + converse(options) + { + case "name"(remove): + say("He glances around quickly, to see if anyone seems to be listening."); + say("@I'm Lord British. But don't tell anyone. I'm in disguise so I can mingle with the commoners.@"); + add(["disguise", "commoners"]); + + case "job": + say("@I'm pretending to be a beggar. That way nobody will suspect who I really am. Here, give me a few coins to keep anyone from getting suspicious.@"); + say("Do you give him any money?"); + if (askYesNo()) + { + if (UI_input_numeric_value(0, 10, 1, 1) && hasGold(USER_INPUT * 1)) + { + chargeGold(1 * USER_INPUT); + say("He takes the money. @Good. I'll get this back to you later.@"); + } + else say("You don't have that much money."); + add(["beggar"]); + } + else + { + say("@Broke, are you? Well, come by after I'm done with this disguise, and I'll give you a loan from the royal treasury.@"); + add(["beggar", "treasury"]); + } + + case "disguise"(remove): + say("@Very convincing, don't you think? I made it myself.@"); + + case "commoners"(remove): + say("@Of course, nobody would dare say anything bad about me to my face. Nobody except Chuckles, anyway.@"); + say("@But as a beggar, people will tell me just about anything!@"); + add(["Chuckles"]); + + case "Chuckles"(remove): + say("@He's in disguise too, you know. He's really Blackthorn.@"); + add(["Blackthorn"]); + + case "Blackthorn"(remove): + say("@I decided banishment was too harsh for him, so I brought him back and made him my jester. The real Chuckles is tied up in my dungeons. I got tired of him making fun of my nose.@"); + add(["dungeons"]); + + case "dungeons"(remove): + say("@I'm Lord British, and I can do whatever I want to!@"); + + case "treasury"(remove): + say("@I've got forty million crowns. Not to mention my secret bank accounts.@"); + add(["accounts"]); + + case "accounts"(remove): + say("@I told you not to mention that!@"); + + case "beggar"(remove): + say("@I'm really Lord British. I can prove it to you. I know all of the eight mantras, and where the runes are, too!@"); + add(["eight", "mantras", "runes"]); + + case "eight"(remove): + say("@I killed a dragon when I was eight, you know. With my bare hands, too!@"); + add(["dragon"]); + + case "dragon"(remove): + say("@He was a big one - but he hadn't reckoned with the likes of me. I was a tough kid.@"); + add(["tough"]); + + case "tough"(remove): + say("@I was so tough he couldn't chew me, and he had to spit me out. That's when I killed him.@"); + + case "mantras"(remove): + say("@Ok, here are the mantras: justice - do, compassion - re@"); + say("@...honor - mi, valour - fa...@"); + say("@...spirituality - so, humility - la, sacrifice - ti...@"); + say("@Gosh, wouldn't you know it? The Mantra of Honesty slips my mind at the moment...@"); + + case "runes"(remove): + say("@I'll tell you this, because you look like someone who can keep a secret.@"); + say("@I sent out eight fake runes to all the lords, to fool everybody. I put all the real ones in a little box, and hid it under my throne.@"); + say("@You can't see it there, because I turned it invisible!@"); + add(["invisible"]); + + case "invisible"(remove): + say("@A clever trick, or am I not Finn!@"); + add(["Finn"]); + + case "Finn"(remove): + say("@Oh, that's just the name I'm pretending to go by. Of course you know I'm really Lord British. I can see you're too smart to be fooled by this disguise.@"); + + + case "bye": + + item.say("@If you need me later, I'll be at the Blue Boar, disguised as the tavernkeeper. But I won't admit to it there if you ask me... Too many people that might hear.@"); + if (UI_npc_nearby(SHAMINO)) + { + item.hide(); + SHAMINO.say("You see Shamino smiling - an unusual sight."); + SHAMINO.say("Noticing your attention, he says @Perhaps there's a little of Lord British in us all.@"); + SHAMINO.hide(); + + + } + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@Good day, loyal subject!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Fyodor.UC b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Fyodor.UC new file mode 100755 index 0000000..c18f389 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Fyodor.UC @@ -0,0 +1,211 @@ + +void Fyodor object# (0x041d) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@A moment of your time..@"; + var npc_1st_greet = "@Ah, of course.@"; + + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@Hello again, " + polite_title +"@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A man in a multicolored jacket. His fingers are long and graceful.*"); + item.say("@Good " + time_of_day +", " + polite_title + ".@"); + item.say("@What can I do for you?@"); + UI_set_item_flag(item, MET); + } + else + item.say("@What can I do for you?@."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Fyodor. What is thy name?@"); + var avatar_or_name = chooseFromMenu(["The Avatar", ("I am " + player_name)]); + if (avatar_or_name == "The Avatar") + say("@Pleased to meet thee, Avatar.@"); + else + say("Pleased to meet thee, " + player_name); + + case "job": + say("@I make cloth upon my loom. Perhaps you'd like to buy some.@"); + add(["loom", "buy", "sell"]); + + case "loom"(remove): + if (UI_get_schedule_type(item) != SEW) + { + say("@I work on a large new loom. The plans for it were found in one of Lord British's old books.@"); + + } + else say("@I push the pedals with my feet--like this. Then I pull these levers. The pattern depends on which combinations of levers and pedals I move. My father's loom was not so complicated as mine. This design came from one of Lord British's old books.@"); + add(["book"]); + + case "buy"(remove): + if (UI_get_schedule_type(item) != SEW) + { + say("@Come back when I'm at my loom, I'll deal with thee then.@"); + } + else + { + say("@Cloth or thread, " + polite_title + " ?@"); + + converse(["cloth", "thread", "nothing"]) + { + case "cloth": + say("@It'll cost you 20 gold for the cloth. Interested?@"); + { + if (askYesNo()) + { + if (hasGold(20)) + { + if (UI_add_party_items(1, SHAPE_CLOTH, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(20); + say("@Excellent!@ After accepting your gold, he hands over the cloth."); + } + + else say("@You look pretty full to me.@"); + } + else say("@You haven't the money.@"); + } + else say("@That is fine.@"); + } + case "thread": + say("@It'll cost you 5 gold for the thread. Interested?@"); + { + if (askYesNo()) + { + if (hasGold(5)) + { + if (UI_add_party_items(1, SHAPE_THREAD, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(5); + say("@Excellent!@ After accepting your gold, he hands over the thread."); + } + else say("@You look pretty full to me.@"); + } + else say("@You haven't the money.@"); + } + else say("@That is fine.@"); + } + + case "nothing"(remove): + say("@You'll find none better. What can I do for you?@"); + break; + } + } + + case "sell": + if (UI_get_schedule_type(item) != SEW) + { + say("@But I don't need wool here, " + polite_title + "! Come back when I'm at my loom, I'll deal with thee then.@"); + } + else + { + say("@He turns to you and says @Will you take 8 gold for that wool?@"); + if (askYesNo()) + { + if (UI_get_cont_items(PARTY, SHAPE_WOOL, QUALITY_ANY, FRAME_ANY) > 0) + { + UI_remove_party_items(1, SHAPE_WOOL, QUALITY_ANY, FRAME_ANY); + UI_add_party_items(8, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + say("@Done!@ He hands you 8 gold pieces and takes the wool.@"); + } + else + say("@Sorry, you haven't any wool.@"); + + } + else say("@Changed your mind, eh?@"); + } + + + case "book"(remove): + say("@Lord British treasures antiques. There is one book for which he hath offered a reward: 'The Wizard of Oz.'@"); + add(["Wizard of Oz"]); + + + case "Wizard of Oz"(remove): + say("@By Master L. Frank Baum, I believe. It concerns a girl adventurer, a strange land, and a clever balloonist.@"); + add(["balloon"]); + + case "balloon"(remove): + say("@Are they not made of silk, in the form of a great bag?@"); + add(["silk"]); + + case "silk" (remove): + say("@'Tis a wondrous strong stuff, silk, and very light. I regret that I am not skillful enough to weave silk.@"); + say("@In New Magincia, however, lives the silk-weaver Charlotte.@"); + add(["Charlotte"]); + + case "Charlotte"(remove): + say("@She is the only person I know of who can weave silk.@"); + + //set flag on Charlotte in New Magincia to ask about silk. Can also read the balloon plans + if (!UI_get_item_flag(CHARLOTTE, PETRA)) + UI_set_item_flag(CHARLOTTE, PETRA); + + case "bye": + + var avatar_goodbye = "@Thanks..@"; + var npc_goodbye = "@May our paths cross again some day!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Gwenneth.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Gwenneth.uc new file mode 100755 index 0000000..b67b00f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Gwenneth.uc @@ -0,0 +1,247 @@ + +void Gwenneth object# (0x416) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Special npc item flags: + var bought_triple_xbow = UI_get_item_flag(item, PETRA); + var gave_credit = UI_get_item_flag(item, SI_ZOMBIE); + + //Shopkeeper prices + const int BOW_SELL_PRICE = 30; + const int CROSSBOW_SELL_PRICE = 40; + const int MAGIC_BOW_SELL_PRICE = 300; + const int SLING_SELL_PRICE = 10; + const int TRIPLE_CROSSBOW_PRICE = 400; + + if (UI_get_schedule_type(item) == MAJOR_SIT) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, milady!@"; + var npc_1st_greet = "@Come in, come in.@"; + + var av_2nd_greet = "@Hello again, Gwenneth.@"; + var npc_2nd_greet = "@Good to see you again, Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A petite woman with flowing brown hair.*"); + if (isNearby(IOLO)) + { + item.say("@Iolo!@"); + if (partynum > 2) + item.say("@And thy companions as well!@"); + item.say("@I heard rumors that you were in town!@"); + IOLO.say("Iolo greets his former apprentice warmly. @How goes business, Gwenneth?@"); + IOLO.hide(); + item.say("@Very well, very well indeed. Sir Geoffrey himself just placed quite a large order! Much demand for bows these days, what with the gargoyles!@"); + item.say("Turning to you, Gwenneth says, @And what can I do for Iolo's friend this fine " + time_of_day +"?@"); + + } + else + { + item.say("@I recongize thee! Thou art Iolo's friend, " + player_name + "!@"); + item.say("@What can I do for thee this fine " + time_of_day + "?@"); + + } + + + UI_set_item_flag(item, MET); + } + else + item.say("@Hello again. What can I do for thee this fine " + time_of_day + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + if (isNearby(IOLO)) + say("@What a strange question. I'm Gwenneth, of course.@"); + else + say("@Just ask Iolo! But dost thou not know Iolo? Well, I am his former apprentice, Gwenneth.@"); + + case "job"(remove): + say("@Once was I Iolo's apprentice, but then he decided to retire. Now 'tis my shop, and I craft the bows sold here! 'Course, 'tis still called Iolo's Bows, out of respect for the master.@"); + if (isNearby(IOLO)) + { + IOLO.say("At this, Iolo blushes humbly."); + IOLO.hide(); + } + add(["Iolo", "buy", "arrows and bolts"]); + + case "Iolo"(remove): + if (isNearby(IOLO)) + say("@She smiles. I would not wish to speak of Iolo amongst his friends. I might embarass him!@"); + else + say("@Nay, I really would not wish to speak of my master behind his back.@"); + + case "gargoyles"(remove): + say("@I hear from the soldiers that the gargoyles are fierce opponents. Some gargoyles move like the wind itself, and can strike you like lightning bolts! The gargoyles also have a strange and terrible weapon.@"); + add(["weapon"]); + + case "weapon"(remove): + say("@'Tis called a boomerang, and it is a most bizarre ranged weapon. It flies out to strike its target, then returns to the hand that threw it! Against such magic the soldiers chose to arm themselves with good, stout Britannian bows!@"); + + case "arrows and bolts"(remove): + say("@Aye, usually do I carry those in stock. But there has been a shortage of late, because of the gargoyle war. Go see Lynn the Fletcher, over to the north.@"); + add(["Lynn"]); + + case "Lynn"(remove): + say("@Lynn is a fine fletcher, and usually keeps me supplied with arrows and bolts. I've none left in stock, though, since the soldiers bought them all.@"); + + //For shopkeepers: + case "buy": + if (shop_is_open) + { + + //shopkeeper options + var cant_hold = "@You don't have room to carry it.@"; + var choice; + var cant_afford = "I'm sorry, but you don't have enough gold.@"; + var success = "Gwenneth gives you the " + choice + ". @I hope thou dost enjoy it!@"; + var askIfInterested; //"Do you want this + var saidNo = "@What'll it be then?@"; + var quantity = 1; + + + say("@Which of these?@"); + choice = chooseFromMenu(["crossbow", "sling", "bow", "magic bow", "triple crossbow", "nothing"]); + + if (choice == "crossbow") + { + askIfInterested = "@That " + choice + " sells for " + CROSSBOW_SELL_PRICE + " gold. Interested, Avatar?@"; + basicSellGwenneth(item, SHAPE_CROSSBOW, quantity, QUALITY_ANY, FRAME_ANY, CROSSBOW_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "sling") + { + askIfInterested = "@That " + choice + " sells for " + SLING_SELL_PRICE + " gold. Interested, Avatar?@"; + basicSellGwenneth(item, SHAPE_SLING, quantity, QUALITY_ANY, FRAME_ANY, SLING_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + + else if (choice == "bow") + { + askIfInterested = "@That " + choice + " sells for " + BOW_SELL_PRICE + " gold. Interested, Avatar?@"; + basicSellGwenneth(item, SHAPE_BOW, quantity, QUALITY_ANY, FRAME_ANY, BOW_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + + else if (choice == "magic bow") + { + askIfInterested = "@That " + choice + " sells for " + MAGIC_BOW_SELL_PRICE + " gold. Interested, Avatar?@"; + basicSellGwenneth(item, SHAPE_MAGIC_BOW, quantity, QUALITY_ANY, FRAME_ANY, MAGIC_BOW_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + + else if (choice == "triple crossbow") + { + if (!bought_triple_xbow) + { + say("@Ah, I see thou art a discerning buyer. The triple crossbow is a marvel to behold. This enchanted weapon fires three bolts at once!@"); + say("@Normally I would not offer it for sale. But, because thy cause is so important, I will allow thee-- and thee only!-- to buy it. But, I fear I must charge 400 gold for it. Dost thou wish to buy this weapon?@"); + if (askYesNo()) + { + if (hasGold(TRIPLE_CROSSBOW_PRICE)) + { + if (UI_add_party_items(1, SHAPE_TRIPLE_CROSSBOW, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(TRIPLE_CROSSBOW_PRICE); + say("@Excellent!@ After accepting your gold, Gwenneth hands over the triple crossbow."); + bought_triple_xbow = true; + } + else say("@But 'twould make thee o'erburdened, " + player_name + "!@"); + } + else say("@But thou hast not enough gold, " + player_name + "!@"); + } + else say("@It will be here, waiting for thee, if thou hast a need for it.@"); + } + else say("@I fear I had but one triple crossbow for sale. Come back in six months and I may have another.@"); + } + else if (choice == "nothing") + say("@Anything else I can do for thee?@"); + + } + else + say("@Please come back when my shop is open.@"); + + case "bye": + var npc_goodbye; + if (isNearby(IOLO)) + { + item.say("@Farewell, all of you. Iolo, I'll see thee again soon with thy share of this month's profits!@"); + UI_run_schedule(item); + break; + } + else + { + var avatar_goodbye = "@Goodbye, Gwenneth!@"; + + if (party > 1) + npc_goodbye = "@Farewell, all of you.@"; + else + npc_goodbye = "@Farewell to thee!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Kenneth.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Kenneth.uc new file mode 100755 index 0000000..dbc0708 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Kenneth.uc @@ -0,0 +1,178 @@ + +void Kenneth object# (0x427) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + //var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + /* + if (event == PROXIMITY) + { + //barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@Insert line here..@", 0); + delayedBark(item, "@Insert line here@", 8); + delayedBark(item, "@Insert line here@", 16); + } + else if (barks == 2) + delayedBark(item, "@Other lines...@", 2); + else + delayedBark(item, "@Other lines...@", 3); + } + */ + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, bard.@"; + var npc_1st_greet = "@Welcome, " + greeting + "!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Welcome back, " + greeting + "!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + item.say("You see a lively bard with laughter in his eyes."); + item.say("@Welcome, " + polite_title + "! I am Sir Kenneth, and I'd gladly play a song for thee.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //Allows you to ask him about the virtue + if (gflags[ASKED_THOLDEN_ABOUT_RUNE]) + add("compassion"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Kenneth's my name - don't wear it out.@"); + add(["Kenneth"]); + + case "job"(remove): + say("@My wife and I teach young bards the arts of composition, performance, and improvisation. We also give concerts on occasion.@"); + add(["concerts", "wife"]); + + case "song"(remove): + say("@Kenneth plays a delightful little melody for you.@"); + UI_play_music(59); //lute song + + case "Kenneth"(remove): + say("@I asked you not to wear it out! It's the only name I've got.@"); + + case "wife"(remove): + say("@Her name is Nan. Whatever you do, don't say anything to her about spiders...@"); + add(["spiders"]); + + case "concerts"(remove): + say("@Bards must be well versed in such matters.@"); + + case "spiders"(remove): + say("@She has quite an imagination. Sometimes she lets it carry her away.@"); + add(["imagination"]); + + case "imagination"(remove): + say("@Usually it doesn't give her any trouble.@"); + + case "compassion"(remove): + if (!gflags[LEARNED_RUNE_COMPASSION]) + { + say("@Yes, I know of the Rune and Mantra of Compassion.@"); + add(["rune", "mantra"]); + gflags[LEARNED_RUNE_COMPASSION] = true; + giveExperience(15); + } + else + { + say("@Yes, I know of the Rune and Mantra of Compassion.@"); + add(["rune", "mantra"]); + } + + case "rune"(remove): + say("@Ariana has the rune, and they could hardly have found a sweeter child to give it to.@"); + add(["Ariana"]); + + case "mantra"(remove): + if (!gflags[LEARNED_MANTRA_COMPASSION]) + { + say("@I've been trying to work the Mantra of Compassion into a song - but I don't know what 'mu' means.@"); + add(["mu"]); + gflags[LEARNED_MANTRA_COMPASSION] = true; + giveExperience(10); + } + else + { + say("@I've been trying to work the Mantra of Compassion into a song - but I don't know what 'mu' means.@"); + add(["mu"]); + } + + case "mu"(remove): + say("@Dost thou know what it means?@"); + if (askYesNo()) + say("@Tell me, what does it mean? Hmmmm... No, I don't think that's it.@"); + else + say("@Nobody I know does either.@"); + + case "Ariana"(remove): + say("@Once in a great while a student comes along with such a gift for learning that one need but offer a little guidance and step back to watch them learn.@"); + say("@To have such students is the most rewarding part of a teacher's job, and Ariana is one such.@"); + + case "bye": + + var avatar_goodbye = "@See you later..@"; + var npc_goodbye = "@Until we meet again..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Kytyn.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Kytyn.uc new file mode 100755 index 0000000..0706f2c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Kytyn.uc @@ -0,0 +1,166 @@ + +void Kytyn object# (0x411) () +{ + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me, miss..@"; + var npc_1st_greet = "@Welcome!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Ah, you're back. Welcome!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + item.say("You see a slender woman wearing a leather glove on her left hand."); + item.say("@Hello and welcome, " + polite_title + ".@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Kytyn.@ She smiles. @Perhaps that explains why I like birds.@"); + add(["birds", "purr"]); + + case "job": + say("@I'm the curator of the royal museum of oddities.@"); + add(["royal museum", "oddities", "lycaeum"]); + + case "birds"(remove): + say("@I used to be a falconer.@"); + add(["falconer"]); + + case "falconer"(remove): + say("@That was before Lord British appointed me to my current position.@"); + add(["Lord British"]); + + case "Lord British"(remove): + say("@A true gentleman if ever I saw one.@"); + + case "royal museum"(remove): + say("@It's just one of the projects Lord British has funded to provide a better life for his people.@"); + add(["projects"]); + + case "oddities"(remove): + say("@I can tell you more about any of the exhibits you're interested in.@"); + add(["exhibits"]); + + case "projects"(remove): + say("@He also established the conservatory that shares the building with the museum. The roads that span the realm are his doing as well.@"); + add(["conservatory", "roads"]); + + case "conservatory"(remove): + say("@Sometimes I can hear their music drifting through the walls...@"); + say("@Usually that noisy, crackling field drowns it out, though.@"); + add(["music"]); + + case "roads"(remove): + say("@Travel is much easier these days, that's for sure.@"); + add("travel"); + + case "music"(remove): + say("@It's very pretty.@"); + + case "exhibits"(remove): + say("@We have the monolith, the energy field, the perpetual motion machine, the bones of Zog, the mystery fountain, and the dragon's head, wings, and egg.@"); + say("@We are also getting other historic artifacts from Britannia's history to put on display - the Virtue stones!@"); + say("@Which one were you curious about?@"); + converse(["monolith", "mystery fountain", "energy field", "perpetual motion machine", "bones of Zog", "dragon", "Virtue stones", "nothing"]) + { + + case "monolith"(remove): + say("@I can't tell you much about that. Lord British donated it to the museum, but I can't get him to talk about it.@"); + say("@From what little he's said, I think it's an artifact from his home world.@"); + + case "energy field"(remove): + say("@The field is generated by a curious spell. By some process not yet understood, it converts magical energy into electrical energy, producing a continuous discharge. If we understood this process better, it would probably lead to all sorts of useful applications.@"); + + + case "Virtue stones"(remove): + say("@It came to our attention that an antiquities dealer in Moonglow was selling them from his collection.@"); + say("@Mandrake the bard came to us and offered to be the middleman for the trade, so we commissioned him to make the purchase.@"); + say("@He should be returning soon. Hopefully, he hasn't been attacked by gargoyles...@"); + say("@If thou dost see him during thy travels, tell him we are eagerly awating the stones for the exhibit.@"); + if (!gflags[VIRTUE_STONES]) + gflags[VIRTUE_STONES] = true; //can now ask Mandrake about them, starting the quest. + + case "perpetual motion machine"(remove): + say("@That's a very curious device. The motion of each gear turns another, until eventually the movement is propagated back to the same gear again. There's one thing I can't figure out. We've made plans of the device, and I can't see how they started it moving in the first place. None of the gears would turn unless all the others were already going. What's worse, the motions serve to hold the machine together. If the gears were still, the whole thing would fall apart! How it was built is quite a mystery.@"); + + case "bones of Zog"(remove): + say("@This skeleton seems to be about ten times older than any other ever found in Britannia. Surely it has much to tell us about our origins, if we only knew what it meant!@"); + + case "dragon"(remove): + say("@Someone named 'Gertan' donated all those parts. I think he said something about a dragon named 'Freitag'.@"); + gflags[ASKEDABOUTFREITAG] = true; + add(["Gertan"]); + + case "mystery fountain"(remove): + say("@Somebody found a huge boulder with a jet of water spraying out of it. We had it magically teleported here, buried with its surface flush with the ground, and then we built this building on top of it.@"); + say("@Of course we left a hole in the floor for the water to spray through. I often drink from it when I'm thirsty. The water is quite good, but there's something strange about it. It vanishes somehow before it hits the ground...@"); + + case "Gertan"(remove): + say("@If you want to ask Gertan, I think he's in Cove.@"); + + case "nothing"(remove): + say("@Let me know if you are interested later..@"); + break; + } + + + case "lycaeum"(remove): + say("@There is a great deal of knowledge available there for the serious scholar.@"); + + case "purr"(remove): + say("@She favors you with a deep, throaty purr that sounds just like a cat.@"); + + case "travel"(remove): + say("@That's for sure.@*"); + + case "bye": + say("@Be sure to have a look at our paintings while you're here. And come again soon...We're expecting some unicorn horns, and a Klein bottle from Trinsic.@"); + + var avatar_goodbye = "@Farewell, Kytyn..@"; + var npc_goodbye = "@Come vist again sometime!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/LadyNan.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/LadyNan.uc new file mode 100755 index 0000000..5630c6f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/LadyNan.uc @@ -0,0 +1,163 @@ +void Nan object# (0x41e) () +{ + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + + var isBarking = UI_get_item_flag(item, SI_ZOMBIE);//used to prevent "overlapping barks" when Proximity is called + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == MAJOR_SIT && !isBarking) + { + isBarking = true; + //reorganized to make it easier to add barks + var barks = [ + "@Eeek..a spider in my lute!@", + "@It's just your imagination, dear.@", + "@Are you sure? I see it.@", + "@I don't see it.@", + "@Okay..maybe its gone..@" + + ]; + + + delayedBark(item, barks[1], 0); + delayedBark(KENNETH, barks[2], 8); + delayedBark(item, barks[3], 16); + delayedBark(KENNETH, barks[4], 24); + delayedBark(item, barks[5], 32); + UI_error_message("Proximity called for LadyNan"); + + //call scripted event to clear the "isBarking" flag + script item after 300 ticks{ + call Nan; + + } + + + + } + else scheduleBarks(item); + } + //allow flag to be cleared for more barks + if (event == SCRIPTED) + { + isBarking = false; + } + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@A moment, milady..@"; + var npc_1st_greet = "@Hello..@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Sure, watch out for spiders!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + + + + if (started_talking) + { + + item.say("You see a nervous young bard."); + item.say("@I would play for thee, but I'm worried about my lute.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //Talked to Tholden about compassion rune + if (gflags[ASKED_THOLDEN_ABOUT_RUNE]) + add("compassion"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + + //Start of regular conversation tree + converse(options) + { + case "name"(remove): + say("@I am Lady Nan.@"); + + case "job"(remove): + say("@Why, making music, of course.@"); + add(["music"]); + + case "music"(remove): + say("@With my lute.@"); + add(["lute"]); + + case "lute"(remove): + say("@Every time I pick up my lute, spiders crawl out of it. There must be hundreds of them nesting in there!@"); + add(["spiders"]); + + case "spiders"(remove): + say("@I hate spiders! They're creepy, ugly, disgusting things! Why won't they leave me alone?@"); + if (isNearby(IOLO)) + { + IOLO.say("Iolo says to her, @Now, now, my dear. Have you forgotten about the gloves I gave you?@"); + IOLO.hide(); + say("@Oh, yes. Perhaps if I wore those I could play...@"); + add(["gloves"]); + } + + case "gloves"(remove): + say("@Iolo gave them to me for my birthday.@"); + + case "compassion"(remove): + say("@Yes, I know of the Rune and Mantra of Compassion.@"); + add(["rune", "mantra"]); + + case "rune"(remove): + say("@'Twas given to our most promising student, young Ariana.@"); + if (!UI_get_item_flag(ARIANA, SI_ZOMBIE)) + UI_set_item_flag(ARIANA, SI_ZOMBIE); //can now ask Ariana about rune + add(["Ariana"]); + + case "mantra"(remove): + say("@The Mantra of Compassion is 'mu.' Is that a spider on your shoulder? No, 'tis just a trick of the light.@"); + if (!gflags[LEARNED_MANTRA_COMPASSION]) + gflags[LEARNED_MANTRA_COMPASSION] = true; + + case "Ariana"(remove): + say("@She's very talented. She'll go far, if the spiders don't get her...@"); + + case "bye": + say("@Fare thee well, and watch thy step! The spiders are lurking everywhere.@"); + + var avatar_goodbye = "@Take care..@"; + var npc_goodbye = "@Eeek, a spider!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Lazeena.UC b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Lazeena.UC new file mode 100755 index 0000000..0cabe27 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Lazeena.UC @@ -0,0 +1,198 @@ + +void Lazeena object# (0x41c) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + /* + if (event == PROXIMITY) + { + //barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@Insert line here..@", 0); + delayedBark(item, "@Insert line here@", 8); + delayedBark(item, "@Insert line here@", 16); + } + else if (barks == 2) + delayedBark(item, "@Other lines...@", 2); + else + delayedBark(item, "@Other lines...@", 3); + } + */ + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Might we speak, milady?@"; + var npc_1st_greet = "@Hello, " + polite_title + "@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Ah, tis thee again.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + if (!UI_get_item_flag(item, POLYMORPH)) //haven't yet told her of artagel. + { + item.say("You see a sad lady with hair down to her ankles. A soft jingling accompanies her silent walk. Rather than talking, she sings in a voice like wind through reeds."); + item.say("@Hail, there, " + polite_title + "; come listen to me. I've plenty of time to sing unto thee.@"); + } + else + item.say("@Hail, there, " + polite_title + "; I hope thy quest is going well.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //if you talked to Artagel about Lazeena, but haven't told her yet + if (gflags[ARTAGEL_IS_ALIVE] && !UI_get_item_flag(item, POLYMORPH)) + add ("Artagel is alive"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Lazeena they call me, Lazeena the Dove. From Cove I did come, 'tis a town full of love.@"); + + case "job": + if (!UI_get_item_flag(item, POLYMORPH)) + { + say("@'Tis the aim of my life to sing like a bird. Wouldst thou like to hear the news I've heard?@"); + if (askYesNo()) + { + say("@Then tell me what would please thee more: a song of the sea or a rhyme of the shore?@"); + var choice = chooseFromMenu(["rhyme", "song"]); + if (choice == "rhyme") + { + say("She sings. @South of Loch Lake and north of the bay, the beautiful Shrine of Compassion doth lay.@"); + say("@My Artagel set out to chant there one day. But still he has not returned...@"); + say("@Was he taken by giants or headless so foul, that nary a man could contend with the smell.@"); + say("@He should have come here weeks ago now. But still he has not returned.@"); + if (!gflags[ASKED_LAZEENA_ABOUT_ARTAGEL]){ + gflags[ASKED_LAZEENA_ABOUT_ARTAGEL] = true; //used for Artagel quest. + } + add("Artagel"); + + } + if (choice == "song") + { + say("She sings. @The Dutchman was a giant ship with masts from the largest trees. The pride of the people she was hailed, the ruler of all the sea.@"); + say("@She sailed out of port one fine spring day, and headed for distant shores. But a britney caught her by surprise, 'twas flung against her core.@"); + say("@The match began the grim men fought, to gather in her sails. But thunderous was the crack and lo, the mighty vessel reeled.@"); + say("@When gentle winds danced 'cross the surf, again the followed morn.@"); + say("@'twas nothing left of Dutchy's hull but remnants of her born. And now the tale has nothing left, but a gravesight on the floor.@"); + say("@On the Fens o' the Dead she came to rest, ne'er to sail no more.@"); + + } + } + else + say("@To be of more help, I wish I knew just what this little bird could do.@"); + } + else + say("@I must stay here in Cove whilst my Artagel recovers from his wounds.@"); + + + case "Artagel"(remove): + if (!UI_get_item_flag(item, POLYMORPH)) //haven't sent her to Artagel yet + say("@He is a healer, you see.@"); + else + say("@Sometimes I sing him songs to help ease his pain. I believe he's on his way to a recovery. I can't thank thee enough!@"); + + //Added for new quest: + case "Artagel is alive"(remove): + say("At this, Lazeena's demeanor changes and she speaks to you normally."); + say("@Could it be? Hast thou news of him?@"); + add("Cove"); + + case "Cove"(remove): + say("You tell Lazeena of the gargoyle assault on the Shrine of Compassion and that Artagel is alive in Cove, barely."); + say("@My poor Artagel! I can't bear that he is suffering alone, without me by his side.@"); + say("@Before the gargoyles attacked, I was spending time here in Britain to sing and learn more about the bardic arts. He was supposed to meet me here weeks ago, but he never arrived...@"); + say("@I must go to him immediately, is it safe to travel now?@"); + if (askYesNo()) + { + say("@Thank the virtues! I must be on my way to Cove to be with my love. I hope I'm no too late...@"); + + //set her current schedule to wander + UI_set_schedule_type(item, WANDER); + + //set new schedules + + UI_modify_schedule(item, 0, SLEEP, [1707, 1116]); + UI_modify_schedule(item, 3, TEND_SHOP, [1750, 1114]); + UI_modify_schedule(item, 7, EAT, [1701, 1115]); + + //set flag to prevent circular discussion & experience gain + UI_set_item_flag(item, POLYMORPH); //open up more conversation options on her and Artagel + UI_set_npc_id(ARTAGEL, 1); //starting to recover + UI_clear_item_flag(item, SI_ZOMBIE); + UI_clear_item_flag(item, PETRA); + + giveExperience(30); + addKarma(10); + delayedBark(item, "I must be going..", 3); + delayedBark(AVATAR, "Good luck, Lazeena!", 8); + break; + + } + else + say("@Please then, thou must do something. I can't let him die...@"); + + case "bye": + + var avatar_goodbye = "@Good luck..@"; + var npc_goodbye = "@Farewell, my friend.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Linda.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Linda.uc new file mode 100755 index 0000000..0033e06 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Linda.uc @@ -0,0 +1,130 @@ + +void Linda object# (0x429) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings!@"; + var npc_1st_greet = "@Hello.@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Welcome back.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + if (!UI_get_item_flag(item, MET)) + { + item.say("A rugged looking lady farmer.*"); + item.say("@Welcome, friend.@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Welcome, friend.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Linda.@"); + + case "job": + say("@I raise crops. If you'd like to buy some grain, just say the word.@"); + add(["grain", "word", "crops"]); + + case "grain": + say("@It'll cost you 2 gold for a sack of grain. Interested?@"); + if(askYesNo()) + { + if (hasGold(2)) + { + if (UI_add_party_items(1, SHAPE_GRAIN, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(2); + say("@Here you go.@"); + } + else + say("@You look pretty full to me.@"); + } + else + say("@Best check your coinpouch again.@"); + } + else + say("@Okay.@"); + + case "word"(remove): + say("@The word 'grain,' silly!@"); + add(["grain"]); + + case "crops"(remove): + say("@Bread, cakes, pies, pastries... They all have their roots here.@"); + add(["bread", "roots"]); + + case "bread"(remove): + say("@Woman does not live on meat alone.@"); + add(["woman", "meat"]); + + case "roots"(remove): + say("@I was born to work the earth. It was either this, or be a gravedigger...@"); + add(["gravedigger"]); + + case "woman"(remove): + say("@Yes, men need to eat too, I suppose.@"); + + case "meat"(remove): + say("@Cows and sheep are much more trouble to raise than wheat.@"); + add(["cows and sheep"]); + + case "gravedigger"(remove): + say("@That's not my kind of work.@"); + + case "cows and sheep"(remove): + say("@They have their place. But not on my farm.@"); + + case "bye": + say("@May the sun shine on you, and the rain bring you nourishment.@"); + + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@Safe travels!"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Lynn.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Lynn.uc new file mode 100755 index 0000000..919e10e --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Lynn.uc @@ -0,0 +1,127 @@ + +void Lynn object# (0x421) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //shopkeeper stuff + const int DOZEN_ARROWS_PRICE = 4; + + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + const int DOZEN_BOLTS_PRICE = 3; + + var price; + var item_choice; + var item_options = ["nothing", "bolts", "arrows"]; + var item_shapes = [SHAPE_BOLT, SHAPE_ARROW]; + var item_prices = [3, 4]; + var item_frames = [31, 31]; + // + + + //Dialog options + var initial_choice_question = "@Which of these?@"; //arms or armor? etc + var ask_quantity = "@I sell them only by the dozen. How many dozens?@"; + var askIfInterested1 = "@These sell for "; //needs to be split into array to capture price + var askIfInterested2 = " gold per dozen. Okay?@"; + var cant_afford = "@Thou hast not enough gold for that many!@"; + var cant_hold = "@But thou canst not carry any!@"; + var saidNo = "@Which item?@"; + var nothing = "@Is there aught else thou would buy?@"; + var success = "Lynn takes your money and hands over the "; + var success2 = ". @I appreciate thy business.@"; + var has_quantity = true; + + + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Well, it's the Avatar!@"; + + var av_2nd_greet = "@Hi there..@"; + var npc_2nd_greet = "@Well, hello again, Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a tall, willowy woman with long blond hair."); + UI_set_item_flag(item, MET); + } + item.say("@How can I help thee this fine " + time_of_day + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm Lynn. Thou needn't tell me thy name, " + player_name + ". The Avatar is famous throughout the land!@"); + + case "job"(remove): + say("@I am a fletcher. I make bolts and bolts for the armies of Lord British himself!@"); + add(["buy", "sell"]); + + //For shopkeepers: + case "buy": + if (shop_is_open) + buyItems(item, item_options, item_prices, item_shapes, item_frames, dialog); + else + say("@Come to my shop when I'm open!@"); + + case "sell"(remove): + say("@I have all I need, and have no reason to purchase anything more. But I appreciate thy offer.@"); + + case "bye": + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Farewell! I hope I've aided thy quest!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Matt.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Matt.uc new file mode 100755 index 0000000..4bf0ccc --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Matt.uc @@ -0,0 +1,395 @@ +void Matt object# (0x417) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@.......@"; + + var av_2nd_greet = "@Excuse me..@"; + var npc_2nd_greet = "@.......@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + //used to add sidequest of curing Matt's hearing. + if (UI_get_npc_id(MATT) == 0) + { + item.say("You see a gaunt fellow, with eyes that take in everything and reveal nothing. When you address him, the man replies with gestures that appear to be some kind of sign language."); + item.say("When he sees that you can't understand him, he shrugs his shoulders and returns to his duties."); + if (isNearby(DUPRE)) + { + DUPRE.say("Dupre puts his hand on your shoulder and whispers, @Matt here had a most unfortunate accident as a child, and it left him deaf and dumb. I'd suggest you ask his wife instead, " + player_name + ".@"); + DUPRE.hide(); + } + sayGoodbye2(item); + return; + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + + add(["blank"]); + + case "job"(remove): + say("@blank.@"); + say("@blank.@"); + say("@blank.@"); + say("@blank.@"); + add(["blank", "blank"]); + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + //For shopkeepers: + case "business"(remove): + say("@Wouldst thou like ale, mead, wine, mutton, or perhaps a cake?@"); + + //shopkeeper options + var cant_hold = "@You don't have room to carry it.@"; + var choice; + var cant_afford = "I'm sorry, but you don't have enough gold.@"; + var success = "Anya gives you the " + choice + ". @I hope thou dost enjoy it!@"; + var askIfInterested; //"Do you want this + var saidNo = "@What'll it be then?@"; + var quantity; + + if (askYesNo()) + { + say("@Which of these?@"); + choice = chooseFromMenu(["ale", "mead", "wine", "mutton", "cake", "nothing"]); + + if (choice == "ale") + { + askIfInterested = "@That'll be 3 crowns, " + player_name + ". Wouldst thou like some?@"; + quantity = UI_input_numeric_value(1, 10, 1, 1); + basicSell(item, SHAPE_BOTTLE, quantity, QUALITY_ANY, FRAME_ALE, 3, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "mead") + { + askIfInterested = "@That'll be 4 crowns, " + player_name + ". Wouldst thou like some?@"; + quantity = UI_input_numeric_value(1, 10, 1, 1); + basicSell(item, SHAPE_BOTTLE, quantity, QUALITY_ANY, FRAME_MEAD, 3, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + + else if (choice == "wine") + { + askIfInterested = "@That'll be 6 crowns, " + player_name + ". Wouldst thou like some?@"; + quantity = UI_input_numeric_value(1, 10, 1, 1); + basicSell(item, SHAPE_BOTTLE, quantity, QUALITY_ANY, FRAME_MEAD, 3, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + + else if (choice == "cake") + { + askIfInterested = "@That'll be 8 crowns for the cake, " + player_name + ". Is that alright?@"; + quantity = UI_input_numeric_value(1, 10, 1, 1); + basicSell(item, SHAPE_BOTTLE, quantity, QUALITY_ANY, FRAME_MEAD, 3, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + + else if (choice == "mutton") + { + askIfInterested = "@That'll be 4 gold for the mutton. Is that alright?@"; + quantity = UI_input_numeric_value(1, 10, 1, 1); + basicSell(item, SHAPE_BOTTLE, quantity, QUALITY_ANY, FRAME_MEAD, 3, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + + + else if (choice == "nothing") + say("@Anything else I can do for thee?@"); + + } + else + say("@Very well. What else dost thou wish to speak about?@"); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "bye": + + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Max.UC b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Max.UC new file mode 100755 index 0000000..99f63a9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Max.UC @@ -0,0 +1,244 @@ + +void Max object# (0x41a) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == BLACKSMITH) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + var choice; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + const int DAGGER_SELL_PRICE = 10; + const int SWORD_SELL_PRICE = 50; + const int SPEAR_SELL_PRICE = 20; + const int TWOHANDEDSWORD_SELL_PRICE = 90; + const int CLOTH_ARMOR_SELL_PRICE = 25; + const int CHAIN_ARMOR_SELL_PRICE = 60; + const int CHAIN_LEGGINGS_SELL_PRICE = 45; + const int CURVED_HEATER_SELL_PRICE = 40; + const int PLATE_HELM_SELL_PRICE = 30; + const int LEATHER_ARMOR_SELL_PRICE = 40; + const int PLATE_ARMOR_SELL_PRICE = 120; + const int PLATE_LEGGINGS_SELL_PRICE = 75; + const int IRON_GLOVES_SELL_PRICE = 20; + const int PLATE_GORGET_SELL_PRICE = 40; + const int LEATHER_LEGGINGS_SELL_PRICE = 40; + + + var price; + var item_choice; + var weapon_options = ["nothing", "dagger", "sword", "spear", "two-handed sword"]; + var weapon_shapes = [SHAPE_DAGGER, SHAPE_SWORD, SHAPE_SPEAR, SHAPE_TWOHANDEDSWORD]; + + var armor_options = ["nothing", "cloth armor", "chain mail", "chain leggings", "curved heater", "plate helm", "leather armor", "plate armor", "plate leggings", "leather leggings"]; + var armor_shapes = [SHAPE_CLOTH_ARMOR, SHAPE_CHAIN_ARMOR, SHAPE_CHAIN_LEGGINGS, SHAPE_CURVED_HEATER, SHAPE_PLATE_HELM, SHAPE_LEATHER_ARMOR, SHAPE_PLATE_ARMOR, SHAPE_PLATE_LEGGINGS, SHAPE_LEATHER_LEGGINGS]; + var weapon_prices = [10, 20, 50, 90]; + var armor_prices = [25, 60, 20, 20, 40, 40, 120, 75, 40]; + + + + var sell_rate = 3; //integer to divide by when selling items back to npc + var sell_options = ["nothing", "cloth armor", "chain mail", "chain leggings", "curved heater", "plate helm", "leather armor", "plate armor", "plate leggings", "leather leggings", "dagger", "sword", "spear", "two-handed sword"]; + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (event == DOUBLECLICK) + { + schedule = UI_get_schedule_type(item); //use for schedule specific convos + current_schedule = schedule; + + //Avatar and NPC greeting barks + var av_1st_greet = "@A moment, milord..@"; + var npc_1st_greet = "@Ah, hello.@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Ah you've come abacka..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a swarthy blacksmith."); + item.say("@Hey, and a good " + time_of_day + " to you.@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Hey, it'sa the Avatar. Hello again.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'ma nameda Max.@"); + + case "job"(remove): + say("@Whassamattayu, you blind or somethin'? I makea de swords and stuff, what's it alook like I'ma doin' here?@"); + say("@You gotta somethin' to sell oda somethin' you wanna buy?@"); + add(["buy", "sell"]); + + if (shop_is_open) + { + say("@Do you wanta weapons or armor?@"); + choice = chooseFromMenu(["weapons", "armor"]); + + //shopkeeper options + var cant_hold = "@But she'sa be making thee too heavy, " + polite_title + "!@"; + var cant_afford = "@But she'sa costing too much for you, " + polite_title + "@"; + var success = "@Hey, at'sa good!@ After accepting your gold, he hands over the " + choice + ".@"; + var askIfInterested; //"Do you want this + var saidNo = "@What'sa you wanta nexta?@"; + var quantity = 1; + + if (choice == "weapons") + { + say("@Awhicha one adese?@"); + choice = chooseFromMenu(["sword", "dagger", "spear", "two-handed sword", "nothing"]); + + if (choice == "sword") + { + askIfInterested = "@She'sa costa " + SWORD_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_SWORD, quantity, QUALITY_ANY, FRAME_ANY, SWORD_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "dagger") + { + askIfInterested = "@She'sa costa " + DAGGER_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_DAGGER, quantity, QUALITY_ANY, FRAME_ANY, DAGGER_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "spear") + { + askIfInterested = "@She'sa costa " + SPEAR_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_SPEAR, quantity, QUALITY_ANY, FRAME_ANY, SPEAR_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "two-handed sword") + { + askIfInterested = "@She'sa costa " + TWOHANDEDSWORD_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_TWOHANDEDSWORD, quantity, QUALITY_ANY, FRAME_ANY, TWOHANDEDSWORD_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "nothing") + { + say("@Achanged your aminda, eh? What'sa you wanta nexta?@"); + } + + } + else if (choice == "armor") + { + + say("@Awhicha one adese?@"); + choice = chooseFromMenu(["chain mail", "chain leggings", "cloth armor", "plate mail", "plate leggings", "iron helm", "leather armor", "leather leggings", "curved heater", "nothing"]); + + if (choice == "chain mail") + { + askIfInterested = "@She'sa costa " + CHAIN_ARMOR_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_CHAIN_ARMOR, quantity, QUALITY_ANY, FRAME_ANY, CHAIN_ARMOR_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "cloth armor") + { + askIfInterested = "@She'sa costa " + CLOTH_ARMOR_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_CLOTH_ARMOR, quantity, QUALITY_ANY, FRAME_ANY, CLOTH_ARMOR_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "chain leggings") + { + askIfInterested = "@She'sa costa " + CHAIN_LEGGINGS_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_CHAIN_LEGGINGS, quantity, QUALITY_ANY, FRAME_ANY, CHAIN_LEGGINGS_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "plate mail") + { + askIfInterested = "@She'sa costa " + PLATE_ARMOR_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_PLATE_ARMOR, quantity, QUALITY_ANY, FRAME_ANY, PLATE_ARMOR_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "plate leggings") + { + askIfInterested = "@She'sa costa " + PLATE_LEGGINGS_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_PLATE_LEGGINGS, quantity, QUALITY_ANY, FRAME_ANY, PLATE_LEGGINGS_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "iron helm") + { + askIfInterested = "@She'sa costa " + PLATE_HELM_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_PLATE_HELM, quantity, QUALITY_ANY, FRAME_ANY, PLATE_HELM_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "leather armor") + { + askIfInterested = "@She'sa costa " + LEATHER_ARMOR_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_LEATHER_ARMOR, quantity, QUALITY_ANY, FRAME_ANY, LEATHER_ARMOR_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "leather leggings") + { + askIfInterested = "@She'sa costa " + LEATHER_LEGGINGS_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_LEATHER_LEGGINGS, quantity, QUALITY_ANY, FRAME_ANY, LEATHER_LEGGINGS_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "curved heater") + { + askIfInterested = "@She'sa costa " + CURVED_HEATER_SELL_PRICE + " agold. Interested, " + polite_title + "?@"; + basicSell(item, SHAPE_CURVED_HEATER, quantity, QUALITY_ANY, FRAME_ANY, CURVED_HEATER_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "nothing") + { + say("@Achanged your aminda, eh? What'sa you wanta nexta?@"); + } + + } + + } + else + say("@You come to my shopa when shesa open!@"); + + case "sell": + if (shop_is_open) + sellBackItems([armor_shapes, weapon_shapes], [sell_options], [armor_prices, weapon_prices], 3); + else + say("You come to my shopa when shesa open!@"); + + + case "bye": + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Goodbyea to you. Come abacka soon, ah?@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Nema.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Nema.uc new file mode 100755 index 0000000..ebef57c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Nema.uc @@ -0,0 +1,171 @@ + +void Nema object# (0x42f) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me, miss..@"; + var npc_1st_greet = "@..yawn..Mmm yes?@"; + + var av_2nd_greet = "@Hello there..@"; + var npc_2nd_greet = "@..yawn..'tis thee again!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A sleepy looking young lady.*"); + item.say("She yawns as you approach. @Oh, hello there. I must have been daydreaming.@"); + UI_set_item_flag(item, MET); + } + else + item.say("She yawns as you approach. @Oh, hello there. I must have been daydreaming.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Nema. What's yours?@"); + var choice = chooseFromMenu(["The Avatar", ("I am " + player_name)]); + if (choice == "The Avatar") + say("@The Avatar? That's nice.@"); + else + say("@ " + player_name + "? That's nice.@"); + + + case "job"(remove): + say("@I tend Lord British's orchard. Of course, this time of year there's not much to do, so I take a lot of naps.@"); + add(["Lord British", "naps", "orchard"]); + + case "daydream"(remove): + say("@Well, I have better dreams at night anyway.@"); + add(["night"]); + + case "Lord British"(remove): + say("@Long live the king! I was just a homeless orphan when he gave me this job.@"); + add(["orphan"]); + + case "naps"(remove): + say("@To snooze, perchance to dream... O Morpheus, I long for a taste of thy sweet oblivion!@"); + add(["oblivion", "Morpheus", "daydream"]); + + case "orchard"(remove): + say("@To provide fresh fruit for Lord British's banquets.@"); + add(["banquets"]); + + case "banquets"(remove): + say("@That's the way of it.@"); + + case "orphan"(remove): + say("@My parents were killed in an earthquake. But now I have a place to live, and a job to put food on the table.@"); + add(["earthquake"]); + + case "oblivion"(remove): + say("@Sleep is the finest medicine, for in our dreams lie the answers to all the problems of the waking world.@"); + add(["dreams", "answers", "waking world"]); + + case "Morpheus"(remove): + say("@Morpheus is the King of Slumberland! I think the moon is one of his daughters.@"); + add(["Slumberland", "moon"]); + + case "earthquake"(remove): + say("@The earthquakes seem to have stopped, thank goodness. We haven't had one in well over a year now.@"); + + case "dreams"(remove): + say("@I dream of castles of ice, rivers that run backwards, fairy princesses and cloud dragons. Once I dreamed that my orchard grew and grew, until I felt like a tiny bug amongst the giant plants. Sometimes everything is upside-down, or made of chocolate. I've dreamed many a strange dream, but my favorite one is.....@"); + say("She falls asleep before finishing her sentence."); + UI_set_item_flag(item, ASLEEP); + UI_set_schedule_type(item, SLEEP); + sayGoodbyeAbrupt2(item, "..zzz.."); + break; + + case "answers"(remove): + say("@Day brings questions, night brings answers. Thusly does the duality of the universe find expression in our lives.@"); + add(["questions", "night"]); + + case "waking world"(remove): + say("@Colors never seem as vivid when I'm awake.@"); + + case "night"(remove): + say("@When the sun's blazing eye winks shut, and Morpheus rules the heavens.@"); + add(["Morpheus"]); + + case "Slumberland"(remove): + say("@It lies halfway between our fears and our desires.@"); + add(["desires"]); + + case "moon"(remove): + say("@She is the sweet harbinger of the night!@"); + + case "questions"(remove): + say("@What color is seven? How many is green? Could horses speak, if they wished to? These things concern me...@"); + if (isNearby(DUPRE)) + { + DUPRE.say("@Concerned? She should be committed! We have better things to do than listen to this loon.@"); + DUPRE.hide(); + } + + + case "desires"(remove): + say("@Fear and desire... What would either be without the other?@"); + + case "bye": + item.say("She seems to have dozed off before she even heard you say goodbye."); + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@...zzz...@"; + //function that is called, do not change this: + sayGoodbyeAbrupt2(item, npc_goodbye); + + UI_set_item_flag(item, ASLEEP); + UI_set_schedule_type(item, SLEEP); + + break; + + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Peyton.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Peyton.uc new file mode 100755 index 0000000..742bca2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Peyton.uc @@ -0,0 +1,195 @@ +void Peyton object# (0x419) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + + var started_talking = UI_get_item_flag(item, READ); + + var single_plural; + + if (partynum > 1) + single_plural = "traveler"; + else + single_plural = "travelers"; + + var time_of_day = timeFunction(hour); + + //Inn flags / variables + var PEYTON_INN_PRICE = 8; + var checkout = UI_get_item_flag(item, PETRA); + var hasKey = UI_count_objects(PARTY, SHAPE_KEY, QUALITY_PEYTON_INN, FRAME_ANY); + var door; + var open_doors; + const int SHAPE_OPEN_DOOR = 270; + const int SHAPE_CLOSED_DOOR = 376; + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + if (event == DOUBLECLICK) + { + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + var av_1st_greet = "@Greetings..@"; + var npc_1st_greet = "@Good " + time_of_day + ", " + greeting + "!@"; + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@Good " + time_of_day + ", " + greeting + "!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + + } + if (started_talking) + { + if (checkout) + { + item.say("@Good " + time_of_day + ", are you ready to check out?@"); + if (askYesNo()) + { + if (hasKey) + { + say("Peyton serves you a large breakfast and you hand him the key."); + say("@Good " + time_of_day + " and have a good day.@"); + UI_add_party_items(partynum, SHAPE_FOOD, QUALITY_ANY, FRAME_EGG, false); + UI_add_party_items(partynum, SHAPE_BOTTLE, QUALITY_ANY, FRAME_MILK, false); + UI_remove_party_items(1, SHAPE_KEY, QUALITY_GIDEON_INN, FRAME_ANY, false); + + //clear stuff for usecode egg + UI_clear_item_flag(item, PETRA); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + + //look for open doors / unlocked doors of quality 24 + var open_doors = UI_find_nearby([1032, 1319, 0], SHAPE_OPEN_DOOR, 25, MASK_NONE); + + //change open doors to closed, locked frame, correct quality + for (door in open_doors) + { + if (UI_set_item_quality(door) == QUALITY_PEYTON_INN) + { + UI_set_item_shape(door, SHAPE_CLOSED_DOOR); + UI_set_item_frame(door, 2); //locked + UI_set_item_quality(door, QUALITY_PEYTON_INN); + } + } + + //find closed doors, make sure they are locked + var closed_doors = UI_find_nearby([1032, 1319, 0], SHAPE_CLOSED_DOOR, 25, MASK_NONE); + for (door in closed_doors) + { + if (UI_set_item_quality(door) == QUALITY_PEYTON_INN) + { + UI_set_item_frame(door, 2); //locked + UI_set_item_quality(door, QUALITY_PEYTON_INN); + } + } + var avatar_goodbye = "@Have a nice " + time_of_day + "..@"; + var npc_goodbye = "@Goodbye. Take care of yourself.@"; + sayGoodbye(item, npc_goodbye, avatar_goodbye); + return; + + } + else + say("@Well, where is the key? Perhaps you left it in your room. Come back when you're ready to check out.@"); + + //send him back on regular schedule to avoid loop + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + UI_run_schedule(item); + return; + } + else + say("@Okay just let me know when you're ready to check out.@"); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + UI_run_schedule(item); + return; + } + + if (!UI_get_item_flag(item, MET)) + { + item.say("A well-dressed man with a very even temper.*"); + item.say("@Greetings, " + single_plural + ", and welcome to the Wayfarer's Inn!@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Greetings, " + single_plural + ", and welcome back to the Wayfarer's Inn!@"); + + + + var options = ["name", "job", "bye"]; + + + + + ///////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////// + + + converse(options) + { + case "name"(remove): + say("@I am Peyton, and this is my place.@ He gestures with his hands."); + add(["Peyton"]); + + case "job"(remove): + say("@I can offer you a room for the evening.@"); + add(["room"]); + + + case "room"(remove): + say("@" + PEYTON_INN_PRICE + " gold per person for bed and breakfast. Interested?@"); // Yes/No Question + if (askYesNo()) + { + if (hasGold(PEYTON_INN_PRICE * partynum)) + { + chargeGold(PEYTON_INN_PRICE * partynum); + say("@Here's your key. You'll be staying in the room straight ahead. Checkout time is 9am and breakfast will be served. Enjoy your stay!@"); + UI_add_party_items(1, SHAPE_KEY, QUALITY_PEYTON_INN, 1); + UI_set_item_flag(item, PETRA); //staying in Inn flag + + var avatar_goodbye = "@Thanks..@"; + var npc_goodbye = "@Enjoy thy stay.@"; + sayGoodbye(item, npc_goodbye, avatar_goodbye); + + UI_run_schedule(item); + break; + + } + else + say("@You don't have enough gold for that. I'm sorry, cash in advance. That's our policy.@"); + } + else + say("@Well, perhaps next time you're in town.@"); // Answered NO to question + + case "Peyton"(remove): + say("@Did you need something?@"); + + + case "bye": + var avatar_goodbye = "@Have a nice " + time_of_day + "..@"; + var npc_goodbye = "@Goodbye. Take care of yourself.@"; + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Rufus.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Rufus.uc new file mode 100755 index 0000000..572f5c3 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Rufus.uc @@ -0,0 +1,150 @@ + +void Rufus object# (0x424) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hello, sir.@"; + var npc_1st_greet = "@Greetings.@"; + + var av_2nd_greet = "@Hail, there!@"; + var npc_2nd_greet = "@Greetings.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + UI_run_schedule(item); + if (UI_get_schedule_type(item) != BLACKSMITH) + { + if (UI_part_of_day() == EVENING) + { + item.say("@I'm busy just now. Why don't ya come t'my smithy tomorrow and we'll talk then.@"); + + } + else + item.say ("@I'm busy just now. Why don't ya come t'my smithy later today and we'll talk then.@"); + + var avatar_goodbye = "@Speak to you soon.@"; + var npc_goodbye = "@See ya later.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + UI_run_schedule(item); + return; + + } + else if (!UI_get_item_flag(item, MET)) + { + item.say("You see a rough and tumble man with wild, unkempt hair."); + item.say("@Aye, and a fine " + time_of_day + " to you, my " + greeting + ".@"); + UI_set_item_flag(item, MET); + } + else + { + item.say("@'Tis good to see thee, friend!@ he says, grabbing your arm. What d'ya need?@"); + } + + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Rufus the Red.@"); + add(["red"]); + + case "job"(remove): + say("@If you want to buy horseshoes, just ask.@"); + add(["buy", "horseshoes"]); + + case "red"(remove): + say("@Can ya not tell by my hair?@"); + + case "buy"(remove): + say("@It'll cost you 2 gold for the horseshoes. Interested?@"); + { + if (askYesNo()) + { + if (hasGold(2)) + { + if (UI_add_party_items(1, SHAPE_HORSESHOES, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(2); + say("@Good, good!@ After accepting your gold, Rufus hands over the horseshoes."); + } + else + say("@You look pretty full to me.@"); + } + else say("@You haven't enough gold!@"); + } + else say("@You'll find none stronger.@"); + } + + + case "horseshoes"(remove): + say("@Aye, it saves their feet from stones and such.@"); + + + case "bye": + + var avatar_goodbye = "@Goodbye!@"; + var npc_goodbye = "@Remember to shoe yer steed often. Bye.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Terri.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Terri.uc new file mode 100755 index 0000000..dea82cf --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Terri.uc @@ -0,0 +1,243 @@ +void Terri object# (0x420) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var already_exhanged = UI_get_item_flag(item, SI_ZOMBIE); + + if (event == DEATH) + UI_error_message("Terri is dead."); + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me, milady..@"; + if (player_is_female) + npc_1st_greet = "@Oh, hello.@"; + else + npc_1st_greet = "@Oh! Hello there..@"; + + av_2nd_greet = "@Hello Terri..@"; + if (player_is_female) + npc_2nd_greet = "@Hello again!@"; + else + npc_2nd_greet = "@Welcome back, handsome..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("You see a sharply dressed, very voluptuous woman."); + item.say("@Hello. My name's Terri - I run the mint. Say, aren't you the Avatar?@"); + item.say("@Yes, I recognize you from your portrait...My mother used to tell me stories about you when I was a girl.@"); + item.say("@You probably wouldn't remember her, but she was at the big celebration right after you recovered the Codex.@"); + if (player_is_female) + item.say("@Anyway... I just wanted to tell you that I always wanted to grow up to be just like you...@"); + else + item.say("@Anyway... I just wanted to tell you that I always hoped someday I'd meet a man like you...@"); + } + else + item.say("@Oh, you've come back to visit me again!@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //automatically add buy/sell to options next time + if (UI_get_item_flag(item, SHOPPED_BEFORE)) + add("exchange"); + + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@It's Terri...@"); + if (player_is_female) + say("@But I wish I had been named after you.@"); + else + { + say("@Don't you think that would be a good name for an Avatar's wife?@"); + if (askYesNo()) + say("She winks at you."); + else + say("@Oh.@ She seems dissapointed."); + } + + + case "job": + say("@By royal decree, I am the only one allowed to mint the official coinage of the realm. Copper pence, silver pieces, and gold crowns - they're all made right here.@"); + say("@My father ran the mint before me. But I get lonely here sometimes...@"); + say("@It's so nice of you to come by and talk to me. Kytyn will never believe it when I tell her I got to meet the Avatar in person!@"); + add(["mint", "father", "copper and silver", "Kytyn", "Avatar"]); + + case "mint"(remove): + say("@Here, let me show you.@ She takes out a sample of each coin for you to look at. @The pence has an ankh on one side, and crossed swords on the other.@"); + say("@The silver piece has Lord British's face on the front, and a serpent on the back. And the gold crown is a familiar sight, with a crown and the symbol of the Codex.@"); + say("All three of them look newly minted - they're very shiny."); + //automatically add exchange to options next time + if (!UI_get_item_flag(item, SHOPPED_BEFORE)) + UI_set_item_flag(item, SHOPPED_BEFORE); + add(["exchange", "Codex"]); + + case "father"(remove): + say("@May he rest in peace.@"); + + case "copper and silver"(remove): + say("@Of course, I'm sure you only carry gold crowns with you, being as important as you are.@ She reaches over and squeezes your shoulder affectionately."); + + case "Kytyn"(remove): + say("@She's a good friend of mine. She runs the museum.@"); + add(["museum"]); + + case "Avatar"(remove): + say("@You must be the bravest man I've ever met. I can't believe it's really you!@"); + + case "exchange"(remove): + say("@I get most of my gold from people who bring in nuggets or gold bars to exchange them for coins. Do you have any gold nuggets or bars you'd like to trade in for crowns?@"); + var num_gold_bars = UI_count_objects(PARTY, SHAPE_GOLDBAR, QUALITY_ANY, FRAME_ANY); + var num_gold_nuggets = UI_count_objects(PARTY, SHAPE_GOLDNUGGET, QUALITY_ANY, FRAME_ANY); + + var nugget_price = num_gold_nuggets * 10; + var bar_price = num_gold_bars * 100; + var payment = nugget_price + bar_price; + + if(askYesNo()) + { + if (num_gold_bars + num_gold_nuggets > 0) + { + say("@Normally there's a ten percent tax on the exchange. But since you're the Avatar, I'll give you a full hundred crowns for every gold bars you have, and ten crowns for every gold nugget.@"); + if (num_gold_nuggets > 0 && num_gold_bars > 0) + say("She exchanges all of your gold nuggets and gold bars for " + payment + " newly minted crowns."); + else if (num_gold_nuggets > 0) + say("She exchanges all of your gold nuggets for " + payment + " newly minted crowns."); + else if (num_gold_bars > 0) + say("She exchanges all of your gold bars for " + payment + " newly minted crowns."); + else + say("@DERP!@ You shouldn't be seeing this..."); + + + + //remove all gold nuggets and bars first + if (num_gold_nuggets > 0) + UI_remove_party_items(num_gold_nuggets, SHAPE_GOLDNUGGET, QUALITY_ANY, FRAME_ANY, true); + + if (num_gold_bars > 0) + UI_remove_party_items(num_gold_bars, SHAPE_GOLDBAR, QUALITY_ANY, FRAME_ANY, true); + + //now give gold so pack is clear + giveGold(payment); + } + else + say("@You must be mistaken. But let me know if you come across any gold nuggets later.@"); + } + else + say("@Well, if you do later, you know where to find me.@"); + + + case "Codex"(remove): + say("@My mother told me all about it.@"); + add(["mother"]); + + case "mother"(remove): + say("@May she rest in peace.@"); + + case "museum"(remove): + say("@You should visit there sometime. But please stay and talk to me a bit longer first...@"); + add("stay"); + + + case "stay"(remove): + say("You notice she was staring at you with a dreamy look in her eyes."); + if (player_is_female) + say("@Oh, I'm sorry, I wasn't listening. I was just thinking how nice it must be to be as beautiful as you.@"); + else + say("@Oh, I'm sorry, I wasn't listening. I was just noticing how strong and handsome you are...@ She looks away and sighs."); + + + case "bye": + say("@I know you're very busy, saving Britannia and all that, but I hope you'll come and visit me again...@"); + if (player_is_female) + say("@It really was delightful talking to you.@"); + else + { + say("@And maybe if you have time for it, I could show you more than a few silly coins!@"); + say("As you turn to leave, she pinches you."); + } + if (player_is_female) + { + avatar_goodbye = "@Goodbye, Terri..@"; + npc_goodbye = "@Come again sometime!@"; + } + else + { + avatar_goodbye = "@Oh! Goodbye..@"; + npc_goodbye = "@Come back soon, handsome...@"; + if (inParty(DUPRE)) + delayedBark(DUPRE, "I think she likes you, Avatar..", 8); + } + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Tholden.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Tholden.uc new file mode 100755 index 0000000..64f6e58 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Tholden.uc @@ -0,0 +1,137 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + +void Tholden object# (0x42b) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var barks; //for proximity + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if ((event == PROXIMITY) && (schedule == DESK_WORK)) + { + var rand = UI_get_random(3); + if (rand == 1) + delayedBark(item, "@Busy, busy busy..@", 0); + else if (barks == 2) + delayedBark(item, "@Now where did I put mine pen?@", 0); + else + delayedBark(item, "@So much to do..@", 0); + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me, milord..@"; + var npc_1st_greet = "@Ah... yes?@"; + + var av_2nd_greet = "@Might we speek again?@"; + var npc_2nd_greet = "@Of course..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + item.say("A preoccupied man holding a ledger under one arm.*"); + item.say("@Records to keep, festivals to plan, I'm so busy...@"); + item.say("@But I can spare you a moment, " + polite_title + "."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + //Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Tholden von Bazillius, Chancellor to Lord British. In my younger days, I was known as 'The Werecat of the Wine Cellar'...@"); + add(["'Werecat'", "rune"]); + + case "job"(remove): + say("@All the little details of governing, all the paperwork falls on my shoulders.@*"); + say("@Someone must do it, and yet I miss the days when I was a carefree adventurer.@"); + + case "rune"(remove): + if (!gflags[ASKED_THOLDEN_ABOUT_RUNE]) + { + if (!UI_get_item_flag(ARIANA, SI_ZOMBIE)) + UI_set_item_flag(ARIANA, SI_ZOMBIE); //can now ask Ariana about rune + gflags[ASKED_THOLDEN_ABOUT_RUNE] = true; + giveExperience(15); + } + say("@The rune and mantra of Compassion are in the keeping of the bards at the Conservatory. I entrusted them with the rune due to their compassionate nature.@*"); + say("@As for the other runes - they are no longer together, as they were when the Codex was recovered. Since then, they have become scattered throughout the land. Each was sent to a town near its shrine. If thou dost ask the lords of each of these towns, they should be able to tell thee more.@*"); + say("@The towns are Moonglow, Jhelom, Yew, Minoc, Trinsic, Skara Brae, and New Magincia.@"); + add(["Codex", "Conservatory"]); + + case "Codex"(remove): + say("@'Tis the greatest treasure in all the realm.@"); + + case "Conservatory"(remove): + say("@'Twas founded by Lord British.@"); + + case "'Werecat'"(remove): + say("@I could tell you stories... But there's no time for that now.@"); + + case "bye": + say("Tholden bows deeply. @I hope I have been of assistance, Avatar.@"); + + var avatar_goodbye = "@So long..@"; + var npc_goodbye = "@Safe journeys, Avatar.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Tiberius.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Tiberius.uc new file mode 100755 index 0000000..81315e6 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Tiberius.uc @@ -0,0 +1,107 @@ + +void Tiberius object# (0x42a) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var title; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + title = "daughter"; + } + else + { + // pronoun = " "; + title = "son"; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "children"; + else + greeting = "child"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@A moment, healer.@"; + var npc_1st_greet = "@Greetings, my " + title + ".@"; + + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@Yes, my " + title + "?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A rotund man in monk's robes."); + item.say("@Greetings, my " + greeting + ". What can I do for thee today?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Tiberius, healer for this town.@"); + + case "job": + say("@It is my responsibility to care for the sick and injured. I attempt to heal, cure, or if needed, resurrect the fallen.@"); + add(["healing"]); + + + case "healing": + if (UI_get_schedule_type(item) != TEND_SHOP) + { + say("@Come to my shop when I'm open!@"); + } + else + chantuHeal(10, 30, 400); + + + + + case "bye": + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Go in peace, my " + greeting + ".@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Wilbur.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Wilbur.uc new file mode 100755 index 0000000..aff764c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Britain/Wilbur.uc @@ -0,0 +1,177 @@ + +void Wilbur object# (0x422) () +{ + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var horse_bark; + var wilbur_bark; + + const int QUALITY_CARRIAGE = 28; + const int FRAME_CARRIAGE = 1; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "travelers"; + else greeting = "traveler"; //Avatar is solo + + //Used if special barks needed, otherwise delete + + if (event == PROXIMITY && UI_get_schedule_type(item) == TEND_SHOP) + { + var rand = UI_get_random(3); + var rand2 = UI_get_random(3); + var horsebark; + var horse = UI_find_object(FIND_ON_SCREEN, SHAPE_HORSE, QUALITY_ANY, FRAME_ANY); + //var horses = UI_find_nearby([0849, 1334], SHAPE_HORSE, 50, MASK_NONE); + + + //var horse = horses[1]; //find nearest horse out of array + UI_error_message("Proximity event called on Wilbur"); + + if (horse) + { + UI_error_message("Horse found near Wilbur"); + //funny barks for horse + if (rand == 1) + { + horse_bark = "Willburrrr.."; + wilbur_bark = "Who called my name..?"; + } + else if (rand == 2) + { + horse_bark = "Hello, I'm Mister Ed!"; + wilbur_bark = "Wh..who said that!?"; + } + else if (rand == 3) + { + horse_bark = "How 'bout some hay, Wilbur?"; + wilbur_bark = "Just my imagination..that's it.."; + + } + + UI_item_say(horse, horse_bark); + delayedBark(WILBUR, wilbur_bark, 12); + + } + else + UI_error_message("No horse to interact with."); + + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Hello and welcome!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Welcome back, " + polite_title + ".@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("You see a thin, dark-haired man with a nervous smile."); + item.say("@Greetings, " + greeting + "! What can I do for you this fine " + time_of_day + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //met smith, ask him about talking horses + if (UI_get_item_flag(SMITH, MET)) + add("Smith"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name's Wilbur, " + polite_title + ".@"); + + case "job"(remove): + say("@I work here at the stables, taking care of the horses. You can buy one if you'd like.@"); + add(["buy", "horse"]); + + case "horse"(remove): + say("@Aye, if you wish to buy one, just say the word.@"); + + case "buy"(remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + say("@My price is a hundred gold pieces for the deed to a horse carriage, no less. Interested?@"); + if(askYesNo()) + { + if (hasGold(100)) + { + if (UI_add_party_items(1, SHAPE_SCROLL, QUALITY_CARRIAGE, FRAME_CARRIAGE, true)) + { + chargeGold(100); + say("@Good!@ Wilbur takes your gold, and hands over the deed to a fine horse-drawn carriage.@"); + UI_set_item_flag(item, SI_ZOMBIE); //only buy once + } + else + say("@But thou canst not carry the deed!@"); + } + else + say("@But thou canst not afford one!@"); + } + else + say("@Perhaps some other time then.@"); + } + else + say("@I'm afraid you bought my last one already.@"); + + case "Smith"(remove): + say("@A talking horse? Ridiculous! Who told you that?@ He seems more nervous than before."); + + case "bye": + + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@Come back again!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Budo.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Budo.uc new file mode 100755 index 0000000..83d511c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Budo.uc @@ -0,0 +1,246 @@ + +void Budo object# (0x4e5) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int QUALITY_GUILD_BELT = 1; + + //before guild prices + const int TORCH_SELL_PRICE = 5; + const int OIL_SELL_PRICE = 10; + const int LOCKPICK_SELL_PRICE = 7; + const int GEM_SELL_PRICE = 15; + const int BACKPACK_SELL_PRICE = 10; + const int BAG_SELL_PRICE = 5; + const int SHOVEL_SELL_PRICE = 20; + const int POWDER_KEG_SELL_PRICE = 40; + //JOINED GUILD PRICES + // ***These are not verified yet, just cut in half almost + + const int G_TORCH_SELL_PRICE = 3; + const int G_OIL_SELL_PRICE = 5; + const int G_LOCKPICK_SELL_PRICE = 3; + const int G_GEM_SELL_PRICE = 8; + const int G_BACKPACK_SELL_PRICE = 5; + const int G_BAG_SELL_PRICE = 2; + const int G_SHOVEL_SELL_PRICE = 10; + const int G_POWDER_KEG_SELL_PRICE = 30; + + //shopkeeper stuff + + var price; + var item_choice; + var item_options = ["nothing", "torch", "oil", "lockpicks", "backpack", "bag", "shovel", "powder keg"]; + var item_shapes = [SHAPE_TORCH, SHAPE_OIL, SHAPE_LOCKPICK, SHAPE_BACKPACK, SHAPE_BAG, SHAPE_SHOVEL, SHAPE_POWDER_KEG]; + var item_prices; + + //take into account thieves guild discount + if (gflags[JOINED_THIEVES_GUILD]) + item_prices = [G_TORCH_SELL_PRICE, G_OIL_SELL_PRICE, G_LOCKPICK_SELL_PRICE, G_BACKPACK_SELL_PRICE, G_BAG_SELL_PRICE, G_SHOVEL_SELL_PRICE, G_POWDER_KEG_SELL_PRICE]; //discounted prices + else + item_prices = [TORCH_SELL_PRICE, OIL_SELL_PRICE, LOCKPICK_SELL_PRICE, BACKPACK_SELL_PRICE, BAG_SELL_PRICE, SHOVEL_SELL_PRICE, POWDER_KEG_SELL_PRICE]; + + var item_frames = [0, 0, 0, 0, 0, 0, 0]; + // + + + //Dialog options + var initial_choice_question = "@Which, torches, oil, lockpicks, gems, backpacks, bags, shovels, or powder kegs?@"; //arms or armor? etc + var ask_quantity = "@How many do you want?@"; + var askIfInterested1 = "@It'll cost you "; //needs to be split into array to capture price + var askIfInterested2 = " gold for each.@"; + var cant_afford = "@I think you have less gold than you thought.@"; + var cant_hold = "@You haven't any room in your pack.@"; + var saidNo = "Budo frowns at you. @That was a good price.@"; + var nothing = "@What can I do you for?@"; + var success = "@There you go.@ Budo hands you the "; + var success2 = ". I appreciate thy business.@"; + + + + + //group together dialog options in array for cleaner look + + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + var title; + if (player_is_female) // + { + // pronoun = " "; + title = "sister"; + } + else + { + // pronoun = " "; + title = "brother"; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@A moment, milord..@"; + npc_1st_greet = "@Oh! You've returned..@"; + + av_2nd_greet = "@Might we speak again, Budo?@"; + if (gflags[JOINED_THIEVES_GUILD]) + npc_2nd_greet = "@Greetings, " + title + " thief.@"; + else + npc_2nd_greet = "@Who? Ah, yes..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + item.say("@Good " + time_of_day + "!@"); + item.say("@I bet you've come back to pick up that orrery you ordered.@"); + if (isNearby(DUPRE)) + { + DUPRE.say("@Don't be ridiculous! This is the first time we've ever been in your shop!@ says Dupre."); + DUPRE.hide(); + item.say("@Oh, I'm sorry. I must have thought you were somebody you aren't.@"); + } + else + item.say("@I'm afraid it still hasn't arrived.@"); + } + else + item.say("@Do you need to buy some supplies?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + if (gflags[LEARNED_ABOUT_GUILD]) + add("guild"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name": + say("@Why, it's Budo, I believe. That's what it was last week. Some call me 'the Den', but I don't think that's my name.@"); + add(["The Den"]); + + case "job": + say("@Oh, I sell this and that. I'm not sure what 'this' and 'that' are, but I sell a lot of them! People give me money for them, that is.@"); + add(["buy", "money"]); + + case "The Den"(remove): + say("@I think someone told me that was Nick's name.@"); + add(["Nick"]); + + case "Nick"(remove): + say("@I've never met him, myself.@"); + + case "orrery"(remove): + say("@I don't know what it is, but I've got one on order.@"); + + case "money"(remove): + say("@It's not as sweet as honey, but you can trade one for the other.@"); + add(["honey"]); + + case "honey"(remove): + say("@I like honey.@"); + + case "guild"(remove): + if (!gflags[JOINED_THIEVES_GUILD]) + { + if (UI_count_objects(PARTY, SHAPE_GUILD_BELT, QUALITY_ANY, FRAME_ANY) > 0) // + { + say("He glances about quickly, to make sure nobody else is listening. In a low voice he says, @Congratulations, and welcome to the guild. I can offer you the standard member's discount on all supplies now. Just remember, whatever you do, don't tell anyone about our guild!@"); // if (obj_in_party(25,0) <> 32769) + gflags[JOINED_THIEVES_GUILD] = true; + } + else + { + say("A startling change comes over his features. Suddenly the good-natured bumbler that stood before you has been transformed into a shrewd, sharp, dangerous looking man. He leans forward staring straight into your eyes as he asks @Who sent you?@"); // narrated + say("@Uh-huh. Well... Were you hoping to join?@"); + if (askYesNo()) + { + say("@All right, maybe you've got what it takes. We'll see. To be a member of the thieves' guild, you have to get your own belt.@*"); + say("@Now we have a limited membership, so there's only so many belts in the world. If you want one of them, you have to 'retire' a member of the guild. Lucky for you, it just happens there's a member we'd like to see 'retired' soon.@*"); + say("@Her hideout is deep below Britain, in the sewers. You'd best watch out for the rats down there!@*"); + say("@One last thing... It would be an embarassment for the guild to have bodies turning up inconveniently. So don't get too violent unless you have to. I'll talk to you when you get back.@"); + if (!gflags[RETIRE_PHOENIX]) + gflags[RETIRE_PHOENIX] = true; + } + else + { + say("He leans even closer, transfixing you with his gaze.*"); + say("@Then just remember this. I don't take kindly to anyone spreading secrets around. If you were to tell anyone I'm involved with the guild, well...Let's just say accidents can happen to anyone--even the Avatar...@"); + sayGoodbye2("@Now get out of my shop!@"); + break; + } + } + } + else + say("@To keep the guild safe, each member only knows the names of two others. You're safer not knowing more about the guild than you have to, believe me...@"); + + case "buy": + buyItems(BUDO, item_options, item_prices, item_shapes, item_frames, dialog); + + case "bye": + avatar_goodbye = "@Must be going now..@"; + if (gflags[JOINED_THIEVES_GUILD]) + { + say("He winks at you. @The guild is behind you, as long as you keep our secret.@"); + npc_goodbye = "@Remember, keep it secret!@"; + } + else + npc_goodbye = "Ta ta for now."; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + }//end converse + } //end started talking + else + scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/CaptainElad.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/CaptainElad.uc new file mode 100755 index 0000000..cf1c4a0 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/CaptainElad.uc @@ -0,0 +1,286 @@ + +void Elad object# (0x4e2) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == KID_GAMES) + { + var barks = ["@Who threw that?!@", + "@Oof!@", + "@Take that!@", + "@I'll cut you!@", + "@You spilled mine tea!@", + "@Ungh!@"]; + var rand_barks = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand_barks]); + + } + } + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Might we speak for a moment, milord?@"; + av_2nd_greet = "@Greetings..@"; + + if (UI_get_schedule_type(item) == KID_GAMES) + { + npc_1st_greet = "@Not now!@"; + npc_2nd_greet = "@Not now!@"; + } + else + { + npc_1st_greet = "@Uh, sure..@"; + npc_2nd_greet = "@Uh, hello again..@"; + + } + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (UI_get_schedule_type(item) == KID_GAMES) + { + item.say("@Can't talk now. I'm--ungh!@ He reels from a punch to his belly. @I'm in the middle of something, " + polite_title + ".@"); + sayGoodbyeAbrupt(item, "Ungh!"); + return; + } + + + item.say("An uncomfortable looking man sitting behind a cup of tea."); + item.say("@Hello.@ His gaze darts from side to side, lingering longingly on the mugs of ale his fellow patrons are gulping down heartily.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + var mantraoptions = ["make something up"]; + if (gflags[LEARNED_MANTRA_HONESTY]) + mantraoptions = mantraoptions + "ahm"; + if (gflags[LEARNED_MANTRA_COMPASSION]) + mantraoptions = mantraoptions & "mu"; + if (gflags[LEARNED_MANTRA_HONESTY]) + mantraoptions = mantraoptions & "ahm"; + if (gflags[LEARNED_MANTRA_VALOR]) + mantraoptions = mantraoptions & "ra"; + if (gflags[LEARNED_MANTRA_SACRIFICE]) + mantraoptions = mantraoptions & "cah"; + if (gflags[LEARNED_MANTRA_JUSTICE]) + mantraoptions = mantraoptions & "beh"; + if (gflags[LEARNED_MANTRA_HONOR]) + mantraoptions = mantraoptions & "summ"; + if (gflags[LEARNED_MANTRA_SPIRITUALITY]) + mantraoptions = mantraoptions & "om"; + if (gflags[LEARNED_MANTRA_HUMILITY]) + mantraoptions = mantraoptions & "lum"; + + + if (UI_get_item_flag(item, SI_ZOMBIE)) + add("mantra"); + + if (gflags[LEARNED_ABOUT_CAPT_JOHNE]) + add("Captain Johne"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name" (remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + say("He looks at you uneasily. @I'm Captain Elad. Not that it's any business of yours...@"); + UI_set_item_flag(item, SI_ZOMBIE); // met + } + else + say("@Well, I'm still Captain Elad.@"); // if already met + add(["captain"]); + + case "job": + say("@I was Captain of the Theodosia Marie--until she sank@"); + add(["sank"]); + + case "captain"(remove): + if ((isNearby(CAPTAIN_FOX)) || (isNearby(LEODON)) || (isNearby(HOMER)) || (isNearby(LEONNA))) + say("When you say 'Captain,' all the pirates at the table turn to you expectantly. When they realize you weren't talking to them, they go back to what they were doing."); + else + say("@Aye.@"); + + case "Captain Johne"(remove): + say("@Captain Johne, that fool... He was captured by gargoyles. I hear they dragged him down into Hythloth, and nobody's seen hide nor hair of him since.@"); + if (isNearby(LEONNA)) + { + LEONNA.say("Leonna raises an eyebrow. @Is that so? I could tell a different tale...@"); // if (npc_nearby(114)) + LEONNA.hide(); + } + + case "sank"(remove): + say("@Aye, 'twas a terrible ordeal. We were sailing just off Bordermarch when the whole island started shaking. Must have been one of those earthquakes we've been having.@"); + add(["island","Bordermarch", "earthquakes"]); + + case "island"(remove): + say("@The whole island sank beneath the waves. We were caught in the huge whirlpool left in its wake. I was one of the lucky few to swim clear. But my ship's on the bottom of the ocean now, and that's the honest truth.@"); + add(["whirlpool"]); + + case "whirlpool"(remove): + say("He shudders, then takes a sip of his tea. @I don't like to think about it.@"); + + case "Bordermarch"(remove): + say("@A fair sized island, and now she's gone! Some o' them earthquakes have been mighty fierce.@"); + + case "earthquakes"(remove): + say("@Yes, they started soon after Lord British was rescued from the underworld. I lost my ship to the last one.@"); + add(["Lord British", "rescued"]); + + case "Lord British"(remove): + say("@I'd toast him with you, but this,@ he gestures disparagingly at his cup, @is hardly fitting for such an honor.@"); + + case "rescued"(remove): + say("@Surely you've heard tales of the Avatar's bold exploits? It was all anyone was talking about roundhere for weeks.@"); + + case "rune"(remove): + say("@I wish I had one of them... I bet I could sell it for a pretty penny!@"); + + case "mantra"(remove): + say("@You don't hear much about the virtues in a pirate town...@"); + add(["virtues"]); + + case "virtues"(remove): + say("@I could use more virtue in me life. I've just given up drinking, to start with.@"); + add(["drinking"]); + + case "drinking"(remove): + say("@Aye, 'tis quite a temptation.@"); + add(["temptation"]); + + case "temptation"(remove): + say("@Indeed.@ He takes another big gulp of tea."); + + case "bye"(remove): + if (!UI_get_item_flag(item, NAKED)) + { + UI_set_item_flag(item, NAKED); + say("@Wait, before you go...I was wondering--do you know the mantra of Honesty?@"); + if (askYesNo()) + { + say("@I've been trying to find out what it is, so that I can better myself. I'll give you five gold if you tell me. Is it a deal?@"); + if (askYesNo()) + { + say("@Okay, what is it?@"); + + var mantra = chooseFromMenu(mantraoptions); + + if (mantra == "ahm") + { + + say("@Thank you! Now my meditations will succeed at last!@"); + giveExperience(10); + giveGold(5); + say("As you turn to leave, you think you might have caught a glimpse of Captain Elad stealing a swig from someone else's mug... But you can't be sure."); + sayGoodbyeAbrupt(item, "gulp"); + break; + + + } + else if (mantra == "make something up") + { + say("You decide to make up a random word. The pirate frowns."); + subtractKarma(10); + say("As you turn to leave, you think you might have caught a glimpse of Captain Elad stealing a swig from someone else's mug... But you can't be sure."); + sayGoodbyeAbrupt(item, "gulp"); + break; + } + else + { + say("You tell him the mantra is '" + mantra + "' The pirate frowns."); + subtractKarma(10); + say("As you turn to leave, you think you might have caught a glimpse of Captain Elad stealing a swig from someone else's mug... But you can't be sure."); + sayGoodbyeAbrupt(item, "gulp"); + break; + } + + + } + else + { + say("@I'll be here with the money if you change your mind.@"); + sayGoodbye2(item); + break; + } + } + else + { + say("@Oh. Well, let me know if you find out later.@"); + sayGoodbye2(item); + break; + } + } + else + { + say("The pirate smiles and waves goodbye, then scowls as he turns back to his mug of tea."); + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/CaptainFox.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/CaptainFox.uc new file mode 100755 index 0000000..2282da9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/CaptainFox.uc @@ -0,0 +1,180 @@ + +void CaptainFox object# (0x4e0) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == KID_GAMES) + { + var barks = ["@Eat mine fists!@", + "@Oof!@", + "@Take that!@", + "@I'll cut you!@", + "@Fight like a man, ya coward!@", + "@Thou dost hit like a girl!@"]; + var rand_barks = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand_barks]); + + } + } + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@A moment, milord..@"; + npc_1st_greet = "@Aye..@"; + + av_2nd_greet = "@Greetings..@"; + npc_2nd_greet = "@We meet again.@"; + + //brawling + if (UI_get_schedule_type(item) == KID_GAMES) + { + npc_2nd_greet = "@Quickly..@"; + npc_1st_greet = "@Quickly..@"; + } + + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (UI_get_schedule_type(item) == KID_GAMES) + { + item.say("@Can't talk now, " + polite_title + ".@ He pauses to punch another pirate in the belly. @Come back later when I've less on my mind!@"); + sayGoodbyeAbrupt(item, "Take that!"); + return; + } + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A handsome gentleman, immaculately dressed.*"); + } + else + item.say("@Hello, " + polite_title + ". Your company is welcome.@*"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //flag set when asked Zoltan about silver tablet + if (gflags[LEARNED_ABOUT_CAPT_JOHNE]) + add("Captain Johne"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm Captain Fox, of the Silken Stag.@"); + add(["Silken Stag", "captain"]); + + case "job"(remove): + say("@I sail the wide, wide sea, to the edges of the world and back again. Of course, I'm also known for the paintings I create in my spare time.@"); + add(["world", "paintings"]); + + case "captain"(remove): + if ((isNearby(CAPTAIN_ELAD)) || (isNearby(LEODON)) || (isNearby(HOMER)) || (isNearby(LEONNA))) + say("When you say 'Captain,' all the pirates at the table turn to you expectantly. When they realize you weren't talking to them, they go back to what they were doing."); + else + say("@Aye.@"); + + case "paintings"(remove): + say("@There are a few of them around here. Go see for yourself.@"); + + case "Silken Stag"(remove): + say("@We just stopped off here for some supplies and a drink or two.@"); + add(["drink"]); + + case "drink"(remove): + say("@Well, maybe three wouldn't hurt.@"); + + case "Captain Johne"(remove): + say("@Captain Johne, that lunatic? I hear he went underground seeking the gargoyles, but he fled from the first one he encountered. Nobody knows where he is now.@"); + if (isNearby(LEODON)) + { + LEODON.say("@Well, that's not what I heard.@ says Leodon."); + LEODON.hide(); + } + add(["underground", "gargoyles"]); + + case "underground"(remove): + say("@Under the earth is no place for a seafaring man to be.@"); + + case "gargoyles"(remove): + say("@Tough creatures. My crew and I steer well clear.@"); + + case "world"(remove): + say("@Don't go too far, matey--ye'll fall off!@ He laughs a hearty laugh and takes a swig of ale."); + + case "bye"(remove): + + avatar_goodbye = "@Farewell!@"; + npc_goodbye = "@Until we meet again.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Enrik.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Enrik.uc new file mode 100755 index 0000000..298d1f8 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Enrik.uc @@ -0,0 +1,229 @@ + +void Enrik object# (0x4e6) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + const int CLUB_SELL_PRICE = 10; + const int DAGGER_SELL_PRICE = 10; + const int MAIN_GAUCHE_SELL_PRICE = 25; + const int FLAMING_OIL_SELL_PRICE = 4; + const int THROWING_AXE_SELL_PRICE = 20; + const int CLOTH_ARMOR_SELL_PRICE = 20; + const int CLOTH_LEGGINGS_SELL_PRICE = 8; + const int LEATHER_ARMOR_SELL_PRICE = 40; + const int LEATHER_HELM_SELL_PRICE = 10; + const int LEATHER_LEGGINGS_SELL_PRICE = 30; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == BLACKSMITH) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + var price; + var item_choice; + var armor_options = ["nothing", "cloth armor", "cloth leggings", "leather armor", "leather helm", "leather leggings"]; + var armor_shapes = [SHAPE_CLOTH_ARMOR, SHAPE_CLOTH_LEGGINGS, SHAPE_LEATHER_ARMOR, SHAPE_LEATHER_HELM, SHAPE_LEATHER_LEGGINGS]; + var armor_prices = [CLOTH_ARMOR_SELL_PRICE, CLOTH_LEGGINGS_SELL_PRICE, LEATHER_ARMOR_SELL_PRICE, LEATHER_HELM_SELL_PRICE, LEATHER_LEGGINGS_SELL_PRICE]; + + // + var weapon_options =["nothing", "club", "dagger", "main gauche", "throwing axe", "flaming oil"]; + var weapon_shapes = [SHAPE_CLUB, SHAPE_DAGGER, SHAPE_MAIN_GAUCHE, SHAPE_THROWING_AXE, SHAPE_FLAMING_OIL]; + var weapon_prices = [CLUB_SELL_PRICE, DAGGER_SELL_PRICE, MAIN_GAUCHE_SELL_PRICE, THROWING_AXE_SELL_PRICE, FLAMING_OIL_SELL_PRICE]; + + var sell_rate = 3; //integer to divide by when selling items back to npc + var sell_options = ["nothing", "cloth armor", "cloth leggings", "leather armor", "leather helm", "leather leggings", "club", "dagger", "main gauche", "throwing axe", "flaming oil"]; + + //Dialog options + var initial_choice_question = "@Which of these?@"; //arms or armor? etc + var askIfInterested1 = "@That costs "; //needs to be split into array to capture price + var askIfInterested2 = " gold. Interested?@"; + var cant_afford = "@But you don't got enough gold, " + polite_title + "!@"; + var cant_hold = "@But 'twould make thee o'erburdened, " + polite_title + "!@"; + var saidNo = "@Changed your mind, eh?@"; + var nothing = "@He gives you a blank stare.@"; + var success = "@Good!@ After accepting your gold, Enrik hands over the "; + var success2; //"I hope this item works well for you!" etc if needed + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == KID_GAMES) + { + var barks = ["@Who threw that?!@", + "@Oof!@", + "@Take that!@", + "@I'll cut you!@", + "@Argh!@", + "@Watch it, ye bastard!@"]; + var rand_barks = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand_barks]); + + } + } + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me..@"; + av_2nd_greet = "@Hello again..@"; + + if (UI_get_schedule_type(item) == KID_GAMES) + { + npc_1st_greet = "@What?@"; + npc_2nd_greet = "@Not now, busy!@"; + } + else + { + npc_1st_greet = "@Yea?@"; + npc_2nd_greet = "@Yes?@"; + + } + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (UI_get_schedule_type(item) == KID_GAMES) + { + item.say("@Don't like talking when I'm fighting!@"); + sayGoodbyeAbrupt(item, "Hey watch it!"); + return; + } + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A scarred man with a gap-toothed grin and large, calloused hands.*"); + item.say("@Hello, hello.@"); + + } + else + item.say("@Right. You been here before.@ He studies you carefully."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name": + say("@Enrik. Enrik the Hammer's what I'm known as 'round here.@"); + add(["Hammer", "Enrik"]); + + case "job": + say("@And my mutter said I was thick. You can buy's arms from me or sell me yer used stuff.@"); + add(["buy", "sell"]); + + case "Hammer"(remove): + say("@They call me that 'cause I's got a good left.@"); + add(["left"]); + + case "Enrik"(remove): + say("@I prefers Hammer.@"); + add(["Hammer"]); + + case "left"(remove): + say("@Keep it up and I'll show ya,@ he growls."); + + + case "buy"(remove): + if (!shop_is_open) + say("@Come by my shop when I'm open!@"); + else + { + say("@Hey, what's it look like, I'm a mind reader? Do ya want arms or armor?@"); + add(["arms", "armor"]); + } + + case "sell"(remove): + if (!shop_is_open) + say("@Come by my shop when I'm open!@"); + else + { + say("@Aye, you might have somethin' interestin'...@"); + sellBackItems([armor_shapes, weapon_shapes], [sell_options], [armor_prices, weapon_prices], sell_rate); + } + + case "arms": + buyWeapons(item, weapon_options, weapon_prices, weapon_shapes, dialog); + + case "armor": + buyArmor(item, armor_options, armor_prices, armor_shapes, dialog); + + + case "bye"(remove): + avatar_goodbye = "@That is all..@"; + npc_goodbye = "@Yeah, gotta get back ta work.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Fentrissa.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Fentrissa.uc new file mode 100755 index 0000000..16534a4 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Fentrissa.uc @@ -0,0 +1,169 @@ + +void Fentrissa object# (0x4e4) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Ahoy there!@"; + npc_1st_greet = "@Welcome!@"; + + av_2nd_greet = "@Greetings..@"; + npc_2nd_greet = "@Welcome, friend.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A strong, sinewy woman with a hard look about her."); + item.say("@Smell that salt air, friend. Brings a tear to me eye...@"); + + } + else + item.say("@Welcome, welcome!@ She slaps you heartily on the back."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Fentrissa.@"); + add(["Fentrissa"]); + + case "job"(remove): + if (!gflags[FENTRISSA_SOLD_OUT]) + { + say("@I sell ships.@"); + add(["ship"]); + } + else + say("@I'm out of work after selling you all my ships and skiffs.@"); + + //say("@I have @ships for sale, but I sold you my last skiff. + //say("@I sold you my last @ship, but I still have some @skiffs left.@"); + + + case "Fentrissa"(remove): + say("@A strong name, as strong as the sea. She looks into the distance.@"); + add(["sea"]); + + case "sea"(remove): + say("@Beautiful thing, but a jealous man he is.@"); + add(["jealous"]); + + case "jealous"(remove): + say("@Many call her a female. If ya ask me, men are much more unpredictable.@"); + + + case "ship"(remove): + say("@It'll cost you 350 gold for the deed. Interested?@"); + if (askYesNo()) + { + if (hasGold(350)) + { + if (UI_add_party_items(1, SHAPE_SCROLL, 57, 0, true)) + { + chargeGold(350); + say("@Excellent!@ After accepting your gold, Fentrissa hands over the deed.@"); + say("@Sail her straight.@"); + gflags[FENTRISSA_SOLD_OUT] = true; + } + else + say("@You look pretty full to me.@"); + } + else + say("@You don't have enough gold pieces.@"); + } + else + say("@You'll ne'er find a better craft.@"); + + + case "bye": + say("@Have a good one.@ She bows, hands on her hips."); + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@Fair weather to ye!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Homer.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Homer.uc new file mode 100755 index 0000000..6bd6c3a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Homer.uc @@ -0,0 +1,289 @@ + +void Homer object# (0x4de) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var gender; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + gender = "sister"; + // title = "madame"; + } + else + { + gender = "brother"; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Might we speak?@"; + npc_1st_greet = "@..if we must.@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@What now?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (gflags[GAVE_HOMER_STORMCLOAK]) + { + item.say("@You served your purpose by bringing me the cloak... Now I have no further need of you. I have big plans now, and no time to waste talking.@"); + sayGoodbye2("@Begone!@"); + return; + } + + if (gflags[FIND_STORMCLOAK]) //on the quest to find the storm cloak + { + item.say("@Have you found the storm cloak yet?@"); + if (askYesNo()) + { + item.say("@Then hand it over and we're even.@ His eyes gleam with greedy anticipation. Do you give him the cloak?@"); + if (askYesNo()) + { + if (UI_count_objects(PARTY, SHAPE_STORM_CLOAK, QUALITY_ANY, FRAME_ANY) > 0) + { + item.say("He takes the cloak from you. @Thanks for keeping your word. There's not many that does, these days...@"); + giveExperience(100); + addKarma(10); + UI_remove_party_items(1, SHAPE_STORM_CLOAK, QUALITY_ANY, FRAME_ANY); + gflags[GAVE_HOMER_STORMCLOAK] = true; + sayGoodbyeAbrupt(item, "It's all mine!"); + return; + } + else say("You have no storm cloak to give him."); + sayGoodbyeAbrupt(item, "Lying dog!"); + return; + } + else + { + item.say("@Blast ye! If I still had two good legs, I'd keelhaul the lot of you!@*"); + item.say("@We had a deal! Besides, I helped steal that treasure myself, fair and square.@*"); + sayGoodbye2("Can't trust anybody these days.."); + subtractKarma(10); + return; + } + } + else + { + item.say("@Then get off your duff and go dig it up!@"); + sayGoodbye2("@Stop wasting time!@"); + return; + } + + } + + //Determine if you've found all 8 pieces of the map yet: + if (gflags[TALKEDTOHOMERABOUTMAP]) + { + item.say("@So, have ye found the eight pieces of the map yet?@"); + if (askYesNo()) + { + if ((UI_count_objects(PARTY, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP1) > 0) && (UI_count_objects(PARTY, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP2) > 0) && (UI_count_objects(PARTY, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP3) > 0) && (UI_count_objects(PARTY, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP4) > 0) && (UI_count_objects(PARTY, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP5) > 0) && (UI_count_objects(PARTY, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP6) > 0) && (UI_count_objects(PARTY, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP7) > 0) && (UI_count_objects(PARTY, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP8) > 0)) + { + item.say("@Very well. I've been thinking about how we could work out a deal.@*"); + item.say("@I know you want the silver tablet. Far as I'm concerned, you can have it.@*"); + item.say("@All I really want is the magical cloak that's buried with the rest of the treasure. So...@*"); + item.say("@I'll tell you where the ninth piece of the map is if you promise to bring me the cloak.@*"); + item.say("@The rest of the treasure should be loot enough to satisfy you. Is it a deal?@*"); + if (askYesNo()) + { + item.say("@Okay. The ninth piece of the map is hidden...Right here in my pocket!@ He grins wickedly. I had to keep it safe while you were off gathering the others, didn't I?@"); + item.say("He hands you the last piece of the map. The island in the upper left hand corner is Buccaneer's Den.@"); + UI_add_party_items(1, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP9, false); + item.say("@You'll keep your word and come right back here with the magic storm cloak, won't you?@"); + if (askYesNo()) + { + item.say("@Good. Then I'll tell you this: When you reach the island marked with the X, find the three stones and stand in the center.@*"); + item.say("@Then walk three paces due south, nine paces due west, and twelve more paces south. That should put you right next to an old dead tree.@*"); + item.say("@Dig in the patch of dirt just to the south of you, and you'll find the treasure!@*"); + sayGoodbye2("@Now go get it!@"); + + //sends you on a quest to find stormcloak + if (!gflags[FIND_STORMCLOAK]) + gflags[FIND_STORMCLOAK] = true; + return; + } + else + { + item.say("@Don't want to keep your word now that you have the map, eh? Well, then, I won't tell you where you need to dig to find the treasure!@"); + sayGoodbye2("@Blast ye!@"); + return; + } + } + else + { + item.say("@Suit yourself, mate, that's the only deal I'll offer.@"); + sayGoodbye2("@...fool.@"); + return; + } + + } + else + item.say("@Best count again. You need eight pieces before I'll bargain with you.@"); + } + else + item.say("@Then what are you wasting my time for?@"); + } + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A shifty-eyed character. He carries a cane and walks with a slight limp.*"); + UI_set_item_flag(item, MET); + } + item.say("He takes your measure, looking you over from head to toe. @What do you want?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[LEARNED_ABOUT_TABLET]) + add("silver tablet"); + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name" (remove): + say("@Who wants to know?@"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + if (avatar_or_name == "I am the Avatar") + say("@Fine, 'Avatar', if that's who you really are... You can call me Homer.@"); + else if (avatar_or_name == ("I am " + player_name)) + say("@Fine, '" + player_name + "' - if that's what your name really is... You can call me Homer.@"); + add(["Homer"]); + + case "job" (remove): + say("@I once sailed on the ship called 'Empire, under Captain Hawkins.@"); + add(["Empire", "Captain Hawkins"]); + + case "Homer"(remove): + say("@Well, get on with it!@"); + + case "Empire"(remove): + say("@It was wrecked on the cape, southwest of here. Not too far from Serpent's Hold.@"); + + case "Captain Hawkins"(remove): + say("His eyes light up with hatred. @That heartless bastard...He was killed by his own men, and it was no worse than he deserved.@*"); + say("He hesitates, then adds quickly, @Of course, I had nothing to do with it.@"); + + case "silver tablet"(remove): + if (UI_count_objects(PARTY, SHAPE_GUILD_BELT, QUALITY_ANY, FRAME_ANY) > 0) + { + say("@You're looking for the silver tablet? It's part of Captain Hawkins' buried treasure.@"); // if in guild + add(["treasure"]); + } + else + { + say("He regards you warily. @Who sent you? I see.@ He screws his face up into an even more suspicious expression than before. @Just why do you want to know about it, anyway?@"); // question + var question = chooseFromMenu(["None of thy business", "I need it"]); + if (question == "None of thy business") + say("@Uh-huh. You're not a member of the guild. I don't have to tell you anything.@"); + else if (question == "I need it") + say("@Uh-huh. You're not a member of the guild. I don't have to tell you anything.@"); + add(["guild"]); + } + + case "treasure"(remove): + if (UI_count_objects(PARTY, SHAPE_GUILD_BELT, QUALITY_ANY, FRAME_ANY) > 0) + { + say("@It was buried in a small cave.@"); + add(["cave"]); + } + else + say("@Don't know anything about it.@"); + + + case "cave"(remove): + if (UI_count_objects(PARTY, SHAPE_GUILD_BELT, QUALITY_ANY, FRAME_ANY) < 1) + { + say("@What are you talking about?@"); + } + else + { + if (!gflags[TALKEDTOHOMERABOUTMAP]) + gflags[TALKEDTOHOMERABOUTMAP] = true; + + say("@After Captain Hawkins passed away, we tore his treasure map into nine pieces. The plan was, when nobody was looking for us any more, we'd get together and go dig it up.@*"); + say("@Splitting up the map was my idea - that way nobody could doublecross the others. I figure after all these years the others must have given up, so its alright for me to search for the treasure by myself.@*"); + say("@Trouble is, I've got a bit of the gout in one leg, and I can't travel much any more. Maybe we can help each other out. I know where my piece of the map is hidden, and if you bring me the other eight pieces, perhaps we could make a deal.@*"); + say("@I'll tell you all I know about where the pieces might be... Ol' Hawknose set out for the Dry Land, to kill the daemon that is said to live there.@*"); + say("@Sandy, the ship's cook, went to Trinsic with the first mate.@*"); + say("@Old Ybarra said he was headed for the dungeon Shame, looking for more treasure. I think one of the men died in a shipwreck.@*"); + say("@Then there was one more... Can't remember his name, but I've heard tell he settled in Jhelom. He'll be easy to recognize - he has a hook in place o' one of his hands. That's all I know. Perhaps in your travels you can find out where the others have gone.@*"); + say("@When you find the pieces, you can lay them out on the ground to see how they fit together. But remember, only I know where the ninth piece is, so come back here when you've got the other eight.@"); // if in guild say + } + + case "guild"(remove): + say("@Go ask Budo. And you didn't hear that from me, understand?@"); + if (!gflags[LEARNED_ABOUT_GUILD]) + gflags[LEARNED_ABOUT_GUILD] = true; + + case "bye"(remove): + if (UI_count_objects(PARTY, SHAPE_GUILD_BELT, QUALITY_ANY, FRAME_ANY) > 0) + npc_goodbye = "@Farewell, " + gender + " thief.@"; + else + npc_goodbye = "@Can't say its been a pleasure.@"; + + avatar_goodbye = "@Must be going now..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Johann.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Johann.uc new file mode 100755 index 0000000..0f993b3 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Johann.uc @@ -0,0 +1,174 @@ + +void Johann object# (0x4e3) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + /* + if (event == PROXIMITY) + { + //barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@Insert line here..@", 0); + delayedBark(item, "@Insert line here@", 8); + delayedBark(item, "@Insert line here@", 16); + } + else if (barks == 2) + delayedBark(item, "@Other lines...@", 2); + else + delayedBark(item, "@Other lines...@", 3); + } + */ + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me, bard..@"; + npc_1st_greet = "@Hello..@"; + + av_2nd_greet = "@Greetings, Johann..@"; + npc_2nd_greet = "@Ah, hello again..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("An uneasy looking bard.*"); + } + item.say("@Oh, hello. Can I help you with something?@*"); + + + //standard conversation options + var options = ["name", "job", "bye"]; + + + if (!gflags[TALKEDTOHOMERABOUTMAP]) + add(["Hawkins", "Bonn", "Empire", "Ybarra"]); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@They call me 'Yodeling Johann'.@"); + add(["yodel"]); + + case "job": + say("@I sing songs for the pira - for the sailors here. But I'm looking for a chance to move to another town.@"); + add(["pirates", "sailors", "move", "song"]); + + case "sailors"(remove): + say("@They're fine, hearty fellows, one and all.@"); + + case "yodel"(remove): + say("@I'd better not... I've still got bruises from the last time I tried yodeling around here.@"); + + case "move"(remove): + say("@Not that there are pirates around here or anything...The salty air just doesn't agree with me.@"); + add(["pirates"]); + + case "pirates"(remove): + say("@Did I say pirates? I didn't say that.@ He looks around nervously.*"); + say("@Nobody but fine honest sailors around here.@ He lowers his voice. @By the way... If you should happen to run across Bonn, or Ybarra, or Hawkins, don't tell them I'm here.@"); + if (!gflags[TALKEDTOHOMERABOUTMAP]) + add(["Bonn", "Ybarra", "Hawkins"]); + + case "Bonn"(remove): + say("@Who's he? Never 'eard of 'im.@"); + + case "Ybarra"(remove): + say("@Who's he? Never 'eard of 'im.@"); + + case "Hawkins"(remove): + say("@Who's he? Never 'eard of 'im.@"); + + + case "Empire"(remove): + say("@He spits on the ground and then says, @What?@"); // not seen the reference to this?? + + case "song"(remove): + say("@Oh, a loon with a spoon, Sang a song of ballooning. And the man in the moon Said it was quite a tune.@*"); + say("@Now one fine day in June A young man went ballooning. Did he rise up to glory, Or fall to his doom?@*"); + say("@Just one thing will I say, Of the sport of ballooning: On the ground will I stay, While the ground still has room!@"); + add(["ballooning"]); + + case "ballooning"(remove): + say("@Oh, that's just some nonsense that gave me an idea for a song...I read about it in a book at the Lycaeum.@"); + add(["Lycaeum"]); + + case "Lycaeum"(remove): + say("@Ask the librarian there for help.@"); + + case "bye"(remove): + avatar_goodbye = "@Farewell..@"; + npc_goodbye = "@Good day.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Petroph.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Petroph.uc new file mode 100755 index 0000000..50bf030 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Petroph.uc @@ -0,0 +1,211 @@ + +void Petroph object# (0x4dc) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + const int PETROPH_INN_PRICE = 6; //per person + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + + + if (UI_get_item_flag(item, SI_ZOMBIE)) //Petroph mad + { + npc_1st_greet = "@What you want?@"; + npc_2nd_greet = "@What you want?@"; + } + else + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings..@"; + npc_1st_greet = "@Heylo to you.@"; + + av_2nd_greet = "@Might we speak?@"; + npc_2nd_greet = "@Heylo again.@"; + } + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + //checking out of the Inn + if (UI_get_item_flag(item, PETRA)) + { + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + var has_key = UI_find_object(PARTY, SHAPE_KEY, QUALITY_PETROPH_INN, FRAME_ANY); + item.say("@Are you ready to check out?@"); + if(askYesNo()) + { + if (has_key) + { + if (hour < 12) + { + say("He serves you breakfast. @Good morning to you.@"); + UI_add_party_items(partynum, SHAPE_FOOD, QUALITY_ANY, FRAME_EGG); + + } + + sayGoodbye2(item); + UI_remove_party_items(1, SHAPE_KEY, QUALITY_PETROPH_INN, FRAME_ANY); + UI_clear_item_flag(item, PETRA); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + return; + } + else + { + say("@Where is key? You go find it.@"); + sayGoodbye2(item); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + // UI_move_object(PARTY, [1713, 0274], true); + return; + } + + } + else + { + say("@Don't forget checkout time, da?@"); + // UI_move_object(PARTY, [1713, 0274], true); + sayGoodbye2(item); + return; + } + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + } + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A giant of a man with a solemn stare.*"); + item.say("@Heylo to you.@*"); + + } + else + //insulted him already + if (UI_get_item_flag(item, SI_ZOMBIE)) + item.say("@What you back for? I thought you not like my inn.@"); + else + item.say("@Heylo again.@"); + + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Petroph@"); + add(["Petroph"]); + + case "job"(remove): + say("@I am keeping the inn, here at King's Ransom.@"); + add(["inn"]); + + case "Petroph"(remove): + say("@Da, Petroph.@"); + + case "inn"(remove): + say("@" + PETROPH_INN_PRICE + " gold per person for you to stay and have meal, good?@"); + if (askYesNo()) + { + if (hasGold(PETROPH_INN_PRICE * partynum)) + { + if (UI_add_party_items(1, SHAPE_KEY, QUALITY_PETROPH_INN, 0, true)) + { + chargeGold(PETROPH_INN_PRICE * partynum); + say("He hands you the key. @Last door on your right, enjoy ya?@"); + if (UI_get_item_flag(item, SI_ZOMBIE)) + UI_clear_item_flag(item, SI_ZOMBIE); // no longer mad + sayGoodbyeAbrupt(item, "Have a nice day."); + break; + } + else + say("@You can't hold key.@"); + } + else + say("@Must pay in advance for rooms. Sorry, is policy.@"); + } + else + { + say("@What, maybe you don't like my inn? Well, maybe I don't like you either!@"); // if answered no to sayt in inn + UI_set_item_flag(item, SI_ZOMBIE); //pissed him off + + } + + case "bye"(remove): + if (UI_get_item_flag(item, SI_ZOMBIE)) //Petroph mad + { + npc_goodbye = "@Da, goodbye and good riddance!@"; // if answered no to stay in inn else + + } + else + npc_goodbye = "@Have a nice day.@"; + + avatar_goodbye = "@Must be going now..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Shawn.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Shawn.uc new file mode 100755 index 0000000..0e80393 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/BuccaneersDen/Shawn.uc @@ -0,0 +1,156 @@ + +void Shawn object# (0x4e1) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int FRAME_BEER = 14; + + const int MEAD_SELL_PRICE = 5; + const int ALE_SELL_PRICE = 3; + const int WINE_SELL_PRICE = 4; + const int RATIONS_SELL_PRICE = 2; + const int HAM_SELL_PRICE = 5; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //shopkeeper stuff + //ham, ale, mead, wine, and rations + var price; + var item_choice; + var food_drink_options = ["nothing", "ham", "ale", "mead", "wine", "rations"]; + var item_shapes = [SHAPE_FOOD, SHAPE_BOTTLE, SHAPE_BOTTLE, SHAPE_BOTTLE, "SHAPE_FOOD"]; + var item_prices; + + var prices = [HAM_SELL_PRICE, ALE_SELL_PRICE, MEAD_SELL_PRICE, WINE_SELL_PRICE, RATIONS_SELL_PRICE]; + + var food_drink_frames = [FRAME_HAM, FRAME_BEER, FRAME_MEAD, FRAME_WINE, FRAME_RATIONS]; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + //Dialog options + var initial_choice_question = "@Which- ham, ale, mead, wine, or rations?@"; //arms or armor? etc + var ask_quantity = "@How many do you want?@"; + var askIfInterested1 = "@It'll cost you "; //needs to be split into array to capture price + var askIfInterested2 = " gold for each.@"; + var cant_afford = "@You don't have enough gold.@"; + var cant_hold = "@You can't carry it.@"; + var saidNo = "@Very well. What'll it be then?@"; + var nothing = "@Anything else?@"; + var success = "@Fine!@ After accepting your gold, he hands over the "; + var success2 = "@I appreciate thy business.@"; + var has_quantity = true; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Ho, Barkeep!@"; + npc_1st_greet = "@Be right there!@"; + + av_2nd_greet = "@Barkeep..@"; + npc_2nd_greet = "@Welcome!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A charismatic man with an engaging smile.*"); + item.say("@Welcome.@ He makes a sweeping gesture with his hat.@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Welcome back, stranger.@ He winks at you."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name" (remove): + say("@Shawn, friend.@"); + + case "job" (remove): + say("@I sell ham, ale, mead, wine, and rations.@"); + add(["buy"]); + + case "buy": + if (shop_is_open) + sellFood(SHAWN, food_drink_options, prices, food_drink_frames, dialog); + + else + say("@Come back tomorrow when we're open.@"); + + + case "bye": + say("@I'm glad you stopped by.@ He gives you a firm handshake."); + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@Come again soon!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Chuckles.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Chuckles.uc new file mode 100755 index 0000000..5740fc7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Chuckles.uc @@ -0,0 +1,537 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + +void Chuckles object# (0x437) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var avatar_goodbye; + var npc_goodbye; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + //barks for proximity and dance schedule + if (event == PROXIMITY && current_schedule == DANCE) + { + var barks = UI_get_random(3); + if (gflags[TATTLED_ON_CHUCKLES]) //angry barks! + { + if (barks == 1) + delayedBark(item, "@Go away!@", 1); + else if (barks == 2) + delayedBark(item, "@Tattle-tale!@", 1); + else if (barks == 3) + delayedBark(item, "@Thou art not welcome here, Avatar!@", 1); + else + delayedBark(item, "@Thou art mongbat dung!@", 1); + } + else + { + if (barks == 1) + delayedBark(item, "@Avatar, I have a clue!@", 1); + else if (barks == 2) + delayedBark(item, "@Ho eyo he hum!@", 1); + else if (barks == 3) + delayedBark(item, "@Woulds thou like to hear a joke?@", 1); + else + delayedBark(item, "@Ho ho, hee hee@", 1); + + } + + } + + if (event == SCRIPTED) + { + if (gflags[CHUCKLES_KILLED]) + { + UI_remove_party_items(5, SHAPE_RUSTY_CUTLASS, QUALITY_ANY, FRAME_ANY); + UI_play_sound_effect(37); //breaking + + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + DRUDGEWORTH.say("@I knew ye had it in ye, Avatar! Now, take his wretched remains to be cremated, lest his spirit be reunited with his body.@"); + DRUDGEWORTH.say("@When I am guaranteed eternal torment of Chuckles' soul, then I shall reward ye handsomely! Bring his ashes back to my hut and I will bequeath thee a great treasure..@"); + DRUDGEWORTH.say("@Now, make haste!@"); + DRUDGEWORTH.hide(); + + UI_item_say(AVATAR, "The cutlass disentegrated.."); + var mirror = UI_find_object(FIND_ON_SCREEN, SHAPE_MIRROR, QUALITY_ANY, FRAME_ANY); + var ghost = UI_find_object(FIND_ON_SCREEN, SHAPE_GHOST, QUALITY_ANY, FRAME_ANY); + + + + script mirror after 3 ticks + { + frame 2; + wait 1; + sfx 37; + + } + + UI_sprite_effect(ghost, 7, 0, 0, 0, 0, 0, -1); + UI_remove_item(ghost); + + } + else + { + + + //get avatar's position + var avatarpos = UI_get_object_position(AVATAR); + + //dont move + UI_set_item_flag(AVATAR, BG_DONT_MOVE); + + //find ghost pixel + var ghost = UI_find_object(FIND_ON_SCREEN, SHAPE_GHOST, QUALITY_ANY, 7); //find frame 7 + + + //check if Drudgeworth's sword is in hand + if (!UI_is_readied(AVATAR, BG_WEAPON_HAND, SHAPE_RUSTY_CUTLASS, FRAME_ANY)) + { + //search party for sword in party + var cutlass = UI_find_object(PARTY, SHAPE_RUSTY_CUTLASS, QUALITY_ANY, FRAME_ANY); + + //cutlass found in party, move to Avatar + if (cutlass) + { + var carrying = UI_get_readied(AVATAR, BG_WEAPON_HAND, SHAPE_ANY, FRAME_ANY); + + //if avatar is carrying an item, drop it at feet + if (carrying) + UI_move_object(carrying, [avatarpos], true); + + //remove old cutlass, repopulate + UI_remove_item(cutlass); + + + + } + + //if cutlass is on screen, delete. + var cutlass_on_screen = UI_find_object(FIND_ON_SCREEN, SHAPE_RUSTY_CUTLASS, QUALITY_ANY, FRAME_ANY); + if (cutlass_on_screen) + UI_remove_item(cutlass_on_screen); + + //repopulate cutlass + UI_add_cont_items(AVATAR, 1, SHAPE_RUSTY_CUTLASS, QUALITY_ANY, FRAME_ANY, true); + } + + //Drudgeworth's sword + var sword = UI_get_readied(AVATAR, BG_WEAPON_HAND); + + + CHUCKLES.say("@I am here as thou has requested, in front of the mirror. For a second, looking into it I could have sworn I saw...nevermind...couldn't be...@"); + CHUCKLES.say("@So what would you have me do? Avatar, I beg thee... I'll do anything... just please keep mine secret!@"); + AVATAR.say("You clutch Drudgeworth's cutlass and it's almost as if all of his rage overtakes you, clouding your own thoughts as you approach Chuckles."); + AVATAR.say("@Drudgeworth sends his regards...@, you calmly speak as you plunge the cutlass into Chuckles' belly. His eyes are sheer terror as he coughs up blood and collapses before you."); + subtractKarma(25); + CHUCKLES.hide(); + AVATAR.hide(); + + + + + script AVATAR after 5 ticks + { + face north; + actor frame SWING_1; + wait 2; + actor frame SWING_2; + wait 2; + actor frame SWING_3; + wait 20; + call (Chuckles); + + + + }; + + script CHUCKLES after 9 ticks + { + say "NOOOOOO!"; + wait 5; + hit 25, NORMAL_DAMAGE; + wait 2; + sfx 37; + + + }; + + script sword after 10 ticks + { + wait 10; + sfx 37; + remove; + + } + + script ghost after 11 ticks + { + frame 19; + wait 1; + frame 20; + wait 1; + frame 21; + wait 1; + frame 22; + wait 1; + sfx 65; + + } + + + gflags[CHUCKLES_KILLED] = true; + + return; + } + UI_error_message("Chuckles script called, shouldn't be?"); + return; + } + + if (event == DOUBLECLICK) + { + if (gflags[TATTLED_ON_CHUCKLES]) + { + item.say("@I don't want to talk to thee anymore, tattle-tale! Go away!@"); + sayGoodbyeAbrupt(item, "Go away!"); + return; + + + } + + + + + if (gflags[CHUCKLES_WAITS] && UI_get_item_flag(CHUCKLES, SI_ZOMBIE) && UI_get_schedule_type(CHUCKLES, WAIT)) + { + //Chuckles should be by mirror + UI_path_run_usecode([1200, 1254, 0], Chuckles, CHUCKLES, SCRIPTED, false); //should move Avatar to spot + + return; + } + + + // if (gflags[CHUCKLES_WAITS] && + //Avatar and NPC greeting barks + var av_1st_greet = "@Um... hello Chuckles.."; + var npc_1st_greet = "@Ho eyo he hum! Care for a joke?@"; + + var av_2nd_greet = "@Chuckles...@"; + var npc_2nd_greet = "@Avatar, thou hast returned for mine jokes!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + item.say("A carefree fellow in a ludicrous costume."); + item.say("@Ho eyo he hum, I've got a clue! It's important, and just for you!@"); + + //standard conversation options + var options = ["name", "job", "bye", "clue"]; + + + //Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[READ_LEAFLET]) + add("Drudgeworth"); + + if (gflags[HELP_DRUDGEWORTH]) //opens up Lucy convo when you agree to help Drudgeworth + add("Lucy"); + + if (UI_count_objects(PARTY, SHAPE_SCROLL, QUALITY_LEAFLET, FRAME_ANY) > 0) + add("leaflet"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Why, I'm Chuckles the jester, of course! You've heard of me haven't you? Sure you have!@"); + add(["heard"]); + + case "heard"(remove): + say("@You've heard a word? Why that's absurd!@"); + add(["absurd"]); + + case "job" (remove): + say("@To jape, to jeer, to prance, to frolic! To keep this place unmelancholic!@"); + say("@I practice tomfoolery for Lord British - or anyone else who passes too close.@"); + add(["jape", "tomfoolery", "Lord British"]); + + case "jape" (remove): + say("@And jeer!@"); + add(["jeer"]); + + case "jeer" (remove): + say("@And prance! To dance a Corybantic dance!@"); + add(["prance"]); + + case "prance" (remove): + say("@Jeer and prance! Prance and frolic!@"); + add(["frolic"]); + + case "frolic" (remove): + say("@I lurch 'round like an alcoholic!@"); + + case "tomfoolery" (remove): + say("@'Cause Dick and Harry both called in sick.@"); + + case "Lord British" (remove): + say("@Call him Mr. Nose... But don't tell him I said so!@"); + add(["Mr. Nose"]); + + case "Mr. Nose" (remove): + say("@Shhh! Don't let him know I told you!@"); + gflags[MR_NOSE] = true; + + case "clue" (remove): + say("@Yes, it's crucial to your quest. Do you want to know what it is?@"); + if(askYesNo()) + { + say("@Perhaps I don't want to tell you!@"); + UI_run_schedule(item); + UI_clear_item_flag(item, READ); + sayGoodbye2(item); + break; + } + else + { + say("@Perhaps I'll tell you anyway! Do you think I will?@"); + if(askYesNo()) + { + say("@How foolish of you to think so!@"); + } + else + { + say("@Congratulations! You're exactly right! I won't tell you the clue.....But I will give you this hint that may lead you to it...~Search the chest in Nystul's room."); + add(["quest", "hint", "Nystul"]); + } + } + case "hint" (remove): + say("@If hints were mints and mints were hints, think what a world it would be!@"); + + case "quest"(remove): + say("@A quest, a chest, oh what a jest!@"); + add(["jest"]); + + case "jest"(remove): + say("@Have you heard the one about the nun, the dragon, and the drunken penguin?@"); + if(askYesNo()) + { + say("@Good! Maybe you can teach it to me someday!"); + add(["teach"]); + } + else + say("@That's too bad... Neither have I!@"); + + case "teach" (remove): + say("@To teach, to preach, what waste of speech!@"); + add(["speech"]); + + case "speech" (remove): + say("@I just said that!@"); + add(["that"]); + + case "that" (remove): + say("@You just said 'that!'@"); + add(["that"]); + + case "Nystul" (remove): + say("@Oh, he's no fun.@"); + add(["fun"]); + + case "fun" (remove): + say("@I'll show you fun before I'm done!@"); + add(["done"]); + + case "done" (remove): + say("@I just said that!@"); + add(["that"]); + + case "absurd" (remove): + say("@I just said that!@"); + add(["that"]); + + + //Drudgeworth quest lines + + case "Drudgeworth" (remove): + say("@Who?@"); + + case "leaflet" (remove): + say("You show Chuckles the leaflet from the remnants of the Royal Prison. He reads it and his facial expression changes to a concerned one. Before you can take it back, he shreds it into tiny pieces and shoves them in his mouth."); + say("He swallows the pieces and his demeanor changes to a mischevious one once more. @Didst thou enjoy the vanishing act?@"); + UI_remove_party_items(1, SHAPE_SCROLL, QUALITY_LEAFLET, FRAME_ANY); + add(["about that leaflet.."]); + + case "about that leaflet.."(remove): + say("@What leaflet?@"); + + case "Lucy"(remove): + say("Chuckle's carefree demeanor changes to one of concern when you ask him of 'Lucy'."); + say("@Wh.. what about her?@"); + say("You tell Chuckles that you know what happened to Lucy, and his association with Drudgeworth."); + say("Chuckles falls to his knees, putting his face in his hands. @I confess, Avatar! She was my only confidant during such troubling times...I don't know what happened to her.. she was fine one minute and then...@"); + say("Chuckles chokes up for a moment. @I didn't mean to kill her, Avatar, honest! I don't know what happened. I couldn't let this secret get out.@"); + say("@Drudgeworth offered to help me hide her body until I figured out a way to bring her to a healer. He meant to blackmail me!@"); + say("@I admit, I tried to cover it all up. Our liege still doesn't know, and I wouldst like to keep it that way. I am ashamed of my behavior..@"); + say("@Whilst thou keep mine secret?@"); + if (askYesNo()) + { + say("@Oh, I thank thee, Avatar! Perhaps as a reward I could tell thee some more jokes!@"); + if (isNearby(DUPRE)) + { + DUPRE.say("@Thy gratitude will suffice I'm sure...@"); + DUPRE.say("He whispers to you. @I'd rather face Blackthorn's torture chamber than have to listen to more of Chuckles' jokes!@"); + } + if (isNearby(SHAMINO)) + { + SHAMINO.say("@Frankly, if telling him yes gets him out of our hair, that's good enough for me.@"); + SHAMINO.hide(); + + } + //say("@No? Thy loss. Anyway, I thank thee for keeping my secret. + gflags[CHUCKLES_SECRET] = true; //agree to keep his secret, but can tattle on him to LB + addKarma(10); //can somewhnat be redeemed. + sayGoodbye2(item); + break; + + } + else + { + say("Chuckles throws himself at your feet. I beseech thee, what shall I do to convince you to not ruin mine life!?@"); + AVATAR.say("@Be waiting at the Blue Boar tavern after midnight by the mirror and we shall discuss the details...@"); + AVATAR.hide(); + say("@Tis a strange request but I'll be there, I promise thee!@ Chuckles walks off nervously."); + if (isNearby(IOLO)) + { + IOLO.say("@Avatar, thou surely couldn't be considering that spirit's offer??@"); + IOLO.hide(); + + } + if (isNearby(SHAMINO)) + { + SHAMINO.say("@I question your methods on this but I hope thou hast some sort of lesson in mind and not going along with Drudgeworth's plot..@"); + SHAMINO.say("@It truly wouldn't be virtuous.@"); + SHAMINO.hide(); + } + if (isNearby(DUPRE)) + { + DUPRE.say("@While running Chuckles through is something many of us have entertained the thought of because of his terrible jokes, you can't be serious.@"); + DUPRE.say("@Thou shouldst never trust the word of a pirate, an undead one at that!@"); + DUPRE.hide(); + + } + gflags[CHUCKLES_WAITS] = true; //flag to move Chuckles to the mirror at 3am + sayGoodbyeAbrupt(item, "What am I to do?"); + break; + } + case "bye": + say("@I did my best, did I amuse you? If not, I hope I did confuse you.@"); + say("@Did you enjoy my jokes?@"); + if(askYesNo()) + { + say("@You did? Then I'll tell you another one!@"); + var count = 1; + while (count >= 1) + { + say("@Riddle me this: Do you know what the goose said to the avatar?@"); + if (askYesNo()) + { + say("@No, no, no, that's not how it works! You're supposed to say you don't, so I can tell you! Let's try it again@"); + } + else + { + say("@It said 'ankh ankh!'@"); + count = 0; + } + } + say("@What did you think of that one?@"); + AVATAR.say("@...@"); + AVATAR.hide(); + say("@Well, who asked you, anyway?@"); + say("@Oh, that's right, I did!@~"); + say("@Hee hee, ho ho, to spread good cheer I go! Come talk to me again and I'll give you another show!@"); + avatar_goodbye = "@I must be going now..@"; + npc_goodbye = "@Come back for some more great jokes!@"; + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + else + { + say("@Really? I'll just have to try harder, then!@"); + say("@Why is Dupre like a horseshoe?@"); + say("@It's because they both have the letter 'r' in them!@"); + say("@What did you think of that one?@"); + AVATAR.say("@Er..Well..@"); + AVATAR.hide(); + if (isNearby(DUPRE)) + { + DUPRE.say("@I think we should run you through for that terrible joke!@"); + DUPRE.hide(); + } + say("@Well, who asked you, anyway?@"); + say("@Oh, that's right, I did!@~"); + say("@Hee hee, ho ho, to spread good cheer I go! Come talk to me again and I'll give you another show!@"); + + if (inParty(DUPRE)) + delayedBark(DUPRE, "Can we run him through yet, Avatar?", 2); + + avatar_goodbye = "@I must be going now..@"; + npc_goodbye = "@Come back for some more great jokes!@"; + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Geoffrey.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Geoffrey.uc new file mode 100755 index 0000000..bed03da --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Geoffrey.uc @@ -0,0 +1,373 @@ + + +void Geoffrey object# (0x423) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@A moment, friend.@"; + var npc_1st_greet = "@Tis good to see thee, Avatar..@"; + + var av_2nd_greet = "@Geoffrey..@"; + var npc_2nd_greet = "@How may I be of assistance?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + UI_run_schedule(item);// to prvent circular conversation + if (!UI_get_item_flag(LORD_BRITISH, MET)) + { + item.say("You see a tall, handsome man."); + item.say("@Thou hadst best speak to Lord British before aught else.@"); + UI_clear_item_flag(item, MET); + UI_clear_item_flag(item, READ); + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Speak to our liege first.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + return; + } + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a tall, handsome man."); + item.say("@I'm glad to see thee, " + player_name + ". Perhaps thou canst prevail where others could not. I sent a party of ten to recapture the Shrine of Compassion from the gargoyles. Alas, they failed dismally.@"); + item.say("@The survivors are recuperating in the town of Cove. Thou wouldst do well to speak with them first. Mayhap they learned something which might aid thee.@"); + item.say("@I must confess I fear the worst. The gargoyles are such powerful foes, and they are spreading so fast...@"); + item.say("@Perhaps the end of the realm is nigh. Good luck, and my prayers go with thee.@"); + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Good luck, Avatar.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + + return; + } + else + { + + // if (!UI_get_item_flag(GERTAN, MET)) + // { + item.say("@Best not waste time talking...@"); + item.say("@Who knows what acts of villainy the gargoyles are comitting even as we speak? I hope you've had a chance to visit Cove and speak with Gertan.@"); + UI_run_schedule(item); + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Speak with Gertan..@"; + sayGoodbye(item, npc_goodbye, avatar_goodbye); + return; + // } + // else + // item.say("@Good " + time_of_day + " , Avatar. How may I be of assistance?@"); + + } + + //standard conversation options + var options = ["name", "job", "bye", "Gertan"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + // + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + + add(["blank"]); + + case "job"(remove): + say("@blank.@"); + say("@blank.@"); + say("@blank.@"); + say("@blank.@"); + add(["blank", "blank"]); + + case "Gertan"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + case "bye": + say("@Goodbye text if you want, otherwise delete for SI style goodbye barks@"); + + var avatar_goodbye = "@Replace with Avatar's goodbye bark@"; + var npc_goodbye = "@Replace with npc's goodbye bark@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/LordBritish.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/LordBritish.uc new file mode 100755 index 0000000..eca0075 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/LordBritish.uc @@ -0,0 +1,324 @@ + +void LordBritish object# (0x494) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var rand; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var asked_about_oz = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@My liege..@"; + npc_1st_greet = "@Avatar, thou art here!@"; + + av_2nd_greet = "@My liege..@"; + npc_2nd_greet = "@Yes, Avatar?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + //clear intro flag + gflags[INTRO] = false; + + item.say("The noble ruler of Britannia.*"); + item.say("@" + player_name + "! 'Tis good to see thee again. Much hath happened since thou last departed our realm.@"); + + if (UI_count_objects(PARTY, SHAPE_KEY, QUALITY_LBKEY, FRAME_LBKEY) < 1) //Checks if you have the castle key yet. + { + item.say("@Take this key. It will unlock the gatehouse by the southern entrance to the castle. Then you can use the lever inside to raise the portcullis, and the crank will lower the drawbridge.@*"); + item.say("@The same key will also let you into the sewers under the castle. Now let me tell thee what hath transpired since thy last visit.@*"); + UI_add_party_items(1, SHAPE_KEY, QUALITY_LBKEY, FRAME_LBKEY, true); + } + item.say("@The vast underworld from which thou didst rescue me hath collapsed. Yet still there are forces of evil abroad in the land.@*"); + item.say("@Britannia is under attack by gargoyles such as those thou just fought. They have been coming up through the dungeons.@*"); + item.say("@Thus far they have mainly been attacking the shrines of the eight virtues.@*"); + item.say("@When the Shrine of Compassion didst fall, Sir Geoffrey sent a party to free it. Do thou ask him of this mission. Perhaps thou canst prove of some assistance.@"); + item.say("@Whilst thou art here, I have a room in the castle set aside for thy personal use. 'Tis in the west wing of the castle, just south of mine own chambers. I have had my servants place some equipment there, in case thou shouldst have need of it.@**"); + item.say("@Of course, thou mayst feel free to borrow anything in my castle, if thou shouldst need it.@"); + item.say("@Lastly, any time thou dost need healing, do thou but ask me. If thou doth wish me to repeat all this later thou need but ask.@"); + add(["Geoffrey", "shrines", "virtues", "Shrine of Compassion"]); + + } + else + { + item.say("The noble ruler of Britannia.*"); + item.say("@Good " + time_of_day + ", " + player_name + ". What wouldst thou speak of?@"); + + } + + + //standard conversation options + var options = ["name", "job", "bye", "repeat", "heal"]; + + //when Nystul asks about Orb + if (gflags[ASKED_NYSTUL_ABOUT_ORB]) + add("orb"); + + if (isNearby(SHERRY) || UI_get_item_flag(SHERRY, MET)) + add("Sherry"); + + if (gflags[MR_NOSE]) + add("Mr. Nose"); + + //killed Chuckles in front of Drudgeworth, cremated him + if (gflags[CHUCKLES_CREMATED]) + add("Chuckles"); + + //can tattle on Chuckles + if (gflags[CHUCKLES_SECRET] && !gflags[TATTLED_ON_CHUCKLES]) + add("tell Chuckles' secret"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Lord British, as thou knowest well.@"); + + case "job"(remove): + say("@Thanks to thee, I sit once more upon the throne of Britannia.@*"); + say("@Though 'tis a heavy burden in such troubled times as these.@"); + add(["troubled times"]); + + case "heal"(remove): + say("Lord British waves his hand, and your whole party is healed!"); + var targets = getFriendlyTargetList(item, 25); + for (npc in targets) + { + npc->clear_item_flag(PARALYZED); + npc->clear_item_flag(POISONED); + var str = npc->get_npc_prop(STRENGTH); + var hps = npc->get_npc_prop(HEALTH); + npc->set_npc_prop(HEALTH, (str - hps)); + UI_play_sound_effect(64); + } + add(["thanks"]); + + case "repeat"(remove): + say("@The vast underworld from which thou didst rescue me hath collapsed. Yet still there are forces of evil abroad in the land.@*"); + say("@Britannia is under attack by gargoyles such as those thou just fought. They have been coming up through the dungeons.@*"); + say("@Thus far they have mainly been attacking the shrines of the eight virtues.@*"); + say("@When the Shrine of Compassion didst fall, Sir Geoffrey sent a party to free it. Do thou ask him of this mission. Perhaps thou canst prove of some assistance.@"); + say("@Whilst thou art here, I have a room in the castle set aside for thy personal use. 'Tis in the west wing of the castle, just south of mine own chambers. I have had my servants place some equipment there, in case thou shouldst have need of it.@**"); + say("@Of course, thou mayst feel free to borrow anything in my castle, if thou shouldst need it.@"); + say("@Lastly, any time thou dost need healing, do thou but ask me. If thou doth wish me to repeat all this later thou need but ask.@"); + add(["Geoffrey", "shrines", "virtues", "Shrine of Compassion"]); + + case "troubled times"(remove): + say("@The gargoyles art indeed the greatest threat our realm has ever known.@*"); + say("@We are fortunate indeed that fate hath brought thee here in our hour of need.@"); + add(["gargoyles"]); + + case "gargoyles"(remove): + say("@Perhaps thou canst drive these vile creatures back into the bowels of the earth from whence they came.@*"); + say("@All our efforts thus far have availed us naught.@"); + + case "shrines"(remove): + say("@By now the gargoyles may have captured them all.@*"); + say("@Thou must hurry if thou wouldst foil their evil schemes...@"); + add(["runes"]); + + case "virtues"(remove): + say("@Stay strong in thy commitment to the eight virtues.@*"); + say("@It is our belief in them that sets us apart from the cruel invaders who would destroy all that we hold dear.@"); + + case "Geoffrey"(remove): + say("@He is the Captain of the Guard.@"); + + case "orb"(remove): + say("You show Lord British the black stone.*"); + say("@Hmmmm... I have such a stone, as thou may recall. I did not know that there were more such orbs.@*"); + say("@'Twill serve thee well in thy travels if thou dost learn to master its powers.@*"); + say("@To open a gate, use the stone, and carefully position it a few feet from thee.@"); + say("@Thou wilt discover that the placement is the key. In the proper positions, the stone canst conjure gates to take thee to numerous destinations.@"); + if (!gflags[ASKED_LB_ABOUT_ORB]) //Can use orb now + gflags[ASKED_LB_ABOUT_ORB] = true; + + + case "runes"(remove): + say("@Ask the leaders of each town to tell thee of that.@"); + + case "Shrine of Compassion"(remove): + say("@Do thou ask Tholden.@"); + add(["Tholden"]); + + case "Tholden"(remove): + say("@He is my chancellor.@"); + add(["chancellor"]); + + case "chancellor"(remove): + say("@Aye, Tholden is my chancellor.@"); + + case "Sherry"(remove): + if (inParty(SHERRY)) + { + say("@Please take good care of my little friend.@"); + } + else + { + say("@Ah, thou hast heard of my little friend? Her name is Sherry, and I'm quite proud of her.@*"); + say("@I'm certain she is the only talking mouse in all of Britannia. Thou art welcome to see her, if thou dost wish. Thou canst find her wandering throughout the castle.@*"); + say("@She comes by my room every night, so I can tell her stories.@"); + add(["stories", "book"]); + } + + + case "book"(remove): + say("@I collect rare books. There's one in particular I've been hunting for many years.@*"); + say("@It's called 'The Wizard of Oz.' Ever heard of it?@"); + if(askYesNo()) + { + say("@I hath promised a great reward to whosoever shalt bring me a copy. If thou dost run across it in thy travels, I would greatly appreciate if thou couldst bring it here.@"); + } + else say("@Well, I hath promised a great reward to whosoever shalt bring me a copy.@"); + add(["Wizard of Oz"]); + + case "Wizard of Oz"(remove): + if (UI_count_objects(PARTY, SHAPE_BOOK, QUALITY_OZ, FRAME_ANY) >= 1 && !gflags[FOUND_OZ_BOOK]) + { + if (UI_add_party_items(10, SHAPE_GEMS, QUALITY_ANY, 0, true)) + { + UI_remove_party_items(10, SHAPE_GEMS, QUALITY_ANY, 0, true); + say("@Thou hath found a copy!@*"); + say("@Long hath I anticipated this moment...@*"); + say("@Not since my childhood have I read this wondrous story.@"); + say("Gingerly, he takes the tome. @Here is your reward.@ He gives you some glowing gems."); + UI_remove_party_items(1, SHAPE_BOOK, QUALITY_OZ, FRAME_ANY, true); + gflags[FOUND_OZ_BOOK] = true; + var count = 0; + + + while (count < 10) + { + rand = UI_get_random(11); + UI_add_party_items(1, SHAPE_GEMS, QUALITY_ANY, rand); + count += 1; + + } + giveExperience(100); + } + else say("@Thou art carrying too much for me to reward thee properly...Bring the book back later, when thou art less burdened.@"); + } + else say("@I collect rare books.@"); + + case "stories"(remove): + say("@My favorite story is 'Hubert the Lion.'@"); + add(["Hubert the Lion"]); + + case "Hubert the Lion"(remove): + say("@I've known it by heart, ever since I heard it as a child.@*"); + say("@Hubert the Lion was haughty and vain, and especially proud of his elegant mane.@*"); + say("@But conceit of this sort is not proper at all, and Hubert the Lion was due for a fall.@"); + + case "Mr. Nose"(remove): + say("@Who told thee of that nickname!?@*"); + say("@Well, I'd rather thou didst not call me that.@"); + + case "thanks"(remove): + say("@'Tis I who should thank thee, Avatar, for all thou hast done for Britannia.@"); + + case "Chuckles"(remove): + say("@Chuckles? Hast thou seen him? I do hope nothing hath happened to him, he hasn't been around lately...@"); + + case "tell Chuckles' secret"(remove): + say("You break your promise to Chuckles and explain to Lord British that Chuckles usurped his power during his absence, hid Lucy's death from him and hid his association with Drudgeworth."); + say("Lord British looks incredulous. @Avatar, those are pretty serious accusations. How dost thou know of this, is there proof?@"); + if (UI_count_objects(PARTY, SHAPE_SCROLL, QUALITY_LEAFLET, FRAME_ANY) > 0) + { + AVATAR.say("@I have the proof in this leaflet right here, milord.@"); + AVATAR.hide(); + say("Lord British reads the leaflet and furrows his brow. @This is definitely not my handwriting but it its my stationary. Conspiring to keep this secret from me for all those years...@"); + say("@..and wenching! Such lewd behavior is inappropriate for members of my royal court. That poor girl.@"); + say("He sighs. @I must have a talk with Chuckles over this. What else shall you have me do, after all these years? And why now, bring it to my attention when we have more pressing matters such as the gargoyle invasion?@"); + say("@" + player_name + ", I knowest Honesty is one of the virtues and all..@"); + say("@but really Avatar...@"); + say("@..thou musn't tattle.@"); + subtractKarma(15); + gflags[TATTLED_ON_CHUCKLES] = true; + if (isNearby(CHUCKLES)) + { + delayedBark(item, "Chuckles, let us have a talk..", 3); + delayedBark(CHUCKLES, "..I can explain!!", 6); + } + else + delayedBark(item, "Chuckles.. I must speak with thee!", 3); + } + else + say("@Well Avatar, where is it? Why are you wasting time with wild accusations while the gargoyles are running amok?@"); + break; + + + + case "bye": + avatar_goodbye = "@Farewell, my liege.@"; + npc_goodbye = "@May fortune favor thee.@"; + + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Maldric.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Maldric.uc new file mode 100755 index 0000000..6da2d01 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Maldric.uc @@ -0,0 +1,196 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + +void Maldric object# (0x430) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hello there..@"; + var npc_1st_greet = "@Excuse me a moment..@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Oh, hey!"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("A bare chested, muscular man, his body gleaming with sweat."); + item.say("He pulls a napkin from his belt and mops at his brow. @Now, what were you saying?@*"); + item.say("@Wait a minute,@ he interrupts, @I recognize you...You're the Avatar! I've always wanted to meet you.@"); + if (player_is_female) + { + item.say("@From the day I first saw your portrait, I knew you must be the most beautiful woman in all Britannia.@"); + } + else item.say("@You're the greatest hero in all the land.@"); + add(["Avatar"]); + } + else + { + if (player_is_female) + item.say("@Oh, " + polite_title + " Avatar, 'tis an unexpected pleasure to see you again!@"); + else item.say("@Hey, my old buddy " + player_name + "! Good to see you again.@"); + } + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + //Main conversation thread + + ///////////////////////////////////////////////////////////////////// + + converse(options) + { + case "name"(remove): + say("@Maldric, I am. Once Maldric the boar hunter, now Maldric the cook.@"); + add(["boar"]); + + case "boar"(remove): + say("@Aye, I used to live in the forest and hunt wild boars.@*"); + say("But one day I presented a roast boar as a gift to his majesty, and he liked it so much he hired me as his cook.@"); + add(["forest", "majesty", "cook", "roast"]); + + case "forest"(remove): + say("@Those were good times. But I'm happy here.@"); + + case "job"(remove): + say("@I cook for all those who live in the castle, and for any guests who dine with Lord British as well.@*"); + say("@'Tis sastisfying work, yet at times I wish I could travel with one such as you...@"); + add(["cook", "castle", "guests", "travel"]); + + case "majesty"(remove): + say("@Yes, Lord British himself.@"); + add(["Lord British"]); + + case "roast"(remove): + say("@The secret is in the spices. It's an old family recipe.@"); + add(["recipe"]); + + case "recipe"(remove): + if (player_is_female) + { + say("@I'll never tell. Though for one so sweet, I must say I'm tempted.@"); + } + else say("@I'll never tell.@"); + + case "cook"(remove): + say("@I like having a job where I can make people happy.@"); + + case "castle"(remove): + + say("@A fancier home than any of my family ever lived in. Yet I still miss my simple hut in the forest.@*"); + if (player_is_female) + { + say("@I wish it were still there, so I could invite you to come spend an evening by the fireplace with me...@"); + add(["fireplace"]); + } + + + case "guests"(remove): + say("@Lord British has many friends.@"); + + case "travel"(remove): + say("@I shouldn't even speak of such things.@*"); + say("@After all, you are the Avatar, and I but a lowly cook. Please forgive me.@"); + script item after 3 ticks say "@I'm sorry " + polite_title + "...@"; + + //do cleanup so no more circular conversations + UI_clear_item_flag(item, READ); + UI_run_schedule(item); + script AVATAR after 8 ticks say "@Goodbye..@"; + + return; + + case "fireplace"(remove): + say("@There's fire enough in my kitchen, but 'tis no place for romance. I shouldn't even speak of such things.@*"); + say("@After all, you are the Avatar, and I but a lowly cook. Please forgive me.@"); + script item after 3 ticks say "@I'm sorry milady...@"; + return; + + case "Lord British"(remove): + say("@He's a good man. Likes plenty of pepper in his stew.@"); + add(["pepper"]); + + case "pepper"(remove): + say("@Spice puts some variety in life, is what I always say.@"); + add(["spice"]); + + case "spice"(remove): + if (player_is_female) + { + say("@You're a pretty spicy little number yourself!@"); + } + else say("@Yes indeed.@"); + + case "Avatar"(remove): + say("@I've heard about all of your adventures. I wish I were a warrior too, and not just a cook!@"); + + case "bye": + say("@See you later. And next time you dine with his majesty, I'll cook you something special.@"); + if (player_is_female) + say("He seems about to say more, with a hopeful look in his eyes. But then he turns away without speaking."); + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@I must get back to cooking..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Nystul.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Nystul.uc new file mode 100755 index 0000000..648ea1a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Nystul.uc @@ -0,0 +1,211 @@ +void Nystul object# (0x48b) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Well met, mage.@"; + npc_1st_greet = "@Avatar, thou art safe!@"; + + av_2nd_greet = "@Nystul..@"; + npc_2nd_greet = "@How may I be of assistance?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("You see a concerned looking mage."); + item.say("@Hail to thee " + player_name + ", and well met. 'Twas I who learned of thy peril through my mystic arts, so that aid might be sent unto thee."); + + if(isNearby(IOLO)) + { + item.say("@Iolo, I saw that thou didst find a book. Might I examine it?@"); + if (UI_count_objects(PARTY, SHAPE_BOOKOFPROPHESIES, QUALITY_ANY, FRAME_ANY) >= 1) + { + IOLO.say("@Certainly, milord. Perhaps thou canst make better sense of it than I.@ says Iolo."); + IOLO.hide(); + item.say("@Strange... This has a picture on its cover of a gargoyle standing with one foot on the chest of a slain human. This is interesting. It's written in a language I know not.@"); + item.say("@Take it to Mariah at the Lycaeum, the finest scribe on the great Council of Wizards. She has studied many languages, and perhaps she can decipher this book for thee.@"); + gflags[ASKED_NYSTUL_ABOUT_BOOK] = true; //To ask mariah about it later + } + else + { + IOLO.say("@I no longer have the book, milord.@ replies Iolo"); + IOLO.hide(); + item.say("@That is too bad. I had hoped thou might take it to Mariah and have her translate it.@"); + } + } + else + { + item.say("@" + player_name + ", I saw that Iolo didst find a book. Might I examine it?@"); + if (UI_count_objects(PARTY, SHAPE_BOOKOFPROPHESIES, QUALITY_ANY, FRAME_ANY) >= 1) + { + AVATAR.say("@Certainly, milord. Perhaps thou canst make better sense of it than I.@"); + AVATAR.hide(); + item.say("@Strange... This has a picture on its cover of a gargoyle standing with one foot on the chest of a slain human. This is interesting. It's written in a language I know not.@"); + item.say("@Take it to Mariah at the Lycaeum, the finest scribe on the great Council of Wizards. She has studied many languages, and perhaps she can decipher this book for thee.@"); + gflags[ASKED_NYSTUL_ABOUT_BOOK] = true; //To ask mariah about it later + } + else + { + AVATAR.say("@I no longer have the book, milord.@"); + AVATAR.hide(); + item.say("@That is too bad. I had hoped thou might take it to Mariah and have her translate it.@"); + } + } + item.say("@One more thing, Avatar... I noticed that thou didst arrive through a red gateway. Dost thou have the stone that opened the gate?@"); + if (askYesNo()) + { + item.say("@From whence could it have come? The gargoyles, perhaps?"); + item.say("@Best ask Lord British about it. I believe he has some knowledge of such items.@"); + } + else + item.say("@Such items are quite rare. Indeed, the only one I have ever seen is that which Lord British himself possesses.@"); + + gflags[ASKED_NYSTUL_ABOUT_ORB] = true; //opens up convo option "orb" on LB + UI_set_item_flag(item, SI_ZOMBIE); //set to give one-liner until Avatar meets with Mariah. + + + sayGoodbyeAbrupt(item, "@Thou shouldst speak to Lord British...@"); + return; + } + else //(UI_get_item_flag(item, SI_ZOMBIE)) //cleared when Avatar shows Mariah the book. + { + item.say("@Hast thou gone to the Lycaeum and shown Mariah the book? 'Tis most important.@*"); + item.say("@There is naught else I can help thee with at this time.@"); + sayGoodbyeAbrupt(item, "@Show her the book..@"); + return; + } + + + //standard conversation options + var options = ["name", "job", "bye"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + + add(["blank"]); + + case "job"(remove): + say("@blank.@"); + say("@blank.@"); + say("@blank.@"); + say("@blank.@"); + add(["blank", "blank"]); + + case "blank"(remove): + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + say("@blank@*"); + add(["blank", "blank"]); + + + + case "bye": + // say("@Goodbye text if you want, otherwise delete for SI style goodbye barks@"); + + avatar_goodbye = "@Replace with Avatar's goodbye bark@"; + npc_goodbye = "@Replace with npc's goodbye bark@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Sherry.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Sherry.uc new file mode 100755 index 0000000..f79edad --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/CastleBritish/Sherry.uc @@ -0,0 +1,257 @@ + + +void Sherry object# (0x406) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var item_in_party = UI_get_item_flag(item, IN_PARTY); + var cheesy_frames = [FRAME_CHEESESLICE, FRAME_CHEESEWHOLE, FRAME_GREENCHEESE]; + var cheese; + var rune = UI_find_object(FIND_ON_SCREEN, SHAPE_RUNE, QUALITY_ANY, FRAME_VALOR); + + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if ((event == PROXIMITY)) + { + UI_error_message("proximity event called on Sherry"); + //reorganised to make it easier to add barks + var barks = [ + "@Kerchew!!@", + "@Nitters fiblik.@", + "@Squeak, squeak!@", + "@Squeak, squeak, squirk.@" + ]; + + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + //Otherwise, say generic NPC barks + else scheduleBarks(item); + + + if (event == DOUBLECLICK) + { + //Avatar is sherry, go back to party and undo the swap + if (gflags[AVATAR_IS_SHERRY]) + { + script item after 2 ticks + { + call UndoSherrySwap; + remove; + } + + } + + + + //Avatar and NPC greeting barks + var av_1st_greet = "@Hello little mouse..@"; + var npc_1st_greet = "@Squeak, squeak, squeak!@"; + + var av_2nd_greet = "@Sherry..@"; + var npc_2nd_greet = "@Yes, Avatar?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + item.say("A cute little mouse. @Squeak, squeak, squeak!@"); + if (item in party) + { + item.say("@Travelling with you is fun! I hope we find some more cheese soon.@"); + add("leave"); + } + else if (isNearby(DUPRE)) + { + DUPRE.say("@Talking to a mouse?@ says Dupre. @Methinks you're starting to imagine things...@"); + DUPRE.hide(); + } + else item.say("@Squeak, squeak, squeak!@"); + + //standard conversation options + var options = ["name", "job", "bye", "squeak"]; + + if (gflags[LEARNED_ABOUT_SHERRY]) + add("help"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Lord British's friend, Sherry.@"); + add(["Lord British", "Sherry"]); + + case "squeak" (remove): + say("@Squeak squirk?@"); + add(["squirk"]); + + case "squirk" (remove): + say("@Squeeeeek!@"); + add(["meow"]); + + case "meow"(remove): + sayGoodbyeAbrupt(item,"Eeeeek!"); + UI_set_schedule_type(item, SHY); + UI_clear_item_flag(item, READ); + break; + + + + case "Lord British"(remove): + if (item_in_party) + say("@He used to read me bedtime stories every night.@"); + else + say("@He reads me bedtime stories every night.@"); + add(["stories"]); + + case "stories"(remove): + say("@He knows the one about Hubert the Lion by Heart!@"); + add(["Hubert the Lion"]); + + case "Hubert the Lion"(remove): + say("@That's my favorite story.@"); + + case "Sherry" (remove): + say ("@Pleased to meet you!@"); + + case "help"(remove): + if ((rune >= 1) && (!gflags[GOT_VALOR_RUNE])) //Avatar is near valor rune, hasn't got it yet + { + say("@Yes, I can get in there to get the rune. Be back in a jiffy!@"); + script item after 3 ticks + { + call SherryGetRune; + } + sayGoodbye2(item); + break; + } + say("@Give me some cheese and ask me again.@"); + add(["cheese"]); + + case "job"(remove): + if (!gflags[SHERRY_IN_PARTY]) + { + say("@I can slip through openings that are too small for you to fit through!@"); + } + else say("@Kerchew!!@"); + add(["kerchew"]); + + case "kerchew"(remove): + say("@I wish people would clean up under their beds and cabinets...@~"); + say("@Dust mice are no friends of mine!@"); + + case "cheese"(remove): + say("@Do you have any cheese?@"); + if (askYesNo()) + { + if (UI_find_object(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_CHEESESLICE) > 0) + cheese = UI_find_object(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_CHEESESLICE); + else if (UI_find_object(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_CHEESEWHOLE) > 0) + cheese = UI_find_object(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_CHEESEWHOLE); + else if ((UI_find_object(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_GREENCHEESE) > 0)) + cheese = UI_find_object(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_GREENCHEESE); + else + say ("@I don't smell any cheese!@"); + + if (cheese) + { + say("@Can I have some?@"); + if (askYesNo()) + { + UI_remove_party_items(1, SHAPE_FOOD, QUALITY_ANY, cheese); + say("@Thank you very much!@"); + add(["join"]); + + } + else say("@Well, you're no fun.@"); + } + + + } + else say("@Oh, that's too bad.@"); + + case "join" (remove): + say("@I can help you! Do you want me to come with you?@"); + if (askYesNo()) + { + if (UI_get_array_size(party) < 8) + { + say("@Great!@"); + UI_add_to_party(item); + gflags[SHERRY_IN_PARTY] = true; + sayGoodbyeAbrupt(item, "Let's go!"); + break; + } + else say("@With that many people I'd get trampled!@"); + } + else say("@Ok.@"); + + case "leave" (remove): + say("@Oh, does this mean you want me to go home now?@"); + if (askYesNo()) + { + say("@All right. Now I can hear my bedtime stories again! I'll leave my stuff with you in case you need it.@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, LOITER); + gflags[SHERRY_IN_PARTY] = false; + UI_clear_item_flag(READ); + script item + call leaveParty, MOVE_NPC2; + + sayGoodbye2(item); + break; + } + else say("@Okay.@"); + + + + + case "bye": + var avatar_goodbye = "@Goodbye, Sherry!@"; + var npc_goodbye = "@Come visit me again soon!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Ahrmaand.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Ahrmaand.uc new file mode 100755 index 0000000..8d9ba62 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Ahrmaand.uc @@ -0,0 +1,169 @@ + +void Ahrmaand object# (0x44d) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, sir.@"; + var npc_1st_greet = "@Ah, yes..@"; + + var av_2nd_greet = "@A moment, milord..@"; + var npc_2nd_greet = "@Ah, thou hast returned..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A distinguished looking gentleman."); + item.say("@Greetings, " + polite_title + ", and welcome to the town of Cove.@*"); + item.say("@How might I be of assistance this fine " + time_of_day + "?@"); + UI_set_item_flag(item, MET); + } + else if (player_is_female) + { + var random = UI_get_random(3); + if (random == 1) + item.say("@Ah, " + player_name + ", thou hast come back to get better acquainted!@"); + else if (random == 2) + item.say("@" + player_name + ", seeing thee again, I feel as if the clouds have parted to reveal the sun once more.@"); + else if (random == 3) + item.say("Milady " + player_name + "! If thou art as happy to see me as I to see thee, then this must be for thee a joyous occasion indeed.@"); + item.say("@How might I be of assistance this fine " + time_of_day + "?@"); + } + else + { + item.say("@Ah, " + player_name + "! 'Tis an honor to welcome thee once more to my humble village.@"); + item.say("@How might I be of assistance this fine " + time_of_day + "?@"); + } + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am the Viscount Ahrmaand. And what is thy name?@*"); + var avatar_or_name = chooseFromMenu(["The Avatar", ("I am " + player_name)]); + if (avatar_or_name == "The Avatar") + say("@Well met, Avatar!@"); + else + say("@Well met, " + player_name + "!@"); + + case "job"(remove): + say("@I govern here in Cove. 'Tis hard work, but my people love me for it.@*"); + say("@I always thought it a blessing to live so close to a shrine, though since the gargoyles came none dare go near it.@"); + add(["Cove", "shrine"]); + + case "Cove" (remove): + say("@We have fine facilities here for healing the wounded and the sick.@"); + add(["sick"]); + + case "shrine" (remove): + say("@In Britannia there are eight shrines, one for each of the eight virtues of the Avatar.@*"); + say("@They are places where people can go to meditate on these virtues.@"); + add(["virtues"]); + + case "Temple of Virtue" (remove): + say("@Alas, it was destroyed some time ago when the earthquakes happened. We were unable to save it.@"); + + case "virtues" (remove): + say("@The virtues are honesty, compassion, valour, justice, sacrifice, honor, spirituality, and humility.@*"); + say("@'Tis good to meditate on these virtues often.@"); + add(["meditate", "Temple of Virtue"]); + + case "meditate" (remove): + say("@Each shrine has its own mantra. This is a chant which one should recite whilst meditating therein. Once there was a time when a special rune was required to enter each shrine as well.@"); + say("@Now the gargoyles have taken the Shrine of Compassion, and it is lost to the people once more.@"); + add(["mantra"]); + + case "sick" (remove): + say("@A party of adventurers came here after their attempt to defeat the gargoyles at the Shrine of Compassion.@*"); + say("@I spoke with their leader when they arrived. Thou shouldst speak with him thyself. He told of a strange violet energy field. I think mayhap 'tis similar to the force which blocked entry to the shrines many years ago.@*"); + say("@The eight mystic runes were most useful in those days.@"); + add(["leader", "force"]); + + case "leader" (remove): + say("@He's in bed at Sasha's, recuperating.@"); + + + case "force"(remove): + say("@Use the Rune of Compassion whilst chanting the Mantra of Compassion. Methinks this may negate the gargoyle's magic at that shrine.@"); + + + case "mantra" (remove): + say("@Ask Lord British's Chancellor, Tholden. He canst tell thee of the mantra, and like as not he will also know of the rune.@"); + + case "bye": + if (player_is_female) + { + say("@Twas a delight to converse with thee, my dear. My heart will be aflutter with anticipation till thou dost visit me again.@"); + + } + else + say("@Farewell sirrah, and good luck with thy quest.@"); + + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Good luck, Avatar!@"; + + if (player_is_female) + npc_goodbye = "@Until we meet again, my dear..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Artagel.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Artagel.uc new file mode 100755 index 0000000..1f7271d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Artagel.uc @@ -0,0 +1,206 @@ + +void Artagel object# (0x447) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item, TEND_SHOP)) + { + script item + { + frame 0; + repeat 32 + { + next frame cycle; + }; + } + + var barks = [ + "@Ohhhhh....@", + "@Oh, the pain!@", + "@..too many..too many of them..@" + + ]; + + //Barks for Lazeena when she's nearby + var barks2 = [ + "@Shhh..it's okay...@", + "@I'm here, my love..@", + "@There, there..@" + + ]; + + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + + if (isNearby(LAZEENA)) + delayedBark(LAZEENA, barks2[rand], 8); + } + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Art thou alright?@"; + var npc_1st_greet = "@Ohhh... the pain!@"; + var npc_2nd_greet; + + var av_2nd_greet = "@Hello..?@"; + + if (UI_get_npc_id(ARTAGEL) == 1) + npc_2nd_greet = "@...mmhmm?@"; + else + npc_2nd_greet = "@..too many..too..mmm..@"; + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + + UI_set_item_flag(item, READ); //override because he can't walk anyway + } + + if (started_talking) + { + if (UI_get_npc_id(ARTAGEL) == 0) + { + item.say("A heavily scarred man with a look of agony on his face.*"); + item.say("@The pain, the pain... Will it never stop?@"); + } + else + { + item.say("A heavily scarred man. He looks a little better than you saw him last.*"); + item.say("@...yy....yes?@"); + + } + //standard conversation options + var options = ["name", "job", "bye"]; + + + //Lazeena is with him and he's on the road to recovery + if (UI_get_npc_id(ARTAGEL) == 1) + add("Lazeena"); + + + //If you've spoken to Lazeena in Britain about "Artagel", you can now ask him about her to start a sidequest + if (gflags[ASKED_LAZEENA_ABOUT_ARTAGEL]) + add ("Artagel?"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + + + if (UI_get_npc_id(ARTAGEL) == 0) + { + converse(options) + { + case "name"(remove): + say("@Too many... There were too many of them...@"); + + case "job"(remove): + say("@My head is pounding like a drum...@"); + + case "Artagel?"(remove): + say("The man momentarily opens his eyes, and struggles to speak. @Ye..ss...oh the pain!@"); + add(["Lazeena"]); + + case "Lazeena"(remove): + say("Laz.. La... nna..T..Te..Tell...h..hher...@*"); + say("Artagel lets out a groan and passes out from the pain."); + UI_set_schedule_type(ARTAGEL, SLEEP); + + //tell Lazeena Artagel is alive + if (!gflags[ARTAGEL_IS_ALIVE]) + gflags[ARTAGEL_IS_ALIVE] = true; + break; + + case "bye": + + var avatar_goodbye = "@Rest easy, friend..@"; + var npc_goodbye = "@...Oh the pain!!!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else if (UI_get_npc_id(ARTAGEL) == 1) + { + converse(options) + { + case "name"(remove): + say("@Ar..Artagel.@"); + + case "job"(remove): + say("@I.. I'm a healer...@ He winces in pain."); + if (isNearby(LAZEENA)) + { + LAZEENA.say("Lazeena wipes his forehead with a wet washcloth."); + LAZEENA.say("@Shhh.. easy now..you must get your rest.@"); + LAZEENA.hide(); + + } + add("gargoyles"); + + case "Lazeena"(remove): + say("He manages to smile amidst the pain."); + say("@Lazeena...@"); + if (isNearby(LAZEENA)) + { + LAZEENA.say("@I'm right here, my love.@"); + LAZEENA.hide(); + } + + case "gargoyles": + say("@...there were too many... tried helping survivors...then I woke up here.@"); + if (isNearby(LAZEENA)) + { + LAZEENA.say("@There.. there.. you did all you could for them.@"); + LAZEENA.hide(); + } + + case "bye": + if (isNearby(LAZEENA)) + { + LAZEENA.say("@I'm sorry, " + polite_title + ", he's still in no condition to speak.@"); + LAZEENA.say("@Once again, I must thank thee for thy kindness and helping reunite us.@"); + LAZEENA.hide(); + + } + var avatar_goodbye = "@Feel better, friend..@"; + var npc_goodbye = "@.mm..hmm...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Ed.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Ed.uc new file mode 100755 index 0000000..0c107eb --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Ed.uc @@ -0,0 +1,16 @@ +void Ed object# (0x448) () +{ + + if (event == DOUBLECLICK) + { + + + item.say("An unconcious man, his face twisted with pain.*"); + item.say("He offers you no response."); + return; + + + + + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Gertan.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Gertan.uc new file mode 100755 index 0000000..35392b6 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Gertan.uc @@ -0,0 +1,96 @@ +void Gertan object# (0x44e) () +{ + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + if (event == PROXIMITY) + { + script item + { + frame 0; + repeat 32 + { + next frame cycle; + }; + } + } + + if (event == DOUBLECLICK) + { + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("You see a burly man, who looks a little healthier than the other patients.*"); + item.say("@Good (cough) day, " + polite_title + ". What is thy name?@"); + item.say("@I am called Gertan. My fellows and I are recovering from a fierce battle.@"); + add(["battle"]); + + } + else + item.say("@Tis good to see thee again, " + player_name + ".@"); +// + + var options = ["name", "job", "bye"]; + + if (gflags[ASKEDABOUTFREITAG]) + add("Freitag"); + + //Start of regular conversation tree + converse(options) + { + case "name"(remove): + say("@Gertan, my friend.@"); + + case "job"(remove): + say("@I lead my men into battle whenever Geoffrey sends me.@"); + add(["battle", "Geoffrey"]); + + case "battle"(remove): + say("@We sought to liberate the Shrine of Compassion.@*"); + say("@My men fought valiantly, but the gargoyles were too much for us. They didst slay more than half our party.@"); + add(["slay"]); + + case "Geoffrey"(remove): + say("@He is the captain of the guard.@"); + add(["guard"]); + + case "guard"(remove): + say("@Aye.@"); + + case "slay"(remove): + say("@Aye, I doubt not they were using foul magic of some kind.@"); + add(["magic"]); + + case "magic"(remove): + say("@A moonstone was upon the shrine, surrounded by a strange violet glow. I tried to get to it, but 'twas surrounded by some kind of force field.@"); + add(["force field"]); + + case "force field"(remove): + say("@'Tis a matter beyond my comprehension.@"); + + case "Freitag"(remove): + say("@Hast thou heard, then, of the time I slew the great dragon Freitag? Ah, that was a long time ago.@"); + add(["dragon"]); + + case "dragon"(remove): + say("@Those were the days...@"); + + case "bye": + + item.say("@May thy efforts meet with more success than mine!@"); + break; + + } + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Gilron.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Gilron.uc new file mode 100755 index 0000000..3e4b5ad --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Gilron.uc @@ -0,0 +1,64 @@ +void Gilron object# (0x449) () +{ +var player_name; //" + player_name + " +var polite_title; //" + polite_title + " +var player_is_female; +var frame; +var repeat; +var rand; +var barks; + +if ((event == PROXIMITY) && UI_get_schedule_type(item, TEND_SHOP)) +{ +script item + { + frame 0; + repeat 32 + { + next frame cycle; + }; + } + + barks = [ + "@Ohhhhh....@", + "@Mrtlx hmlsh fbbn...@", + "@Mmmmmm...@", + "@..........@", + "@Rrrrlr Grrtl...@" + + ]; + + rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + + +} + + if (event == DOUBLECLICK) + { + + player_name = getAvatarName(); + polite_title = getPoliteTitle(); + player_is_female = UI_is_pc_female(); + + + item.say("A feverish looking warrior."); + item.say("@............@"); + + + +var options = ["bye"]; + + + //Start of regular conversation tree + converse(options) + { + + case "bye": + say("@...@"); + break; + + +} +} +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Rudyom.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Rudyom.uc new file mode 100755 index 0000000..c4a1c88 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Rudyom.uc @@ -0,0 +1,145 @@ + +void Rudyom object# (0x44a) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var spellbook = AVATAR->find_object(761, QUALITY_ANY, FRAME_ANY); //makes sure Avatar has spellbook + var Avatar_Level = getExpLevel(AVATAR); //used for Rudyom's level sensing + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == LAB) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, mage.@"; + npc_1st_greet = "@Ah, the Avatar..@"; + + av_2nd_greet = "@Rudyom..@"; + npc_2nd_greet = "@Hello again..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A dark, bearded man dressed in flowing white robes.*"); + item.say("@Greetings, mighty Avatar. For what hast thou come to my place?@"); + + //standard conversation options + var options = ["name", "job", "bye", "gargoyles"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Rudyom.@*"); + + case "job"(remove): + say("@I sell spell books and reagents, and teach spells..@"); + add(["spellbook", "reagents", "spells"]); + + case "gargoyles"(remove): + say("@After the shrine of Compassion fell, the gargoyles attempted to enter town. My pet was able to hold them back whilst we aided the survivors.@*"); + + + + case "spellbook"(remove): + if (!UI_get_schedule_type(item) == LAB) + say("@My shop is closed right now.@"); + else + buySpellbook(RUDYOM, 50); + + + case "reagents": + if (!UI_get_schedule_type(item) == LAB) + say("@My shop is closed right now.@"); + else + buyReagents(RUDYOM); + + + + case "spells": + if (!shop_is_open) + say("@My shop is closed right now.@"); + else + magicShopkeeper(RUDYOM); + + + + case "bye": + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@May peace follow thee, Avatar.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Sasha.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Sasha.uc new file mode 100755 index 0000000..4e04759 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Cove/Sasha.uc @@ -0,0 +1,150 @@ + +void Sasha object# (0x44f) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var barks; + var npc; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + + //Used if special barks needed, otherwise delete + + if (event == PROXIMITY && UI_get_schedule_type(item, PATROL)) + { + + barks = [ + "@How art thou feeling today?@", + "@There there...@", + "@Thy fever has lessened..@", + "@Let me change thy bandages..@", + "@Wouldst thou like some water?@" + ]; + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me, miss..@"; + var npc_1st_greet = "@More wounded?@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Don't tarry here..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A pretty young nurse with violet eyes.*"); + UI_set_item_flag(item, MET); + } + + item.say("@Leave these men alone! Can't you see they need to rest?@."); + + //standard conversation options + var options = ["name", "job", "bye", "rest"]; + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Sasha.@"); + + + case "job"(remove): + say("@I tend the sick. I know how to heal, cure, and resurrect.@"); + add(["heal", "sick", "cure", "resurrect"]); + + case "rest"(remove): + say("@Aye, these men's wounds need time to heal.@"); + + case "sick"(remove): + say("@Thou hast kept me from my duties long enough. Away with thee!@"); + + case "heal": + say("@More wounded? I'll do what I can.@ The poor nurse seems weary beyond words."); + say("@Which of you?@"); + npc = populatePartyNames(party); + healScript(npc, SASHA, 40); + + case "cure": + say("@Poison? Yes, I can cure that. Let me see...@"); + say("@Which of you?@"); + npc = populatePartyNames(party); + cureScript(npc, SASHA, 15); + + case "resurrect"(remove): + say("Your question seems almost like a blow to the woman.*"); + say("@Nay, I cannot. I no longer have the energy, or the reagents.@*"); + say("@It has been a dark, dark day indeed. I am sorry that I cannot help you, but we all grieve today.@"); + add(["reagents", "grieve"]); + + case "reagents" (remove): + say("@I have aided many today. These men are the last; they are beyond the help of all save time itself.@"); + + case "grieve"(remove): + say("@These soldiers are the only survivors of an attempt to free the Shrine of Compassion.@"); + add(["compassion"]); + + case "compassion"(remove): + say("@Show thy compassion now and let them sleep.@"); + + case "bye": + + var avatar_goodbye = "@Take care..@"; + var npc_goodbye = "@Goodbye.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Eckhart.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Eckhart.uc new file mode 100755 index 0000000..1ee4a64 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Eckhart.uc @@ -0,0 +1,169 @@ + +void Eckhart object# (0x472) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var pronoun; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + pronoun = "ma'am "; + // title = "madame"; + } + else + { + pronoun = "sir"; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hello there!@"; + var npc_1st_greet = "@Greetings, " + pronoun + ".@"; + + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@Hullo, " + pronoun + ".@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A gnarled man with knobby muscles."); + item.say("@Hullo, " + polite_title + ".@ He touches his cap respectfully."); + if (shop_is_open) + { + item.say("He has a very sharp knife with which he prunes off less productive branches. @Mind that you stay out of the flight paths of the bees, " + polite_title + ".@"); + add(["bees"]); + } + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Eckhart the vinekeeper, at your service, " + pronoun + ".@"); + + case "job"(remove): + say("@I care for the garden and tend the vines.@"); + add(["garden", "vines"]); + + case "bees"(remove): + say("You notice the bees have regular aerial routes all about the vineyard."); + say("@Zeke keeps bees on the other side of the abbey.@"); + + case "garden"(remove): + say("@Some of our rosebushes were planted by druids hundreds of years ago.@"); + say("@Eventually, we became the Brotherhood of the Rose.@"); + + case "vines"(remove): + if (UI_get_schedule_type(item) == TEND_SHOP) + { + say("@These rows,@ he gestures, @are seedless grapes.@"); + + } + else + say("@Here at the abbey we grow seedless grapes.@"); + add(["seedless"]); + + + case "seedless"(remove): + say("@Amazing, ain't it," + player_name + ". The enchanter made them for us.@"); + say("@Now I grow new vines by grafting seedless grapevines onto regular rootstocks.@"); + add(["enchanter", "grapes"]); + + case "enchanter"(remove): + say("@Yes. He lives east of here, between two rivers.@"); + say("@His hut be due north of Britain, or so they tell me..@"); + if (!gflags[LEARNED_ABOUT_NICODEMUS]) //lets you ask others about Nicodemus + gflags[LEARNED_ABOUT_NICODEMUS] = true; + + case "grapes"(remove): + if (shop_is_open) + { + say("@Now those grapes there are for making wine.@"); + if (isNearby(DUPRE)) + { + DUPRE.say("@I cannot say which I like better: wine from grapes or mead from honey!@"); + DUPRE.hide(); + } + say("@And these over here are for eating.@"); + if (UI_add_party_items(1, SHAPE_FOOD, QUALITY_ANY, FRAME_GRAPES, true)) + say("He gives you a plump little bunch of sweet table grapes."); + else + say("@Too burdened? Maybe next time.@"); + } + else + say("@Visit me in the fields some time and I'll give you some!@"); + + + case "wine"(remove): + say("@Ask Faren of that..@"); + add(["Faren"]); + + case "Faren"(remove): + say("@Yes, Faren--the local winemaker.@"); + + + case "bye": + if (shop_is_open) + say("He waves and turns back to work."); + else + say("Eckhart waves goodbye."); + + + var avatar_goodbye = "@Nice talking to you.@"; + var npc_goodbye = "@Safe travels to ye.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Faren.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Faren.uc new file mode 100755 index 0000000..680a516 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Faren.uc @@ -0,0 +1,154 @@ + +void Faren object# (0x46a) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int FRAME_WHITE_WINE = 1; + const int FRAME_ABBEY_RED = 11; + const int FRAME_ABBEY_DRY = 12; + const int FRAME_SWEET_WINE = 8; + + var food_drink_options = ["nothing", "white wine", "sweet wine", "abbey red", "abbey dry"]; + //var item_shapes = [SHAPE_BOTTLE, SHAPE_BOTTLE, SHAPE_BOTTLE, SHAPE_BOTTLE, SHAPE_BOTTLE, SHAPE_BOTTLE]; + var item_prices = [10, 20, 100, 100]; + var food_drink_frames = [FRAME_WHITE_WINE, FRAME_SWEET_WINE, FRAME_ABBEY_RED, FRAME_ABBEY_DRY]; + var initial_choice_question = "@Which item?@"; //arms or armor? etc + var cant_afford = "@You don't have enough gold.@"; + var cant_hold = "@You look pretty full to me.@"; + var saidNo = "@Too bad, it's really good wine.@"; + var askIfInterested1 = "@For that bottle of wine it will cost you "; //needs to be split into array to capture price + var askIfInterested2 = " gold. Agreeable?@"; + var success = "@Excellent!@ After accepting your gold, he hands over the "; // + var success2 = "@Enjoy your wine!@"; //"I hope this item works well for you!" etc if needed + var nothing = "@Too bad, it's really good wine.@"; + var has_quantity; + var ask_quantity; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Might we speak?@"; + var npc_1st_greet = "@Ah, hello.@"; + + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@Back for more wine?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A good looking young man with a wine glass in his hand."); + item.say("@Hello,@ he says, extending a delicate hand."); + + UI_set_item_flag(item, MET); + } + else + item.say("@I have seen your face before,@ he says, cocking his head sideways."); + item.say("@What is it you need?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Faren. Faren the drunk as some call me.@ He winks at you."); + add(["Faren", "drunk"]); + + case "job"(remove): + say("@I sell many types of wine, made right here.@ He clicks his tongue."); + add(["wine"]); + + case "Faren"(remove): + say("@You might have noticed the similarity between my sister and me.@"); + add(["sister"]); + + case "drunk"(remove): + say("@Just kidding.@ He smiles broadly."); + + case "sister"(remove): + say("@A beautiful lass Stephanie is.@"); + add(["Stephanie"]); + + case "Stephanie"(remove): + say("Have you met her? Then you know she is blind.@"); + add(["blind"]); + + case "blind"(remove): + say("@Yes, has been so since birth. For her it is like being born a gargoyle.@"); + add(["gargoyle"]); + + case "gargoyle"(remove): + say("@She knows no other life. It is her lot to make the best of her situation. In this she is no different than you or I.@*"); + say("He pauses to gather his thoughts.*"); + say("@Even gargoyles face this dilemma, I'll wager. But we know them more by the ways they differ from us, rather than their similarities.@"); + + case "wine": + sellFood(FAREN, food_drink_options, item_prices, food_drink_frames, dialog); + + case "bye": + item.say("@Have a nice " + time_of_day + ".@ He sips his wineglass."); + var avatar_goodbye = "@See you around..@"; + var npc_goodbye = "@Take care!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Glen.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Glen.uc new file mode 100755 index 0000000..ce3ad40 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Glen.uc @@ -0,0 +1,297 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + +void Glen object# (0x40e) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var cremate_body = []; + var bodies = 0; + var body; + var bodyframe; + var bodyshape; + + //for glenCremation function event + const int ANIMATE_GLEN = 1; + const int FAILED = 7; + + //Positions for glen cremate function + var glen_pos1 = [0375, 0603, 0]; //path 0 + var body_pos = [0375, 0599]; //body position in crematoriam pit + + var crematorium_pos = [0171, 0257]; //crematoriam pit - prevent from doing it outside of room + //var path_egg = UI_find_nearby([crematorium_pos], 607, 10, MASK_EGG); + + var scorch = UI_find_nearby([0171, 0257], 204, 15, MASK_NONE); + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings milord..@"; + var npc_1st_greet = "@Ah, a potential client..@"; + + var av_2nd_greet = "@Excuse me..@"; + var npc_2nd_greet = "@Good evening...@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //Avatar or party carrying a body that can be cremated + bodies = getBodyCount(item); + UI_halt_scheduled(GLEN); + if (UI_in_usecode(GLEN)) + { + UI_error_message("Glen is in a script"); + UI_halt_scheduled(GLEN); + + } + else + UI_error_message("GLEN is not in a script"); + + if (bodies > 0) + { + item.say("His eyes gleam fiendishly when he notices the body you're carrying.*"); + item.say("@Ah, you've brought me a client. Tell the truth, doesn't your friend look more peaceful this way?@*"); + item.say("@For such a heroic client, I have something special to offer. It's a new process I've invented called 'cremation.'@*"); + item.say("@For a mere fifteen gold, the remains of the dearly departed are purified with flame. Would you like me to do this for you?@*"); + if (askYesNo()) + { + var GlenLocation = UI_get_object_position(GLEN); + + var GlenX = GlenLocation[1]; + var GlenY = GlenLocation[2]; + + var in_range; + + //test to see if Glen is in the house + if (((GlenX < 353)||(GlenX > 380)) || ((GlenY < 593)||(GlenY > 606))) + in_range = false; + else + in_range = true; + + UI_error_message("In range is " + in_range); + + //if Glen is in the crematorium, proceed + if (in_range) + { + UI_error_message("Glen is near the creamatorium"); + + if (hasGold(15)) + { + chargeGold(15); + body = findBodyCont(PARTY); + + //run glenCremation cutscene + if (UI_is_dest_reachable(item, [glen_pos1])) + { + UI_error_message("Destionation glen pos1 is reachable"); + + //set Glen to Wait in front of the crematorium spot + UI_set_new_schedules(GLEN, 2, WAIT, [glen_pos1]); + + //force him to move + UI_run_schedule(GLEN); + + + //play music + UI_play_music(27); + + //start script + script GLEN after 35 ticks + { + call glenCremation, ANIMATE_GLEN; + + }; + + if (UI_in_usecode_path(GLEN)) + UI_error_message("Glen is moving to the path."); + else + UI_error_message("Glen is NOT moving to the path."); + + } + else + UI_error_message("Something went wrong."); + + + + } + else item.say("@You're a bit short on gold.@ he says, dissapointedly."); + sayGoodbye2(item); + return; + + } + else + { + item.say("@Bring them back to my shop so we can safely cremate the body..@"); + UI_error_message("Glen is too far away from creamatorium"); + sayGoodbye2(item); + } + } + else item.say("@Too bad.@"); + sayGoodbye2(item); + return; + + + } + + else if (UI_get_item_flag(item, POLYMORPH)) + { + item.say("@Ohhh! Silly me, spending so much time with my clients.@ He gestures at the corpses. @I forget little details like paying Mole...I'll have to take care of it right away!@"); + item.say("@You deserve a reward for helping me straighten this out. That mage over on the table was found just outside of town. He was carrying a couple of enchanted items and some money when the gargoyles got him. Nobody has been able to find any relatives of his, so you might as well take it all.@"); + + //Find mage to set "Okay to take" flag for mage and contents + var mage = UI_find_object(FIND_ON_SCREEN, 762, 1, FRAME_ANY); + var obj; + UI_set_item_flag(mage, OKAY_TO_TAKE); + var item_list = UI_get_cont_items(mage, SHAPE_ANY, QUALITY_ANY, FRAME_ANY); + for (obj in item_list with index to max) + UI_set_item_flag(obj, OKAY_TO_TAKE); + + //clear all npc flags to prevent re-doing for more exp + UI_set_item_flag(MOLE, POLYMORPH); + UI_clear_item_flag(item, CONFUSED); + UI_clear_item_flag(item, NAKED); + UI_clear_item_flag(item, PETRA); + UI_clear_item_flag(item, SI_ZOMBIE); + UI_clear_item_flag(item, POLYMORPH); + giveExperience(50); + } + else if (UI_get_item_flag(item, CONFUSED)) + { + item.say("@That addle-brained, lower class, miserable excuse for a common laborer...I agreed to give him an equipment allowance with his pay. No doubt it's all been squandered at some tavern, along with the rest of his pay. See what he has to say about that!!@"); + UI_set_item_flag(MOLE, CONFUSED); //triggers 4th mole response + sayGoodbye2(item); + return; + } + + else if (UI_get_item_flag(item, NAKED)) + { + item.say("@So, his shovel broke? That's no excuse. Tell him he should have bought another one and kept working.@"); + UI_set_item_flag(MOLE, PETRA); //triggers 3rd Mole response + sayGoodbye2(item); + return; + } + + else if (UI_get_item_flag(item, SI_ZOMBIE)) + { + item.say("You pass along Mole's message. @Needs a shovel, does he? Tell him to use the one I gave him when I hired him! No doubt he's forgotten he has it by now, or lost it somewhere...@"); + UI_set_item_flag(MOLE, NAKED); //triggers 2nd Mole response + sayGoodbye2(item); + return; + } + else + { + item.say("You see a quiet, pale, almost motionless gentleman."); + item.say("@Good evening.@ he says, in a voice that sends shivers down your spine. @It is evening, I hope. That's my favorite time.@"); + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Glen D'Arc, of the Trinsic D'Arcs.@"); + add(["Trinsic"]); + + case "job"(remove): + say("@I prepare the bodies of the departed for their eternal rest. It's very relaxing work. At least it would be, if I didn't have to put up with that incompetent gravedigger.@"); + add(["rest", "bodies", "gravedigger"]); + + + case "Trinsic"(remove): + say("I had to move away... Too sunny.@"); + add(["sunny"]); + + case "sunny"(remove): + say("@I much prefer moonlight. It's more natural and healthy.@"); + + case "rest"(remove): + say("@Yes, those who cannot afford resurrection know the cool comfort of good, honest soil.@ He sighs longingly. @How I envy them, for only the dead know true peace..@"); + add(["dead"]); + + case "bodies"(remove): + say("@For most clients, I prefer to use Frigid Solvol. It's the finest enbalming fluid on the market.@"); + add(["Solvol"]); + + case "Solvol"(remove): + say("@It gives the departed a nice, healthy glow...@"); + + case "dead"(remove): + say("He smiles. @I see you're not much of a believer in death. But next time you're dead you should try staying that way. You might like it...@"); + + case "gravedigger"(remove): + if (!UI_get_item_flag(MOLE, SI_ZOMBIE)) + { + say("@Mole was supposed to have two more graves finished yesterday. I can't stand to talk to him any more - if you see him, tell him I need those graves dug immediately!@"); + UI_set_item_flag(MOLE, SI_ZOMBIE); + } + else say("@Mole was supposed to have two more graves finished yesterday. I can't stand to talk to him any more - if you see him, tell him I need those graves dug immediately!@"); + + case "bye": + say("@Goodbye for now - I'm sure I'll see you again. Every body ends up here sooner or later...@"); + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@I'll see you again I'm sure...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Mole.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Mole.uc new file mode 100755 index 0000000..9c501c9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Mole.uc @@ -0,0 +1,226 @@ + +void Mole object# (0x40d) () +{ + + + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hail, milord.@"; + var npc_1st_greet = "@Mind the open graves, " + polite_title + ".@"; + + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@Oh, hello " + polite_title + ".@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + var bodycount = getBodyCount(PARTY); + if (bodycount > 0) + { + item.say("Now, now. You can't be bringing bodies out here without reservations.@"); + item.say("Go see me master Glen about having a funeral first.@"); + sayGoodbye2(item); + + } + + if(UI_get_item_flag(item, POLYMORPH)) //final - Glen says he'll pay + { + item.say("@Old penny pincher says he's going to pay me? I'll believe it when I have the coins in me hand.@"); + UI_set_item_flag(item, NO_SPELL_CASTING); //set when Glen/Mole dispute solved, or gave shovel + + //CLEANUP FLAGS + UI_clear_item_flag(item, CONFUSED); + UI_clear_item_flag(item, NAKED); + UI_clear_item_flag(item, PETRA); + UI_clear_item_flag(item, SI_ZOMBIE); + UI_clear_item_flag(item, POLYMORPH); + + } + else if (UI_get_item_flag(item, CONFUSED)) //Glen said he squandered pay + { + item.say("@Aye, maybe there'd 'ave been extra for shovel and such in my pay, if the old skinflint had ever remembered to pay me!@"); + UI_set_item_flag(GLEN, POLYMORPH); + sayGoodbye2(item); + return; + } + else if (UI_get_item_flag(item, PETRA)) //Glen said buy new one + { + item.say("@I'd have been glad to get a new shovel! Believe me, I knows how to pick out a good one, too. But how'm I supposed to pay for it, you just ask him that!@"); + UI_set_item_flag(GLEN, CONFUSED); + sayGoodbye2(item); + return; + } + + else if (UI_get_item_flag(item, NAKED)) //told Glen needed shovel + { + item.say("Mole listens, a bit impatiently. @He gave me a shovel, all right - cheapest shovel I ever saw in all my years in the business!@"); + item.say("@Tell 'im it broke the third day I tried usin' it.@"); + UI_set_item_flag(GLEN, NAKED); + sayGoodbye2(item); + return; + } + + else + { + item.say("You see a coarse looking individual, digging in the dirt with his bare hands."); + item.say("@Hello. If I be speaking with ye, I'd best not be digging at the same time.@"); + } + + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I be Mole.@"); + + case "job"(remove): + say("@I dig graves for me master, Glen.@"); + add(["graves", "dig", "Glen"]); + + case "dig"(remove): + say("Digging's been in me family for generations.@"); + + + case "graves"(remove): + say("@If you take away enough dirt, a grave's what's left. After they has a funeral, I puts all the dirt back again.@"); + add(["funeral"]); + + case "Glen"(remove): + + if (UI_get_item_flag(item, NO_SPELL_CASTING)) //gave him a shovel already, or solved the glen/mole dispute + { + say("@He's a strange one... Nobody knows what he keeps in that back room of 'is.@"); + } + else + { + if (!UI_get_item_flag(GLEN, SI_ZOMBIE)) //triggers Glen "shovel" remark + UI_set_item_flag(GLEN, SI_ZOMBIE); + say("@I'll not speak with 'im, the way he treats me. But if you sees him, tell him I could dig these graves better if I had a shovel!@"); + add(["shovel"]); + } + + case "funeral"(remove): + say("@Funerals aren't me trade. I know plenty about dirt, though.@"); + add(["dirt"]); + + case "dirt"(remove): + say("@I knows all the different kinds of dirt by heart.@"); + add(["kinds"]); + + case "kinds"(remove): + say("@Learned 'em from me father.@"); + + case "shovel"(remove): + if (!UI_get_item_flag(item, NO_SPELL_CASTING)) //haven't given shovel or solved glen/mole dispute yet + { + if (UI_count_objects(PARTY, SHAPE_SHOVEL, QUALITY_ANY, FRAME_ANY) >= 1) + { + say ("@Oh, ye've brought a shovel with ye! Is it for me?"); + if (askYesNo()) + { + say ("@Thank ye very much! And 'tis not even my birthday!@"); + say("@Let me tell you this - keep an eye on old Glen. They say not all of the bodies end up where they're supposed to...@"); + say("@You know, 'e was supposed to have paid me for a new shovel, and then you wouldn't have 'ad to go to so much trouble.@"); + UI_set_item_flag(item, NO_SPELL_CASTING); + UI_remove_party_items(1, SHAPE_SHOVEL, QUALITY_ANY, FRAME_ANY, true); + giveExperience(40); + addKarma(5); + + //clear any flags that were set + UI_clear_item_flag(item, CONFUSED); + UI_clear_item_flag(item, NAKED); + UI_clear_item_flag(item, PETRA); + UI_clear_item_flag(item, SI_ZOMBIE); + UI_clear_item_flag(item, POLYMORPH); + + //clear any with Glen + UI_clear_item_flag(GLEN, CONFUSED); + UI_clear_item_flag(GLEN, NAKED); + UI_clear_item_flag(GLEN, PETRA); + UI_clear_item_flag(GLEN, SI_ZOMBIE); + UI_clear_item_flag(GLEN, POLYMORPH); + + } + else say("@Too bad. I really need one.@"); + + } + } + else + { + say("@'Tis the tool of me trade.@"); + add(["tool"]); + } + + case "tool"(remove): + say("@Me father said a good shovel is more important than a good wife.@"); + add(["wife"]); + + case "wife"(remove): + say("@That's what you look for after you've got a good shovel.@"); + + case "bye": + say("@Oh, going away, are ye? Let me know when ye return so I'll know 'tis time to speak with ye again.@ He returns to his digging."); + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Be seein' ye..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Sionnach.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Sionnach.uc new file mode 100755 index 0000000..7477405 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Sionnach.uc @@ -0,0 +1,188 @@ + +void Sionnach object# (0x40b) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == PROXIMITY) + { + UI_error_message("Proximity event called on Sionnach"); + if (UI_part_of_day() == MIDNIGHT && nearEachOther(item, SYLAINA)) + { + //if he isn't facing Sylania, make him. + if (!isFacingNPC(item, SYLAINA)) + makeNPCFaceNPC(item, SYLAINA); + + } + + + + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, bard.@"; + var npc_1st_greet = "@Hello!@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Of course!@"; + + + if (UI_part_of_day() == MIDNIGHT && nearEachOther(item, SYLAINA)) + { + if (player_is_female) + item.say("@Excuse me, ma'am. We are, um, indisposed.@"); + else + item.say("@Pardon me, sir, but I hate to keep my dear one waiting. You understand, of course.@"); + item.say("He returns his attentions to Sylaina."); + delayedBark(item, "Now where were we..", 2); + + //make him face Sylania + makeNPCFaceNPC(item, SYLAINA); + + return; + } + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A troubadour with a drum. His tailored suit is travel-worn but bright."); + if (isNearby(IOLO)) + { + IOLO.say("@Why, hello there, my friend. You've grown a bit since we met last. I'm afraid I can't recall your name, you'll have to forgive me.@"); + IOLO.hide(); + item.say("@It has been a while, Master Iolo.@"); + + } + UI_set_item_flag(item, MET); + } + else + { + if (partynum > 1) + item.say("@Greetings, folks.@"); + else + item.say("@Greetings, " + polite_title + ".@"); + + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Sionnach.@ He pronounces it 'ShaNOK'."); + + case "job"(remove): + say("@I'm a drummer and a singer.@"); + add(["drummer", "singer"]); + + case "drummer"(remove): + say("@Would you like me to play for you?@"); + if (askYesNo()) + { + say("The drum is wide and flat. Sionnach holds it by the strings on the back of it. Then, he taps it in intricate patterns using both ends of the dowel held loosely in his other hand.*"); + say("It sounds thus: 'RUM-TE-TUM, RUM-TE-TUM, TUMBLETY-TUM-TE-TUM!' The beat is invigorating and exciting."); + say("@That's a battle summons.@"); + add(["battle"]); + //TODO: give drum shape and sound to him? + } + else + say("@As you wish, " + polite_title + "@."); + + + case "battle"(remove): + say("@'Twas long ago... Back when men forced sorcerous secrets from demons...@*"); + say("@Back when women wove moonbeams into cloth of indescribably fine texture...@*"); + say("@Long ago, Lord Fennian devised a language of raps and knocks on the great drums used by his armies. Each drum was made of the entire skin of a bull, stretched taut by a dozen cords.@"); + say("@It's true. I read that in a book I found at the Lycaeum.@"); + add(["book"]); + + case "book"(remove): + say("@I also read a number of maritime histories. They record the facts behind the many songs of different ships.@"); + add(["ships"]); + + case "ships"(remove): + say("@The sea is not always a gentle, generous friend. Storms have brought down many a haughty vessel; the evil Empire, the Dutchman, the Virtuous...Have you heard of the Virtuous?@"); + add(["Empire", "Dutchman"]); + + case "Empire"(remove): + say("@I don't know where she rests. Ask other bards.@"); + + case "singer"(remove): + say("Sionnach sings softly for you.*"); + say("@A southerner from Serpent's Hold Once slew a pirate crew of eight. Young Keegan was this warrior bold, And thus he claimed the 'Bitter Kate.'@*"); + say("@He broke a bottle 'cross her bow And 'Virtuous' became her name. For many years she served him well; Good Captain Keegan rose to fame.@"); + say("@The Barston Bay came north to fight, The Jolly Roger on her mast. To cold Loch Lake she sailed that night. To sink Keegan's ship with cannon blast.@*"); + say("@Ah, the old Bitter Kate, she's mended her ways, And as the Virtuous, ended her days.@*"); + say("@Captain Keegan, he sleeps the endless sleep.. While on Loch Lake's shore the Virtuous lays.@"); + + case "Dutchman"(remove): + say("@There's probably great treasure on her, and on the Virtuous, too.@"); + + case "bye": + + var avatar_goodbye = "@Nice speaking with thee..@"; + var npc_goodbye = "@Take care!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Stephanie.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Stephanie.uc new file mode 100755 index 0000000..1c3492b --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Stephanie.uc @@ -0,0 +1,145 @@ + +void Stephanie object# (0x46c) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var npc; + + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Who's there?@"; + + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@You sound familiar..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A young woman who stares into the distance."); + item.say("@Hello? Is someone there?@"); + } + else + item.say("@I recognize your voice.@ She smiles."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Stephanie, but you can call me 'Steph.'@"); + add(["Steph"]); + + case "job": + say("@We have no 'jobs' here as such. But I can heal, cure and resurrect@"); + add(["heal", "cure", "resurrect"]); + + case "Steph"(remove): + say("@That's better.@"); + + + case "heal": + if (!shop_is_open) + { + say("@Come to my shop when it's open.@"); + } + else + { + npc = populatePartyNames(party); + healScript(npc, STEPHANIE, 25); + } + case "cure": + if (!shop_is_open) + { + say("@Come to my shop when it's open.@"); + } + else + { + npc = populatePartyNames(party); + cureScript(npc, STEPHANIE, 5); + } + + case "resurrect": + if (!shop_is_open) + { + say("@Come to my shop when it's open.@"); + } + else + resurrectScript(STEPHANIE, 350); + + case "bye": + say("@Good " + time_of_day + ", my friend. Take care.@ Her long lashes flitter a moment."); + + var avatar_goodbye = "@Goodbye, Steph!@"; + var npc_goodbye = "@Farewell, my friend!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Sylaina.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Sylaina.uc new file mode 100755 index 0000000..a299e9a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Sylaina.uc @@ -0,0 +1,217 @@ +void Sylania object# (0x40c) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + const int FRAME_SYLANIA = 6; + const int SHAPE_AMULET = 955; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == PROXIMITY) + { + UI_error_message("Proximity event called on Sylania"); + + if (UI_part_of_day() == MIDNIGHT && nearEachOther(item, SIONNACH)) + { + //if she isn't facing Sionnach, make her. + if (!isFacingNPC(item, SIONNACH)) + { + UI_error_message("Sylaina isn't facing Sionnach, making them face each other"); + makeNPCFaceNPC(item, SIONNACH); + + } + } + //Otherwise, say generic NPC barks + else scheduleBarks(item); + + + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hello, miss..@"; + var npc_1st_greet = "@Why, hello.@"; + + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@Ah, thou'rt back.@"; + + if (UI_part_of_day() == MIDNIGHT && nearEachOther(item, SIONNACH)) + { + item.say("@Have you nothing better to do?@ she asks pointedly. @Please excuse us.@"); + delayedBark(item, "How rude..", 2); + makeNPCFaceNPC(item, SIONNACH); + return; + } + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + + + + + + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A voluptuous woman dressed in dark blue velvet over white cloth."); + item.say("@Hello there, stranger. Can I help you?@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Hello, " + polite_title + ".@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //sidequest - if you return her locket, get XP + if (UI_count_objects(PARTY, SHAPE_AMULET, QUALITY_ANY, FRAME_SYLANIA) >= 1 && !UI_get_item_flag(item, PETRA)) //to prevent a stray amulet that isn't hers + add("found locket"); + + //when you give Sandy in Trinsic the dragon's egg, he spills the beans on other pirates + if (UI_get_item_flag(SANDY, SI_ZOMBIE)) + add("map"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm Sylaina Moorehead.@"); + add(["Moorehead"]); + + + case "job": + say("@When I need some money for food and such, I work as a seamstress. Most of the time, however, I live off the seashore.@"); + add(["seamstress", "seashore"]); + + case "Moorehead"(remove): + say("@I'm a widow now. I live in a cottage on the beach.@"); + add(["widow"]); + + + case "seamstress"(remove): + say("@Yes. I used to make such fine clothes for my Nathaniel...@"); + add(["Nathaniel"]); + + case "seashore"(remove): + say("@There's always a bit of fish or gull's eggs to eat, with lobster once in a while. I'm as carefree as a gypsy.@"); + add(["gypsy"]); + + case "Nathaniel"(remove): + say("@Though he was not a bad husband, I'll always remember him as something of a scoundrel.@"); + say("She smiles and her lovely eyes sparkle with memories. @They say he went down in a storm. He was a pirate.@"); + add(["pirate"]); + + case "gypsy"(remove): + say("They travel the road between Britain and Trinsic. Normally I like them. They're a merry lot. But one time a group of gypsies stole my prized locket!@"); + add(["stole", "locket"]); + + case "map"(remove): + say("@My husband left me a gold locket wrapped in a piece of an old ship's chart. Maybe that's what you seek.@*"); + if (!UI_get_item_flag(item, PETRA)) + say("@I don't have the locket or the map anymore. The gypsies came by one day and stole them.@"); //if you haven't returned her locket yet. + if (!gflags[LEARNEDGYPSYSSTOLEMAP]) + gflags[LEARNEDGYPSYSSTOLEMAP] = true; + + case "pirate"(remove): + say("@My husband left me a gold locket wrapped in a piece of an old ship's chart. Maybe that's what you seek.@*"); + if (!UI_get_item_flag(item, PETRA)) + say("@I don't have the locket or the map anymore. The gypsies came by one day and stole them.@"); //if you haven't returned her locket yet. + if (!gflags[LEARNEDGYPSYSSTOLEMAP]) + gflags[LEARNEDGYPSYSSTOLEMAP] = true; + + + + case "widow"(remove): + say("@My husband left me a little money, to support myself for a time, but I still like to sew fine clothing. There are few things as relaxing as embroidering and sitting by the ocean, listening to the surf.@"); + + case "stole"(remove): + say("@Yes--some gypsies are trustworthy, but others are scoundrels!@"); + + case "found locket"(remove): + say("@Is that... you found my locket! I thought I'd never see it again since the gypsies took it!@"); + say("She gives you a hug. @I am forever grateful!@"); + say("@I don't have much to give you, but I just caught some fresh fish and will cook for you at least!@"); + say("She brings out some fish and cooks it, and gives each of you a plate. @It's not much, but at least you won't be hungry!@"); + //set flag + UI_set_item_flag(item, PETRA); + + UI_remove_party_items(1, SHAPE_AMULET, QUALITY_ANY, FRAME_SYLANIA); + + //give fish + UI_add_party_items(partynum, SHAPE_FOOD, QUALITY_ANY, FRAME_TROUT, false); + + //add karma and exp + addKarma(5); + + giveExperience(50); + + case "locket"(remove): + if (!UI_get_item_flag(item, PETRA)) + { + say("@My husband left me a gold locket. It contained a piece of an old ship's chart. He said that chart would make me rich.@*"); + say("@I didn't really care about the chart. But the locket...That locket was all I had to remember Nathaniel by.@"); + say("She sighs and looks away for a moment."); + } + say("@I am very happy you found my locket, it's the only thing left I have to remember Nathaniel by.@"); + //add(["Nathaniel"]); + + case "bye": + + var avatar_goodbye = "@Farewell, Sylaina..@"; + var npc_goodbye = "@Bye-bye.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Zeke.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Zeke.uc new file mode 100755 index 0000000..289350f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/EmpathAbbey/Zeke.uc @@ -0,0 +1,171 @@ + +void Zeke object# (0x470) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Might we speak?@"; + var npc_1st_greet = "@Careful of the bees..@"; + + var av_2nd_greet = "@Greetings..@"; + var npc_2nd_greet = "@Hmmm..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A strong looking man with just one arm."); + item.say("@Hello@, he shouts, waving."); + + UI_set_item_flag(item, MET); + } + else + item.say("@You've met Zeke before, 'aven't ya?@ he says, glaring at you. @What d'ya need?@"); + + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[LEARNED_ABOUT_NICODEMUS] || UI_get_item_flag(NICODEMUS, MET)) //lets you ask others about Nicodemus + add("enchanter"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Zeke the one-armed beekeep, it is.@"); + add(["Zeke"]); + + case "job"(remove): + say("@I'm the beekeeper here at the abbey. If you want to buy honey, or sell me a honey jar I'm all ears -if only one-armed-.@"); + add(["buy honey", "sell jar"]); + + case "Zeke"(remove): + say("@Lost me arm and gained that name in battle.@ He flashes a yellowed grin at you."); + add(["battle"]); + + case "battle"(remove): + say("@'Twas a horrid affair, but Mondain's men had to be thwarted.@"); + add(["Mondain"]); + + case "Mondain"(remove): + item.say("@You must be new here.@ He looks to the ground."); + item.say("@He brought an age of great evil unto our land. Yet try and tell today's children of the age of darkness...@"); + item.say("@They believe nothing can go wrong, as long as the Avatar lives.@"); + + + + case "buy honey"(remove): + say("@It'll cost you 10 gold for the 'oney, interested?@"); + if (askYesNo()) + { + if (hasGold(10)) + { + if (UI_add_party_items(1, SHAPE_JAR, QUALITY_ANY, FRAME_HONEY_JAR, true)) + { + chargeGold(10); + say("@Excellent!@ After accepting your gold, he hands over the honey."); + say("@Enjoy your 'oney.@"); + } + else say("@You look pretty full to me.@"); + } + else say("@You ain't that good-looking. My price is 10 gold.@"); + } + else + say("@You'll find none better.@"); + + case "enchanter"(remove): + say("@Yes, " + polite_title + ". He lives east of here, between two rivers.@"); + say("@His hut be due north of Britain, or so they tell me..@"); + + case "bees"(remove): + item.say("@Bees are true friends. They work all day, making honey and scattering pollen. All we have to do is provide them with hives.@"); + item.say("He laughs. @And get stung once in a while!@"); + add(["hives"]); + + + case "hives"(remove): + say("@I buys all my hives from a nice lady in Minoc named Michelle. She weaves them out of straw.@"); + + case "sell jar"(remove): + if (UI_count_objects(PARTY, SHAPE_JAR, QUALITY_ANY, FRAME_EMPTY) >= 1) + { + say("@Will you take 7 gold for that honey jar?@"); + if (askYesNo()) + { + say("@Done!@ He hands you 7 gold pieces and takes the honey jar.@"); + UI_remove_party_items(1, SHAPE_JAR, QUALITY_ANY, FRAME_EMPTY, true); + giveGold(7); + + } + else + say("@Changed your mind, eh?@"); + } + else + say("@Sorry, you 'aven't any 'oney jars.@"); + + case "bye": + + var avatar_goodbye = "@I must be going now..@"; + var npc_goodbye = "@Have a nice " + time_of_day + ".@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Bolesh.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Bolesh.uc new file mode 100755 index 0000000..57beda2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Bolesh.uc @@ -0,0 +1,191 @@ + +void Bolesh object# (0x4b8) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var started_talking = UI_get_item_flag(item, READ); + + + + //READ flag used to initiate conversations via TALK + var met_lensmaker = UI_get_item_flag(item, PETRA); //used to set actually met once can talk to + var read_scroll = UI_get_item_flag(item, SI_ZOMBIE); //has not read scroll + var not_submitted = UI_get_item_flag(item, CONFUSED); //read scroll, not submitted + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + av_1st_greet = "@Hold, gargoyle!@"; + npc_1st_greet = "@An-bal-sil-fer!@"; + } + else if (!gflags[SUBMITTED_TO_DRAXINUSOM]) //not submitted yet but read scroll + { + av_2nd_greet = "@Hold, gargoyle!@"; + npc_2nd_greet = "@The False Prophet!!@"; + + } + else //already submitted + { + av_2nd_greet = "@Excuse me..@"; + + if (UI_get_item_flag(item, PETRA)) + npc_2nd_greet = "@To be honored, False Prophet..@"; + else + npc_2nd_greet = "@The False Prophet!!@"; + + } + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + item.say("A strong, winged gargoyle warrior. He is sorely wounded.*"); + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + + item.say("The gargoyle struggles to sit up."); + item.say("He shouts, @An-bal-sil-fer! Agra-lem! Agra-lem!@"); + item.say("The gargoyle collapses, exhausted."); + UI_set_item_flag(item, ASLEEP); + UI_set_schedule_type(item, SLEEP); + UI_clear_item_flag(item, MET); + sayGoodbye2(item); + return; + } + + + else if (!gflags[WEARING_AMULET_SUBMISSION]) //have read scroll but not gotten amulet + { + item.say("The gargoyle struggles to sit up."); + item.say("He shouts, @The False Prophet! Guards! Guards!@"); + item.say("The gargoyle collapses, exhausted."); + UI_set_item_flag(item, ASLEEP); + UI_set_schedule_type(item, SLEEP); + UI_clear_item_flag(item, MET); + sayGoodbyeAbrupt(item, "Guards! Guards!"); + return; + } + + else + { + if (!UI_get_item_flag(item, PETRA)) //haven't met officially + { + item.say("The gargoyle struggles to sit up."); + item.say("@The False Prophet!@"); + item.say("@But to wear the Amulet of Submission? Then to express awe at your honor and courage.@"); + UI_set_item_flag(item, PETRA); //set when you met him + } + else + item.say("@Greetings again, honored one.@"); + } + + + + //standard conversation options + var options = ["name", "job", "bye"]; + + // if (UI_get_item_flag(NAXATILOR, MET)) + // add ("Naxatilor"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@To be named Bolesh Us-agra-lem, Bolesh the Troop-Leader.@*"); + + case "job"(remove): + say("@To lead what remains of our forces into battle. To have recently returned from a mission to your side of the world.@"); + say("@To have tried to reach the Codex.@"); + add(["Codex"]); + + case "Codex"(remove): + say("@To have had victory between our claws, but to have been thwarted on the verge of success!@*"); + say("@To have encountered an impervious force field around the Codex.@*"); + add(["force field"]); + + case "force field"(remove): + say("@To know that such a field surrounded the Codex when my people possessed it.@*"); + say("@To remember that only those on sacred quests for wisdom could pass.@*"); + add(["sacred quests"]); + + case "sacred quests"(remove): + say("@To receive a sacred quest at the Temple of Singularity.@*"); + say("@But to be uncertain whether a human's request would be answered there.@*"); + add(["Temple of Singularity"]); + + + case "Temple of Singularity"(remove): + say("@To find the temple in the mountains to the north. To need to fly to get there, though!@*"); + add(["fly"]); + + case "fly"(remove): + say("@Yes, to be accessible only to the superior winged gargoyles.@*"); + say("@To be totally unreachable by land-bound worker gargoyles! To suppose that it is totally unreachable by land-bound humans as well.@*"); + + case "bye": + say("@Farewell, False prophet!@"); + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@To honor my people with thy sacrifice!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Caretaker.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Caretaker.uc new file mode 100755 index 0000000..cfdeda1 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Caretaker.uc @@ -0,0 +1,196 @@ + +void Caretaker object# (0x4c0) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var started_talking = UI_get_item_flag(item, READ); + + + + //READ flag used to initiate conversations via TALK + var met_lensmaker = UI_get_item_flag(item, PETRA); //used to set actually met once can talk to + var read_scroll = UI_get_item_flag(item, SI_ZOMBIE); //has not read scroll + var not_submitted = UI_get_item_flag(item, CONFUSED); //read scroll, not submitted + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + av_1st_greet = "@Hello..@"; + npc_1st_greet = "@...@"; + } + else if (!gflags[SUBMITTED_TO_DRAXINUSOM]) //not submitted yet but read scroll + { + av_2nd_greet = "@Hello..@"; + npc_2nd_greet = "@Yes?@"; + + } + else //already submitted + { + av_2nd_greet = "@Hello again.@"; + npc_2nd_greet = "@Yes?@"; + + } + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + item.say("The gargoyle ignores you and continues writing."); + UI_clear_item_flag(item, MET); + sayGoodbye2(item); + return; + } + + + else if (!gflags[WEARING_AMULET_SUBMISSION]) //have read scroll but not gotten amulet + { + item.say("@Yes? To inquire about the reason for this interruption.@"); + UI_set_item_flag(item, PETRA); + } + + else + { + if (!UI_get_item_flag(item, PETRA)) //haven't met officially + { + item.say("@Yes? To inquire about the reason for this interruption.@"); + UI_set_item_flag(item, PETRA); //set when you met him + } + else + item.say("@Yes? To inquire about the reason for yet another interruption.@."); + } + + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[HALL_OF_KNOWLEDGE]) + add(["Codex", "Temple of Singularity", "Lens", "Book of Ritual"]); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@To be called the Caretaker, in lieu of a name.@*"); + say("@To be honored by being allowed to perform my duties as caretaker of this Hall.@*"); + + case "job"(remove): + say("@To care for my race's artifacts that rest here in the Hall of Knowledge.@"); + add(["Hall of Knowledge"]); + + case "Hall of Knowledge"(remove): + say("@To keep the treasured artifacts of our race here in this Hall, in the three chambers.@*"); + add(["chambers"]); + + case "chambers"(remove): + say("@To keep the treasured artifacts of our race here in this Hall, in the three chambers.@*"); + say("@To have three rooms here:@*"); + say("@To keep artifacts from the Underworld in the Human Chamber, to the east. To keep valuable books in the Librum Chamber, to the west.@*"); + say("@And to keep the Cube and the Lens in the Vortex Chamber, to the south.@*"); + add(["Underworld", "Vortex Cube", "Lens"]); + + + case "Underworld"(remove): + say("@Yes, the Underworld. To believe you know it as 'Britannia.'@*"); + + case "Vortex Cube"(remove): + say("@To regret that that item is lost, stolen by human thieves years ago.@*"); + say("@To have heard the humans mention the name Stonegate as they fled.*"); + say("@To have heard them say they would sail through Lost Hope Bay. To know nothing more about its whereabouts.@*"); + if (!gflags[TOLD_ABOUT_CUBE]) + gflags[TOLD_ABOUT_CUBE] = true; //allows you to ask about cellar with Cyclops + add(["Stonegate", "moonstones"]); + + + case "Lens"(remove): + say("@To find what you seek in the Vortex Chamber.@*"); + add(["chambers"]); + + + case "Stonegate"(remove): + say("@To suspect it to be someplace in the human-filled Underworld.@*"); + + + case "Temple of Singularity"(remove): + say("@To not be a signpost!@*"); + say("@To find the Temple of Singularity in the mountains to the north - if you can fly!@*"); + add(["fly"]); + + case "fly"(remove): + say("@To be unable to reach the mountain-locked Temple of Singularity on foot. To only be able to reach that holy place if you are a winged gargoyle.@*"); + say("@To find this most fitting and proper.@*"); + say("@To see no reason to let human riff-raff into the Temple.@*"); + + + case "moonstones"(remove): + say("@To admit ignorance regarding the location of the moonstones.@*"); + + case "bye": + say("Without another word, the gargoyle returns to his work."); + var avatar_goodbye = "@That is all..@"; + var npc_goodbye = "@...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Draxinusom.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Draxinusom.uc new file mode 100755 index 0000000..b1b8b91 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Draxinusom.uc @@ -0,0 +1,296 @@ + +void Draxinusom object# (0x4b4) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var started_talking = UI_get_item_flag(item, READ); + + + + //READ flag used to initiate conversations via TALK + var met_draxinusom = UI_get_item_flag(item, PETRA); //used to set actually met once can talk to + var read_scroll = UI_get_item_flag(item, SI_ZOMBIE); //has not read scroll + var not_submitted = UI_get_item_flag(item, CONFUSED); //read scroll, not submitted + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + if (!gflags[READ_GARGISH_SCROLL]) + { + av_1st_greet = "@Hold, gargoyle!@"; + npc_1st_greet = "@An-bal-sil-fer!@"; + } + else if (!gflags[SUBMITTED_TO_DRAXINUSOM]) + { + av_2nd_greet = "@Excuse me..@"; + npc_2nd_greet = "@False Prophet!@"; + + } + else //already submitted + { + av_2nd_greet = "@Might we speak, Draxinusom?@"; + npc_2nd_greet = "@False Prophet..@"; + + } + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A large, winged gargoyle of regal bearing.*"); + + if (!gflags[READ_GARGISH_SCROLL]) //has not read the scroll from capt. john + { + item.say("The gargoyle screams, @An-bal-sil-fer! Klep lem! Por-aylem ter-ort ka!@"); + sayGoodbyeAbrupt(item, "Ag-ra-lem! Ges por!"); //begone? Guards? + UI_clear_item_flag(item, MET); + return; + } + else if (UI_get_item_flag(item, NAKED)) //has pissed off Drax by refusing to surrender + { + item.say("@To be here to surrender?@*"); + if (askYesNo()) + { + item.say("@To be willing to die to save my people?@"); + if (askYesNo()) + { + item.say("@To grant me your life?@"); + if (askYesNo()) + { + item.say("@Why?@"); + + + } + else + { + item.say("@Begone, False Prophet! To seize you for sacrifice the instant my army returns from the Underworld!@"); + sayGoodbyeAbrupt(item, "Begone!"); + } + } + else + { + item.say("@Begone, False Prophet! To seize you for sacrifice the instant my army returns from the Underworld!@"); + sayGoodbyeAbrupt(item, "Begone!"); + } + + } + else + { + item.say("@Begone, False Prophet! To seize you for sacrifice the instant my army returns from the Underworld!@"); + sayGoodbyeAbrupt(item, "Begone!"); + } + + } + + if (UI_count_objects(PARTY, SHAPE_AMULET_SUBMISSION, QUALITY_ANY, FRAME_ANY) > 0 || gflags[SUBMITTED_TO_DRAXINUSOM]) //already submitted to Drax + { + item.say("@To be honored by your presence, noble " + player_name + ". To feel sorrow that matters of state prevent conversation.@*"); + item.say("@To summon you when proper time for your sacrifice has come.@"); + sayGoodbyeAbrupt(item, "To summon you when it's time."); + return; + + } + + else if (!UI_get_item_flag(item, PETRA)) //has read scroll but not officially met yet + { + if (inParty(BEHLEM)) //beh lem in party but hasn't officially met yet + { + item.say("@To refrain from slaying you only because of the presence of the child, False Prophet!@*"); + + } + else + item.say("@To express astonishment at your audacity, False Prophet!@"); + UI_set_item_flag(item, PETRA); + } + else + item.say("@To demand to know why you have returned here, False Prophet!@"); + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[ASK_TO_SUBMIT]) //Valkadesh told him about submitting + add("sacrifice"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@To be named Draxinusom, leader of our race.@*"); + say("@To demand to know why you have come before me!@*"); + + case "job"(remove): + say("@To be the leader of our race. To have little time to waste chatting with the False Prophet!@"); + + case "sacrifice"(remove): //only if asked Valkadesh about submitting + say("The gargoyle shows you a crystal amulet dangling from a leather cord.*"); + say("@Hsss....To consent to wear this?@*"); + if (inParty(DUPRE)) + { + DUPRE.say("Trusted Dupre whispers frantically to you, @You musn't! It's some sort of magical trap!@"); + DUPRE.hide(); + } + say("The gargoyle waits impatiently for an answer.*"); + say("@Yes or no, False Prophet?@"); + if(askYesNo()) + { + say("The gargoyle hands you the amulet, and you slip the leather loop over your head."); + say("@To surprise me with the nobility of your deed. To no longer be a threat to my people.@"); + say("@To bid you to travel among my people, talk to them, learn our ways.@"); + say("@To inform you when the time of your sacrifice has come.@"); + if (UI_get_readied(AVATAR, BG_AMULET)) + { + + //transfer neck item Avatar is wearing to Holderguy + transferNeckItems(AVATAR, HOLDERGUY); //This actually now places item on ground + + //add amulet of submission + if (UI_add_party_items(1, SHAPE_AMULET_SUBMISSION, QUALITY_ANY, 0, false)) + UI_error_message("Amulet of submission should be added to Avatar"); + else + { + UI_error_message("Something went wrong, did not create Amulet of Submission!"); + UI_add_party_items(1, SHAPE_AMULET_SUBMISSION, QUALITY_ANY, 0, false); //try again + + } + //transfer neck item back to Avatar's pouch + // transferNeckItems(HOLDERGUY, AVATAR); //DISABLED + + UI_error_message("Avatar is wearing an amulet, moving it"); + gflags[SUBMITTED_TO_DRAXINUSOM] = true; + gflags[WEARING_AMULET_SUBMISSION] = true; + + //set gargoyles to id 2 - read scroll, submitted + UI_set_npc_id(FARMER_NASH, 2); + sayGoodbye2(item); + } + else + { + UI_error_message("Avatar is NOT wearing an amulet"); + + if (UI_add_party_items(1, SHAPE_AMULET_SUBMISSION, QUALITY_ANY, 0, false)) + UI_error_message("Amulet of submission should be added to Avatar"); + else + UI_error_message("Something went wrong, did not create Amulet of Submission!"); + + gflags[SUBMITTED_TO_DRAXINUSOM] = true; //when wearing the amulet + UI_clear_item_flag(item, NAKED); //cleared angry flag + UI_clear_item_flag(NAXATILOR, CONFUSED); //cleared so Nax will talk to you + sayGoodbye2(item); + } + break; + } + else + { + say("@To be To be necessary for surrender! To ask again for your acceptance of this.@ Your answer:"); + if(askYesNo()) + { + say("The gargoyle hands you the amulet, and you slip the leather loop over your head."); + say("@To surprise me with the nobility of your deed. To no longer be a threat to my people.@"); + say("@To bid you to travel among my people, talk to them, learn our ways.@"); + say("@To inform you when the time of your sacrifice has come.@"); + //another neckpiece is worn, place ito n the ground + if (UI_get_readied(AVATAR, BG_AMULET)) + { + + //transfer neck item Avatar is wearing to Ground + transferNeckItems(AVATAR, HOLDERGUY); //This actually now places item on ground + + //add amulet of submission + if (UI_add_party_items(1, SHAPE_AMULET_SUBMISSION, QUALITY_ANY, 0, false)) + UI_error_message("Amulet of submission should be added to Avatar"); + else + UI_error_message("Something went wrong, did not create Amulet of Submission!"); + + UI_error_message("Avatar is wearing an amulet, moving it"); + gflags[SUBMITTED_TO_DRAXINUSOM] = true; + + //set gargoyles to id 2 - read scroll, submitted + UI_set_npc_id(FARMER_NASH, 2); + sayGoodbye2(item); + } + else + UI_add_party_items(1, SHAPE_AMULET_SUBMISSION, QUALITY_ANY, FRAME_ANY); + gflags[SUBMITTED_TO_DRAXINUSOM] = true; //when wearing the amulet + break; + } + else + { + say("@Begone, False Prophet! To seize you for sacrifice the instant my army returns from the Underworld!@"); + UI_set_item_flag(item, NAKED); //used for when Drax is mad and demands you surrender next time + sayGoodbyeAbrupt(item, "To die soon for thy crimes, False Prophet!"); + break; + } + + } + + + + case "bye": + + say("@To have known it all along! To be a fool for trusting the False Prophet for a moment!@"); + say("@Flee, False Prophet! To seize you for sacrifice the instant my army returns from the Underworld!@"); + var avatar_goodbye = "@I'll just be going now...@"; + var npc_goodbye = "@Begone, False Prophet!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/FarmerKrill.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/FarmerKrill.uc new file mode 100755 index 0000000..120ce45 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/FarmerKrill.uc @@ -0,0 +1,206 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + +void FarmerKrill object# (0x4bb) () +{ + + var avatar_bark; + var npc_bark; + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var time_of_day = timeFunction(hour); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + var wearing_amulet = isWearingAmulet(); + + + if (event == DOUBLECLICK) + { + //Avatar hasn't used the scroll, hasn't submitted to Drax, and can't understand gargoyles yet: + + if (!isWearingAmulet()) //Avatar has not submitted to Drax yet + { + UI_error_message("Farmer Krll !submit to drax"); + if (UI_get_npc_id(item, 1)) //read the scroll and can understand them + { + + //Avatar and NPC greeting barks + var av_1st_greet = "@Hold, gargoyle!@"; + var npc_1st_greet = "@The False Prophet! Workers, attack!@"; + + var av_2nd_greet = "@Hold, gargoyle!@"; + var npc_2nd_greet = "@The False Prophet! Workers, attack!@"; + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + + + } + + else + { + UI_error_message("Krill ID 0"); + //Avatar and NPC greeting barks + var av_1st_greet = "@Hold, gargoyle!@"; + var npc_1st_greet = "@An-bal-sil-fer! Des-lem, klep lem!@"; + + var av_2nd_greet = "@Greetings..@"; + var npc_2nd_greet = "@An-bal-sil-fer! Des-lem, klep lem!@"; + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + + } + + + + + } + else + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hail, gargoyle.@"; + var npc_1st_greet = "@To greet you, False Prophet..@"; + + var av_2nd_greet = "@Farmer Krill..@"; + var npc_2nd_greet = "@To greet you again, False Prophet.@"; + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + + } + + if (started_talking) + { + UI_set_schedule_type(SHY); + UI_run_schedule(item); + if (!isWearingAmulet()) //Avatar has not submitted to Drax yet + { + if (UI_get_npc_id(item, 1)) + item.say("The gargoyle screams, @The False Prophet! Workers, attack!@"); + + else //npc id is 0 + item.say("The gargoyle screams, @An-bal-sil-fer! Des-lem, klep lem!@"); + + var wingless_gargs = UI_find_nearby(FARMER_KRILL, 883, 30, MASK_NONE); + var gargcount = 0; + + for (npc in wingless_gargs) + { + UI_set_alignment(npc, EVIL); + UI_set_schedule_type(npc, IN_COMBAT); + gargcount += 1; + UI_error_message("Wingless gargoyles found are" + gargcount); + } + return; + } + else + { + + if (!UI_get_item_flag(item, MET)) + { + item.say("A large, healthy-looking winged gargoyle."); + item.say("@To note that you wear the Amulet of Submission. To admire your courage and to appreciate your sacrifice.@"); + item.say("@To ask your name, that I may address you in a noble manner?@"); + var name = chooseFromMenu(["I am " + player_name]); + item.say("@To greet you, " + player_name + ".@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Good " + time_of_day + ", noble " + player_name + ". To be pleased by your return!@"); + } + //standard conversation options + var options = ["name", "job", "bye"]; + + if (inParty(BEHLEM)) + add("Beh Lem"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@To be named Krill Us-arb-vas-lem, Krill the Leader of Farmers.@*"); + + + case "job"(remove): + say("@To lead the wingless ones, the worker gargoyles who tend these fields.@"); + say("@To have great fortune in my harvests!@"); + add(["wingless ones", "harvests"]); + + case "guidance"(remove): + say("@To be forced by necessity to give the wingless ones no room for choice or freedom.@*"); + add(["freedom"]); + + case "Beh Lem"(remove): + say("@Beh Lem? To be but a child. To someday grow wings just like his father, Scholar Valkadesh.@*"); + add(["Valkadesh"]); + + case "Valkadesh"(remove): + say("@To admire the wisdom of Scholar Valkadesh, but to consider his studies unseemly.@*"); + add(["studies"]); + + case "studies"(remove): + say("@To abhor his continued study of the accursed humans!@*"); + say("The gargoyle pauses, embarrassed.*"); + say("@To mean no offense to you, " + player_name + ". To acknowledge the nobility of your sacrifice.@*"); + say("@To consider you a great credit to your race!@"); + + case "freedom"(remove): + say("@To acknowledge that it may seem harsh, but to assure you that there is no other way to treat the wingless ones.@*"); + + case "wingless ones"(remove): + say("@To consider them valuable members of society who need firm control and strong leadership. To explain that they are far less intelligent than you or I.@*"); + + case "harvests"(remove): + say("@To receive bountiful harvests thanks to the efforts of my well-directed workers.@*"); + say("@To feed my workers far better than misguided Farmer Nash to the east does.@"); + add(["Farmer Nash"]); + + case "Farmer Nash"(remove): + say("@To be ashamed that Nash lacks common sense. To be appalled by his uncontrolled heart and undirected mind.@*"); + say("@To point out his unproductive fields as an example of why the wingless ones need firm guidance.@"); + add(["guidance"]); + + case "bye": + say("@To have greatly enjoyed this conversation, noble " + player_name + "!@"); + + var avatar_goodbye = "@So long..@"; + var npc_goodbye = "@To bid you farewell!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Farmer_Nash.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Farmer_Nash.uc new file mode 100755 index 0000000..ae727ae --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Farmer_Nash.uc @@ -0,0 +1,152 @@ +void FarmerNash object# (0x4bd) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var FarmerNashID = UI_get_npc_id(item); + + var wingless_gargs; + var gargcount; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (event == DOUBLECLICK) + { + if (!gflags[READ_GARGISH_SCROLL]) + { + //Avatar and NPC greeting barks + delayedBark(AVATAR, "@Hold, gargoyle!@", 0); + delayedBark(FARMER_NASH, "@An-bal-sil-fer! Des-lem, klep lem!@", 3); + wingless_gargs = UI_find_nearby(FARMER_KRILL, 883, 30, MASK_NONE); + gargcount = 0; + + for (npc in wingless_gargs) + { + UI_set_alignment(npc, EVIL); + UI_set_schedule_type(npc, IN_COMBAT); + gargcount += 1; + UI_error_message("Wingless gargoyles found are" + gargcount); + } + + UI_clear_item_flag(item, MET); + return; + } + else if (FarmerNashID == 1) + { + delayedBark(AVATAR, "@Hold, gargoyle!@", 0); + delayedBark(FARMER_NASH, "@The False Prophet! Workers, attack!@", 3); + wingless_gargs = UI_find_nearby(FARMER_KRILL, 883, 30, MASK_NONE); + gargcount = 0; + + for (npc in wingless_gargs) + { + UI_set_alignment(npc, EVIL); + UI_set_schedule_type(npc, IN_COMBAT); + gargcount += 1; + UI_error_message("Wingless gargoyles found are" + gargcount); + } + + UI_clear_item_flag(item, MET); + return; + } + else if (FarmerNashID == 2) + { + av_1st_greet = "@Hold, gargoyle!@"; + npc_1st_greet = "@To be amazed!@"; + + av_2nd_greet = "@Hello again.@"; + npc_2nd_greet = "@To be honored by your visit.@"; + + } + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + + + } + + if (started_talking) + { + + if (!UI_get_item_flag(item, MET)) + { + item.say("A gaunt, tired-looking winged gargoyle.*"); + item.say("@To greatly admire your nobility, False Prophet. To honor my people with your sacrifice!@"); + item.say("@To ask your name, that I may address you as you deserve?@"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + + if (avatar_or_name == "I am the Avatar") + item.say("@To be honored by your visit, Avatar.@"); + + else if (avatar_or_name == ("I am " + player_name)) + say("@To be honored by your visit, ", player_name, ".@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Good " + time_of_day + ", noble " + player_name + ". To be honored by another visit!@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// +// Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@To be named Nash Us-arb-vas-lem, Nash the Leader of Farmers.@*"); + add(["leader"]); + + case "job"(remove): + say("@To lead the wingless ones, the worker gargoyles who tend these fields.@"); + say("@But to have little fortune in my harvests.@"); + add(["wingless", "harvests"]); + + case "leader"(remove): + say("@To try to give the wingless ones free reign, but to be forced to guide them in their work.@*"); + + case "wingless"(remove): + say("@To be far kinder to the wingless ones than most of my kind.@*"); + say("@To feel that the wingless ones should not be enslaved simply because they lack our intelligence.@*"); + + case "harvests"(remove): + say("@To be forced, on occasion, to tend the fields myself because of the harshness of the times.@*"); + say("@To wish my fields were as productive as those of Farmer Krill, my neighbor to the west.@*"); + add(["Farmer Krill"]); + + case "Farmer Krill"(remove): + say("@To be ashamed that Farmer Krill treats his workers so harshly.@*"); + say("@To be appalled by his lack of concern for their thoughts and feelings.@*"); + + case "bye": + say("@To have been greatly honored by this conversation , noble " + player_name + ".@"); + + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@To have a good day.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Foodmaker.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Foodmaker.uc new file mode 100755 index 0000000..396614e --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Foodmaker.uc @@ -0,0 +1,238 @@ + +void Foodmaker object# (0x4b9) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (party == 1) + greeting = "You eat"; + else + greeting = "Your party eats"; + + //Used if special barks needed, otherwise delete + /* + if (event == PROXIMITY) + { + //barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@Insert line here..@", 0); + delayedBark(item, "@Insert line here@", 8); + delayedBark(item, "@Insert line here@", 16); + } + else if (barks == 2) + delayedBark(item, "@Other lines...@", 2); + else + delayedBark(item, "@Other lines...@", 3); + } + */ + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + av_1st_greet = "@Hail, gargoyle!@"; + npc_1st_greet = "@An-bal-sil-fer!!@"; + } + else if (!gflags[SUBMITTED_TO_DRAXINUSOM]) //not submitted yet but read scroll + { + av_2nd_greet = "@Might we speak again?@"; + npc_1st_greet = "@The False Prophet!!@"; + npc_2nd_greet = "@The False Prophet!!@"; + + } + else //already submitted + { + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@To welcome you back, False Prophet!@"; + + } + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A large and boisterous gargoyle. He carries a 'knife' large enough to be a sword!"); + if (gflags[!READ_GARGISH_SCROLL]) + { + item.say("@An-bal-sil-fer!@ the gargoyle shouts. @Gres por! Gres por!@"); + if (inParty(IOLO)) + { + IOLO.say("Half-jokingly, Iolo says, @We'd better do as he says. After all, we don't know what kind of meat that is!@"); + IOLO.hide(); + } + sayGoodbyeAbrupt(item, "@Gres por! Gres por!"); + UI_clear_item_flag(item, MET); + return; + + } + else //read gargoyle scroll + { + if (gflags[!SUBMITTED_TO_DRAXINUSOM]) //not wearing amulet of submission + { + item.say("@The False Prophet!@ the gargoyle shouts. @Begone, begone!@"); + if (inParty(IOLO)) + { + IOLO.say("Half-jokingly, Iolo says, @We'd better do as he says. After all, we don't know what kind of meat that is!@"); + IOLO.hide(); + } + UI_clear_item_flag(item, MET); + sayGoodbyeAbrupt(item, "@Begone! Begone!"); + return; + } + else + { + if (UI_get_item_flag(item, MET)) + item.say("@The False Prophet! To welcome you to my place of cooking.@"); + else + item.say("@To welcome you back, False Prophet!@"); + item.say("@To offer you the best food in all the world!@"); + + } + } + + //standard conversation options + var options = ["name", "job", "bye", "food"]; + + if (UI_get_item_flag(GOODSCRAFTER, MET)) + add ("Goodscrafter"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@To be called Foodmaker, not having a name yet. But to be the finest cook in the land!@*"); + say("@To receive a name someday soon for my skill!@*"); + + case "job"(remove): + say("@To cook and serve food for all the gargoyles who live in these parts!@"); + say("@Also to guide and instruct the wingless ones in cooking chores.@"); + add(["wingless"]); + + case "food"(remove): + if (!UI_get_schedule_type(item, TEND_SHOP)) + say("@To not have food on me. To have you visit my shop.@"); + else + { + say("@Yes, yes! To offer you this finely roasted meat!@*"); + say("With a few strokes of his huge knife, the gargoyle cuts you a slice of meat.*"); + say("Do you take the meat?"); + if (askYesNo()) + { + if (UI_add_party_items(partynum, SHAPE_HORSEFLESH, QUALITY_ANY, FRAME_ANY, false)) + { + say(greeting + " the profferred food. The flavor is unlike anything you've had before."); + if (inParty(IOLO)) + { + UI_set_item_flag(IOLO, SI_ZOMBIE); //Iolo ate Smith's cousin!! ;) + IOLO.say("Iolo speaks. @I wonder what sort of meat that is, " + player_name + ".@"); + IOLO.hide(); + } + say("The gargoyle beams with pride. @To ask you: Is it not the best meat you have ever eaten?@"); + } + else + say("@To not be able to carry this!@"); + } + else + { + say("@To be saddened by your not liking!@*"); + say("@To know of no finer cooker of horseflesh than myself!@*"); + + } + add("meat", "wine and grapes"); + } + + + + case "meat"(remove): + say("@To be famous among all gargoyles for the quality of my horseflesh!@*"); + if (UI_get_item_flag(IOLO, SI_ZOMBIE)) //Iolo ate a sample already.. + { + IOLO.say("@I think I'm going to be sick...@"); + IOLO.say("@...Smith should never knowest about this...@"); + IOLO.hide(); + UI_clear_item_flag(IOLO, SI_ZOMBIE); + gflags[IOLO_HATES_HORSEFLESH] = true; //he won't eat it again + } + + case "Goodscrafter"(remove): + say("@The goodscrafter? To be pathetic!@ the huge gargoyle scowls.*"); + say("@To have self-pity, when strength and long work will give success!@*"); + say("@To wish to hear no more about that creature.@*"); + + case "wingless"(remove): + say("@To have to watch their every move! But to acknowledge that they are vital to our society.@*"); + + + case "wine and grapes"(remove): + say("@Well, yes, of course to have that as well. But to be famous for my roast horseflesh!@*"); + say("@To offer you some of this fine food!@*"); + add(["food"]); + + case "bye": + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@To bid you farewell!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Goodscrafter.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Goodscrafter.uc new file mode 100755 index 0000000..f787f18 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Goodscrafter.uc @@ -0,0 +1,183 @@ + +void Goodscrafter object# (0x4ba) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var started_talking = UI_get_item_flag(item, READ); + + + + //READ flag used to initiate conversations via TALK + var met_lensmaker = UI_get_item_flag(item, PETRA); //used to set actually met once can talk to + var read_scroll = UI_get_item_flag(item, SI_ZOMBIE); //has not read scroll + var not_submitted = UI_get_item_flag(item, CONFUSED); //read scroll, not submitted + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + av_1st_greet = "@Hold, gargoyle!@"; + npc_1st_greet = "@An-bal-sil-fer...@"; + } + else if (!gflags[SUBMITTED_TO_DRAXINUSOM]) //not submitted yet but read scroll + { + av_1st_greet = "@Hold, gargoyle!@"; + av_2nd_greet = "@Hold, gargoyle!@"; + npc_1st_greet = "@False Prophet...@"; + npc_2nd_greet = "@False Prophet...@"; + + } + else //already submitted + { + av_1st_greet = "@Hold, gargoyle!@"; + av_2nd_greet = "@Might we speak again?@"; + npc_1st_greet = "@False Prophet...@"; + npc_2nd_greet = "@What now, False Prophet?@"; + + } + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + item.say("@An-bal-sil-fer,@ the gargoyle says calmly.*"); + item.say("@Sum in-korp i. Vers.@"); + item.say("The gargoyle silently awaits his fate."); + script item after 3 ticks say "@...@"; + UI_clear_item_flag(item, MET); + sayGoodbye2(item); + return; + } + + + else if (!gflags[WEARING_AMULET_SUBMISSION]) //have read scroll but not gotten amulet + { + item.say("@Oh, the False Prophet,@ the gargoyle says calmly.*"); + item.say("@To suppose that you have come to kill me as well. All right.@"); + UI_set_item_flag(item, MET); + } + + else + { + item.say("@To ask why you disturb me again, False Prophet.@"); + if (isWearingAmulet()) + { + item.say("@To see the Amulet of Submission. To suppose, then, that my world has been saved.@"); + item.say("@But to feel that salvation has come too late.@"); + add("late"); + } + } + + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(item, PETRA)) //set by Healer when asked about him + add(["family"]); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@To not have a name.@*"); + say("@To have nothing at all now...@*"); + + case "job"(remove): + say("@To be a goodscrafter. Though to have no reason to make goods now.@"); + add(["goods"]); + + case "late"(remove): + say("@To refuse to discuss my grief with the being who caused it.@*"); + add(["grief"]); + + + case "grief"(remove): + say("@Surely to know what pain you have caused by stealing the Codex?@*"); + say("@To not believe that you care. To believe, in fact, that you enjoy causing suffering.@*"); + add(["suffering"]); + + + case "suffering"(remove): + say("@To not believe that you would do anything to help.@*"); + + case "goods"(remove): + say("@To invite you to take what you want.@*"); + + case "family"(remove): + say("@To have lost my entire family in the cataclysms.@*"); + add(["cataclysms"]); + + + case "cataclysms"(remove): + say("@To wish not to speak of it.@*"); + + + case "bye": + + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@To wait here for you to return to kill me.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Healer.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Healer.uc new file mode 100755 index 0000000..126ef09 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Healer.uc @@ -0,0 +1,308 @@ + +void Healer object# (0x4b7) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var injuredcnt; + var injurednpc = ["no one"]; + var potionhealth; + var drink_potion = false; + var poisonedParty = 0; + + + var potionsdrank = 0; + + if (potionsdrank == 0) + potionhealth = "deathly ill!"; + else if (potionsdrank == 1) + potionhealth = "slightly dizzy!"; + else + potionhealth = "restored!"; + + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var started_talking = UI_get_item_flag(item, READ); + + + + //READ flag used to initiate conversations via TALK + var met_lensmaker = UI_get_item_flag(item, PETRA); //used to set actually met once can talk to + var read_scroll = UI_get_item_flag(item, SI_ZOMBIE); //has not read scroll + var not_submitted = UI_get_item_flag(item, CONFUSED); //read scroll, not submitted + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + av_1st_greet = "@Greetings, gargoyle!@"; + npc_1st_greet = "@To be unwilling to help you, False Prophet.@"; + } + else if (!gflags[SUBMITTED_TO_DRAXINUSOM]) //not submitted yet but read scroll + { + av_1st_greet = "@Greetings, gargoyle!@"; + av_2nd_greet = "@Greetings, gargoyle!@"; + npc_1st_greet = "@To be unwilling to help you, False Prophet.@"; + npc_2nd_greet = "@To wish to help you however I can.@"; + + } + else //already submitted + { + av_1st_greet = "@Hold, gargoyle!@"; + av_2nd_greet = "@Might we speak again?@"; + npc_1st_greet = "@To wish to help you however I can.@"; + npc_2nd_greet = "@To wish to help you however I can.@"; + + } + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + item.say("@An in mani u lem, An-bal-sil-fer.@"); + item.say("The gargoyle says nothing else."); + UI_clear_item_flag(item, MET); + sayGoodbye2(item); + return; + } + + + else if (!gflags[WEARING_AMULET_SUBMISSION]) //have read scroll but not gotten amulet + { + item.say("@To be unwilling to help you, False Prophet. To be a healer, a being of peace.@*"); + item.say("@Elsewise, to summon the guards to slay you!@ The gargoyle says nothing else."); + UI_clear_item_flag(item, MET); + sayGoodbye2(item); + return; + } + + else + { + if (!isWearingAmulet()) //not wearing amjulet + { + if (!UI_get_item_flag(item, MET)) //haven't met officially + { + item.say("@To be unwilling to help you, False Prophet. To be a healer, a being of peace.@*"); + item.say("@Elsewise, to summon the guards to slay you!@ The gargoyle says nothing else."); + UI_clear_item_flag(item, MET); + sayGoodbye2(item); + return; + } + + } + else + { + if (!UI_get_item_flag(item, MET)) + { + item.say("@To see the amulet, the symbol of your courage and nobility. To wish to help you however I can.@"); + UI_set_item_flag(item, MET); + } + else + item.say("@To be happy to see you again, noble one. But to be sad that you seek my services.@"); + } + } + + + + //standard conversation options + var options = ["name", "job", "bye"]; + + // if (UI_get_item_flag(NAXATILOR, MET)) + // add ("Naxatilor"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@To be nameless, being only a healer.@"); + + case "job"(remove): + say("@To be entrusted with the tasks of healing those wounded and curing those sick.@"); + say("@To do this for all, as a service to society.@"); + add(["heal", "cure", "resurrect"]); + + case "heal"(remove): + + for (npc in party) + { + injurednpc << npc; + var npchealth = UI_get_npc_prop(npc, HEALTH); + var npcstrength = UI_get_npc_prop(npc, STRENGTH); + if (npchealth != npcstrength) + { + injurednpc << npc; + injuredcnt+= 1; + + } + } + say("@Which of you?@*"); + var choice = chooseFromMenu(injurednpc); + say("The gargoyle mixes strange powders into a foul-smelling brew."); + say(choice + " drinks the potion and feels " + potionhealth); + if (potionsdrank >= 3) + { + var choiceStr = UI_get_npc_prop(item, STRENGTH); + var choiceHealth = UI_get_npc_prop(item, HEALTH); + var addhealth = UI_set_npc_prop(item, HEALTH, (choiceStr - choiceHealth)); + } + potionsdrank+= 1; + + + + + case "cure"(remove): + + if (!UI_get_schedule_type(item, TEND_SHOP)) + say("@To ask that you see me at my shop.@*"); + else + { + var party_member; + for (npc in party) + { + if (UI_get_item_flag(npc, POISONED)) + { + party_member = npc; + poisonedParty += 1; + } + + } + if (poisonedParty > 0) + { + + var poisonedName = UI_get_npc_name(party_member); + say("@The gargoyle mixes strange powders into a foul-smelling brew.@*"); + say("@To drink this and be healthy.@*"); + drink_potion = true; + while (drink_potion) + { + say("@Does " + poisonedName + " drink it?@*"); + if (askYesNo()) + { + if (potionsdrank == 0) + potionhealth = "deathly ill!"; + else if (potionsdrank == 1) + potionhealth = "slightly dizzy!"; + else + potionhealth = "restored!"; + + + if (poisonedParty == AVATAR) + say("You drink the potion and feel " + potionhealth); + else + say("" + poisonedName + " drinks the potion and feels " + potionhealth); + potionsdrank += 1; + if (potionsdrank < 3) + { + say("@To apologize for the error! But to know exactly what I did wrong.@"); + say("The gargoyle mixes a different drink that somehow smells worse than the last."); + } + else + { + UI_clear_item_flag(party_member, POISONED); + drink_potion = false; + break; + } + + } + else + { + say("The gargoyle shrugs. @To assure you that it is safe and invigorating. But not to force anyone to act against their will.@"); + drink_potion = false; + } + + } + + } + else say("To be unfamiliar with human anatomy...But to be certain that all of you are well!@"); + } + case "resurrect"(remove): + say("@To ask me to raise the dead? To apologize, but that is beyond my power.@"); + say("@To doubt that anyone can do that!@*"); + + + case "Goodscrafter"(remove): + say("@The goodscrafter? To regret his condition. To know that he is in great pain after the loss of his family.@"); + if (!UI_get_item_flag(GOODSCRAFTER, PETRA)) + UI_set_item_flag(GOODSCRAFTER, PETRA); //to open up convo on Goodscrafter + add(["family"]); + + + case "family"(remove): + say("@To know that his family was lost when the edges of the world fell off.@*"); + say("@But to have less and less patience for his dispassionate self-pity.@*"); + add(["fell"]); + + + case "fell"(remove): + say("@Yes, during the cataclysms. To have lost friends myself during that bad time.*@"); + say("@But to maintain the struggle for life diligently!@*"); + + + case "bye": + + var avatar_goodbye = "@So long..@"; + var npc_goodbye = "@To bid you farewell.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Lensmaker.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Lensmaker.uc new file mode 100755 index 0000000..f82c793 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Lensmaker.uc @@ -0,0 +1,194 @@ + +void Lensmaker object# (0x4bc) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var started_talking = UI_get_item_flag(item, READ); + + + + //READ flag used to initiate conversations via TALK + var met_lensmaker = UI_get_item_flag(item, PETRA); //used to set actually met once can talk to + var read_scroll = UI_get_item_flag(item, SI_ZOMBIE); //has not read scroll + var not_submitted = UI_get_item_flag(item, CONFUSED); //read scroll, not submitted + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + av_1st_greet = "@Hold, gargoyle!@"; + npc_1st_greet = "@!!!!!@"; + } + else if (!gflags[SUBMITTED_TO_DRAXINUSOM]) //not submitted yet but read scroll + { + av_2nd_greet = "@Hold, gargoyle!@"; + npc_2nd_greet = "@!!!!!@"; + + } + else //already submitted + { + av_2nd_greet = "@Excuse me..@"; + npc_2nd_greet = "@To be honored, False Prophet..@"; + + } + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + item.say("A very old gargoyle.*"); + item.say("The gargoyle gasps in terror and wheezes, @An-bal-sil-fer!@"); + item.say("...then he faints dead away!"); + UI_set_item_flag(item, ASLEEP); + UI_set_schedule_type(item, SLEEP); + sayGoodbye2(item); + return; + } + + + else if (!gflags[WEARING_AMULET_SUBMISSION]) //have read scroll but not gotten amulet + { + item.say("A very old gargoyle.*"); + item.say("The gargoyle gasps in terror and wheezes, @False Prophet!@"); + item.say("...then he faints dead away!"); + UI_set_item_flag(item, ASLEEP); + UI_set_schedule_type(item, SLEEP); + sayGoodbye2(item); + return; + } + + else + { + if (!UI_get_item_flag(item, PETRA)) //haven't met officially + { + item.say("The venerable gargoyle peers at you."); + item.say("@Greetings, False Prophet.@"); + item.say("@To have been told by Naxatilor, long ago, that the you would one day come to me, wearing the Amulet of Submission.@"); + item.say("@To never have believed it would come to pass. To ask what service I can perform?@"); + UI_set_item_flag(item, PETRA); //set when you met him + } + else + item.say("@To ask how again I may help you?@"); + } + + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(NAXATILOR, MET)) + add ("Naxatilor"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@To lack a name, of course. But to be called Lor-wis-lem, the scholar of light, by many learned gargoyles.@*"); + say("As he says this, the ancient gargoyle beams with pride."); + + case "job"(remove): + say("@To craft the finest lenses in the land,@ the gargoyle says proudly."); + say("@Also to teach my young apprentices not to cut themselves on the glass!@"); + add(["apprentices"]); + + case "apprentices"(remove): + say("@To be nearing the end of my time.@*"); + say("@To have one last sacred duty: To pass on my skill to the next generation.@*"); + add(["time"]); + + case "time"(remove): + say("@To be over a thousand years old. To seem a mere youth compared to Naxatilor, however.@*"); + + case "Naxatilor"(remove): + say("@To have helped Naxatilor create the Vortex Lens, centuries ago. To have found him venerable and ancient even then!@*"); + if (!UI_get_item_flag(item, NAKED)) + add(["Vortex Lens"]); + + case "Vortex Lens"(remove): + if (UI_count_objects(PARTY, SHAPE_LENS, QUALITY_ANY, FRAME_BROKEN_LENS) > 0) // Has broken lens + { + say("@To see the shattered Vortex Lens you carry. To remember making it, so very long ago.@*"); + say("Taking the shards of glass, the lensmaker turns to his grinding table. In a short while, he has crafted a new Vortex Lens!*"); + say("@To have far greater skill now than when first I made this lens,@ he says smugly. @To require little time to repair it.@*"); + say("He hands you the restored Vortex Lens*"); + UI_clear_item_flag(item, SI_ZOMBIE); //clears flag when he no longer needs broken lens + UI_set_item_flag(item, NAKED); //set to keep from getting more lenses + UI_add_party_items(1, SHAPE_LENS, QUALITY_ANY, FRAME_GARGISH_LENS); + UI_remove_party_items(1, SHAPE_LENS, QUALITY_ANY, FRAME_BROKEN_LENS); + } + + else + { + say("@To remember little from so long ago,@ the gargoyle croaks.@*"); + say("@To require the pieces of the lens in order to make a new copy.@*"); + UI_set_item_flag(item, SI_ZOMBIE); //set so he'll ask about the lens next time + } + + case "bye": + + var avatar_goodbye = "@Farewell, Lensmaker..@"; + var npc_goodbye = "@To be honored to have helped you, False Prophet.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Naxatilor.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Naxatilor.uc new file mode 100755 index 0000000..f0d3117 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Naxatilor.uc @@ -0,0 +1,328 @@ + +void Naxatilor object# (0x4b6) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var AvatarKarma = UI_get_npc_id(AVATAR); // gets current karma + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var started_talking = UI_get_item_flag(item, READ); + + + + //READ flag used to initiate conversations via TALK + var met_lensmaker = UI_get_item_flag(item, PETRA); //used to set actually met once can talk to + var read_scroll = UI_get_item_flag(item, SI_ZOMBIE); //has not read scroll + var not_submitted = UI_get_item_flag(item, CONFUSED); //read scroll, not submitted + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + av_1st_greet = "@Hail, gargoyle!@"; + npc_1st_greet = "@.....@"; + } + else if (!gflags[SUBMITTED_TO_DRAXINUSOM]) //not submitted yet but read scroll + { + av_2nd_greet = "@Hail, gargoyle!@"; + npc_2nd_greet = "@To go away, False Prophet.@"; + + } + else //already submitted + { + av_2nd_greet = "@Naxatilor..@"; + npc_2nd_greet = "@To greet you, Avatar.@"; + + } + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (UI_count_objects(PARTY, SHAPE_LENS, QUALITY_ANY, FRAME_BROKEN_LENS) > 0) // Has broken lens + { + item.say("@Yes, to see that the Vortex Lens is no longer whole.@"); + item.say("@To go to the lensmaker, whos house is northeast of here.@"); + item.say("@To get the lens repared there! Then return here with the whole lens!@"); + sayGoodbyeAbrupt(item, "To make haste, human!"); + return; + } + + //once Nax tells you to get the lens and read the book, he won't talk until you do + else if (UI_get_item_flag(item, NAKED)) + { + if (UI_count_objects(PARTY, SHAPE_LENS, QUALITY_ANY, 1) > 0) //Has fixed lens + { + item.say("@Good, to see that you have the Vortex Lens.@"); + item.say("@To have read the Book of Ritual as well?@"); + if (askYesNo()) + { + if (!gflags[READ_BOOK_RITUAL]) + { + subtractKarma(10); + } + item.say("@Good. To be unable to reverse the ritual myself.@"); + item.say("@But to know that the Codex itself will say how to return it to the Vortex.@"); + item.say("@To know also that you will need a second lens. To require a human-crafted lens, so that your people may also see the Codex.@"); + UI_clear_item_flag(item, NAKED); //Nax will speak to you after getting the required lenses and reading book of ritual + gflags[GET_HUMAN_LENS] = true; //told to get human lens + add(["Codex", "lens"]); + } + else //not read the book + { + say("@Then go to the Hall of Knowledge and do so!@"); + sayGoodbyeAbrupt(item, "To read the book!"); + return; + } + + } + else + { + item.say("@To require the Vortex Lens, foolish human!@"); + item.say("@To waste no more time! To go to the Hall of Knowledge and get the lens!@"); + item.say("@To bring it to me personally, Avatar!@"); + sayGoodbyeAbrupt(item, "To get the Lens!"); + return; + } + } + + else if (!gflags[READ_GARGISH_SCROLL]) //not read scroll yet + { + item.say("A dark, rough-skinned gargoyle.*"); + item.say("The venerable gargoyle does not acknowledge your presence.*"); + sayGoodbye2(item); + return; + } + + + else if (!gflags[SUBMITTED_TO_DRAXINUSOM]) //have read scroll but not gotten amulet + { + item.say("A dark, rough-skinned gargoyle.*"); + item.say("@To have nothing to say to you, False Prophet!@"); + sayGoodbye2(item); + return; + } + + else + { + if (!UI_get_item_flag(item, PETRA)) //haven't met officially + { + + item.say("@To greet you, " + player_name + ", Avatar of the Underworld.@*"); + item.say("@To see the Amulet of Submission around your neck. To consider this your acceptance of this both noble and wise.@"); + if (AvatarKarma < 40) + item.say("@To observe by your aura that such honorable deeds are rare for you. To not be surprised, then, that you are fated to destroy a world.@"); + if ((AvatarKarma > 40) && (AvatarKarma < 80)) + item.say("@To observe by your aura that you are not a being of evil. To regret for your sake, then, that you are fated to destroy a world.@"); + if (AvatarKarma >= 80) + item.say("@To observe by your aura that you are truly a being of honor. To be surprised, then, that you are fated to destroy a world.@"); + UI_set_item_flag(item, PETRA); //"met" officially + add(["fated"]); + + } + else + item.say("@To greet you again, " + player_name + "@"); + } + + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[ASK_TO_SUBMIT] && gflags[SUBMITTED_TO_DRAXINUSOM] && !gflags[START_CODEX_QUEST]) //Valkadesh told him about submitting and you've alrady submitted to Drax + add(["Valkadesh", "sacrifice"]); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@To be called Naxatilor.@*"); + + case "Valkadesh"(remove): + say("@To have spoken to Scholar Valkadesh?@*"); + say("@Then surely to know what harm you have caused my world!@*"); + say("@To have no choice but to return the Codex!@*"); + add(["choice"]); + + case "fated"(remove): + say("@To have wreaked great havoc in this land by your theft of the Codex!@"); + say("@To have no choice but to return it!@"); + add(["choice"]); + + case "choice"(remove): + say("@To see only two alternatives- to return the Codex, or to give up your life.@*"); + add(["Codex"]); + + case "job"(remove): + say("@To be a seer, mystic advisor to my people.@*"); + say("@But to be unable to avert what is written in the Book of Prophecies.@*"); + + + case "sacrifice"(remove): + say("@Hss...Yes, to know of the three meanings of that word.@*"); + say("@To ask to which type of sacrifice you refer: self, others or items of value?@*"); + converse(["self", "others", "items of value"]) + { + + case "self"(remove): + say("@To admire your willingness to sacrifice your life for the good of my people.@*"); + say("@But to doubt that that is the meaning of he prophecy.@*"); + + + case "others"(remove): + say("@What?!@*"); + say("@To suggest that you can atone for your misdeed by bathing in the blood of others?!@*"); + if (AvatarKarma <= 40) + say("@To find such thoughts well in keeping with the blackness of your aura!@"); + else say("@To find such thoughts unworthy of your honorable aura!@"); + + case "items of value"(remove): + say("@To know of only one item of true value--the Codex itself.@*"); + say("@Surely not to destroy the Codex!?@*"); + if (askYesNo()) + { + say("@To be utterly without hope in the face of such ignorance.@"); + say("@To refuse to converse with a daemon.@"); + sayGoodbye2(item); + return; + } + else + { + say("@Perhaps to have another alternative...@"); + say("@Yes! To return the Codex to the Vortex!@"); + if (!gflags[START_CODEX_QUEST]) + gflags[START_CODEX_QUEST] = true; + + say("@Then to be availiable to both our peoples!@"); + add(["Vortex", "both"]); + } + + case "test"(remove): + say("@used to break out of convo if doesn't work right@*"); //REMOVE if working! + break; + + case "Vortex"(remove): + say("@To direct you to go to the Hall of Knowledge, south of here.@*"); + say("@There to read the Book of Ritual.@*"); + say("@There also to get the Vortex Lens!@*"); + say("@Then to return here, where I will tell you what must be done!@*"); + UI_set_item_flag(item, NAKED); //used to find if you went to the hall of knowledge + add(["Hall of Knowledge"]); + + case "both"(remove): + say("@To be able to see the Vortex from both sides of the world!@*"); + say("@To benefit both races equally if the Codex is returned there!@*"); + + case "Hall of Knowledge"(remove): + say("@To find the Vortex Lens in the Hall of Knowledge, south of here.@*"); + add(["nothing more"]); + + case "nothing more"(remove): + break; + + } + + + case "Vortex"(remove): + say("@To direct you to go to the Hall of Knowledge, south of here.@*"); + say("@There to read the Book of Ritual.@*"); + say("@There also to get the Vortex Lens!@*"); + say("@Then to return here, where I will tell you what must be done!@*"); + if (!gflags[HALL_OF_KNOWLEDGE]) + gflags[HALL_OF_KNOWLEDGE] = true; + UI_set_item_flag(item, NAKED); //used to find if you went to the hall of knowledge + add(["Hall of Knowledge"]); + + case "both"(remove): + say("@To be able to see the Vortex from both sides of the world!@*"); + say("@To benefit both races equally if the Codex is returned there!@*"); + + + case "Hall of Knowledge"(remove): + say("@To find the Vortex Lens in the Hall of Knowledge, south of here.@*"); + add(["nothing more"]); + + case "lens"(remove): + say("@To be sure to show the human lensmaker the Vortex Lens.@*"); + say("@Also to be sure to tell the human lensmaker that his lens must be concave!@*"); + say("@To be most important--concave!@*"); + + case "Codex"(remove): + say("@To know not where the Codex is.@*"); + say("@But to remember that Captain Bolesh just returned from the Codex!@*"); + say("@To suggest you seek him. To try the healer's house to the north.@*"); + + case "bye": + if (UI_get_item_flag(item, NAKED)) //told you to get vortex lens + { + say("@Farewell! To return when you have visited the Hall of Knowledge!@"); + sayGoodbye2(item); + break; + } + else + { + say("@Farewell, " + player_name + ". To return when there is more we can discuss.@"); + sayGoodbye2(item); + break; + } + + + } + + + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Snakecharmer.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Snakecharmer.uc new file mode 100755 index 0000000..3117ef8 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Snakecharmer.uc @@ -0,0 +1,175 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + +void Snakecharmer object# (0x4c1) () +{ + + var avatar_bark; + var npc_bark; + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var hour; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + var wearing_amulet = isWearingAmulet(); + + + if (event == DOUBLECLICK) + { + //Avatar hasn't used the scroll, hasn't submitted to Drax, and can't understand gargoyles yet: + + if (!isWearingAmulet()) //Avatar has not submitted to Drax yet + { + UI_error_message("Snakecharmer !submit to drax"); + if (UI_get_npc_id(item, 1)) + { + UI_error_message("Snakecharmer id 1"); + //Avatar and NPC greeting barks + var av_1st_greet = "@Hold, gargoyle!@"; + var npc_1st_greet = "@The False Prophet!@"; + + var av_2nd_greet = "@Hold, gargoyle!@"; + var npc_2nd_greet = "@The False Prophet!@"; + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + + + } + + else + { + UI_error_message("Snakecharmer ID 0"); + //Avatar and NPC greeting barks + var av_1st_greet = "@Hold, gargoyle!@"; + var npc_1st_greet = "@An-bal-sil-fer!@"; + + var av_2nd_greet = "@Hold, gargoyle!@"; + var npc_2nd_greet = "@An-bal-sil-fer!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + + } + } + else + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hail, gargoyle.@"; + var npc_1st_greet = "@The False Prophet..@"; + + var av_2nd_greet = "@Hail, snakecharmer!@"; + var npc_2nd_greet = "@To greet you, False Prophet.@"; + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + + } + + if (started_talking) + { + if (!gflags[READ_GARGISH_SCROLL]) //not read garg scroll + { + item.say("An old winged gargoyle."); + item.say("The gargoyle shouts, @An-bal-sil-fer!@ and flees!"); + UI_clear_item_flag(item, MET); + sayGoodbyeAbrupt(item, "@An-bal-sil-fer!!"); + UI_set_schedule_type(item, IN_COMBAT); + UI_set_attack_mode(item, FLEE); + return; + } + else if (!gflags[SUBMITTED_TO_DRAXINUSOM]) //not submitted yet but read scroll + { + item.say("An old winged gargoyle."); + item.say("The gargoyle shouts, @The False Prophet!@ and flees!"); + UI_clear_item_flag(item, MET); + sayGoodbyeAbrupt(item, "@The False Prophet!!@"); + UI_set_schedule_type(item, IN_COMBAT); + UI_set_attack_mode(item, FLEE); + return; + + } + else + { + if (!UI_get_item_flag(item, PETRA)) + { + item.say("An old winged gargoyle."); + item.say("The gargoyle seems afraid of you at first. Then he notices the amulet around your neck."); + item.say("@To--to feel honored to address you, False Prophet.@"); + UI_set_item_flag(item, PETRA); + } + else + item.say("@To feel honored by your visit, False Prophet.@."); + item.say("@To ask what you wish of a simple snakecharmer?@"); + + + } + + + + + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("The gargoyle laughs nervously.*"); + say("@To lack a name, of course.@*"); + say("@To be called simply by my job, snakecharmer.@*"); + + + case "job"(remove): + say("@To summon the silver snake, and to direct the young warriors in defeating it.@"); + say("@Then to extract the venom so that I can make the battle-drug.@"); + add(["battle-drug"]); + + + case "battle-drug"(remove): + say("@To make the drug for our bravest warriors, who take it and turn into fighting daemons!@*"); + say("@To express sorrow that the drug is fatal, but to express awe and respect for the warriors' sacrifice.@*"); + + case "snakecharmer"(remove): + say("@To use the great horn to summon the silver snake.@*"); + say("@To always require many warriors to defeat the creature!@*"); + add(["horn"]); + + + case "horn"(remove): + say("@To find the horn just north of my house. But to warn you never to blow the horn!@*"); + say("@To be in grave peril from the snake without a squad of warriors!*"); + + case "bye": + say("@To express my thanks for the sacrifice you have chosen to make!@"); + + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@To bid you goodbye, False Prophet.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Valkadesh.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Valkadesh.uc new file mode 100755 index 0000000..02efa23 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Valkadesh.uc @@ -0,0 +1,261 @@ + +void Valkadesh object# (0x4c5) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var met_valkadesh = UI_get_item_flag(item, PETRA); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + + //have not read Capt. Johne's scroll yet + if (!gflags[READ_GARGISH_SCROLL]) + { + npc_1st_greet = "@Are human. You.@"; + av_1st_greet = "@Hail, gargoyle.@"; + + } + else if(!met_valkadesh) + { + npc_1st_greet = "@To greet you, False Prophet.@"; //read scroll, met for first time after + av_1st_greet = "@Hail, gargoyle.@"; + } + else + { + npc_1st_greet = "@To greet you, Avatar.@"; + av_1st_greet = "@Greetings, Valkadesh.@"; + } + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A tall, thin, winged gargoyle.*"); + + if (!gflags[READ_GARGISH_SCROLL])// haven't met, haven't read Gargish scroll yet + { + item.say("The gargoyle smiles, but his grin is somehow disturbing.*"); + item.say("@I human friend. Want talk you.@"); + add("friend"); + + var options = ["name", "job", "bye"]; + + converse(options) + { + case "name"(remove): + say("In a thick accent, the gargoyle croaks, @I bad with human language.@"); + say("@Must Captain Johne go. Only he speak. Must go!@"); + add(["Captain Johne"]); + + case "job"(remove): + say("In a thick accent, the gargoyle croaks, @I bad with human language.@"); + say("@Must Captain Johne go. Only he speak. Must go!@"); + add(["Captain Johne"]); + + + case "Captain Johne"(remove): + say("@Must Captain Johne go. Only he speak. Must go!@"); + + case "friend"(remove): + say("@Captain Johne gargoyle friend. Captain Johne speak.@"); + + case "bye": + say("@Want much to talk. Captain Johne speak, Captain Johne go!@"); + sayGoodbyeAbrupt(item, "Captain Johne!"); + break; + } + + } + else + { + var options = ["name", "job", "bye"]; + if (!met_valkadesh) + { + item.say("@To offer greetings, False Prophet. To have waited long for you to return to this side of the world.@*"); + item.say("@To believe that the Book of Prophecies is wrong. To believe that I can reason with you, persuade you to spare my people.@*"); + item.say("@To wish to address you honorably: To ask your name?@*"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + if (avatar_or_name == "I am the Avatar") + say("@Noble Avatar, to see that you are a being of honor and respect.@"); + else if (avatar_or_name == ("I am " + player_name)) + say("@Noble " + player_name + ", to see that you are a being of honor and respect.@"); + item.say("@To not betray that honor - to return the Codex!@"); + item.say("@To save my people from the prophesy!@"); + UI_set_item_flag(item, PETRA); //this flag is set as "met valkaedsh" + add (["prophesy", "Codex"]); + } + else //Met him, read the gargish scroll + { + item.say("@Greetings, friend " + player_name + ".@*"); + if (gflags[WEARING_AMULET_SUBMISSION]) //should have amulet of submission on + item.say("@To see you have done the honorable thing. To have earned much respect from my people by doing this!@*"); + item.say("@To hope your travels have brought you wisdom?@"); + if (askYesNo()) + { + item.say("@To wish to hear about it!@"); + } + else item.say("@To regret that, and to wish to aid you.@"); + } + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + + //didn't ask him yet about surrender + if (UI_get_item_flag(item, TATTOOED) && !gflags[WEARING_AMULET_SUBMISSION]) + add(["surrender", "Inquisitor", "free"]); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + + converse(options) + { + case "name"(remove): + say("@To be called Valkadesh Wis-lem, Valkadesh the Scholar@"); + say("@To have been given a partial name. To have yet to achieve full honor.@"); + add(["partial"]); + + case "job"(remove): + say("@To be a Scholar. To be seeking a way to avert the prophecy.@"); + add(["prophesy"]); + + case "partial"(remove): + say("@To be greatly honored by even a partial name. To be customary among my people to give names only to those most worthy.@"); + + case "prophesy"(remove): + say("@To be written in the Book of Prophecies that you would destroy our world.@*"); + say("@To also be written that only the sacrifice of the False Prophet would save us.@*"); + add(["sacrifice"]); + + case "sacrifice"(remove): + say("@To be the only alternative to returning the Codex. Without the Codex, to have no choice but to sacrifice your life!@*"); + add(["Codex", "choice"]); + + case "Codex"(remove): + say("@To believe that it is not too late. To beg you to return the Codex.@"); + say("@Avert the prophesy! Save your life, and my people's lives as well!@"); + + case "choice"(remove): + say("@Wait! To know that sacrifice has threemeanings: of self, of others and of valuables.@*"); + say("@Perhaps to find a better answer in one of those other meanings.@"); + add(["answer"]); + + case "answer"(remove): + say("@To be unable to help more.@"); + say("@To suggest you seek out Naxatilor himself for further enlightenment.@"); + add(["Naxatilor"]); + + case "Naxatilor"(remove): + say("@To learn from Naxatilor, the wisest gargoyle. To find his chambers just to the northeast of the Hall of Knowledge.@"); + say("@To suggest you go there and ask him of sacrifice.@"); + + case "surrender"(remove): + if (!gflags[WEARING_AMULET_SUBMISSION]) + { + gflags[ASK_TO_SUBMIT] = true; + say("@To travel to the Inquisitor. To tell the Inquisitor that you surrender.@"); + say("@Then to be no longer a threat, and no longer be feared.@"); + } + else say("@To have done the honorable thing and now be respected and unfeared by my people.@"); + + case "Inquisitor"(remove): + say("@To go to Draxinusom, the Inquisitor and leader of my race.@*"); + say("@To find his chambers just to the northwest of the Hall of Knowledge.@*"); + say("@To surrender to him, that you may travel freely in our land.@*"); + + case "free"(remove): + say("@To know that the moons are not properly aligned yet for the ritual.@*"); + say("@To assure you that you will not be sacrificed for many weeks.@*"); + say("@To assure you further that surrender is the only way you can travel among my people.@*"); + + case "bye": + if (!UI_get_item_flag(item, TATTOOED)) //not yet told you about Draxinusom + { + say("As you turn to leave, the gargoyle stops you."); + say("@Wait,@ he calls. @To be feared and hated by all gargoyles. To be unsafe for you right now, False Prophet.@"); + say("@To surrender is only answer. To surrender to Inquisitor.@*"); + say("@Then to be no longer a threat, and no longer be feared by my people!@"); + say("@To surrender to the Inquisitor, and then to be free to look for the solution.@"); + + UI_set_item_flag(item, TATTOOED); + gflags[ASK_TO_SUBMIT] = true; + add(["surrender", "Inquisitor", "free"]); + } + + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@May your precision and persistence lead to success!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Weaponsmith.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Weaponsmith.uc new file mode 100755 index 0000000..36bb2d9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Gargoyles/Weaponsmith.uc @@ -0,0 +1,322 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + +void Weaponsmith object# (0x4be) () +{ + + var avatar_bark; + var npc_bark; + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var hour; + var polite_title = getPoliteTitle(); + const int SHAPE_SLEEPING_POWDER = 648; + const int FRAME_POWDER = 1; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + var wearing_amulet = isWearingAmulet(); + + + if (event == DOUBLECLICK) + { + //Avatar hasn't used the scroll, hasn't submitted to Drax, and can't understand gargoyles yet: + + if (!isWearingAmulet()) //Avatar has not submitted to Drax yet + { + + if (UI_get_npc_id(item, 1)) + { + UI_error_message("Snakecharmer id 1"); + //Avatar and NPC greeting barks + var av_1st_greet = "@Hold, gargoyle!@"; + var npc_1st_greet = "@An-bal-sil-fer!@"; + + var av_2nd_greet = "@Hold, gargoyle!@"; + var npc_2nd_greet = "@The False Prophet!@"; + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + + + } + + else + { + UI_error_message("Snakecharmer ID 0"); + //Avatar and NPC greeting barks + var av_1st_greet = "@Hold, gargoyle!@"; + var npc_1st_greet = "@An-bal-sil-fer!@"; + + var av_2nd_greet = "@Hold, gargoyle!@"; + var npc_2nd_greet = "@An-bal-sil-fer!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + + } + } + else + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hail, gargoyle.@"; + var npc_1st_greet = "@The False Prophet..@"; + + var av_2nd_greet = "@Hail, weaponsmith!@"; + var npc_2nd_greet = "@To greet you, False Prophet.@"; + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!gflags[READ_GARGISH_SCROLL]) //Avatar has not read scroll or submitted yet + { + item.say("A young, nervous-looking gargoyle."); + item.say("@An-bal-sil-fer!@ the gargoyle screams. @Agra-lem! Agra-Lem!@"); + item.say("Suddenly realizing that he is holding a weapon, the gargoyle attacks!"); + UI_clear_item_flag(item, MET); + UI_set_alignment(item, EVIL); + UI_set_schedule_type(item, IN_COMBAT); + sayGoodbye2(item); + return; + + } + else + { + if (!gflags[SUBMITTED_TO_DRAXINUSOM]) //can understand him + { + item.say("A young, nervous-looking gargoyle."); + item.say("@The False Prophet!@ the gargoyle screams. @Guards! Guards!@"); + item.say("Suddenly realizing that he is holding a weapon, the gargoyle attacks!"); + UI_clear_item_flag(item, MET); + UI_set_alignment(item, EVIL); + UI_set_schedule_type(item, IN_COMBAT); + return; + + + + } + + else //Submitted + { + if (!UI_get_item_flag(item, MET)) + { + UI_set_alignment(item, NEUTRAL); + item.say("A young, nervous-looking gargoyle."); + item.say("@The False Prophet!@"); + item.say("@To thank you for your upcoming sacrifice. To greatly respect your nobility and courage.@"); + UI_set_item_flag(item, MET); + } + else + item.say("@To ask how I can help you, noble one.@."); + } + } + //standard conversation options + var options = ["name", "job", "bye"]; + + + //flags set once he gives you the freebies already, now you can only ask about them + if (UI_get_item_flag(item, PETRA)) + add("zu ylem dust"); + + if (UI_get_item_flag(item, SI_ZOMBIE)) + add("boomerang"); + + if (UI_get_item_flag(GOODSCRAFTER, MET)) + add("Goodscrafter"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + + say("@To be but a simple weaponsmith, False Prophet.@*"); + say("@To lack a name, as is appropriate for my station.@*"); + add("weaponsmith"); + + + case "job"(remove): + say("@To be the master weaponsmith now, although to have but recently been a simple apprentice.@"); + add(["buy"]); + + + case "weaponsmith"(remove): + say("@To be the master weaponsmith now, although to have but recently been a simple apprentice.@"); + add(["apprentice"]); + + case "zu ylem dust"(remove): + say("@To regret that I have such a small supply of zu ylem dust.@"); + + case "boomerang"(remove): + say("@To wish I had more boomerangs, that I might give you another.@"); + + case "apprentice"(remove): + say("@To greatly regret the loss of my master, killed during the disasters.@"); + say("@But to carry on in the face of adversity. And certainly not to lose all passion for life, like the worthless goodscrafter!@"); + add(["goodscrafter", "disasters", "join"]); + + case "goodscrafter"(remove): + say("@To consider him a discredit to the race!@"); + say("@Most of all, to consider him a dishonor to my late master!@"); + add(["dishonor"]); + + case "disasters"(remove): + say("@Yes, surely to know of the disasters?@"); + say("@To have only barely survived the earthquakes after the Codex disappeared.@"); + + case "join"(remove): + say("@To wish I could leave on adventures...@"); + say("@But to be dedicated to my important work.@"); + + case "buy"(remove): + say("@To not understand what that means.@"); + say("@To create these items for the use of all.@"); + add(["all"]); + + case "all"(remove): + say("@To give these wares to any gargoyle who has need of them.@"); + say("@To invite you to look around at my wares as well.@"); + say("@To ask if any of them interest you?@"); + add(["wares"]); + + case "wares"(remove): + if (!UI_get_schedule_type(item, BLACKSMITH)) + say("@To ask you to see me at my shop!@"); + else + { + say("@To have but a few items available. To be far less adept than my former master.@"); + var wares = ["boomerang", "vial", "helmet", "pouch", "nothing"]; + converse(wares) + { + case "boomerang"(remove): + say("@Ah, to see you admire these boomerangs, the work of my master.@*"); + say("@To regret being unable to create boomerangs myself.@*"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + say("@To have only a few left in stock, but to offer you one.@"); + say("Do you accept the gift"); + if (askYesNo()) + { + if (UI_add_party_items(1, SHAPE_BOOMERANG, QUALITY_ANY, FRAME_ANY, false)) + { + UI_set_item_flag(item, SI_ZOMBIE); + say("The gargoyle hands you a boomerang."); + if (inParty(SHAMINO) && isNearby(SHAMINO)) + { + say("As you take the boomerang, Shamino speaks."); + SHAMINO.say("@Aye, 'tis a most interesting weapon, " + polite_title + ". Perhaps when our quest is through I can study its use.@"); + SHAMINO.hide(); + } + + say("The gargoyle speaks. @To ask if anything else interests you?@"); + } + else + say("@To not be able to carry it.@"); + } + else say("The gargoyle nods. @Yes, to see that you already have enough weapons.@"); + } + + case "pouch"(remove): + say("@Yes, to be a very interesting weapon. To knock out even a large animal with just a single pouch of this powder!@*"); + say("@To be used most often by hunters, to avoid harming the meat. Unfortunately, to make this powder from plants that can no longer be found.@*"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + say("@Here, to offer you one.@"); + say("Do you accept the gift"); + if (askYesNo()) + { + if (UI_add_party_items(1, SHAPE_SLEEPING_POWDER, QUALITY_ANY, FRAME_POWDER, false)); + { + UI_set_item_flag(item, SI_ZOMBIE); + say("He hands you a small pouch. @To hope you find it useful.@"); + + } + + } + else + say("The gargoyle nods. @To understand your reluctance To know the dangers of zu ylem dust to the untrained user.@*"); + } + add("plants"); + + case "plants"(remove): + say("@To create the zu ylem dust from plants that can no longer be found. But to know of far worse effects of the disasters.@"); + + case "vial" (remove): + say("@To be a powerful but dangerous drug! To turn gargoyle warriors into unstoppable fighters!@"); + say("@But to always be fatal after the battle ends.@"); + say("@To be created by the snake charmer, who lives to the southwest.@"); + add("snake charmer"); + + case "snake charmer" (remove): + say("@Yes, to suggest you visit him if you are interested. To find the snake-summoning horn a most impressive sight!@"); + + case "helm"(remove): + say("@To see little of interest in that item.@"); + + + case "nothing": + say("@To ask what you want to speak of next?@"); + break; + + } + + } + + + case "dishonor"(remove): + say("@To cheapen all our loss, all our grief, by his self-pity. To have lost my master, like a father to me.@"); + say("@Yet to maintain control, to maintain diligence. Most of all to maintain passion for life. To feel that the goodscrafter dishonors us all by abandoning our principles.@"); + say("@To feel that the goodscrafter needs a trip to the catacombs.@"); + add(["catacombs"]); + + case "catacombs"(remove): + say("@Yes, to have visited them myself once, long ago. To find there shrines to our three principles: control, passion and diligence.@"); + say("@To speak with these shrines and meditate, to receive new insight. To not remember where the catacombs are.@"); + say("@To be sent there by the Temple of Singularity.@"); + add(["Singularity"]); + + case "Singularity"(remove): + say("@To find that to the north, in the mountains.@"); + say("@To advise you to find some way to fly if you wish to get there, though!@"); + add(["fly"]); + + case "fly"(remove): + say("@To be unable to reach the Temple on foot; to be forced to fly over the mountains.@"); + + case "bye": + say("@To express my thanks for the sacrifice you have chosen to make!@"); + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@May your long work and strength lead to success!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Arvin.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Arvin.uc new file mode 100755 index 0000000..71a7527 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Arvin.uc @@ -0,0 +1,173 @@ + +void Arvin object# (0x43a) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Shopkeeper options + //sellFood(var npc, var food_drink_options, var prices, dialog) + + var food_drink_options =["nothing", "mead", "ale", "wine", "mutton", "rations", "rolls"]; + var food_drink_frames = [FRAME_MEAD, FRAME_ALE, FRAME_WINE, FRAME_MUTTON, FRAME_RATIONS, FRAME_ROLLS]; + var prices = [4, 3, 6, 4, 2, 2]; + + var initial_choice_question = "@I sell rolls, ale, mead, wine, mutton, and rations@"; + var askIfInterested1 = "@That'll be "; //split into two to capture price + var askIfInterested2 = " crowns, okay?@"; + var ask_quantity = "@How many?@"; + var cant_afford = "@Come back when you have some gold@"; + var cant_hold = "@You don't have room to carry it.@"; + var saidNo = "@Very well. Anything else I can do for you?@"; + var success = "Alright.@ He hands over the "; + var success2 = "@That aught to hold you.@"; + var nothing = "@Anything else I can do for you?"; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + //////////////////// + + + + //buyArmor(item, armor_options, prices, shapes, ask_choice, askIfInterested, cant_afford, cant_hold, saidNo, success, success2); + + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //if you are Sherry + if (gflags[AVATAR_IS_SHERRY]) + { + script item after 2 ticks say "@It's the rat, kill it!@"; + UI_set_schedule_type(item, SHY); + return; + } + + + + + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Hello, matey.@"; + + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@Welcome back, matey.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (shop_is_open) + { + if (hour <= 3) + { + item.say("The man looks up from his cooking. @Aye, hello there. 'Fraid I can't talk now. I have to cook tomorrow's lunch.@*"); + } + else + item.say("The man looks up from his cooking. @Aye, hello there. 'Fraid I can't talk now. I have to cook tonight's supper.@*"); + item.say("@Come back when it's ready and have some!@"); + sayGoodbyeAbrupt(item, "Come back later!"); + return; + } + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A tavernkeeper.*"); + item.say("@Welcome to the Sword and Keg.@*"); + UI_set_item_flag(item, MET); + } + else + item.say("@Welcome to the Sword and Keg.@*"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I be Arvin, mate.@"); + + case "job"(remove): + say("@I sell rolls, ale, mead, wine, mutton, and rations.@"); + add(["buy"]); + + case "buy": + sellFood(ARVIN, food_drink_options, prices, food_drink_frames, dialog); + + //TODO: Lyssandra story + + case "bye": + + var avatar_goodbye = "@Must be going now..@"; + var npc_goodbye = "@See you later.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Culham.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Culham.uc new file mode 100755 index 0000000..4c77466 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Culham.uc @@ -0,0 +1,243 @@ + +void Culham object# (0x43f) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == KID_GAMES) + { + var barks = [ + "@Ooof!@", + "@Thou bloodied my lip!@", + "@Take that!@", + "@Have at thee!@", + "@Argh!@", + "@Ow that dost hurt!@", + "@Thou bastard!@" + ]; + + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + } + else if (event == DOUBLECLICK) + { + //if you are Sherry + if (gflags[AVATAR_IS_SHERRY]) + { + script item after 2 ticks say "@Aieeeee! It's the rat!@"; + UI_set_schedule_type(item, SHY); + return; + } + + if (UI_get_schedule_type(item) == KID_GAMES) + { + item.say("@It's fighting time, talkings' for later.@"); + UI_clear_item_flag(item, READ); + return; + } + + + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Hullo there.@"; + + var av_2nd_greet = "@A moment, milord..@"; + var npc_2nd_greet = "@Why hullo again..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A small man in a handsome vest made of seashells."); + item.say("@Why, hullo there, " + polite_title + ". And who might ye be?@*"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + if (avatar_or_name == "I am the Avatar") + item.say("@Well met, " + polite_title + " Avatar. Let me tell ye a tale.@"); + else + item.say("@Well met, " + polite_title + " " + player_name + ". Let me tell ye a tale.@"); + + } + else + { + item.say("@Why, hullo there, " + player_name + ". Have I told ye the one about the gypsies?@"); + if (askYesNo()) + { + item.say("@Oh. Perhaps a song, then.@"); + add(["song"]); + } + else + { + item.say("@Now there's a tale.@"); + add(["tale"]); + } + } + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Culham's me name, " + polite_title + ".@"); + + case "job": + say("@When spirits be low, I play tunes to bring cheer.@"); + add(["cheer", "spirits"]); + + case "spirits"(remove): + say("@Once I heard a haunting melody...in Old Magincia.@ He laughs."); + add(["Magincia"]); + + case "Magincia"(remove): + say("@Well, it used to be a ghost town.@ He laughs and plays a little tune on his lute."); + + case "cheer"(remove): + say("@The Mantra of Valour bringeth great cheer.@"); + add(["mantra", "rune"]); + + case "mantra"(remove): + say("@I'm not a great singer, but I love to play a song of valour. It makes me sing.@"); + add(["sing"]); + + case "sing"(remove): + say("@I'll sing, though I'd rather play.@"); + add(["song"]); + + case "song"(remove): + if (!gflags[LEARNED_MANTRA_VALOR]) //haven't learned mantra yet + { + giveExperience(25); + gflags[LEARNED_MANTRA_VALOR] = true; + } + + if ((isNearby(JERRIS)) || (isNearby(STELNAR)) || (isNearby(VANKELLIAN)) || (isNearby(NOMAAN))) + say("The pub is filled with the sound of singing."); // check for nearby NPCS's if ((npc_nearby(50) || npc_nearby(45)) || npc_nearby(46)) else + else + say("Culham sings for you."); + + say("@It seemed like such an easy climb. I crawled upon the Serpent's Spine.@"); + say("@I hadn't even time to blanch. When down there came an avalanche!@*"); + say("@And then my mantra came to mind. 'Tho boulders bounced and passed with speed. My frozen fingers gripped to rock. As sliding snow swept loose my feet.@"); + say("@Sing 'ra,' my friends, sing 'ra.@*"); + say("@'Tis a song to make thee strong. When the mountains be high. And the ground be far...Sing 'ra,' my friends, sing 'ra'!@"); + + case "rune"(remove): + say("@Ah, yes. That's quite a story, too. Naughty Nomaan dropped the Rune of Valor, and the rat carried it off.@"); // check for nearby NPCS if (npc_nearby(50) && npc_nearby(45)) + if ((isNearby(STELNAR)) && (isNearby(JERRIS))) + { + say("He laughs loudly -- too loudly."); + say("Stelnar and Jerris begin to argue over whether it was a rat or a mouse. Once again a brawl breaks out!"); + + //allows you to ask others about the rat / rune + if (!gflags[ASK_NOMAAN_ABOUT_RUNE]) + gflags[ASK_NOMAAN_ABOUT_RUNE] = true; + + + //set brawl + UI_set_schedule_type(item, KID_GAMES); + UI_set_schedule_type(STELNAR, KID_GAMES); + UI_set_schedule_type(JERRIS, KID_GAMES); + UI_set_schedule_type(NOMAAN, KID_GAMES); + UI_set_schedule_type(VANKELLIAN, KID_GAMES); + gflags[BRAWLING] = true; //flag 1078 + UI_play_music(25); + script item after 2 ticks say "@..here we go again..@"; + script STELNAR after 4 ticks say "@Twas a rat, Jerris!@"; + script JERRIS after 6 ticks say "@No! 'Twas a mouse! I saw it!@"; + script LYSSANDRA after 8 ticks say "@Take it outside ye oafs!@"; + CULHAM->BrawlEngineJhelom(); + + //sets brawl timer so they brawl for an hour + UI_set_timer(BRAWL_TIMER); + + //bypass normal end convo routine + UI_clear_item_flag(item, READ); + break; + } + + case "tale"(remove): + say("@Would ye really like to hear a story?@"); + if (askYesNo()) + { + if (!gflags[ARTUROSIS]) //you can now ask Immanuelle and Arturos about "Arturosis" + gflags[ARTUROSIS] = true; + + say("@I call this story...Arturosis. Two gypsies come to Trinsic, hungry as usual.@*"); + say("@One goes out and gathers a poisonous weed from the swamps. The other sneaks into town and puts the plant into the trough of a horse.@"); + say("@Well, poor horse doesn't know better. He eats the stuff, swells up and takes ill. The owner, Immanuelle, doesn't know what to do.@"); + say("@Along come the gypsies. 'Aiee!' they cry. 'Yonder nag hath contracted 'Arturosis.' Unless it be immediately removed, the rest shall catch the same fatal disease.@"); + say("@Immanuelle decides to sacrifice the diseased one and the gypsies agree heartily. 'For but a few coins,' say the gypsies,' we will lead it away and bury it far from here.'@*"); + say("@Immanuelle is too happy to hand them the doomed animal's bridle, plus ten coins.@"); + say("@So the gypsies make a great kettle of horse stew and bury the rest. A great feast is held 'mongst gypsykind. Meanwhile, Immanuelle thanks virtue that the equine epidemic was caught early on!@"); + say("@'Tis a true story, my friend.@"); + + } + else + say("@Well, not everyone likes gypsy tales, I suppose.@"); + + case "bye": + + var avatar_goodbye = "@Must be going now..@"; + var npc_goodbye = "@May we meet again soon, friend.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Heftimus.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Heftimus.uc new file mode 100755 index 0000000..d857082 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Heftimus.uc @@ -0,0 +1,197 @@ + +void Heftimus object# (0x446) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //if you are Sherry + if (gflags[AVATAR_IS_SHERRY]) + { + script item after 2 ticks say "@Away with ye, vile rat!@"; + UI_set_schedule_type(item, SHY); + return; + } + + + + //Avatar and NPC greeting barks + var av_1st_greet = "@Ahoy, milord!@"; + var npc_1st_greet = "@Got any money?@"; + + var av_2nd_greet = "@A moment, sir..@"; + var npc_2nd_greet = "@Got some money fer me matey?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking || UI_get_schedule_type(item, TALK)) + { + //if you are Sherry + if (gflags[AVATAR_IS_SHERRY]) + { + script item after 2 ticks say "@Aieeeee! It's the rat!@"; + UI_set_schedule_type(item, SHY); + UI_clear_item_flag(item, READ); + return; + } + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A beggar, clad in the rags of a sailor, with a hook for a right hand."); + item.say("@Spare a doubloon fer an old seahand?@ He holds out his hand."); + item.say("Do you give him any money?"); + if (askYesNo()) + { + say("@How much do you give?@"); + var partygold = countGold(PARTY); + var USER_INPUT = (UI_input_numeric_value(0, partygold, 1, 1)); //values 0 - party gold amt. + if (USER_INPUT == 0) + { + say("@Pah!@ He spits on the ground."); // if answered '0' + UI_set_schedule_type(item, SHY); + sayGoodbyeAbrupt(item, "Pah!"); + return; + + } + else if (hasGold(USER_INPUT)) + { + chargeGold(USER_INPUT); + say("@Thank, ye kindly, matey.@"); + } + + } + else + { + say("@Pah!@ He spits on the ground."); + sayGoodbyeAbrupt(item, "Pah!"); + UI_set_schedule_type(item, SHY); + return; + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + //learned about the map from Homer + if (gflags[TALKEDTOHOMERABOUTMAP]) + add("map"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I be Heftimus McPry, matey.@"); + + case "job": + say("@Once Buccaneer's Den quaked at the mention o' me name. I was the greatest sabre fighter on all the high seas..@*"); + say("@Then one day...I fought Captain Hawkins, that scurvy dog, an' he struck off me hand with his sword.@"); + add(["Captain Hawkins", "Buccaneer's Den", "hand"]); + + case "hand"(remove): + say("@Twas a bitter fight; I almost died o' the wound. Hawkins threw me hand to the sharks.@"); + + case "Captain Hawkins"(remove): + say("@He be long gone now, he an' his ship the Empire. A pox on his memory!@"); + + case "Buccaneer's Den"(remove): + say("@That be an island, matey, and no place fer a decent soul like yerself.@"); + + case "map"(remove): + say("@That bit o' news will cost ye twenty coins. What say ye, matey? Aye or nay?@"); // question + if (askYesNo()) + { + if (hasGold(20)) + { + chargeGold(20); + say("@I thank ye kindly, matey. The last I saw o' that bit o' parchment...I needed it to start a fire in a dungeon.@*"); + say("@But afore I could apply sparks to the tinder, a huge swarm o' rats drove me away. The scrap o' map lies in the dungeon Wrong, matey.@"); + add(["dungeon"]); + } + else + say("@I can't help ye, matey. Not enough gold.@"); + } + else + { + say("@Hmm.@*"); + say("@Then maybe ten? Aye or nay?@"); + if (askYesNo()) + { + if (hasGold(10)) + { + chargeGold(10); + say("@I thank ye kindly, matey. The last I saw o' that bit o' parchment...I needed it to start a fire in a dungeon. But afore I could apply sparks to the tinder, a huge swarm o' rats drove me away.*@"); + say("@The scrap o' map lies in the dungeon Wrong, matey.@"); + add(["dungeon"]); + } + else + say("@Not enough gold. So be it, matey.@"); + + } + else + { + say("@Pah!@ He spits on the ground."); + sayGoodbyeAbrupt(item, "Pah!"); + UI_set_schedule_type(item, SHY); + return; + + } + } + + case "dungeon"(remove): + say("@I've been into the dungeon Wrong. There's a cave on this island that looks a lot safer.@"); + add(["Wrong", "cave"]); + + case "cave"(remove): + say("@I sleep in front of it every night. Soon as I've saved up a stake, I'm going in there to dig for gold.@"); + + case "Wrong"(remove): + say("@'Twas certainly the wrong place for an old seadog to be!@ He laughs, chokes, and coughs for a while. @I'll be allright, matey.@"); + + case "bye": + + var avatar_goodbye = "@That will be all..@"; + var npc_goodbye = "@Good journey.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Jerris.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Jerris.uc new file mode 100755 index 0000000..03a216b --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Jerris.uc @@ -0,0 +1,158 @@ + +void Jerris object# (0x43b) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //if you are Sherry + if (gflags[AVATAR_IS_SHERRY]) + { + script item after 2 ticks say "@Yikes, it's the rat!!@"; + UI_set_schedule_type(item, SHY); + return; + } + + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me, warrior.@"; + var npc_1st_greet = "@Yes, " + polite_title + "?@"; + + var av_2nd_greet = "@Greetings.@"; + var npc_2nd_greet = "@Ah, welcome back.@"; + + + + + + if (UI_get_schedule_type(item) == KID_GAMES || gflags[BRAWLING]) + { + item.say("A slender man with boots that come up to his thighs."); + item.say("@Don't you know it's rude to interrupt a man when he's brawling?@"); + delayedBark(item, "Rude!", 4); + return; + } + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A slender man with boots that come up to his thighs."); + item.say("@Hello there, " + polite_title + ".@"); + if (UI_get_schedule_type(item) == EAT_AT_INN) + { + item.say("@Care to join me in a drink?@"); + if (askYesNo()) + item.say("He hands you a mug for a swallow. It is warmed mead, sweet and bubbly, with a cinnamon stick in it. @Comes from Verity Isle@, he says."); + else + item.say("@Not a mead drinker, I guess.@ He shrugs."); + add(["mead"]); + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[ASK_NOMAAN_ABOUT_RUNE]) + add("rat"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Jerris is my name. And yourself?@"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + if (avatar_or_name == "I am the Avatar") + item.say("@Pleased to make your acquaintance, " + polite_title + " Avatar.@"); + else + item.say("@Pleased to make your acquaintance, " + player_name + ".@"); + + case "job"(remove): + say("@Some day I hope to join Zellivan's Stalwarts and be a guard.@"); + add(["Zellivan's Stalwarts"]); + + case "mead"(remove): + say("@It's mostly made of honey. Ask a brewer.@"); + + case "Zellivan's Stalwarts"(remove): + say("@When that last earthquake struck, I was pinned 'neath a great tree branch. Lord Zellivan himself hoisted it up while a guard pulled me clear.@"); + + case "rat"(remove): + say("@It was a rat, as sure as the world is flat. Darndest thing, too. Nomaan dropped the rune and the rat took it into a little hole.@"); + add(["rune", "mantra"]); + + case "rune"(remove): + say("@It's right there. On the north wall. See it?@"); + say("@Look carefully, " + polite_title + ". Ye will see it if ye keep on looking.@"); + if (isNearby(SHAMINO)) + { + SHAMINO.say("Shamino points to a spot west of the bar where the wall meets the ground. @There it is.@"); + SHAMINO.hide(); + } + say("@Obviously a rat hole.@"); + + case "mantra"(remove): + say("@It's in the refrain of the song.@"); + add(["song"]); + + case "song"(remove): + say("@Well, I'd rather not sing alone. Get Culham to play it.@"); + + case "bye": + + var avatar_goodbye = "@Nice speaking with you..@"; + var npc_goodbye = "@Goodbye.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Lyssandra.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Lyssandra.uc new file mode 100755 index 0000000..73cf5b4 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Lyssandra.uc @@ -0,0 +1,163 @@ + +void Lyssandra object# (0x441) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + + if (event == DOUBLECLICK) + { + + if (gflags[AVATAR_IS_SHERRY]) + { + script item after 2 ticks say "@Eeek! A mouse!!@"; + UI_set_schedule_type(item, SHY); + return; + } + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me, miss..@"; + var npc_1st_greet = "@Hallo!@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Hallo again!@"; + + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A girl of perhaps twelve years.*"); + item.say("She is agile, and balances trays of mugs deftly on each hand."); + if (UI_get_schedule_type(item, TEND_SHOP)) + item.say("It is a wonder how she can duck the hurled debris and avoid the flying fists."); + item.say("She is quick, and never spills a drop of ale."); + item.say("@Hallo, " + polite_title + ". Welcome to the 'Sword and Keg.'@"); + + //standard conversation options + var options = ["name", "job", "bye", "Sword and Keg"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + + converse(options) + { + case "name"(remove): + say("@It's Lyssandra, but ye can call me Andy.@*"); + add(["Andy"]); + + case "job"(remove): + say("@I take orders for drinks, " + polite_title + ".@"); + + case "Andy"(remove): + say("@I know 'tis a boy's name, but I like it all the same..@"); + + case "Sword and Keg"(remove): + say("@Sometimes 'tis rough here but I doesn't mind. Some day I'll be a fighter, ye know.@*"); + add(["fighter"]); + + + case "fighter"(remove): + say("@The fighting here usually begins over--@ Her voice drops to a whisper, @--the rat!@"); + if (hour < 18) + say("@Around sunset things get really rowdy here!@"); + if (!UI_get_item_flag(item, PETRA)) + { + UI_set_item_flag(item, PETRA); //to prevent circular convo about rat + add(["rat"]); + } + case "rat"(remove): + say("@Shhh!@ She glances about to see if you have been overheard."); + say("@See yon hole in the north wall? Look carefully at where floor and wall meet. That's where it took the rune!@"); + say("@They tried all manner of tricks to get it out but they all failed.@*"); + say("@I had an idea, but nobody listened to me.@"); + add(["idea", "rune"]); + + case "idea"(remove): + say("@Do ye know of the talking mouse? Lord British's friend?@"); + if (askYesNo()) + { + say("@A mouse could get the rune, of that I'm sure!@"); + if (!gflags[LEARNED_ABOUT_SHERRY]) //can now ask Sherry for help + gflags[LEARNED_ABOUT_SHERRY] = true; + } + else + say("@Well, ye would think it was a dumb idea anyways...@"); + + + case "rune"(remove): + say("@I know how to get it from the you-know-what.@"); + add(["you-know-what", "mantra"]); + + case "you-know-what"(remove): + say("@The rat,@ she whispers conspiratorially to you."); + if (!UI_get_item_flag(item, PETRA)) + { + UI_set_item_flag(item, PETRA); //to prevent circular convo about rat + add(["rat"]); + } + + case "mantra"(remove): + say("@Culham has oft sung of it, with Jerris and Starhelm.@"); + add(["Starhelm", "Jerris"]); + + case "Starhelm"(remove): + say("@His real name is Stelnar. He would be much nicer if he were not so angry all the time.@"); + + case "Jerris"(remove): + say("@He is brave when fighting, but he is afraid to sing by himself.@"); + + case "bye"(remove): + + var avatar_goodbye = "@Farewell!@"; + var npc_goodbye = "@Bye-bye, It was nice talking to you.@"; + + UI_clear_item_flag(item, PETRA); // so you can ask about rat again + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else + scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Martin.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Martin.uc new file mode 100755 index 0000000..530b2d4 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Martin.uc @@ -0,0 +1,187 @@ + +void Martin object# (0x43d) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, milord..@"; + var npc_1st_greet = "@Velcome to mine inn!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Velcome back!@"; + + if (UI_get_item_flag(item, SI_ZOMBIE)) + npc_2nd_greet = "@Ready to check out?@"; + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + //checking out of the Inn + if (UI_get_item_flag(item, SI_ZOMBIE)) + { + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + var has_key = UI_find_object(PARTY, SHAPE_KEY, QUALITY_MARTIN_INN, FRAME_ANY); + item.say("@Are you ready to check out?@"); + if(askYesNo()) + { + if (has_key) + { + if (hour < 12) + { + say("Martin serves you a huge, tasty breakfast.*"); + say("@A good breakfast is the beginning of a good day!@ he cries."); + UI_add_party_items(1, SHAPE_FOOD, QUALITY_ANY, FRAME_SAUSAGE); + + } + + say("You give Martin back the room key."); + say("@Haf a good journey and come back sometime!@"); + sayGoodbyeAbrupt(item, "Come back to visit again!"); + UI_remove_party_items(1, SHAPE_KEY, QUALITY_MARTIN_INN, FRAME_ANY); + UI_clear_item_flag(item, SI_ZOMBIE); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + + return; + } + else + { + say("@Where is the key? Please return it.@"); + sayGoodbye2(item); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + return; + } + + } + else + say("@Very vel, come back when you're ready to check out.@"); + + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + } + + if (!UI_get_item_flag(item, MET)) + { + item.say("A jolly, red-faced innkeeper."); + item.say("@Vell, hello dere mine " + greeting + ".@*"); + UI_set_item_flag(item, MET); + } + else + item.say("@Vell, hello dere again, mine " + greeting + ".@*"); + item.say("@Velcome to the Varrior's Stead!@"); + item.say("@Vat can I be doing for thee this " + time_of_day + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Mine name ist Martin, but my friends call me Dutch.@"); + add(["Dutch"]); + + case "job"(remove): + say("@I run dis inn.@"); + add(["inn"]); + + case "Dutch"(remove): + say("@Ja, dat's mine name!@"); + + + case "inn"(remove): + if (!UI_get_schedule_type(item, TEND_SHOP)) + { + say("@Come back tomorrow when de inn ist open!@"); + sayGoodbyeAbrupt(item, "Come back tomorrow."); + } + else + { + say("@Room und board ist 5 gold per night per person. Interested?@"); + if (askYesNo()) + { + var price = (5 * partynum); + if (hasGold(price)) + { + chargeGold(price); + UI_add_party_items(1, SHAPE_KEY, QUALITY_MARTIN_INN, 7); + UI_set_item_flag(item, SI_ZOMBIE); //set so he asks for key back + say("@Your room ist to de south. See me in de morning for breakfast before checkout!@"); + sayGoodbyeAbrupt(item, "Enjoy thy stay."); + } + else + { + say("@Ach, I'm sorry, but I must haf my " + price + " gold.@"); + say("@Come back ven fortune makes you rich, ah?@"); + } + + } + else + say("@Vell, perhaps some other time, ja?@"); + } + + case "bye": + + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Haf a good journey!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Nomaan.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Nomaan.uc new file mode 100755 index 0000000..4788c64 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Nomaan.uc @@ -0,0 +1,223 @@ + +void Nomaan object# (0x444) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var price; + var item_choice; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == BLACKSMITH) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + var armor_options = ["nothing", "spiked shield"]; + var armor_shapes = [SHAPE_SPIKED_SHIELD]; + var armor_prices = [25]; + + + var weapon_options = ["nothing", "bow", "club", "crossbow", "dagger", "oil", "spear", "arrows", "bolts"]; + var weapon_shapes = [SHAPE_BOW, SHAPE_CLUB, SHAPE_CROSSBOW, SHAPE_DAGGER, SHAPE_FLAMING_OIL, SHAPE_SPEAR, SHAPE_ARROWS, SHAPE_BOLTS]; + var weapon_prices = [30, 10, 40, 10, 2, 15, 25, 48, 36]; + + var sell_rate = 2; //integer to divide by when selling items back to npc + var sell_shapes = [SHAPE_SPIKED_SHIELD, SHAPE_BOW, SHAPE_CLUB, SHAPE_CROSSBOW, SHAPE_DAGGER, SHAPE_SPEAR]; + var sell_options = ["nothing", "spiked shield", "bow", "club", "crossbow", "dagger", "spear"]; + var sell_prices = [30, 10, 40, 10, 15, 36]; //****altered a bit to not include flaming oil, arrows or bolts to sell back**** + + //Dialog options + var initial_choice_question = "@Which item?@"; //arms or armor? etc + var askIfInterested1 = "@That will be "; //needs to be split into array to capture price + var askIfInterested2 = " gold. Okay?@"; + var cant_afford = "@But thou dost not have enough gold, " + polite_title + "!@"; + var cant_hold = "@But 'twould make thee o'erburdened, " + polite_title + "!@"; + var saidNo = "@Very well.@"; + var nothing = "@If thou art sure of that... Dost thou want anything else?@"; + var success = "@Excellent!@ Nomaan takes your gold and hands over the "; + var success2; //"I hope this item works well for you!" etc if needed + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, cant_afford, cant_hold, saidNo, nothing, success, success2]; + //buyArmor(item, armor_options, prices, shapes, dialog); + + + + //************************************/ + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var met_utomo = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //if you are Sherry + if (gflags[AVATAR_IS_SHERRY]) + { + script item after 2 ticks say "@There it is! Kill the rat!@"; + UI_set_schedule_type(item, SHY); + return; + } + + //Avatar and NPC greeting barks + var av_1st_greet = "@Might we speak?@"; + var npc_1st_greet = "@Well met!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Hail, " + polite_title + ".@"; + + if (UI_get_schedule_type(NOMAAN) == KID_GAMES || gflags[BRAWLING]) + { + item.say("@Can't you see there's a lovely brawl going on? Talk to me tomorrow.@"); + return; + } + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + + if (!UI_get_item_flag(item, MET)) + { + item.say("@I am Nomaan. What is thy name, " + polite_title + "?@"); + var avatar_or_name = chooseFromMenu2(["I am the Avatar", ("I am " + player_name)]); + if (avatar_or_name == "I am the Avatar") + item.say("He bows stiffly. @Well met, " + polite_title + ".@"); + else + item.say("He bows stiffly. @Well met, " + player_name + ".@"); + + } + else + { + item.say("@What else can I help thee with?@"); + + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + + if (gflags[ASK_NOMAAN_ABOUT_RUNE]) + add("rune"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + + case "name" (remove): + say("@Naughty Nomaan, they call me.@"); + add(["naughty"]); + + case "job"(remove): + say("@I run the armoury, buying and selling weapons.@"); + add(["buy", "sell"]); + + + case "buy": + if (!shop_is_open) + say("@Come back to my shop when its open.@*"); + else + { + say("@Arms or armor?@*"); + add(["arms", "armor"]); + } + + case "sell": + if (!shop_is_open) + say("@Come back to my shop when its open.@*"); + else + { + sellBackItems(sell_shapes, sell_options, sell_prices, 3); + } + + case "arms": + buyWeapons(item, weapon_options, weapon_prices, weapon_shapes, dialog); + + case "armor": + buyArmor(item, armor_options, armor_prices, armor_shapes, dialog); + + case "naughty"(remove): + say("@'Tis just a nickname, of course. You see a hint of a smile on his face.@"); + + case "rune"(remove): + say("@I won a rune in a tournament once. 'Tis gone now, though - and there's a fine tale about it!@"); + add(["tale", "mantra"]); + + case "tale"(remove): + say("@I remember it as if it were yesterday...@*"); + say("@Zellivan held a tourney and I was awarded the Rune of Valour. Afterwards, we were at the pub, celebrating. I had drunk a full quart of ale, so my grip was a bit unsteady.@*"); + say("@I was showing the rune around when it fell from my grasp onto the floor. That's when the rat ran out.@"); + add(["rat"]); + + case "rat"(remove): + say("@It scampered over, seized the trinket and ran back 'cross the floor. We all leapt at it, but the little beast was too quick. It was in the hole before anybody could stop it.@"); + add(["hole"]); + + case "hole"(remove): + say("@It ran into a hole in the west wall of the pub, carrying the rune. We tried everything - banging on the wall, digging, poking with a sword. To no avail, though.@*"); + say("@We haven't seen the rune since.@"); + + case "mantra"(remove): + say("@Go ask around in the tavern.@"); + + case "bye": + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@A fine " + time_of_day + " to you, " + polite_title + ".@"; + + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Peer.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Peer.uc new file mode 100755 index 0000000..380adfd --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Peer.uc @@ -0,0 +1,144 @@ + +void Peer object# (0x43c) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int QUALITY_PEER = 66; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var sold_ship = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Why, hello there.@"; + + var av_2nd_greet = "@Hello again.."; + var npc_2nd_greet = "@You look familiar.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + + + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A tall, muscled man with a wide grin."); + item.say("@Hello,@ he says, lumbering over to you and extending a large hand.@"); + UI_set_item_flag(item, MET); + } + else + item.say("He squints at you. @We've met, haven't we?@"); + item.say("@What can I do for ya?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Peer@"); + add(["Peer"]); + + case "job"(remove): + if (sold_ship) + say("@I used to sell ships. But you bought them all!@"); + else + say("@I sell ships.@"); + add(["buy"]); + + case "Peer"(remove): + say("@My father was a sailor, but couldn't spell. He laughs out loud.@"); + add(["sailor"]); + + case "sailor"(remove): + say("@And his father before him.@"); + + case "buy"(remove): + if (sold_ship) + say("@You bought my last craft!@"); + else + { + say("@It'll cost you 200 gold for the deed. Interested?@"); + if (askYesNo()) + { + if (hasGold(200)) + { + if (UI_add_party_items(1, SHAPE_SCROLL, QUALITY_PEER, FRAME_ANY, true)) + { + chargeGold(200); + say("@Excellent!@ After accepting the gold, Peer hands you the deed."); + say("@Sail her straight.@"); + UI_set_item_flag(item, SI_ZOMBIE); //to prevent buying again + } + else + say("@You look pretty full to me, " + polite_title +".@"); + } + else + say("@Thou hast not enough gold.@"); + } + else + say("@You'll ne'er find a better craft.@"); + } + case "bye"(remove): + say("@So long friend.@ He lumbers back to his work."); + + var avatar_goodbye = "@Must be going now..@"; + var npc_goodbye = "@So long friend.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Stelnar.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Stelnar.uc new file mode 100755 index 0000000..e8c0169 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Stelnar.uc @@ -0,0 +1,238 @@ + +void Stelnar object# (0x443) () //0x443 +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int SHAPE_SPILL = 912; //blood shape + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == KID_GAMES) + { + var barks = ["@T'was a rat, ye bastard!@", + "@Oof!@", + "@Take that!@", + "@I'll cut you!@", + "@Fight like a man, ya coward!@", + "@Thou dost hit like a girl!@"]; + var rand_barks = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand_barks]); + + } + } + + + if (event == DOUBLECLICK) + { + + + if (gflags[AVATAR_IS_SHERRY]) + { + var avatar_pos = UI_get_object_position(AVATAR); + var rand_bottle_frame = UI_die_roll(6, 12); //for broken bottle frames + var rand_booze_frame = UI_die_roll(12, 23); //for booze frames, was 8, 15 + UI_set_schedule_type(item, SHY); + + // Should be 546, SHAPE_BROKEN_DISH + createNewTempShape2(546, rand_bottle_frame, (avatar_pos[1] + (UI_die_roll(-1, 1))), (avatar_pos[2] + (UI_die_roll(-1, 1))), avatar_pos[3]); + createNewTempShape2(SHAPE_SPILL, rand_booze_frame, (avatar_pos[1] + (UI_die_roll(-1, 1))), (avatar_pos[2] + (UI_die_roll(-1, 1))), avatar_pos[3]); + UI_play_sound_effect(37); + delayedBark(STELNAR, "@Did I get it?@", 16); + return; + } + + + + + + //if fighting + if (UI_get_schedule_type(item) == KID_GAMES || gflags[BRAWLING]) + { + item.say("He was just about to punch someone when you approached him. @This is no time for talk. There's fighting to do!@"); + delayedBark(item, "No time for talk!!", 4); + return; + } + + + //Avatar and NPC greeting barks + var av_1st_greet = "@Hail, warrior!@"; + var npc_1st_greet = "@Ho there, " + polite_title + ".@"; + + var av_2nd_greet = "@Hail!@"; + var npc_2nd_greet = "@Ah, 'tis thee again.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + item.say("An angry-looking man wearing short swords on either hip."); + if(isNearby(SHAMINO)) + { + + SHAMINO.say("@Good " + time_of_day + ", Stelnar.@ Shamino and Stelnar shake hands. " + player_name + ", this is Stelnar Starhelm.@"); + SHAMINO.hide(); + item.say("@Pleased to meet you, " + polite_title + ", " + player_name + ".@"); + + } + else + item.say("Ho there, " + polite_title + "!@"); + UI_set_item_flag(item, MET); + } + else + item.say("Ho there, " + polite_title + "!@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(ARVIN, MET)) + add("Arvin"); + + if (UI_get_item_flag(CULHAM, MET)) + add("Culham"); + + if (UI_get_item_flag(JERRIS, MET)) + add("Jerris"); + + if (isNearby(SHAMINO)) + add("Shamino"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm called Starhelm.@"); + + case "job"(remove): + say("@I am a monster-slayer.@"); + add(["monster-slayer"]); + + case "Arvin"(remove): + say("@Arvin? He seems a good sort.@"); + + case "Culham"(remove): + say("@He's a bard. I do not really know him.@"); + + case "Jerris"(remove): + say("@Oh, yes. Brave fellow.@"); + + case "Shamino"(remove): + say("@Shamino and I travelled the Spiritwood together for a time.@"); + + case "monster-slayer"(remove): + say("@I hate all monsters. They are a blight on the face of Britannia! For the past year I've been killing wisps and the like in Spiritwood.@"); + add(["wisps"]); + + case "wisps"(remove): + say("@Wisps are nasty flickers, very hard to kill. Not like gargoyles, now.@"); + add(["gargoyles"]); + + case "gargoyles"(remove): + say("@There's one that they call Sin 'Vraal. If I had my way, that gargoyle would be a statue.@"); + add(["Sin 'Vraal", "statue"]); + + case "statue"(remove): + say("@They turn to stone when ye slay them.@"); + if (isNearby(VANKELLIAN)) + { + VANKELLIAN.say("@That's drivel, friend Starhelm!@ says Van Kellian."); + VANKELLIAN.say("@A gargoyle's a flesh and blood beast. Stone indeed!@"); // show_portrait(SELF) + VANKELLIAN.hide(); + say("@Bards! A gargoyle is an ugly monster, and that's that.@"); + add(["ugly"]); + } + + + case "ugly"(remove): + say("@Gargoyle skin is very thick and deep, as everyone knows.@"); + say("@Never trust anything ugly.@"); + if (isNearby(VANKELLIAN)) + { + VANKELLIAN.say("Van murmurs @Ugliness is but skin deep, just as beauty is.@"); + VANKELLIAN.hide(); + } + + + case "Sin 'Vraal"(remove): + say("@He's a vicious daemon.@"); + add(["daemon"]); + + case "daemon"(remove): + say("@Yes, Sin 'Vraal is an evil wretch. How could Lord British imagine that a gargoyle could understand virtue?@"); + add(["Lord British"]); + + case "Lord British"(remove): + say("@Lord British defeated Sin 'Vraal in the underworld. The gargoyle went to live in the Dry Land.@"); + add(["Dry Land"]); + + case "Dry Land"(remove): + say("@Tis a desert east of the Bloody Plains. There is a shrine there.@"); + add(["desert"]); + + case "desert"(remove): + say("@I've never been to that desert, or the Shrine of Honesty.@"); + + case "bye": + + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@Have a pleasant " + time_of_day + ", " + polite_title + ".@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/VanKellian.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/VanKellian.uc new file mode 100755 index 0000000..c0ba64f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/VanKellian.uc @@ -0,0 +1,203 @@ + +void Van_Kellian object# (0x442) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == DUEL) + { + var barks = [ + "@'twas a mouse!@", + "@Ouch!@", + "@Thou didst cut me!@", + "@Not too hard!@", + "@Don't break my lute!@", + "@Who threw that?@" + ]; + + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + + } + else + scheduleBarks(item); + + + + if (event == DOUBLECLICK) + { + //if you are Sherry + if (gflags[AVATAR_IS_SHERRY]) + { + delayedBark(item, "@It's the mouse! Save me!@", 2); + UI_set_schedule_type(item, SHY); + return; + } + + + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, bard!@"; + var npc_1st_greet = "@How do you do?@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Of course, " + polite_title + ".@"; + + //if fighting + if (UI_get_schedule_type(item) == KID_GAMES || gflags[BRAWLING]) + { + item.say("He glances behind himself and ducks, as if expecting someone to throw something at him."); + item.say("@Bit of a brawl going on just now. Be glad to talk to you some other time.@"); + delayedBark(item, "Hey, not the face!", 4); + return; + } + + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A man dressed in velvets and silks of yellow, green and blue. His voice is rich and mellow."); + item.say("@I am the bard Van Kellian. Please, speak your name, " + polite_title + ".@"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + if (avatar_or_name == "I am the Avatar") + item.say("@A pleasure, to be sure, Avatar.@"); + else + item.say("@A pleasure, to be sure, " + player_name + ".@"); + UI_set_item_flag(item, MET); + } + else + item.say("@A very good " + time_of_day + " to ye, my friend.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(STELNAR, MET)) + add ("Starhelm"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Call me Van.@"); + + case "job"(remove): + say("@Why, singing is my trade. Songs to soothe the soul and refresh the mind. Shall I sing for ye?@"); + if ((gflags[IOLO_IN_PARTY]) && (isNearby(IOLO))) + { + IOLO.say("Iolo rolls his eyes and whispers to you. @He believes he does us a favor. This I must hear.@"); + IOLO.hide(); + } + say("@Well? How about a song?@"); + if (askYesNo()) + { + say("The bard plays a harp and sings.*"); + say("@Tho' she disdains to speak to me. Ah how I pine and sigh for her. I would that I were handsome- o Sing ho eyo he hum!@"); + + } + else + say("@Well, perhaps another time, then.@"); + add(["song"]); + + case "song"(remove): + say("@'Tis such a topsy-turvy world. When my sweet lady-love whirls by. I would that I could catch her eye. Sing ho eyo he hum!@"); + + case "mantra"(remove): + say("@Did ye know that the mantra of pride is 'mul?' A beggar told me that.@"); + add(["beggar"]); + + case "beggar"(remove): + say("@There is little enough dignity in the life of a beggar. I gave him a few coins, of course.@"); + + case "Starhelm"(remove): + say("@Starhelm and I have often debated the nature of the gargoyle Sin 'Vraal.@"); + add(["Sin 'Vraal"]); + + case "Sin 'Vraal"(remove): + say("@If Lord British suffers him to live, then I will not harm him. What possible threat could one gargoyle living alone in the Dry Lands be?@"); + if (isNearby(STELNAR)) + { + STELNAR.say("Stelnar says @I'll tell ye, Van. If ye let one gargoyle live, then ye'll be tempted to spare trolls, and then even cyclopses. And then ye forget valour, and soon ye are overrun by monsters!@"); + STELNAR.hide(); + } + else say("@If Lord British suffers him to live, then I will not harm him. What possible threat could one gargoyle living alone in the Dry Lands be?@"); + add(["gargoyle", "valour"]); + + case "valour"(remove): + say("@Valour comes from the courage to be virtuous. Just as compassion comes from a love of all mankind.@"); + if (isNearby(STELNAR)) + { + STELNAR.say("@Aha! That means monsters are not deserving of mercy!@ says Stelnar"); + STELNAR.hide(); + } + say("@Courage grows. Why not love?@"); + + case "gargoyle"(remove): + say("@Well, I hear their skin is stony and rough. Their cries are fierce yowlings to make the blood run cold with fear.@"); + say("@Though, mind ye, I myself have never faced one in combat.@"); + + case "bye": + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Good " + time_of_day + ", and farewell.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Zellivan.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Zellivan.uc new file mode 100755 index 0000000..6b7b377 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Jhelom/Zellivan.uc @@ -0,0 +1,141 @@ + +void Zellivan object# (0x445)() +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hail, milord!@"; + var npc_1st_greet = "@Greetings!@"; + + var av_2nd_greet = "@Might we speak again, milord?@"; + var npc_2nd_greet = "@Ah, welcome back Avatar.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A man with a serpent-and-heart tabard covering his chainmail.*"); + item.say("@Ah, the Avatar! Lord British has spoken fondly of thee, " + polite_title +".@"); + item.say("@I welcome thee to Jhelom. I am Zellivan, and I am lord here.@"); + + } + else + item.say("@Good " + time_of_day + ". We meet again.@"); + + //standard conversation options + var options = ["name", "job", "bye", "Lord British", "rune", "mantra"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Thou mayest call me Zellivan.@"); + + case "job"(remove): + say("@The valorous are often boisterous. I watch over the fighters.@"); + add(["valorous"]); + + case "rune"(remove): + say("@I held a tournament, to decide who would be entrusted with the rune's care.@*"); + say("@You might say that 'no man' was the victor...@ He smiles."); + add(["no man"]); + + case "mantra"(remove): + say("@Hear it for thyself at the Sword and Keg Pub, " + polite_title + ". The songs and tales do the heart good, I say!@"); + add(["Sword and Keg", "tales"]); + + case "no man"(remove): + say("@Ask him yourself!@"); + if (!gflags[ASK_NOMAAN_ABOUT_RUNE]) + gflags[ASK_NOMAAN_ABOUT_RUNE] = true; + + case "tales"(remove): + say("@Those who live the warriors' life like to sing, and to regale one another with fanciful accounts of their exploits.@"); + + case "valorous"(remove): + say("@Here in Jhelom we delight in the clash of arms and the din of battle.@"); + add(["arms", "battle"]); + + case "arms"(remove): + say("@Speak to Nomaan if thou hast need of arms.@"); + + case "Sword and Keg"(remove): + say("@If thou hast tales of swordsmanship, then the Sword and Keg is the place for thee. 'Tis on the north side of town.@"); + + case "battle"(remove): + say("@Ah, battle!@ he sighs. For a time he reminisces with you, trading stories about past exploits."); + + case "earthquake"(remove): + say("@Only an earthquake could make Jhelom tremble, I daresay. We had one just last year. The piers were broken up, but the shipwrights repaired them swiftly.@"); + add(["shipwrights"]); + + case "shipwrights"(remove): + say("@The shipwrights of Jhelom are fastidious and frugal craftsmen.@"); + + case "Lord British"(remove): + say("@I grew up near Castle Britannia. 'Twas the sunset o'er Brittany Bay and the ships at rest in the harbor which drew me away to the sea.@"); + + case "bye": + + var avatar_goodbye = "@Goodbye, Zellivan..@"; + var npc_goodbye = "@Farewell, my friend.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Aaron.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Aaron.uc new file mode 100755 index 0000000..94e5420 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Aaron.uc @@ -0,0 +1,146 @@ +void Aaron object# (0x45b) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Hello hello!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Welcome back, " + polite_title + ".@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A plump blond man with curly blond hair and a cheerful face.*"); + UI_set_item_flag(item, MET); + } + + item.say("@What can I do for you this " + time_of_day + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + UI_set_item_flag(item, SI_ZOMBIE); + say("@My name's Aaron.@"); + } + else + say("@That's funny. I remember your name!@"); + + + case "job"(remove): + say("@I run the sawmill! Is there anything I can do for thee?@"); + add(["sawmill"]); + + case "sawmill"(remove): + say("@Yes, I saw logs into boards.@"); + add(["boards"]); + + case "boards"(remove): + + if (UI_get_schedule_type(item) != TEND_SHOP) + { + say("@Come to my shop when I'm open!@"); + } + else + { + say("@My mill makes smooth boards and planks out of rough-cut logs.@"); + if (UI_count_objects(PARTY, SHAPE_YEW_LOG, QUALITY_ANY, FRAME_ANY) >= 1) + { + say("@Aye, I see you have a yew log.@ He inspects the wood with a practiced eye.*"); + say("@Good grain. Yes, I can make a fine board out of this log. But it will cost thee 5 gold! Still interested?@"); + if (askYesNo()) + { + if (hasGold(5)) + { + if (UI_add_party_items(1, SHAPE_YEW_BOARD, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(5); + UI_remove_party_items(1, SHAPE_YEW_LOG, QUALITY_ANY, FRAME_ANY, true); + say("Aaron goes to his saw and turns the log into a flat, sanded board."); + say("@There!@ He hands you the finished product."); + + } + + else + say("@You don't have room to carry it.@"); + } + else + say("@Sorry, but I can't work for free! Come back when you have the 5 gold!@"); + } + else + say("@Oh. Well, perhaps some other time then.@"); + } + } + + case "bye": + + var avatar_goodbye = "@Thanks..@"; + var npc_goodbye = "@Farewell!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Dale.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Dale.uc new file mode 100755 index 0000000..2e9425c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Dale.uc @@ -0,0 +1,236 @@ + +void Dale object# (0x45c) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var item_options = ["nothing", "glass", "jar", "mirror"]; + var item_shapes = [SHAPE_CUP, SHAPE_JAR, SHAPE_DESK_ITEM ]; + var item_frames = [FRAME_GLASS, 0, FRAME_MIRROR]; + var item_prices = [5, 5, 15]; + + //Dialog options + var initial_choice_question = "@Which item?@"; //arms or armor? etc + var askIfInterested1 = "@That item costs "; + var askIfInterested2 = " gold. Interested, " + polite_title + "?@"; + var cant_afford = "@But thou dost not have enough gold, " + polite_title + "!@"; + var cant_hold = "@But 'twould make thee o'erburdened, " + polite_title + "!@"; + var saidNo = "@Very well.@"; + var nothing = "@Anything else can I do for thee?@"; + var success = "@Excellent!@ After accepting your gold, Dale hands over the "; + var success2; //"I hope this item works well for you!" etc if needed + var has_quantity; + var ask_quantity; + + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + const int GLASS_SELL_PRICE = 5; + + const int GEM_BUY_PRICE = 30; + + const int JAR_SELL_PRICE = 5; + const int MIRROR_SELL_PRICE = 15; //or large mirror? + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hello there..@"; + var npc_1st_greet = "@Mmmhmm, yes?@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Avatar, hello!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A short, barrel-chested man.*"); + UI_set_item_flag(item, MET); + } + item.say("@A good " + time_of_day + " to thee, Avatar.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(item, SI_ZOMBIE)) + add("glass sword"); + + //knows he needs a human lens + if (gflags[LENS]) + add("lens"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Dale the Glassblower@"); + + case "job"(remove): + say("@I make glassware, the finest in the land!@"); + add(["glassware"]); + + case "glassware"(remove): + say("@If you'd like to buy some of my glassware, just say the word!@"); + add(["buy", "sell"]); + + case "glass sword"(remove): + say("@Aye, I know how to make glass swords. But there is little demand for them.@"); + add(["demand"]); + + case "demand"(remove): + say("@I require five gems for the crafting. This is too expensive for most. Aye, but things of beauty they are...@"); + add(["beauty"]); + + case "beauty"(remove): + say("@Thou seemst like a person who appreciates art. I'll make thee one, if thou hast the gems.@"); + add(["gems"]); + + case "gems"(remove): + if (UI_get_schedule_type(item) != TEND_SHOP) + say("@Come to my shop when it's open!@"); + else + { + say("@Aye, a glass sword needs fine gems to complete its beauty!@"); + if (UI_count_objects(PARTY, SHAPE_GEMS, QUALITY_ANY, FRAME_ANY) < 5) // + say("@Sorry, " + player_name + ", you haven't enough gems.@"); + else + { + say("@Aye, " + player_name + ", I see the gems you carry. Dost thou wish me to craft thee a glass sword?@"); + if (askYesNo()) + { + say("@It will cost thee 5 gems! Art thou certain?@"); + if (askYesNo()) + { + say("Dale turns to the furnace and begins crafting the sword. Soon it is finished, and you marvel at its beauty!*"); + say("@There she is, and a finer work thou'lt never see!@"); + UI_add_party_items(1, SHAPE_GLASS_SWORD, QUALITY_ANY, FRAME_ANY, false); + UI_remove_party_items(5, SHAPE_GEMS, QUALITY_ANY, FRAME_ANY, false); + } + else + say("@Hmm@, he scowls, @perhaps I was mistaken about thee.@"); + } + else + say("@Hmm@, he scowls, @perhaps I was mistaken about thee.@"); + } + } + + case "lens"(remove): + say("@Hmmm...You'd have to see a lensmaker about that. I hear there's one near the Lycaeum.@"); + + case "sell"(remove): + say("@Do you have any gems to sell me?@"); + if (askYesNo()) + { + var gem_count = UI_count_objects(PARTY, SHAPE_GEMS, QUALITY_ANY, FRAME_ANY); + UI_error_message("Gem amount is " + gem_count); + if (gem_count > 0) + { + say("@I will give thee " + GEM_BUY_PRICE + " for each gem. Agreeable?@"); + if (askYesNo()) + { + + say("@How many gems dost thou wish to sell?@"); + var quantity = UI_input_numeric_value(0, gem_count, 1, 1); + + if (quantity > 0) + { + UI_add_party_items(quantity * GEM_BUY_PRICE, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY, false); + UI_remove_party_items(quantity, SHAPE_GEMS, QUALITY_ANY, FRAME_ANY, false); + + say("@Great!@ Dale takes your gems and gives you your gold."); + } + else + say("@Hmm@, he scowls, @Maybe some other time then..@"); + + } + else + say("@Hmm@, he scowls, @Maybe some other time then..@"); + + } + else + say("@I don't see any gems.@"); + + } + else + say("@I'm always needing them for my glassblowing, let me know when you want to sell any.@"); + + case "buy"(remove): + if (!shop_is_open) + say("@Come to my shop when it's open!@"); + else + buyItems(DALE, item_options, item_prices, item_shapes, item_frames, dialog); + + case "bye": + + var avatar_goodbye = "@Farewell!@"; + var npc_goodbye = "@A fine " + time_of_day + " to thee!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Doris.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Doris.uc new file mode 100755 index 0000000..d539bcd --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Doris.uc @@ -0,0 +1,227 @@ + +void Doris object# (0x460) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + /* + if (event == PROXIMITY) + { + //barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@Insert line here..@", 0); + delayedBark(item, "@Insert line here@", 8); + delayedBark(item, "@Insert line here@", 16); + } + else if (barks == 2) + delayedBark(item, "@Other lines...@", 2); + else + delayedBark(item, "@Other lines...@", 3); + } + */ + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me, miss..@"; + var npc_1st_greet = "@Mmmhmm?@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Mmmhmm, yes?@"; + + if (UI_get_item_flag(item, SI_ZOMBIE)) + npc_2nd_greet = "@Ready to check out?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + + //checking out of the Inn + if (UI_get_item_flag(item, PETRA)) + { + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + var has_key = UI_find_object(PARTY, SHAPE_KEY, QUALITY_DORIS_INN, FRAME_ANY); + item.say("@Are you ready to check out?@"); + if(askYesNo()) + { + if (has_key) + { + if (hour < 12) + { + say("Doris sullenly serves you breakfast and then returns to her studies.@"); + UI_add_party_items(partynum, SHAPE_FOOD, QUALITY_ANY, FRAME_EGG); + + } + say("@I hope you enjoyed your stay.@ Doris says without any hospitality in her voice."); + sayGoodbye2(item); + UI_remove_party_items(1, SHAPE_KEY, QUALITY_DORIS_INN, FRAME_ANY); + UI_clear_item_flag(item, PETRA); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + return; + } + else + { + say("@Where is key? You go find it.@"); + sayGoodbye2(item); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + //UI_move_object(PARTY, [1713, 0274], true); + return; + } + + } + else + { + say("@Don't forget checkout time, yes?@"); + //UI_move_object(PARTY, [1713, 0274], true); + sayGoodbye2(item); + return; + } + + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + } + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a a stunningly beautiful young woman.*"); + item.say("The woman never looks up from the book she's reading, even when you speak to her.*"); + item.say("@Yes, what do you want?@"); + UI_set_item_flag(item, MET); + } + else + { + item.say("Doris never looks up from the book she's reading, even when you speak to her.*"); + item.say("@Yes, what do you want now?@"); + } + + //standard conversation options + var options = ["name", "job", "bye", "beautiful"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name's Doris, but you can just call me 'Hey you'. Everyone else does.@"); + add(["Hey you"]); + + case "job"(remove): + say("@I'm in charge of the Tinker's Inn while my father's away. If you have any complaint, no matter how trivial, please feel free to bother me.@"); + say("It doesn't really sound like she means what she said."); // Narrator says this + add(["father", "room"]); + + case "Hey you"(remove): + say("@Typical@, she mutters."); + + case "room"(remove): + say("@Room and board's 5 gold per night per person, cash in advance. Interested?@"); + if (askYesNo()) + { + if (hasGold(5 * partynum)) + { + chargeGold(5 * partynum); + say("@Your room is first door on the left. Checkout time is noon and be here earlier than that if you want breakfast.@ She gives you the key to your room and goes back to her book."); + UI_add_party_items(1, SHAPE_KEY, QUALITY_DORIS_INN, FRAME_DORIS); + UI_set_item_flag(item, PETRA); //set so she asks for key back + sayGoodbye2(item); + break; + + } + else + say("@No pay, no stay. 5 gold each, cash in advance.@"); + } + else + say("@What a pity.@"); + + case "beautiful"(remove): + say("@Yes, that's what they all say.@"); + + case "father"(remove): + say("@My father called me back from the Lycaeum so that he could go fight the gargoyles.@"); + add(["Lycaeum"]); + + case "Lycaeum"(remove): + say("@Yes, I'm learning the mystic arts from the great Xiao. Though I doubt you'd know much about that sort of thing.@"); + add(["Xiao"]); + + case "Xiao"(remove): + say("@She is the wisest mage in all Britannia. Only she can teach the spells of the greatest power.@"); + add(["power"]); + + case "power"(remove): + say("@Mmm-hmm, that's right.@"); + + case "bye": + var avatar_goodbye = "@That is all..@"; + var npc_goodbye = "@Mmm-hmmm..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Isabella.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Isabella.uc new file mode 100755 index 0000000..a501785 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Isabella.uc @@ -0,0 +1,195 @@ + +void Isabella object# (0x461) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + /* + if (event == PROXIMITY) + { + //barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@Insert line here..@", 0); + delayedBark(item, "@Insert line here@", 8); + delayedBark(item, "@Insert line here@", 16); + } + else if (barks == 2) + delayedBark(item, "@Other lines...@", 2); + else + delayedBark(item, "@Other lines...@", 3); + } + */ + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, milady.@"; + var npc_1st_greet = "@'tis the Avatar!@"; + + var av_2nd_greet = "@Might we speak again, milady?@"; + var npc_2nd_greet = "@Greetings, Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A woman of elegant demeanor, wearing a finely embroidered dress.*"); + item.say("@Ah, " + polite_title + " " + player_name + ", the famous Avatar!@*"); + item.say("@I have heard much of thy exploits, but never expected to meet you in person.@*"); + item.say("@'Tis indeed an honor.@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Good " + time_of_day + ", Avatar. I'm glad thy travels have brought thee here again.@"); + + //standard conversation options + var options = ["name", "job", "bye", "gargoyles"]; + + if (gflags[LEARNED_ABOUT_BALLOONIST] || gflags[LEARNED_ABOUT_FLYING]) + add("balloon"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Lady Isabella. Thy name, of course, is well known throughout the land.@"); + add(["known"]); + + case "job": + say("@Tis my privilege to be mayor of Minoc, the city of sacrifice. We are renowned for our fine craftsmen@"); + add(["sacrifice", "craftsmen"]); + + case "known"(remove): + say("@The tales of thy exploits are known by even the smallest of children. I recognized thee from the portrait Woodroffe made the last time thou came to our land.@"); + add(["Woodroffe"]); + + case "Woodroffe"(remove): + say("@One of the finest artisans that ever dwelt in Minoc. Alas, he died of the flu two years ago.@"); + add(["flu"]); + + case "flu"(remove): + say("@Aye, a pity, that.@"); + + case "sacrifice"(remove): + say("@We were entrusted with the Rune of Sacrifice.@"); + add(["rune", "mantra"]); + + case "craftsmen"(remove): + say("@The artisan's guild is located here.@"); + + case "rune"(remove): + say("@I gave it to Selganor, the artisan's guildmaster.@"); + //can ask Selganor about rune + if (!UI_set_item_flag(SELGANOR, SI_ZOMBIE)) + UI_set_item_flag(SELGANOR, SI_ZOMBIE); + add(["Selganor", "Artisan's Guild"]); + + case "Artisan's Guild"(remove): + say("@When the Rune of Sacrifice was sent to our city, I entrusted it to their care.@"); + + case "Selganor"(remove): + say("@He's a fine musician. He lives just across the road from me, in the guild hall.@"); + add(["musician"]); + + case "musician"(remove): + say("@If I weren't so busy, I'd take lessons from him myself.@"); + add(["busy"]); + + case "busy"(remove): + say("@Aye, this is a big city.@"); + + case "mantra"(remove): + say("@The good healer Tara should be able to tell you the mantra. Go ask at her house, on the north side of town.@"); + //prmopt Tara to ask about mantra + if (!UI_get_item_flag(TARA, SI_ZOMBIE)) + UI_set_item_flag(TARA, SI_ZOMBIE); + add(["Tara"]); + + + case "Tara"(remove): + say("@Tara is a very compassionate woman.@"); + + case "gargoyles"(remove): + say("@I've heard rumors of such creatures, but I know no one who has actually seen one.@"); + + case "balloon"(remove): + say("@Ah, thou wouldst be interested to hear of that. The balloonist flew off on an important mission and never returned. Selganor should be able to tell you more about it.@*"); + + //ask Selganor about balloon + if (!UI_get_item_flag(SELGANOR, PETRA)) + UI_set_item_flag(SELGANOR, PETRA); + + say("@Tell me, is it true you once rode in a balloon whilst on the quest of the Avatar?@"); + if (askYesNo()) + say("@It must have been wonderful, to drift amongst the very clouds...@"); + else + say("@Ah, well...Some tales are but empty words, with less substance than the breath that carries them.@"); + add(["mission"]); + + case "mission"(remove): + say("@Yes, ask Selganor.@"); + add(["Selganor"]); + + case "bye"(remove): + say("@Farewell, and please honor us with your presence again soon.@"); + + var avatar_goodbye = "@Goodbye, Isabella..@"; + var npc_goodbye = "@The Avatar is always welcome here!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/James.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/James.uc new file mode 100755 index 0000000..6891299 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/James.uc @@ -0,0 +1,179 @@ + +void James object# (0x45d) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var price; + var item_choice; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == BLACKSMITH) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + var armor_options = ["nothing", "chain coif", "chain armor", "chain leggings", "ring mail", "scale mail", "winged helm"]; + var armor_shapes = [SHAPE_CHAIN_COIF, SHAPE_CHAIN_ARMOR, SHAPE_CHAIN_LEGGINGS, SHAPE_RING_MAIL, SHAPE_SCALE_MAIL, SHAPE_WINGED_HELM]; + var armor_prices = [15, 50, 35, 35, 70, 20]; + + var sell_rate = 2; //integer to divide by when selling items back to npc + var sell_options = ["nothing", "chain coif", "chain armor", "chain leggings", "ring mail", "scale mail", "winged helm", "dagger", "mace", "main gauche", "morning star", "sword"]; + + var weapon_options = ["nothing", "dagger", "mace", "main gauche", "morning star", "sword"]; + var weapon_shapes = [SHAPE_DAGGER, SHAPE_MACE, SHAPE_MAIN_GAUCHE, SHAPE_MORNING_STAR, SHAPE_SWORD]; + var weapon_prices = [10, 35, 20, 40, 35]; + + //Dialog options + var initial_choice_question = "@Which item?@"; //arms or armor? etc + var askIfInterested1 = "@That costs "; //needs to be split into array to capture price + var askIfInterested2 = " gold. Interested, " + player_name + "?"; + var cant_afford = "@But thou dost not have enough gold, " + polite_title + "!@"; + var cant_hold = "@But 'twould make thee o'erburdened, " + polite_title + "!@"; + var saidNo = "@Changed your mind, eh?@"; + var nothing = "@Changed your mind, eh? What else?@"; + var success = "@Excellent!@ After accepting your gold, James hands over the "; + var success2; //"I hope this item works well for you!" etc if needed + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, cant_afford, cant_hold, saidNo, nothing, success, success2]; + //buyArmor(item, armor_options, prices, shapes, dialog); + + + + //************************************/ + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var met_utomo = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Might we speak?@"; + var npc_1st_greet = "@Well met!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Hail, " + polite_title + ".@"; + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A young lad.*"); + item.say("@A good " + time_of_day + " to you, " + polite_title + ".@"); + item.say("@What can I do for thee?@"); + } + else + { + item.say("@A good " + time_of_day + " to you, " + polite_title + ".@"); + item.say("@Is there more I can do for thee?@"); + + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Me name's James, " + polite_title + ".@"); + + case "job"(remove): + say("@I'm just the apprentice, but if you want to buy or sell somethin' I can help ya.@"); + add(["apprentice", "buy", "sell"]); + + case "apprentice"(remove): + say("@Me master went off to fight the gargoyles. 'E ain't been 'eard from since. I'm just mindin' the place 'til 'e gets back@"); + + case "sell": + if (shop_is_open) + sellBackItems([armor_shapes, weapon_shapes], [sell_options], [armor_prices, weapon_prices], 3); + else + say("@Come to me shop when it's open!@"); + + case "buy"(remove): + if (shop_is_open) + { + say("@Be more specific, " + polite_title + ". Me master 'as quite a large inventory. Dost thou want arms or armor?@"); + add(["arms", "armor"]); + } + else + say("@Come to me shop when it's open!@"); + + case "arms": + if (UI_get_schedule_type(item, BLACKSMITH)) + buyWeapons(item, weapon_options, weapon_prices, weapon_shapes, dialog); + else + say("@Come to me shop when it's open!@"); + + case "armor": + if (UI_get_schedule_type(item, BLACKSMITH)) + buyArmor(item, armor_options, armor_prices, armor_shapes, dialog); + else + say("@Come to me shop when it's open!@"); + + case "bye": + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Come again!@"; + say("@Good " + time_of_day + " to ya, and I 'ope ye come back soon!@"); + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Michelle.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Michelle.uc new file mode 100755 index 0000000..f6deeb4 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Michelle.uc @@ -0,0 +1,267 @@ + +void Michelle object# (0x45a) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var USER_INPUT; + + const int FRAME_BASKET = 0; //shape 1200 basket shape + const int BEEHIVE_SELL_PRICE = 15; + const int BASKET_SELL_PRICE = 10; + const int QUAL_BALLOON_PLANS = 59; + const int BALLOON_BASKET_SELL_PRICE = 300; + + var PARTY_GOLD = UI_count_objects(PARTY, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == TEND_SHOP) + { + //reorganised to make it easier to add barks + var barks = [ + "@Beautiful baskets!@", + "@Finely woven beehives here!@", + "@Best baskets in all of Britannia!@", + "@Get your beehives here!@" + ]; + + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + //Otherwise, say generic NPC barks + else scheduleBarks(item); + } + + + if (event == DOUBLECLICK) + { + + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings..@"; + var npc_1st_greet = "@Ah, hello there!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Ah, hello!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("An industrious young woman.*"); + UI_set_item_flag(item, MET); + } + else + item.say("@Well, hello again, Avatar!@*"); + item.say("@How can I help thee this fine " + time_of_day + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm Michelle.@*"); + say("@Thou needn't tell me thy name, " + player_name + ". The Avatar is famous throughout the land!@"); + + case "job"(remove): + say("@I weave baskets and beehives, just like my father and his father before him.@"); + say("@My baskets are sold throughout Britannia!@ she adds proudly."); + add(["buy", "sell", "father"]); + + case "father"(remove): + say("@Father once told me a story of weaving a basket large enough for eight people! He never showed me the plans, though.@"); + if (!gflags[LEARNED_ABOUT_BALLOONIST]) + gflags[LEARNED_ABOUT_BALLOONIST] = true; //flag used to prompt Sutek convo + add(["plans"]); + + case "buy"(remove): + if (!UI_get_schedule_type(item) == TEND_SHOP) + say("@Come to my shop when I'm open!@"); + else + { + say("@Wouldst thou like to buy one of my weavings?@"); + if (askYesNo()) + { + converse(["basket", "beehive", "custom job", "nothing"]) + { + case "basket": + say("@These baskets are sturdy and decorative. Thou'lt find no better in all Britannia for the price, a mere " + BASKET_SELL_PRICE + " gold. How many?@"); + USER_INPUT = (UI_input_numeric_value(1, 5, 1, 1)); //0 - 5, 1 increment? + if (hasGold(USER_INPUT * BASKET_SELL_PRICE)) + { + if (UI_add_party_items(USER_INPUT, SHAPE_BASKET, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(BASKET_SELL_PRICE * USER_INPUT); + if ((USER_INPUT) > 1) + say("Michelle takes your money and hands over the baskets. @I appreciate thy business.@"); + else + say("Michelle takes your money and hands over the basket. @I appreciate thy business.@"); + say("@Is there aught else thou wouldst buy?@"); + } + else + say("@But thou canst not carry any baskets!@"); + } + else + say("@Thou hast not enough gold for that many!@"); + + case "beehive": + say("@If thou hast need of beehives, these woven ones are the best thou'lt find! And cheap, too, at " + BEEHIVE_SELL_PRICE + " apiece. How many?"); + USER_INPUT = (UI_input_numeric_value(1, 5, 1, 1)); //0 - 20, 1 increment? + if (hasGold(USER_INPUT * BEEHIVE_SELL_PRICE)) + { + if (UI_add_party_items(USER_INPUT, SHAPE_BEEHIVE, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(BEEHIVE_SELL_PRICE * USER_INPUT); + if ((USER_INPUT) > 1) + say("Michelle takes your money and hands over the beehives. @I appreciate thy business.@"); + else + say("Michelle takes your money and hands over the beehive. @I appreciate thy business.@"); + say("@Is there aught else thou wouldst buy?@"); + } + else + say("@But thou canst not carry any beehives!@"); + } + else + say("@Thou hast not enough gold for that many!@"); + + case "custom job" (remove): + say("@I fear my schedule is packed. I have no time to create a basket for which I have no plans.@"); + + + case "nothing": + say("@Perhaps some other time.@"); + break; + + + }//end converse + + } + else + say("@All right, though I can give thou the best price in the land!@"); + } + + + case "sell"(remove): + say("@I have all I need, and have no reason to purchase anything more. But I appreciate thy offer.@"); + + case "plans"(remove): + if (!UI_get_schedule_type(item) == TEND_SHOP) + say("@Ask when I'm open for business!@"); + else + say("@Yes, without accurate plans it takes far too much time to craft a basket.@"); + if ((UI_count_objects(PARTY, SHAPE_SCROLL, QUAL_BALLOON_PLANS, FRAME_ANY) > 0)) + add(["have plans"]); + + case "have plans"(remove): + say("@Then it was true! Father did weave a basket that big!@*"); + say("@Surely I could do the same.@ She studies the plans for a moment."); + say("@Such a basket would cost 300 gold, in advance. Art thou still interested?@"); + if (askYesNo()) + { + if (hasGold(BALLOON_BASKET_SELL_PRICE)) //300 + { + if (UI_add_party_items(1, SHAPE_BALLOON_BASKET, QUALITY_ANY, FRAME_BASKET, true)) + { + chargeGold(BALLOON_BASKET_SELL_PRICE); + say("She begins weaving the huge basket, chatting with you as she works.*"); + say("@Hast thou found a silk weaver yet?@"); + if (askYesNo()) + say("@Thou art wise, then. 'Tis a huge bag this will require.@"); + else + say("@Well, I can see that this will require a huge silk bag. I know not where thou might find a silk weaver to craft it!@"); + + say("She continues weaving the basket. @I do not mean to pry, but why dost thou need a balloon anyway?@"); + converse(["sight seeing", "gargoyle shrine"]) + { + case "sight seeing": + say("@Oh, I see.@*"); + say("She continues weaving the basket. Time passes...*"); + say("More time passes...*"); + say("@Finished! It took less time than I had thought it might!@"); + say("She gives the basket to you, and you struggle under its weight."); + //UI_add_party_items(1, SHAPE_BALLOON_BASKET, QUALITY_ANY, 0); // + break; + + case "gargoyle shrine": + say("@I'm afraid I don't understand.@*"); + say("She continues weaving the basket. Time passes...*"); + say("More time passes...*"); + say("@Finished! It took less time than I had thought it might!@"); + say("She gives the basket to you, and you struggle under its weight."); + //UI_add_party_items(1, SHAPE_BALLOON_BASKET, QUALITY_ANY, 0); //FRAME 0 + break; + } + } + else + { + say("@But it would weigh six stones! Thou couldst not carry such a basket, loaded as thou art.@*"); + say("@Lighten thy load, and then I will weave thee this basket.@"); + } + } + else + say("@Thou hast not enough money for the basket. I fear I cannot afford to start such a task on a mere " + PARTY_GOLD + " gold crowns.@"); + } + else + say("@I do not blame thee. 'Tis a huge undertaking!@"); + + case "bye": + + var avatar_goodbye = "@Thanks, Michelle..@"; + var npc_goodbye = "@Farewell! I hope I've aided thy quest!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Selganor.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Selganor.uc new file mode 100755 index 0000000..151edcb --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Selganor.uc @@ -0,0 +1,245 @@ + +void Selganor object# (0x458) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + + var asked_about_rune = UI_get_item_flag(item, SI_ZOMBIE); + var isabella_balloon = UI_get_item_flag(item, PETRA); + var gave_rune = UI_get_item_flag(item, FREEZE); + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, bard!@"; + var npc_1st_greet = "@Hello and welcome, " + polite_title + ".@"; + + var av_2nd_greet = "@Hello again, Selganor.@"; + var npc_2nd_greet = "@Ah yes, welcome back!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a a slender, graceful man tuning a lute."); + item.say("@Oh, hello. Maybe you can help me with something. My nephew is studying alchemy, and he needs to know this.@"); + item.say("He asks you a few alchemy questions and you answer them."); + item.say("@Thanks! Now what can I do for you?@"); + UI_set_item_flag(item, MET); + } + else + item.say("@A pleasure to see thee again, " + player_name + ". What wouldst thou speak of?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //either learned about balloon or asked Isabella about it + if (gflags[LEARNED_ABOUT_FLYING] || gflags[LEARNED_ABOUT_BALLOONIST]) + add("balloon"); + + if (gflags[JOINED_ARTISANS_GUILD]) + add(["Julia", "Gwenno", "panpipes"]); + + if (asked_about_rune) + add("rune"); + + + if (UI_get_item_flag(ISABELLA, MET)) + add ("Lady Isabella"); + + if (UI_get_item_flag(GWENNO, MET)) + add ("Gwenno"); + + if (UI_get_item_flag(JULIA, MET)) + add ("Julia"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Selganor. 'Tis a name with a long history... But you have the look of one with more important business.@"); + add(["business","history"]); + + case "job"(remove): + say("@I am the guildmaster of artisans.@"); + + case "history"(remove): + say("@It means 'seeker of the crystal'. Perhaps I'll tell you more some other time.@"); + add(["crystal"]); + + case "crystal"(remove): + say("@That's quite a tale.@"); + add(["tale"]); + + case "tale"(remove): + say("@Indeed.@"); + + case "business"(remove): + say("@Perhaps you're interested in joining the guild.@"); + add(["join guild"]); + + case "rune"(remove): + if (gflags[JOINED_ARTISANS_GUILD]) + say("@I already loaned you the rune.@"); + else + say("@I'd be glad to loan you the rune, but only members of the guild are allowed to handle it.@"); + add(["join guild"]); + + case "join guild"(remove): + if (!gflags[JOINED_ARTISANS_GUILD]) + { + if (!gflags[ASKED_SELGANOR_ABOUT_RUNE]) + gflags[ASKED_SELGANOR_ABOUT_RUNE] = true; + + say("@If you want to join the guild, you need to do two things. First, you need to make a set of panpipes. Julia can teach you how to that. You also need to commit 'Stones' to memory. 'Tis a simple tune - ask Gwenno to play it for thee.@"); + add(["Julia", "panpipes", "Gwenno"]); + } + else + say("@Wait a minute... You're already a member of the guild!@"); + + case "panpipes"(remove): + if (!gflags[JOINED_ARTISANS_GUILD]) + { + say("@Have you made a set of panpipes?@"); + if (askYesNo()) + { + if (UI_count_objects(PARTY, SHAPE_PANPIPES, QUALITY_ANY, FRAME_ANY) >= 1) + { + say("He inspects the pipes. @Very good, very good indeed. Now play the sequence of notes in 'Stones' and I'll induct you into the guild.@"); //going with SNES version where you play + //script Avatar? + add(["play 'Stones'"]); + } + else + say("@But I don't see any!@"); + + } + else + { + say("@Oh. Well, Julia can show you how if you need help.@"); + add(["Julia"]); + } + } + else + say("@You should play your panpipes often - 'twill lighten your step on the long road ahead.@"); + + case "Julia"(remove): + if (isNearby(JULIA)) + say("@Yes, ask her about it.@"); + else + { + say("@She made my lute - and most of our other instruments as well. She lives just across the road, next door to Lady Isabella.@"); + add(["lute", "Lady Isabella"]); + } + + case "Lady Isabella"(remove): + say("@She's the mayor.@"); + + case "Gwenno"(remove): + say("@I know she's around here somewhere...@"); + if (isNearby(GWENNO)) + { + GWENNO.say("@I'm right here, Selganor!@"); + GWENNO.hide(); + say("@Ah, I knew you'd be somewhere close by.@"); + } + + case "lute"(remove): + say("@I prefer stringed instruments. They make such lovely sounds.@"); + + case "balloon"(remove): + say("@Oh, are you looking for the man who invented the balloon?@ He stares upward, stroking his chin pensively. @Ah yes, now I remember. He flew to Sutek's castle. Said something about a big job he had to do there.@"); + if (!gflags[LEARNED_ABOUT_BALLOONIST]) + gflags[LEARNED_ABOUT_BALLOONIST] = true; //flag used to prompt Sutek convo + add(["Sutek"]); + + case "Sutek"(remove): + say("@Sutek lives on an island, far to the south.@"); + + case "island"(remove): + say("@It's east of Serpent's Hold.@"); + + case "play 'Stones'"(remove): + say("@Now play the first verse of 'Stones' on the panpipes and I'll induct you into the guild.@"); + //add song? + if (!gflags[LEARNED_STONES]) + { + say("You attempt to play the notes of 'Stones' on your panpipes --horribly."); + if(isNearby(IOLO)) + { + IOLO.say("Iolo cringes, and shakes his head."); + IOLO.hide(); + } + say("@No, I'm afraid that's not it. Gwenno can help you learn the notes.@"); + } + else + { + say("You play the first verse of 'Stones' on your panpipes.*"); + UI_play_music(209, AVATAR); + say("@Excellent!@ He strums a chord on his lute, then taps you lightly once on each shoulder with it."); + + say("@You are now a full member of the guild of artisans. He reaches into a belt-pouch, takes out the Rune of Sacrifice, and hands it to you.*"); + say("@I'm sure you'll be needing this in your travels. I know you'll find some solution to this gargoyle problem.@"); + UI_add_party_items(1, SHAPE_RUNE, QUALITY_ANY, FRAME_SACRIFICE); + + giveExperience(50); + gflags[JOINED_ARTISANS_GUILD] = true; + } + + case "bye": + + var avatar_goodbye = "@Must be going now..@"; + var npc_goodbye = "@It was nice talking to you.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Tara.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Tara.uc new file mode 100755 index 0000000..41a72ac --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Tara.uc @@ -0,0 +1,127 @@ + +void Tara object# (0x459) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me, ma'am..@"; + npc_1st_greet = "@Yes, dearie?@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@Welcome back, dearie.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("A kindly old woman.*"); + item.say("@Welcome to my place of healing, Avatar.@*"); + item.say("@I hope thou needest not my services!@*"); + } + else + item.say("@Welcome again, noble Avatar. I hope this visit is for pleasure, not business!@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + //asked Isabella about mantra + if (UI_get_item_flag(item, SI_ZOMBIE)) + add("mantra"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Tara.@"); + + case "job"(remove): + say("@I'm the healer for this town. I've cared for the unfit here for threescore years!@"); + add(["unfit"]); + + case "unfit"(remove): + say("@Those who need healing, curing, or to be resurrected.@"); + add(["healing"]); + + case "healing"(remove): + chantuHeal(10, 30, 400); + + + case "mantra"(remove): + if (!gflags[LEARNED_MANTRA_SACRIFICE]) + { + gflags[LEARNED_MANTRA_SACRIFICE] = true; + giveExperience(25); + } + say("@'Cah,' that is the word of sacrifice.@"); + + case "bye": + var avatar_goodbye = "@Goodbye, Tara!@"; + var npc_goodbye = "@Farewell, dearie!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Trebor.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Trebor.uc new file mode 100755 index 0000000..7032f63 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Trebor.uc @@ -0,0 +1,136 @@ + +void Trebor object# (0x45e) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int QUALITY_TREBOR = 67; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var sold_ship = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Ahoy there!@"; + var npc_1st_greet = "@Why, hello there.@"; + + var av_2nd_greet = "@Hello again.."; + var npc_2nd_greet = "@You look familiar.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + + + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A tall, muscled man with a wide grin."); + item.say("@Hello,@ he says, lumbering over to you and extending a large hand.@"); + UI_set_item_flag(item, MET); + } + else + item.say("He squints at you. @We've met, haven't we?@"); + item.say("@What can I do for ya?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Trebor.@"); + + case "job"(remove): + if (sold_ship) + say("@I used to sell ships. But you bought them all!@"); + else + say("@I sell ships.@"); + add(["buy"]); + + case "buy"(remove): + if (sold_ship) + say("@You bought my last craft!@"); + else + { + say("@It'll cost you 250 gold for the deed. Interested?@"); + if (askYesNo()) + { + if (hasGold(250)) + { + if (UI_add_party_items(1, SHAPE_SCROLL, QUALITY_TREBOR, FRAME_ANY, true)) + { + chargeGold(200); + say("@Excellent!@ After accepting the gold, Trebor hands you the deed."); + say("@Sail her straight.@"); + UI_set_item_flag(item, SI_ZOMBIE); //to prevent buying again + } + else + say("@You look pretty full to me, " + polite_title +".@"); + } + else + say("@Thou hast not enough gold.@"); + } + else + say("@You'll ne'er find a better craft.@"); + } + case "bye"(remove): + say("@So long friend.@ He lumbers back to his work."); + + var avatar_goodbye = "@Must be going now..@"; + var npc_goodbye = "@So long friend.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Troy.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Troy.uc new file mode 100755 index 0000000..b075bfd --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Minoc/Troy.uc @@ -0,0 +1,161 @@ + +void Troy object# (0x45f) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings..@"; + npc_1st_greet = "@Oh, hello.@"; + + av_2nd_greet = "@Hello again..@"; + npc_2nd_greet = "@Oh, hello there.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + item.say("A spidery looking man with delicate hands.*"); + item.say("@Hello.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Troy.@"); // Set the met flag + + case "job"(remove): + say("@I make clocks. The movements of the various parts are very complex and interconnected. Like the moons and stars, or the pieces on a chess board.@"); + add(["clocks", "moons", "chess board", "buy"]); + + case "buy"(remove): + say("@My grandfather clocks require a six month order in advance. I do have pocketwatches readily availiable, however. Would you like to buy a pocketwatch for 50 gold pieces?@"); + if (askYesNo()) + { + if (hasGold(50)) + { + if (UI_add_party_items(1, SHAPE_POCKETWATCH, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(50); + say("@Troy takes your money and hands you a pocketwatch.@*"); + } + else + say("@Perhaps when your not so overburdened.@"); + } + else + say("@You don't have enough money for a pocketwatch.@"); + } + else + say("@Perhaps some other time, then.@"); + + case "clocks"(remove): + say("@The ticking of clocks is the pulse of civilization.@"); + add(["pulse","ticking"]); + + case "pulse"(remove): + say("@Without clocks, people would just sit around uselessly, with no idea what to do next!@"); + + case "ticking"(remove): + say("@Of course, the ticks would be useless without the tocks.@"); + add(["tock"]); + + case "tock"(remove): + say("@They're much deeper sounding and more satisfying than ticks.@"); + + case "moons"(remove): + say("@Ephemerides is going to build a model of the whole system. I helped him design the gearwork that makes it go.@"); + add(["Ephemerides", "gearwork"]); + + case "gearwork"(remove): + say("@I know all about gears.@"); + + case "Ephemerides"(remove): + say("@He lives at the Lycaeum.@"); + add(["Lycaeum"]); + + case "Lycaeum"(remove): + say("@It's a great center of learning.@"); + add(["learning"]); + + case "learning"(remove): + say("@If you didn't run around asking foolish questions all the time, you might learn something yourself!@"); + + case "chess board"(remove): + say("@I like to play chess. Keeps ones mind fit.@"); + add(["mind"]); + + case "mind"(remove): + say("@Some people don't use theirs - but I do.@"); + + case "bye": + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Until we come into conjunction again.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Andreas.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Andreas.uc new file mode 100755 index 0000000..eea5844 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Andreas.uc @@ -0,0 +1,325 @@ +void Andreas object#(0x436) () +{ + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + + var avatar_gold = UI_get_cont_items(AVATAR, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + + var partyGold = UI_count_objects(PARTY, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + var card_count = UI_get_npc_id(item); //used to count how many cards + var andreas_card_price = (card_count * 5); + var rand_npc = randomPartyMember(); + var title; + var pronoun; + + + const int ANDREAS_REST_TIMER = 16; + const int ANDREAS_FULLY_RESTED = 3; //after 3 hours she's fully rested + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //used for gypsy script + var wagondoor = find_nearest(975, 100); + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + title = "girl"; + } + else + { + // pronoun = " "; + title = "boy"; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + + av_1st_greet = "@Hail, gypsy!@"; + if (player_is_female) + { + npc_1st_greet = "@Hey foxy!@"; + npc_2nd_greet = "@Back so soon, foxy?@"; + } + else + { + npc_1st_greet = "@Hey there!@"; + npc_2nd_greet = "@Back so soon?@"; + } + av_2nd_greet = "@Might we speak again?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A handsome, carefree gypsy man.*"); + if (player_is_female) + item.say("@Hey, foxy! I bet you'd like me to unsheathe my weapon so you can have a look....@"); + else + { + item.say("@Hey there! Welcome to our humble caravan! You look like a bold warrior - would you like to spar a bit for practice?@"); + + } + UI_set_item_flag(item, MET); + } + else + { + if (player_is_female) + item.say("@Ah, I see you couldn't stay away... I have that effect on women..@"); + else + item.say("@Welcome back, " + player_name + ". Came for some more of our gypsy hospitality, I see!@"); + } + + + //standard conversation options + var options = ["name", "job", "bye"]; + +//////////////////////////////////////////////////////////////////// +// Main conversation thread +//////////////////////////////////////////////////////////////////// + + converse(options) + { + case "name"(remove): + say("@I am Andreas, prince of the gypsies.@"); + add(["gypsies"]); + + case "job"(remove): + say("@I live the carefree life of a gypsy, traveling hither and yon.@"); + if (player_is_female) + say("@Naturally, when so lovely a lady as yourself comes along, I offer, shall we say, my services.@"); + else + { + say("@When the opportunity arises, I do what I can to brighten the lives of the ladies.@"); + if (isNearby(JAANA)) + { + JAANA.say("@I'll just bet he does!@"); + JAANA.hide(); + } + say("@Of course, you'd probably be more interested in my sister Wanda, right?@"); + if (askYesNo()) + { + say("@Can't say I blame you. In fact, if she wasn't my sister...@"); + } + else + say("@Hmm, wouldn't have figured you for the type...@"); + + } + add(["services"]); + + case "gypsies"(remove): + say("@Wouldn't you like to be a gypsy too?@"); + if (askYesNo()) + { + if (!UI_get_item_flag(item, SI_ZOMBIE)) + say("@A fine thing to dream of! But one such as you could never be a gypsy.@"); + else + say("@You have the carefree spirit, but alas, one must be born a gypsy.@"); + } + else say("@The more fool you!@"); + + case "services"(remove): + say("@We all have our talents. I myself happen to have two.@*"); + say("@I'd be glad to show you sometime!@"); + add(["talents", "show me.."]); + + + case "talents"(remove): + say("@What, you mean swordplay? Just ask, and I'll give thee a lesson you won't forget!@"); + add(["lesson"]); + + + case "Wanda"(remove): + say("@She practices the world's oldest profession. I, of course, have perfected it, and thus need no practice.@"); + add(["profession"]); + + + case "Arturos"(remove): + say("@He's my dad - the king of the gypsies!@"); + + + case "map"(remove): + say("@A map? Aye, Arturos has some scrap like that. I know nothing more of it.@"); + add(["Arturos"]); + + + case "lesson"(remove): + say("@Would you like to spar a bit?@"); + if (askYesNo()) + { + say("Pulling a couple of sticks from his belt, the gypsy hands you one. You fight with them as if they were swords for a while.*"); + say("After you're finished, he comes over and puts his arm around your shoulder as he gives you a few pointers on fencing style.*"); + if (avatar_gold >= 25) + { + var steal_amount = UI_die_roll(5, 25); + UI_add_cont_items(ANDREAS, steal_amount, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + UI_remove_cont_items(AVATAR, steal_amount, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + say("You're not sure, but you think perhaps you felt a slight tug at the pouch you keep your coins in."); + } + } + else + say("@Maybe some other time.@"); + + + + case "silver tablet"(remove): + say("@Ah yes, you've heard of the silver tablet!@*"); + say("@I haven't got it myself, but I can tell you where it is for a price... Shall we say 7 gold pieces?@"); + if (askYesNo()) + { + if (hasGold(7)) + { + chargeGold(7); + say("@I overheard a bard in a tavern say that it was somewhere on the Isle of the Avatar. Perhaps Arturos could tell you precisely.@"); + add(["Arturos"]); + } + else + say("@Come back when you have the money.@"); + } + else + say("@Suit yourself.@"); + + + case "show me.."(remove): + var wagondoor = UI_find_nearest(ANDREAS, 975, 15);// looks for wagon door + + if (wagondoor) + { + if (!UI_get_item_flag(item, NAKED)) + { + say("@Oho, so that's what you're after, you naughty " + title + "!@*"); + if (player_is_female) + say("@For a mere 10 gold pieces, I'll transport you to the heights of ecstasy. Will it be yea or nay?@"); + else + say("@Well... Normally I'm more of a ladies' man. But I guess your money is as good as anyone else's. It'll cost you 10 gold, okay?@"); + if (askYesNo()) + { + if (partynum < 2) + say("@A voice in the back of your head asks, @Do you really have time for this?@"); + else + { + if (isNearby(DUPRE)) + { + DUPRE.say("@" + polite_title + ", I really doubt we have time for this...@"); + DUPRE.hide(); + } + else + { + randomPartySay("@" + polite_title + ", I really doubt we have time for this...@"); + randomPartySay.hide(); + + } + } + say("@Well, come on. Yea or nay, " + polite_title + "@"); + if (askYesNo()) + { + if (hasGold(10)) + { + chargeGold(10); + UI_set_timer(ANDREAS_REST_TIMER); + + //failsaife + if (gflags[DURING_WANDA_CUTSCENE]) + gflags[DURING_WANDA_CUTSCENE] = false; + + script item + { + call GypsyCutscene, BEGIN_ANDREAS_CUTSCENE; + }; + break; + + + + } + else + say("@Hey, you don't have the money! I don't take charity cases.@"); + } + else + say("@As you like. But take my advice--you should live a little now. That way, you'll have something to remember when you're old and gray...@"); + + } + else say("@As you like. But take my advice--you should live a little now. That way, you'll have something to remember when you're old and gray...@"); + } + else say("@My mind is willing, but the flesh is weak...Come back later, when I've had some time to rest.@"); + } + else + say("@Let's get a bit closer to my wagon before we discuss such matters, okay?@"); + + case "bye": + + if (!UI_get_item_flag(item, NAKED)) + { + + if (player_is_female) + { + say("@I hope we get better acquainted when next we meet.@*"); + say("@I like your clothes, but I think you'd look better without them...@"); + } + + + } + else + say("@Come again soon.@"); + + + if (player_is_female) + { + npc_goodbye = "@Come back soon, foxy..@"; + avatar_goodbye = "@...creep.@"; + + } + else + { + npc_goodbye = "@May your travels prove interesting.@"; + avatar_goodbye = "@Must be going now..@"; + } + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } + else scheduleBarks(item); +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Arturos.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Arturos.uc new file mode 100755 index 0000000..5c446c8 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Arturos.uc @@ -0,0 +1,414 @@ + +void Arturos object# (0x435) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var avatar_gold = UI_get_cont_items(AVATAR, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + var steal_amount = UI_die_roll(5, 15); + var partyGold = UI_count_objects(PARTY, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + var card_count = UI_get_npc_id(item); //used to count how many cards + var arturos_card_price = (card_count * 5); + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hello, gypsy.@"; + npc_1st_greet = "@Ah, hello to you!@"; + + av_2nd_greet = "@Hello again..@"; + npc_2nd_greet = "@Ah, welcome back traveller..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A colorfully clad, bemused looking gypsy.*"); + item.say("If you were looking to geta your fortune told, you came to the right place.@*"); + + if (UI_get_item_flag(ARTUROS, NAKED)) //has stolen from you. Prompts Shamino to complain + UI_clear_item_flag(ARTUROS, NAKED); + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(ZOLTAN, MET)) + add ("Zoltan"); + + if (UI_get_item_flag(MARIAH, SI_ZOMBIE)) //asked Mariah about tablet + add ("silver tablet"); + + if (gflags[LEARNEDGYPSYSSTOLEMAP]) + add("map"); + + if (gflags[ARTUROSIS]) + add("'Arturosis'"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'ma called Arturos. That meansa either 'foolish monkey' or 'he who sells cheese', depending on howa you translate it.@"); + add(["foolish monkey", "cheese"]); + + case "job"(remove): + say("@Ima the king of all the gypsies. Of course, thatsa what you call more of an 'honorary' title, so I tell fortunes on the side.@"); + add(["title", "fortune"]); + + + case "cheese"(remove): + say("@Yeah, go figure, huh?@"); + + case "foolish monkey"(remove): + say("@Yeah, go figure, huh?@"); + + + case "map"(remove): + if (UI_count_objects(PARTY, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP3) > 0) + { + say("@Yeah, I used to have a map like that. Can't remember what I did with it, though...@"); + } + else + { + say("@Map. Hmm, map... Oh yeah, thata old thing. Sure, I got that, but she'sa not very interesting.@*"); + say("@Say--do you want to buy it?@"); + if (askYesNo()) + { + say("@Oh! Well, sure you do, she's a very important map!@*"); + say("He leads you away from the rest of the group. @Don't want no spyin' ears, ah?@"); + say("@Yeah, this map, she'sa leading to the treasure of - oh, who was it, Yellowbeard or somebody.@*"); + say("@Well, I forget, but the point is it leads to a big, huge treasure! So if you want this map you're agonna have to pay - 100 gold! Okay?@"); + if (askYesNo()) + { + var USER_INPUT = (UI_input_numeric_value(0, 100, 10, 100)); + if (USER_INPUT == 100) + { + if (hasGold(100)) + { + if (UI_add_party_items(1, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP3, false)) + { + chargeGold(100); + say("@Okay, here's the map, and may fortune bring you lotsa gold!@"); + } + else + say("@Yeah, well, you've got a lot to carry right now. I do you a favor and just hold on to the map for you until you got room for it. I do you another favor and hold on to the money, too.@"); + } + else + say("@Hey, what are you, a deadbeat? Come back when you can afford the map!@"); + } + else + { + say("@Well, I hate to see anybody pass up good fortune, so I tell you what I do. I sell you this map, this key to infinite wealth, for just 75 gold. Okay?@"); + if (askYesNo()) + { + if (hasGold(75)) + { + if (UI_add_party_items(1, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP3, false)) + { + chargeGold(75); + say("@Okay, here's the map, and may fortune bring you lotsa gold!@"); + } + else + { + say("@Yeah, well, you've got a lot to carry right now. I do you a favor and just hold on to the map for you until you got room for it. I do you another favor and hold on to the money, too.@"); + chargeGold(75); + } + } + else + say("@Hey, what are you, a deadbeat? Come back when you can afford the map!@"); + } + else + { + say("@What, are you nuts? But okay, how'sabout just 50 gold?@"); + if (askYesNo()) + { + if (hasGold(50)) + { + if (UI_add_party_items(1, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP3, false)) + { + chargeGold(50); + say("@Okay, here's the map, and may fortune bring you lotsa gold!@"); + } + else + { + say("@Yeah, well, you've got a lot to carry right now. I do you a favor and just hold on to the map for you until you got room for it. I do you another favor and hold on to the money, too.@"); + chargeGold(50); + } + } + else + say("@Hey, what are you, a deadbeat? Come back when you can afford the map!@"); + } + else + say("@Thank you! You have asaved me from amaking a big mistake! You're right, I better hold on to this valuable map myself. No way is it worth less than 100 gold.@"); + }//user input + } + } + else + say("@Thank you! You have asaved me from amaking a big mistake! You're right, I better hold on to this valuable map myself. No way is it worth less than 100 gold.@"); + } + else + say("@Nah, I didn't think so. What for would anybody want to buy it, ah?@"); + } + case "title"(remove): + say("@You cana just call me 'Uncle Arthur' if you like.@"); + add(["Uncle Arthur"]); + + case "fortune"(remove): + say("@I gota this fine set of fortune telling cards. These werea hand painted by Musgrave himself.@*"); + if (UI_get_item_flag(item, SI_ZOMBIE)) + say("@For justa five gold, maybe I can help you finda this silver tablet. And I'll tell you the rest of your future as well. What a bargain! Whadda you say?@"); + else + say("@I'll tella you your future. Whadda you say?@"); + if (askYesNo()) + { + if (hasGold(5)) + { + chargeGold(5); + say("He takes out a deck of cards, shuffles it, and has you pick one.*"); + say("@Okay, thisa card, she'sa the Tower. That means you'rea going to go into a real big building soon, like maybe a castle.@*"); + say("@Pretty good, huh? Maybe you want a better card, though. Do you want to pick again?@"); + if (askYesNo()) + { + UI_set_npc_id(item, 1); + card_count = UI_get_npc_id(item); + arturos_card_price = (card_count * 5); + say("You pick another card. @This here isa the Wheel of Fortune.@*"); + say("@Wheels, they go 'round and 'round, so that means you'rea gonna have some good luck, and some bad luck.@*"); + say("@That doesn't tell you so much. Try for another card?@"); + if (askYesNo()) + { + UI_set_npc_id(item, 2); + card_count = UI_get_npc_id(item); + arturos_card_price = (card_count * 5); + say("@Oh, hey, you picked the Lovers this time.@"); + if (player_is_female) + say("@ I thinka maybe you should go talk to Andreas, you know what I mean?@"); + else + say("@ I thinka maybe you should go talk to Wanda, you know what I mean?@"); + say("@That'sa pretty good card. How about another one?@"); + if (askYesNo()) + { + UI_set_npc_id(item, 3); + card_count = UI_get_npc_id(item); + arturos_card_price = (card_count * 5); + say("@This here's Temperance. Thata means that you shouldn't lose your temper. I cana find you a better card than that, here, wait a minute.@*"); + say("He picks out a card. @This is Justice, that'sa one of what they call the 'court cards.' Let me try again.@ He picks another.*"); + say("@Okay, this isa better. This is the Hierophant. That'sa like an elephant, but taller and without the trunk.@*"); + say("@That means you'rea gonna see one of them someday. Pretty interesting, huh? Another card?@"); + if (askYesNo()) + { + UI_set_npc_id(item, 6); + card_count = UI_get_npc_id(item); + arturos_card_price = (card_count * 5); + say("@Uh-oh, you justa drew the Death card. That means eithera you're going to kill somebody soon, ora somebody's gonna kill you.@*"); + say("@I can never geta that part straight. One more card?@"); + if (askYesNo()) + { + UI_set_npc_id(item, 7); + card_count = UI_get_npc_id(item); + arturos_card_price = (card_count * 5); + say("@Allaright, now we're talking. You pickeda the Crow card. That'sa telling you adventuring isa for the birds.@*"); + say("@You should open a little shop somewhere and settle down, you know?@"); + say("@The cards didn't say nothin' about the silver tablet. Guess that means you're not gonna find it.@*"); + say("@That's life, you know?@*"); + say("@Okay, that'sa " + card_count + " extra cards at 5 gold apiece. That makes " + arturos_card_price + " total.@"); + if (partyGold >= arturos_card_price) + { + chargeGold(arturos_card_price); + } + else + { //not enough money + say("@Since you don'ta have that much, I'll just settle for what you've got.@"); + chargeGold(partyGold); + } + say("@It was a pleasure doinga business with you.@"); + UI_clear_item_flag(item, NAKED); + + } // + else + { + say("@Okay, that'sa " + card_count + " extra cards at 5 gold apiece. That makes " + arturos_card_price + " total.@"); + if (partyGold >= arturos_card_price) + { + chargeGold(arturos_card_price); + } + else + { + say("@Since you don'ta have that much, I'll just settle for what you've got.@"); + chargeGold(partyGold); + } + say("@It was a pleasure doinga business with you.@"); + UI_clear_item_flag(item, NAKED); + UI_set_npc_id(item, 0); + } + }//////// + else + { + say("@Okay, that'sa " + card_count + " extra cards at 5 gold apiece. That makes " + arturos_card_price + " total.@"); + if (partyGold >= arturos_card_price) + { + chargeGold(arturos_card_price); + } + else + { + say("@Since you don'ta have that much, I'll just settle for what you've got.@"); + chargeGold(partyGold); + } + say("@It was a pleasure doinga business with you.@"); + UI_clear_item_flag(item, NAKED); + UI_set_npc_id(item, 0); + } + + }///// + else + { + say("@Okay, that'sa " + card_count + " extra cards at 5 gold apiece. That makes " + arturos_card_price + " total.@"); + if (partyGold >= arturos_card_price) + { + chargeGold(arturos_card_price); + } + else + { + say("@Since you don'ta have that much, I'll just settle for what you've got.@"); + chargeGold(partyGold); + } + say("@It was a pleasure doinga business with you.@"); + UI_clear_item_flag(item, NAKED); + UI_set_npc_id(item, 0); + } + }///// + else + { + say("@Okay, that'sa " + card_count + " extra cards at 5 gold apiece. That makes " + arturos_card_price + " total.@"); + + if (partyGold >= arturos_card_price) + { + chargeGold(arturos_card_price); + } + else + { + say("@Since you don'ta have that much, I'll just settle for what you've got.@"); + chargeGold(partyGold); + } + say("@It was a pleasure doinga business with you.@"); + UI_clear_item_flag(item, NAKED); + UI_set_npc_id(item, 0); + } + } + else say("@Okay.@"); + UI_clear_item_flag(item, NAKED); + } + else say("@Come back whena you have the money.@"); + } + else + { + say("@Ok, have it your way.@*"); + say("@But ifa some maniac with an axe catches you in a dark alley somewhere, don'ta blame me for not warning you.@"); + } + + case "Uncle Arthur"(remove): + say("@That'sa nice and friendly. I like you too.@ He comes over and gives you a big hug."); + if (avatar_gold > 15) + { + UI_add_cont_items(ARTUROS, steal_amount, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + UI_remove_cont_items(AVATAR, steal_amount, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + UI_set_item_flag(item, NAKED); //has stolen from you. Prompts Shamino to complain + } + + case "'Arturosis'"(remove): + say("@You knowa about that eh? It was delicious!@ He licks his lips and grins."); + + case "Zoltan"(remove): + say("@He's a whadda you call, an impostor. You shouldn'ta listen to him.@"); + + case "silver tablet"(remove): + say("@The silver tablet? I don't know anything about that.@*"); + say("@But hey, maybe there's something in the cards about it, ah?@"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + UI_set_item_flag(item, SI_ZOMBIE); //for fortune + } + + + case "bye": + say("@Hey, you come again soon, okay?@"); + UI_set_npc_id(item, 0); + if (UI_get_item_flag(item, NAKED) && (isNearby(SHAMINO))) + { + SHAMINO.say("Shamino whispers to you, @Best check your coinpouch. I think I saw something when that gypsy hugged you.@"); + SHAMINO.hide(); + + } + + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Bonn.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Bonn.uc new file mode 100755 index 0000000..2c109cf --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Bonn.uc @@ -0,0 +1,253 @@ + +void Bonn object# (0x440) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == PROXIMITY) + { + var barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@The bees keep buzzing...@", 0); + delayedBark(item, "@..canst thou hear them?@", 8); + + } + else if (barks == 2) + delayedBark(item, "@Stay away from my shoes!@", 0); + else + delayedBark(item, "@Beware the ice weasels!@", 3); + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings..@"; + npc_1st_greet = "@At last!@"; + + av_2nd_greet = "@Uh, hello again, Bonn..@"; + npc_2nd_greet = "@Who told you my name!?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A short, barefooted crazy man.*"); + if (!UI_get_item_flag(item, MET)) + { + item.say("@At last! I knew you'd come to steal my shoes someday! But I was too smart for you!@*"); + item.say("@You see, I HAVE NO SHOES!@"); + + } + else + { + item.say("A short, barefooted crazy man.*"); + item.say("@Sometimes the bees in my head almost drive me mad!@"); + add(["bees", "mad"]); + } + + //standard conversation options + var options = ["name", "job", "bye", "shoes"]; + + //when you give Sandy in Trinsic the dragon's egg, he spills the beans on other pirates + if (UI_get_item_flag(SANDY, SI_ZOMBIE)) + add("map"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@A clever ploy, pretending to be friendly...@*"); + say("@But if I told you my name was Bonn, then you could work foul magic to destroy my mind...@"); + say("@I'll not fall for your tricks!@"); + add(["Bonn"]); + + + case "job"(remove): + say("@I have no job, nor shoes, nor any such thing.@*"); + say("@But I've learned from my misfortune, learned never to trust anyone, let alone to love..@"); + add(["trust", "love"]); + + case "Bonn"(remove): + say("@Who told you that? Alas, I am undone! I must flee!@"); + sayGoodbyeAbrupt(item, "@You'll not warp my mind!@"); + UI_set_schedule_type(item, SHY); + break; + + + case "shoes"(remove): + say("@I threw my shoes into the sea when I saw you coming!@"); + add(["sea"]); + + case "sea"(remove): + say("@My shoes will be very happy there, dancing with the fishies!@"); + add(["dancing"]); + + case "trust"(remove): + say("@I trusted Hawkins once, and it led to nothing but despair.@"); + add(["Hawkins"]); + + case "Hawkins"(remove): + say("@Oh how I envy him his peaceful sleep!@"); + add(["sleep"]); + + case "sleep"(remove): + say("@Death's embrace is the only true comfort a man can find in this world.@"); + add(["comfort", "world"]); + + case "comfort"(remove): + say("@A good chair is worth a thousand bumberchutes.@"); + add(["bumberchutes"]); + + case "world"(remove): + say("@Flat as a pancake, and twice as tasty!@"); + + case "bumberchutes"(remove): + say("@Who told you about those? It's supposed to be a secret!@"); + add(["secret"]); + + case "secret"(remove): + say("@You're not one of us!@"); + add(["us"]); + + case "love"(remove): + say("@Love is a slippery sled that flips over and pins you to the slope.@*"); + say("@And then, at night, the ice weasels come.@"); + add(["ice weasels"]); + + case "ice weasels"(remove): + say("@If you're lucky, they'll kill you!@"); + + case "us"(remove): + say("@We know who we are...@"); + add(["we"]); + + case "we"(remove): + say("@Me and the others.@"); + add(["others"]); + + case "others"(remove): + say("@By the time you find out, it will be too late!@"); + add(["too late"]); + + case "too late"(remove): + say("@I won't tell you because...@~"); + say("@...you're not one of us!@"); + add(["us"]); + + case "bees"(remove): + say("@The buzzing, they're always buzzing in my head.@"); + + case "mad"(remove): + say("@I can help you! I'm the only sane one left.@"); + add(["help", "sane"]); + + case "help"(remove): + say("@Go to the Shrine of Honesty, and stand just to the east of it.@*"); + say("@Take 3 steps north, 2 steps west, 5 steps south, and 4 steps east.@*"); + say("@Then eat some grapes, and all will become clear to you!@"); + add(["grapes"]); + + case "sane"(remove): + say("@All the others LOST THEIR SHOES!@"); + + case "grapes"(remove): + say("@Mark my words!@"); + + case "dancing"(remove): + say("@They'll dance a waltz, I doubt it not!@"); + add(["waltz"]); + + case "waltz"(remove): + say("He begins laughing hysterically."); + + case "map"(remove): + say("A strange light comes into his eyes.~"); + say("@The map? The secret treasure map? I still have it, right here in my house. Do you want it?@"); + if (askYesNo()) + { + say("@Too bad! I've hidden it well, and it will go to my grave with me! I'll die all the better for still having it!@"); + } + else + say("@Good! You can't have it anyway!@"); + add(["house"]); + + case "house"(remove): + say("@I lived on the sea, and I'll die not far from it. Then my basement can be my tomb.@"); + add(["basement"]); + + case "basement"(remove): + say("@Too well hidden for the likes of you to find!@"); + + + case "bye": + say("@Farewell, sweet enemy. I love you more than my own death!@"); + + avatar_goodbye = "@I'll just be going now...@"; + npc_goodbye = "@Don't take my shoes!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/CaptainJohne.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/CaptainJohne.uc new file mode 100755 index 0000000..19368ed --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/CaptainJohne.uc @@ -0,0 +1,220 @@ + +void CaptainJohne object# (0x46e) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int QUALITY_GARGISH_SCROLL = 54; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@You there!@"; + npc_1st_greet = "@Praise the virtues!@"; + + av_2nd_greet = "@Captain Johne..@"; + npc_2nd_greet = "@Yes, Avatar?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A long-haired gentleman with a scholarly demeanor.*"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) //met flag isn't working on this? + { + item.say("@Praise the virtues! Humans have arrived here at last!@*"); + item.say("@But what's this? Not just any humans--the Avatar!@*"); + item.say("@'Tis most fortuitous that thou hast returned, noble " + player_name + ".@*"); + item.say("@Many cataclysms have occurred since thou last visited Britannia!@"); + UI_set_item_flag(item, SI_ZOMBIE); + + } + else + item.say("@Ah, my good friend! Thou hast returned!@"); + + //standard conversation options + var options = ["name", "job", "bye", "cataclysms"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Why, I'm Captain Johne, " + polite_title + "!@"); + + case "job"(remove): + say("@For several years I have been here in the catacombs, studying the gargoyles.@"); + add(["studying", "gargoyles"]); + + case "cataclysms"(remove): + say("@The gargoyle world, once as large as Britannia itself, is slowly being destroyed!@*"); + say("@The forces thou set in motion have caused great sections of their land to fall off into the void!@*"); + say("@Only a single gargoyle city remains.@"); + add(["city"]); + + + case "studying"(remove): + say("@Yes, I have learned much about them!@*"); + + if (!UI_get_item_flag(item, PETRA)) //Petra flag used if haven't asked about tablet yet + { + say("@I had a silver tablet that contained much of what I had learned.@*"); + say("@I gave it to some gypsies to take to Mariah, at the Lycaeum.@*"); + say("@Did it arrive safely?@*"); + if (askYesNo()) + { + say("@Good! I am glad to know that the gypsies kept their word.@*"); + say("@That tablet must have amazed Mariah!@*"); + } + else + { + say("@No?! But I paid money, good money, for them to carry it to her!@*"); + say("@No matter. Now that thou art here, all is well.@*"); + say("@You can study the gargoyles yourself, and carry the knowledge back to the surface!@"); + } + UI_set_item_flag(item, PETRA); + } + + + + case "gargoyles"(remove): + say("@They are not evil, as most humans believe!@"); + say("@I have spent much time talking to them, and I have found them to be almost human.@"); + say("@I have learned about their society, their beliefs, and their language.@"); + add(["society", "beliefs", "language"]); + + case "society"(remove): + say("@There are two kinds of gargoyles, winged and wingless ones.@"); + say("@At first it seemed as if the wingless ones were slaves.@*"); + say("@But now I know that the wingless ones are beloved and valued family members.@*"); + say("@They must be told what to do, because they are not truly intelligent.@*"); + say("@The gargoyles live honorably, by their own set of beliefs.@*"); + + case "beliefs"(remove): + say("@The gargoyles' beliefs are much like our own.@"); + say("@Where we have the three principles of Truth, Love and Courage,@*"); + say("@they have the principles of Control, Passion and Diligence.@*"); + say("@Directly, these lead to the virtues of Direction, Feeling, and Persistence.@*"); + say("@Combined, they lead to Balance, Achievement and Precision.@*"); + say("@Taken all together, they point to Order.@*"); + say("@And the sum of all the principles is Singularity.@*"); + say("@Gargoyle society stresses unity and singularity in all things.@*"); + say("@They have to; their world has always been harsh, even before the cataclysms.@*"); + + + case "language"(remove): + say("@With the help of a gargoyle child, Beh Lem, I have learned how to speak their language.@"); + if (!UI_get_item_flag(item, CONFUSED)) //Confused flag for when he gives scroll first + { + say("@Wouldst thou like to learn?@"); + if (askYesNo()) + { + say("@Here.@ He hands you a scroll.*"); + UI_add_party_items(1, SHAPE_SCROLL, QUALITY_GARGISH_SCROLL, 1, true); + say("@Use this scroll- it contains a basic vocabulary of the Gargoyle language.@"); + UI_set_item_flag(item, CONFUSED); //to prevent giving more than 1 scroll + } + else + say("@But you must! Thou hast no chance of saving the gargoyles if thou knowest not their language!@"); + } + add(["Beh Lem"]); + + case "city"(remove): + say("@The gargoyle City of Investigation, their place of learning and government, is all that is left.@"); + say("@Thou must do something to save the gargoyle race!@*"); + say("@I know not what, however.@*"); + say("@Thou must talk to the gargoyles.@"); + add(["gargoyles"]); + + case "Beh Lem"(remove): + say("@He and I meet every day at noon, where Hythloth emerges in the gargoyle lands.@*"); + say("@Go and speak with him, learn about the gargoyles.@*"); + say("@You must save them!@*"); + add(["join"]); + + case "join"(remove): + say("@No, I cannot. I must stay here and continue my writing.@"); + say("@But Beh Lem may join thee. With his help, thou canst travel the gargoyle lands and learn how to save them.@"); + + + + case "bye": + if (!UI_set_item_flag(item, NAKED)) + { + say("@Wait! Thou must meet Beh Lem and travel with him among the gargoyle people.@"); + say("@That is the only way you can save them, and save them you must!@"); + say("@And without Beh Lem with you, the gargoyles will attack!@"); + UI_set_item_flag(item, NAKED); + + } + + else + { + say("@Farewell again, noble Avatar. As the gargoyles say, 'May thy persistence and precision lead to success.@*"); + + } + + avatar_goodbye = "@Farewell, Captain.@"; + npc_goodbye = "@Upon you rests the future of an entire race.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/CrimsonJack.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/CrimsonJack.uc new file mode 100755 index 0000000..c398fe8 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/CrimsonJack.uc @@ -0,0 +1,13 @@ +void CrimsonJack object#(0x4a1) () +{ + if (event == DOUBLECLICK) + { + var rand = UI_get_random(6); + var barks = ["@Just one more thing to fix..@", "@Need to fix this..@", "@Not now.. I'm hunting bugs!@", "@So close.. yet so far!@", "@Yarr.. usecode must walk the plank!@", "@Don't be a cheater.. yarr!@"]; + + UI_item_say(item, barks[rand]); + + return; + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Drudgeworth.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Drudgeworth.uc new file mode 100755 index 0000000..622a3b2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Drudgeworth.uc @@ -0,0 +1,400 @@ + const int DRUDGEWORTH_MIRROR = 1266; + +void closeMirror (var mirror) +{ + script mirror after 3 ticks + { + + + frame 9; wait 1; + frame 6; wait 1; + frame 4; wait 1; + frame 3; wait 1; + frame 2; wait 1; + frame 0; wait 1; + + + + }; + + +} + +void Drudgeworth shape# (1266) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var pronoun; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + if (player_is_female) // + { + pronoun = "her"; + // title = "madame"; + } + else + { + pronoun = "him"; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + script item after 3 ticks + { + frame 2; + wait 1; + frame 3; + wait 1; + frame 4; + wait 1; + frame 5; + wait 1; + frame 6; + wait 1; + frame 7; + wait 1; + frame 8; + wait 1; + frame 9; wait 1; + frame 10; wait 1; + frame 11; wait 1; + frame 12; wait 1; + call Drudgeworth; + + + } + + + }//end doubleclick + + + if (event == SCRIPTED) //drudgeworth called from mirror + { + var chuckles_urn = UI_find_object(PARTY, SHAPE_URN, QUALITY_ANY, FRAME_CHUCKLES); + UI_show_npc_face(172, 0); + + //offered to help drudgeworth + if (gflags[HELP_DRUDGEWORTH]) + { + if (gflags[CHUCKLES_KILLED] && chuckles_urn > 0) //Killed Chuckles in front of the mirror and cremated him and have urn + { + + item.say("@At last, I can inflict mine vengeance upon the soul of the swine who hath caused me so much anguish!@"); + item.say("@And now, I shall hold up mine end of the bargain...@"); + item.say("He focuses his energy and dims, and a key materializes in your pack!"); + item.say("@It be the key to me treasure trove. In it, ye will find the Chaos sword, purloined from the ruins of Blackthorn's castle.@"); + item.say("@After mine escape, I stole it from an oaf I met in a tavern who looted it and tried to sell it for rum money. There be a strange hex upon it though, be warned!@"); + item.say("@I reckon it's dark magic gave me the illness I eventually succumbed to. I had to stash it away in hopes that I could plunge it into Chuckles' belly if I were to recover!@"); + item.say("@Ye will find it hidden in a chest behind an old tree, in a swamp southeast of 'ere. Didn't wanna keep it too close, because of the hex. I hope it serves ye well...@ A sly smile stretches upon his lips."); + item.say("@As for me...I shall catch up with an old friend of mine...@, Drudgeworth says wickedly. You think you can hear Chuckles screaming in the backround, but you aren't sure...@"); + + UI_add_party_items(1, SHAPE_KEY, QUALITY_DRUDGEWORTH, FRAME_DRUDGEWORTH, false); + + //find mirror then give sprite effects + var mirror = UI_find_object(FIND_ON_SCREEN, DRUDGEWORTH_MIRROR, QUALITY_ANY, FRAME_ANY); + UI_set_item_frame(mirror, 13); //cracked frame + UI_obj_sprite_effect(mirror, 7, 10, 1, 0, 0, 0, -1); //26 + + subtractKarma(20); //massive karma hit + + script mirror after 10 ticks + { + sfx 37; + + } + return; + } + item.say("The spectre within the mirror appears to be impatient and agitated."); + if (!gflags[CHUCKLES_KILLED]) //offered help but haven't killed Chuckles yet + item.say("@Tarry not! Lure Chuckles to the mirror at the Blue Boar and slay him at the appointed hour...@"); + item.say("@Bring his ashes back to me here and I shall reward thee with great treasure..go on now!@"); + closeMirror(item); + return; + + + } + + item.say("You see the form of an eerily familiar ghostly pirate slowly materialize in the mirror before you. He stares at you warily."); + if (!gflags[MET_DRUDGEWORTH]) + gflags[MET_DRUDGEWORTH] = true; + + if (UI_get_item_flag(DRUDGEWORTH, SI_ZOMBIE)) + { + item.say("@Have ye changed yer mind? Whilst thou help me? Or are you a yellow dog not worthy of the title 'Avatar'?@"); + if (askYesNo()) + { + say("@Slay Chuckles at the 'Blue Boar Tavern'! I will be waiting at the mirror within. Slay him in front of it. As he utters his death cry I will concentrate all my energies and tear his spirit through it to my side that I may finally wreak vengence upon him!@"); + say("@Since he never leaves the castle, thou mayest have to 'convince' him to meet you at the Blue Boar. Ask him of 'Lucy' and tell him that thou knowest of his crimes and abuse of power..@"); + say("@Can I count on ye to extract me revenge? Do we have an accord?@"); + if (askYesNo()) + { + if (UI_get_item_flag(DRUDGEWORTH, SI_ZOMBIE)) //clear angry flag + UI_clear_item_flag(DRUDGEWORTH, SI_ZOMBIE); + + say("@Consider it doing the Honourable thing to rid the realm of this miscreant! I shall be waiting for thee at the Blue Boar, in the mirror after everyone has left...@"); + say("@Once the deed is done, you must carry his corpse with you and consign his body to the flames by journeying to the crematory near Emapth Abbey.@"); + say("@However, thou must takest care to bring the urn containing the ashes back to me that I may know not even Lord British can bring him back to the realm of the living and from my grasp!@"); + say("@Farewell.. and as a man of me word, I shall give you the location and key to me treasure trove. It has a weapon thou mayest be interested in...@"); + subtractKarma(15); //massive karma hit + + if (!gflags[HELP_DRUDGEWORTH]) //opens up convo flag on Chuckles + gflags[HELP_DRUDGEWORTH] = true; + + if (isNearby(IOLO)) + { + IOLO.say("Iolo speaks in a hushed tone, " + polite_title + ", I beg thee not to consider this insane offer. Now I know why we left him to rot in the dungeons! Even if we are talking about this pirates untold wealth; ridding the kingdom of Chuckles once and for all can't possibly be virtuous!@"); + IOLO.say("@I mean, granted; tis Chuckles and all, but still... @"); + IOLO.hide(); + } + closeMirror(item); + return; + + } + else + { + say("@Then begone with ye, wretch!@"); + UI_set_item_flag(DRUDGEWORTH, SI_ZOMBIE); //pissed him off + closeMirror(item); + return; + + } + } + else + { + say("@Then begone with ye, wretch!@"); + UI_set_item_flag(DRUDGEWORTH, SI_ZOMBIE); //pissed him off + closeMirror(item); + return; + + + } + + } + //standard conversation options + var options = ["name", "job", "bye"]; + var options2 = ["I'm listening..", "no thanks"]; + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@If ye hath already read me manifesto you would already know my bloody name ye damnedable fool! I be Drugeworth, the pirate lord!@"); + add(["Drudgeworth"]); + + + case "job"(remove): + say("@I was an 'ard workin businessman until that cowardly wretch Chuckles interfered and stripped me to the bone of all that I was!@"); + add(["Chuckles"]); + + case "Drudgeworth"(remove): + say("@Aye ye dimwit! My name be Drugeworth.@"); + say("@Wait... Your face... I remember you!! The Great Paragon of virtue " + pronoun + "self! The Avatar of Legend! You left me to ROT in that wretched dungeon, lit only by the magically locked door that kept me within! All I begged ye for was me freedom, and ye wouldn't even do that!@"); + say("@I even offered to show ya where she was buried in return! NOW LOOK AT ME! This is all your fault for thou hast no honor!@"); + if (isNearby(DUPRE)) + { + DUPRE.say("@Avatar, if memory serves me correctly, we ran across this poor sod in the Royal Dungeons whilst in the midst of our quest to rescue Lord British from the underworld. We did not trust him enough to release him.@*"); + DUPRE.say("@Even I must admit it odd though that Chuckles pretended to have never heard of the man. Tis now obvious they know each other.@"); + DUPRE.hide(); + } + add(["dungeon", "buried"]); + + case "dungeon"(remove): + say("@I spent nigh 20 miserable years rotting in the Royal Dungeon! I mean to avenge myself upon him. I'd have him on THIS side of the mirror that I may torture him for eternity for all the wrongs he's perpertrated upon my person and the people of Britannia.@"); + say("Drudgeworth angrily gestures at the mirror encasing him. @It seems that recently however, I've simply traded one prison for another!@"); + say("He howls with a burst of sudden unbridled rage."); + + + case "Chuckles"(remove): + say("@My dear Avatar. What you -think- you know about Chuckles is irrelevant! The truth about him is... far darker than you can imagine...@*"); + say("@He is hardly the beneficient bufoon that he portrays himself to be! What you have read in me manifesto is the side of the vicious tyrant that you have -not- known throught the ages! He'd sell 'is own muther out if he thought it'd benefit 'im!@"); + + case "buried"(remove): + say("@At any rate.. Lucy was me most prized possession. Her beauty attracted the attention of men from all over, and our coffers were overflowing with gold...@*"); + say("@She was the goose that laid me the golden egg... that is until she attracted the attention of that depraved lunatic, Chuckles!@*"); + say("@He racked up quite a tab on her, and then refused mine attempts to collect up on the debt!@*"); + say("@His insatiable lust for her kept him coming back for more, with promises he would one day pay his balance. I devised a plan to extort him...@*"); + add("extort"); + + case "extort"(remove): + say("@I slipped her some green potion in her drink before she met with Chuckles at her arrainged rendevous, just enough to make her become violently ill.@*"); + say("@I swear I did not mean to kill 'er! Only make Chuckles think he did...but alas, his salacious behavior sent her over the edge and she perished. He came to me in a panic..@"); + say("@He promised he would find a way to convince Lord British to revive her upon his return, if I could help him move her body. I helped him move her to his cold storage room.@"); + say("@I immediately demanded her tab be paid, lest I reveal to the populace how Lord British's faithful servant hath behaved in his absense...@"); + add(["Lucy", "payment"]); + + + case "payment"(remove): + say("@In his panic, Chuckles devised a scheme to get me the gold he owed me...@*"); + say("@He swore that he would use his authority to arrange for the guards to be absent to let us into the Royal Mint and I would have me gold..@*"); + say("@I was told to meet him there that night in the wee hours of early morning - that the doors to the Mint would be unlocked.@*"); + say("@I slipped in unnoticed, but Chuckles was nowhere to be found - only the butt of a guard's halberd at the back of mine skull, and I awoke in prison cell thou didst find me in...@*"); + say("@The coniving bastard betrayed me to the guards, and I was jailed for plotting to rob the Royal Mint!!@*"); + say("@I spent YEARS rotting in that rat infested prison because of that evil daemon spawn! Once I escaped, I swore I would have me revenge!@*"); + add(["escaped"]); + + + case "Lucy"(remove): + say("@Ah Lucy...her beauty attracted many men and made me quite the coin...@*"); + say("@Tis all Chuckles' fault she died! She was a victim to his depravity!@*"); + + case "escaped"(remove): + say("@Aye lad. Tis a long tale indeed. Dost thou wish to hear it?@"); + if(askYesNo()) + { + say("@I did indeed escape about 15 years or so after thou didst leave me to rot in me cell. A massive sewer system 'neath the city had started construction during that time and it was apparently decided that the basement level under the royal castle was to be sacrificed to make way for it@"); + say("@Unbeknownst to me at the time, the bloody fool Chuckles went absoultely mad finding a way to further keep me a secret from his liege until he could kill me outright.@"); + say("@I was within my cell, trying to get some sleep when I was startled by the main door to the dungeon swinging open. I made out two sets of footfalls that stopped short of my cell.. I peered through my food slot and strained to see...@*"); + say("@Though I could only see two shadowy silhouettes I immediately recognized one of them as Chuckles. The other I deduced to be a member of the royal guard.@"); + //say("@What amazed me was that he was there at all! Chuckles was so afraid of being associated with me that he never came down there. He likely also ensured that only one or two people at best knew my situation.@"); + say("@Chuckles spoke in a very hushed voice, stating to the guard that by Lord Britishes orders, I was to be transferred to the prisons in Yew immediately. After which he handed him some sort of leaflet.@"); + say("@Whatever was in it, I knew that it most cetainly was NOT authorized by the King. Else why would they be down here of all places discussing the matter under such secrecy?@"); + say("@I was thrown into an armoured transport cage with another prisoner...He called himself Saduj. In any event neither of us were happy with the prospect of rotting in yet another dank, rat infested prison cell.@"); + add(["Saduj"]); + + } + else + { + + say("@Ya putrid dog, respect is earned, not given! Waste my time no further!@"); + closeMirror(item); + return; + } + case "Saduj"(remove): + say("@Aye. We were ferried out in a transport cage in the night, under much secrecy. @*"); + say("@Some time had passed in route to Yew when by chance we noticed a tiny metallic strip on the floor glinting in the moonlight. Saduj reasoned it could be used to pick the cage lock. We plotted to quietly open the cage, climb topside, and jump our captors from behind!@"); + say("@My newfound friend worked the lock, and with some doing finally picked it and swung the door open. We managed to slay the guards by surprise.@*"); + say("@We plucked anything of value from the transport, and we both spied a golden locket upon the corpse of one of the guards. I reached for it, and so did Saduj. We got into a scuffle over the trinket, and he wrest it away from mine hands. The vermin ran off towards the Deep Woods."); + say("@I took a dagger I found and threw it at him. It missed it's mark but hit him in the back of the leg and he limped off into the darkness. I never saw 'em again, but I surmise he must 'ave died a horrible death! heh heh..@*"); + say("@I wandered in the woods and made camp, and watched my first sunrise in decades...Eventually I built a cabin near the edge of the Deep Woods, where I plotted my revenge against Chuckles!@*"); + add(["revenge"]); + + + case "revenge"(remove): + say("@I tried all manner of getting him outside of the castle when I'd sneak into town. I couldn't enter the castle outright lest the guards butcher me on sight.@*"); + say("@Chuckles never left the damn castle, must 'ave been scared of me!!@*"); + say("@Eventually, I succumbed to an illness in mine cabin, my last thoughts revolved around what dark magic Chuckles employed to maintain his seemingly eternal youth...@"); + say("@I awoke seconds later astonished to find myself hovering above the corpse that had once been my home. Now a ghost, I resolved there and then that since I had given Chuckles the gift of a scarred psyche in life, I would drive him absolutely insane by haunting him for eternity in death!@"); + add(["haunt"]); + + + case "haunt"(remove): + say("@I manifested in the castle day in, day out. I wailed his name. Rattled my chains ceaselessly, banged on his door as he slept, tortured his thoughts...@*"); + say("@I invaded his dreams and turned them into living nightmares, and disrupted his job by appearing behind him as he entertained small children to scare them away!@"); + say("@He deserved no less! I vowed to never let him forget that he had killed me greatest prize possession, Lucy.@"); + say("@It was soon after that I found meself trapped in this damned mirror..@"); + add("trapped"); + + + case "trapped"(remove): + say("@In all truth, I'm not exactly sure how it happened...perhaps it was the enchanter.@"); + say("@I was traversing the castle grounds searching for the tyrannical Chuckles when I felt a sudden rush of wind and a feeling as if though I was being drawn downwards at high speed into a long dark tunnel, and lost consciouness, even in spirit form...@"); + say("@When I awoke, I found myself not only removed from the castle grounds, but also plunged into complete darkness, save for small slivers of light.@"); + say("@As I wandered the darkness, I found that the slivers of light were coming from mirrors I could look out from, at anyone gazing upon them!@"); + add(["mirror", "enchanter"]); + + case "mirror"(remove): + say("@It wasn't hard at that point to deduce that I was in a mirror dimension. Tis all Chuckles fault! Now thanks to him I'm only able to interact with the world of the living by communicating through mirrors.@*"); + say("@All, save those in the royal castle as it is barred to me! I am unable to extract revenge upon the wretch Chuckles myself whilst being trapped here. Unless...@*"); + add("unless what?"); + + case "enchanter"(remove): + say("@Surely Chuckles appealed to the enchanter Nystul to put a hex upon me, to banish me to this mirror prison!@*"); + + case "unless what?"(remove): + say("Drudgeworth stares intently at you with a sudden look of hope in his eyes. I have a proposition for thee. I mentioned to thee that I was once a pirate. I still have untold wealth buried around the world. I would bequeath it to thee for a small favor.@"); + converse(options2) + { + case "I'm listening.."(remove): + say("@I can no longer dispense justice by haunting Chuckles as long as he remains confined within the safety of the castle walls.@"); + say("@Whatever enchantment he had wove keeps me permanently at bay... It also unfortunately protects him.@"); + say("@For that I must ask thee a favor...Whilst thou help me?@*"); + if(askYesNo()) + { + say("@Slay him at the 'Blue Boar Tavern'!!! I will be waiting at the mirror within. Slay him in front of it. As he utters his death cry I will concentrate all my energies and tear his spirit through it to my side that I may finally wreak vengence upon him!@"); + say("@Since he never leaves the castle, thou mayest have to 'convince' him to meet you at the Blue Boar. Ask him of 'Lucy' and tell him that thou knowest of his crimes and abuse of power..@"); + say("@Can I count on ye to extract me revenge? Do we have an accord?@"); + if (askYesNo()) + { + say("@Consider it doing the Honorable thing to rid the realm of this miscreant! I shall be waiting for thee at the Blue Boar, in the mirror after everyone has left...@"); + say("@Once the deed is done, you must carry his corpse with you and consign his body to the flames by journeying to the crematory near Empath Abbey.@"); + say("@However, thou must takest care to bring the urn containing the ashes back to me that I may know not even Lord British can bring him back to the realm of the living and from my grasp!@"); + say("@And my last request... kill him with me rusty cutlass!@ He fades slightly as he focuses his energy. An old rusty cutlass materlalizes in your hand."); + UI_add_party_items(1, SHAPE_RUSTY_CUTLASS, QUALITY_ANY, FRAME_ANY, false); + say("@Farewell.. and as a man of me word, I shall give you the location and key to me treasure trove. It has a powerful weapon thou mayest be interested in...@"); + subtractKarma(25); //massive karma hit + if (isNearby(IOLO)) + { + IOLO.say("Iolo speaks in a hushed tone, " + polite_title + ", I beg thee not to consider this insane offer. Now I know why we left him to rot in the dungeons! Even if we are talking about this pirates untold wealth; ridding the kingdom of Chuckles once and for all can't possibly be virtuous!@"); + IOLO.say("@I mean, granted; tis Chuckles and all, but still... @"); + IOLO.hide(); + } + if (!gflags[HELP_DRUDGEWORTH]) //opens up convo flag on Chuckles + gflags[HELP_DRUDGEWORTH] = true; + closeMirror(item); + break; + break; + + } + else + { + say("@Then begone with ye, wretch!@"); + UI_set_item_flag(DRUDGEWORTH, SI_ZOMBIE); //pissed him off + closeMirror(item); + break; + + } + } + else + { + say("@Then begone with ye, wretch!@"); + UI_set_item_flag(DRUDGEWORTH, SI_ZOMBIE); //pissed him off + break; + } + case "no thanks"(remove): + say("@You stand there giving me false hope that ye'd help me and all I get instead are false promises and shattered dreams! Ye aren't worthy of the title of Avatar, dog!*"); + UI_set_item_flag(DRUDGEWORTH, SI_ZOMBIE); //pissed him off + closeMirror(item); + break; + }//end converse 2 + + + case "bye": + say("@Thou wilt be back...@ He stares at you with a sardonic grin on his face.@"); + closeMirror(item); + break; + + }//end converse + }//end scripted +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/GargoyleShrines.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/GargoyleShrines.uc new file mode 100755 index 0000000..983a9a3 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/GargoyleShrines.uc @@ -0,0 +1,265 @@ +void gargShrines shape# (906) () +{ + //FLAGS USED = MET_MONDAIN = 28, LEARNED_MANTRA_CONTROL = 1090 + + if (event == DOUBLECLICK) + { + var garg_statue = UI_get_item_frame(item); + var AvatarCurrentKarma = getKarma(); + + if (garg_statue == 0) // Mondain - Shrine of Control + { + UI_show_npc_face(163, 0); + + item.say("A stone statue of the evil wizard Mondain.*"); + if (!gflags[MET_MONDAIN]) + { + item.say("You remember as if it were yesterday how you defeated Mondain in your first visit to Brittania.*"); + item.say("Using the four stones, you went back in time to smash his power-gem.*"); + item.say("The statue speaks!"); + item.say("@We meet again, Avatar.@*"); + item.say("@Fear not! I have but one task now, and am no threat.@"); + } + else + say("@For what dost thou return, Avatar?@"); + + var options = ["name", "job", "bye"]; + + + //Start of regular conversation tree + converse(options) + { + case "name"(remove): + say("@Surely you of all people would recognize me as Mondain.@"); + + + case "job"(remove): + say("@The gargoyles have enshrined my spirit here as the embodiment of Control.@"); + add(["Control"]); + + case "Control"(remove): + + if (!gflags[LEARNED_MANTRA_CONTROL]) + { + say("@I was once a mighty wizard.@*"); + say("@Control was the essence of my soul--control of self and control of others.@*"); + say("@But desire for more control overcame me.@*"); + say("@I forsook my self-control in my hunger for conquest.@*"); + say("@Control must start with the self and expand outward.@*"); + say("@The strong must lead. But to be strong one must control oneself first.@*"); + say("@The gargoyles understand Control.@*"); + say("@Their society is based on the strong guiding the weak.@*"); + say("@In this way, they survive in their harsh world.@*"); + say("@Contemplate what thou hast learned. Repeat after me the Mantra of Control.@*"); + say("@Un.....Un.....Un.....@*"); + AVATAR.say("@Un....Un....Un.....@*"); + AVATAR.hide(); + say("@I can teach thee no more.@"); + gflags[LEARNED_MANTRA_CONTROL] = true; + giveExperience(100); + } + else + say("@I can teach thee no more.@"); + + case "bye": + + if (!gflags[MET_MONDAIN]) + { + say("@Thou wilt need control of others to succede in thy quest, Avatar.@*"); + say("@But thou wilt most of all need control of thyself to be worthy.@*"); + if (AvatarCurrentKarma >=80) + say("@I admire thy deeds and thy control.@"); + else if ((AvatarCurrentKarma >= 60) && (AvatarCurrentKarma < 80)) + say("@Thy deeds show understanding of Control.@"); + else if ((AvatarCurrentKarma >= 50) && (AvatarCurrentKarma < 60)) + say("@Thy deeds show a need for more Control.@"); + else + if (AvatarCurrentKarma < 50) say("@Thy deeds show a lack of Control.@"); + gflags[MET_MONDAIN] = true; + } + else + { + say("@Farewell, Avatar.@*"); + say("@May thy control help you succeed in thy quest.@"); + } + + break; + + + } + + + + + } +//MINAX - SHRINE OF PASSION + + else if (garg_statue == 1) // Minax - Shrine of Passion + { + UI_show_npc_face(164, 0); //face of Minax + + item.say("A stone statue of the evil witch Minax.*"); + if (!gflags[MET_MINAX]) + { + item.say("You remember quite clearly how you defeated Minax in your second visit to Brittania.*"); + item.say("With a mighty sword blow, you slew the witch and destroyed her evil works.*"); + item.say("The statue speaks!"); + item.say("@We meet again, Avatar.@*"); + item.say("@Fear not! I have but one task now, and am no threat.@"); + } + else + say("@For what dost thou return, Avatar?@"); + + var options = ["name", "job", "bye"]; + + + //Start of regular conversation tree + converse(options) + { + case "name"(remove): + say("@Surely you of all people would recognize me as Minax.@"); + + + case "job"(remove): + say("@The gargoyles have enshrined my spirit here as the embodiment of Passion.@"); + add(["Passion"]); + + case "Passion"(remove): + + if (!gflags[LEARNED_MANTRA_PASSION]) + { + say("@I was once a mighty sorceress.@*"); + say("@Passion was the essence of my soul. But that passion knew no bounds.@*"); + say("@I wanted everything, and because of this strove to conquer all.@*"); + say("@Passion must be directed, focused.@*"); + say("@Unbridled passion, desire for all things, leads only to chaos.@*"); + say("@The gargoyles understand Passion.@*"); + say("@Their society is based on the passionate leading those who lack motivation.@*"); + say("@In this way, they have the will to struggle against their harsh world.@*"); + say("@Contemplate what thou hast learned. Repeat after me the Mantra of Passion.@*"); + say("@Or.....Or.....Or......@*"); + AVATAR.say("@Or....Or.....Or....@*"); + AVATAR.hide(); + say("@I can teach thee no more.@"); + gflags[LEARNED_MANTRA_PASSION] = true; + giveExperience(100); + } + else + say("@I can teach thee no more.@"); + + case "bye": + + if (!gflags[MET_MINAX]) + { + say("@Thou wilt need passion to succeed in thy quest, Avatar.@*"); + say("@But thou must limit thy passion, lest balance and order be lost.@*"); + if (AvatarCurrentKarma >=80) + say("@I admire thy deeds and thy Passion.@"); + else if ((AvatarCurrentKarma >= 60) && (AvatarCurrentKarma < 80)) + say("@Thy deeds the merits of thy passion.@"); + else if ((AvatarCurrentKarma >= 50) && (AvatarCurrentKarma < 60)) + say("@Thy deeds show misguided but strong passion.@"); + else if (AvatarCurrentKarma < 50) + say("@Thy deeds show nought but unlimited passion.@"); + + gflags[MET_MINAX] = true; + } + else + { + say("@Farewell, Avatar.@*"); + say("@May thy passion help you succeed in thy quest.@"); + } + + break; + + + } + + + + + } + +//EXODUS - SHRINE OF DILIGENCE + + else if (garg_statue == 2) // Exodus - Shrine of Diligence + { + UI_show_npc_face(165, 0); //face of Exodus + item.say("A stone statue of the evil Exodus.*"); + if (!gflags[MET_EXODUS]) + { + item.say("You remember quite vividly how you defeated Exodus in your third visit to Brittania.*"); + item.say("Using the four cards, you tricked the accursed machine into destroying itself*"); + item.say("The statue speaks!"); + item.say("@We meet again, Avatar.@*"); + item.say("@Fear not! I have but one task now, and am no threat.@"); + } + else + say("@For what dost thou return, Avatar?@"); + + var options = ["name", "job", "bye"]; + + + //Start of regular conversation tree + converse(options) + { + case "name"(remove): + say("@Though I no longer bear the form of the machine you destroyed, yet still am I Exodus.@"); + + + case "job"(remove): + say("@The gargoyles have enshrined my spirit here as the embodiment of Diligence.@"); + add(["Diligence"]); + + case "Diligence"(remove): + if (!gflags[LEARNED_MANTRA_DILIGENCE]) + { + say("@I was once a powerful daemon.@*"); + say("@Diligence was the essence of my soul--cold, unswerving diligence in my path of conquest.@*"); + say("@But in my devotion to achievement I lost sight of my original goals.@*"); + say("@Diligence without a goal is as worthless as a goal without diligence.@*"); + say("@The means cannot replace the end, and diligence cannot be the goal.@*"); + say("@The gargoyles understand Diligence.@*"); + say("@Their society is based on the diligent leading the wayward.@*"); + say("@In this way, they maintain their fight for survival in their harsh world.@*"); + say("@Contemplate what thou hast learned. Repeat after me the Mantra of Diligence.@*"); + say("@Us.....Us.....Us......@*"); + AVATAR.say("@Us....Us.....Us....@*"); + AVATAR.hide(); + say("@I can teach thee no more.@"); + gflags[LEARNED_MANTRA_DILIGENCE] = true; + giveExperience(100); + } + else + say("@I can teach thee no more.@"); + + case "bye": + if (!gflags[MET_EXODUS]) + { + say("@Thou wilt need Diligence to succeed in thy quest, Avatar.@*"); + say("@But thou wilt most of all need a clear vision of thy goal to be worthy.@*"); + if (AvatarCurrentKarma >=80) + say("@I admire thy deeds and thy Diligence.@"); + else if ((AvatarCurrentKarma >= 60) && (AvatarCurrentKarma < 80)) + say("@Thy deeds show the value of thy Diligence.@"); + else if ((AvatarCurrentKarma >= 50) && (AvatarCurrentKarma < 60)) + say("@Thy deeds show misguided Diligence.@"); + else if (AvatarCurrentKarma < 50) + say("@Thy deeds show a lack of Diligence.@"); + gflags[MET_EXODUS] = true; + } + else + { + say("@Farewell, Avatar.@*"); + say("@May thy diligence maintain thee on thy quest.@"); + } + + break; + + } + + } + + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/GenericCastleGuards.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/GenericCastleGuards.uc new file mode 100755 index 0000000..1f10de6 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/GenericCastleGuards.uc @@ -0,0 +1,27 @@ +void Elroy object#(0x433) () //castle guard 1 +{ + if (event == DOUBLECLICK) + { + var rand = UI_get_random(2); + var barks = ["@Welcome to Castle British, Avatar!@", "@Beware the gargoyles!@"]; + + UI_item_say(item, barks[rand]); + + return; + } + +} + +void Leroy object#(0x410) () //castle guard 2 +{ + if (event == DOUBLECLICK) + { + var rand = UI_get_random(2); + var barks = ["@Welcome to Castle British, Avatar!@", "@Beware the gargoyles!@"]; + + UI_item_say(item, barks[rand]); + + return; + } + +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/GenericGuard.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/GenericGuard.uc new file mode 100755 index 0000000..a294d00 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/GenericGuard.uc @@ -0,0 +1,161 @@ + +void Guard object# (0x326) () //"trinsic guard" +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + + if (event == PROXIMITY) + { + var barks = UI_get_random(3); + + if (barks == 1) + delayedBark(item, "@Beware of gargoyles!@", 0); + + else if (barks == 2) + delayedBark(item, "@Is it lunch time yet?@", 0); + else + delayedBark(item, "@Be careful whilst traveling!@", 0); + } + + + if (event == DOUBLECLICK) + { + UI_show_npc_face(2, 0); + //Avatar and NPC greeting barks + av_1st_greet = "@Hold, guard!@"; + npc_1st_greet = "@Yes, " + polite_title + "?@"; + + av_2nd_greet = "@Hold, guard!@"; + npc_2nd_greet = "@Yes, " + polite_title + "?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + UI_show_npc_face(2, 0); + item.say("A muscular, well armored guard.*"); + item.say("@Hello. Can I help you with something?@"); + if (askYesNo()) + { + item.say("@Well, what can I help you with?@"); + } + else + { + item.say("@If that is all, then I'll be back about my duties.@"); + sayGoodbyeAbrupt(item, "Beware of the gargoyles!"); + return; + } + + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm not allowed to give out that information.@*"); + + case "job"(remove): + say("@I am one of Lord British's elite guards. We keep order throughout Britannia.@"); + add(["order", "Britannia"]); + + case "order"(remove): + say("@Lately our ranks have thinned. Many have been lost in the war against the gargoyles.@*"); + add("gargoyles"); + + case "Britannia"(remove): + say("@Hail Lord British! Hail Britannia! Hail the glorious Avatar!@*"); + + case "gargoyles"(remove): + say("@Few of us are left to patrol the cities, and those may be sent to the shrines soon.@*"); + say("@I fear we may lose this war.@*"); + add(["patrol", "lose"]); + + + case "patrol"(remove): + say("@That is our only job, in times of peace.@*"); + add(["peace"]); + + + case "lose"(remove): + say("@Not a single shrine have we liberated. The gargoyles fight like daemons!@*"); + add(["daemons"]); + + + case "daemons"(remove): + say("@I have noticed a certain resemblance...@*"); + + case "peace"(remove): + say("@May we see such times again!@*"); + + case "bye": + say("@If that is all, then I'll be back about my duties.@"); + + avatar_goodbye = "@Carry on..@"; + npc_goodbye = "@Stay safe!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Kador.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Kador.uc new file mode 100755 index 0000000..8065c95 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Kador.uc @@ -0,0 +1,222 @@ +void Kador object#(0x462) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var USER_INPUT; + var avatar_goodbye; + var npc_goodbye; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == PROXIMITY) + { + var prox_barks = UI_get_random(3); + + if (prox_barks == 1) + { + delayedBark(item, "@Arf!@", 0); + + } + else if (prox_barks == 2) + delayedBark(item, "@Woof, woof!@", 2); + else + delayedBark(item, "@Bow, wow!",1); + } + + if (event == DOUBLECLICK) + { + var av_1st_greet = "@C'mere doggy...@"; + var npc_1st_greet = "@Woof, woof!@"; + var av_2nd_greet = "@C'mere, Kador!@"; + var npc_2nd_greet = "@Arf!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("An amiable, shaggy mutt."); + item.say("The dog jumps up and tries to lick your face."); + UI_set_item_flag(item, MET); + } + else + item.say("An amiable, shaggy mutt."); + + if (gflags[KADOR_SAD]) + { + item.say("The dog gets up and brings you his bowl again, looking at you expectantly."); + item.say("Do you give him any money?"); + if (askYesNo()) + { + USER_INPUT = UI_input_numeric_value(0, 5, 1, 1); + if (hasGold(USER_INPUT)) + { + chargeGold( USER_INPUT); + say("The dog seems pleased."); + gflags[KADOR_SAD] = false; + } + else say("You don't have that much money."); + } + else say("After a while the dog sets down the bowl, lies down, and starts whimpering."); + sayGoodbyeAbrupt(KADOR, "..whine.."); + return; + } + + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[ASK_KADOR_TRICKS]) + add ("tricks"); + + if (UI_get_item_flag(ARTUROS, MET)) + add ("Arturos"); + + if (UI_get_item_flag(WANDA, MET)) + add ("Wanda"); + + if (UI_get_item_flag(ANDREAS, MET)) + add ("Andreas"); +//////////////////////////////////////////////////////////////////// +// Main conversation thread +//////////////////////////////////////////////////////////////////// + + converse(options) + { + case "name"(remove): + say("The dog looks at you with a puzzled expression on his face."); + + + case "job"(remove): + say("The dog looks at you with a puzzled expression on his face."); + add("tricks"); + + case "tricks"(remove): + say("The dog looks at you expectantly."); + converse(["sit", "shake", "fetch", "roll over", "heel", "play dead", "speak", "beg", "nothing"]) + { + case "sit": + say("The dog sits."); + + case "shake": + say("The dog shakes paws with you."); + + case "fetch": + say("The dog fetches a stick and lays it at your feet."); + + case "roll over": + say("The dog rolls over."); + + case "heel": + say("The dog bites your heel."); + + case "play dead": + say("The dog plays dead."); + + case "speak": + if (!UI_get_item_flag(item, NAKED)) + { + say("@I feel that the whole debate over 'free will' versus 'determinism' arises from an artificial semantic division. In light of the work of Godel and Heisenberg, it is evident that the two concepts are indistinguishable and thus, for all practical purposes, identical.@"); + UI_set_item_flag(item, NAKED); + } + else + { + var dog_bark; + var rand = UI_get_random(3); + if (rand == 1) + dog_bark = "@Arf!@"; + else if (rand == 2) + dog_bark = "@Woof, woof.@"; + else if (rand == 3) + dog_bark = "@Bow wow!@"; + else + dog_bark = "@Woof?@"; + say(dog_bark); + } + + case "beg": + say("The dog begs."); + + case "nothing": + say("The dog picks up a bowl in his mouth and holds it up to you. You see that it has several coins in it already."); + say("Do you give him any money?"); + if (askYesNo()) + { + USER_INPUT = (UI_input_numeric_value(0, 5, 1, 1)); + if (hasGold(USER_INPUT)) + { + chargeGold(USER_INPUT); + say("The dog seems pleased."); + + } + else + { + say("You don't have that much money."); + say("After a while the dog sets down the bowl, lies down, and starts whimpering."); + gflags[KADOR_SAD] = true; + sayGoodbyeAbrupt(item, "..whine.."); + break; + } + } + else say("After a while the dog sets down the bowl, lies down, and starts whimpering."); + gflags[KADOR_SAD] = true; + break; + } + + case "Arturo"(remove): + say("@Grrrrrrr....@."); + + case "Wanda"(remove): + say("@Grrrrrrr....@."); + + case "Andreas"(remove): + say("@Grrrrrrr....@."); + + + case "bye": + + avatar_goodbye = "@Bye, Kador!@"; + npc_goodbye = "@Ruff!@"; + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Karina.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Karina.uc new file mode 100755 index 0000000..58f349d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Karina.uc @@ -0,0 +1,193 @@ +void Karina object#(0x42d) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var avatar_goodbye; + var npc_goodbye; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + var av_1st_greet = "@Hello there..@"; + var npc_1st_greet = "@Hi..@"; + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Ah, tis thee..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (gflags[KADOR_SAD] == true) + { + item.say("@How could you be so mean to Kador! You go and apologize to my poor little dog this instant!@"); + sayGoodbyeAbrupt(item, "Poor little doggie.."); + return; + + } + + item.say("A gypsy girl poised on the verge of womanhood.*"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(ZOLTAN, MET)) + add ("advice", "buy"); + + if ((UI_get_item_flag(MARIAH, MET) && (gflags[LEARNED_ABOUT_TABLET]))) + add ("Captain Johne", "silver tablet"); +//////////////////////////////////////////////////////////////////// +// Main conversation thread +//////////////////////////////////////////////////////////////////// + + converse(options) + { + case "name"(remove): + say("@My name is Karina.@ she says, looking shyly at the ground. @Do you think it's a pretty name?@"); + UI_set_item_flag(item, MET); + if (askYesNo()) + say("@Thank you.@"); + else say("@Oh.@"); + + + case "job"(remove): + say("@Father says I'm supposed to dance for gorgios.@"); + add(["father", "dance", "gorgios"]); + + case "advice"(remove): + say("@I have to ask you for a gold piece for my advice. Is that okay?@"); + if (askYesNo()) + { + if (hasGold(1)) + { + chargeGold(1); + say("@Ask our dog, Kador, to do some tricks for you. He knows lots of them!@"); + if (!gflags[ASK_KADOR_TRICKS]) + { + gflags[ASK_KADOR_TRICKS] = true; + } + add(["Kador"]); + } + else say("@I'm sorry. I'm not supposed to help you unless you pay.@"); + } + else say("@It was my father's idea!@"); + + case "father"(remove): + say("@He is Zoltan, king of the gypsies!@"); + add(["king"]); + + case "dance"(remove): + say("@Oh, I just couldn't, not in front of so many people.@"); + add(["people"]); + + case "gorgios"(remove): + say("@That's what we call anyone who isn't a gypsy.@"); + add(["gypsy"]); + + case "gypsy"(remove): + say("@It's a nice life, but it gets lonely. I miss my sister.@"); + add(["sister"]); + + case "sister"(remove): + say("@Her name is Penumbra. Have you any news of her?@"); + if(askYesNo()) + { + say("@Oh! I'm so glad to hear she's okay!@ She throws her arms around you and kisses you on the cheek.@"); + } + else say("@If you do, please come tell me. I miss her so much...@"); + + case "buy"(remove): + say("@I have nothing to sell you. Talk to my father.@"); + + + case "king"(remove): + say("@Well, that's what he says.@"); + + case "Captain Johne"(remove): + say("@Ask my father.@"); + + case "silver tablet"(remove): + say("@Ask my father.@"); + + case "people"(remove): + say("@I'd be too embarassed!@"); + add(["embarassed"]); + + case "embarassed"(remove): + say("@Well... Do you promise not to make fun of me?@"); + if (askYesNo()) + { + UI_play_music(203); //Raggle Taggle Gypsy + say("Suddenly she starts dancing a dance of haunting beauty, to the sound of music that seems to emanate from nowhere.*"); + say("It's one of the most wondrous sights you've ever seen.*"); + say("After a timeless time, the music ceases, and she turns and runs away."); + if (!UI_get_item_flag(item, PETRA)) + { + addKarma(10); + UI_set_item_flag(item, PETRA); + } + UI_set_schedule_type(item, SHY); + break; + } + else say("She turns away from you."); + subtractKarma(5); + sayGoodbye2(item); + break; + + case "Kador"(remove): + say("@He's such a sweet little doggie...@"); + + case "bye": + + item.say("@Good bye, and sweet dreams to you.@"); + + avatar_goodbye = "@Goodbye, Karina..@"; + npc_goodbye = "@Good bye, and sweet dreams to you.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Mama.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Mama.uc new file mode 100755 index 0000000..ed5ab7f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Mama.uc @@ -0,0 +1,152 @@ + +void Mama object# (0x46f) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hold, Cyclops!@"; + npc_1st_greet = "@You tiny!@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@You come back!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A huge female cyclops.*"); + item.say("@Oh you cute! You funny-looking like tiny one!@"); + UI_set_item_flag(item, MET); + } + else + { + item.say("@You come back! Play with tiny one?@"); + if (askYesNo()) + { + item.say("@Good, he need tiny friends!@"); + } + else + item.say("@But he needs tiny friends! He get lonely!@"); + } + + //standard conversation options + var options = ["name", "job", "bye", "tiny one"]; + + if (gflags[TOLD_ABOUT_CUBE]) + add("vortex cube"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Me cyclops.@*"); + say("@Tiny one says me 'Mama'.@*"); + + case "job"(remove): + say("@Live here! Cook, hunt!@"); + + case "tiny one"(remove): + say("@Male find him on shore.@*"); + say("@One-eye little one die long ago.@*"); + say("@Two-eye little one just as good!@*"); + + case "vortex cube"(remove): + say("@What look like?@*"); + add(["a cube"]); + + case "a cube"(remove): + say("@What color?@*"); + add(["black"]); + + case "black"(remove): + say("@Oh, me seen that! Big black block!@*"); + add(["block"]); + + case "block"(remove): + say("@Male keep that in cellar.@*"); + if (!gflags[PAPA_HAS_CUBE]) //will set cellar option on Papa + gflags[PAPA_HAS_CUBE] = true; + add(["cellar"]); + + case "cellar"(remove): + say("@Cellar no go. Deep deep deep. Locked.@*"); + add(["locked"]); + + case "locked"(remove): + say("@Talk male. He have key.@*"); + + case "bye": + + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@Come back soon, play with tiny one more!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Mandrake.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Mandrake.uc new file mode 100755 index 0000000..cd2b3cb --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Mandrake.uc @@ -0,0 +1,337 @@ + +void Mandrake object# (0x468) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, bard!@"; + var npc_1st_greet = "@Welcome! Welcome!@"; + + var av_2nd_greet = "@Hello, Mandrake!@"; + var npc_2nd_greet = "@Salutations, Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + if (!UI_get_item_flag(item, MET)) + { + item.say("A charming fellow with a peacock feather in his cap."); + item.say("@Welcome, welcome! 'Tis always a pleasure to see a new face.@"); + item.say("@My name is Mandrake. And what may I call thee?@"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + if (player_is_female) + item.say("@A pleasure, to be sure, " + polite_title + ". I hope I'll be seeing a lot more of you.@ He gives you a sly wink."); + else + item.say("@Well met, sirrah!@"); + item.say("@You look like the sort who knows how to enjoy a good story.@"); + add("story"); + + UI_set_item_flag(item, MET); + } + else + { + item.say("@" + player_name + "! It's been too long. What brings you to this part of the realm?*"); + item.say("@Well, never mind that for the moment. Let me sing thee a song!@"); + add("song"); + } + + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[VIRTUE_STONES]) + add("Virtue stones"); + + if (UI_get_item_flag(item, SI_ZOMBIE) && !UI_get_item_flag(item, PETRA)) //virtue stone flag is set but haven't foudn them yet + add("found stones"); + + //////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Mandrake, my friend, Mandrake. Like the root, but taller, handsomer, and louder.@*"); + add(["root", "louder"]); + + case "job"(remove): + say("@I travel all over to spread important news throughout the realm - and tales and songs as well.@"); + say("@If you have time enough, I'll favor you with all three.@"); + add(["news", "story", "song"]); + + case "root"(remove): + say("@It grows in swamps, but I'm found mostly in taverns.@*"); + add(["taverns"]); + + + case "louder"(remove): + say("@So I've heard.@*"); + + case "taverns"(remove): + say("@I visit them all. The Fallen Virgin and the Sword and Keg are rowdy and rough.@*"); + say("@The Blue Bottle serves Frasier's Folly - the finest ale in all Britannia.@*"); + say("@But the Cat's Lair is still my favorite.@*"); + add(["The Fallen Virgin", "The Sword and Keg", "The Blue Bottle", "Frasier's Folly", "The Cat's Lair"]); + + + case "The Fallen Virgin"(remove): + say("@'Tis in Buccaneer's @Den - no place for the timid.@*"); + add(["Buccaneer's Den"]); + + + case "The Sword and Keg"(remove): + say("@Over in Jhelom, it is. They always love a good brawl.@*"); + add(["Jhelom"]); + + + case "The Blue Bottle"(remove): + say("@'Tis in Moonglow.@*"); + say("@Derydlus often drinks there - the man can put away more ale than any other I've met.@*"); + say("@Many's the time he's drunk me under the table.@*"); + add(["Derydlus", "Moonglow"]); + + + case "Frasier's Folly"(remove): + say("@You should try some! 'Twill do thee a world of good.@*"); + + case "The Cat's Lair"(remove): + say("@A wonderful place! Dr. Cat gives me free drinks just for singing.@"); + say("@He loves games of all kinds too. Mention my name to him and he'll be sure to treat thee well.@*"); + + + case "Buccaneer's Den"(remove): + say("@If thou knowest not where it is, I'll not be the one to say.@*"); + + case "Jhelom"(remove): + say("@Lots of warriors there. They fight just about every night, but they don't mean anything by it. 'Tis all in fun.@*"); + + case "Derydlus"(remove): + say("@Give him my regards if you see him.@*"); + + case "Moonglow"(remove): + say("@Too honest a town to be much fun, but some fine people live there.@*"); + say("@You should have Penumbra tell your fortune sometime.@*"); + add(["Penumbra"]); + + + case "Penumbra"(remove): + say("@I hear she has strange powers.@*"); + add(["powers"]); + + + case "powers"(remove): + say("@Yes, the gift of prophecy.@*"); + add(["prophesy"]); + + + case "prophesy"(remove): + say("@So I hear.@*"); + + case "news"(remove): + say("@My travels were interrupted recently in a most fearsome manner.@*"); + say("@I was captured by the gargoyles, and taken down to the other side of the world, where they held me prisoner.@*"); + say("@But such was my good fortune that one of them helped me to escape. He spoke but little of our tongue, but I believe he said his name was 'Beh Lem.@*"); + add(["gargoyles"]); + + + case "gargoyles"(remove): + say("@I've seen their handiwork many a time in my travels.@*"); + say("@I believe they have taken over all of the shrines of the eight virtues.@*"); + add(["virtues"]); + + + case "virtues"(remove): + say("@Oh, you know: honesty, compassion, valour, justice, sacrifice, honor, spirituality, and humility.@*"); + say("@That's what you get for choosing such stuffy principles as a basis.@*"); + add(["stuffy principles"]); + + + case "stuffy principles"(remove): + say("@Truth, love and courage... hah!@*"); + say("@If it had been up to me, I'd have chosen wine, women and song instead.@*"); + say("@Think of the virtues those would lead to!@*"); + add(["which virtues?"]); + + + case "which virtues?"(remove): + say("@I've thought it over...@*"); + say("@The principles of wine, women and song would lead to the eight virtues of drunkenness, sensuality, harmony, lust, laziness, dance, indulgence, and happiness.*"); + say("@Now there would be the foundation for a fine world to live in!@*"); + + case "story"(remove): + say("@Perhaps my stories would be worth a few coins?@*"); + if (askYesNo()) + { + var donate = UI_input_numeric_value(1, 20, 1, 1); + if (hasGold(donate)) + { + chargeGold(donate); + say("@You're too kind.@"); + } + say("@You don't have that much.@"); + + } + else say("@As you wish.@*"); + say("Mandrake tells you tales for quite a while, yet listening to them you lose track of time."); + say("He tells you of ships sailing off the edge of the world, of earthquakes, and mad wizards, and fierce battles."); + say("He speaks of spells that halt the flow of time, a man who found a way to fly, and the strange secret of the wisps."); + say("He tells you that there are two bands of gypsies who travel the King's Way, who are often mistaken for each other."); + say("He speaks of the pirate ship Empire, which was much dreaded in its day, and of the giant ants that can be found in the Dry Land."); + say("Your head is filled with wondrous visions."); + if (isNearby(DUPRE) && inParty(DUPRE)) + say("But finally he notices that Dupre has begun to doze off, and decides to bring his tales to an end."); + else + say("But finally his tales come to an end."); + + case "song"(remove): + say("@I sing better if I keep my belly full, and my wineskin as well.@"); + say("@Would you care to donate a coin or two?@*"); + if (askYesNo()) + { + var donate = UI_input_numeric_value(1, 20, 1, 1); + if (hasGold(donate)) + { + chargeGold(donate); + say("@Thank you kindly.@"); + } + say("@You don't have that much.@"); + + } + else say("@As you wish.@*"); + say("@Ok, here we go!@"); + say("@The dragon is a scaly sort, Who spouts flame when he sneezes..@"); + say("@Many a bold knight has he fought, For he goes where e'er he pleases.@*"); + say("@Mister Porcupine's naught but spines, To the dismay of him and his missus..@"); + say("@For that for which he truly pines, Is one of her sweet kisses.@"); + say("@A gypsy girl and a butterfly, Were out in the woods at play..@"); + say("@And when I saw them I said 'Oh my! What a perfect sunny day!'@"); + + //ADDED FOR MANDRAKE QUEST + case "Virtue stones"(remove): + if (!UI_get_item_flag(item, PETRA)) + { + say("@So Kytyn told you about the Virtue Stones? Funny you should mention that...@"); + say("@...I'm afraid I no longer have them.@"); + add("where are they?"); + + } + else + { + say("@Are you finished with the Virtue stones and ready to return them?@"); + if (askYesNo()) + { + var stones = UI_count_objects(PARTY, SHAPE_VIRTUE_STONE, QUALITY_ANY, FRAME_ANY); + if (stones < 1) + say("@I don't see any Virtue stones, I hope you didn't misplace them?@"); + else if (stones > 1 && stones < 8) + say("@Where are the rest of them? Please bring all eight of them back when you are done using them.@"); + else + { + say("@Much abliged, " + polite_title + ", I cannot thank thee enough for helping me recover them from those thieves.@"); + say("@I shall return them to Kytyn as soon as I can.@"); + UI_remove_party_items(8, SHAPE_VIRTUE_STONE, QUALITY_ANY, FRAME_ANY); + giveExperience(100); + } + } + + } + + case "where are they?"(remove): + say("@Have a seat and a drink, and I'll tell you all about it..@"); + say("@So there I was, in the Blue Bottle having a Frasier's Folly with Derydlus, to celebrate successfully making the transaction for the stones.@"); + say("@Derydlus, bless his soul, was feeling a little tipsy and pulled out one of the stones from my pack to inquire what they do. @Perhaps they are for teleportation@, says I, @ and I put them back into my backpack.@"); + say("@Unfortunately, a few ruffians were listening in from behind us. A mage named Morwyn, and a warrior named Daglar. I've had a few run ins with them in the past..@"); + say("@They must have been in Moonglow to rob the antiquities dealer. At the time, I didn't think anything of it so I continued making merry well into the night.@"); + say("@As I was leaving the Blue Bottle, they waylaid me in my inebriated state and took the Virtue stones! I suspect they delivered them to the mage who lives somewhere in the Dungeon Deciet, doing unspeakable experimentations.@"); + say("@I've been traveling all over Britannia in hopes of hiring some warriors to get them back for me so I can deliver them to Kytyn...@"); + add("mage"); + + case "mage"(remove): + say("@Aye, I belive he is called Morgoth. I know Morwyn and Daglar purloin items and things for his experimentations. I stumbled upon them once whilst exploring Hythloth.@"); + say("@I'd hate to go back to Kytyn empty handed, will you help me?@"); + if (askYesNo()) + { + say("@I drink to thy honor, " + polite_title + "!@"); + say("@Bring them back here and I will tell you their secret. If thou dost promise to return them after thy quest is over, thou mayest use them.@"); + say("@Morgoth lives somewhere deep into the Dungeon Deceit. It is located on an island north of Moonglow. I would guarantee those daft thugs Morwyn and Daglar took them to him in hopes of making a little coin.@"); + say("@I hope he doublecrosses them someday - they would surely deserve it!@"); + say("@Good luck, and return here once you have found them to ease my mind!@"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) + UI_set_item_flag(item, SI_ZOMBIE); //agreed to quest + sayGoodbyeAbrupt(item, "Safe journey to thee!"); + break; + } + else + say("@Oh. Well, I'm sure I can find someone else, then.@"); + + case "found stones"(remove): + say("@You found them? Well done, " + polite_title + "!@"); + if (UI_count_objects(PARTY, SHAPE_VIRTUE_STONE, QUALITY_ANY, FRAME_ANY) > 0) + { + say("@Since they are safely in thy possession, thou mayest use them. I believe when the 'Recall' and 'Mark' spells are used upon them, one can teleport to the marked location.@"); + say("@I am sure that Kytyn wouldn't mind loaning them out to the Avatar, as long as you return them before your quest is over.@"); + UI_set_item_flag(MANDRAKE, PETRA); //set so you can't ask him about the quest again + giveExperience(100); + + } + else + say("@Maybe I'm daft, but I don't see any stones in thy possession.@"); + + case "bye": + if (player_is_female) + say("@Leaving so soon, " + polite_title + "? And I was enjoying your company so.@ He bows and kisses your hand."); + else + say("@Well, " + player_name + ", I'm glad you stopped by to chat with me. We must do it again sometime.@"); + say("I'll be glad to play another song for you when next we meet.@"); + + var avatar_goodbye = "@Bye Mandrake!@"; + var npc_goodbye = "@Safe travels to thee, Avatar!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Morgoth.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Morgoth.uc new file mode 100755 index 0000000..aa380bf --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Morgoth.uc @@ -0,0 +1,12 @@ + +void Morgoth object# (0x469) () +{ + + if (event == DOUBLECLICK) + { + + UI_item_say("@Attack, my minions!@"); + UI_set_schedule_type(item, IN_COMBAT); + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Myles.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Myles.uc new file mode 100755 index 0000000..c74ac69 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Myles.uc @@ -0,0 +1,158 @@ + +void Myles object# (0x46d) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (UI_get_schedule_type(item) == HOUND) + { + //reorganised to make it easier to add barks + var barks = [ + "@Wow, neat! Two-eyes!@", + "@Whats your name?@", + "@Where are you from?@", + "@You look like me!@", + "@You are a human!@", + "@Would you like to play?@", + "@Come play in the castle with me!@" + ]; + + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, little one!@"; + npc_1st_greet = "@Wow!@"; + + av_2nd_greet = "@Hello, Myles!@"; + npc_2nd_greet = "@Yay, you're back!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A young human child.*"); + if (!UI_get_item_flag(item, MET)) + { + item.say("@Wow! Two-eyed people like me! You gotta go see my folks!@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Hi again!@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[TOLD_ABOUT_CUBE]) + add("vortex cube"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm Myles. But Mama and Papa aren't good with names.@*"); + say("@They just call me 'tiny one'!@*"); + add(["Mama and Papa"]); + + case "job"(remove): + say("@Oh, I help Mama and Papa!@"); + say("@Though sometimes I think Papa wishes I were big and strong like a cyclops, so I could help more.@"); + + case "vortex cube"(remove): + say("@There's a whole lot of junk lying around the castle.@*"); + + case "Mama and Papa"(remove): + say("@They're not my real parents. Mama and Papa found me on the beach.@*"); + say("@I guess my real parents drowned or something. That was long ago. I don't remember much about it.@*"); + say("@Mama and Papa said they used to have a son of their own, but he died. So they adopted me!@*"); + add(["adopted"]); + + + case "adopted"(remove): + say("@We all live in that big old castle!@*"); + say("@It's a real neat place, with all sorts of rooms and cellars and stairs and stuff.@*"); + add(["cellar", "stuff"]); + + case "stuff"(remove): + say("@There's a whole lot of junk lying around the castle. Ask Mama or Papa about it.@"); + say("@Papa doesn't let me play with much of it.@"); + + + case "cellar"(remove): + say("@A lot of places are locked. Papa keeps the keys.@*"); + if (!gflags[PAPA_HAS_CUBE]) //will set cellar option on Papa + gflags[PAPA_HAS_CUBE] = true; + + case "bye": + + + avatar_goodbye = "@Goodbye, Myles!@"; + npc_goodbye = "@See you later!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/NoTalkNPCs.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/NoTalkNPCs.uc new file mode 100755 index 0000000..820bcbc --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/NoTalkNPCs.uc @@ -0,0 +1,88 @@ +void Dawg object#(0x402) () //guard dog in Trinsic +{ + if (event == PROXIMITY) + { + var rand = UI_get_random(5); + var barks = ["@Grrrrr!@", "@Arf arf!@", "@Ruff!@", "Woof!", "Woof woof", "@Roll that beautiful bean footage!@"]; + + UI_item_say(item, barks[rand]); + + return; + } + + if (event == DOUBLECLICK) + { + var rand = UI_get_random(6); + var barks = ["@Grrrrr!@", "@Arf arf!@", "@Ruff!@", "Woof!", "Woof woof", "@Roll that beautiful bean footage!@"]; + item->set_alignment(EVIL); + item->set_schedule_type(IN_COMBAT); + item->set_alignment(EVIL); + UI_item_say(item, barks[rand]); + + return; + } + +} + +//brigand under Yew in the former Resistance tunnels (Was Tseramed) + +void brigand object#(0x40a) () +{ + + if (event == DOUBLECLICK) + { + item->set_alignment(EVIL); + item->set_schedule_type(IN_COMBAT); + + + + } + + +} + +//gargoyle guards in Hythloth - visible once you speak to Sin Vraal +void HythGuard2 object#(0x4d3) () +{ + + if (event == DOUBLECLICK) + { + item->set_alignment(EVIL); + item->set_schedule_type(IN_COMBAT); + + + + } + + +} + +void HythGuard1 object#(0x4db) () +{ + + if (event == DOUBLECLICK) + { + item->set_alignment(EVIL); + item->set_schedule_type(IN_COMBAT); + + + + } + + +} + +void HythGuard3 object#(0x4d6) () +{ + + if (event == DOUBLECLICK) + { + item->set_alignment(EVIL); + item->set_schedule_type(IN_COMBAT); + + + + } + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Papa.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Papa.uc new file mode 100755 index 0000000..cd0e7c2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Papa.uc @@ -0,0 +1,192 @@ + +void Papa object# (0x46b) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + var gave_fish_already = UI_get_item_flag(item, FREEZE); + + const int QUALITY_FRESHFISH = 1; //the quality of freshly-caught fish + const int FRAME_FRESHFISH = 31; //used since quality doesn't work + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hail, Cyclops!@"; + npc_1st_greet = "@Hoh! You human!@"; + + av_2nd_greet = "@Greetings..@"; + npc_2nd_greet = "@Human back!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A huge male cyclops.*"); + item.say("@Who you?@"); + UI_set_item_flag(item, MET); + } + else if (UI_get_item_flag(item, PETRA)) // asked about fish + { + if (gave_fish_already) + item.say("@Hoh! You bring fish?@"); + else + item.say("@You bring good fish. Bring more?@"); + + if (askYesNo()) + { + if (UI_count_objects(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_FRESHFISH) > 0) //has fresh fish + { + + if (!UI_get_item_flag(item, NAKED)) //hasn't given key yet + { + say("@Good fish! Here, key.@"); + say("The cyclops hands you a large, rusted key."); + UI_add_party_items(1, SHAPE_KEY, QUALITY_BASEMENT, FRAME_BASEMENT); + UI_set_item_flag(item, NAKED); //set to prevent giving key again + UI_set_item_flag(item, FREEZE); //gave fish already + } + else + say("@Good fish! Good friend!@"); + UI_remove_party_items(1, SHAPE_FOOD, QUALITY_ANY, FRAME_FRESHFISH); + + } + else if (UI_count_objects(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_FRESHFISH) > 0) //has fish + { + say("@Fish not fresh!@"); + } + else + say("@Where fish? No smell fish.@"); + } + else + say("@No fish?@ The cyclops seems sad."); + + } + else + item.say("@Hoh, hoh. You back!@*"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[PAPA_HAS_CUBE]) //have asked Myles or Mama bout the vortex cube + { + add("cellar"); + } + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Me cyclops.@"); + say("@Tiny one say me 'Papa'.@"); + add(["Tiny one"]); + + case "job"(remove): + say("@Live here! Eat, hunt!@"); + + case "Tiny one"(remove): + say("@Find him on shore.@"); + say("@One-eye little one die long ago. Female want little one, so keep tiny one.@"); + say("@Not strong like one-eye little one.@"); + + case "cellar"(remove): + say("@Cellar no go. Locked.@"); + add(["locked"]); + + case "locked"(remove): + if (!UI_get_item_flag(item, NAKED)) //if you havne't gotten key yet + { + say("@Got key. Want key?@"); + if (askYesNo()) + { + say("@Want fish!@*"); + say("@Want key, bring fish!@"); + add(["fish"]); + UI_set_item_flag(item, PETRA); //will always ask about fish now + } + else + say("@Why ask no want?@"); + } + else + say("@No got key.@"); + + + case "fish"(remove): + say("@Fish good. Like eat much fish!@"); + + case "bye"(remove): + + avatar_goodbye = "@Goodbye for now..@"; + if (!UI_get_item_flag(item, NAKED)) //if you havne't gotten key yet + npc_goodbye = "Come back, bring fish!"; + else + npc_goodbye = "Come back, bring more fish!"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/PegJr.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/PegJr.uc new file mode 100755 index 0000000..f70e5db --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/PegJr.uc @@ -0,0 +1,23 @@ +void PegJr object#(0x11f) () +{ + if (event == PROXIMITY) + { + var rand = UI_get_random(6); + var barks = ["@Brrrrrawwwwk!@", "@Cluck Cluck!@", "@Squawk!!@", "@Nomalet must be defeated!@"]; + + UI_item_say(item, barks[rand]); + + return; + } + + if (event == DOUBLECLICK) + { + var rand = UI_get_random(6); + var barks = ["@Brrrrrawwwwk!@", "@Cluck Cluck!@", "@Squawk!!@", "@Nomalet must be defeated!@"]; + + UI_item_say(item, barks[rand]); + + return; + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Pegbyter.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Pegbyter.uc new file mode 100755 index 0000000..e8a7937 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Pegbyter.uc @@ -0,0 +1,13 @@ +void Pegbyter object#(0x4a0) () +{ + if (event == DOUBLECLICK) + { + var rand = UI_get_random(4); + var barks = ["@Gideon is a Psychopath! He secretly hates his wife Marta!@", "@Have you seen PegJr?@", "@Drudgeworth was right about Chuckles!@", "@The Great Heist shall go down in history!@"]; + + UI_item_say(item, barks[rand]); + + return; + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Phoenix.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Phoenix.uc new file mode 100755 index 0000000..646b4dd --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Phoenix.uc @@ -0,0 +1,184 @@ +void Phoenix object# (0x480) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + pronoun = "lass"; + // title = "madame"; + } + else + { + pronoun = "laddie"; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me..@"; + npc_1st_greet = "@Who goes there?@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@You again?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A graceful, silver haired woman in robes of blue."); + item.say("She eyes you suspiciously. @What do you want?@"); + + + //standard conversation options + var options = ["name", "job", "bye"]; + + //Budo asked you to retire her + if (gflags[RETIRE_PHOENIX]) + add ("belt"); + + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Phoenix.@*"); + + case "job"(remove): + say("@I used to be captain of the Black Thechu. But now I'm a member of the thieves guild, and I don't care who knows it..@"); + say("@Britain is the wealthiest city in the world, and I make a tidy living sneaking up there at night to 'liberate' a few possessions.@"); + say("@Of course, I only steal from those who have too much wealth for their own good..@"); + add(["Black Thechu", "thieves", "guild"]); + + case "thieves"(remove): + say("@It's an honorable profession, with as long a tradition as any other.@*"); + + case "guild"(remove): + say("@If you want to join the guild, go talk to Budo about it.@*"); + if (!gflags[LEARNED_ABOUT_GUILD]) + gflags[LEARNED_ABOUT_GUILD] = true; + add(["Budo"]); + + + case "Black Thechu"(remove): + say("@She was the finest ship that ever sailed. But those days are past. The crew's scattered to the four corners of the earth, and the Thechu's off amongst the stars.@*"); + add(["stars"]); + + + case "stars"(remove): + say("@We were at port one day when the anchor chain snapped, and the Thechu drifted off the edge of the world.@*"); + say("@I'd join her if I could, and sail through space...@*"); + add(["edge"]); + + + case "edge"(remove): + say("@The world is flat, you know.@ She eyes you appraisingly*"); + say("@Surely any well educated person would be aware of that.@*"); + + case "Budo"(remove): + say("@He lives in Buccaneer's Den. These tunnels can take you there - unless you get lost, or the rats get you...@*"); + add(["Buccaneer's Den"]); + + + case "Buccaneer's Den"(remove): + say("@The rumors of pirates there are just idle chatter.@*"); + say("She smiles. @I haven't been there in a while. It's a lovely little town...@*"); + add(["chatter", "pirates"]); + + + case "pirates"(remove): + say("@Pirates? I'm sure I wouldn't know a thing about them.@*"); + + case "chatter"(remove): + say("@I don't know about you, but some of us have more important things to do with our time.@*"); + + case "belt"(remove): + say("@You want my belt? I'm sorry, " + pronoun + ", but I'm not ready to retire just yet.@*"); + add(["retire"]); + + case "retire"(remove): + say("@No way! I'm making too good a living to give it up now. If you want to get my belt, use your wits.@*"); + say("@Prove you're worthy to replace me.@*"); + add(["wits"]); + + + case "wits"(remove): + say("@Figure it out yourself.@*"); + sayGoodbyeAbrupt(item, "@Now run along..@"); + break; + + + case "bye": + say("@About time you were on your way. One thing before you go...@"); + say("She draws her dagger. @Don't tell anyone where my hideout is. If you do, some night you'll go to sleep and never wake up again.@*"); + say("You'll never know when it's coming.*@"); + UI_play_sound_effect(1); + say("She turns and throws the dagger at a little mouse that was sniffing around for food, pinning it to the wall by its tail."); + if ((inParty(SHERRY)) && (canTalk(SHERRY))) + { + SHERRY.say("@Eeeeek!@ Sherry runs up your leg, and takes several minutes before you can coax her back down again."); + SHERRY.hide(); + UI_set_schedule_type(SHERRY, SHY); + + } + + avatar_goodbye = "@That is all.@"; + npc_goodbye = "@Consider that thy only warning...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/PushmePullyu.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/PushmePullyu.uc new file mode 100755 index 0000000..bee7c08 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/PushmePullyu.uc @@ -0,0 +1,207 @@ +void PushmePullyu object# (0x495) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var time_of_day; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + + + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + +///////////////////////////////Time of day///////////// + + if ((hour >= 6) && (hour < 12)) //'good morning' + { + time_of_day = "morning"; + } + + if ((hour >= 12) && (hour < 18)) //'good afternoon' + { + time_of_day = "afternoon"; + } + else time_of_day = "evening"; + + + + + if (event == DOUBLECLICK) + { + if (partynum > 1) greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + var met_pushmepullyu = UI_get_item_flag(item, MET); // + + //barks for Avatar + if (!met_pushmepullyu) bark = "@Canst thou talk, creature?@"; // + else bark = "@Hi Again!@"; //barked after npc is met + + script AVATAR + { + call GenericFreeze; + face AVATAR->find_direction(item); + actor frame standing; + say bark; + wait 10; + }; + + + //NPC barks + if (!met_pushmepullyu) bark = "@Am I one, or are we two?@"; // + else bark = "@Are we as confused as you are?@"; //bark when npc met you already + + + script item + { + call GenericFreeze; + wait 5; + face find_direction(AVATAR); + actor frame standing; + say bark; + wait 8; + call (PushmePullyu); + }; + } + else if (event == SCRIPTED) + { + //Unfreeze Avatar and ITEM: + AVATAR->GenericUnfreeze(); + item->GenericUnfreeze(); + + item.say("A bizarre, two-headed beast. Both heads take turns speaking to you*"); + item.say("@Stand over here!@"); + UI_change_npc_face0(1); + item.say("@Stand over there!@"); + UI_change_npc_face0(0); + item.say("@Come hear our puzzle anywhere!@"); + + + var options = ["name", "job", "bye"]; + + + + //Variable conversation options based on global flags or people met. Remove if none///// + // if (gflags[GLOBAL_FLAG_HERE]) + // add("Insert Convo topic here"); + + + //-------------------------------------------------------------//based on MET flag - delete all if not used + // if (UI_get_item_flag(PUSHMEPULLYU, MET)) + // add ("NPC name"); + + + + + + + ///////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////// + + + converse(options) + { + case "name"(remove): + say("@Should I answer you today? If asked tomorrow, I would say...@*"); + say("@That my partner and I are the Pushme Pullyu, and speaking in riddles is what we do. @*"); + UI_change_npc_face0(1); + say("@But which is Pullyu, and which is Pushme? If you'd asked yesterday, I'd have told thee!@*"); + add(["Pushme", "Pullyu"]); + + case "job"(remove): + UI_change_npc_face0(0); + say("@If my partner said you should go west, then he would be a lying pest!@"); + UI_change_npc_face0(1); + say("@If my partner said you should go east, then he would be a lying beast!@"); + UI_change_npc_face0(0); + say("@If my partner said 'Go east.' to you, then he'd have said that which is true.@"); + UI_change_npc_face0(1); + say("@If my partner said to you 'Go west.', then his advice would be the best.@"); + add(["west", "east"]); + + case "Pushme"(remove): + UI_change_npc_face0(0); + say("@If you asked my partner, thinking him wise, he'd tell you the Pushme always lies!@*"); + add(["lies"]); + + + case "Pullyu"(remove): + UI_change_npc_face0(1); + say("@If you asked my partner, then forsooth, he'd say the Pullyu always speaks truth!@*"); + add(["truth"]); + + + case "lies"(remove): + UI_change_npc_face0(0); + say("@My partner lies, and that is true. It is because he's the Pullyu!@*"); + + + + case "truth"(remove): + UI_change_npc_face0(0); + say("@I'll always tell the truth to thee. That's because I am the Pushme!@*"); + + + + case "west"(remove): + UI_change_npc_face0(0); + say("@If you asked my partner which was best, he'd say 'East lie beasts, so go quest west.'@*"); + + case "east"(remove): + UI_change_npc_face0(1); + say("@If you asked my partner which was best, he'd say 'East lie beasts, so go quest west.'@*"); + + + case "bye": + UI_change_npc_face0(0); + say("@So soon to leave?@*"); + UI_change_npc_face0(1); + say("@You'd leave so soon?@*"); + UI_change_npc_face0(0); + say("@Take three blind mice, a dish and spoon!@*"); + UI_change_npc_face0(1); + say("@And if, perhaps, you've solved our riddle,@*"); + UI_change_npc_face0(0); + say("@Then go dance with the cat and the fiddle!@*"); + say("Both heads smile innocently at you."); + if (isNearby(DUPRE)) + { + DUPRE.say("Dupre is staring at them, his jaw hanging wide open."); + DUPRE.hide(); + } + if (isNearby(IOLO)) + { + IOLO.say("Iolo says @That's got to be the most baffling thing I've ever heard.@"); + IOLO.hide(); + + } + avatar_bark = "@So long..@"; + npc_bark = "@Leaving so soon? So soon to leave?@"; + delayedBark(AVATAR, avatar_bark, 0); + delayedBark(PUSHMEPULLYU, npc_bark, 1); + break; + + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/SinVraal.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/SinVraal.uc new file mode 100755 index 0000000..ceb49e0 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/SinVraal.uc @@ -0,0 +1,180 @@ +void SinVraal object# (0x4b5) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hold, gargoyle!@"; + npc_1st_greet = "@Greetings, False Prophet.@"; + + av_2nd_greet = "@Hello again..@"; + npc_2nd_greet = "@Welcome back, Virtuous One.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("@The daemon Sin'Vraal."); + item.say("@Good " + time_of_day + ", " + polite_title +".@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[TALKEDTOHOMERABOUTMAP]) + add("pirate"); + + if (gflags[MARIAH_READ_TABLET]) + add("Book of Prophesies"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Sin'Vraal.@*"); + + case "job"(remove): + say("@No job, " + polite_title + ". I am free to wander where I wish.@"); + add(["free"]); + + case "free"(remove): + say("@Among my people, those who can fly rule. Though I have wings, I cannot fly. So I was a slave.@*"); + say("@Here I am free!@"); + add(["fly", "people"]); + + case "fly"(remove): + say("@There are two kinds of gargoyles: winged ones and wingless ones.@*"); + say("@Wingless ones are mute and unintelligent. They do all the manual labor.@*"); + say("@Winged ones are smart, and do all the planning and leading. Being able to fly is, to them, a sign of intelligence.@*"); + say("@Even the Temple can only be reached by air.@*"); + add(["intelligence", "Temple"]); + + case "people"(remove): + say("@I am not a daemon, though humans think so. I am a gargoyle.@*"); + add(["gargoyle"]); + + case "gargoyle"(remove): + say("@I fled here to the Underworld because I was not free among the gargoyles.@*"); + + case "intelligence"(remove): + say("@Yes, a strange concept this.@*"); + say("@Yet as some in Minoc can tell you, flying can be achieved by anyone.@*"); + if (!gflags[LEARNED_ABOUT_FLYING]) + gflags[LEARNED_ABOUT_FLYING] = true; //set for asking people in minoc about balloon. + + case "Temple"(remove): + say("@The great Temple of Singularity held the Codex. The Temple is the most holy gargoyle place. A human could learn much by traveling there.@*"); + say("@But you could never get to the temple. Not only is it deep below the surface, but it can only be reached by flying.@"); + + case "pirate"(remove): + say("@Yes, I once met a pirate here in the desert. He seemed to be hunting me, but he got dragged off by the ants!@*"); + add(["ants"]); + + case "ants"(remove): + say("@The great desert ants build huge mounds, and are very dangerous!@*"); + + case "Book of Prophesies"(remove): + say("@The Book of Prophecies says that the False Prophet will come to destroy the gargoyle race.@*"); + say("@Only the sacrifice of the False Prophet will save us.@*"); + add(["sacrifice"]); + + case "sacrifice"(remove): + say("@Sacrifice means many things in my language.@*"); + say("@You should seek out a gargoyle scholar to learn more. Travel the other side of the world, and you should be able to find one.@*"); + say("@You can go down through Hythloth to get to the realm of gargoyles.@*"); + if (!gflags[LEARNED_ABOUT_HYTHLOTH]) + { + gflags[LEARNED_ABOUT_HYTHLOTH] = true; + //reveal guards with key + UI_clear_item_flag(HYTH_GUARD1, DONT_RENDER); + UI_clear_item_flag(HYTH_GUARD2, DONT_RENDER); + UI_clear_item_flag(HYTH_GUARD3, DONT_RENDER); + + //should cause guards to go on regular schedule - patrol / pace + UI_run_schedule(HYTH_GUARD1); + UI_run_schedule(HYTH_GUARD2); + UI_run_schedule(HYTH_GUARD3); + + } + + + case "bye": + + avatar_goodbye = "@Goodbye!@"; + npc_goodbye = "@May your persistence and precision lead to success!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Smith.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Smith.uc new file mode 100755 index 0000000..4b4fb4e --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Smith.uc @@ -0,0 +1,187 @@ + +void Smith object# (0x471) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings...horse?@"; + npc_1st_greet = "@Hello! I mean, 'Neigh'!@"; + + av_2nd_greet = "@Might we speak again, Smith?@"; + npc_2nd_greet = "@Hello again!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A fine looking horse.*"); + item.say("@Hello, my name is Smith. Who are you?@"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + UI_set_item_flag(item, MET); + item.say("@Oh, I had something important to tell you! I can't remember what it was, though...@"); + } + else + item.say("@Hello again!@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[SOLVED_CHUCKLES_QUEST]) + add("clue"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@It's 'Smith', like in 'blacksmith'@*"); + add(["blacksmith"]); + + case "job"(remove): + say("@I eat Iolo's hay to keep it from piling up everywhere and making a mess.@"); + if (isNearby(IOLO)) + { + IOLO.say("Iolo winks at you. @And a fine job you do of it, too. I don't know what I'd do without you.@"); + IOLO.hide(); + } + add("hay"); + + + case "clue"(remove): + say("@Oh, that's right, I have a clue for you! You're the Warrior of Destiny, right?"); + say("@Well, when you go to rescue Lord British from the underworld, be sure to bring his sandlewood box with you!@*"); + if (isNearby(DUPRE)) + { + DUPRE.say("@We went to all that trouble just to hear this?@ says Dupre."); + DUPRE.say("@We rescued Lord British from the underworld years ago!@"); + DUPRE.hide(); + say("@Well, even if you didn't like my clue, it wouldn't kill you to say 'thank you.'@"); + add("thank you"); + + } + add(["sandlewood box"]); + + case "thank you"(remove): + say("@You're welcome!@*"); + + + case "sandlewood box"(remove): + say("@I don't know what it all means, I just know it's important.@*"); + + case "blacksmith"(remove): + say("@They make my shoes.@*"); + add(["shoes"]); + + + case "shoes"(remove): + say("@They're nailed to my feet, see?@ He holds up a hoof for you to look at.*"); + add(["feet"]); + + + case "feet"(remove): + say("@You should try it. Saves you from looking for your shoes every morning.@*"); + + + case "hay"(remove): + say("@Hay is the greatest menace to the well being of Britannia.@"); + say("@It takes constant vigilance to keep it from engulfing the entire realm.*"); + say("@I've devoted my life to the task.@*"); + add("task"); + + + case "task"(remove): + say("@It's a thankless job, but I am a determined horse.@*"); + say("@Hay, thou hath met thy nemesis, thy doom, and his name is Smith!@*"); + + + case "bye": + if (!UI_get_item_flag(SMITH, SI_ZOMBIE)) + { + if (isNearby(IOLO) && isNearby(DUPRE)) + { + IOLO.say("You see Iolo give Dupre a nudge in the ribs. @You owe me a drink, @he says, grinning."); + IOLO.say("He turns to you. @Sir Know-it-all here bet me that there was no such thing as a talking horse!@"); + IOLO.hide(); + + DUPRE.say("@Now I've seen everything. I suppose we'll be inviting some ducks over for tea next.@"); + DUPRE.hide(); + + UI_set_item_flag(SMITH, SI_ZOMBIE); + } + + } + avatar_goodbye = "@Goodbye, Smith!@"; + if (party > 1) + npc_goodbye = "@Farewell, two-leggers!@"; + else + npc_goodbye = "@Farewell, two-legger!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Sutek.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Sutek.uc new file mode 100755 index 0000000..b543149 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Sutek.uc @@ -0,0 +1,225 @@ + +void Sutek object# (0x4a2) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var sutek_mad = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == HOUND) + { + //reorganised to make it easier to add barks + var barks = [ + "@Leave here at once!@", + "@I shall turn thee into a newt!@", + "@Suffer my wrath!@", + "@Thou must flee Sutek the Mad!@" + ]; + + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + //Otherwise, say generic NPC barks + else scheduleBarks(item); + } + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me..@"; + npc_1st_greet = "@Who dares to disturb Sutek?!@"; + + av_2nd_greet = "@Might we speak again, Sutek?@"; + if (sutek_mad) + npc_2nd_greet = "@No!@"; + else + npc_2nd_greet = "@What is it now?!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A white-haired mage in flowing robes with a mad gleam in his eye.*"); + + if (UI_get_item_flag(item, SI_ZOMBIE))//you pissed him off + { + item.say("@Get out! Flee before the awesome wrath of the mad mage Sutek!*"); + + + sayGoodbyeAbrupt(item, "Flee my wrath!"); + + if (UI_get_item_flag(item, SI_ZOMBIE)) //checks to see if you pissed of Sutek, then clears flag + UI_clear_item_flag(item, SI_ZOMBIE); + UI_set_schedule_type(item, HOUND); + return; + + } + if (!UI_get_item_flag(item, NAKED)) //used instead of MET flag which for some reason isn't working on him! + { + item.say("@So, Avatar, you disturb the musings of the mad mage Sutek!@*"); + item.say("@What wisdom dost thou seek?@"); + UI_set_item_flag(item, NAKED); + } + else + item.say("@What brings you back to disturb the musings of the mad mage Sutek again?"); + add("mad mage"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //this flag is set by talking to Michelle of minoc about her father, then opening up convo topics for Isabella + Selganor + if (gflags[LEARNED_ABOUT_BALLOONIST]) + add("balloonist"); + + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@The name Sutek strikes fear in the hearts of mere mortals!@*"); + say("@Everyone knows the name of Sutek the Mad!@"); + + case "job"(remove): + say("@Sutek the Mad is the greatest mage the land has ever known!@"); + say("@Even the Avatar acknowledges the power and wisdom of Sutek! Don't you, " + player_name + "?@"); + if (askYesNo()) + { + say("@Good.@"); + } + else + { + say("@No?! Then you must die!@*"); + UI_set_item_flag(item, SI_ZOMBIE); //Flag set when you've pissed Sutek off + say("@But Sutek is mad, and so he will grant you one last nugget of wisdom before thy death!@*"); + say("@What wouldst thou like to know?@"); + } + + case "mad mage"(remove): + say("@Yes! Sutek is mad!@*"); + say("@They say there is a fine line between genius and madness. Well, Sutek hops up and down on that line, cursing the fools that surround him!@"); + + case "balloonist"(remove): + say("@Balloonist? Yes, Sutek remembers him.@*"); + say("@He died in Sutek's catacombs, like most of the others who have ever worked for Sutek!@"); + + if (UI_get_item_flag(item, SI_ZOMBIE)) //checks if you've pissed Sutek off (SI ZOMBIE FLAG SET) + { + say("@Thy question is answered. Now flee before the awesome wrath of the mad mage Sutek!@"); + sayGoodbyeAbrupt(item, "Flee!"); + UI_set_schedule_type(item, HOUND); //causes Sutek to hound avatar with insults + break; + } + else + { + say("@Dost thou seek employment with Sutek the Mad?@*"); + if (askYesNo()) + { + say("@Well, too bad! Sutek isn't hiring today!@"); + //say("@But perhaps Sutek could find some use for you yet..@"); //added for Matt quest. + } + else + { + say("@No?! What sort of fool passes up the opportunity to work for the greatest genius of this age?@*"); + say("@Such fools must die!@"); + } + } + add(["catacombs"]); + + case "catacombs"(remove): + say("@Sutek hired many brilliant engineers to build the catacombs that lie beneath his castle.@*"); + say("@The catacombs are filled with the bones of those engineers!@*"); + say("@The Pushme-Pullyu knows where all such bones can be found!@"); + add(["Pushme-Pullyu"]); + + case "Pushme-Pullyu"(remove): + say("@Sutek created the Pushme-Pullyu as a test for fools! If you can pass the test, you will learn what you wish to know!@"); + + + case "bye": + if (UI_get_item_flag(item, SI_ZOMBIE)) + { + say("@What?!@*"); + say("@Sutek grants thou a piece of wisdom to take to thy grave, and thou refusest it?@*"); + say("@Then thou must die!@"); + npc_goodbye = "@Leave here or die!@"; + } + else + { + say("@How darest thou leave the presence of Sutek the Mad before he has dissmissed you?!@*"); + say("@If thou art so rude, then I banish thee from my presence!@*"); + say("@Begone, and pester Sutek no further!@*"); + npc_goodbye = "@Begone, fool!@"; + } + + + avatar_goodbye = "@That is all..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Taynith.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Taynith.uc new file mode 100755 index 0000000..35edb4f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Taynith.uc @@ -0,0 +1,251 @@ +void Taynith object#(0x438) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var avatar_goodbye; + var npc_goodbye; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + //Used for casting tiles, should start at 0! + var count = UI_get_npc_id(item); + var explanation; + var tiles; + + if (event == DOUBLECLICK) + { + var av_1st_greet = "@Excuse me...@"; + var npc_1st_greet = "@The Avatar!@"; + var av_2nd_greet = "@A moment, Taynith..@"; + var npc_2nd_greet = "@Welcome back, Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, av_2nd_greet, npc_1st_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (gflags[KADOR_SAD]) //set when you stiff Kador on his coins + { + item.say("@I have no time for those who are cruel to animals.@"); + sayGoodbyeAbrupt(item, "Rude!"); + return; + } + + if (UI_get_schedule_type(item, TEND_SHOP) && isNearby(DR_CAT)) + { + item.say("@My chances to visit Dr. Cat come all too seldom. Seek me out later and I will speak with you.@"); + sayGoodbyeAbrupt(item, "Come back another time.."); + return; + } + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A mysterious gypsy woman wearing an ankh pendant."); + UI_set_item_flag(item, MET); + item.say("@You are the Avatar. I had a vision that you would come to seek aid from me.@"); + } + else item.say("@Welcome back, Avatar.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(DR_CAT, MET)) + add("Dr. Cat"); + + if (UI_get_item_flag(ZOLTAN, MET)) + add("Zoltan"); + + if (UI_get_item_flag(item, SI_ZOMBIE)) + add("path"); + + if (gflags[LEARNED_ABOUT_CAPT_JOHNE]) + add("Captain Johne"); + +//////////////////////////////////////////////////////////////////// +// Main conversation thread +//////////////////////////////////////////////////////////////////// + + converse(options) + { + case "name"(remove): + say("@Some know me as Taynith. That is what you may call me.@*"); + add(["Taynith"]); + + case "job"(remove): + say("@I tell fortunes - for a price.@"); + add(["fortune", "advice"]); + + case "Taynith"(remove): + say("@Seek not my true name. Let 'Taynith' suffice.@*"); + add(["true name"]); + + + case "true name"(remove): + say("@You try my patience.@*"); + + case "Captain Johne"(remove): + say("@Captain Johne? Yes, he brought us a silver tablet some time ago, to deliver to the Lycaeum.@*"); + say("@Zoltan took care of the deal, so he could tell you more than I@*"); + add(["silver tablet", "Lycaeum"]); + + case "silver tablet"(remove): + say("@Ask Zoltan about it.@*"); + add(["Zoltan"]); + + + case "Zoltan"(remove): + say("@King of the gypsies, sure as my name's Taynith.@*"); + add(["gorgio"]); + + case "path"(remove): + say("@My path leads to Paws, as soon as I have time to visit there.@*"); + add(["Paws"]); + + + case "Paws"(remove): + say("@My good friend Dr. Cat lives there.@*"); + add(["Dr. Cat"]); + + + case "Dr. Cat"(remove): + say("@Ask him about the duck sometime.@*"); + add(["duck"]); + + + case "duck"(remove): + say("@Yes, ask him!@*"); + + + case "Lycaeum"(remove): + say("@Zoltan can tell you where it is.@*"); + + case "advice"(remove): + say("@My advice will cost you two gold. Do you still want it?@*"); + if (askYesNo()) + { + if (hasGold(2)) + { + chargeGold(2); + say("@Look through the books at the Lycaeum. You might learn something useful there.@"); + add(["Lycaeum"]); + } + else + say("@Best check your purse.@"); + } + else + say("@Very well.@"); + + case "fortune"(remove): + say("@I charge six gold to cast my tiles. Are you interested?@*"); + if (askYesNo()) + { + if (hasGold(6)) + { + chargeGold(6); + say("From the folds of her cloak, she withdraws a velvet pouch.*"); + say("After shaking it gently, she casts forth three small squares of ivory, each with an image etched into its surface and a title at the bottom.*"); + if (count == 0) + { + tiles = "'Panda, 'Coin', and 'Bead of Glass.'"; + explanation = "Taynith says: @There is something made of glass that plays a very important role in your future, but the signs are unclear. Seek out Penumbra. Her crystal ball should hold more of an affinity for this item. If you pay her enough, she can tell you more than I.@"; + add(["Penumbra"]); + } + else if (count == 1) + { + tiles = "'Abyss', 'Mountains', and 'Maelstrom'"; + explanation = "Taynith says: @This is strange. The tiles show that to accomplish your ends, you must go down very far, then up very far, but you will not end up back where you started. The 'Maelstrom' indicates something important as well, but I cannot determine what it means.@"; + } + else if (count == 2) + { + tiles = "'Path', 'War', and 'Rogue'"; + explanation = "@The 'War' tile is particularly striking. It depicts a dragon and a tiger, each about to bite the others tail.@ Taynith says: @Britannia is on a path towards all out war, that is plain enough. The 'Rogue' is one who would go against the wishes of his Lord to find another path.@"; + } + else if (count == 3) + { + tiles = "'Bead of Glass', 'Maelstrom', and 'Clever Fish'"; + explanation = "Taynith frowns. @I cannot interpret this pattern. I'm afraid you'll have to seek its meaning on your own.@"; + } + + else if (count >= 4) + { + tiles = "'Shaman', 'Blademaster', and 'Clever Fish'"; + explanation = "Taynith says: @All of these things and more must you be to find success in your quest.@"; + } + say("The tiles are: " + tiles); + say(explanation); + UI_set_npc_id(item, count + 1); + say("@If you consult the tiles another time, perhaps they will have more to say of your future.@"); + + + } + else + say("@Best check your purse.@"); + } + else + say("@Very well.@"); + + + case "Penumbra"(remove): + if (UI_get_item_flag(PENUMBRA, MET)) + say("@I sense that you have met her already. There is no need for me to direct you there.@"); + else + say("@You are destined to meet her.@"); + + case "gorgio"(remove): + say("@A gorgio - that's almost as good as being a gypsy!@*"); + + case "bye": + say("@Our paths will cross again. I have foreseen it.@"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) + UI_set_item_flag(item, SI_ZOMBIE); + + avatar_goodbye = "@Farewell..@"; + npc_goodbye = "@Safe journeys, Avatar!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Volcano.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Volcano.uc new file mode 100755 index 0000000..42d967b --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Volcano.uc @@ -0,0 +1,38 @@ +//NPC is frank the fox, used for volcanos. DO NOT use him in game + + +void volcano_explosion object# (0x4a5) () +{ + + + if (event == SCRIPTED) + { + //find volcanos + const int SHAPE_VOLCANO = 1177; + var volcano_item = UI_find_nearby(item, SHAPE_VOLCANO, 1, MASK_NONE); + UI_error_message("Frank the fox volcano explosion has been called"); + UI_error_message("Volcanos found nearby are: " + UI_get_array_size([volcano_item])); + + if (UI_get_array_size([volcano_item]) > 0) + { + var rand = UI_get_random(volcano_item); + + + Eruption(volcano_item[rand]); + var rand_timer = UI_get_random(60); + + script volcano_explosion after rand_timer + 20 ticks + { + call volcano_explosion; + + } + } + else + return; + + } + + + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Wanda.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Wanda.uc new file mode 100755 index 0000000..506a2c1 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Wanda.uc @@ -0,0 +1,317 @@ + +void Wanda object# (0x431) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int WANDA_REST_TIMER = 16; + const int WANDA_FULLY_RESTED = 3; //after 3 hours she's fully rested + + var avatar_title; //What Wanda calls avatar + var random_avatar_title; + var wanda_avatar_title; + var random = UI_get_random(2); + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + + if (player_is_female) + { + random_avatar_title = "honey"; + wanda_avatar_title = "madam"; + } + else + { + wanda_avatar_title = "sirrah"; + if (random == 1) random_avatar_title = "sexy"; + else if (random == 2) random_avatar_title = "honey"; + } + + if (UI_get_item_flag(item, SI_ZOMBIE)) //set when Avatar refuses to pay/can't pay + { + avatar_title = "cheapskate"; + } + else + avatar_title = random_avatar_title; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, milady..@"; + npc_1st_greet = "@Well, hello there..@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@If you've got the money, I've got the time!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + UI_clear_item_say(item); + UI_clear_item_say(AVATAR); + item.say("A gypsy wench with a voluptuous figure."); + + if (player_is_female) + item.say("@Hello, wench. How goes it?@"); + else + { + item.say("@Well, hello handsome! Looking for a little...relaxation?@"); + if (askYesNo()) + { + say("@Well this is the place!@"); + } + else + say("@Ha! You must be afraid of what your mother might think.@"); + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(ARTUROS, MET)) + add ("Arturos"); + + if (UI_get_item_flag(ANDREAS, MET)) + add ("Andreas"); + + if (gflags[LEARNEDGYPSYSSTOLEMAP]) + add ("map"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@They call me 'Wicked Wanda,' " + random_avatar_title + ".@"); + + case "job"(remove): + say("@If we can find someplace private, I'll gladly show you how I got my nickname...@"); + add(["private"]); + + case "private"(remove): + var random_private = UI_get_random(2); + + if (random_private == 1) + say("@Hmm, sounds like I've piqued your interest...@"); + else + say("@Why " + wanda_avatar_title + ", are you trying to insinuate something?@ She breaks into a fit of giggles."); + add(["I'm interested.."]); + + case "I'm interested.."(remove): + var wagondoor = UI_find_nearest(WANDA, 975, 20);// looks for wagon door + + if (wagondoor) + { + if (UI_get_item_flag (item, PETRA)) //needs rest + { + say("@Again, so soon? Nay, come back later, when I've had a little time to rest.@"); + add(["rest"]); + } + else + { + + if (player_is_female) + say("@I don't get many lady customers... but why not? You're sure this is what you want? I've a cot in my wagon... 15 gold's the price--and I don't haggle! Interested, " + random_avatar_title + "?@"); + else + say("@I've a cot in my wagon... 15 gold's the price--and I don't haggle! Interested, " + random_avatar_title + "?@"); + + if (askYesNo()) + { + if (isNearby(DUPRE)) + { + DUPRE.say("@I don't think we have time for this...@"); + DUPRE.hide(); + } + else + { + AVATAR.say("A voice in the back of your head asks, @Do you really have time for this?@"); + AVATAR.hide(); + } + say("@Come on, honey. Cross my palm with 15 gold and I'll show you a good time. Okay?@"); + if (askYesNo()) + { + if (hasGold(15)) + { + chargeGold(15); + UI_set_timer(WANDA_REST_TIMER); + UI_clear_item_flag(item, SI_ZOMBIE); //no longer calls Avatar cheapskate + UI_set_item_flag(item, PETRA); //"too tired" flag + script item + { + call GypsyCutscene, BEGIN_WANDA_CUTSCENE; + }; + break; + } + else + { + say("@Hey, I don't give credit! No pay, no play, capish?@"); + UI_set_item_flag(item, SI_ZOMBIE); //she calls Avatar "cheapskate" + } + + } + else + { + say("@Fine! Come back when you get permission from your mother!@"); + UI_set_item_flag(item, SI_ZOMBIE); //she calls Avatar "cheapskate" + item->clear_item_flag(BG_DONT_MOVE); + AVATAR->clear_item_flag(BG_DONT_MOVE); + if (!player_is_female) + { + script item after 3 ticks + { + say "@Mama's boy...@"; + }; + + } + break; + } + } + else + { + say("@Fine! Come back when you get permission from your mother!@"); + UI_set_item_flag(item, SI_ZOMBIE); //she calls Avatar "cheapskate" + item->clear_item_flag(BG_DONT_MOVE); + AVATAR->clear_item_flag(BG_DONT_MOVE); + + + if (!player_is_female) + { + script item after 3 ticks + { + say "@Mama's boy...@"; + }; + + } + break; + } + } //end + } + else + say("@Let's get a bit closer to the wagon before we discuss these things, okay?@"); + + case "map"(remove): + say("@We don't have... Oh, wait, there was something!@"); + say("@Arturos, he, uh, found a map last time we were up at Empath Abbey.@"); + add(["Empath Abbey", "Arturos"]); + + case "Empath Abbey"(remove): + say("@I don't care much for them. They're all too stuck up.@"); + + + case "silver tablet"(remove): + say("@Andreas has a silver tablet you could ask him about.@*"); + say("@But I have something much sweeter for sale...@"); + add(["Andreas", "sweeter"]); + + case "sweeter"(remove): + var random_private = UI_get_random(2); + + if (random_private == 1) + say("@Hmm, sounds like I've piqued your interest...@"); + else + say("@Why " + wanda_avatar_title + ", are you trying to insinuate something?@ She breaks into a fit of giggles."); + add(["I'm interested.."]); + + + case "Andreas"(remove): + if (player_is_female) + say("@He could show you a real good time, honey!@"); + else + say("@He's in the same line of work as I am--but I think I'm more your type!@"); + + case "Arturos"(remove): + say("@He'll tell your fortune for you, " + wanda_avatar_title + ". Just ask him!@"); + add (["fortune"]); + + case "rest"(remove): + say("@'Tis tiring work, you know.@"); + + case "fortune"(remove): + say("@That's right.@"); + + + + case "bye": + + item->clear_item_flag(BG_DONT_MOVE); + AVATAR->clear_item_flag(BG_DONT_MOVE); + if (player_is_female) + { + say("@See you around... And if you meet anyone tall, dark and handsome, send 'em my way!@"); + } + else + say("@If you ever decide you need a break from adventuring, come find me again.@"); + break; + + + case "bye": + if (player_is_female) + { + say("@See you around... And if you meet anyone tall, dark and handsome, send 'em my way!@"); + } + else + say("@If you ever decide you need a break from adventuring, come find me again.@"); + break; + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@Come back again, honey!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Wisp.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Wisp.uc new file mode 100755 index 0000000..fe91e6c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Wisp.uc @@ -0,0 +1,229 @@ + +void Wisp object# (0x216) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int QUALITY_MANTRA_BOOK = 29; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@...hello?@"; + npc_1st_greet = "@...@"; + + av_2nd_greet = "@...hello?@"; + npc_2nd_greet = "@Xorinia addresses 'you' again.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + UI_show_npc_face(256, 0); + + item.say("A strange, glowing ball of energy.*"); + + if (gflags[GET_WISP_INFO] && UI_count_objects(PARTY, SHAPE_BOOK, QUALITY_MANTRA_BOOK, FRAME_ANY) >= 1 && !gflags[WISPS_GAVE_GOLD]) + { + item.say("@The volume 'you' bear with the symbol pattern representing the sounds 'The Book of Lost Mantras' is a prime source of high density information. Do 'you' wish to 'me' to locate a client who is willing to make an exchange for it at this time?@"); + if (askYesNo()) + { + item.say("For a few moments, the wisp pulses, saying nothing.*"); + item.say("@It is done,@ the wisp says at last, @Rklbwm have expressed desire to possess this information. Hoping, no doubt, for a bargain, Rklbwm have offered a small quantity of the substance 'gold' in lieu of the customary useful information.@*"); + item.say("@But surely 'you' wish 'me' to arrange for Rklbwm to provide information of value to 'you.' Am 'I' correct to assume this?@*"); + if (askYesNo()) + { + item.say("@Then so be it. Here is useful information from the Rklbwm:@"); + item.say("@'If a substance with a partially reflective surface is positioned so that its third index of refraction matches the wavelength coefficient of the output of a polarized light source, and the resulting beam is focused on an ionized crystal suspended in a unipolar magnetic field, matter can be converted into useful electromagnetic radiation at an efficiency rate of 96 to 98 percent, depending on the desired output frequency.'@*"); + item.say("@It was a pleasure doing business with you.@"); + UI_remove_party_items(1, SHAPE_BOOK, QUALITY_MANTRA_BOOK, FRAME_ANY, true); + gflags[WISPS_GAVE_GOLD] = true; + sayGoodbye2(item); + return; + } + else + { + var count = 0; + item.say("@Very well. 'You' have not sent enough life units to transport much substance, but it is 'your' decision to make.@"); + item.say("The wisp glows just a trifle brighter for a moment, and suddenly everyone notices that their packs have grown heavier."); + while ((UI_add_party_items(1, SHAPE_GOLD_NUGGET, QUALITY_ANY, FRAME_ANY, true))) + { + count+= 1; + } + UI_error_message("Party given " + count + " gold nuggets"); + item.say("@It was a pleasure doing business with you.@"); + UI_remove_party_items(1, SHAPE_BOOK, QUALITY_MANTRA_BOOK, FRAME_ANY, true); + sayGoodbye2(item); + + //can't repeat + gflags[WISPS_GAVE_GOLD] = true; + + return; + + } + + } + else + item.say("@The ways of Britannia are strange indeed.@"); + + } + else + item.say("@Again, 'you' of this plane address 'I' of the Xorinite dimension. By what name do 'you' wish to be addressed at this time?@"); + + var avatar_or_name = chooseFromMenu(["The Avatar", ("I am " + player_name)]); + + var name; + if (avatar_or_name == "The Avatar") + name = "Avatar"; + else + name = player_name; + + item.say("@Very well, '" + name + "' Do 'you' have memory of previous discussions with 'myself'?@"); + if (askYesNo()) + item.say("@Good. Tedious repetition should then be unnecessary on this occasion. Of what would 'you' speak?@"); + else + { + item.say("@So be it. 'I' must often repeat information when conversing with the life of Britannia, it seems. 'I' do not see how each unit of life here can have different memories, different desires, but again 'I' inform Britannia that it is not so in 'my' realm.@*"); + item.say("@Those which 'you' know as 'wisp' in Britannia are projections of the life of Xorinia. 'I' extend into many planes beside this one. Britannia communicates with 'me' very seldom, and is known by those of very few other planes.@*"); + item.say("@Every time 'I' speak with Britannia, it seems 'I' must explain 'my' nature again, as 'I' have just done. That is very strange.@"); + } + + //standard conversation options + var options = ["name", "job", "bye", "you"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@The concept of 'name' is one 'I' still do not grasp. 'I' believe that when 'you' ask 'me' to use '" + name + "' as a form of address, it has something to do with 'name.'@*"); + say("@When Britannia addressed me with the name 'Zog,' an attempt was made to explain. But still 'I' do not understand.@*"); + add(["Zog"]); + + case "job"(remove): + say("@Xorinia serves as a conduit for information between different planes. In exchange, these planes provide information that can be used to improve Xorinia.@*"); + say("@Occasionally payment is accepted in the form of substance, but this is not preferred.@"); + add(["information", "substance"]); + + case "Zog"(remove): + say("@Once when 'I' offered sample information to Britannia, the name 'Zog' was given by the life unit that received it. No further contact with Britannia was obtainable for some time after this.@*"); + say("@Perhaps misuse of the sample information was responsible.@*"); + + case "you"(remove): + say("@'I' and 'you' are words that seem to have no meaning. 'I' mimic the way 'you' use them in this language out of courtesy.@*"); + + case "information"(remove): + say("@Britannia has never participated in the interplanar exchange of information. 'I' have presented a sample known in Britannian terms as a 'secret', but no further interest has been shown.@*"); + add(["interest"]); + if (!gflags[GOT_ARMAGEDDON]) + add("secret"); + + + case "substance"(remove): + say("@Actual physical materials are so plentiful throughout the multiverse that they are of little value. Information has much greater worth.@*"); + + case "secret"(remove): + say("@Because of the nature of Britannian memory, 'I' now present the sample information to 'you' again.@*"); + say("The wisp pulsates, fading from blue to white, then back to blue again. As it does so, a scroll materializes in your hand.@*"); + + //give armageddon scroll + UI_add_party_items(1, SHAPE_MAGIC_SCROLL, QUALITY_ANY, FRAME_ANY, false); + + //set flag to prevent getting it again + gflags[GOT_ARMAGEDDON] = true; + + + + say("@This is a simple invocation of magic energy to bring about the cessation of all life. It is not a very useful or powerful form of magic, as it will only affect beings in the same plane where it is invoked.@*"); + say("@Inform any 'wisp' unit if 'you' have interest in further exchange.@"); + + + + case "interest"(remove): + say("@If 'you' present a reasonably dense information source to a 'wisp' unit, arrangements will be made to transfer some suitably valuable commodity into Britannian possession.@*"); + if (!gflags[GET_WISP_INFO]) + gflags[GET_WISP_INFO] = true; + //flag set?? + + + + case "bye": + say("@'I' find it unusual that 'you' find it so important to inform 'me' of the imminent cessation of proximity between one unit of Britannian life and one of Xorinite.@*"); + say("@Nonetheless, in accordance with 'your' custom: Goodbye, '" + name + "'@"); + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Ybarra.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Ybarra.uc new file mode 100755 index 0000000..c773782 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Ybarra.uc @@ -0,0 +1,313 @@ +void Ybarra object# (0x467) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + //var map; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + + + //get count of party food for Ybarra + var partyfood = UI_count_objects(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_ANY); + + //frame of map he gives + const int FRAME_YBARRA_MAP5 = 4; + var map; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@..Art thou okay?@"; + npc_1st_greet = "@...Hu--humans!@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@Food, I beg of thee!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + else if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == HOUND) + { + //reorganised to make it easier to add barks + var barks = [ + "@Give me food, now!@", + "@Food! Food!@", + "@I must have food!@", + "@I'll die here without food!@", + "@Bastard!@" + ]; + + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + else if (UI_get_schedule_type(item) == TEND_SHOP) + { + //reorganised to make it easier to add barks + var barks = [ + "@Where can I find food?..@", + "@..I'm starving..@", + "@..just a little further maybe..@", + "@..maybe this way?..@", + "@..so hungry..@" + ]; + + var rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + + //Otherwise, say generic NPC barks + else scheduleBarks(item); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("You see a sunken-faced, starving man, dressed in rags.*"); + if (!UI_get_item_flag(item, MET)) + { + item.say("It takes a few moments for the man to notice you.*"); + item.say("@Hu--humans.@"); + item.say("@Please, you must help me.@ he says weakly."); + item.say("@I need food, badly.@"); + UI_set_item_flag(item, MET); + } + else + { + item.say("@Thou art back.@"); + item.say("@Please, please! Give me some food.@"); + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[TALKEDTOHOMERABOUTMAP]) + add("map"); + + //failsafe - if you stole map from him, he won't give it to you again + if ((UI_count_objects(PARTY, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_YBARRA_MAP5) > 0)) + UI_set_item_flag(item, PETRA); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Ybarra. Ybarra's my name.@"); + + case "job"(remove): + say("@Lost here, no job now.@"); + say("@I used to sail under Captain Hawkins on the Empire.@*"); + say("@We had food then.*@"); + say("@But those days are gone....@"); + add(["food", "join"]); + + + + case "food"(remove): + say("@Yes, food! The last thing I ate was my belt. And that was three weeks ago.@*"); + say("@If only you could give me some food...@"); + add(["give food", "belt"]); + + case "map"(remove): //map type is 1144 frame 4 + if (!UI_get_item_flag(item, PETRA)) + { + say("@Map? Map. Map.@*"); + say("@Oh, the map. Yes, I still have that. I couldn't eat it.@*"); + say("@It ought to be worth some food, surely?@"); + if (askYesNo()) + { + if ((UI_count_objects(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_ANY) > 0)) //has food + { + say("He hands you the map piece and rubs his hands, eagerly awaiting his food.*"); + say("You share some food with the pathetic man.*"); + say("@Thunff fou,@ Ybarra says, stuffing the food into his mouth."); + say("After finishing the offered meal, however, Ybarra still seemes starved."); + UI_remove_party_items(1, SHAPE_FOOD, QUALITY_ANY, FRAME_ANY); //removes food + + //get map, set last created and give to avatar from Ybarra's inventory + var map = UI_find_object(YBARRA, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_YBARRA_MAP5); + map->set_last_created(); //set map he is carrying to last created + UI_give_last_created(AVATAR); + + UI_set_item_flag(item, PETRA); //sets flag so can't give another + addKarma(1); + } + else //no food + { + say("Suddenly, you realize that you have no food to give him!*"); + say("@No food?@ he asks. @Then thou art doomed too!@"); + sayGoodbyeAbrupt(item, "..doomed!"); + break; + } + } + else + { + say("@You must! I'll die! Just a little bit of food for the map?@"); + if(askYesNo()) + { + if ((UI_count_objects(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_ANY) > 0)) //has food + { + say("He hands you the map piece and rubs his hands, eagerly awaiting his food.*"); + say("You share some food with the pathetic man.*"); + say("@Thunff fou,@ Ybarra says, stuffing the food into his mouth."); + say("After finishing the offered meal, however, Ybarra still seemes starved."); + UI_remove_party_items(1, SHAPE_FOOD, QUALITY_ANY, FRAME_ANY); //removes food + + //get map, set last created and give to avatar from Ybarra's inventory + var map = UI_find_object(YBARRA, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_YBARRA_MAP5); + map->set_last_created(); //set map he is carrying to last created + UI_give_last_created(AVATAR); + + //UI_add_party_items(1, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_YBARRA_MAP5); //gives map + UI_set_item_flag(item, PETRA); //sets flag so can't give another + addKarma(1); + } + else //no food + { + say("Suddenly, you realize that you have no food to give him!*"); + say("@No food?@ he asks. @Then thou art doomed too!@"); + sayGoodbyeAbrupt(item, "..doomed!"); + break; + } + } + else + { + subtractKarma(10); + UI_clear_item_flag(item, READ); //prevent circular convo + + say("His last shred of hope torn away from him, the withered man leaps at you, screaming @Food! @Food!@"); + + //he attacks you + UI_set_alignment(item, EVIL); + sayGoodbyeAbrupt2(item, "@Food! Food!@"); + UI_set_schedule_type(item, COMBAT); + + break; + } + } + } + else + say("@You already got it from me.@"); //PETRA flag set when given map + + + + + + + + case "belt"(remove): + say("@Not very tasty, but it was filling.@"); + + case "give food"(remove): + if ((UI_count_objects(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_ANY) > 0)) //has food + { + say("You share some food with the pathetic man.*"); + say("@Thunff fou,@ Ybarra says, stuffing the food into his mouth."); + say("After finishing the offered meal, however, Ybarra still seemes starved."); + UI_remove_party_items(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_ANY, 1); //removes food + } + else //no food + { + say("Suddenly, you realize that you have no food to give him!*"); + say("@No food?@ he asks. @Then thou art doomed too!@"); + sayGoodbyeAbrupt(item, "@..doomed!@"); + break; + } + + + + case "join"(remove): + say("@Leave here? No! I've almost gotten the tunnels figured out!@*"); + say("@Just a few more days and I'll be free!@"); + say("@But I must have food!@"); + + case "bye"(remove): + say("@Don't go! I need food... food...@"); + say("@Can I have a little before you go?@"); + if (askYesNo()) + { + if ((UI_count_objects(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_ANY) > 0)) //has food + { + say("You share some food with the pathetic man.*"); + say("@Thunff fou,@ Ybarra says, stuffing the food into his mouth."); + say("After finishing the offered meal, however, Ybarra still seemes starved."); + UI_remove_party_items(PARTY, SHAPE_FOOD, QUALITY_ANY, FRAME_ANY, 1); //removes food + add("bye"); //adds bye again to repeat + } + else //no food + { + say("Suddenly, you realize that you have no food to give him!*"); + say("@No food?@ he asks. @Then thou art doomed too!@"); + sayGoodbyeAbrupt(item, "@..doomed!@"); + break; + } + } + + else + { + say("The man collapses, the last of his energy gone."); + sayGoodbyeAbrupt2(item, "@...@"); + UI_set_schedule_type(item, SLEEP); //puts him to sleep + UI_set_item_flag(item, ASLEEP); //makes him collapse asleep + + break; + } + + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Zoltan.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Zoltan.uc new file mode 100755 index 0000000..841ac38 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/Zoltan.uc @@ -0,0 +1,319 @@ + +void Zoltan object# (0x42c) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var USER_INPUT; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var zoltan_stiffed = UI_get_item_flag(item, PETRA); + var kador_sad = UI_get_item_flag(KADOR, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hail, gypsy!@"; + var npc_1st_greet = "@Huzzah!@"; + + var av_2nd_greet = "@Might we speak again, Zoltan?@"; + var npc_2nd_greet = "@Huzzah!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (gflags[KADOR_SAD]) + { + item.say("@Anyone who would mistreat a dog has no business with Zoltan.@"); + sayGoodbyeAbrupt(item, "Shame!"); + return; + } + + if (zoltan_stiffed) + { + item.say("@Hah! You again! You are no friend to Zoltan.@*"); + item.say("@I dance for you, and how do you repay me?@"); + item.say("@Perhaps a few coins might ease the sting of your insult.@"); + item.say("Do you give him any money?"); + if(askYesNo()) + { + var USER_INPUT = (UI_input_numeric_value(0, 20, 1, 1)); + if (hasGold(USER_INPUT)) + { + chargeGold(USER_INPUT); + item.say("Zoltan pockets the money. @Thanks.@"); + UI_clear_item_flag(item, PETRA); //all is well. + } + else //don't have the money + { + item.say("@You don't have that much. I should know better than to expect a gorgio to appreciate a fine gypsy dance.@*"); + item.say("Proudly, he turns his back on you."); + sayGoodbye2(item); + return; + } + } //refuse to pay + else + { + item.say("@So be it. Leave me before I place a gypsy curse on you!@"); + sayGoodbyeAbrupt(item, "Flee my wrath!"); + return; + } + + } + + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A lively soul of a gypsy, with a bit of a wild look to him.*"); + item.say("@Huzzah! I am Zoltan, king of the gypsies!@"); + } + else + item.say("@Huzzah! I am still Zoltan, king of the gypsies!@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(ZOLTAN, NAKED)) //"met" Zoltan + add ("Zoltan", "dance"); + + if (UI_get_item_flag(ARTUROS, MET)) //met Arturous + add ("Arturos"); + + if (gflags[ASKED_MARIAH_ABOUT_TABLET]) //asked Mariah about book and silver tablet + add ("silver tablet"); + + if (gflags[ASK_ABOUT_DUCK]); //asked Taynith about duck / Dr Cat + add(["duck"]); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@As I said, I am Zoltan, king of the gypsies!@"); + add(["king", "gypsies"]); + + case "job"(remove): + say("@As I said, I am Zoltan, king of the gypsies!@"); + add(["king", "gypsies"]); + + case "Zoltan"(remove): + say("@Yes, Zoltan, king of the gypsies!@"); + add(["king", "gypsies"]); + + case "king"(remove): + say("@I have no lands nor castles, as most rulers do. Nay, for I am the king of the open road.@"); + add(["castles", "road"]); + + case "Arturos"(remove): + say("@Arturos? Never heard of him.@"); + + case "duck"(remove): + say("@He licks his lips and smiles. A duck? No, haven't seen any around here.@"); + + case "castles"(remove): + say("@You cannot tie a gypsy down to a single place. We are free spirits, and must roam like the wind throughout the land.@"); + add(["free spirit", "wind"]); + + case "road"(remove): + say("@The roads wander everywhere, just like a gypsy!@"); + add(["wander"]); + + case "wind"(remove): + say("@The four winds - they are gypsies too!@"); + + case "wander"(remove): + say("@As a gypsy's body wanders, so does his mind. Just now I am thinking of what you might buy from me today.@"); + add(["buy"]); + + case "free spirit"(remove): + say("@Aye, my spirit is free, but my advice is not.@"); + add(["advice"]); + + case "gypsies"(remove): + say("@Ask my people for advice, or what they have to sell. Gypsies see and hear much, and occasionally happen across items of interest...@"); + add(["advice", "buy"]); + + case "advice"(remove): + say("@Tell you what. Since I'm in a good mood, I'll only charge you two gold coins. Is it a deal?@"); + if(askYesNo()) + { + if (hasGold(2)) + { + chargeGold(2); + say("@I'll tell you this: Powder kegs are useful for persuading uncooperative doors to open.@"); + } + else + say("@Come back when you're not so down on your luck.@"); + } + else + say("@Whatever you say.@"); + + + + case "silver tablet"(remove): + say("@I'd be glad to help you out. But 'tis a hard life, sometimes, being a gypsy.@*"); + say("@You'd be willing to pay ten gold for the information, would you?@"); + if(askYesNo()) + { + if (hasGold(10)) + { + chargeGold(10); + say("@Some gorgio called 'Captain Johne' brought us the silver tablet and paid us to take it to the Lycaeum.@*"); + say("@While we were on the way there, we were ambushed by Captain Hawkins and his crew. The tablet was broken in two during the scuffle. The pirates got away with the bigger half.@*"); + say("@Hawkins took my finest earring as well - I spit on his mother's grave!@*"); + say("@Most likely they went to Buccaneer's Den with their loot. We took the corner of the tablet that they missed to the Lycaeum and sold it to Mariah.@"); + if (!gflags[LEARNED_ABOUT_CAPT_JOHNE]) + gflags[LEARNED_ABOUT_CAPT_JOHNE] = true; + if (!gflags[LEARNED_ABOUT_TABLET]) + gflags[LEARNED_ABOUT_TABLET] = true; + add(["gorgio", "Captain Johne", "Hawkins", "Buccaneer's Den", "Lycaeum", "Mariah"]); + } + else + say("@Come back when you have the money.@"); + } + else + say("@Let me know if you change your mind.@"); + + case "Hawkins"(remove): + say("@He's the lowest scum I ever met.@"); + + case "Buccaneer's Den"(remove): + say("@It's no place for an honest soul like you.@*"); + say("@But if you're determined to go, I hear it's on an island due east of Paws.@"); + add(["Paws"]); + + case "Paws"(remove): + say("@We pass Paws often in our travels. Taynith likes to go drinking there.@"); + add(["Taynith"]); + + case "Lycaeum"(remove): + say("@It's on the same island as Moonglow.@"); + add(["Moonglow"]); + + case "Moonglow"(remove): + say("@It's on the same island as the Lycaeum.@"); + add(["Lycaeum"]); + + case "Mariah"(remove): + say("@She knows how to be generous to poor wandering gypsies. You should follow her example!@"); + + case "Captain Johne"(remove): + say("@Captain Johne? I talked to him when he gave us the silver tablet for Mariah.@*"); + say("@He's madder than a gremlin! Claims as he's been living with the gargoyles.@*"); + say("@He talks as if there's nothing evil about them. He said the tablet had something to do with translating.@"); + add(["Mariah"]); + + case "gorgio"(remove): + say("@Either you're a gorgio or my name's not Zoltan!@"); + add(["Zoltan"]); + + case "Taynith"(remove): + say("@There are no women like gypsy women!@"); + + case "Karina"(remove): + say("@There are no women like gypsy women!@"); + + case "dance"(remove): + say("Karina produces a fiddle from somewhere and begins to play a tune at a very high tempo.*"); + say("Zoltan dances a wild dance for you, leaping and capering about frantically. His chest glistens with sweat as he walks up to you expectantly.*"); + add(["Karina"]); + say("Do you give him any money?"); + if(askYesNo()) + { + USER_INPUT = (UI_input_numeric_value(0, 20, 1, 1)); + if (hasGold(USER_INPUT)) + { + chargeGold(USER_INPUT); + say("Zoltan pockets the money. @Thanks.@"); + } + else + { + say("@You don't have that much. I should know better than to expect a gorgio to appreciate a fine gypsy dance.@*"); + say("Proudly, he turns his back on you."); + UI_set_item_flag(item, PETRA); //Zoltan Pissed. + sayGoodbye2(ZOLTAN); + break; + } + + } + else + { + say("@Hah! I should know better than to expect a gorgio to appreciate a fine gypsy dance.@*"); + say("Proudly, he turns his back on you."); + UI_set_item_flag(item, PETRA); //Zoltan Pissed. + sayGoodbye2(ZOLTAN); + break; + } + + + case "buy": + buyReagents(ZOLTAN); + + case "bye": + + var avatar_goodbye = "@Safe travels, Zoltan!@"; + var npc_goodbye = "@Farewell!@"; + + if (!UI_get_item_flag(item, NAKED)) + { + say("@Farewell! My fellow gypsies and I will dance to your health and good fortune!@"); + UI_set_item_flag(item, NAKED); //"met him" + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + else + { + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } + } + else + scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/gypsy.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/gypsy.uc new file mode 100755 index 0000000..95cb73c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/gypsy.uc @@ -0,0 +1,635 @@ + +void Gypsy object# (0x464) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var avatar_magic = UI_get_npc_prop(AVATAR, MAX_MANA); + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK || event == SCRIPTED) + { + + //start music if not already playing + var current_track = UI_get_music_track(); + + if (current_track != 211) + UI_play_music(211); //character creation + + //Avatar and NPC greeting barks + npc_1st_greet = "@Welcome, O Seeker!@"; + UI_item_say(item, npc_1st_greet); + + av_2nd_greet = "@2nd Avatar bark@"; + npc_2nd_greet = "@2nd NPC bark@"; + + item.say("A lonely stroll along an unfamiliar forest path brings you upon a curious gypsy wagon, its exotic colors dappled in the summer shade."); + item.say("A woman's voice rings out with friendship, beckoning you into across the wagon's threshold and, as it happens, into another life..."); + item.say("@At last thou hast come to fulfill thy destiny@, the gypsy says. She smiles, as if in great relief."); + item.say("@Sit before me now, and I shall pour the light of Virtue into the shadows of thy future.@"); + item.say("On a wooden table eight bottles stand, a rainbow of bubbling liquids."); + item.say("@Behold, the Virtues of the Avatar,@ the woman says. @Let us begin the casting!@"); + + //gypsy character creation + + //removeFromArrayByIndex (var array, var elemindex) + var virtues = ["Honesty", "Compassion", "Valor", "Justice", "Sacrifice", "Honor", "Spirituality", "Humility"]; + var honesty = "Honesty"; + var compassion = "Compassion"; + var valor = "Valor"; + var justice = "Justice"; + var sacrifice = "Sacrifice"; + var spirituality = "Spirituality"; + var humility = "Humility"; + var honor = "Honor"; + + var rand_num; + var rand_virtue_1; + var rand_virtue_2; + var answer_1; + var answer_2; + + var winners = []; // used at the end to calculate stats received. + + + var virtue_question; + var array = []; + var virtue_array = ["Honesty", "Compassion", "Valor", "Justice", "Sacrifice", "Honor", "Spirituality", "Humility"];//current array being used + var virtue_choice; // the virtue you are choosing between. The losing virtue will get removed from the list. + //var virtues = [honesty, compassion, valor, justice, sacrifice, honor, spirituality, humility]; + + var round_1_winners = []; + var round_2_winners = []; + var round_1_winners_size; + var round_2_winners_size; + + + var dialogue; + + + var winner; + var index; + + var array_size; + + + //stats to add to the Avatar depending on virtue chosen. Base stats are 15Str/15Dex/15Int. + var add_str = 0; + var add_dex = 0; + var add_int = 0; + + var round = 1; //round 1 - eliminate 4 virtues. round 2 eliminate 2 virtues, round 3 choose winner + var count = 1; + + //determine seeds of "bracket" by randomizing array. + //First 4 questions will be virtue elements 1 vs 2, 3 vs 4, 5 vs 6, 7 vs 8 + array = randomizeArray(virtue_array); + + + + + //while (round < 4) + //{ + + while (count < 8) + { + UI_error_message("Count is " + count); + //ROUND 1 + if (count == 1) + { + rand_virtue_1 = array[1]; + rand_virtue_2 = array[2]; + } + else if (count == 2) + { + rand_virtue_1 = array[3]; + rand_virtue_2 = array[4]; + } + else if (count == 3) + { + rand_virtue_1 = array[5]; + rand_virtue_2 = array[6]; + } + else if (count == 4) + { + rand_virtue_1 = array[7]; + rand_virtue_2 = array[8]; + } + + //ROUND 2 // Final 4 - winners of first roound. Array is randomized, then Elements 1 vs 2, 3 vs 4 + else if (count == 5) + { + //advance round + round = 2; + array = round_1_winners; + + rand_virtue_1 = array[1]; + rand_virtue_2 = array[2]; + + //Debug - lets see what is in array + for (virtue in array) + { + UI_error_message("Virtue " + virtue + " is remaining in the 1st round winners array."); + } + + } + else if (count == 6) + { + array = round_1_winners; + rand_virtue_1 = array[3]; + rand_virtue_2 = array[4]; + + } + else if (count == 7) + { + round = 3; + array = round_2_winners; + rand_virtue_1 = array[1]; + rand_virtue_2 = array[2]; + + } + + else + { + say("Error, something went wrong..."); + break; + } + + //put virtue question together based on random virtues picked + virtue_question = rand_virtue_1+rand_virtue_2; + UI_error_message("Virtue question is " + virtue_question); + + //get sizes of array + round_1_winners_size = UI_get_array_size([round_1_winners]); + round_2_winners_size = UI_get_array_size([round_2_winners]); + + UI_error_message("round_1_array has " + round_1_winners_size + " elements."); + UI_error_message("round_2_array has " + round_2_winners_size + " elements."); + + /* REMOVED + //Debug - see which virtues are left in the array: + //get size of current array: + array_size = UI_get_array_size([virtues]); + for (virtue in virtues) + { + UI_error_message("Virtue " + virtue + " is remaining in the virtue array after removing " + rand_virtue_1); + } + + */ + + + + + ////////SELECT VIRTUE QUESTION BASED ON VIRTUES PITTED AGAISNT EACH OTHER/////////////// + + if (virtue_question == "CompassionHumility" || virtue_question == "HumilityCompassion") { + dialogue = "@The Captain of the King's Guard asks that one among thee visit a hospital to cheer the children with tales of valiant personal deeds. Dost thou - Show thy Compassion and play the braggart; or Humbly let another go?@"; + answer_1 = "play the braggart"; //Compassion + answer_2 = "let another go"; //Humility + + //make sure virtues aren't mixed up + rand_virtue_1 = "Compassion"; + rand_virtue_2 = "Humility"; + } + + else if (virtue_question == "CompassionJustice" || virtue_question == "JusticeCompassion") { + dialogue = "@After twenty years thou hast found the slayer of thy best friends. The villain proves to be a man who provides the sole support for a young girl. Dost thou - Spare him in Compassion for the child; or Slay him in the name of Justice?@"; + answer_1 = "spare him"; //Compassion + answer_2 = "slay him"; //Justice + + //make sure virtues aren't mixed up + rand_virtue_1 = "Compassion"; + rand_virtue_2 = "Justice"; + } + + + else if (virtue_question == "CompassionHonor" || virtue_question == "HonorCompassion") { + dialogue = "@Thou art sworn to uphold a Lord who doth participate in the forbidden torture of prisoners. Each night their cries of pain reach thee. Dost thou - Show Compassion by reporting the deeds; or Honor thy oath and ignore the deeds?"; + answer_1 = "report the deeds"; //Compassion + answer_2 = "ignore the deeds"; //Honor + + //make sure virtues aren't mixed up + rand_virtue_1 = "Compassion"; + rand_virtue_2 = "Honor"; + } + + else if (virtue_question == "CompassionSacrifice" || virtue_question == "SacrificeCompassion") { + dialogue = "@Thee and thy friends hath been routed and ordered to retreat. In defiance of thy orders, dost thou- Stop in Compassion to aid a wounded comrade; or Sacrifice thyself to slow the pursuing enemy so that others might escape?@"; + answer_1 = "aid comrade"; //Compassion + answer_2 = "slow the enemy"; //Sacrifice + //make sure virtues aren't mixed up + rand_virtue_1 = "Compassion"; + rand_virtue_2 = "Sacrifice"; + } + + + else if (virtue_question == "CompassionSpirituality" || virtue_question == "SpiritualityCompassion") { + dialogue = "@Thou hast been taught to preserve all life as sacred. A man lies fatally stung by a venomous serpent. He prays for a merciful death. Dost thou- Show Compassion and end his pain; or heed thy Spiritual beliefs and turn away?"; + answer_1 = "end his pain"; //Compassion + answer_2 = "turn away"; //Spirituality + //make sure virtues aren't mixed up + rand_virtue_1 = "Compassion"; + rand_virtue_2 = "Spirituality"; + } + + else if (virtue_question == "CompassionValor" || virtue_question == "ValorCompassion") { + dialogue = "@Thou dost manage to disarm thy mortal enemy in a duel. He is at thy mercy. Dost thou- Show Compassion by permitting him to yield, or Slay him, as expected of a Valiant duelist?"; + answer_1 = "let him yield"; //Compassion + answer_2 = "slay him"; //Valor + //make sure virtues aren't mixed up + rand_virtue_1 = "Compassion"; + rand_virtue_2 = "Valor"; + + } + + else if (virtue_question == "HonestyHonor" || virtue_question == "HonorHonesty") { + dialogue = "@Thou art sworn to protect thy Lord at any cost, yet thou knowest he hath committed a crime. Authorities ask thee of the affair. Dost thou - Break thine oath by Honestly speaking; or uphold Honor by silently keeping thine oath?@"; + answer_1 = "break oath"; //Honesty + answer_2 = "keep oath"; //Honor + //make sure virtues aren't mixed up + rand_virtue_1 = "Honesty"; + rand_virtue_2 = "Honor"; + } + + else if (virtue_question == "HonestyHumility" || virtue_question == "HumilityHonesty") { + dialogue = "@Thy Lord doth mistakenly believe he slew a dragon. Thou hast proof that thy lance felled the beast. When asked, dost thou - Honestly claim the kill; or Humbly permit thy Lord his belief?@"; + answer_1 = "claim the kill"; //Honesty + answer_2 = "permit his belief"; //Humility + //make sure virtues aren't mixed up + rand_virtue_1 = "Honesty"; + rand_virtue_2 = "Humility"; + } + + else if (virtue_question == "HonestyJustice" || virtue_question == "JusticeHonesty") { + dialogue = "@A merchant owes thy friend money, now long past due. Thou dost see the same merchant drop a purse of gold. Dost thou- Honestly return the purse intact; or Justly give thy friend a portion of the gold first?"; + answer_1 = "return purse intact"; //Honesty + answer_2 = "give friend his portion"; //Justice + //make sure virtues aren't mixed up + rand_virtue_1 = "Honesty"; + rand_virtue_2 = "Justice"; + } + + else if (virtue_question == "HonestySacrifice" || virtue_question == "SacrificeHonesty") { + dialogue = "@Thee and thy friend are valiant but penniless warriors. Thou both set forth to slay a mighty dragon. Thy friend dost think he slew it, but the killing blow was thine. Dost thou - Honestly claim the reward; or Sacrifice the gold for the sake of thy friendship?"; + answer_1 = "claim reward"; //Honesty + answer_2 = "sacrifice gold"; //Sacrifice + //make sure virtues aren't mixed up + rand_virtue_1 = "Honesty"; + rand_virtue_2 = "Sacrifice"; + } + + else if (virtue_question == "HonestySpirituality" || virtue_question == "SpiritualityHonesty") { + dialogue = "@Thy friend doth seek admittance to thy spiritual order. Thou art asked to vouch for his purity of spirit, of which thou art uncertain. Dost thou- Honestly express thy doubt; or Vouch for him, hoping for his Spiritual improvement?@"; + answer_1 = "express doubt"; //Honesty + answer_2 = "vouch for him"; //Spirituality + //make sure virtues aren't mixed up + rand_virtue_1 = "Honesty"; + rand_virtue_2 = "Spirituality"; + } + + else if (virtue_question == "HonestyValor" || virtue_question == "ValorHonesty") { + dialogue = "@Thou has been prohibited by thy absent Lord from joining thy friends in a close-pitched battle. Dost thou - refrain, so thou may Honestly claim obedience; or show Valor and aid thy comrades, knowing thou may deny it later?@"; + answer_1 = "claim obedience"; //Honesty + answer_2 = "aid comrades"; //Valor + //make sure virtues aren't mixed up + rand_virtue_1 = "Honesty"; + rand_virtue_2 = "Valor"; + } + + else if (virtue_question == "HonorHumility" || virtue_question == "HumilityHonor") { + dialogue = "@Though thou art but a peasant shepherd, thou art discovered to be the sole descendant of a noble family long thought extinct. Dost thou- Honorably take up the arms of thy ancestors; or Humbly resume thy life of simplicity and peace?@"; + answer_1 = "take up ancestor's arms"; //Honor + answer_2 = "resume simple life"; //Humility + //make sure virtues aren't mixed up + rand_virtue_1 = "Honor"; + rand_virtue_2 = "Humility"; + } + + else if (virtue_question == "JusticeHonor" || virtue_question == "HonorJustice") { + dialogue = "@Thou hast sworn to do thy Lord's bidding in all. He covets a piece of land and orders its owner removed. Dost thou - Serve Justice, refusing to act, thus being disgraced; or Honor thine oath and evict the landowner?@"; + answer_1 = "refuse to act"; + answer_2 = "evict the landowner"; + //make sure virtues aren't mixed up + rand_virtue_1 = "Justice"; + rand_virtue_2 = "Honor"; + } + + else if (virtue_question == "JusticeHumility" || virtue_question == "HumilityJustice") { + dialogue = "@Unwitnessed, thou hast slain a mighty dragon in defense of thy life. A poor warrior claims the offered reward. Dost thou- Justly step forward to claim the bounty; or Humbly go about thy life, secure in thy self-esteem?@"; + answer_1 = "claim the bounty"; //Justice + answer_2 = "go about thy life"; //Humility + rand_virtue_1 = "Justice"; + rand_virtue_2 = "Humility"; + } + + else if (virtue_question == "JusticeSacrifice" || virtue_question == "SacrificeJustice") { + dialogue = "@During a pitched battle, thou dost see a fellow desert his post, endangering many. As he flees, he is set upon by several enemies. Dost thou - Justly let him fight alone; or Risk the Sacrifice of thine own life to aid him?@"; + answer_1 = "let him fight alone"; //Justice + answer_2 = "risk life to aid him"; //Sacrifice + rand_virtue_1 = "Justice"; + rand_virtue_2 = "Sacrifice"; + } + + else if (virtue_question == "JusticeSpirituality" || virtue_question == "SpiritualityJustice") { + dialogue = "@Thou dost believe that virtue resides in all people. Thou dost see a rogue steal from thy Lord. Dost thou - Call him to Justice; or Personally try to sway him back to the Spiritual path of good?@"; + answer_1 = "turn him in"; + answer_2 = "sway him back to good"; + rand_virtue_1 = "Justice"; + rand_virtue_2 = "Spirituality"; + } + + else if (virtue_question == "SacrificeHonor" || virtue_question == "HonorSacrifice") { + dialogue = "@Thou art a bounty hunter sworn to return an alleged murderer. After his capture, thou dost come to believe him innocent. Dost thou - Sacrifice thy sizeable bounty for thy belief; or Honor thine oath to return him as promised?@"; + answer_1 = "give up bounty"; //sacrifice + answer_2 = "return him as promised"; //Honor + rand_virtue_1 = "Sacrifice"; + rand_virtue_2 = "Honor"; + } + + else if (virtue_question == "SacrificeHumility" || virtue_question == "HumilitySacrifice") { + dialogue = "@Thou art an elderly, wealthy merchant. Thy end is near. Dost thou - Sacrifice all thy wealth to feed hundreds of starving children, receiving public adulation; or Humbly live out thy life, willing thy fortune to thy heirs?@"; + answer_1 = "feed starving children"; //sacrifice + answer_2 = "will fortune to heirs"; //Humility + rand_virtue_1 = "Sacrifice"; + rand_virtue_2 = "Humility"; + } + + else if (virtue_question == "SacrificeSpirituality" || virtue_question == "SpiritualitySacrifice") { + dialogue = "@Thou hast spent thy life in charitable and righteous work. Thine uncle the innkeeper lies ill and asks thee to take over his tavern. Dost thou - Sacrifice thy life of purity to aid thy kin, or Decline and follow the call of Spirituality?@"; + answer_1 = "aid thy kin"; + answer_2 = "follow thy calling"; + rand_virtue_1 = "Sacrifice"; + rand_virtue_2 = "Spirituality"; + } + + else if (virtue_question == "ValorHonor" || virtue_question == "HonorValor") { + dialogue = "@During battle thou art ordered to guard thy commander's empty tent. The battle goes poorly and thou dost yearn to aid thy fellows. Dost thou - Valiantly enter the battle, or Honor thy post as guard?@"; + answer_1 = "enter the battle"; //Valor + answer_2 = "stand guard"; //Honor + rand_virtue_1 = "Valor"; + rand_virtue_2 = "Honor"; + } + + else if (virtue_question == "ValorHumility" || virtue_question == "HumilityValor") { + dialogue = "@Although a simple fisherman, thou art also a skillful swordsman. Thy Lord dost seek to assemble a peacetime guard. Dost thou - Answer the call, so that all may witness thy Valor, or Humbly decline the offer to join thy Lord's largely ceremonial knighthood?@"; + answer_1 = "answer the call"; //Valor + answer_2 = "decline the offer"; //Humility + rand_virtue_1 = "Valor"; + rand_virtue_2 = "Humility"; + } + + else if (virtue_question == "ValorJustice" || virtue_question == "JusticeValor") { + dialogue = "@Thou hast been sent to secure a needed treaty with a distant Lord. Thy host is agreeable to thy proposal but insults thy country at dinner. Dost thou Valiantly bear the slurs or Justly rise and demand an apology@"; + answer_1 = "bear the slurs"; //Valor + answer_2 = "demand an apology"; //Justice + rand_virtue_1 = "Valor"; + rand_virtue_2 = "Justice"; + } + + else if (virtue_question == "ValorSacrifice" || virtue_question == "SacrificeValor") { + dialogue = "@A burly knight accosts thee and demands thy food. Dost thou Valiantly refuse and engage the knight, or Sacrifice thy rations unto the hungry knight?@"; + answer_1 = "engage the knight"; //Valor + answer_2 = "give thy rations"; //Sacrifice + rand_virtue_1 = "Valor"; + rand_virtue_2 = "Sacrifice"; + } + + else if (virtue_question == "SpiritualityHumility" || virtue_question == "HumilitySpirituality") { + dialogue = "@Thy parents wish thee to become an apprentice. Two positions are available. Dost thou - Become an acolyte in a worthy Spirtual order; or Become an assistant to a humble village cobbler?@"; + answer_1 = "become assistant"; //Humility + answer_2 = "become acolyte"; //Spirituality + rand_virtue_1 = "Spirituality"; + rand_virtue_2 = "Humility"; + } + + else if (virtue_question == "ValorSpirituality" || virtue_question == "SpiritualityValor") { + dialogue = "@A local bully pushes for a fight. Dost thou- Valiantly trounce the rogue, or Decline, knowing in thy Spirit that no lasting good will come of it?@"; + answer_1 = "trounce the rogue"; //Valor + answer_2 = "decline the fight"; //Spirituality + rand_virtue_1 = "Valor"; + rand_virtue_2 = "Spirituality"; + } + + else if (virtue_question == "SpiritualityHonor" || virtue_question == "HonorSpirituality") { + dialogue = "@In thy youth thou didst pledge to marry thy sweetheart. Now thou art on a sacred quest in distant lands. Thy sweetheart doth ask thee to keep thy vow. Dost thou - Honor thy pledge to wed; or Follow thy Spiritual crusade?@"; + answer_1 = "keep thy vow"; //Honor + answer_2 = "follow Spiritual crusade"; //Spirituality + rand_virtue_1 = "Honor"; + rand_virtue_2 = "Spirituality"; + } + + else if (virtue_question == "CompassionHonesty" || virtue_question == "HonestyCompassion") { + dialogue = "@Entrusted to deliver an uncounted purse of gold, thou dost meet a poor beggar. Dost thou- deliver the gold Honestly, knowing the trust in thee was well-placed; or show Compassion and give the beggar a coin, knowing it won't be missed?@"; + answer_1 = "deliver the gold"; //Honesty + answer_2 = "give beggar a coin"; //Compassion + rand_virtue_1 = "Compassion"; + rand_virtue_2 = "Honesty"; + } + + + + else { + say("ERROR - this isn't supposed to happen..."); + UI_error_message("ERROR - Virtues undefined! Virtues chosen are: " + virtue_question); + break; + + } + //GYPSY ASKS QUESTION + if (gflags[DEBUG]) + say("Round is " + round); + say(dialogue); + virtue_choice = chooseFromMenu([answer_1, answer_2]); + + UI_error_message("Virtue choice is: " + virtue_choice); + if (virtue_choice == answer_1) + { + UI_error_message("Virtue chosen is " + rand_virtue_1 + ", adding to round " + round + " winners array"); + if (round == 1) + round_1_winners << rand_virtue_1; + else if (round == 2) + round_2_winners << rand_virtue_1; + else if (round == 3) + winner = rand_virtue_1; + + //regardless of round, add virtue to winner array for stat calculation at the end: + winners << rand_virtue_1; + } + else + { + UI_error_message("Virtue chosen is " + rand_virtue_2+ ", adding to round " + round + " winners array"); + if (round == 1) + round_1_winners << rand_virtue_2; + else if (round == 2) + round_2_winners << rand_virtue_2; + else if (round == 3) + winner = rand_virtue_2; + + //regardless of round, add virtue to winner array for stat calculation at the end: + winners << rand_virtue_2; + + } + + if (winner) + { + if (gflags[DEBUG]) + say("DEBUG - winning virtue is " + winner); + + //give player stats based on virtues selected. combine all winning virtues: + + for (virtue in winners) + { + UI_error_message("virtue in winners array is " + virtue); + if (virtue == "Honesty") + add_int += 2; + else if (virtue == "Compassion") + add_dex += 2; + else if (virtue == "Valor") + add_str += 2; + else if (virtue == "Justice") + { + add_dex += 1; + add_int += 1; + } + else if (virtue == "Sacrifice") + { + add_str += 1; + add_dex += 1; + } + else if (virtue == "Honor") + { + add_str += 1; + add_int += 1; + } + else if (virtue == "Spirituality") + { + add_str += 1; + add_dex += 1; + add_int += 1; + } + else if (virtue == "Humility") //no stats on Humility but adds karma per choice + addKarma(3); + + UI_error_message("Adding " + add_str + " Str, " + add_dex + " Dex, " + add_int + " int to Avatar's skills"); + } + + //apply stats to the Avatar + UI_set_npc_prop(AVATAR, STRENGTH, add_str); + UI_set_npc_prop(AVATAR, DEXTERITY, add_dex); + UI_set_npc_prop(AVATAR, INTELLIGENCE, add_int); + + //determine how much magic Avatar has. Adding it based on "rubber band" formula used in U7 for combat and magic: + //(NPC's Int - NPC's magic) / 2. + + var avatar_int = UI_get_npc_prop(AVATAR, INTELLIGENCE); + UI_error_message("Avatar int is now " + avatar_int); + var mana_bonus = (avatar_int - avatar_magic + 1) / 2; + + UI_error_message("Magic points added to Avatar " + mana_bonus); + + //determine how much Combat Avatar has. Adding it based on "rubber band" formula used in U7 for combat and magic: + //(NPC's Dex - NPC's combat) + 1 / 2. + + //get Dex and combat skill, then calculate + var avatar_combat = UI_get_npc_prop(AVATAR, COMBAT); + var avatar_dex = UI_get_npc_prop(AVATAR, DEXTERITY); + var combat_bonus = (avatar_dex - avatar_combat + 1) / 2; + + UI_error_message("Combat points added to Avatar is " + avatar_combat); + UI_error_message("Magic points added to Avatar " + mana_bonus); + + //add combat bonus: + UI_set_npc_prop(AVATAR, COMBAT, combat_bonus); + + //set max mana + UI_set_npc_prop(AVATAR, MAX_MANA, mana_bonus); + UI_set_npc_prop(AVATAR, MANA, mana_bonus); //should make it full + + //set max hp + UI_set_npc_prop(AVATAR, HEALTH, add_str); + + item.say("@The path of the Avatar lies beneath thy feet, worth " + player_name + "@, the gypsy intones. With a mysterious smile, she passes you the flask of shimmering liquids."); + item.say("@Drink of these waters and go forth among our people, who shall receive thee in joy!@"); + item.say("As you drink from the flask, vertigo overwhelms you. A soothing mist obscures the gypsy's face, and you sink without fear into an untroubled sleep."); + item.say("You awake in a different time, upon another world's shore. Though the Avatar's quests brings you both triumph and tragedy, never do you stray from the path of the Eight Virtues."); + + //move Avatar to his house + AVATAR->move_object([0891, 0153,0]); + //make him sit + UI_set_item_frame(AVATAR, 10); + + //set current game hour to 5p + var hours_to_skip = (10); + var advance = (hours_to_skip * 1500); + + UI_advance_time(advance); + + return; + } + + + + + + count = count + 1; + + }//end while loop + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/thug.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/thug.uc new file mode 100755 index 0000000..2b9c29d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Misc/thug.uc @@ -0,0 +1,56 @@ +void graverobber object# (0x4fe) () //changed temporiarily from 4fe +{ + var player_name; //" + player_name + " + var polite_title; //" + polite_title + " + var player_is_female; + var schedule; + var hour; + var party; + var rand; + + + if (event == DOUBLECLICK) + { + + AVATAR->GenericUnfreeze(); + + + item.say("Approaching from seemingly out of nowhere, an unsavoury-looking guard stands before you. You then realize you are surrounded by his henchmen."); + item.say("@We been waitin' to break into that vault for a while now. As luck would have it, thou foundest the key and the prizes within.@"); + item.say("He notices you clutching the Rune of Honesty."); + item.say("@Say.. that be quite a trinket thou'rt carrying. T'would fetch us fair price on the antiquities market. Much too expensive for the likes of ye...@"); + if (inParty(SHAMINO)) + { + SHAMINO.say("Noticing the rogue guard's henchmen slowly closing in, Shamino leans towards you and whispers. @Careful " + polite_title + ", these graverobbers have us surrounded...@"); + SHAMINO.say("Shamino clutches his weapon, never once keeping his eyes off the graverobbers."); + SHAMINO.hide(); + } + item.say("@Well " + polite_title + ", it is thy lucky day. Hand over that artifact and we won't kill ye.@"); + if (inParty(DUPRE)) + { + DUPRE.say("@Knave, the Avatar will not give in to such a request from a petty criminal such as thyself!@"); + DUPRE.hide(); + item.say("@Very well. Prepare to join these unfortunate souls in the abyss...@"); + + UI_set_schedule_type(item, IN_COMBAT); + UI_set_schedule_type(THUG2, IN_COMBAT); + UI_set_schedule_type(THUG3, IN_COMBAT); + UI_set_schedule_type(THUG4, IN_COMBAT); + UI_set_schedule_type(THUG5, IN_COMBAT); + UI_set_schedule_type(THUG6, IN_COMBAT); + return; + } + AVATAR.say("You put the rune into your pack and draw your weapon, declining the rogue's request."); + item.say("@Very well. Prepare to join these unfortunate souls in the abyss...@"); + + UI_set_schedule_type(item, IN_COMBAT); + UI_set_schedule_type(THUG2, IN_COMBAT); + UI_set_schedule_type(THUG3, IN_COMBAT); + UI_set_schedule_type(THUG4, IN_COMBAT); + UI_set_schedule_type(THUG5, IN_COMBAT); + UI_set_schedule_type(THUG6, IN_COMBAT); + return; + + + } +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Aganar.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Aganar.uc new file mode 100755 index 0000000..56d3f53 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Aganar.uc @@ -0,0 +1,189 @@ + +void Aganar object# (0x49c) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hail, milord.@"; + npc_1st_greet = "@Could it be..?@"; + + av_2nd_greet = "@Hello, milord.@"; + npc_2nd_greet = "@Ah, hello again Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A gentleman with an air of leadership about him."); + item.say("@Thou art the Avatar! I saw thy portrait in Lord British's castle. If there be any assistance I can offer, thou needst but ask it.@"); + } + else + item.say("@Good " + time_of_day + ", Avatar. Is there ought else I can aid thee with?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Lord Aganar of Moonglow.@"); + add(["Moonglow"]); + + case "job"(remove): + say("@I keep things running smoothly here. 'Tis not difficult in a town of such honesty.@"); + add(["honesty"]); + + case "Moonglow"(remove): + say("@Verily, 'tis a fine town. Hast thou ever thought of moving here?@"); + if (askYesNo()) + { + say("@Thou wouldst not regret it. There's good fishing off our shores, and plenty of merriment to be found over at the Blue Bottle.@"); + say("@It just so happens, there is a house for sale, on the north side of town. The previous owner...well, he had an unfortunate incident.@"); + say("@We can have the house ready for thee, if thou wishest. 300 gold pieces and it's yours. What say you?@"); + if (askYesNo()) + { + if (hasGold(300)) + { + chargeGold(300); + if (UI_add_party_items(1, SHAPE_KEY, QUALITY_MOONGLOWHOUSE, FRAME_MOONGLOWHOUSE, true)) + { + say("Aganar gives you the key. @I'll send someone to clean it up for thee. Enjoy thy new house in our fine city!@"); + sayGoodbyeAbrupt(item, "...can't believe I sold it..."); + return; + } + else + say("@Come back when thou hast the room in thy pack.@"); + } + else + say("@Thou art short in thy funds. Come back when thou hast enough to purchase it.@"); + } + else + say("@Oh well, let me know if thou dost change your mind.@"); + } + else + say("@Thou wouldst not regret it. There's good fishing off our shores, and plenty of merriment to be found over at the Blue Bottle.@"); + add(["fishing", "Blue Bottle"]); + + + case "fishing"(remove): + say("@Aye, indeed.@"); + + case "Blue Bottle"(remove): + say("@Thou wilt see much drinking at the Blue Bottle Tavern, and singing, and revelry, and telling of tales. But mostly drinking.@"); + add(["drinking"]); + + case "drinking"(remove): + say("@If thou art curious, why not go pay a visit? Thou cannot miss it - 'tis the biggest building in town.@"); + + case "honesty"(remove): + say("@Honesty is the virtue we prize most highly here in Moonglow. We are closest to the Shrine of Honesty, and indeed, the Rune of Honesty was entrusted into my care some years ago.@"); + add(["shrine", "rune"]); + + case "shrine"(remove): + say("@Tis north of here, on Dagger Isle.@"); + add(["Dagger Isle"]); + + case "Dagger Isle"(remove): + say("@Aye, just a ways to the north.@"); + + case "rune"(remove): + say("@I had it once, but I entrusted it to Beyvin's care, as he is the most honest man I know. He lives with Penumbra.@"); + if (!gflags[ASK_ABOUT_BEYVIN]) + gflags[ASK_ABOUT_BEYVIN] = true; + add(["Beyvin", "Penumbra"]); + + case "mantra"(remove): + say("@Penumbra might be able to help you with that.@"); + + case "Beyvin"(remove): + say("@Haven't seen him around lately. Penumbra should be able to tell you where to find him.@"); + + case "Penumbra"(remove): + say("@I can't imagine what Beyvin sees in her!@"); + + case "bye": + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@Until next we meet, then.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Dargoth.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Dargoth.uc new file mode 100755 index 0000000..f8a90a7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Dargoth.uc @@ -0,0 +1,112 @@ + +void Dargoth object# (0x49b) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me, milord..@"; + npc_1st_greet = "@Ahem, yes?@"; + + av_2nd_greet = "@Might I interrupt thee again?@"; + npc_2nd_greet = "@I suppose..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A stern, severe man in white robes.*"); + item.say("You interrupt the man from his research.*"); + item.say("@Yes, yes, what is it?@"); + item.say("@You've come for healing, I suppose.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Dargoth, master of medical lore.@"); + + case "job"(remove): + say("@My true calling is research. My studies here have advanced the healing art throughout the world! But, more often than not, I am called upon to cure poison ivy and heal paper cuts!@*"); + say("@I grow weary of such trifles!@"); + add(["healing"]); + + case "healing": + chantuHeal(10, 30, 400); + + + case "bye": + say("@Stay out of trouble! I don't want to see my fine workmanship wasted!@"); + + avatar_goodbye = "@That is all..@"; + npc_goodbye = "@Back to my research, then..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Derydlus.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Derydlus.uc new file mode 100755 index 0000000..8fbf6e8 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Derydlus.uc @@ -0,0 +1,151 @@ + +void Derydlus object# (0x49a) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, merry fellow!@"; + npc_1st_greet = "@I'll drink to that!@"; + + av_2nd_greet = "@Hello again!@"; + npc_2nd_greet = "@Come, have a drink!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A man who looks very amused--whether with his surroundings or himself is hard to say."); + item.say("@Ah, welcome, " + polite_title + "! Come have a drink with me!@*"); + item.say("@Have you had your fortune told yet?@"); + if (askYesNo()) + item.say("@Some people think Penumbra's a hoax. But she knows her stuff. You should bear with her - she can truly be of great assistance to you.@"); + else + item.say("@Some people think Penumbra's a hoax. But she knows her stuff. You should bear with her - she can truly be of great assistance to you.@"); + + } + else + item.say("@Ah, welcome, " + polite_title + "! Come have a drink with me!@"); + + //standard conversation options + var options = ["name", "job", "bye", "Penumbra"]; + + if (UI_get_item_flag(MANREL, MET)) + add(["Manrel"]); + + + if (UI_get_item_flag(MANDRAKE, MET)) + add(["Mandrake"]); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Derydlus. And what was yours again?@"); + var avatar_or_name = chooseFromMenu(["The Avatar", ("I am " + player_name)]); + if (avatar_or_name == "The Avatar") + say("@The Avatar?...Oh, yes, of course. Come, have a seat.@"); + else + say("@" + player_name + "...Oh, yes, of course. Come, have a seat.@"); + + case "job": + say("@Trying to discover all the subtleties of Frasier's Folly is almost a career in itself!@"); + say("He smiles."); + add(["Frasier's Folly"]); + + case "drink"(remove): + say("@Aye, this is the home of Frasier's Folly!@"); + add(["Frasier's Folly"]); + + case "Frasier's Folly"(remove): + say("@In all the towns of Britannia, you'll find no better brew.@"); + + case "Mandrake"(remove): + say("@Here's to Mandrake!@"); + + case "Manrel"(remove): + say("@My drinking buddy! Let's drink a toast to him, wherever he is.@"); + if (isNearby(MANREL)) + { + MANREL.say("@I'll drink to that!@"); // Manrel says + MANREL.hide(); + } + + case "Penumbra"(remove): + say("@She's a strange one, but she has the gift.@"); + + case "bye"(remove): + say("@Leaving already?"); + + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@And you're not even wobbling yet...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Ephemerides.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Ephemerides.uc new file mode 100755 index 0000000..71741b7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Ephemerides.uc @@ -0,0 +1,280 @@ + +void Ephemerides object# (0x497) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Shopkeeper options + const int FRAME_GOLD_SEXTANT = 1; + var item_options =["nothing", "crystal ball", "sextant"]; + var item_shapes = [SHAPE_CRYSTAL_BALL, SHAPE_SEXTANT]; + var item_frames = [0, FRAME_GOLD_SEXTANT]; + var item_prices = [50, 30]; + + var initial_choice_question = "@Which of these?@"; + var askIfInterested1 = "@It will cost you "; //split into two to capture price + var askIfInterested2 = " gold coins, okay?@"; + var ask_quantity = "@How many?@"; + var cant_afford = "Ephemerides looks at you. @That costs more gold than you have.@"; + var cant_hold = "@You don't have enough room to carry it.@"; + var saidNo = "@That was a good price.@"; + var success = "He hands you the "; + var success2 = "@I hope it serves you well.@"; + var nothing = "@As you wish..@"; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me..@"; + av_2nd_greet = "@Might we speak again?@"; + + if (UI_get_schedule_type(item) == STANDTHERE) + { + npc_2nd_greet = "@Shh!@"; + npc_1st_greet = "@Shh!@"; + } + else + { + npc_1st_greet = "@Ahem, yes?@"; + npc_2nd_greet = "@Ah, you've returned.@"; + + + } + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (UI_get_schedule_type(item) == STANDTHERE) //if at telescope + { + item.say("@The old man never turns away from his telescope.*"); + item.say("@Shhh! Can't you see I'm busy?! Whoever you are, come back in the morning.@"); + item.say("The old man adjusts the telescope, exclaims @Aha!@ and starts scribbling on a scroll."); + sayGoodbyeAbrupt(item, "Aha!"); + return; + } + else + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("A solemn man, constantly dusting and polishing the items in his shop."); + item.say("@Ahem. Yes, what can I help you with, " + polite_title + "?@"); + + } + else + item.say("@Ahem. Yes, what can I help you with, " + polite_title + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(item, PETRA)) + add("glass sword"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Ephemerides.@"); + + case "job"(remove): + say("@I am an astronomer. More precisely, I calculate movements of the stars, phases of the moons...@"); + say("@My field of specialization is tidal predictions. I also make various glasswares and instruments.@"); + add(["moons", "instruments", "glassware", "tidal predictions"]); + + case "instruments"(remove): + say("@Yes, sextants mostly.@"); + add(["buy"]); + + case "glassware"(remove): + say("@Lenses and the like.@"); + if (gflags[START_CODEX_QUEST]) //have asked Naxitalor about which type of lens to make + add("lens"); + add("buy"); + + case "tidal predictions"(remove): + say("@Lord British has requested the publication of an almanac for use by the general populace. It will contain high tides, low tides, ebb tides, flood tides, spring tides, and neap tides.@"); + add(["tides", "neap tides", "spring tides"]); + + case "tides"(remove): + say("@Britannia's tides are a function of the two moons, Felucca and Trammel, interacting with our world, Sosaria.@"); + + case "moons"(remove): + say("@I plan to publish a paper about how the world is flat, to dispel all this foolish talk to the contrary. Afterwards, I will construct a model of how it all works: an orrery.@"); + add(["orrery", "round"]); + + case "orrery"(remove): + say("Pleased with your interest, Ephemerides shows you papers with plans for a clockwork model of the Sosarian system."); + say("@This, ahem, flat piece is Britannia. Each moon would exert a pull on the oceans thus, resulting in the tides. You turn that little handle there to get it to go!@"); + say("The normally staid Ephemerides is practically giggling with glee."); + + case "round"(remove): + say("@Absurd!@"); + + case "neap tides"(remove): + say("@Low and high tide marks are close together. The planets are in quadrature.@"); + add(["quadrature"]); + + case "quadrature"(remove): + say("@Angular separation of two celestial bodies -as measured from a third- being ninety degrees, of course. A very safe tide.@"); + add(["tides"]); + + case "spring tides"(remove): + say("@The opposite of a neap tide- the sun, earth and moons are all aligned. Thus, lines of low and high tide are far apart. Once I construct my orrery, I'd be able to demonstrate the principles involved.@"); + add(["orrery"]); + + case "lens"(remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) //hasn't made lense yet + { + if (!UI_get_item_flag(item, NAKED)) //hasn't asked to make lense yet + { + say("@What sort of lens do you want?@"); + if (UI_count_objects(PARTY, SHAPE_LENS, QUALITY_ANY, FRAME_GARGISH_LENS) >= 1) //look for gargish lens + { + say("@Ooooh, let me see it... That's a very interesting lens. You need a concave copy of it? Let me think...@*"); + say("@It would be very tricky to duplicate, being magical in nature, but I believe I might be able to do it.@*"); + say("@The material and the nature of the enchantment appear similar to those involved in the making of glass swords. If I could keep this to analyze while you go get me a glass sword, I'll try and make a copy for you.@*"); + say("Before you can protest, he pockets the lens."); + + //can now ask Dale in Minoc about glass swords + if (!UI_get_item_flag(DALE, SI_ZOMBIE)) + UI_set_item_flag(DALE, SI_ZOMBIE); + + say("@Let me know when you have the glass sword.@"); + UI_remove_party_items(1, SHAPE_LENS, QUALITY_ANY, FRAME_GARGISH_LENS); + UI_set_item_flag(item, NAKED); //asked to make lens + UI_set_item_flag(item, PETRA); //need glass sword + add(["glass sword"]); + } + } + else + say("@When you bring me a glass sword, I should be able to duplicate your lens for you.@"); + add(["glass sword"]); + + } + else + say("@I hope the lens I made you will prove suitable.@"); + + case "glass sword"(remove): + if (!UI_count_objects(PARTY, SHAPE_GLASS_SWORD, QUALITY_ANY, FRAME_ANY) >= 1) + { + say("@I once heard of a master glassblower who could make glass swords...@"); + add(["master glassblower"]); + } + else //has glass sword + { + say("@Ah, you've brought me a glass sword! Let me just get your lens...@*"); + say("He fumbles through his pockets. @Oh no! I seem to have lost the lens!@*"); + say("@Just kidding... Here it is. Now I'll melt down the glass sword and try to cast a lens for you.@"); + say("You watch as he works, intently focused on his task. Finally he pronounces the job a success.*"); + say("@Here's your lens back, and the duplicate. There's no charge - the challenge of the task was reward enough. I don't know what you need these lenses for, but I wish you luck!@"); + UI_set_item_flag(item, SI_ZOMBIE); //made lense + UI_add_party_items(1, SHAPE_LENS, QUALITY_ANY, FRAME_GARGISH_LENS); + UI_add_party_items(1, SHAPE_LENS, QUALITY_ANY, FRAME_HUMAN_LENS); + + //soy ou can't ask about glass sword + UI_clear_item_flag(item, PETRA); + } + + + + case "master glassblower"(remove): + say("@Minoc is the logical place to look. That town is filled with master craftsmen. Why, I once heard of a man from Minoc who built a flying machine!@"); + if (!gflags[LEARNED_ABOUT_FLYING]) + gflags[LEARNED_ABOUT_FLYING] = true; //set for asking people in minoc about balloon + add(["flying machine"]); + + case "flying machine"(remove): + say("@Must have been a fairy tale, of course.@"); + + + case "buy": + + if (shop_is_open) + buyItems(item, item_options, item_prices, item_shapes, item_frames, dialog); + else + say("@Come to my shop when its open!@"); + + + case "bye": + + avatar_goodbye = "@Thanks..@"; + npc_goodbye = "@It was nice talking with you.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Manrel.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Manrel.uc new file mode 100755 index 0000000..4aefe86 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Manrel.uc @@ -0,0 +1,172 @@ + +void Manrel object# (0x49d) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me..@"; + npc_1st_greet = "@Ah, hello there.@"; + + av_2nd_greet = "@Hi again..@"; + npc_2nd_greet = "@@Yes, " + polite_title + "?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A pipe-smoking gentleman with the symbol of the Codex tattooed on his forehead.*"); + item.say("@Greetings to you, " + polite_title + ".@*"); + + //standard conversation options + var options = ["name", "job", "bye", "tattoo"]; + + if (gflags[ASK_ABOUT_BEYVIN]) //asked Penumbra or Aganar about Beyvin + add ("Beyvin"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Manrel.@"); + + case "job"(remove): + say("@I'm a woodworker. I also dabble in alchemy from time to time.@"); + add(["woodworker", "alchemy"]); + + case "woodworker"(remove): + say("@I make furniture, cabinets, walking sticks, and the like. Perhaps I can make something for you someday.@"); + + case "alchemy"(remove): + say("@I'm trying to learn how to make healing potions, but I don't have the formula right yet. I did stumble across a wicked recipe for red mead, though.@"); + add(["red mead"]); + + case "red mead"(remove): + say("@Alas, there's little call for my brew in this town, with the Blue Bottle serving Frasier's Folly.@"); + add(["Frasier's Folly", "Blue Bottle"]); + + case "Blue Bottle"(remove): + say("@A fine establishment.@"); + + case "Frasier's Folly"(remove): + say("@One of the finest libations you'll find anywhere.@"); + add(["libations"]); + + case "libations"(remove): + say("@Libation or liability - take your pick.@"); + + case "tattoo"(remove): + say("@I went drinking with some friends the night we heard of the discovery of the Codex. When I woke up the next morning, I had this tattoo.@"); + + case "Beyvin"(remove): + if (!UI_get_item_flag(item, NAKED)) //hasn't given key yet + { + say("@Oh, have you been to visit my cousin's grave?@"); + if (askYesNo()) + { + say("He looks at you suspiciously. @You wouldn't be wanting the key to his crypt, would you?@"); + if (askYesNo()) + { + if ((UI_add_party_items(1, SHAPE_KEY, QUALITY_BEYVIN_CRYPT, 9, true) && (UI_add_party_items(1, SHAPE_PLANT, 1, FRAME_DAFFODIL, true)))) + { + say("@Well, perhaps you have your reasons... Okay, you can have the key. But you have to take these flowers and leave them there.@"); + UI_set_item_flag(item, NAKED); //gave key and flowers + add(["flowers"]); + } + else + say("@You're carrying too much right now. Come back for it later.@"); + } + else + say("@Well, alright then.@"); + } + else + say("@My mistake.@"); + } + else + { + say("@I hope you got a chance to deliver the flowers.@"); + add(["flowers"]); + } + + case "flowers"(remove): + say("@Daffodils were always his favorites... It's too bad I couldn't find any.@"); + add(["daffodils"]); + + case "daffodils"(remove): + say("@Yes, daffodils.@"); + + case "bye"(remove): + if (player_is_female) + say("@Take care, my dear. I hope I'll see you again soon.@"); + else + say("@It was a pleasure speaking with you.@"); + + avatar_goodbye = "@Goodbye, Manrel.@"; + npc_goodbye = "@Take care.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Mariah.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Mariah.uc new file mode 100755 index 0000000..e72b71d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Mariah.uc @@ -0,0 +1,217 @@ +void Mariah object# (0x499) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, old friend.@"; + npc_1st_greet = "@Avatar, thou hast returned!@"; + + av_2nd_greet = "@Hello again, Mariah..@"; + npc_2nd_greet = "@Greetings, Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A freckled young lady with an enchanting smile.*"); + item.say("@" + player_name + ", it has been a long time since thou wert in our realm! How can I help thee in thy noble quest?@*"); + + } + else + item.say("@Good " + time_of_day + ", " + polite_title + ", can I help thee?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[ASKED_NYSTUL_ABOUT_BOOK]) + add ("book"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@They call me Mariah, as thou knowest.@"); + + case "job"(remove): + say("@I'm the newest member of the Council of Wizards. Somebody has to keep things running smoothly.*@"); + say("@In my spare time I use the library to pursue my own studies.@"); + add(["Council of Wizards", "library"]); + + case "Council of Wizards"(remove): + say("@They get so caught up in their work sometimes that they forget even to eat and sleep!@"); + add(["eat and sleep"]); + + case "library"(remove): + say("@'Tis the finest library in all Britannia. I study many different things, but I find learning old languages the most interesting.@*"); + say("@One can learn so much about how our own language developed!@"); + + case "eat and sleep"(remove): + say("@Such things matter little to them. They often dwell apart from the realm of the senses.@"); + add(["senses"]); + + case "senses"(remove): + say("@Aye, indeed.@"); + + case "book"(remove): + say("@Nystul sent word to me that thou hast a book written in a strange tongue.@"); + if (UI_count_objects(PARTY, SHAPE_BOOKOFPROPHESIES, QUALITY_ANY, FRAME_ANY) > 0) //checks party for item + { + say("@I'd be glad to look at it for thee.@ She examines the book.*"); + say("@Oh! I've seen this script before! I have part of an ancient silver tablet in my study with writing both in our language and this. I have learned only a little from studying it, but I can make out a few words.@"); + say("@The title is 'The Book of Prophecies,' and it says something about 'the end of our world.'@*"); + say("@If only I had the other half of the tablet, perhaps I'd be able to decipher the rest of the book.@"); + gflags[ASKED_MARIAH_ABOUT_BOOK] = true; + UI_clear_item_flag(NYSTUL, SI_ZOMBIE); //allows regular convos with Nystul. + add(["silver tablet", "decipher book"]); + } + else + say("@I'd not mind looking at it for thee...But I'd find the task much easier if thou wouldst bring it here!@"); //oops, lost the book + + + + case "silver tablet"(remove): + if (!gflags[ASKED_MARIAH_ABOUT_TABLET]) //haven't asked about it yet + { + say("@I got my piece of the tablet from some gypsies whom I met at a pub. Mayhap they can tell thee where to look for the other piece.@"); + say("@Bring both pieces of the tablet here and I will tell thee what I can.@"); + gflags[ASKED_MARIAH_ABOUT_TABLET] = true; //asked Mariah about tablet, can now ask Zoltan about it. + } + else if (UI_count_objects(PARTY, SHAPE_SILVER_TABLET, QUALITY_ANY, FRAME_PIRATE) > 0) //checks party for item + { + if (UI_count_objects(PARTY, SHAPE_SILVER_TABLET, QUALITY_ANY, FRAME_MARIAH) > 0) //checks party for item + { + say("@Ah, thou hast found the rest of the tablet! With the two of them together I should be able to tell you more.@"); + UI_set_item_flag(item, PETRA); + add(["decipher book"]); + } + else + say("@Ah, thou hast found the rest of the tablet! Go get the other half from my study and bring it here. With the two of them together I should be able to tell you more.@"); //doesn't have Mariah's tablet + } + else + { + if (UI_count_objects(PARTY, SHAPE_SILVER_TABLET, QUALITY_ANY, FRAME_MARIAH) > 0) //has Mariah's tablet, but not Pirate one + { + say("@I must have both halves of the tablet before I can tell you any more. This piece I have had for quite some time, and I've learned all I can from it.@"); + } + else + say("@I must have both halves of the tablet before I can tell you any more.@"); //no tablets + } + + + + + case "decipher book"(remove): + if (UI_count_objects(PARTY, SHAPE_BOOKOFPROPHESIES, QUALITY_ANY, FRAME_ANY) > 0) //checks party for item + { + if ((UI_count_objects(PARTY, SHAPE_SILVER_TABLET, QUALITY_ANY, FRAME_MARIAH) > 0) && (UI_count_objects(PARTY, SHAPE_SILVER_TABLET, QUALITY_ANY, FRAME_PIRATE) > 0)) //has both pieces of Mariah's tablet + { + if (!gflags[MARIAH_READ_TABLET]) + gflags[MARIAH_READ_TABLET] = true; + say("@With both pieces of the tablet, I should be able to work out a translation.@ She studies the tablet for a while, and then starts reading, haltingly, from the book.*"); + say("@An ancient prophecy tells of the final days, when the end of our world shall come.@*"); + say("@Three signs will precede the end.*@"); + say("@Thrice shall a being of great evil come unto our land, and by this it shall be known that the end is nigh.@*"); + say("@This evil one is of another race, who consider the evil one a great prophet.@*"); + say("@Yet this false prophet follows not the principles of Control, Passion and Diligence.@*"); + say("@One day the false prophet will come and desecrate our most holy shrine.@*"); + say("@And the false prophet will steal our most holy artifact, the Codex of Ultimate Wisdom.@*"); + say("@This shall be the first sign of the end.@*"); + say("@Then, it is written, the false prophet shall descend deep into the bowels of the earth.@*"); + say("@And the false prophet will cause the underworld to collapse.@*"); + say("@This will cause great earthquakes to tear our world asunder, and there will be a time of plague and famine.@*"); + say("@This shall be the second sign of the end.@*"); + say("@One last time shall the false prophet come.@*"); + say("@This time, the false prophet will come with a band of warriors.@*"); + say("@And they will destroy all that remains of the gargoyle race.@*"); + say("@There is only one way that this prophecy may be averted: That is by the sacrifice of the false prophet...@*"); + say("Mariah pauses for a while, deep in thought. @When they refer to 'the false prophet,' they must mean you.@ she says."); + say("@It would seem that they have reason to think you evil, from their perspective. This is a difficult matter to resolve. I think you'd better seek out more information.@*"); + say("@There's a gargoyle named Sin'Vraal living out in the desert. He speaks our language. Perhaps he could tell you more about this book, and of how the gargoyles view us.@"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + UI_set_item_flag(item, SI_ZOMBIE); + giveExperience(75); + } + + } + else + say("@I must have both halves of the tablet before I can tell you any more.@"); //no tablets + } + else + say("@I'd not mind looking at it for thee...But I'd find the task much easier if thou wouldst bring it here!@"); //oops, lost the book + + case "bye": + + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@Fare thee well!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Penumbra.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Penumbra.uc new file mode 100755 index 0000000..9efa466 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Penumbra.uc @@ -0,0 +1,294 @@ +void Penumbra object# (0x496) () +{ + +var party = UI_get_party_list(); +var player_name = getAvatarName(); +var polite_title = getPoliteTitle(); +var hour = UI_game_hour(); +var partynum = UI_get_array_size(party); +var bark; +var time_of_day; +var noun = "amie"; +var title; +var pronoun; +var player_is_female; +var user_input; +var party_gold = UI_count_objects(PARTY, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); +var msg_count = 0; +var msg = 0; + +if (player_is_female) + { +// noun = "amie"; +// title = "madame"; + } + else + { +// noun = "ami"; +// title = "m'sieur"; + } + + +if ((hour >= 6) && (hour < 12)) //'good morning' + { + time_of_day = "morning"; + } + +if ((hour >= 12) && (hour < 18)) //'good afternoon' + { + time_of_day = "afternoon"; + } +else time_of_day = "evening"; + + if (event == DOUBLECLICK) + { + + var met_penumbra = get_item_flag(MET); + + //barks for Avatar + + if (!met_penumbra) bark = "@A moment, milady..@"; + else bark = "@Penumbra..@"; + + script AVATAR + { + call GenericFreeze; + face AVATAR->find_direction(item); + actor frame standing; + say bark; + wait 10; + }; + + + //NPC barks + if (!met_penumbra) bark = "@I've been waiting for you..@"; + else bark = "@Thou hast returned..@"; + + script item + { + + call GenericFreeze; + + wait 5; + + face find_direction(AVATAR); + + actor frame standing; + + say bark; + + wait 8; + + call (Penumbra); + + }; + + } + + + else if (event == SCRIPTED) + + { + + + //Unfreeze Avatar and ITEM: + + AVATAR->GenericUnfreeze(); + + item->GenericUnfreeze(); + + + + + + + player_name = getAvatarName(); + polite_title = getPoliteTitle(); + var player_is_female = UI_is_pc_female(); + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A small, inscrutable woman, cloaked in shadows.*"); + item.say("@Ah, hello Avatar. I was wondering when you would get here..@*"); + + } + else item.say("@I see you have yet to fulfill your destiny.@"); + + var options = ["name", "job", "bye"]; + + +//Variable conversation options based on global flags or people met. Remove if none///// +// if (gflags[GLOBAL_FLAG_HERE]) options = options & "Insert convo here" + + if (gflags[ASK_ABOUT_BEYVIN]) //asked Aganar about rune + add ("Beyvin"); + + +///////////////////////////////////////////////////////////////////// + + + converse(options) + { + case "name"(remove): + say("@I am the one known as Penumbra.@"); + add(["Penumbra"]); + + case "job"(remove): + say("@I am a fortune teller.@"); + add(["fortune teller"]); + + case "Penumbra"(remove): + say("@I am the daughter of the eclipse.@"); + + case "fortune teller"(remove): + say("@Yes, I can foretell your future for you.@"); + add(["future"]); + + case "future"(remove): + say("@I require a small donation for my services.@"); + say("How much do you give her?"); + user_input = (UI_input_numeric_value(0, party_gold + 1, 1, 1)); + if (user_input == 0) + { + say("@So be it.@"); + } + else if (party_gold >= user_input) + { + chargeGold(user_input); + UI_play_music(27, 0); + say("She holds her hands out on either side of her crystal ball, not quite touching it, and closes her eyes. After a time, she speaks.*"); + say("@The future looks dark. All is unclear. Some more gold would shed further light on your destiny...@"); + + msg_count = 1; + + while (msg_count > 0) + { + //Get new user input for each time + say("How much do you give her?"); + user_input = (UI_input_numeric_value(0, party_gold + 1, 1, 1)); + + //change by 1 to move along to next message + msg += 1; + + //check conditions that you can't move forward (stiff her on money, not enough) + if (user_input == 0) + { + say("@Very well.@"); + msg_count = 0; //doesn't pony up the gold, lets you out of while loop + } + else if (user_input > party_gold) //not enough money + { + say("@You don't have that much.@"); + msg_count = 0; + } + + else + { + chargeGold(user_input); + if (msg == 1) + say("@Though all is dark, I see a light at the end of the tunnel. Quickly - more coins before I lose the thread of this vision!@"); + + else if (msg == 2) + say("@Much conflict lies before you. Your end... I cannot see it. More gold is needed.@"); + else if (msg == 3) + say("@You shall travel throughout the land before you are through. A few more coins and all should be clear.@"); + else if (msg == 4) + say("@You will journey into the depths of the earth... Strange creatures will you face...I can almost see the end now.@"); + else if (msg == 5) + say("@You and your companions will face terrible choices...You will need powerful magic to prevail...Wait...There is some barrier before me. Give me just one more coin and I think I can break through it.@"); + else if (msg == 6) + { + say("@Yes, now all is made clear to me! I see a great Vortex. There is a violet lens that is crucial to your quest.@"); + say("@It is broken, and must be made whole. But one lens is not enough! A blue lens is needed as well. You must have two lenses, else all is for naught.@*"); + say("She opens her eyes. @I can see no more for now. Leave me, that I might rest.@"); + UI_set_item_flag(item, ASLEEP); + UI_set_schedule_type(item, SLEEP); + break; + return; + } + } + } + } + else + say("@You don't have that much.@"); + + case "Beyvin"(remove): + if (!UI_get_item_flag(MANREL, SI_ZOMBIE)) //allows Manrel to talk of Beyvin + { + say("@Yes he was a terribly honest fellow. Alas, though, he lacked the virtue of tact. He told the truth once too often, and those he spoke of did not appreciate it. He's buried in the catacombs under Moonglow now, pushing up daffodils. Even virtue has its price.@"); + UI_set_item_flag(MANREL, SI_ZOMBIE); + } + else say("@Yes he was a terribly honest fellow. Alas, though, he lacked the virtue of tact. He told the truth once too often, and those he spoke of did not appreciate it. He's buried in the catacombs under Moonglow now, pushing up daffodils. Even virtue has its price.@"); + add(["honesty", "daffodils"]); + + case "daffodils"(remove): + say("@Yes, daffodils.@"); + + case "honesty"(remove): + say("@I can tell you of both the @rune and the mantra.@"); + add(["mantra"]); + + case "rune"(remove): + say("@Twas buried with Beyvin, rest his shade.@"); + add(["Beyvin"]); + + case "mantra"(remove): + if (!gflags[LEARNED_MANTRA_HONESTY]) + { + say("@For five gold coins I can use my powers to divine the mantra for you. Shall I do this?@"); // yes/no question + if (askYesNo()) + { + if (hasGold(5)) + { + chargeGold(5); + say("She closes her eyes in concentration. For long minutes you wait.*"); + if (isNearby(DUPRE)) + { + DUPRE.say("@What are we waiting for!@ whispers Dupre. @She's doubtless fallen asleep, and you've wasted good money for nothing...@"); + DUPRE.hide(); + } + say("Finally Penumbra opens her eyes again. @The word you seek is 'ahm.'@"); + gflags[LEARNED_MANTRA_HONESTY] = true; + giveExperience(30); + } + else say("@Your ambitions outreach your means.@"); //not enough gold + } + else say("@It is a small price for so profound a word.@"); + + } + + else + + { + + say("@For five gold coins I can use my powers to divine the mantra for you. Shall I do this?@"); // yes/no question + if (askYesNo()) + { + if (hasGold(5)) + { + chargeGold(5); + say("She closes her eyes in concentration. For long minutes you wait.*"); + if (isNearby(DUPRE)) + { + DUPRE.say("@What are we waiting for!@ whispers Dupre. @She's doubtless fallen asleep, and you've wasted good money for nothing...@"); + DUPRE.hide(); + } + say("Finally Penumbra opens her eyes again. @The word you seek is 'ahm.'@"); + gflags[LEARNED_MANTRA_HONESTY] = true; + giveExperience(30); + } + else say("@Your ambitions outreach your means.@"); //not enough gold + } + else say("@It is a small price for so profound a word.@"); + } + + + case "bye"(remove): + say("@Your destiny awaits.@"); + break; + +} +} +else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Rob.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Rob.uc new file mode 100755 index 0000000..28cd4d6 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Rob.uc @@ -0,0 +1,156 @@ + +void Rob object# (0x498) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + const int FRAME_FRASIERS_FOLLY = 14; //frothy mug + + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + + //Shopkeeper options + //sellFood(var npc, var food_drink_options, var prices, dialog) + + var food_drink_options =["nothing", "mead", "ale", "wine", "Frasier's Folly", "baked brie","bread" ]; + var food_drink_frames = [FRAME_MEAD, FRAME_ALE, FRAME_WINE, FRAME_FRASIERS_FOLLY, FRAME_BRIE, "FRAME_BREAD"]; + var prices = [5, 7, 6, 7, 6, 3]; + + var initial_choice_question = "@I sell mead, wine, bread, baked brie, and the house brew, Frasier's Folly.@"; + var askIfInterested1 = "@That'll be "; //split into two to capture price + var askIfInterested2 = " crowns, okay?@"; + var ask_quantity = "@How many do you want?@"; + var cant_afford = "@You can't afford it right now.@"; + var cant_hold = "@You haven't any room in your pack.@"; + var saidNo = "@Suit yourself.@"; + var success = "He gives you the "; + var success2 = "@. Enjoy!@"; + var nothing = "@Anything else you need?"; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me, barkeep..@"; + npc_1st_greet = "@Coming, " + polite_title + ".@"; + + av_2nd_greet = "@Hello again.@"; + npc_2nd_greet = "@Welcome back, " + polite_title + ".@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A short, congenial fellow.*"); + item.say("@Welcome to the Blue Bottle Tavern.@"); + + } + else + item.say("@Anything else I can do for you?@"); + + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm Rob Frasier.@"); + + case "job"(remove): + if (!shop_is_open) + { + say("@I sell mead, wine, bread, baked brie, and the house brew, Frasier's Folly.@"); + say("@Come by the Blue Bottle Tavern during business hours and I'll be glad to serve you.@"); + } + else + sellFood(ROB, food_drink_options, prices, food_drink_frames, dialog); + + + case "bye": + + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@See you later.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Thariand.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Thariand.uc new file mode 100755 index 0000000..5933e02 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Thariand.uc @@ -0,0 +1,240 @@ + +void Thariand object# (0x49e) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //determine if npc chosen can train in magic at all + var can_npc_train; + + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me..@"; + npc_1st_greet = "@Just a moment...@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@Hello again, " + polite_title + "."; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A busy looking man wearing a blue robe."); + item.say("@So many books to keep organized, it's a wonder I have any time for my own studies...@"); + item.say("@Can I help you with something?@*"); + + + //standard conversation options + var options = ["name", "job", "bye"]; + if (gflags[ASK_THARIAND_ABOUT_SHRINE]) //asked Xiao about shrine + add ("shrine"); + + var options2 = ["fiction", "non-fiction", "reference", "nothing"]; + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Thariand, of the blue star.@"); + add(["blue star"]); //if another convo branch opens up + + case "job"(remove): + say("@I'm the librarian. I prefer to spend my time studying magic, but I also teach it on the side, for a fee of course. I can also help you find some books if you keep it quick.@"); + add(["magic", "books", "teach magic"]); + + case "blue star"(remove): //replace "blank" in the case with the + say("@All the students of Nicodemus bear this sign.@"); + if (!gflags[LEARNED_ABOUT_NICODEMUS]) //lets you ask others about Nicodemus + gflags[LEARNED_ABOUT_NICODEMUS] = true; + add(["Nicodemus"]); + + case "teach magic": + say("@I charge 55 gold for each training session, since my time is valuable and I am a very busy man. Which of you wishes to learn?@"); + //choose party member to train + var party_member = selectWhoTrains(); + + //get party member name, training points, int, and magic + var party_member_name = UI_get_npc_name(party_member); + var training_points = UI_get_npc_prop(party_member, TRAINING); + var npc_magic = UI_get_npc_prop(party_member, MAX_MANA); + var npc_int = UI_get_npc_prop(party_member, INTELLIGENCE); + + //get player gold + var player_gold = UI_count_objects(PARTY, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + + if (training_points < 3) + say("@I sense you aren't ready to learn yet. Come back when you have more experience with spellcasting.@"); + else if (npc_magic < 1) + say("@I sense that you haven't any magical abilities! I cannot help you.@"); + else if (npc_magic > 29) + say("I sense that your abilities have surpassed even mine!@"); + else + { + if (hasGold(55)) + { + chargeGold(55); + say("You pay 55 gold and the training session begins."); + if (party_member == AVATAR) + say("You and Thariand dive into the pages of several tomes. Following an extensive study session, you find the ability to comprehend and dissiminate much more information than ever before. In addition, you have a better grasp at the theory behind spellcasting."); + else + say("" + party_member_name + " and Thariand dive into the pages of several tomes. Following an extensive study session, " + party_member_name + " finds the ability to comprehend and dissiminate much more information than ever before. In addition, " + party_member_name + " has a better grasp at the theory behind spellcasting."); + + //add magic points + var npc_int = UI_get_npc_prop(party_member, INTELLIGENCE); + var mana_bonus = (npc_int - npc_magic + 1) / 2; + + UI_error_message("Magic points added to npc " + mana_bonus); + UI_set_npc_prop(party_member, MAX_MANA, mana_bonus); //should make it full + + //subtract training points: + if (mana_bonus >= 3) + UI_set_npc_prop(party_member, TRAINING, -3); + else if (mana_bonus == 2) + UI_set_npc_prop(party_member, TRAINING, -2); + else if (mana_bonus == 1) + UI_set_npc_prop(party_member, TRAINING, -1); + + + } + else + say("@Sorry, but you only have " + player_gold + " coins. I am much too busy to teach it for free.@"); + } + + + + case "Nicodemus"(remove): + say("@He lives southeast of Yew.@"); + add(["Yew"]); + + case "Yew"(remove): + say("@Somebody there should be able to give you directions.@"); + + case "magic"(remove): + say("@Were I to master all the arcane lore contained within these volumes, I'd be the greatest sorcerer of all time!@*"); + say("@Of course, finding all the right books is no small task...@"); + + + case "books"(remove): + say("@Were you interested in: A. Fiction B. Non-fiction C. Reference?@"); + converse(options2) + { + + case "fiction"(remove): + say("@In that category I can recommend- The Caverns of Freitag...@*"); + say("@Around the World in a Washtub...@*"); + say("@The Wizard of Oz@"); + + + case "non-fiction"(remove): + say("@In that category I can recommend- Mating Rituals of the Northern Plains Centaur...@*"); + say("@Of Dreams and Visions...@*"); + say("@The Lost Art of Ballooning...@"); + say("@Summoning Incubi for Fun and Profit.@"); + + + case "reference"(remove): + say("@In that category I can recommend- Dilzal's Almanac of Good Advice...@*"); + say("@Priliwig's Universal Compendium of Knowledge...@*"); + say("@The Lost Book of Mantras.@"); + + + case "nothing"(remove): + say("@Fine. You should have no trouble finding what you want once you have the call number.@*"); + say("@You do understand how our books are organized, don't you?@"); + if (askYesNo()) + { + say("@Good. I have more important things to do than explain it to you.@"); + break; + } + else + { + say("@Well then, I'd suggest you look it up in The Beginner's Guide to the Dewey Decimal System. Its call number is T17 0035 r16RL.5 v43.@"); + add(["Beginner's Guide to Dewey Decimal System"]); + } + + + + case "Beginner's Guide to Dewey Decimal System"(remove): + say("@Oh, I'm sorry, I just remembered. That book was checked out last week. Try coming back for it later.@"); + break; + + }//end options2 + + case "shrines"(remove): + say("@We have a book that tells the history of the shrines. If only I could remember the title...@"); + + + case "bye"(remove): + say("@Remember, any books you take out of here are due back before the next bipolar lunar conjunction!@"); + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@Must get back to work..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Xiao.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Xiao.uc new file mode 100755 index 0000000..9bfc73d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Moonglow/Xiao.uc @@ -0,0 +1,153 @@ +void Xiao object# (0x49f) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Well met, milady!@"; + npc_1st_greet = "@Ah,'tis the Avatar..@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@Welcome back, Avatar.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A wise, scholarly woman.*"); + item.say("@Good " + time_of_day + ", Avatar. For what purpose hast thou come?@"); + + //standard conversation options + var options = ["name", "job", "bye", "Avatar"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name" (remove): + say("@I am Xiao.@"); + + case "job" (remove): + say("@I serve on the Council of Wizards. I also teach spells and sell magical reagents.@"); + add(["Council of Wizards", "spells", "reagents"]); + + case "Wisps"(remove): + say("@Their secret is far more powerful than anything I might teach thee.@"); + add(["powerful"]); + + case "powerful"(remove): + say("@Truly, it would be terrible if the wrong person were to learn it. Only we of the Council of Wizards know the secret. But, since thou art the Avatar, surely it is safe for thee to learn it as well.@"); + + case "Avatar"(remove): + say("@Your example inspires us all.@"); + + case "Council of Wizards"(remove): + say("@Tis our task to keep the forces of magic in balance throughout the land. We also do what we can to promote the eight virtues.@"); + add(["virtues", "balance"]); + + case "virtues"(remove): + say("@We created the shrines, many years ago.@"); + add(["shrines"]); + + case "shrines"(remove): + if (!gflags[ASK_THARIAND_ABOUT_SHRINE]) //flag set so you can ask Thariand about shrines + { + say("@Thariand can tell thee more.@"); + gflags[ASK_THARIAND_ABOUT_SHRINE] = true; + } + else + say("@Thariand can tell thee more.@"); + add(["Thariand"]); + + case "Thariand"(remove): + say("@He is the librarian at the Lycaeum.@"); + add(["Lycaeum"]); + + case "Lycaeum"(remove): + say("@Surely you know where the Lycaeum is.@"); + + case "balance"(remove): + say("@Not an easy task.@"); + + case "reagents": + if (!UI_get_schedule_type(item) == LAB) + say("@My shop is closed right now.@"); + else + buyReagents(XIAO); + + + case "spells": + if (!UI_get_schedule_type(item) == LAB) + say("@My shop is closed right now.@"); + else + magicShopkeeper(XIAO); + + case "bye": + avatar_goodbye = "@Goodbye, Xiao!@"; + npc_goodbye = "@Thou art always welcome here, Avatar!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Antonio.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Antonio.uc new file mode 100755 index 0000000..21e11fc --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Antonio.uc @@ -0,0 +1,231 @@ +void Antonio object#(0x486) () +{ + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + var av_1st_greet = "@Greetings, milord.@"; + var npc_1st_greet = "@Greetings!@"; + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Greetings, " + player_name + "!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A gentleman of slight build and refined manners.*"); + item.say("@Greetings! I am Lord Antonio. Might I ask thy name? " + player_name + ", the pleasure is all mine.@*"); + + } + else + item.say("@Greetings, " + player_name + "! What brings thee here this " + time_of_day + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + var options2 = ["don't know"]; + + if (UI_get_item_flag(item, SI_ZOMBIE)) + add("humility"); + + if (UI_get_item_flag(CHARLOTTE, SI_ZOMBIE)) + options2 = options2 & "Charlotte"; + + if (UI_get_item_flag(WILLIAM, SI_ZOMBIE)) + options2 = options2 & "William"; + + if (UI_get_item_flag(CONOR, SI_ZOMBIE)) + options2 = options2 & "Conor"; + + if (UI_get_item_flag(KATRINA, SI_ZOMBIE)) + options2 = options2 & "Katrina"; + + if (UI_get_item_flag(DUNBAR, SI_ZOMBIE)) + options2 = options2 & "Dunbar"; + + if (UI_get_item_flag(AURENDIR, SI_ZOMBIE)) + options2 = options2 & "Aurendir"; + + if (UI_get_item_flag(ANTONIO, SI_ZOMBIE)) + options2 = options2 & "Antonio"; + + +//////////////////////////////////////////////////////////////////// +// Main conversation thread +//////////////////////////////////////////////////////////////////// + + converse(options) + { + case "name"(remove): + say("@My name is Antonio.@"); + + case "job"(remove): + say("@I govern New Magincia. Fortunately the fine people of this town have few disputes to settle, leaving me plenty of time for my hobby.@"); + add(["New Magincia", "hobby"]); + + + case "New Magincia"(remove): + say("@The city of humility is a lovely place to live.@"); + if (!UI_get_item_flag(ANTONIO, NAKED)) //haven't got rune yet + add(["humility"]); + + + + case "hobby"(remove): + say("@I do magic tricks. It brings a bit of cheer into this imperfect world.@"); + add(["magic tricks"]); + + case "magic tricks"(remove): + say("@Wouldst thou like to see one?@"); // yes/no question + if (askYesNo()) + { + say("@Splendid!@ Antonio reaches into his pocket and takes out a balloon. He blows it up until it bursts, and four doves appear from inside it, flying off towards the four points of the compass."); + say("@Did you enjoy that?@"); + if (askYesNo()) + { + say("@I knew you would. That's my favorite trick!@"); + } + else say("@Too bad. Perhaps I should learn a better trick.@"); + + } + else say("@As you wish@"); // if answered no + + case "humility"(remove): + say("@The most humble one amongst us knows the mantra. If thou canst find out who that is, tell me, and I will give thee the rune.@"); + if (!UI_get_item_flag(item, SI_ZOMBIE))//set so you can ask him if he is the most humble + UI_set_item_flag(item, SI_ZOMBIE); + + say("@Dost thou know who is the most humble person in this town?@"); + if (askYesNo()) + { + say("@Then what is that person's name?@"); + converse(options2) + { + case "don't know"(remove): + say("@Keep asking around.@"); + break; + + case "Conor"(remove): + say("@Very astute of thee! Here is the rune, and I wish thee success on thy mission.@"); + UI_add_party_items(1, SHAPE_RUNE, QUALITY_ANY, FRAME_HUMILITY); + UI_set_item_flag(ANTONIO, NAKED); //got rune flag + sayGoodbyeAbrupt(item, "Good luck, Avatar!"); + return; + break; + + case "Katrina"(remove): + say("@Tis not fitting that thou shouldst guess. Make sure thou dost know the answer before you speak with me again.@"); + subtractKarma(5); + sayGoodbye2(item); + break; + return; + + case "Aurendir"(remove): + say("@Tis not fitting that thou shouldst guess. Make sure thou dost know the answer before you speak with me again.@"); + subtractKarma(5); + sayGoodbye2(item); + break; + return; + + case "Charlotte"(remove): + say("@Tis not fitting that thou shouldst guess. Make sure thou dost know the answer before you speak with me again.@"); + subtractKarma(5); + sayGoodbye2(item); + break; + return; + + case "Dunbar"(remove): + say("@Tis not fitting that thou shouldst guess. Make sure thou dost know the answer before you speak with me again.@"); + subtractKarma(5); + sayGoodbye2(item); + break; + return; + + case "William"(remove): + say("@Tis not fitting that thou shouldst guess. Make sure thou dost know the answer before you speak with me again.@"); + subtractKarma(5); + sayGoodbye2(item); + break; + return; + case "Antonio"(remove): + say("@Tis not fitting that thou shouldst guess. Make sure thou dost know the answer before you speak with me again.@"); // sub_karma(5); + subtractKarma(5); + sayGoodbye2(item); + break; + return; + + }//end convo option 2 + + } + else + say("@Keep asking around.@"); + case "bye": + say("@Until we meet again, may your road be short and your fortunes long.@"); + + npc_goodbye = "@Until we meet again..@"; + avatar_goodbye = "@Goodbye!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } + else + scheduleBarks(item); +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Aurendir.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Aurendir.uc new file mode 100755 index 0000000..529e2ba --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Aurendir.uc @@ -0,0 +1,196 @@ +void Aurendir object# (0x487) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + const int WOOL_SELL_PRICE = 5; + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, shepherd..@"; + npc_1st_greet = "@Hi there!@"; + + av_2nd_greet = "@Hello..@"; + npc_2nd_greet = "@Hi again!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A short man dressed in shepherds clothing.*"); + item.say("@Hi there! Is there anything I can do for you?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //rune of Humility quest + if (UI_get_item_flag(ANTONIO, SI_ZOMBIE)) + add ("humility"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + + case "name"(remove): + say("@Once I was Aurendir the mighty - now I live a more modest life.@"); // set_flag(SELF,F_MET) + add(["modest"]); + + case "job"(remove): + say("@I came here to meditate, tend sheep and sell wool.@"); + add(["meditate", "sheep", "wool"]); + + case "sheep"(remove): + say("@So they can be shorn.@"); + add(["shorn"]); + + case "shorn"(remove): + say("@To make wool. People buy it from me.@"); + add(["wool", "buy"]); + + case "wool"(remove): + say("@It's used to make thread.@"); + add(["thread"]); + + case "thread"(remove): + say("@To be woven into cloth.@"); + add(["cloth"]); + + case "cloth"(remove): + say("@You can make robes from it.@"); + add(["robes"]); + + case "robes"(remove): + say("@I wear a robe while I tend sheep. It's all part of life's great circle.@"); + add(["sheep", "circle"]); + + case "circle"(remove): + say("@From earth, to grass, to sheep, to me... when I die, I'll return to the earth.@"); + add(["earth"]); + + case "earth"(remove): + say("@That's right.@"); + + case "humility"(remove): + say("@I used to be a powerful and wealthy mage. I wore silk robes, and fine jewelry. In fact, I even had my own castle.@*"); + say("@But one day in my travels I visited the Shrine of Humility. Meditating there, I had an idea. I would give up all my earthly possessions and quit the practice of magic. I would live as a shepherd! Surely this would be the greatest act of humility a man could perform. And so you see me here today.@"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) //ask about humility + { + giveExperience(5); + UI_set_item_flag(item, SI_ZOMBIE); + } + + case "modest"(remove): + say("@I used to be a powerful and wealthy mage. I wore silk robes, and fine jewelry. In fact, I even had my own castle.@*"); + say("@But one day in my travels I visited the Shrine of Humility. Meditating there, I had an idea. I would give up all my earthly possessions and quit the practice of magic. I would live as a shepherd! Surely this would be the greatest act of humility a man could perform. And so you see me here today.@"); + add(["Shrine of Humility", "castle"]); + + case "castle"(remove): + say("@Those days are no more.@"); + + case "Shrine of Humility"(remove): + say("@I should go there again soon... It changed my life.@"); + + case "meditate"(remove): + say("@You should go meditate at the shrine yourself. I find 'lum' a most effective mantra.@"); + if (!gflags[LEARNED_MANTRA_HUMILITY]) + { + + giveExperience(10); + gflags[LEARNED_MANTRA_HUMILITY] = true; + } + + case "buy": + say("@I charge 5 gold for a bale of wool. Would you like some?@"); + if (askYesNo()) + { + if (hasGold(WOOL_SELL_PRICE)) + { + if (UI_add_party_items(1, SHAPE_WOOL, QUALITY_ANY, FRAME_BALE, true)) + { + chargeGold(WOOL_SELL_PRICE); + say("@Very good.@ After accepting your gold, Aurendir hands over the wool.@"); + } + else + say("@You look pretty full to me.@"); + } + else + say("@I'm sorry, but you don't seem to have enough money.@"); + + } + else + say("@You need only to ask.@"); + + case "bye": + + item.say("@See you later.@"); + break; + + + case "bye": + // say("@Goodbye text if you want, otherwise delete for SI style goodbye barks@"); + + avatar_goodbye = "@Farewell..@"; + npc_goodbye = "@See you later.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Charlotte.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Charlotte.uc new file mode 100755 index 0000000..03655e7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Charlotte.uc @@ -0,0 +1,262 @@ + +void Charlotte object# (0x485) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + var FRAME_RAND = UI_die_roll(0, 4); + + const int WOOL_BUY_PRICE = 10; + const int CLOTH_SELL_PRICE = 25; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == SEW) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@A moment, milady..@"; + npc_1st_greet = "@Yes " + polite_title + "?@"; + + av_2nd_greet = "@Greetings, Charlotte..@"; + npc_2nd_greet = "@Hello again..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A pretty young woman with downcast eyes.*"); + item.say("@Good " + time_of_day + ", " + polite_title + ".@*"); + } + else + item.say("@Hello again, " + polite_title + ".@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[READ_BALLOON_PLANS] || UI_get_item_flag(item, PETRA)) //read plans OR asked Fyodor in Britain about silk + add("silk"); + + if (UI_get_item_flag(ANTONIO, SI_ZOMBIE)) //ask if most humble + add ("humility"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am called Charlotte Weaver, " + polite_title + ".@"); + + case "job"(remove): + say("@I am but a humble weaver, " + polite_title + ".@"); + add(["weaver"]); + + case "weaver"(remove): + say("@I turn wool into cloth. I am not very good, but some people take pity on me and buy my cloth anyway.@"); + add(["wool", "buy"]); + + case "buy": + if (shop_is_open) + { + say("@Wouldst thou like some cloth? My cloth costs 25 gold. Interested, " + player_name + "?@"); + if (askYesNo()) + { + if (hasGold(CLOTH_SELL_PRICE)) + { + if (UI_add_party_items(1, SHAPE_CLOTH, QUALITY_ANY, FRAME_RAND, true)) + { + chargeGold(CLOTH_SELL_PRICE); + say("@Many thanks!@ After accepting your gold, Charlotte hands over the cloth.@"); + } + else + say("@But 'twould make thee o'erburdened, " + player_name + "!@"); + } + else + say("@But thou hast not enough gold, " + player_name + "!@"); + } + else + say("@As you wish, " + polite_title + ".@"); + } + else + say("@Come to my shop when I'm open!@"); + + case "wool": + if (shop_is_open) + { + say("@Hast thou some wool to sell?@"); + if (askYesNo()) + { + if ((UI_count_objects(PARTY, SHAPE_WOOL, QUALITY_ANY, FRAME_ANY) > 0)) + { + say("@Will you take 10 gold crowns for a bale of wool, " + player_name + "?@"); + if (askYesNo()) + { + giveGold(10); + say("@Done!@ Charlotte hands you 10 gold pieces and takes the wool.@"); + UI_remove_party_items(1, SHAPE_WOOL, QUALITY_ANY, FRAME_ANY); + } + else + say("@Perhaps some other time, then.@"); + } + else + say("@Begging thy pardon, but I see no wool!@"); + } + else + say("@Perhaps some other time, then.@"); + } + else + say("@Come to my shop when I'm open!@"); + + + +/////Balloon quest references-cross reference with Paws npcs + + + case "silk"(remove): + if (shop_is_open) + { + if ((UI_count_objects(PARTY, SHAPE_SILK_THREAD, QUALITY_ANY, FRAME_ANY) > 0)) + { + say("@Aye, " + player_name + ", I can weave thy silk thread into cloth. It will cost thee 10 gold. Interested?@"); + if (askYesNo()) + { + if (hasGold(10)) + { + chargeGold(10); + say("Turning to her loom, Charlotte soon weaves the thread into fine silk cloth."); + say("@Finished!@ She takes your gold and hands over the cloth."); + UI_add_party_items(1, SHAPE_SILK_CLOTH, QUALITY_ANY, FRAME_ANY); + UI_remove_party_items(1, SHAPE_SILK_THREAD, QUALITY_ANY, FRAME_ANY); + add("silk bag"); + } + else + say("@Begging thy pardon, " + player_name + ", but thou dost not have 10 gold!@"); // not enough gold on party + + } + else + say("@Thou knowest best, " + player_name + "@."); + } + else + say("@Begging thy pardon, " + polite_title + ", but I see no silk!@"); + } + else + say("@Come to my shop when I'm open!@"); + + case "silk bag"(remove): + say("@I'm not sure what you mean.@"); // check to see if object 241 is in party + if ((UI_count_objects(PARTY, SHAPE_SILK_CLOTH, QUALITY_ANY, FRAME_ANY) > 0)) //checks for silk cloth + { + say("@Take the cloth to Marissa. Mayhap she can sew it into a bag for thee.@"); //has cloth + add(["Marissa"]); + } + else if ((UI_count_objects(PARTY, SHAPE_SILK_THREAD, QUALITY_ANY, FRAME_ANY) < 1)) //has no silk thread + { + say("@If you had some silk thread, I could help thee. Go ask Arbeth if he has any to spare.@"); + add(["silk thread", "Arbeth"]); + } + else + { + say("@I can weave that silk for thee... Then thou should speak with Marissa.@"); //has silk thread + add(["silk thread", "Marissa"]); + } + + + case "Marissa"(remove): + say("@She lives in Paws.@"); + + case "Arbeth"(remove): + say("@He lives in Paws.@"); + + + case "humility"(remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) //ask about humility + { + say("@Tis really not my place to speak of that, " + polite_title + ". But honesty is a virtue too, and honesty forces me to admit that I am the humblest person in New Magincia.@"); + giveExperience(5); + UI_set_item_flag(item, SI_ZOMBIE); + } + else + { + say("@Tis really not my place to speak of that, " + polite_title + ". But honesty is a virtue too, and honesty forces me to admit that I am the humblest person in New Magincia.@"); + } + + case "bye": + + avatar_goodbye = "@Goodbye for now..@"; + npc_goodbye = "@Farewell, " + polite_title + "!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Conor.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Conor.uc new file mode 100755 index 0000000..83f4774 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Conor.uc @@ -0,0 +1,187 @@ + +void Conor object# (0x488) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@A moment, milord..@"; + npc_1st_greet = "@Well met, " + polite_title + ".@"; + + av_2nd_greet = "@Conor..@"; + npc_2nd_greet = "@Greetings, " + player_name + ".@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A stalwart fellow, with a look of placid concentration."); + if (isNearby(IOLO)) + { + IOLO.say("You think you see a brief flicker of recognition pass between Iolo and the fisherman. But before you can be certain, he turns to address you."); + IOLO.hide(); + add(["Iolo"]); + } + item.say("@Good " + time_of_day + ". Is there anything I can do for you?@"); + + } + else item.say("@Hello, " + player_name + ". It's good to see you again.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (inParty(IOLO)) + add("Iolo"); + + //humility quest + if (UI_get_item_flag(ANTONIO, SI_ZOMBIE)) + add ("humility"); + + if (UI_get_item_flag(KORANADA, MET)) //spoke to Koranda in serpents hold + add ("guildmaster", "shield"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Oh, forgive me for not introducing myself. I am Conor Starfalcon. And what is your name?@"); // question + say("@Well met, " + polite_title + "!@"); // response + + + case "job"(remove): + say("@I am a fisherman. In catching fish, as in all of life, there is something to be learned.@"); + add(["fish"]); + + case "Iolo"(remove): + say("@We've met before. But that was many years ago.@"); + add(["years"]); + + case "years"(remove): + say("@Yes, long ago.@"); + + case "fish"(remove): + say("@I still have not mastered the way of the fisherman. But I think perhaps the key to enlightenment lies not so much in the destination as in the road one travels.@"); + add(["way"]); + + case "way"(remove): + say("@I am satisfied to live here and learn what I can from the fish.@"); + + case "shrine"(remove): + say("@The Shrine of Humility is far to the southeast. I'd be glad to take you there in my boat but I'm afraid it is too small to weather the high seas.@"); + add(["boat"]); + + case "boat"(remove): + say("@It's down at the beach. Feel free to borrow it if you have need.@"); + + case "humility"(remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + say("@You seek to find the humblest in New Magincia? That's a difficult task. I'd hate to commend one of my neighbors to you and fail to do justice to the others. The one thing I can tell you for certain is that it isn't me you're looking for.@"); + giveExperience(15); + UI_set_item_flag(item, SI_ZOMBIE); //item flag for learning whos humble. + } + else say("@You seek to find the humblest in New Magincia? That's a difficult task. I'd hate to commend one of my neighbors to you and fail to do justice to the others. The one thing I can tell you for certain is that it isn't me you're looking for.@"); + add(["mantra"]); + + case "mantra"(remove): + if (!gflags[LEARNED_MANTRA_HUMILITY]) + { + say("@The Mantra of Humility is 'lum'. If you seek the shrine, I hope you find it.@"); + gflags[LEARNED_MANTRA_HUMILITY] = true; + giveExperience(30); + } + else say("@The Mantra of Humility is 'lum'. If you seek the shrine, I hope you find it.@"); + add(["shrine"]); + + case "guildmaster"(remove): + say("@I used to be a guildmaster. But that was long ago.@"); + + case "shield"(remove): + say("@I no longer follow the way of the warrior.@"); + + case "bye": + say("@If I can help you with anything else, let me know.@"); + + avatar_goodbye = "@Farewell, Conor.@"; + npc_goodbye = "@Safe travels, friend.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Dunbar.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Dunbar.uc new file mode 100755 index 0000000..03d78fd --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/Dunbar.uc @@ -0,0 +1,182 @@ + +void Dunbar object# (0x482) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Shopkeeper options + //Function: sellFood(var npc, var food_drink_options, var prices, dialog) + + var food_drink_options =["nothing", "mead", "ale", "wine", "beef", "mutton", "fish"]; + var food_drink_frames = [FRAME_MEAD, FRAME_ALE, FRAME_WINE, FRAME_BEEF, FRAME_MUTTON, FRAME_TROUT]; + var prices = [3, 2, 4, 6, 4, 3]; + + //dialog options + var initial_choice_question = "@Which of these?@"; + var askIfInterested1 = "@For that I charge a modest "; + var askIfInterested2 = " gold. Want some?@"; //split into two to capture price + var ask_quantity = "@How many?@"; + var cant_afford = "@I'm afraid you haven't enough money for it.@"; + var cant_hold = "Dunbar looks at you. @You haven't any room in your pack.@"; + var saidNo = "@Anything else?@"; + var success = "Dunbar gives you the "; + var success2 = ". That aught to hold you.@"; + var nothing = "@Anything else I can do for you?"; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + //Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hello there.@"; + npc_1st_greet = "@Welcome!@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@Ah, of course!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A plump, jovial fellow chewing on a leg of lamb.*"); + item.say("@Welcome to the Humble Palate.@"); + + if (!UI_get_item_flag(item, PETRA)) //using petra flag because met flag is automatically true for him? + { + UI_set_item_flag(item, PETRA); //sets met flag + } + else + item.say("@Anything else I can do for you?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + if (UI_get_item_flag(ANTONIO, SI_ZOMBIE)) + add ("humility"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Dunbar@, he says between bites of mutton."); + + case "job"(remove): + say("@I sell fish, ale, mead, wine, and mutton.@"); + add("buy"); + + case "buy": + if (!shop_is_open) + say("@Come back during business hours and I'll be happy to serve thee.@"); + else + sellFood(DUNBAR, food_drink_options, prices, food_drink_frames, dialog); + + case "Conor"(remove): + if (!UI_get_item_flag(CONOR, NAKED)) //knows about guild + { + say("@I hear he used to be the head of some important guild.@"); + UI_set_item_flag(CONOR, NAKED); + } + else say("@I hear he used to be the head of some important guild.@"); + add(["guild"]); + + case "guild"(remove): + say("@I don't know anything about it, but maybe it explains that strange glow you can see over by his house at night.@"); + add(["glow"]); + + case "glow"(remove): + say("@Go see for yourself.@"); + + case "humility"(remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + giveExperience(5); + UI_set_item_flag(item, SI_ZOMBIE); //item flag for learning whos humble. + } + say("@Serving others it the humblest occupation I could imagine. That's why I opened this place.@*"); + say("He pauses to wipe his mouth with the back of his hand."); + + + + case "bye": + say("@If I can help you with anything else, let me know.@"); + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@Come back anytime!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/William.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/William.uc new file mode 100755 index 0000000..3195105 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/NewMagincia/William.uc @@ -0,0 +1,137 @@ + +void William object# (0x489) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "strangers"; + else + greeting = "stranger"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hello..@"; + npc_1st_greet = "@Howdy!@"; + + av_2nd_greet = "@Hello again..@"; + npc_2nd_greet = "@Howdy, welcome back.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("An old farmer who looks to have has made his peace with life."); + item.say("@Howdy, " + greeting + ".@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //Humility rune quest + if (UI_get_item_flag(ANTONIO, SI_ZOMBIE)) //for new magincia rune quest + add ("humility", "rune"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@M'name is William.@"); + + case "job"(remove): + say("@I'm a farmer.@"); + add(["farmer"]); + + case "rune"(remove): + say("@Ask Antonio.@"); + add(["Antonio"]); + + case "Antonio"(remove): + say("@The lord of New Magincia.@"); + add(["New Magincia"]); + + case "New Magincia"(remove): + say("@That's where ya are now.@"); + + case "farmer"(remove): + say("@Working the earth is the lowest form 'o labor. But it provides food for them as writes books, plays music, and other such things. Surely 'tis a humble living, to devote yer life to farmin'. It's about all I do with meself, 'cept when I find time for carvin' hippos.@"); + add(["hippos"]); + + + case "humility"(remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + giveExperience(5); + UI_set_item_flag(item, SI_ZOMBIE); //item flag for learning whos humble. + + } + say("@Working the earth is the lowest form 'o labor. But it provides food for them as writes books, plays music, and other such things. Surely 'tis a humble living, to devote yer life to farmin'. It's about all I do with meself, 'cept when I find time for carvin' hippos.@"); + add(["hippos"]); + + + case "hippos"(remove): + say("@I'll show ya one.@ The old man gets a fiendish gleam in his eyes as he reaches into his pouch and takes out a small wooden hippo. @Aint she purty? If I don't make the purtiest gol' danged hippos you ever did see, you can call me Mortimer.@"); + add(["Mortimer"]); + + case "Mortimer"(remove): + say("@He's a mighty foolish fellow.@"); + + case "bye": + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@See ya.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Avatar.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Avatar.uc new file mode 100755 index 0000000..1fff959 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Avatar.uc @@ -0,0 +1,27 @@ +void AvatarFunc object#(0x60E) () +{ + + if (event == SCRIPTED) + { + UI_error_message("Avatar SCRIPTED event called"); + script AVATAR after 30 ticks + { + call AvatarFunc, SCRIPTED; + } + + + } + + if (event == 4)//NOTE -this is supposed to be "READIED" but for some reason DEATH doesn't work, but this does. + { + UI_error_message("Avatar DEATH event called"); + UI_fade_palette(75, 0, false); //fade to black + + + script AVATAR + { + call deathEvents, DEATH_FADE; + }; + return; + } +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/BehLem.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/BehLem.uc new file mode 100755 index 0000000..610aaec --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/BehLem.uc @@ -0,0 +1,351 @@ +void BehLem object# (0x4bf) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var PARTYMEMBER = getSixth(party); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var joined_party_before = UI_get_item_flag(item, NAKED); //allows join/leave + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hail, gargoyle.@"; + if (!gflags[READ_GARGISH_SCROLL]) + npc_1st_greet = "@Are.. human!@"; + else if (!UI_get_item_flag(item, PETRA)) + npc_1st_greet = "@To greet you, False Prophet.@"; + else + npc_1st_greet = "@Yes, Avatar?@"; + + av_2nd_greet = "@Beh Lem..@"; + npc_2nd_greet = "@Yes, Avatar?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A small, light-skinned gargoyle.*"); + + if (!gflags[READ_GARGISH_SCROLL]) //haven't met Beh lem yet, haven't read scroll. + { + item.say("The gargoyle greets you enthusiastically, but you can't understand him!*"); + item.say("Seeing your confusion, he switches to the human language. It's obviously a strain for him."); + item.say("@Hello. I little human speak.@"); + add ("speak"); + if (isNearby(DUPRE)) + { + DUPRE.say("@" + player_name + ", let's away from here. There's naught of use this creature can tell us. Agreed?@"); + if (askYesNo()) + { + item.say("The confused gargoyle waves good-bye."); + UI_clear_item_flag(item, MET); + sayGoodbye2(item); + return; + } + else + { + DUPRE.say("@As you wish, " + polite_title + ".@"); + DUPRE.hide(); + } + } + else + { + + if (isNearby(IOLO)) + { + IOLO.say("@" + player_name + ", let's away from here. There's naught of use this creature can tell us. Agreed?@"); + if (askYesNo()) + { + item.say("The confused gargoyle waves good-bye."); + sayGoodbye2(item); + UI_clear_item_flag(item, MET); + return; + } + else + IOLO.say("@As you wish, " + polite_title + ".@"); + IOLO.hide(); + } + + } + + var options = ["name", "job", "bye"]; + + converse(options) + { + + case "name"(remove): + say("@No name. I Beh Lem.@"); + + case "job"(remove): + say("@I wait here. Captain Johne come.@"); + + case "speak"(remove): + say("@Captain Johne teach I human speak,@ the gargoyle says haltingly."); + + + case "bye": + say("The confused gargoyle waves good-bye."); + UI_clear_item_flag(item, MET); + sayGoodbye2(item); + break; + } + + } + else //has read gargish scroll already + { + if (inParty(BEHLEM)) + { + item.say("@To ask how I can help, mighty " + player_name + ",@ Beh Lem asks."); + if (!UI_get_item_flag(VALKADESH, MET)) + add("directions"); + + } + else if (!UI_get_item_flag(BEHLEM, PETRA)) //PETRA flag used to denote first time talked to after using scroll + { + item.say("@To greet you, human. To recognize you as the False Prophet!@"); + add(["False Prophet"]); + UI_set_item_flag(BEHLEM, PETRA); //sets PETRA flag as met. + } + else + { + item.say("@Good " + time_of_day + ", my " + greeting + ".@"); + if (!UI_get_item_flag(VALKADESH, MET)) + { + item.say("@To have met Valkadesh yet?@"); + add("directions"); + } + + } + + var options = ["name", "job", "bye"]; + + if (joined_party_before) + add (["join", "leave"]); +/////////////////////////////////////////////////// after scroll has been read + converse(options) + { + // After Avatar has read the gargoyle scroll set by gflag READ_GARGISH_SCROLL + case "name"(remove): + say("@To be called Beh Lem, which means 'just one.' To have not received a true name.@"); + add(["true"]); + + case "Captain Johne"(remove): + say("@To know Captain Johne! To help him and Valkedesh in their work,@ the youngster says proudly."); + add(["Valkadesh"]); + + case "true"(remove): + say("@To not receive a true name until I have proved myself worthy.@"); + add(["worthy"]); + + case "worthy"(remove): + say("@To not deserve a name yet. But to get one someday, just like my father Valkadesh!@"); + add(["Valkadesh"]); + + + case "job"(remove): + if (inParty(BEHLEM)) + { + say("@To be here to help you, noble " + player_name + ".@"); + } + else + { + say("@To be here to wait for Captain Johne.@"); + add(["Captain Johne"]); + } + + case "False Prophet"(remove): + say("@To be feared by everybody - everybody except me and Valkadesh, my father!@"); + add(["Valkadesh"]); + + case "Valkadesh"(remove): + say("@To very much respect Valkadesh my father.@*"); + say("@To want to be a scholar someday just like him!@"); + if (!inParty(BEHLEM) && (!UI_get_item_flag(VALKADESH, MET))) + { + say("@To wish to meet Valkadesh?@"); + if(askYesNo()) + { + say("@To go with you and guide you there!@"); + if (partynum > 7 ) + { + say("@To wish very much to join you. But to not have enough room in your party for another.@"); + PARTYMEMBER.say("@Avatar, I'll return to the surface and let everyone know of our progress.@");//interject with someone to leave + PARTYMEMBER.hide(); + //add code to drop goods at feet + UI_remove_from_party(PARTYMEMBER); + say("The little gargoyle eagerly joins your group."); + UI_add_to_party(item); + + script PARTYMEMBER after 3 ticks say "@Farewell!@"; + + UI_set_schedule_type(PARTYMEMBER, PATROL); + UI_set_item_flag(PARTYMEMBER, SI_LIZARD_KING); //"brand" the party member so egg can find it to move back to mainland. + gflags[SIXTH_MEMBER_LEAVES] = true; + + } + else + { + say("The little gargoyle eagerly joins your group."); + UI_add_to_party(item); + } + add(["guide"]); + + } + else + say("@Oh.@ The little gargoyle seems saddened."); + } + + case "directions"(remove): + say("@To go from the entrance to Hythloth westward, following the @mountains.@*"); + say("@Then to turn north, at the Hall of Knowledge.@*"); + say("@To walk east along the mountains until you come to a narrow pass.@*"); + say("@To find the house of Valkadesh through the pass!@*"); + say("@To see it at 42 degrees south, 88 degrees east by the sextant.@*"); //changed with actual coords + say("@But to take care! To avoid the lava pits and the Hall of Knowledge!@*"); + say("@To understand these directions?@*"); + if(askYesNo()) + { + say("@Good!@"); + } + else say("@To ask what was unclear?@"); + add(["mountains", "Hall of Knowledge", "house","lava pits"]); + + case "guide"(remove): + say("@To go from the entrance to Hythloth westward, following the @mountains.@*"); + say("@Then to turn north, at the Hall of Knowledge.@*"); + say("@To walk east along the mountains until you come to a narrow pass.@*"); + say("@To find the house of Valkadesh through the pass!@*"); + say("@To see it at 40 degrees south, 65 degrees east by the sextant.@*"); //change with actual coords! + say("@But to take care! To avoid the lava pits and the Hall of Knowledge!@*"); + say("@To understand these directions?@*"); + if(askYesNo()) + { + say("@Good!@"); + } + else + say("@To ask what was unclear?@"); + add(["mountains", "Hall of Knowledge", "house","lava pits"]); + + case "mountains"(remove): + say("@To walk clockwise around the mountains from Hythloth to reach my father's house.@"); + + case "Hall of Knowledge"(remove): + if (!gflags[WEARING_AMULET_SUBMISSION]) //not yet submitted to Draxinusom + say("@To avoid the Hall! To talk to Valkadesh first!@"); + else + say("@To find the Hall of Knowledge to the south of the city.@"); + + case "house"(remove): + say("@To find the house of Valkadesh my father through the pass east of the Hall.@"); + + case "lava pits"(remove): + say("@To be in danger from the lava! To stay far away!@"); + + case "join"(remove): + if (!inParty(BEHLEM)) + { + if (partynum > 7 ) + { + say("@To wish very much to join you. But to not have enough room in your party for another.@"); + PARTYMEMBER.say("@Avatar, I'll return to the surface and let everyone know of our progress.@");//interject with someone to leave + PARTYMEMBER.hide(); + //get party member's position + var pos = UI_get_object_position(PARTYMEMBER); + //add code to drop goods at feet + dropAllItems(PARTYMEMBER, pos); + PARTYMEMBER->leaveParty(); + sayGoodbyeAbrupt(PARTYMEMBER, "@Farewell!@"); + say("The little gargoyle eagerly joins your group."); + UI_add_to_party(item); + + UI_set_item_flag(item, NAKED); //so you can ask him join/leave + + // UI_set_schedule_type(PARTYMEMBER, PATROL); + // UI_set_item_flag(PARTYMEMBER, SI_LIZARD_KING); //"brand" the party member so egg can find it to move back to mainland. + gflags[SIXTH_MEMBER_LEAVES] = true; + + + } + + } + else + say("@To already be in your party.@"); + + case "leave"(remove): + say("@To wish to stay with you!@*"); + say("@To not leave until there is peace between our races!@"); + + + case "bye": + var npc_goodbye; + if (inParty(BEHLEM)) + npc_goodbye = "@May our persistence and precision lead to success!@"; + else + npc_goodbye = "@May your persistence and precision lead to success!@"; + + avatar_goodbye = "@Thanks, Beh Lem.@"; + + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + + } //has read garg scroll + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Blaine.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Blaine.uc new file mode 100755 index 0000000..62b6e61 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Blaine.uc @@ -0,0 +1,220 @@ + +void Blaine object# (0x41b) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + /* + if (event == PROXIMITY) + { + //barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@Insert line here..@", 0); + delayedBark(item, "@Insert line here@", 8); + delayedBark(item, "@Insert line here@", 16); + } + else if (barks == 2) + delayedBark(item, "@Other lines...@", 2); + else + delayedBark(item, "@Other lines...@", 3); + } + */ + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, gypsy.@"; + npc_1st_greet = "@Good " + time_of_day + ".@"; + + av_2nd_greet = "@Blaine..@"; + npc_2nd_greet = "@Yes, Avatar?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A slightly built gypsy lad.*"); + if (inParty(BLAINE)) + { + item.say("@I knew it! You don't really want to have a gypsy around.@*"); + item.say("@You wish me to leave you now, right?@"); + if (askYesNo()) + { + item.say("@Fine. I'll be with my fellow gypsies if you change your mind.@"); + var pos = UI_get_object_position(BLAINE); + if (isEquipped(BLAINE, SHAPE_ANY)) + { + item.say("@I suppose you'll be wanting to keep all this equipment.*@"); + item.say("He leaves everything he was carrying in a pile on the ground."); + dropAllItems (BLAINE, pos); + } + + script item + call leaveParty, MOVE_NPC2; + sayGoodbyeAbrupt(item, "No one wants a gypsy around!"); + return; + } + else + { + item.say("@Oh, pardon my mistake. It's just that we gypsies often have trouble finding acceptance among the gorgios.@*"); + item.say("@I'm very grateful that you've given me the chance to come along on your quest.@"); + } + + + } + else if (gflags[KADOR_SAD] == true) + { + item.say("@Our dog did his best trick for you. You should show him some appreciation.@"); + sayGoodbyeAbrupt(item, "Apologize to Kador!"); + return; + + } + else + item.say("@Good " + time_of_day + ".@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + + case "name"(remove): + say("@I am called Blaine.@"); + + case "job"(remove): + say("@I am a juggler. But I would fain join thee and go adventuring.@"); + add(["juggler", "buy", "advice"]); + if (!(item in party)) + add("join"); + + + case "juggler"(remove): + say("@I charge five gold for juggling. Would you like to see some?@"); + if (askYesNo()) + { + if (hasGold(5)) + { + chargeGold(5); + say("The gypsy juggler takes three wands out of his knapsack and sets their ends afire. Tossing them into the air, he begins juggling."); + say("The pattern is elaborate, almost hypnotic as the tips of the wands describe great flaming arcs and spirals through the air. At regular intervals he tosses one around behind his back. Yet somehow it always finds its way back into the pattern with the other two, without missing a beat."); + say("At last he catches all three of the wands in one hand, waves them with a great flourish, and bows deeply before you. As he extinguishes the wands, he says @I hope you enjoyed the show.@"); + } + else + say("@Best check your purse.@"); + } + else + say("@Perhaps some other time.@"); + + + + + + case "advice"(remove): + say("@My advice will cost you a gold coin. What do you say?@"); + if (askYesNo()) + { + if (hasGold(1)) + { + chargeGold(1); + say("Almost due east of Iolo's hut there lives a powerful enchanter...@"); + if (!gflags[LEARNED_ABOUT_NICODEMUS]) //lets you ask others about Nicodemus + gflags[LEARNED_ABOUT_NICODEMUS] = true; + } + else + say("@Best check your purse.@"); + } + else + say("@Perhaps some other time.@"); + + + case "join" (remove): + say("@Do you want me to come with you?@"); + if (askYesNo()) + { + if (UI_get_array_size(party) < 6) + { + say("@I look forward to the many adventures we will share.@"); + UI_add_to_party(item); + sayGoodbye2(item); + return; + } + else + say("@I believe thou hast enough travellers for one group.@"); + } + else + say("@Okay. Let me know if you need my help later.@"); + + + case "bye": + say("@Here's a little tune to lighten your step on the road ahead.@"); + say("@'Said the youthful earl to the gypsy girl, As the moon was casting its silver shine: 'Dear little lady, my gypsy lady, Let me kiss those sweet lips of thine'.@"); + + avatar_goodbye = "@Thanks..@"; + npc_goodbye = "@Anytime, " + polite_title + "@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Dupre.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Dupre.uc new file mode 100755 index 0000000..405284b --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Dupre.uc @@ -0,0 +1,192 @@ +void Dupre object# (0x404) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var joined_party_before = UI_get_item_flag(item, PETRA); //allows join/leave + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Dupre..@"; + npc_1st_greet = "@Dupre..@"; + + av_2nd_greet = "@Yes, my friend?@"; + npc_2nd_greet = "@Yes, my friend?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + + item.say("You see a ruggedly handsome man, wearing a gleaming suit of armor."); + item.say("@Yes, " + player_name + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //if you met Smith, or asked Patrick or Taynith about ducks, or have received the rubber ducky from Daros, Dupre will mention ducks (a nod to ultima 2 apparently) + if (UI_get_item_flag(SMITH, MET) || gflags[ASK_ABOUT_DUCK] || gflags[GOT_DUCK]) + add("duck"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@It's Dupre - sounds like dew pray, remember?@"); + + case "job"(remove): + say("@Why, questing, of course! We've been on many a quest together, you and I.@"); + add(["quest", "join"]); + + case "quest"(remove): + say("@Yes, you've gone on some really fine ones. When you're not around I have to settle for rescuing damsels, finding grails, and the like.@"); + add(["damsels", "grails"]); + + case "damsels"(remove): + say("@It could be worse. Some of them are pretty eager to show their gratitude, if you know what I mean...@"); + add(["gratitude"]); + + case "grails"(remove): + say("@That's right. Lord British likes to keep grails around to use at his banquets, but he's always losing them.@"); + add(["banquets"]); + + case "gratitude"(remove): + say("@Wink wink, nudge nudge, say no more...@"); + + case "banquets"(remove): + say("@He'll throw us a fine feast if you can deal with the gargoyle invasion somehow.@"); + add(["gargoyles"]); + + case "gargoyles"(remove): + say("@They may be the toughest threat we've ever faced.@"); + + case "leave"(remove): + say("@Lord British gave me strict orders not to leave your side until this quest is complete. Besides, you know how I hate to miss a good quest.@"); + add(["I insist..."]); + + case "I insist..."(remove): + say("@If thou dost insist, I suppose I can step away for a while. But don't leave me in the lurch too long. Lord British will have mine head!@"); + say("@Shall I wait here or leave for a while?@"); + add(["wait here", "leave a while"]); + + case "join"(remove): + if (!inParty(item)) + { + if (UI_get_array_size(party) < 8) + { + say("@Gladly, let's get back to our quest.@"); + UI_add_to_party(item); + return; + } + else + say("@I'm afraid there is no room in thy party for me.@"); + } + else + say("@I've been with you since the start of this quest, haven't I?@"); + + case "duck"(remove): + say("@Please, let's not talk about ducks...@"); + + + case "leave"(remove): + say("@Lord British gave me strict orders not to leave your side until this quest is complete. Besides, you know how I hate to miss a good quest.@"); + add(["I insist..."]); + + case "I insist..."(remove): + say("@If thou dost insist, I suppose I can step away for a while. But don't leave me in the lurch too long. Lord British will have mine head!@"); + say("@Shall I wait here or leave for a while?@"); + + var choice = chooseFromMenu2(["wait here", "go home"]); + if (choice == "wait here") + { + say("@I shall wait here then. Shouldn't be too long, right?@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + sayGoodbye2(item); + + } + else + { + say("@I will wait for thee at the Blue Boar. Do hurry back, and we'll resume our quest.@"); + + UI_set_schedule_type(item, WANDER); + + //call leave party function + script item + call leaveParty, MOVE_NPC2; + sayGoodbye2(item); + } + break; + + + case "bye"(remove): + say("@Yes, enough chit chat. Let's go find some action!@"); + + avatar_goodbye = "@That is all for now..@"; + + npc_goodbye = "@Let us journey onward!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Gorn.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Gorn.uc new file mode 100755 index 0000000..14f59f9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Gorn.uc @@ -0,0 +1,194 @@ + +void Gorn object# (0x48a) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hail, warrior.@"; + npc_1st_greet = "@Ho, dere!@"; + + av_2nd_greet = "@Greetings, Gorn..@"; + npc_2nd_greet = "@Yes, Avatar?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (inParty(GORN)) + { + item.say("@Vy talk ven dere's fighting to do?@"); + add("leave"); + } + else if (!UI_get_item_flag(item, MET)) + { + item.say("A burly barbarian warrior.*"); + item.say("@Hail, " + polite_title + "! I haf heard of thy deeds, Avatar!@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Ho, Avatar, thou hast returned!@."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(SUTEK, MET)) + add("Sutek"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I be named Gorn, " + polite_title + ".@*"); + + case "job"(remove): + if (inParty(GORN)) + say("@I follow thee, " + polite_title + ". I haf no other job now.@"); + else + { + say("@I be a fighter, a homeless vanderer.@"); + say("@Here I vait until I find somevun else to trafel mit.@"); + } + add(["trafel"]); + + case "trafel"(remove): + say("@Ya, I like to trafel!@*"); + if (!inParty(GORN)) + { + say("@Much vould I like to vander again, but I haf no vun to trafel mit now.@*"); + say("@Somevun vill ask me to join mit them zooner or later.@*"); + add(["join"]); + } + + + + case "join"(remove): + if (partynum < 8) + { + say("@I vould be much happy to join mit thee, " + polite_title + ".@*"); + UI_add_to_party(item); + script item after 3 ticks say "@Vet us be ov!@"; + break; + } + else + say("@I vould be much happy to join mit thee, " + polite_title + ", but I dislike such large groups.@*"); + + + case "leave"(remove): + + if (!inParty(item)) + say("@But I vas here first, ya?@*"); + + else + { + say("@You vant me to leave? Shall I vait here or go home?@"); + converse(["wait here", "go home"]) + { + case "wait here": + say("@Very vell, I shall wait here for you to return.@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + sayGoodbyeAbrupt2(item, "I shall wait here for thee."); + return; + + case "go home": + say("@Ok, if that's vat you vant. Maybe I'll zee you later.@*"); + if (isEquipped(item, SHAPE_ANY)) + { + var pos = UI_get_object_position(item); + say("@You keep all zis stuff meanwhile, ya?@*"); + item.say("He leaves everything he was carrying in a pile on the ground."); + dropAllItems(item, pos); + } + + //function to make sure he goes back to proper map + script item + call leaveParty, MOVE_NPC2; + + avatar_goodbye = "@Goodbye, Gorn.@"; + npc_goodbye = "@Safe trafels, Avatar!@"; + sayGoodbye2(item); + + return; + } + } + + + + case "Sutek"(remove): + say("@Sutek is mad.@*"); + say("@He is very dangerous. I vould avoid him if I vere thee.@*"); + say("@But he does know many tings, und is sometimes helpful.@*"); + + + case "bye": + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@It is alvays a pleasure to talk mit thee.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Gwenno.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Gwenno.uc new file mode 100755 index 0000000..096f2c9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Gwenno.uc @@ -0,0 +1,229 @@ +void Gwenno object# (0x457) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var joined_party_before = UI_get_item_flag(item, PETRA); //allows join/leave + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, friend!@"; + npc_1st_greet = "@Avatar, hello!@"; + + av_2nd_greet = "@Gwenno..@"; + npc_2nd_greet = "@Yes, " + polite_title + "?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + + item.say("A plainly dressed bard."); + if (item in party) + item.say("@Is there something you needed to know?@"); + else + item.say("@Hello, " + player_name + ".@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + + if (item in party) + add("leave"); + + if (gflags[ASKED_SELGANOR_ABOUT_RUNE]) + add("tune"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@It's me, Gwenno. You have been away from our realm a long time, haven't you...@"); + + + case "job"(remove): + say("@Iolo's apprentice has taken over my job at Iolo's Bows.@"); + say("@These days I've been transcribing the folk songs of Britannia into numerical notation for the artisan's guild.@"); + if (item in party) + say("@Of course, helping you on your quest is more important than that right now.@"); + else + say("@Of course, if you need my help, I could leave the guild for a time and join you.@"); + add(["Iolo's Bows", "folk songs","notation", "Artisan's Guild", "join"]); + + + case "Artisan's Guild"(remove): + say("@Selganor can tell you more about the guild than I could.@"); + add(["Selganor"]); + + case "Selganor"(remove): + say("@He's the guildmaster.@"); + + + case "join"(remove): + + if (UI_get_array_size(party) > 6) + { + say("@You have enough travelling with you already. If you ask one of them to leave first, I'd be happy to join you.@"); + } + else + { + if (inParty(IOLO)) + { + say("She runs over and hooks arms with Iolo, and they dance around and around. They're obviously very happy to see each other again."); + UI_add_to_party(item); + sayGoodbye2(item); + } + else + { + say("@Okay! It will be nice to spend some time on the road again.@"); + UI_add_to_party(item); + + } + break; + } + + case "leave"(remove): + if (!item in party) + { + say("@I'd have to join you before I could leave, silly!@"); + } + else say("@Dost thou want me to wait here or should I go home?@"); + var pos = UI_get_object_position(item); + converse(["wait here", "go home"]) + { + case "wait here": + say("@Very well. I shall wait here until thou dost return.@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + sayGoodbyeAbrupt2(item, "I'll be waiting here for thee."); + return; + + case "go home": + say("@All right. I'll head back home to Minoc. Come let me know if you need me to join you again later. I'll leave all my things here - some of them might come in handy for you.@"); + dropAllItems (GWENNO, pos); + if (inParty(IOLO)) + say("She gives Iolo a big hug before she leaves. @Remember to keep your socks dry@, she says, @and I'll see you when the quest is done.@"); + script item + call leaveParty, MOVE_NPC2; + sayGoodbyeAbrupt(item, "Safe travels!"); + return; + + } + + + + case "folk songs"(remove): + say("@The songs of a people are an important part of their heritage. Putting them down on paper helps preserve our traditions for future generations.@"); + add(["traditions"]); + + case "traditions"(remove): + say("@I'm so glad you appreciate the value of tradition.@"); + + case "Iolo"(remove): + say("@A bit scruffy, but he's the sweetest husband I could ever ask for.@"); + if ((inParty(IOLO)) && (canTalk(IOLO))) + { + IOLO.say("@You're only saying that because it's true.@ He gives her a kiss.@"); + IOLO.hide(); + } + + case "Iolo's Bows"(remove): + say("@If you need a good crossbow, the shop is in Britain, over by the Blue Boar.@"); + add(["Blue Boar"]); + + case "Blue Boar"(remove): + say("@It's a lively place.@"); + + case "notation"(remove): + say("@A number for every note, and a note for every number.@"); + add(["note", "number"]); + + case "note"(remove): + say("@Each note is represented by one number@"); + add(["number"]); + + case "number"(remove): + say("@Each number represents one note.@"); + add(["represents"]); + + case "represents"(remove): + say("@I knew you'd catch on!@"); + + case "tune"(remove): + say("@Oh, Selganor sent you, did he? I bet you want to learn '@Stones.@"); //remove @ + add(["Stones"]); + + case "Stones"(remove): + say("@In the standard numerical notation, it reads '678987 8767653'.@"); + if (!gflags[LEARNED_STONES]) + gflags[LEARNED_STONES] = true; + //will probably change this quest to the SNES version, where the Avatar just learns how to play it. + + + case "bye"(remove): + avatar_goodbye = "@Goodbye, Gwenno.@"; + npc_goodbye = "@Nice talking with you.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Iolo.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Iolo.uc new file mode 100755 index 0000000..bcf0cee --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Iolo.uc @@ -0,0 +1,295 @@ +void Iolo object# (0x401) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var pos = UI_get_object_position(item); + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //for Iolo's money handling functions + var gold = UI_count_objects(PARTY, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + UI_error_message("Iolo counted " + gold + " gold coins in the party."); + + var spam = 0; //spam counter + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var joined_party_before = UI_get_item_flag(item, PETRA); //allows join/leave + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Iolo..@"; + npc_1st_greet = "@Yes, my friend?@"; + + av_2nd_greet = "@Iolo..@"; + npc_2nd_greet = "@Yes, Avatar?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + + item.say("Your old friend Iolo.*"); + item.say("@Well, " + player_name + ", do you need help with something? Or maybe you've got time for a story, eh?@"); + + //standard conversation options + var options = ["name", "job", "bye", "story", "leave", "gargoyles", "help"]; + + if (!inParty(IOLO)) + add (["join"]); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Iolo's the only name I remember having.@*"); + say("He pronounces his name 'Yo-low.'"); + + + case "job"(remove): + say("@I've been a crossbow maker for so long, I've gotten weary of it. Hopefully, now that my apprentice has taken over the shop, I'll be able to spend more time as a bard.@"); + add(["apprentice", "bard"]); + + case "apprentice"(remove): + say("@My shop still sells the finest crossbows in the land. I've done a lot over the years to refine the design, and I trained my apprentice well. I'm sure she'll carry on the tradition in fine fashion.@"); + + case "bard"(remove): + say("@Yes, it's always been a hobby of mine. Have you heard the piece 'Stones' that I composed some years ago?@"); + if (askYesNo()) + say("@It's one of my favorites.@"); + else + { + say("@Oh, you should get my wife Gwenno to teach it to you some time.@"); + add(["Gwenno"]); + } + + case "guild" (remove): + say("@Though there is still need for the instruments of war, as I grow in years I would now take up those of peace.@"); + + case "help"(remove): + say("@If you want me to gather all our gold together so you can carry it, just say so.@"); + add(["Spam", "gather"]); + + case "gather"(remove): + if (inParty(IOLO)) + { + if (gold > 0) + { + //get remaining gold + var gold_remaining = gold; + + //divide gold in remaining stacks of 100 first + // var gold_stacks = gold / 100; + + //delete all party gold first + chargeGold(gold); + + // UI_error_message("Iolo counted " + gold + " gold coins in the party after removing it to gether."); + + //re-add gold + UI_add_party_items(gold_remaining, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY, false); + + + + // UI_error_message("Iolo re-added" + gold + " gold coins to the party."); + + //re-distribute party gold to the Avatar, as much that can be carried + say("Iolo gathers up everyone's gold and hands it to you."); + + } + else + say("@None of us are carrying any gold, " + polite_title + ".@"); + + } + else + say("@Maybe you should ask me to join the party first.@"); + + case "Spam"(remove): + if (spam == 2) + { + say("@Ask Shamino about that.@"); + add(["humbug"]); + } + else + { + say("@Ask Shamino about that.@"); + spam = (spam + 1); + add(["Spam"]); + } + + + case "Gwenno"(remove): + say("@She's had more time to develop her musical talents than I all these years. But after this quest I hope to join her in Minoc and enter the artisan's guild.@"); + add(["Minoc", "guild", "quest"]); + + case "Minoc"(remove): + say("@Not as big as Britain, but it's a peaceful town.@"); + add(["Britain"]); + + + case "humbug"(remove): + say("@Avatar, thou knowest I do not condone cheating, however, it's much easier just to use the F2 Cheat menu in Exult...@"); + + case "quest"(remove): + say("@There always seems to be a quest when you come to visit us, doesn't there? Some time you should just drop by for tea.@"); + add(["tea", "home"]); + + case "tea"(remove): + say("@All right, make it Frasier's Folly, then.@"); + add(["Frasier's Folly"]); + + case "Frasier's Folly"(remove): + say("@A drink worthy enough to greet an old friend.@"); + + case "Britain"(remove): + say("@You know. Where Mr. Nose hangs out.@"); + if (!gflags[MR_NOSE]) //can now ask LB of his nickname + gflags[MR_NOSE] = true; + add(["Mr. Nose"]); + + + case "Mr. Nose"(remove): + say("@Remember, he doesn't like people to call him that...@"); + + case "gargoyles"(remove): + say("@They're pretty ugly looking, if you ask me...@"); + + case "leave"(remove): + say("@His nibs, the king, told me I should stay with you constantly. I'll make an exception when you have to relieve yourself, of course.@"); + add(["exception"]); + + case "home"(remove): + say("@My hut is in the Deep Forest, south of Yew. My horse Smith lives there.@"); + + case "story"(remove): + say("@My favorite one is about the time I had to wake Dupre up for a tournament...@"); + if (isNearby(DUPRE)) + { + DUPRE.say("Dupre cuts in. @Iolo! You promised NEVER to tell anyone about that!@"); + DUPRE.hide(); + say("@Yes, you're right. I'm sorry.@ He whispers to you, @Ask me later when he's not around...@"); + } + else + say("@But maybe I shouldn't tell you about that. After all, I did promise...@"); + + + case "join"(remove): + if (!inParty(IOLO)) + { + say("@It's about time, " + player_name + ". I'm ready to get back to adventuring.@"); + if (UI_get_array_size(party) < 8) + { + UI_add_to_party(item); + sayGoodbyeAbrupt(item, "Let us be off!"); + } + else + say("@You have enough travelling with you already. But if you ask one of them to leave first, I'd be happy to join you.@"); + + } + else + say("@I've been with you since we saved you from those gargoyles, haven't I?@"); // If all ready in the party + + + + + + + case "exception"(remove): + say("@Is it absolutely imperitive that I should leave you?@"); + if (askYesNo()) + { + say("@Alright then, if thou insists. Should I wait a little bit here or should I go home?@"); + converse(["wait here", "go home"]) + { + case "wait here": + say("@Very well. I shall wait here until thou dost finish taking care of business...@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + sayGoodbyeAbrupt(item, "I shall wait here for thee."); + //UI_clear_item_flag(item, READ); + // delayedBark(item, "I shall wait here for thee.", 2); + return; + + case "go home": + say("@Okay. I suppose I can go home and make sure Smith still has plenty of hay. My hut is just outside of Empath Abbey. Don't take too long, as I am disobeying direct orders from Lord British...@"); + say("Iolo turns to leave, looking somewhat dejected."); // + //purge of items + dropAllItems (IOLO, pos); + + script item + call leaveParty, MOVE_NPC2; + sayGoodbyeAbrupt(item, "Don't take too long.."); + return; + } + + } + else + say("@Well, I shall stay with you then.@"); + + + + case "bye"(remove): + say("@I've still got to tell you that story about Dupre sometime...@"); + + avatar_goodbye = "@That is all for now, friend.@"; + npc_goodbye = "@Remind me about the story later..@"; + + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Jaana.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Jaana.uc new file mode 100755 index 0000000..3dc3ba0 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Jaana.uc @@ -0,0 +1,217 @@ +void Jaana object# (0x405) () +{ + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var avatar_goodbye = "@Replace with Avatar's goodbye bark@"; + var npc_goodbye = "@Replace with npc's goodbye bark@"; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var janna_left = UI_get_item_flag(item, SI_ZOMBIE); + var janna_in_party = UI_get_item_flag(item, IN_PARTY); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, my friend..@"; + var npc_1st_greet = "@Avatar! Thou hast returned!@"; + + var av_2nd_greet = "@Jaana..@"; + var npc_2nd_greet = "@Yes, " + polite_title + "?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (inParty(JAANA)) + { + item.say("@I fear I know little that would help in this situation, " + polite_title + ".@"); + + } + else if (janna_left)//already told her to leave + { + item.say("@Good " + time_of_day + ", " + polite_title + ". Hast thou need of my services again?@"); + if (askYesNo()) + item.say("@Ask me to join and I will, gladly, " + polite_title + "!@"); + else + item.say("@Very well. Thou needst but ask...@"); + + } + + else if (!UI_get_item_flag(item, MET)) + { + item.say("You see the druidess Jaana."); + item.say("@Avatar! 'Tis a great joy and relief to see thou hast returned to Britannia!@"); + if (partynum > 1) + item.say("She greets your other traveling companions. Everyone seems pleased to be reunited, albeit under tense circumstances."); + item.say("@Mayhap I can help thee in thy struggle against the gargoyles. Thou needst but ask and I will gladly join.@"); + UI_set_item_flag(item, MET); + } + else + { + item.say("@Good " + time_of_day + ", " + polite_title + "! Hast thou fared well in thy travels?@"); + if (askYesNo()) + item.say("@Joyous news! Thou must tell me of it sometime.@"); + else + item.say("@Mayhap I could help. Ask me to join thy band, " + polite_title + ", and gladly I will!@"); + + } + + //standard conversation options + var options = ["name", "job", "join", "bye"]; + + // if (UI_get_item_flag(item, IN_PARTY)) + + if (inParty(JAANA)) + add ("leave"); + + if (UI_get_item_flag(NICODEMUS, MET) || gflags[LEARNED_ABOUT_NICODEMUS]) //asked Thairand about him + add ("Nicodemus"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Why, my name's Jaana, " + polite_title + ". Surely my help in thy previous quests was not so insignificant that thou hast forgotten it!@"); + + + case "job"(remove): + say("@Since thy last visit to Britannia, I have lived in Yew, blessing crops and tending to sick animals.@"); + say("@Though I know 'tis unbecoming of a simple druid to do so, I miss the excitement of our quests together!@*"); + if (!janna_in_party) + { + say("@I would gladly join thee, " + player_name + ", if thou had a use for my skills.@"); + } + + case "Nicodemus"(remove): + say("@I've heard that Nicodemus the enchanter lives between two rivers.@"); + + case "gargoyles"(remove): + say("@I know little of the gargoyles, Avatar, save what rumors I hear. But I know that the gargoyles are fierce fighters, and a great threat to the land!@"); + + + case "join" (remove): + if (!inParty(JAANA)) + { + if (partynum < 6) + { + say("@Gladly, " + player_name + "!@"); + say("@I look forward to the many adventures we will share.@"); + UI_add_to_party(item); + UI_set_item_flag(item, IN_PARTY); + add(["leave"]); + } + else + say("@Nay, " + player_name + ", thou seemst to have enough companions as it is. Mayhap if one of them left your band, thou might have more need of me.@"); + } + else + say("@Surely I misunderstand thee, " + polite_title + ". Am I not already a member of thy band?@"); + + case "leave" (remove): + + if (inParty(JAANA)) + { + + say("@Whatever thou thinkest best, " + player_name + ".@"); + say("@Dost thou want me to wait here or should I go home?@"); + converse(["wait here", "go home"]) + { + case "wait here": + say("@Very well. I shall wait here until thou dost return.@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + UI_clear_item_flag(item, READ); + sayGoodbyeAbrupt2(item, "I shall wait here for thee."); + return; + + case "go home": + say("@I shall be waiting in Yew if thou needest my help later.@"); + if (isEquipped(item, SHAPE_ANY)) + { + var pos = UI_get_object_position(item); + say("@Thou mayst keep my supplies.@ She leaves everything he was carrying in a pile on the ground."); + dropAllItems(item, pos); + + //function to make sure she goes back to proper map + script item + call leaveParty, MOVE_NPC2; + + avatar_goodbye = "@Goodbye Jaana.@"; + npc_goodbye = "@Farewell, Avatar!@"; + sayGoodbye2(item); + + } + return; + } + + } + else + say("@Perhaps I misunderstand, " + polite_title + ". I cannot leave thy party since I am not in it!@"); + + case "bye": + if (!janna_in_party) + { + say("@Farewell! Return when thou hast more news of thy quest!@"); + avatar_goodbye = "@Goodbye, Jaana!@"; + npc_goodbye = "@Safe travels to thee!@"; + + } + else + { + avatar_goodbye = "@Let us be going now..@"; + npc_goodbye = "@May the virtues guide us in our quest!@"; + + } + + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Julia.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Julia.uc new file mode 100755 index 0000000..ccedc99 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Julia.uc @@ -0,0 +1,297 @@ +var juliaInHouse(var location) +{ + //Rect of Julia's house - + var top_left = [1921, 0225]; + var bottom_right = [1950, 0238]; + + if ((location[X] >= top_left[X] && location[X] <= bottom_right[X]) && (location[Y] >= top_left[Y] && location[Y] <= bottom_right[Y])) + return true; + else + return false; + +} + + +void Julia object# (0x408) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + var title; + + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var joined_party_before = UI_get_item_flag(item, PETRA); //allows join/leave + + //for Julia's leave conversation - won't leave party if shes in her house. + var julia_location = UI_get_object_position(item); + + //var on_water = UI_is_water([julia_location]); + var on_water = UI_is_water([julia_location[X], julia_location[Y], 1]); + + UI_error_message("On water is: " + on_water); + if (on_water) + UI_error_message("Julia is on water"); + else + UI_error_message("Julia is NOT on water"); + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + pronoun = "she"; + title = "her ladyship"; + } + else + { + pronoun = "he"; + title = "his lordship"; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, my friend..@"; + npc_1st_greet = "@Ach! 'Tis the Avatar!@"; + + av_2nd_greet = "@Hello, Julia.@"; + npc_2nd_greet = "@Yes?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (inParty(item)) + { + item.say("@Aye, and wha' can ye be askin' of me?@*"); + item.say("@Sure an' I don't think I can be helpin' ya with this!@"); + } + else if (gflags[ASKED_JULIA_TO_LEAVE]) + { + item.say("@Aye, so the great Avatar deigns to return, does " + pronoun + "? Well, what does " + title + " want now?@"); + + } + else if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("A sturdy woman with calloused hands and a loud manner.*"); + item.say("@Well, then the rumors are true!@*"); + item.say("@'Tis well and good that ye have returned to our land, Avatar!@"); + + } + else + item.say("@Well met, Avatar. An' what can I be doin' for ye this " + time_of_day + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (joined_party_before) + add (["join", "leave"]); + + if (inParty(item)) + add("leave"); + + + //learned that Julia can make panpipes from Selganor + if (gflags[ASKED_SELGANOR_ABOUT_RUNE]) + add("panpipes"); + + //global flags to add that give new convo options: + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Sure and you're goin' daft, " + polite_title + ". I be named Julia, same as the last time we met!@"); + + case "job": + say("@Instruments I make, the finest in the land.@*"); + if (!item in party) + say("@For now, though, I'm followin' ye, and glad to do it!@"); + + else + { + say("@Not to be immodest, but I'm respected by all the Guild!@*"); + say("@Ach, but give it all up I would for a life of adventure like your own...@"); + add(["Guild", "adventure"]); + } + + case "Guild"(remove): + say("@If ye would like to be a member too, go talk to Selganor.@"); + add(["Selganor"]); + + case "adventure"(remove): + say("@Aye, I'd join you if ye wish.@"); + add(["join"]); + + + case "Selganor" (remove): + say("@He's the guildmaster.@"); + + + case "panpipes"(remove): + say("@Sent you to me they did? Aye, I can believe that.@*"); + say("@Now the panpipes are a tricky instrument. You gotta have the finest wood.@*"); + say("@If you want to learn how to make pipes, you'll need to bring a yew board.@*"); + say("@But it must be freshly cut!@"); + add(["board", "cut"]); + + case "board"(remove): + say("@Do ye have a fine yew board for me today?@"); + if (askYesNo()) + { + if (UI_count_objects(PARTY, SHAPE_YEW_BOARD, QUALITY_ANY, FRAME_ANY) > 0) + { + say("@Ach, aye, and good wood it is, too. A fine set of pipes this will make!@*"); + say("Julia sets the wood down on a bench and starts carving. As you watch, the rough board slowly turns into smooth wood rods.*"); + say("Then she hollows out each rod and pegs them all together. Lastly, she notches each tube and cuts them all to the proper lengths.*"); + say("@An' there it is, " + polite_title + ", a set of panpipes fit for any bard in the land!@*"); + say("She hands you the finished pipes."); + UI_remove_party_items(1, SHAPE_YEW_BOARD, QUALITY_ANY, FRAME_ANY, true); + UI_add_party_items(1, SHAPE_PANPIPES, QUALITY_ANY, FRAME_ANY, true); + } + else + say("@Well where is it? I canna see any board on ye!@"); + } + else + { + say("@No? What are ye, daft? I canna be makin' pipes without wood!@*"); + say("@Go to Yew where they grow the best wood in Britannia. Buy a freshly-cut yew log and take it to a sawmill.@*"); + say("@Have 'em cut it into a board, and bring it back here. Then I'll show ye how panpipes are made!@"); + } + + case "cut"(remove): + say("@Go to Yew where they grow the best wood in Britannia. Buy a freshly-cut yew log and take it to a sawmill.@*"); + say("@Have 'em cut it into a board, and bring it back here. Then I'll show ye how panpipes are made!@"); + + case "join"(remove): + say("@Join ye? Me?@*"); + if (item in party) + { + say("@I'm already in your band! Though now I'm not so sure I want to be led by a crazy person...@"); + } + else if (gflags[ASKED_JULIA_TO_LEAVE]) + { + say("@Aye, and be dumped off in the middle of nowhere again?@*"); + say("@Not likely! Find some other sap to do your bidding!@"); + } + + else if (UI_get_array_size(party) < 8) + { + say("@Aye, gladly!@"); + UI_add_to_party(item); + sayGoodbyeAbrupt(item, "Let's be on our way!"); + break; + + } + else + say("@Ach, I can tell that you say that to everyone ye meet. Ask me again when you haven't as many companions.@"); + + + + case "leave" (remove): + + //not inside Julia's house + if (!juliaInHouse(julia_location)) + { + var julia_location = UI_get_object_position(item); + if (UI_is_water([julia_location[X], julia_location[Y], 0])) //Julia is on the ship + { + say("@Leave?! And jump overboard?!@*"); + say("@Ach, I get it. You're makin' a wee joke!@"); + + } + else + { + say("@What? Oh, I suppose a craftsman isn't warrior enough to suit " + title + "'s tastes!@*"); + say("@Well, that's fine and dandy with me!@*"); + say("@A good day and a good bye to the lot of ye! I'm tired of carrying all this junk anyway!@"); + if (isEquipped(item, SHAPE_ANY)) + { + var pos = UI_get_object_position(item); + dropAllItems(item, pos); + } + gflags[ASKED_JULIA_TO_LEAVE] = true; + // + script item + call leaveParty, MOVE_NPC2; + + sayGoodbyeAbrupt(item, "Well, I never!"); + break; + } + } + else + say("@Leave! Nay, 'tis my house. You do the leavin'!@"); + + case "bye": + + if (item in party) + { + say("@Aye, enough chatting. On with our quest!@"); + sayGoodbye2(item); + break; + + } + else if (gflags[ASKED_JULIA_TO_LEAVE]) + { + say("@Ach, aye! I wouldna want to hinder " + title + "'s journey!@"); + sayGoodbyeAbrupt(item, "Hmmmfff!!"); + break; + } + else + { + avatar_goodbye = "@Farewell Julia..@"; + npc_goodbye = "@May fortune follow ye on thy way!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + + + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Katrina.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Katrina.uc new file mode 100755 index 0000000..8537735 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Katrina.uc @@ -0,0 +1,215 @@ +void Katrina object# (0x409) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var joined_party_before = UI_get_item_flag(item, PETRA); //allows join/leave + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + pronoun = "her"; + // title = "madame"; + } + else + { + pronoun = "him"; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hello, dear friend..@"; + npc_1st_greet = "@Avatar, thou hast returned!@"; + + av_2nd_greet = "@Katrina..@"; + npc_2nd_greet = "@Yes, " + player_name + "?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (item in party) + { + item.say("@I'm but a simple peasant, " + polite_title + ".@"); + item.say("@I doubt I could help in this situation.@"); + } + else if (joined_party_before) + { + item.say("@Good " + time_of_day + ", " + polite_title + ". Wilt thou allow me to follow you again?@*"); + if (askYesNo()) + { + item.say("@Command me to join and I will, " + polite_title + ".@"); + add(["join"]); + } + else + item.say("@As thou deem best, " + polite_title + ".@"); + + } + else if(UI_get_item_flag(item, MET)) + { + item.say("The humble peasant Katrina.*"); + item.say("@" + player_name + "! I had heard that thou hadst returned to our land, but I dared not believe it! Hast thou returned to save our land from the gargoyles?@"); + if (askYesNo()) + { + item.say("@Then surely we are saved already!@"); + } + else + item.say("@Then perhaps the crisis is not so severe as rumors say. If there is aught a humble peasant might do to aid thy quest, " + polite_title + ", I am yours to command.@"); + } + else + { + item.say("@Good " + time_of_day + ", " + polite_title + "! I hope thou hast fared well in thy travels?@"); + if (askYesNo()) + { + item.say("@The land rejoices when all is well with the Avatar.@"); + } + else + item.say("@If there is aught a humble peasant can do to help, I am yours to command.@"); + } + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (joined_party_before) + add (["join", "leave"]); + + if (UI_get_item_flag(ANTONIO, SI_ZOMBIE)) + add ("humility"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am called Katrina, " + polite_title + ", as I was the last time we met.@"); + + case "job"(remove): + say("@Times have changed, " + polite_title + ". Where once I grazed sheep, now I till the land. All work is the same to a peasant, " + polite_title + ". We all do what is expected of us.@"); + say("@If thou wouldst have me join thy quest, thou needst but ask.@"); + add(["join"]); + + case "join"(remove): + if (!inParty(item)) + { + if (UI_get_array_size(party) < 8) + { + say("@Since thou dost think it wise, I wilt join. I hope I can aid thy quest.@"); + UI_add_to_party(item); + sayGoodbyeAbrupt(item, "Glad to adventure with thee again!"); + if (!UI_get_item_flag(item, PETRA)) //to allow join / leave options again + UI_set_item_flag(item, PETRA); + break; + } + else + { + say("@I hesitate to deny any request thou might have.@"); + say("@But thou seemst to have enough companions as it is. Mayhap if one of them left your band, thou might have more need of me..@"); + } + } + else + say("@Surely I misunderstand thee, " + polite_title + ". Am I not already a member of thy band?@"); + + + case "leave"(remove): + item.say("@Should I wait here thee here, or go home to New Magincia?@"); + var choice = chooseFromMenu2(["wait here", "go home"]); + if (choice == "wait here") + { + say("@Very well, I shall wait here for you to return.@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + sayGoodbye2(item); + } + else + { + if (isEquipped(item, SHAPE_ANY)) + { + var pos = UI_get_object_position(item); + say("@Whatever thou thinkest best, " + polite_title + ". I'll leave my equipment with thee.@"); + say("She sets down everything she was carrying before walking off."); + dropAllItems(item, pos); + } + else + say("@Whatever thou thinkest best, " + polite_title + ".@"); + + script item + call leaveParty, MOVE_NPC2; + sayGoodbye2(item); + } + break; + + + case "gargoyles"(remove): + say("@The gargoyles are a grave threat to the land, " + polite_title + ". Many brave soldiers have died defending us from the invaders!@"); + + case "humility"(remove): + say("@I am most sorry, " + polite_title + ", but I cannot answer thy question. 'Twould be vain of me to answer truthfully, and 'twould be worse to lie.@"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) + UI_set_item_flag(item, SI_ZOMBIE); + + case "bye"(remove): + if (inParty(item)) + { + say("@May we live up to the trust placed in us.@"); + avatar_goodbye = "@Thanks, friend.@"; + npc_goodbye = "@Anytime, Avatar.@"; + } + else + { + say("@Farewell! The Avatar carries with " + pronoun + " the hopes of all the land.@"); + + avatar_goodbye = "@Thanks, friend.@"; + npc_goodbye = "@Anytime, Avatar.@"; + } + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Leodon.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Leodon.uc new file mode 100755 index 0000000..e6e5af3 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Leodon.uc @@ -0,0 +1,266 @@ +void Leodon object# (0x4dd) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var joined_party_before = UI_get_item_flag(item, PETRA); //allows join/leave + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == KID_GAMES) + { + var barks = ["@Who threw that?!@", + "@Oof!@", + "@Take that!@", + "@You call that a punch?!@", + "@I'll cut you, matey!@", + "@You spilled mine drink!@", + "@Ungh!@"]; + var rand_barks = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand_barks]); + + } + } + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me, miss..@"; + npc_1st_greet = "@Aye?@"; + + av_2nd_greet = "@Leonna..@"; + npc_2nd_greet = "@Aye, Avatar?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if ((UI_get_schedule_type(item) == KID_GAMES) && !inParty(item)) + { + item.say("@Not now, " + polite_title + "!@ She ducks a punch. @I'm busy!@"); + sayGoodbyeAbrupt(item, "@Take that!@"); + return; + } + + + if (inParty(item)) + { + item.say("@Yes, " + player_name + "?@"); + } + + else if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A woman with a slightly seaworn look, but delicate hands."); + + } + else + item.say("@A good " + time_of_day + " to you, " + polite_title + ". Come, have a seat and talk with us a while.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (joined_party_before) + add (["join", "leave"]); + + if (gflags[LEARNED_ABOUT_CAPT_JOHNE]) + add("Captain Johne"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm Captain Leodon.@"); + add(["captain"]); + + case "job"(remove): + say("@I'm captain of the Golden Hind.@"); + add(["Golden Hind"]); + + case "Golden Hind"(remove): + say("@Life on the sea is the only life for me. Alas, the Hind needs serious repairs just now.@"); + add(["sea", "repairs"]); + + case "repairs"(remove): + say("@Yes, I must keep myself occupied on land, meantime. Perhaps I could join thy party for a time.@"); + add(["join"]); + + case "sea"(remove): + say("@Ah, the sea. 'Tis as vast as a thousand dreams.@"); + add(["dreams"]); + + case "dreams"(remove): + say("@Indeed.@"); + + case "join"(remove): + if (!inParty(item)) + { + say("@The Golden Hind won't be repaired for months, at the soonest. Traveling with you would likely prove interesting. Would you like me to come along?@"); + if (askYesNo()) + { + if (UI_get_array_size(party) < 8) + { + say("@Very well. This should make a nice change from my usual routine. You might ask Leonna if she would like to join us as well.@"); + UI_add_to_party(item); + sayGoodbyeAbrupt(item, "Let us be off then!"); + if (!UI_get_item_flag(item, PETRA)) //to allow join / leave options again + UI_set_item_flag(item, PETRA); + break; + } + else + say("@You have enough travelling with you already. But if you ask one of them to leave first, I'd be happy to join you.@"); // Too many people in the party + } + else + say("@Okay. I'll be here if you change your mind.@"); + } + else + say("@I'd be glad to join you--but I have already!@"); // If all ready in the party + + case "leave"(remove): + say("@Has the time come for me to leave your crew?@"); + if (askYesNo()) + { + say("@Do you want me to wait here, or go home?@"); + converse(["wait here", "go home"]) + { + + case "wait here": + say("@Very well, I shall wait here for you to return.@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + sayGoodbyeAbrupt2(item, "I'll be right here, matey."); + break; + + case "go home": + if (isEquipped(item, SHAPE_ANY)) + { + var pos = UI_get_object_position(item); + say("@Okay. I think I'll head back to the Fallen Virgin, then. Here's all the equipment I was carrying, if you need it.@"); + say("She sets down everything she was carrying before walking off."); + dropAllItems(item, pos); + } + else + say("@Okay. I think I'll head back to the Fallen Virgin, then.@"); + script item + call leaveParty, MOVE_NPC2; + sayGoodbye2(item); + break; + } + } + + + else + say("@Well, I shall stay with you then.@"); + + + case "captain"(remove): + if ((isNearby(CAPTAIN_FOX)) || (isNearby(LEONNA)) || (isNearby(CAPTAIN_ELAD)) || (isNearby(HOMER))) + say("When you say 'Captain,' all the pirates at the table turn to you expectantly. When they realize you weren't talking to them, they return to their business."); // Said out loud. + + say("@You wouldn't be talking about Captain Johne would you?@"); + add(["Captain Johne"]); + + + case "Leonna"(remove): + say("@Aye, Leonna is the best first mate I've ever had.@"); + if (isNearby(LEONNA)) + { + LEONNA.say("@Leonna blushes and looks away, embarassed.@"); // + LEONNA.hide(); + } + say("@Comes from being a captain once herself, you know.@"); + + case "Captain Johne"(remove): + say("@That scallawag? He went down to the other side of the world to join up with the gargoyles, the dirty traitor...@"); + if (isNearby(CAPTAIN_ELAD)) + { + CAPTAIN_ELAD.say("The tea-drinker interrupts. @No, no, you've got it all wrong! I can tell you the truth about Captain Johne.@"); + CAPTAIN_ELAD.hide(); + } + add(["gargoyles"]); + + case "gargoyles"(remove): + say("@Vile creatures, they are. One of them attacked my ship once. He flew off with a ham before anyone could stop him.@"); + add(["ham"]); + + case "ham"(remove): + say("@Yes, he stole my ham, and I dined on biscuits that night.@"); + add(["biscuits"]); + + case "biscuits"(remove): + say("@That's right.@"); + + case "bye"(remove): + if (inParty(item)) + { + say("@Back to our quest, eh " + polite_title + "?@"); + avatar_goodbye = "@Nothing more..@"; + npc_goodbye = "@Lead on, matey.@"; + } + else + { + say("@Drop by again next time you're in town.@"); // If not in pary + + avatar_goodbye = "@Farewell..@"; + npc_goodbye = "@A pleasure, matey.@"; + } + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Leonna.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Leonna.uc new file mode 100755 index 0000000..cdbf527 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Leonna.uc @@ -0,0 +1,246 @@ +void Leonna object# (0x4df) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var joined_party_before = UI_get_item_flag(item, PETRA); //allows join/leave + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo +//delete if not needed: + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == KID_GAMES) + { + var barks = ["@Who threw that?!@", + "@Oof!@", + "@Take that!@", + "@You call that a punch?!@", + "@I'll cut you, matey!@", + "@You spilled mine drink!@", + "@Ungh!@"]; + var rand_barks = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand_barks]); + + } + } + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, milady..@"; + npc_1st_greet = "@Oh!@"; + + av_2nd_greet = "@Leonna..@"; + if (UI_get_schedule_type(item) != KID_GAMES) + npc_2nd_greet = "@Yes, Avatar?@"; + else + npc_2nd_greet = "@...@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if ((UI_get_schedule_type(item) == KID_GAMES) && !inParty(item)) + { + item.say("You fail to get her attention in the midst of the brawl."); + sayGoodbyeAbrupt(item, "@...@"); + return; + } + + + if (inParty(item)) + { + item.say("@Yes, " + player_name + "?@"); + } + else if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A smartly dressed woman. Her smile has a delightful subtlety to it."); + item.say("@Oh, you must be " + player_name + ", the famous Avatar! 'Tis an honor to meet thee.@*"); + } + else + item.say("Her face lights up as she recognizes you. @Hello again, " + player_name + "!@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (joined_party_before) + add (["join", "leave"]); + + //global flags to add that give new convo options: + if (gflags[LEARNED_ABOUT_CAPT_JOHNE]) + add("Captain Johne"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Leonna.@"); + + case "job"(remove): + say("@I used to captain my own ship. But I fell on hard times, and now I sail with Leodon on the Hind.@"); + add(["Leodon", "Golden Hind", "captain"]); + + case "Golden Hind"(remove): + say("@A fine old vessel, the Golden Hind. Alas, I have little to do while she's being repaired.@"); + add(["join"]); + + case "join" (remove): + if (!inParty(item)) + { + say("@Could I join your party, perhaps?@"); + if (askYesNo()) + { + if (UI_get_array_size(party) < 8) + { + say("@Oh good! I bet we'll meet a lot of interesting men...@"); + UI_add_to_party(item); + add(["leave"]); + } + else + say("@You have enough traveling with you already. But if you ask one of them to leave first, I'd be happy to join you.@"); // Too many people in the party + } + else + say("@Okay. I guess I'll just stay here for now.@"); + } + else + say("@I'd be glad to join you--but I have already!@"); + + case "leave"(remove): + say("@Has the time come for me to leave your crew?@"); + if (askYesNo()) + { + say("@Do you want me to wait here, or go home?@"); + converse(["wait here", "go home"]) + { + case"wait here": + say("@Very well, I shall wait here for you to return.@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + sayGoodbyeAbrupt2(item, "I shall wait here for thee."); + break; + + case "go home": + if (isEquipped(item, SHAPE_ANY)) + { + var pos = UI_get_object_position(item); + say("@Okay. I think I'll head back to the Fallen Virgin, then. Here's all the equipment I was carrying, if you need it.@"); + say("She sets down everything she was carrying before walking off."); + dropAllItems(item, pos); + } + else + say("@Okay. I think I'll head back to the Fallen Virgin, then.@"); + sayGoodbye2(item); + + //function to make sure she goes back to proper map + script item + call leaveParty, MOVE_NPC2; + break; + } + + } + else + say("@Well, I shall stay with you then.@"); + + + case "captain"(remove): + if ((isNearby(CAPTAIN_FOX)) || (isNearby(LEONNA)) || (isNearby(CAPTAIN_ELAD)) || (isNearby(HOMER))) + say("When you say 'Captain,' all the pirates at the table turn to you expectantly. When they realize you weren't talking to them, they return to their business."); // Said out loud. + + say("@You wouldn't be talking about Captain Johne would you?@"); + add(["Captain Johne"]); + + case "Leodon"(remove): + say("@There's none I'd rather ship out with.@"); + + case "Leonna"(remove): + say("@Aye, Leonna is the best first mate I've ever had.@"); + if (isNearby(LEONNA)) + { + LEONNA.say("@Leonna blushes and looks away, embarassed.@"); // + LEONNA.hide(); + } + say("@Comes from being a captain once herself, you know.@"); + + case "Captain Johne"(remove): + say("@Captain Johne is a madman! He went down in Hythloth seeking a way to the other side of the world. Said he was going to kill as many gargoyles as he could before they got him.@"); + if (isNearby(CAPTAIN_FOX)) + { + CAPTAIN_FOX.say("@That's not true!@ says Captain Fox. @I can tell you what really happened.@"); + CAPTAIN_FOX.hide(); + } + add(["gargoyles"]); + + + case "gargoyles"(remove): + say("@Please, let's not talk about them.@"); + + case "bye"(remove): + if (inParty(item)) + { + avatar_goodbye = "@Nothing more..@"; + npc_goodbye = "@Lead on, matey.@"; + } + else + { + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@Talk to you later!@"; + } + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Seggallion.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Seggallion.uc new file mode 100755 index 0000000..d92b4bb --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Seggallion.uc @@ -0,0 +1,242 @@ + +void Seggallion object# (0x4e8) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var av_2nd_greet; + var npc_1st_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + var in_party = UI_get_item_flag(item, IN_PARTY); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + //given it's own function leaveParty + //if (event == SCRIPTED) + //{ + // //Should be called if you try to make him leave on another map + // UI_move_object(item, [2883, 2826, 0, 0], true); + // UI_error_message("SCRIPTED event should be called"); + // return; + + //} + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hail, Knight!@"; + npc_1st_greet = "@Yes?@"; + + av_2nd_greet = "@Segallion..@"; + + if (in_party) + npc_2nd_greet = "@Am I standing in your light? Sorry.@"; + else + npc_2nd_greet = "@Yes, " + polite_title + "?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + if (!UI_get_schedule_type(item, WAIT)) + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A huge, muscled warrior with a sad look in his eyes.*"); + item.say("He looks at you imploringly. @What is it?@"); + UI_set_item_flag(item, MET); + } + else if (in_party) + item.say("@You have a question?@"); + else + item.say("He looks at you imploringly. @What is it?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (in_party) + add (["leave", "join"]); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + if (in_party) + say("@Seggallion. You can call me 'Segg' though.@"); + else + say("@Seggallion of...well now that won't mean anything to you.@"); + + case "job"(remove): + if (in_party) + say("He looks at you puzzled. @The same as yours now.@"); + else + say("@If you mean my profession, I would have to say a knight of Ashtalarea.@"); + add(["Ashtalarea"]); + + case "Ashtalarea"(remove): + if (in_party) + say("@Ask me again sometime. It is quite a story.@"); + else + { + say("@A land unfamiliar to you, I'm sure. Just as unfamiliar as yours is to me.@"); + add(["unfamiliar"]); + } + case "unfamiliar"(remove): + say("@Yes, I was walking in the mountains of Tyme when suddenly I heard a noise. It was dark and I heard this low growling. Having just been released from Pildar's clutches, I was tired and hungry.@"); + add(["Tyme", "Pildar"]); + + case "Tyme"(remove): + say("@That is a great range of mountains in my land. Wherever that is now.@"); + + case "Pildar"(remove): + say("@From what I hear, he is not unlike your Mondain. Anyway, I peered into the darkness but could see nothing. Suddenly a huge wall of blue flame appeared behind me.@"); + add(["blue flame"]); + + case "blue flame"(remove): + say("@Yes, blue like nothing I had seen in any spell. Anyway, just as I turned, the creature leapt from the woods. It hit me with such force, we both entered the blue flame together.@"); + add(["entered"]); + + case "entered"(remove): + say("@Well, it didn't burn us, we just fell through to the ground beyond it. After struggling for a while, I finally managed to kill it. That's when I wandered into this community.@"); + add(["community"]); + + case "community"(remove): + say("@The people of this land are brave and honorable. They fed and clothed me when I discovered that my gold was not the same as yours. I know it is a queer story, but true none the less.@"); + add(["queer"]); + + case "queer"(remove): + say("@Yes it is. Still, if I could I would like to join you on your quest. Perhaps one of the people in your land will know how to get me back to mine. If not, at least I can thank your people by assisting you.@"); + add(["join"]); + + case "join"(remove): + if (!in_party) + { + if (partynum < 8) + { + say("He bows low. @Seggallion at your service.@"); + say("You can see by his broad smile and large physique, he would be a worthy opponent. @Shall we be off then?@"); + UI_add_to_party(item); + sayGoodbyeAbrupt(item, "Lead on!"); + break; + } + else say("@I wish I could, however, you seem to have enough strong arms already. If any should leave though, seek me out.@"); + } + else + say("@You don't look seperated to me.@ He laughs heartily."); + + + + + + + + + + + case "leave"(remove): + say("@Do you want me to wait here, or go home?@"); + + converse(["wait here", "go home"]) + { + case "wait here": + say("@Very well, I shall wait here for you to return.@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + UI_clear_item_flag(item, READ); + sayGoodbyeAbrupt2(item, "I shall wait here for thee."); + return; + + case "go home": + if (isEquipped(item, SHAPE_ANY)) + { + var pos = UI_get_object_position(item); + item.say("@I'll leave all these things with you.*@"); + item.say("He leaves everything he was carrying in a pile on the ground."); + dropAllItems(item, pos); + } + say("@It is hard to say goodbye, but I see your path leads elsewhere, so...@"); + + //function to make sure he goes back to proper map + script item + call leaveParty, MOVE_NPC2; + + avatar_goodbye = "@Goodbye, Segallion.@"; + npc_goodbye = "@Good luck, Avatar..@"; + sayGoodbye2(item); + + + return; + } + + + + case "bye": + if (!in_party) + { + avatar_goodbye = "@Good luck, Seggallion!@"; + npc_goodbye = "@Farewell.@"; + } + else + { + avatar_goodbye = "@Let's get going..@"; + npc_goodbye = "@Lead on!@"; + } + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Sentri.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Sentri.uc new file mode 100755 index 0000000..65e2c2d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Sentri.uc @@ -0,0 +1,210 @@ +void Sentri object# (0x407) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var time_of_day; + var noun = "amie"; //for male/female + var title; + var pronoun; + +if ((hour >= 6) && (hour < 12)) //'good morning' +{ + time_of_day = "morning"; +} + +if ((hour >= 12) && (hour < 18)) //'good afternoon' + { + time_of_day = "afternoon"; + } +else time_of_day = "evening"; + + if (event == DOUBLECLICK) + { + + var met_sentri = get_item_flag(MET); + + //barks for Avatar + + if (!met_sentri) bark = "@Hello..@"; + else bark = "@Hello Sentri..@"; + + script AVATAR + { + call GenericFreeze; + face AVATAR->find_direction(item); + actor frame standing; + say bark; + wait 10; + }; + + + //NPC barks + if (!met_sentri) bark = "@'tis the Avatar!@"; + else bark = "@Greetings, Avatar!@"; + + script item + { + + call GenericFreeze; + + wait 5; + + face find_direction(AVATAR); + + actor frame standing; + + say bark; + + wait 8; + + call (Sentri); + + }; + + } + + + else if (event == SCRIPTED) + + { + + + //Unfreeze Avatar and ITEM: + + AVATAR->GenericUnfreeze(); + + item->GenericUnfreeze(); + + + + + + + player_name = getAvatarName(); + polite_title = getPoliteTitle(); + var player_is_female = UI_is_pc_female(); + + + if (item in party) + { + item.say("@Has the time come when your plans call for me to wait in reserve?@"); + if (askYesNo()) + { + if (UI_get_item_flag(AVATAR, ON_MOVING_BARGE)) + { + item.say("@Let's get our feet back on solid ground first, okay?@"); // leaving lines... + return; + } + else + { + item.say("@Should I wait here or go home?@"); + converse(["wait here", "go home"]) + { + case "wait here": + say("@Very well. I shall wait here until thou dost return.@*"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + return; + + case "go home": + item.say("@Then I shall go wait at Serpent's Hold until you need me again.@"); + if (isEquipped(item, SHAPE_ANY)) + { + var pos = UI_get_object_position(item); + item.say("@I'd best leave you my equipment in case you need it on your quest.*@"); + item.say("He leaves everything he was carrying in a pile on the ground."); + dropAllItems (item, pos); + } + + item->leaveParty(); + return; + } + } + + + } + else item.say("@Then let's be on about our mission!@"); + return; + }//item in party + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A handsome warrior.*"); + item.say("@" + player_name + "! You have come at last!@"); + + } + else + item.say("@Good " + time_of_day + ", " + player_name + ". I hope you have returned to ask me to join you.@"); + + var options = ["name", "job", "bye"]; + if (item in party) options = options & "leave"; + +//Variable conversation options based on global flags or people met. Remove if none///// +// if (gflags[GLOBAL_FLAG_HERE]) options = options & "Insert convo here" +// +// if (UI_get_item_flag(NPCNAME, MET)) +// add ("name of npc"); +// +// +///////////////////////////////////////////////////////////////////// + + + converse(options) + { + case "name"(remove): + say("@It is I, Sentri.@ He pronounces his name 'Sahn-tray'."); + + case "job"(remove): + say("@I have been waiting here for you. I heard you had returned, and knew you would come here eventually.@"); + add(["returned"]); + + case "returned"(remove): + say("@Britannia needs your help now more than ever before. Many have set out to fight the gargoyles already.@"); + add(["gargoyles"]); + + case "gargoyles"(remove): + say("@Not just the town guards, but any able bodied men that could be spared from their work. The battle goes poorly. But now that you are here, there is hope. I stand ready to join you.@"); + add(["join"]); + + case "join" (remove): + if (item in party) + { + say("@I have joined you already!@"); + } + else + { + + say("@Shall I join your party?@"); + if (askYesNo()) + { + if (UI_get_array_size(party) < 8) + { + say("@So be it. Now that we are together, surely the realm will be saved.@"); + UI_add_to_party(item); + + break; + } + else + say("@You have enough companions now. If you tell one of them to leave first, then I'll join you.@"); + } + else + say("@I bow to your wisdom. If you have need of me later, you have but to ask.@"); + } + + + + case "bye"(remove): + say("@If you should pass this way again, I will be here. I await but the opportunity to join you.@"); + break; + + + } +} +else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Shamino.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Shamino.uc new file mode 100755 index 0000000..ecc131b --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Party/Shamino.uc @@ -0,0 +1,191 @@ +void Shamino object# (0x403) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var joined_party_before = UI_get_item_flag(item, PETRA); //allows join/leave + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo +//delete if not needed: + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Shamino..@"; + npc_1st_greet = "@Yes, Avatar?@"; + + av_2nd_greet = "@Shamino..@"; + npc_2nd_greet = "@Yes, Avatar?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a quiet man, who almost seems to be a creature of the forest."); + item.say("@Yes, my friend?@"); + + } + item.say("@Yes, my friend?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (!inParty(SHAMINO)) + add("join"); + + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Shamino Salle' Dacil.@"); + + case "job"(remove): + say("@I help my friends when they need it. The rest of my time I prefer to spend exploring the woods.@"); + add(["friends", "woods"]); + + case "friends"(remove): + say("@Though we have spent much time apart between your several visits to our realm, still I consider you one of my closest friends.@"); + + case "woods"(remove): + say("@I prefer the Deep Forest. Spiritwood isn't as dense, and it has those strange wisps everywhere.@"); + add(["wisps", "Deep Forest"]); + + case "wisps"(remove): + say("@I know little of their nature. I believe there are some mages who have investigated them, however.@"); + add(["mages"]); + + case "Deep Forest"(remove): + say("@It is home to me. I love walking in the dark shadows of the trees, and studying the nature of the forest creatures.@"); + add(["home", "creatures"]); + + case "home"(remove): + say("@A home needs not walls to make it so.@"); + add(["walls"]); + + case "creatures"(remove): + say("@Those that dwell in the woods have lives of their own, more interesting to me than the ways of townfolk. There is much to be learned from the animals, if you will but listen.@"); + if(isNearby(DUPRE)) + { + DUPRE.say("@Now Shamino's going on about talking to animals... The whole world's going batty!@"); + DUPRE.hide(); + } + + case "walls"(remove): + say("@When folk ask why I have no walls in my home, I ask where are the trees in theirs!@ He smiles."); + add(["trees"]); + + case "trees"(remove): + say("@In many ways they are the lifesblood of the realm. Without trees, we could not long endure.@"); + + case "mages"(remove): + say("@Perhaps one of the members of the council could tell you more.@"); + + case "gargoyles"(remove): + say("@I feel that Lord British does not understand their true nature.@"); + add(["Lord British"]); + + case "Lord British"(remove): + say("@I know him better than you might think.@"); + + case "leave"(remove): + say("@I feel you need my guidance through the wild parts of Britannia. I'd best stay with you.@"); + add(["insist"]); + + case "insist": + say("@If you insist...Shall I wait for you here, or go home?@"); + converse(["wait here", "go home"]) + { + case "wait here": + say("Very well, " + player_name + ", I shall wait here until thy return.@"); + UI_remove_from_party(item); + UI_set_schedule_type(item, WAIT); + sayGoodbyeAbrupt(item, "I'll be right here.."); + return; + + case "go home": + say("@Perhaps I'll just wait for thee at the Blue Boar. I wouldn't want you to go through some unnecessary trouble finding me in the woods. Do thou return soon, who knows what the gargoyles will do next.@"); + script item + call leaveParty, MOVE_NPC2; + sayGoodbyeAbrupt(item, "I will head to the Blue Boar.."); + return; + + } + case "join" (remove): + say("@Gladly, " + player_name + "!@"); + if (UI_get_array_size(party) < 8) + { + say("@Gladly, " + player_name + ". Let's get going then.@"); + UI_add_to_party(item); + add(["leave"]); + } + else + say("@Nay, " + player_name + ", thou seemst to have enough companions as it is.@"); + + + case "bye"(remove): + avatar_goodbye = "@That is all, friend.@"; + npc_goodbye = "@A pleasure.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Arbeth.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Arbeth.uc new file mode 100755 index 0000000..893c4da --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Arbeth.uc @@ -0,0 +1,275 @@ + +void Arbeth object# (0x478) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == SEW) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + if (UI_get_schedule_type(item) == EAT_AT_INN) + { + UI_set_item_flag(item, IS_EATING); + UI_error_message("Is eating"); + } + var is_eating = UI_get_item_flag(item, IS_EATING); + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Well met, milord..@"; + npc_1st_greet = "@Y-y-yes, " + polite_title + "?@"; + + av_2nd_greet = "@Hello, Arbeth.@"; + npc_2nd_greet = "@Oh, 'tis only you. Hello again.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A frightened little man who never looks you in the eye.*"); + if (is_eating) + { + item.say("He looks up from his mug of ale."); + if (UI_get_item_flag(item, MET_2)) + item.say("@Oh, it's you. Hello.@"); + else + item.say("@Hello.@"); + + } + else + { + if (!UI_get_item_flag(item, MET_2)) + { + item.say("@Yes?@ he asks, looking like he expects to be beaten any minute."); + UI_set_item_flag(item, MET_2); + } + else + item.say("@Yes? Oh, it's you.@ He almost looked you in the eyes then."); + } + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(MORTUDE, MET)) + add ("Mortude"); + + if (UI_get_item_flag(TIMOTHY, MET)) + add ("Timothy"); + + if (UI_get_item_flag(MARISSA, MET)) + add ("Marissa"); + + if (UI_get_item_flag(GRISON, MET)) + add ("Grison"); + + if (UI_get_item_flag(DORIS, MET)) + add ("Doris"); + + if (UI_get_item_flag(HENDLE, MET)) + add ("Hendle"); + + if (UI_get_item_flag(UBERMON, MET)) + add ("Ubermon"); + + if (UI_get_item_flag(MERIDETH, MET)) + add ("Merideth"); + + if (gflags[READ_BALLOON_PLANS]) + add("silk thread"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + + case "name"(remove): + say("He looks around at the ground and mumbles @Arbeth.@"); + add(["Arbeth"]); + + case "job"(remove): + say("@Well,@ he says so quietly you have to lean close to hear, @I make wool into thread.@"); + add(["wool", "thread"]); + + case "Arbeth"(remove): + say("@Arbeth,@ he repeats quietly."); + + case "thread"(remove): + say("@Yes,@ he says, wringing his hands together."); + + case "weaver"(remove): + say("@I'm not a weaver, " + polite_title + ", just a spinner. Talk to Thindle.@"); + add(["Thindle"]); + + case "Thindle"(remove): + say("@He lives here in Paws and is a fine weaver.@"); + + case "silk thread"(remove): + + if (shop_is_open) + { + say("@What? Oh, yes, I could spin spider silk into thread. Do you want me to?@"); + if (askYesNo()) + { + say("@Tis a most difficult job, " + player_name + ". It'll cost thee 20 gold!@"); + say("@Still interested?@"); + if (askYesNo()) + { + if (hasGold(20)) + { + if ((UI_count_objects(PARTY, SHAPE_REAGENT, QUALITY_ANY, FRAME_SPIDER_SILK) >= 40)) + { + chargeGold(20); + UI_remove_party_items(40, SHAPE_REAGENT, QUALITY_ANY, FRAME_SPIDER_SILK, true); + say("Arbeth takes your gold and silk and starts spinning...*"); + say("Soon he has finished a spool of fine silk thread! @There it is, " + player_name + ", my finest work! A true pleasure!@ Arbeth hands you the spool of silk. @You'll have to find a weaver, of course...@"); + UI_add_party_items(1, SHAPE_SILK_THREAD, QUALITY_ANY, FRAME_ANY, true); + add(["weaver"]); + } + else + say("@Oh, but I'll need twoscore bits of spider silk to do it! Come back when thou hast 40 pieces of SPIDER_SILK and I'll make thy thread then.@"); + } + else + say("@You haven't the gold.@"); + } + else + say("@Oh. Sorry,@ he mumbles."); + } + else + say("@Oh. Sorry,@ he mumbles."); + } + else + say("@Not now, " + polite_title + ",@ he says timidly. @My shop is closed.@"); + + + + + + case "wool"(remove): + if (!shop_is_open) + { + say("@Not now, " + polite_title + ",@ he says timidly. @My shop is closed.@"); + } + else + { + if (UI_count_objects(PARTY, SHAPE_WOOL, QUALITY_ANY, FRAME_ANY) > 0) + { + say("@Will you take 6 gold for that wool?@"); + if (askYesNo()) + { + UI_remove_party_items(1, SHAPE_WOOL, QUALITY_ANY, FRAME_ANY, true); + say("He hands you 6 gold pieces and takes the bale of wool."); + giveGold(6); + } + say("@Nevermind, then.@"); + } + else + say("@None of you has any wool,@ he mutters."); + } + + case "Timothy"(remove): + say("@He is nice to me.@ he stops wringing his hands and seems to relax momentarily."); + + case "Mortude"(remove): + say("@He's much too loud.@ He looks up suddenly and his face goes ashen."); + add(["loud"]); + + case "loud"(remove): + say("@But...I mean...maybe not too loud.@ He whips his head around as if he's looking for someplace to hide."); + + case "Marissa"(remove): + say("@She's alright, I guess.@"); + + case "Doris"(remove): + say("@She's alright, I guess.@"); + + case "Grison"(remove): + say("@He's alright, I guess.@"); + + case "Hendle"(remove): + say("@He's alright, I guess.@"); + + case "Ubermon"(remove): + say("@He's alright, I guess.@"); + + case "Merideth"(remove): + say("A smile crosses his face. @I like her. She brought me cookies once.@"); + + + case "bye": + say("@Bye,@ he whispers."); + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@..Bye..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Dorin.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Dorin.uc new file mode 100755 index 0000000..c3cb919 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Dorin.uc @@ -0,0 +1,216 @@ + +void Dorin object# (0x47a) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + const int WOOL_SELL_PRICE = 5; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings..@"; + npc_1st_greet = "@Hello!@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@Ah, hello!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A plump older woman with an apron about her waist.*"); + if (!UI_get_item_flag(item, MET)) + { + item.say("@Hello,@ she says in a scratchy yet firm voice. @What can I do for ye?@"); + UI_set_item_flag(item, MET); + } + else + { + item.say("@Oh, good, you've come back. Perhaps for some pie?@ She smiles broadly."); + if (UI_get_item_flag(item, SI_ZOMBIE)) + { + item.say("@You're just in time, I baked one just for you!@ She gives you a freshly baked pie.@"); + UI_add_party_items(1, SHAPE_FOOD, QUALITY_ANY, 5, true); + UI_clear_item_flag(item, SI_ZOMBIE); //pie gone + } + add("pie"); + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(MORTUDE, MET)) + add ("Mortude"); + + if (UI_get_item_flag(TIMOTHY, MET)) + add ("Timothy"); + + if (UI_get_item_flag(MARISSA, MET)) + add ("Marissa"); + + if (UI_get_item_flag(MERIDETH, MET)) + add ("Merideth"); + + if (UI_get_item_flag(GRISON, MET)) + add ("Grison"); + + if (UI_get_item_flag(HENDLE, MET)) + add ("Hendle"); + + if (UI_get_item_flag(UBERMON, MET)) + add ("Ubermon"); + + if (UI_get_item_flag(ARBETH, MET)) + add ("Arbeth"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Dorin. Nice to meet you.@"); + add(["Dorin"]); + + case "job"(remove): + say("@At the moment, only Meri and I are here, so I guess I must conduct the business.@"); + add(["business"]); + + case "mother"(remove): + say("@She was a wonderful cook. Taught me all I know.@"); + + case "Dorin"(remove): + say("@It was my mother's name.@"); + add(["mother"]); + + case "business"(remove): + say("@We are shepherds. We sell wool.@"); + add(["wool"]); + + case "wool"(remove): + + say("@We charge 5 gold for a bale of wool. Would you like some?@"); + if (askYesNo()) + { + if (hasGold(WOOL_SELL_PRICE)) + { + if (UI_add_party_items(1, SHAPE_WOOL, QUALITY_ANY, FRAME_BALE, true)) + { + chargeGold(WOOL_SELL_PRICE); + say("@Very good.@ After accepting your gold, Dorin hands over the wool.@"); + } + else + say("@You look pretty full to me.@"); + } + else + say("@I'm sorry, but you don't seem to have enough money.@"); + + } + else + say("@You need only to ask.@"); + + case "Timothy"(remove): + say("@He and I like to care for the less fortunate people in town. I like him alot.@"); + + case "Mortude"(remove): + say("@Old Shorty, eh? He's actually quite a nice little man.@"); + + case "Marissa"(remove): + say("@A bit caught up in herself, but likable.@"); + + case "Arbeth"(remove): + say("@Poor little guy. He's afraid of the dark, or so I'm told.@"); + + case "Grison"(remove): + say("@He has the best flour in all the land.@"); + + case "Merideth"(remove): + say("@She's my little angel. If you see her around here, tell her I have errands to run.@"); + + case "Hendle"(remove): + say("She winces at his name. @He is a hard worker, but sometimes his smell is quite strong.@"); + + case "Ubermon"(remove): + say("@I like to go on walks with Uby. He has such an interesting life.@"); + + case "pie"(remove): + if (!UI_get_item_flag(item, PETRA)) + { + say("@Yes, I'm baking the nicest shepherd's pie right now. It's not done yet, but you can have a slice as soon as it is!@"); + UI_set_item_flag(item, SI_ZOMBIE); //will have pie ready next time + UI_set_item_flag(item, PETRA); //so you can ask about pie next time + } + + else + { + say("@Oh, dear, I'm afraid you just missed the last piece. But I'm baking another, and I'll be sure to save you a slice!@"); + UI_clear_item_flag(item, PETRA); + } + + + case "bye"(remove): + say("@She wipes her hand on her apron, and then waves it at you.@");; + avatar_goodbye = "@Farewell..@"; + npc_goodbye = "@Take care!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/DrCat.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/DrCat.uc new file mode 100755 index 0000000..925bbdf --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/DrCat.uc @@ -0,0 +1,369 @@ + +void Dr_Cat object# (0x47f) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var title; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + const int MEAD_PRICE = 3; + const int ALE_PRICE = 2; + const int WINE_PRICE = 5; + const int MUTTON_PRICE = 3; + const int MILK_PRICE = 5; + + const int FRAME_MILK = 7; + const int FRAME_BUCKET_MILK = 7; + + //Book Dr. Cat wants that is in Lycaeum + const int QUAL_SNILWIT = 7; + + //For NIM + + var wager; + var avatar_beads; + var dr_cat_beads; + var remaining; + var party_gold = countGold(party); + var turn; + + //Shopkeeper options + //sellFood(var npc, var food_drink_options, var prices, dialog) + + var food_drink_options =["nothing", "mead", "ale", "wine", "milk", "mutton"]; + var food_drink_frames = [FRAME_MEAD, FRAME_ALE, FRAME_WINE, FRAME_MILK, FRAME_MUTTON]; + var prices = [3, 2, 5, 3, 5]; + + var initial_choice_question = "@Which- ale, mead, wine, milk, or mutton?@*"; + var askIfInterested1 = "@That's "; //split into two to capture price + var askIfInterested2 = " crowns. Want some?@"; + var ask_quantity = "@How many do you want?@"; + var cant_afford = "@You can't afford it right now.@"; + var cant_hold = "@You haven't any room in your pack.@"; + var saidNo = "@Suit yourself.@"; + var success = "He gives you the "; + var success2 = "@Enjoy!@"; + var nothing = "@Anything else you need?"; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + if (player_is_female) + title = "princess"; + else + title = "prince"; + + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hail, barkeep.@"; + npc_1st_greet = "@Watch the cats..@"; + + av_2nd_greet = "@Dr. Cat..@"; + npc_2nd_greet = "@Welcome!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("An amused looking gentleman.*"); + + if (UI_get_schedule_type(item, TEND_SHOP) && isNearby(TAYNITH)) + { + item.say("@You'll have to excuse me, but the bar's closed right now.@*"); + item.say("@Taynith and I have a lot to talk about.@"); + delayedBark(AVATAR, "Mine apologies..", 0); + delayedBark(DR_CAT, "Come back tomorrow, friend.", 1); + return; + } + else if (isNearby(SHERRY)) + { + item.say("@Ah, I see you've brought me a tasty little mouse to feed my pets...@"); + SHERRY.say("@Eeeek!@"); + SHERRY.hide(); + item.say("@Don't worry, I was just kidding... Any friend of Lord British is a friend of mine.@"); + } + item.say("@Welcome to the Cat's Lair@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(TAYNITH, MET)) + add ("Taynith"); + + if (UI_get_item_flag(MANDRAKE, MET)) + add ("Mandrake"); + + if (gflags[ASK_ABOUT_DUCK]) //asked Taynith about duck + add ("duck"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name's Dr. Cat@"); + + case "patrons"(remove): + say("@This is a nice friendly town. All the townsfolk know each other. We get a lot of visitors, too.@"); + add(["visitors"]); + + case "visitors"(remove): + say("@I chose Paws for my tavern because it's right on the King's Way, midway between Britain and Trinsic. There's no better travelled spot in all Britannia, and that makes for good business.@"); + add(["Paws", "Britain", "Trinsic"]); + + case "Paws"(remove): + say("@I like the name of the town too, of course!@"); + + case "Britain"(remove): + say("@A nice place to visit, eh?@"); + + case "Trinsic"(remove): + say("@A bit too honorable for my tastes, if you know what I mean...@"); + + case "Taynith"(remove): + say("@Taynith is my dearest friend. Her gypsy band travels the King's Way. Once a week, she stops in to say hello.@"); + add(["gypsy"]); + + case "gypsy"(remove): + say("@Don't get the two gypsy bands mixed up... Taynith travels with Zoltan. The other group are a bunch of pickpockets and scallawags..@"); + add(["Zoltan"]); + + case "Zoltan"(remove): + say("@Yes, Zoltan, king of the gypsies!@"); + add(["king"]); + + case "king"(remove): + say("@I guess you can call yourself king of anything, if nobody comes along to dispute it...@"); + + case "duck"(remove): + if (UI_get_item_flag(item, CONFUSED)) //if first time asked about duck + { + say("@A friend of Taynith's, are you? Here, have one on the house.@"); + if (UI_add_party_items(1, SHAPE_BOTTLE, FRAME_ALE, QUALITY_ANY, true)) + { + say("He hands you an ale."); + UI_set_item_flag(item, CONFUSED); //gave bottle already + } + else + say("@You've got your hands full at the moment, ask me again later.@"); + } + say("@Taynith bet me one time I couldn't catch a duck with my bare hands. So I did, and had a leash made for it, so I could give it to her as a pet.@*"); + say("@I doubt she still has it, though. I saw Zoltan eyeing it hungrily...@"); + add(["Zoltan"]); + + case "purr"(remove): + say("@Very good! you purr almost as well as Kytyn.@"); + add(["Kytyn"]); + + case "Kytyn"(remove): + say("@She lives in Britain.@"); + + case "Mandrake"(remove): + say("@Are you friends of that deadbeat? He owes me for more drinks than I care to think about. The only reason I give him food and drink is because he can't sing with his mouth full!@"); // not sure of the reference or real name here??? + + case "job"(remove): + say("@I sell ale, mead, wine, milk, and mutton.@"); + say("@Of course I like to chat with my patrons, and indulge in a friendly game every now and then.@"); + add(["buy", "patrons", "game"]); + + case "cats"(remove): + say("@If you treat my cats well, they'll treat you the same.@*"); + + case "game"(remove): + say("@Thindle and Mortude may not agree, but I like a game that provides a little intellectual challenge.@"); + add(["Thindle and Mortude", "challenge"]); + + case "Thindle and Mortude"(remove): + say("@I'm sure they'd be glad to play a few rounds of flippits with you.@"); + if (!UI_get_item_flag(item, NAKED)) + { + add(["play"]); + } + + case "play"(remove): + say("@If only I had a copy of Snilwit's Big Book of Boardgame Strategy...@*"); + say("@Then I could find some really fine games to teach everyone.@"); + if (!UI_get_item_flag(item, NAKED)) + { + add(["Snilwit's Big Book of Boardgame Strategy"]); + } + + case "Snilwit's Big Book of Boardgame Strategy"(remove): + say("@Have you got a copy of Snilwit's that you'd be willing to sell?@"); + if (askYesNo()) + { + if (UI_count_objects(PARTY, 1171, QUAL_SNILWIT, FRAME_ANY > 1)) + { + if (giveGold(200)) + { + say("@Great! This is the definitive reference on boardgames. He takes the book and gives you 200 gold crowns.@"); + UI_remove_party_items(1, 1171, QUAL_SNILWIT, FRAME_ANY); + giveExperience(50); + UI_set_item_flag(item, NAKED); //so you can't ask him about it again + } + else say("@Put down some stuff, " + player_name + ", so you can carry some gold!@"); + } + else say("@You must be mistaken.@"); + } + else say("@That's too bad. I'd pay well for it.@"); + + + case "buy": + if (!shop_is_open) + { + say("@Come by the Cat's Lair when I'm open for business.@*"); + } + else + sellFood(DR_CAT, food_drink_options, prices, food_drink_frames, dialog); + + //NIM + case "challenge": + say("@I think I've got time for a quick game of Nim...@"); + if (UI_get_item_flag(DR_CAT, SI_ZOMBIE)) //already played once + say("@Would you like to play again?@"); + else + say("@Would you like to play?@"); + + if (askYesNo()) + { + say("@Would you care to wager on the outcome, just to keep things interesting?@"); + + //Recount party gold + party_gold = UI_count_objects(PARTY, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + + if (askYesNo()) + { + say("@Excellent!@"); + if (UI_get_item_flag(DR_CAT, PETRA)) //beat Dr cat already + { + say("@Tell you what... I'm in a reckless mood. This time you can bet as much as you like.@"); + } + say("@How much would you like to bet?@"); + wager = (UI_input_numeric_value(1, party_gold, 1, 1)); + + if (hasGold(wager)) + { + if (wager > 50) + { + //Haven't beat Dr. Cat yet + if (!UI_get_item_flag(DR_CAT, PETRA)) + { + say("@That's a little steep for a friendly game.@"); + say("@Let's just make it 50 crowns.@"); + wager = 50; + } + } + say("@Let me just remind you of the rules, in case you don't remember. We start with ten pieces.@ He takes some colorful glass beads out of his pocket.@"); + say("@Each player takes turns, taking one, two or three beads out of the pile. Whoever gets the last one wins!@"); + + //used to determine who goes first, mostly Dr Cat + turn = UI_get_random(5); + + // Determine who goes first + // In original, Dr. Cat mostly plays first. Always plays first if a flag is set when you beat him + + if (turn == 5) + DrCatRandom(wager); //Chance of beating Dr. Cat - more random in this round. + else if (turn <= 2) + AvatarFirst(wager); //Avatar chooses first, can beat him. + else + Dr_CatFirst(wager); //No chance to beat Dr. Cat - he always chooses 2. + } + else + say("@You don't have that much gold.@"); + + } + else + { + say("@Well, maybe after you've had a few practice games.@"); + wager = 0; + AvatarFirst(wager); + } + + + } + else + { + say("@Purrrrhaps some other time, then.@"); + //clear ZOMBIE flag + UI_clear_item_flag(DR_CAT, SI_ZOMBIE); + add(["purr"]); + } + + + case "bye": + say("@Good night, sweet " + title + ", and flights of angels tend thee to thy rest.@"); + avatar_bark = "@Goodbye!@"; + npc_bark = "@Come back soon!@"; + delayedBark(AVATAR, avatar_bark, 0); + delayedBark(DR_CAT, npc_bark, 2); + break; + + case "bye": + say("@Goodbye text if you want, otherwise delete for SI style goodbye barks@"); + + avatar_goodbye = "@Replace with Avatar's goodbye bark@"; + npc_goodbye = "@Replace with npc's goodbye bark@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Grison.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Grison.uc new file mode 100755 index 0000000..31963d0 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Grison.uc @@ -0,0 +1,254 @@ +void Grison object# (0x479) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //shopkeeper stuff + + const int SHAPE_SACK = 677; + + //SHOP PRICES + const int FLOUR_SELL_PRICE = 4; + const int GRAIN_BUY_PRICE = 3; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hail, milord..@"; + npc_1st_greet = "@Ptuh, what's that, " + polite_title + "?@"; + + av_2nd_greet = "@Greetings.@"; + npc_2nd_greet = "@Ptuh, ptuh..just a moment.@"; + + + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!shop_is_open) + { + item.say("A figure covered from head to toe with flour.*"); + item.say("@Ach, I'd like to talk with ya, but I've no time!@*"); + item.say("@Come see me at my gristmill some other time.@*"); + item.say("@'Tis hard work, but it gives me plenty of time to talk!@*"); + sayGoodbye2(item); + return; + } + else + { + if (!UI_get_item_flag(item, MET)) + { + item.say("A figure covered from head to toe with flour.*"); + item.say("@Ptuh... ptuh... hello..@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Hrmph... ptuh... hello again.@"); + } + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(MORTUDE, MET)) + add ("Mortude"); + + if (UI_get_item_flag(TIMOTHY, MET)) + add ("Timothy"); + + if (UI_get_item_flag(MARISSA, MET)) + add ("Marissa"); + + if (UI_get_item_flag(ARBETH, MET)) + add ("Arbeth"); + + if (UI_get_item_flag(DORIS, MET)) + add ("Doris"); + + if (UI_get_item_flag(HENDLE, MET)) + add ("Hendle"); + + if (UI_get_item_flag(UBERMON, MET)) + add ("Ubermon"); + + if (UI_get_item_flag(MERIDETH, MET)) + add ("Merideth"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Grison Fairfleth, at your service.@"); + add(["Grison Fairfleth"]); + + case "job"(remove): + say("@As you can see, I turn grain into flour. It's a pretty demanding job...and a bit messy too.@"); + add(["buy flour", "sell grain"]); + + case "Grison Fairfleth"(remove): + say("@You can call me 'Gris' if ya prefer.@"); + + + case "buy flour": + say("@I'll sell you a sack of flour for 4 gold. Is that okay?@"); + if (askYesNo()) + { + if (hasGold(FLOUR_SELL_PRICE)) + { + if (UI_add_party_items(1, SHAPE_KITCHEN_ITEMS, QUALITY_ANY, FRAME_FLOUR, true)) + { + chargeGold(FLOUR_SELL_PRICE); + say("@Excellent!@ Grison hands over the flour."); + } + else + say("@You look pretty full to me.@"); + } + else + say("@You can't afford it.@"); + } + else + say("@Suit yourself.@"); + + + + + case "sell grain": + say("@I'd buy some grain, if you had any.@"); + if (askYesNo()) + { + if ((UI_count_objects(PARTY, SHAPE_SACK, QUALITY_ANY, FRAME_ANY) > 0)) + { + say("@I'll pay you 3 crowns for that sack of grain, ok?@"); + if (askYesNo()) + { + giveGold(3); + say("@Done!@ He hands you 3 gold pieces and takes the sack.@"); + UI_remove_party_items(1, SHAPE_SACK, QUALITY_ANY, FRAME_ANY); + } + else + say("@Perhaps some other time, then.@"); + } + else + say("@But ya don't have any grain!@"); + } + else + say("@Suit yourself.@"); + + case "Timothy"(remove): + say("@He's a good fellow. I grew up with him.@"); + add(["grew up"]); + + case "grew up"(remove): + say("@Yep. We were mates.@ He continues to wipe the dust from his eyes."); + + case "Mortude"(remove): + say("@Shorty, ya mean? He's got a fair temper, I'll tell you that!@"); + + case "Marissa"(remove): + say("@She's one with a nose to the air instead of the grindstone.@ He chuckles to himself."); + + case "Arbeth"(remove): + say("@Scared of his own shadow, he is.@"); + + case "Dorin"(remove): + say("@She's baked many a pie with my flour.@"); + + case "Merideth"(remove): + say("@Meri the wisp, eh? She's sure a cutey.@"); + + case "Hendle"(remove): + say("@One o' the nicest gents I know. Always has a good tale.@"); + + case "Ubermon"(remove): + say("@A good, hard worker, that man. Has quite a strong grip too.@"); + + case "bye": + + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@Well, if that's all you need, goodbye.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Hendle.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Hendle.uc new file mode 100755 index 0000000..470e12e --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Hendle.uc @@ -0,0 +1,161 @@ +void Hendle object# (0x47c) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + const int FRAME_STEAK = 9; + + //Shopkeeper options + //Function: sellFood(var npc, var food_drink_options, var prices, dialog) + //[11, 7, 13, 9, 23]; + var food_drink_options =["nothing", "ham", "sausage", "steak", "ribs"]; + var food_drink_frames = [FRAME_HAM, FRAME_SAUSAGE, FRAME_STEAK, FRAME_RIBS]; + var prices = [3, 4, 8, 9]; + + //dialog options + var initial_choice_question = "@Which of these?@"; + var askIfInterested1 = "@Hendle smiles at you. @That will cost you "; //split into two to capture price + var askIfInterested2 = " gold coins, interested?@"; + var ask_quantity = "@How many?@"; + var cant_afford = "@You don't have enough gold, " + polite_title+".@"; + var cant_hold = "@You look pretty full to me, "+ polite_title +".@"; + var saidNo = "@Whatever.@"; + var success = "Excellent!@ After accepting your gold, Hendle hands over the "; + var success2 = "."; + var nothing = "@Perhaps some other time, then.@"; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + //Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "strangers"; + else + greeting = "stranger"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@whew, hello!@"; + npc_1st_greet = "@Smells, don't it?@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@'Ello, welcome back.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A man whose pungent smell greets you before he can.*"); + item.say("@Well, hello there " + greeting + "! Come for some meat?@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Back for more meat?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Hendle the Slaughterman.@"); + add(["Hendle"]); + + case "job"(remove): + if (shop_is_open) + say("@As ya can see, I slaughter the beef and pork which you can then buy.@"); + else + say("@I slaughter beef and pork. Makes me a bit unpopular 'ere in the pub!@ he laughs.@"); + add(["buy meat"]); + + case "buy meat"(remove): + if (!shop_is_open) + { + say("@Strewth! If I carried it around with me, I'd be even more unpopular!@*"); + say("He laughs, then continues, @Nay, friend, come to my shop later.@"); + say("@I'll fix ya up then.@"); + } + else + sellFood(item, food_drink_options, prices, food_drink_frames, dialog); + + case "bye": + + avatar_goodbye = "@Farewell!@"; + npc_goodbye = "@Be careful out there..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Marissa.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Marissa.uc new file mode 100755 index 0000000..5d8a5b7 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Marissa.uc @@ -0,0 +1,259 @@ +void Marissa object# (0x477) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + //SHOP PRICES + const int DRESS_SELL_PRICE = 30; + + const int FRAME_FINE_DRESS = 2; + const int FRAME_TUNIC = 0; + + const int TUNIC_SELL_PRICE = 15; + const int PANTS_SELL_PRICE = 20; + + + const int PANTS = 738; + const int FRAME_PANTS = 5; + + + + + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //shopkeeper stuff + + var price; + var item_choice; + var item_options = ["nothing", "fine dress", "smart tunic", "pair of pants"]; + var item_shapes = [SHAPE_TOP, SHAPE_TOP, SHAPE_PANTS]; + var item_prices = [DRESS_SELL_PRICE, TUNIC_SELL_PRICE, PANTS_SELL_PRICE]; + + var item_frames = [FRAME_FINE_DRESS, FRAME_TUNIC, FRAME_PANTS]; + // + + + //Dialog options + var initial_choice_question = "@Which one?@"; //arms or armor? etc + var ask_quantity = "@How many do you want?@"; + var askIfInterested1 = "@It'll cost you "; //needs to be split into array to capture price + var askIfInterested2 = " gold for that, interested?@"; + var cant_afford = "@How rude! Don't ask for something you can't pay for!@"; + var cant_hold = "@You look pretty full to me.@"; + var saidNo = "@Suit yourself,@ she sniffs, offended."; + var nothing = "@Okay then.@"; + var success = "@Excellent!@ After accepting your gold, Marissa hands over the "; + var success2 = "."; + + var title; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + title = "madame"; + } + else + { + // pronoun = " "; + title = "sir"; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me, miss..@"; + npc_1st_greet = "@Yes?@"; + + av_2nd_greet = "@Miss Trihune..@"; + npc_2nd_greet = "@Ah yes, hello.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A finely adorned woman with a tight mouth and wide eyes.*"); + if (!shop_is_open) + { + + item.say("She bows stiffly. @I'm sorry, good " + title + ", but my shop is closed for now.@*"); + item.say("@See me some other time, when I am available for business.@*"); + sayGoodbyeAbrupt(item, "@Come again tomorrow..@"); + return; + } + else + { + + if (!UI_get_item_flag(item, MET)) + { + item.say("@Hello.@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Hello again.@"); + item.say("She bows formally."); + } + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(ARBETH, MET)) + add ("Arbeth"); + + + if (gflags[READ_BALLOON_PLANS]) + { + add(["silk bag", "silk"]); + } + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Marissa. You may call me 'Miss Trihune'.@"); + add("Miss Trihune"); + + case "job"(remove): + say("@I create garments of the highest fashion.@"); + add("fashion"); + + case "Arbeth"(remove): + say("@Oh, he's a threadmaker who lives here in town. Silly little man, but a fine spinner.@*"); + say("@I get all my thread straight from him. No other source would do.@"); + + case "sell cloth": + if ((UI_count_objects(PARTY, SHAPE_CLOTH, QUALITY_ANY, FRAME_ANY) > 0)) + { + say("@Will you take 20 gold for that cloth?@"); + if (askYesNo()) + { + giveGold(20); + say("@Done!@ She hands you 20 gold pieces and takes the cloth.@"); + UI_remove_party_items(1, SHAPE_CLOTH, QUALITY_ANY, FRAME_ANY); + } + else + say("@Just as well. That cloth is rather shabby...@"); + } + else + say("@I don't see any cloth, other than what you're wearing!@"); + + case "Miss Trihune"(remove): + say("@Yes, that is much better.@"); + + case "bolt of silk"(remove): + say("@Yes, that silly Arbeth person can spin spidersilk into thread.@"); + say("@Charlotte, from New Magincia, weaves thread into silk cloth.@"); + say("@Bring me a bolt of her finest silk cloth, and then I can sew you a silk bag.@"); + + case "silk bag"(remove): + say("@Oh, I understand. A large silk bag.@"); + say("@Well, 'tis hardly a challenge for one of my skills. But, since it is important, I'll do it.@*"); + if ((UI_count_objects(PARTY, SHAPE_SCROLL, QUALITY_BALLOON_PLANS, FRAME_ANY) > 0)) //checks for baloon plans + { + if ((UI_count_objects(PARTY, SHAPE_SILK_CLOTH, QUALITY_ANY, FRAME_ANY) > 0)) //checks for silk cloth + { + say("@But it will cost you 75 gold. Alright?@"); + if (askYesNo()) + { + if (hasGold(75)) + { + chargeGold(75); + UI_remove_party_items(1, SHAPE_SILK_CLOTH, QUALITY_ANY, FRAME_ANY); + UI_add_party_items(1, SHAPE_BALLOON_BAG, QUALITY_ANY, FRAME_ANY); + say("She takes the silk cloth and begins to work, following the balloon plans.*"); + say("She works in silence, intent on her sewing. After a while, she completes the silk bag.*"); + say("@There,'tis done!@ she cries, handing you the bag."); + } + else + say("@Come back when you have the gold, " + player_name + ".@"); + } + else + say("@Very well,@ she sniffs, offended."); + } + else //no silk cloth + { + say("@But I'll need a bolt of silk to do it, of course.@"); + add(["bolt of silk", "silk"]); + } + + } + else + say("@But I'll need to see the plans.@"); + + case "silk"(remove): + say("@Yes, I can work with silk. But 'tis out of fashion...@*"); + say("@Nobody wears silk clothes this season.@"); + + + + case "bye": + say("@Yes, well, come see me again.@ She yawns widely."); + + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@See you soon..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Merideth.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Merideth.uc new file mode 100755 index 0000000..028ab94 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Merideth.uc @@ -0,0 +1,162 @@ +void Merideth object# (0x47b) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hello there!@"; + npc_1st_greet = "@..gulp...hello..@"; + + av_2nd_greet = "@Hi Meredith!@"; + npc_2nd_greet = "@Oh, hello again!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A little girl with a doll in her hands.*"); + if (!UI_get_item_flag(item, MET)) + { + item.say("@Now you be still, they won't hurt us.@ She hugs her doll close"); + UI_set_item_flag(item, MET); + } + else + item.say("@See, Becky, they've come back.@ she says to her doll."); + + item.say("@What do you want?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(MORTUDE, MET)) + add ("Mortude"); + + if (UI_get_item_flag(TIMOTHY, MET)) + add ("Timothy"); + + if (UI_get_item_flag(MARISSA, MET)) + add ("Marissa"); + + if (UI_get_item_flag(GRISON, MET)) + add ("Grison"); + + if (UI_get_item_flag(HENDLE, MET)) + add ("Hendle"); + + if (UI_get_item_flag(UBERMON, MET)) + add ("Ubermon"); + + if (UI_get_item_flag(ARBETH, MET)) + add ("Arbeth"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Merideth Cassandra Lamby!@"); + add(["great aunt"]); + + case "job"(remove): + say("@Oh, I don't work. My Memah can help you though.@"); + add(["Memah"]); + + case "great aunt"(remove): + say("@She lives far away.@"); + + case "Memah"(remove): + say("@My grandma. She's around here somewhere.@"); + + case "Timothy"(remove): + say("@He's a nice man. He got me this doll.@ She displays it proudly."); + + case "Mortude"(remove): + say("@He put a rope in a tree for me to swing on.@"); + + case "Marissa"(remove): + say("@She's a mean woman. Never plays dolls or nothin'.@"); + + case "Arbeth"(remove): + say("@He is my secret friend. He tells me stories.@"); + + case "Grison"(remove): + say("@I think he is a ghost. He's scary.@ She hugs her doll."); + + case "Hendle"(remove): + say("She wrinkles up her face. @He doesn't smell too good.@"); + + case "Ubermon"(remove): + say("@He brings my Memah flowers sometimes.@"); + + case "bye": + say("She waves her doll's hand at you and says @Bye.@"); + + avatar_goodbye = "@Goodbye, Meredith!@"; + npc_goodbye = "@Bye-bye.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Mortude.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Mortude.uc new file mode 100755 index 0000000..ac0a33f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Mortude.uc @@ -0,0 +1,179 @@ +void Mortude object# (0x476) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings..@"; + npc_1st_greet = "@Yeah?@"; + + av_2nd_greet = "@Excuse me..@"; + npc_2nd_greet = "@Eh, it's you again..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(MORTUDE, MET)) + { + item.say("A man nearly as wide as he is tall.*"); + item.say("@What?@ he grumbles."); + UI_set_item_flag(MORTUDE, MET); + } + + else + item.say("@What now?@ he sighs."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(THINDLE, MET)) + add ("Thindle"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@As the sign on my door reads, 'Mortude the Ropemaker'.@"); + add(["Mortude"]); + + case "job"(remove): + say("He looks at you and raises one eyebrow. @I said I makes rope.@"); + add("rope"); + + case "rope"(remove): + say("@The strongest you'll ever tug!@ he says, pushing out his chest."); + if (shop_is_open) + { + say("Mortude smiles at you, @For my fine rope it will cost you 5 gold. Interested?@"); + if (askYesNo()) + { + if (hasGold(5)) + { + if (UI_add_party_items(1, SHAPE_ROPE, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(5); + say("@Fine, fine!@ After accepting your gold, Mortude hands over the rope."); + } + else + say("@You can't carry it!@"); + } + else + say("@You don't have enough gold.@"); + } + else + say("@Too bad. You'll never find better rope.@"); + } + else + say("@Come to my shop when I'm open and I'll show you!@"); + + case "Thindle"(remove): + say("@He's a pretty good flippits, player.@"); + add(["flippits"]); + + case "Mortude"(remove): + say("@What?@ He snorts a bit then clears his throat."); + + case "flippits"(remove): + say("@You have a bone on ya? We'll play.@"); + + case "bone"(remove): + say("@An old dog bone or somethin'?@"); + add(["dog bone"]); + + case "dog bone"(remove): + say("@The smaller, the better. And maybe a hat. @"); + add(["hat"]); + + case "hat"(remove): + say("@A haaat,@ he repeats, mockingly. @Never played 'ave ya?@"); + if (askYesNo()) + say("@Doesn't seem like it.@"); + else + say("@Too bad.@"); // if answered no + + case "bye": + + avatar_goodbye = "@So long..@"; + npc_goodbye = "@..yeah yeah..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Patrick.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Patrick.uc new file mode 100755 index 0000000..8134f41 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Patrick.uc @@ -0,0 +1,179 @@ +void Patrick object# (0x473) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + var title; + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + title = "ma'am"; + } + else + { + // pronoun = " "; + title = "sirrah"; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hail, bard!@"; + npc_1st_greet = "@Hello!@"; + + av_2nd_greet = "@Hello again..@"; + npc_2nd_greet = "@Greetings, Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A colorfully garbed bard.*"); + item.say("@Good " + time_of_day + ", " + title + ".@*"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Patrick's the name. What's yours?@"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + say("@A pleasure.@"); + + case "job"(remove): + say("@Same as any bard - telling stories, singing songs, that sort of thing.@"); + add(["bard", "stories", "songs"]); + + case "bard"(remove): + say("@I was trained in the conservatory, like most of us.@"); + add(["conservatory"]); + + case "conservatory"(remove): + say("@Johann, Lazeena, Sionnach--they all studied there.@*"); + say("@Of course, there are always oddballs like Mandrake.@"); + add(["Johann", "Lazeena", "Sionnach", "Mandrake"]); + + case "Johann"(remove): + say("@A fine bard indeed.@"); + + case "Lazeena"(remove): + say("@A fine bard indeed.@"); + + case "Sionnach"(remove): + say("@A fine bard indeed.@"); + + + case "Mandrake"(remove): + say("@Completely self taught, he is. Got some odd ideas about the eight virtues.@*"); + say("@I have to give him credit, though...@*"); + say("@Last time we gathered together for a songwriting competition, he won first prize easily.@"); + add(["virtues"]); + + case "stories"(remove): + say("@Ok, here's one...@"); + say("@The owl and the pussycat sailed to sea..@*"); + say("@In a beautiful pea green boat.@*"); + say("@Along came a spider and sat down beside them,@*"); + say("@And the cat said 'Whose been sleeping in my bed!'@*"); + say("@The clock struck one, the owl fell down,@*"); + say("@And three little piggies went 'Wee wee wee wee wee' all the way home.@*"); + say("@I don't understand it at all, but Dr. Cat says that's his favorite story.@"); + add(["Dr. Cat"]); + + case "virtues"(remove): + say("@Ask him yourself.@"); + + case "Dr. Cat"(remove): + say("@He's a decent guy, and he doesn't water his drinks either.@*"); + say("@He told me I should learn a story with some ducks in it, though.@*"); + add(["ducks", "drinks"]); + + + case "ducks"(remove): + say("@Don't ask me. If he likes ducks that's his business.@"); + if (!gflags[ASK_ABOUT_DUCK]) + gflags[ASK_ABOUT_DUCK] = true; + + case "drinks"(remove): + say("@Being a bard can be thirsty work.@"); + add(["thirsty"]); + + case "thirsty"(remove): + say("@A warrior mustn't let his blade grow dull, right?@*"); + say("@Well, so also must a bard keep his throat from getting too dry!@"); + + + case "songs"(remove): + say("He clears his throat...*"); + say("@A lusty young smith at his feist stood a-firing,@*"); + say("@His hammer lay by but his forge still aglow,@*"); + say("@When to him a buxom young damsel came smiling,@*"); + say("@And asked if to work at her forge he would go.@"); + say("@With a jingle vang jingle vang jingle vang jingle,@*"); + say("@With a jingle vang jingle vang jingle hi ho.@"); + say("@'I will' said the smith and they went off together,@*"); + say("@Unto the young damsel's forge they did go.@*"); + say("@They stripped to go to it--'twas hot work and hot weather,@*"); + say("@She kindled the fire and she soon made him glow.@*"); + say("@With a jingle vang jingle vang jingle vang jingle,@*"); + say("@With a jingle vang jingle vang jingle hi ho!@*"); + say("@I hope you enjoyed the song!@"); + + + + case "bye": + + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@Fare thee well!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Thindle.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Thindle.uc new file mode 100755 index 0000000..549dc6b --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Thindle.uc @@ -0,0 +1,231 @@ +void Thindle object# (0x475) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + var FRAME_RAND; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == SEW) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hello..@"; + npc_1st_greet = "@Eh, what was that?@"; + + av_2nd_greet = "@Hello again.@"; + npc_2nd_greet = "@Ah!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A little, white haired man hunched over with age.*"); + if (!UI_get_item_flag(item, MET)) + { + item.say("@Yes, yes, yes,@ he says, bobbing his head up and down."); + UI_set_item_flag(item, MET); + } + else + item.say("@Back, back, back they come.@ He smiles to himself and claps his hands."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[READ_BALLOON_PLANS]) + add("silk"); + + + if (UI_get_item_flag(MORTUDE, MET) || UI_get_item_flag(item, SI_ZOMBIE)) + add ("Mortude"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Thindle the spindler.@ He grins at you."); + add(["Thindle"]); + + case "job"(remove): + say("@Sew, sew, I sew 'cause I said so.@"); + add(["sew"]); + + case "Thindle"(remove): + say("@Yes, yes, yes. That was quite a guess!@"); + + case "sew"(remove): + say("@Sew, sew, I sew 'cause I said so.@"); + add(["buy"]); + + case "buy"(remove): + if (!shop_is_open) + { + say("@Oh my, oh my, you must need cloth.@"); + say("@Come to my shop when I'm open and I'll sell you some!@"); + } + else + { + say("@Oh my, oh my, you must need cloth. It'll cost you 15 gold for the cloth. Interested?"); + if (askYesNo()) + { + if (hasGold(15)) + { + //re-roll random cloth frame + FRAME_RAND = UI_get_random(5); + say("@How many?@"); + var quantity = UI_input_numeric_value(1, 20, 1, 1); + if (UI_add_party_items(quantity, SHAPE_CLOTH, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(15*quantity); + say("@Excellent!@ After accepting your gold, Thindle hands over the cloth.@"); + UI_add_party_items(1, SHAPE_CLOTH, QUALITY_ANY, FRAME_RAND); + } + else + say("@You look pretty full to me.@"); + } + else + say("@No discounts, friend. Sorry.@"); + } + else + say("@Very well, but 'tis fine cloth, yes indeed...@"); + } + + + case "sell"(remove): + + if (!shop_is_open) + { + say("@Sell, now, its thread I feel.@"); + say("@Come to my shop when I'm open and I'll buy it.@"); + } + else + { + say("@Sell, now, its thread I feel.@"); + if ((UI_count_objects(PARTY, SHAPE_THREAD, QUALITY_ANY, FRAME_ANY) > 0)) + { + say("@Will you take 6 gold for that thread?@"); + if (askYesNo()) + { + giveGold(6); + say("@Done!@ He hands you 6 gold pieces and takes the thread.@"); + UI_remove_party_items(1, SHAPE_THREAD, QUALITY_ANY, FRAME_ANY); + } + else + say("@Very well, very well, I can see you don't want to sell.@"); + } + else + say("@Sorry, you don't have any thread.@"); + } + + + case "Mortude"(remove): + say("@Shorty is my friend. We play flippits together.@"); + add(["flippits"]); + + case "flippits"(remove): + say("@You should learn, you should learn. A nice piece of bone and a small hard pea--that's all ya need.@"); + add(["bone", "pea"]); + + case "bone"(remove): + say("@Like an old dog bone. You'll need a hat too.@"); + add(["hat"]); + + case "pea"(remove): + say("@The smaller, the better.@ He pulls an old bone from his pocket and a small pea. @Now you get a hat.@"); + add(["hat"]); + + case "hat"(remove): + say("He puts the hat down and mumbles @Put the pea in front of bone...@ He gestures with his hands. @...and flippit on home.@*"); + say("The pea sails into the hat."); + + case "silk"(remove): + say("@Silk? Oh no, oh no. Can't work silk, oh my, no. See Charlotte. She can, yes she can!@"); + add(["Charlotte"]); + + case "Charlotte"(remove): + say("@Humble Charlotte, yes. She can help you. She lives in New Magincia.@"); + + + case "bye"(remove): + + if (!UI_get_item_flag(item, SI_ZOMBIE)) //to add "Mortude" after talking to him first time + UI_set_item_flag(item, SI_ZOMBIE); + else + say("@Bye now. Bye. Say hi to Mortude if you see him.@"); + + avatar_goodbye = "@Farewell..@"; + npc_goodbye = "@Bye now.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Timothy.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Timothy.uc new file mode 100755 index 0000000..9d89a2e --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Timothy.uc @@ -0,0 +1,159 @@ +void Timothy object# (0x47e) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var TIMOTHY_PRICE = 5; + var charge = (TIMOTHY_PRICE * partynum); + + var pronoun; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, milord..@"; + npc_1st_greet = "@Welcome, welcome " + greeting + ".@"; + + av_2nd_greet = "@Hello again.@"; + npc_2nd_greet = "@Welcome back, my " + greeting + "@."; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A man with sea-blue eyes and a warm smile.*"); + item.say("Here for lodging this fine " + time_of_day +"?@"); + + //standard conversation options + var options = ["name", "job", "bye", "lodging"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Timothy.@ He flashes a friendly smile and nods.@"); + add(["Timothy"]); + + case "job"(remove): + say("@It is a busy one - this job, that is. I find it rewarding, though, meeting friendly faces. Maybe you want a room, eh?@"); + + case "lodging"(remove): + say("@" + charge + " gold for you to stay and have a meal, good?@"); // Yes/No Question + if (askYesNo()) + { + if (hasGold(charge)) + { + chargeGold(charge); + say("@Your room is upstairs on the right. Breakfast will be served in the morning and checkout time is 9am.@ Timothy hands you the key to your room."); + UI_add_party_items(1, SHAPE_KEY, QUALITY_TIMOTHY_INN, 3); + + } + else + say("@I'm sorry, but we require cash in advance for our rooms.@"); + } + else + say("@Perhaps some other time, then.@"); + + case "Timothy"(remove): + say("@I'm named after my uncle. He was a kind soul.@"); + add(["uncle"]); + + case "uncle"(remove): + say("@Sir Timothy Enders Daverstock. He was a famous knight in these parts.@"); + add(["knight"]); + + case "knight"(remove): + say("@He is perhaps best known for his courage in battle.@"); + add(["battle"]); + + case "battle"(remove): + say("@He once held off a score of men while his own fled to safety across a bridge.@"); + + case "bye": + + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@Farewell, " + greeting + ". Travel safely.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Ubermon.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Ubermon.uc new file mode 100755 index 0000000..5ad7372 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Paws/Ubermon.uc @@ -0,0 +1,176 @@ +void Ubermon object# (0x47d) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //SHOP PRICES + const int MILK_BUY_PRICE = 3; + const int CHEESE_BUY_PRICE = 5; + const int FRAME_MILK = 7; + const int FRAME_CHEESE = 26; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me..@"; + npc_1st_greet = "@Ja?@"; + + av_2nd_greet = "@Hello again..@"; + npc_2nd_greet = "@Ja, mein freund?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A tall man with a disarming grin.*"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) //"MET" flag doesn't work here for some reason + { + + item.say("Hello, mein freund.*"); + item.say("His thick fingers grab your hand."); + UI_set_item_flag(item, SI_ZOMBIE); + } + else + item.say("You are back. Gut.@ He leans back on his heels."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Ubermon Kalbmilch.@"); + add(["Ubermon"]); + + case "job"(remove): + say("@I milk de cows und make de cheese.@"); + if (UI_get_schedule_type(item) == TEND_SHOP) + { + say("@You vant to buy someting, just say de word.@"); + add(["buy"]); + } + else + say("@You vant to buy someting, come by my dairy ven I'm open.@"); + add(["buy"]); + + case "Ubermon"(remove): + say("@At your zervice.@ He snaps to attention."); + + case "buy"(remove): + if (UI_get_schedule_type(item) == TEND_SHOP) + { + say("@Ja, sure, vat you vant - milk or cheese?.@"); + add(["milk", "cheese"]); + } + else + say("@Come by my dairy ven I'm open, ja?@"); + + case "cheese": + say("@That'll be " + CHEESE_BUY_PRICE + " crowns, okay?@"); + if (askYesNo()) + { + if (hasGold(CHEESE_BUY_PRICE)) + { + if (UI_add_party_items(1, SHAPE_FOOD, QUALITY_ANY, FRAME_CHEESE, true)) + { + chargeGold(CHEESE_BUY_PRICE); + say("@Good!@ Ubermon gives you the cheese."); + } + else + say("@You don't have room to carry it.@"); + } + else + say("@You have not ze gold right now.@"); + } + else + say("@Vell, okay, but is very good for you!@"); + + case "milk": + say("@That'll be " + MILK_BUY_PRICE + " crowns, okay?@"); + if (askYesNo()) + { + if (hasGold(MILK_BUY_PRICE)) + { + if (UI_add_party_items(1, SHAPE_BOTTLE, QUALITY_ANY, FRAME_MILK, true)) + { + chargeGold(MILK_BUY_PRICE); + say("@Good!@ Ubermon gives you the milk."); + } + else + say("@You don't have room to carry it.@"); + } + else + say("@You have not ze gold right now.@"); + } + else + say("@Vell, okay, but is very good for you!@"); + + case "bye": + + avatar_goodbye = "@Farewell!@"; + npc_goodbye = "@Take care among ze British, now.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Amanda.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Amanda.uc new file mode 100755 index 0000000..890139a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Amanda.uc @@ -0,0 +1,174 @@ + +void Amanda object# (0x4f0) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Shopkeeper options + //Function: sellFood(var npc, var food_drink_options, var prices, dialog) + + + + var food_drink_options =["nothing", "mead", "waybread", "wine", "ale", "mutton"]; + var food_drink_frames = [FRAME_MEAD, FRAME_WAYBREAD, FRAME_WINE, FRAME_ALE, FRAME_MUTTON]; + var prices = [4, 2, 4, 4, 4]; + + //dialog options + var initial_choice_question = "@I sell ale, mead, wine, mutton and Waybread.@"; + var askIfInterested1 = "@That'll be "; //split into two to capture price + var askIfInterested2 = " crowns, okay sugar?@"; + var ask_quantity = "@How many?@"; + var cant_afford = "@Come back when you have some gold.@"; + var cant_hold = "@You don't have room to carry it.@"; + var saidNo = "@Anything else?@"; + var success = "Here you are. She gives you the "; + var success2 = "@That aught to hold you.@"; + var nothing = "@Very well. What'll it be then?@"; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + //Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me, miss..@"; + npc_1st_greet = "@Hello, hello!@"; + + av_2nd_greet = "@Hello again..@"; + npc_2nd_greet = "@Ahh, you're back!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + //UI_run_schedule(item); + UI_set_schedule_type(item, current_schedule); + UI_error_message("current schedule is set to " + current_schedule); + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A large black woman with a loud laugh.*"); + item.say("@Hello, hello!@ she cries, clapping her hands together.*"); + + } + else + item.say("@You're here again! Good.@ She smiles widely."); + item.say("@What can I get ya?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(SEGGALLION, MET)) + add ("Seggallion"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + + case "name"(remove): + say("@Amanda, but you can call me 'Miss Mandy'.@"); + add(["Amanda"]); + + case "job"(remove): + say("@I sell ale, mead, wine, mutton and Waybread.@"); + if (!shop_is_open) + say("@Come to my tavern during business hours and I'll be glad to serve you.@"); + else + add("buy"); + + case "Amanda"(remove): + say("@Please, call me 'Miss Mandy'.@"); + add(["Miss Mandy"]); + + case "Miss Mandy"(remove): + say("@There, that's much better.@"); + + + case "Seggallion"(remove): + say("@He's been in here a few times. He has a homesick look, he does.@"); + + + case "buy"(remove): + sellFood(AMANDA, food_drink_options, prices,food_drink_frames, dialog); + + + case "bye": + + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@Remember to tell your friends 'bout Miss Mandy!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Caradon.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Caradon.uc new file mode 100755 index 0000000..d5bc866 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Caradon.uc @@ -0,0 +1,117 @@ + +void Caradon object# (0x4ef) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Well met, Sir Knight..@"; + npc_1st_greet = "@Hello.@"; + + av_2nd_greet = "@@Sir Caradon..@"; + npc_2nd_greet = "@Hello, friend.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A paladin with a longsword on his back.*"); + item.say("@Good " + time_of_day + ", " + polite_title + ". How art thou?@*"); + item.say("@I am pleased to hear that thou art well. I wish I were healthy again.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Sir Caradon of Trinsic, at thy service.@"); + + case "job"(remove): + say("@I am a knight. Currently, though, I am recovering from a battle.@"); + add(["battle"]); + + case "battle"(remove): + say("@I've just come home from fighting in Yew. I fought gargoyles near the shrine.@"); + add(["shrine"]); + + case "shrine"(remove): + say("@There I was, with ten companions. Outside the Shrine of Justice stood two gargoyles. I saw them drink from little vials right before they charged us. Large, clumsy brutes they were. They should have been easy to dispatch...But they fought like cyclones!@*"); + say("@My captain ordered me to go to town for help when only we two and the gargoyles were left standing. Just as I was returning with some guards, I saw the monsters throwing my friends' dead bodies onto a fire. Then the gargoyles looked up at us and fell over, both dead.@"); + add(["dead"]); + + case "dead"(remove): + say("@Yes, just like that: all of a sudden! I only wish I could have killed them myself, for vengeance!@"); + add(["vengeance"]); + + case "vengeance"(remove): + say("@If they had not burned his body, my captain might have been resurrected. For a moment, Caradon looks ready to weep. The beasts!@"); + add(["beasts"]); + + case "beasts"(remove): + say("@Monsters with eyes like coals and skin like rock.@"); + + case "bye": + + + avatar_goodbye = "@Get well soon, friend.@"; + npc_goodbye = "Farewell, " + polite_title + "."; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/DeHugh.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/DeHugh.uc new file mode 100755 index 0000000..195c066 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/DeHugh.uc @@ -0,0 +1,173 @@ + +void DeHugh object# (0x4ed) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@A moment, milord..@"; + npc_1st_greet = "@Might we speak again?@"; + + av_2nd_greet = "@Yes?@"; + npc_2nd_greet = "@Yes?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + item.say("A commanding presence: a tall warrior in black armor.*"); + item.say("He stands and bows to you. @" + polite_title + ". Art thou a warrior?@*"); + if (askYesNo()) + { + item.say("@Good! I seek courageous warriors to accompany me.@"); + add(["courageous"]); + } + else + item.say("@Then why hast thou come to Serpent's Hold?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + + case "name"(remove): + say("@Who wants to know?@*"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + if (avatar_or_name == "I am the Avatar") + say("@Well, Avatar, I am Baron de Hugh.@"); + else + say("@Well, '" + player_name + "', I am Baron de Hugh.@"); + + case "job"(remove): + say("@I am a mercenary now.@"); + add(["mercenary"]); + + case "mercenary"(remove): + say("@First I shall gather an army.@"); + add(["army"]); + + case "army"(remove): + say("@I plan to build my reputation as a great fighter. My army and I will kill the mighty daemon Sin'Vraal!@"); + add(["Sin'Vraal"]); + + case "Sin'Vraal"(remove): + say("@He is a malevolent creature, lord over numerous servants who crawl about the desert.@"); + add(["desert"]); + + case "desert"(remove): + say("@It is on the north-eastern tip of Britannia. Look it up on a map.@"); + + case "courageous"(remove): + say("@It is foolish to be courageous unless one is backed by a well-trained force of fighters. Or unless one happens to be the Avatar, I imagine.@"); + add(["Avatar"]); + + case "Avatar"(remove): + say("@I heard at the guild that the Avatar was in town!@"); + add(["guild"]); + + case "guild"(remove): + say("@Koronada says I will be considered for membership when I have done something noteworthy. Have ye ever done aught worthy of note?@"); + if (askYesNo()) + { + say("@Then surely Koronada has heard of ye. Tell him your name and he may invite ye to join the Silver Serpent guild.@"); + if (!gflags[ASK_JOIN_OSS]) + gflags[ASK_JOIN_OSS] = true; + + } + else + say("@Well, actually, neither have I!@"); + add(["Koronada"]); + + case "Koronada"(remove): + say("@He is firm but fair. He does not wish to see any unworthy person bear the Silver Serpent blazon.@"); + add(["blazon", "Silver Serpent"]); + + case "Silver Serpent"(remove): + say("@I believe the silver serpent is a quick and highly venomous creature.@"); + + case "blazon"(remove): + say("@A blazon is a shield marking, such as a Serpent.@"); + + case "bye": + + avatar_goodbye = "@That is all..@"; + npc_goodbye = "@Good luck, " + polite_title + ".@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Gherick.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Gherick.uc new file mode 100755 index 0000000..30e708a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Gherick.uc @@ -0,0 +1,237 @@ + +void Gherick object# (0x4f2) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + + + + + if (UI_get_schedule_type(item) == BLACKSMITH || UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + var avatar_karma = getKarma(); + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + const int FRAME_GHERICK = 3; //for ghericks shield + + + + var price; + var item_choice; + var armor_options = ["nothing", "buckler", "door shield", "scale mail", "crested helm", "spiked shield"]; + var armor_shapes = [SHAPE_BUCKLER, SHAPE_DOOR_SHIELD, SHAPE_SCALE_MAIL, SHAPE_CRESTED_HELM, SHAPE_SPIKED_SHIELD]; + var armor_prices = [30, 40, 75, 20, 25, 10]; + + // + var weapon_options =["nothing", "halberd", "hammer", "morning star", "throwing axe", "two-handed axe"]; + var weapon_shapes = [SHAPE_HALBERD, SHAPE_HAMMER, SHAPE_MORNING_STAR, SHAPE_THROWING_AXE, SHAPE_2H_AXE]; + var weapon_prices = [100, 20, 40, 15, 50]; + + var sell_rate = 3; //integer to divide by when selling items back to npc + var sell_options = ["nothing", "buckler", "door shield", "scale mail", "crested helm", "spiked shield", "halberd", "hammer", "morning star", "throwing axe", "two-handed axe"]; + + //Dialog options + var initial_choice_question = "@Which of these?@"; //arms or armor? etc + var askIfInterested1 = "@That costs "; //needs to be split into array to capture price + var askIfInterested2 = " gold. Interested, " + polite_title + "?@"; + var cant_afford = "@Cost too much for you!@"; + var cant_hold = "@What's this? You can't carry it, " + polite_title + ".@"; + var saidNo = "@@But you don't got enough gold, " + polite_title + "!@"; + var nothing = "@What else can I get ya?@"; + var success = "@Good!@ After accepting your gold, he hands over the "; + var success2 = "."; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, milord.@"; + npc_1st_greet = "@Eh, what do you want?@"; + + av_2nd_greet = "@Hello again..@"; + npc_2nd_greet = "@Yeah?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A tall man, covered with scars and drooling uncontrollably.*"); + item.say("@What do you want?@*"); + } + else + item.say("@Back again?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[MAKE_SERPENT_SHIELD]) + add ("Serpent Shield"); + + if (UI_get_item_flag(SEGGALLION, MET)) + add ("Seggallion"); + + if (UI_get_item_flag(AMANDA, MET)) + add ("Amanda"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Gherick@"); + add(["Gherick"]); + + case "job"(remove): + say("@I makes the most hideous weapons!@"); + add(["buy", "sell", "hideous"]); + + case "Gherick"(remove): + say("@Are ya learnin' how ta speak or do ya need somethin'?@"); + + case "buy"(remove): + if (!shop_is_open) + { + say("@Come to my shop when I'm open!@"); + UI_error_message("shop_is_open is " + shop_is_open); + UI_error_message("Schedule is " + schedule); + //UI_error_message("Current schedule is " + current_schedule); + } + else + { + say("@I's a great craftsman, I is. Me shop is 'uge! You'll hafta be more specific: weapons or armor?@"); + add(["weapons", "armor"]); + } + + case "sell": + if (shop_is_open) + sellBackItems([armor_shapes, weapon_shapes], [sell_options], [armor_prices, weapon_prices], sell_rate); + else + say("@Come to me shop when it's open!@"); + + + case "weapons": + buyWeapons(item, weapon_options, weapon_prices, weapon_shapes, dialog); + + case "armor": + buyArmor(item, armor_options, armor_prices, armor_shapes, dialog); + + + case "Serpent Shield"(remove): + if ((!gflags[JOINED_OSS]) && (UI_count_objects(PARTY, SHAPE_MAGIC_SHIELD, QUALITY_ANY, FRAME_GHERICK) < 1)) + { + say("@Huh? Oh, yeah, da serpent shield.@ He looks around and then at the ceiling. @I needs a snake shield, a chunk o' gold, and a magic gem. Have ya got dese tings?@"); + if (askYesNo()) + { + if ((UI_count_objects(PARTY, SHAPE_HEATER_SHIELD, QUALITY_ANY, FRAME_ANY) > 0) && (UI_count_objects(PARTY, SHAPE_GOLD_NUGGET, QUALITY_ANY, FRAME_ANY) > 0) && (UI_count_objects(PARTY, SHAPE_GEM, QUALITY_ANY, FRAME_ANY) > 0)) + { + say("Gherick takes the items and goes to work in his forge. After a while, he returns.*"); + say("He holds up a beautiful golden shield that glows softly. @Here ya go. Just as promised.@"); + UI_remove_party_items(1, SHAPE_HEATER_SHIELD, QUALITY_ANY, FRAME_ANY, true); + UI_remove_party_items(1, SHAPE_GOLD_NUGGET, QUALITY_ANY, FRAME_ANY, true); + UI_remove_party_items(1, SHAPE_GEM, QUALITY_ANY, FRAME_ANY, true); + UI_add_party_items(1, SHAPE_MAGIC_SHIELD, QUALITY_ANY, FRAME_GHERICK, true); + } + else + say("@You ain't got all that I asked for.@"); + } + else + say("@Come back when ya do!@"); + } + else + say("@What, you gone daft? I already made ya one!@"); + + + case "hideous"(remove): + if (avatar_karma > 40) + say("@You ain't the sort what'd be interested.@"); // if (V_KARMA > 40) else + else + say("@I ain't gonna tell you, you'd steal me brilliant ideas!@"); + say("@I got some other stuff you could buy, though.@"); + add(["buy"]); + + case "Amanda"(remove): + say("@She's got the best food in the land. Go see for yerself.@"); + + case "Seggallion"(remove): + say("@A fine warrior. New to this area.@"); + + case "bye"(remove): + say("@Shut the door on yer way out@, he snarls."); + + avatar_goodbye = "@That is all..@"; + npc_goodbye = "@Shut the door!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Koranada.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Koranada.uc new file mode 100755 index 0000000..c0abe49 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Koranada.uc @@ -0,0 +1,234 @@ +void Koranada object# (0x4eb) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + const int FRAME_GHERICK = 3; //for shield + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "adventurers"; + else + greeting = "adventurer"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Might we speak?@"; + npc_1st_greet = "@Of course..@"; + + av_2nd_greet = "@Greetings, Sir..@"; + npc_2nd_greet = "@Greetings, Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (gflags[JOINED_OSS]) + item.say("@As guildmaster, I welcome thee in the name of the Order of the Silver Serpent.@"); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A dignified man wearing a loose jacket decorated with a serpent.*"); + item.say("@Hello " + greeting + "! As guildmaster, I welcome thee in the name of the Order of the Silver Serpent.@"); + item.say("@What is thy name?@*"); + var avatar_or_name = chooseFromMenu(["I am the Avatar", ("I am " + player_name)]); + if (avatar_or_name == "I am the Avatar") + say("@Well met, " + polite_title + " Avatar!@"); + else if (avatar_or_name == ("I am " + player_name)) + say("@Well met, " + polite_title + " " + player_name + "!@"); + + } + else + item.say("@It is good to see thee again, " + player_name + ".@"); + + var options = ["name", "job", "bye", "rune"]; + + if (gflags[ASK_JOIN_OSS]) + add("join Order"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Koranada, son of Kulebra. My father was a brave lighthouse keeper.@"); + + case "job"(remove): + say("@An earthquake destroyed the lighthouse, else I would have inherited the position of keeper in Greyhaven. I traveled to Serpent's Hold to join the Order instead.@"); + add(["Order", "join"]); + + case "Order"(remove): + say("@We stand for the principle of Courage.@"); + if (!gflags[JOINED_OSS]) //haven't joined OSS + { + if (gflags[ASK_JOIN_OSS]) //haven't asked to join yet + { + say("@Dost thou wish to join the Order of the Silver Serpent?@"); + if (askYesNo()) + { + say("@We would be greatly honored if thou wouldst join us, Avatar.@*"); + say("@Thy deeds speak well of thee, " + player_name + ". I shall waive the usual requirements since thy adventures are more than sufficient proof of thy courage.@*"); + say("@However, thou must still create thine own shield.@"); + gflags[ASK_JOIN_OSS] = false; + + //can ask Gherick to make the shield now + if (!gflags[MAKE_SERPENT_SHIELD]) + gflags[MAKE_SERPENT_SHIELD] = true; + + add(["Serpent shield", "courage"]); + } + else + say("@There will always be a place here for thee, " + polite_title + ".@"); + } + else + say("@Acquire a Silver Serpent shield and thou wilt be admitted to the order, " + polite_title + " " + player_name + ".@"); + } + + case "join Order"(remove): + if (gflags[JOINED_OSS]) + say("@We are honored by thy membership, worthy Avatar!@"); + + else + { + if (UI_count_objects(PARTY, SHAPE_MAGIC_SHIELD, QUALITY_ANY, FRAME_ANY) > 0) + { + if (UI_count_objects(PARTY, SHAPE_MAGIC_SHIELD, QUALITY_ANY, FRAME_GHERICK) > 0) + { + say("@We are honored by thy membership, worthy Avatar!@"); + giveExperience(30); + gflags[JOINED_OSS] = true; + } + else + say("Koranada glances at your shield. @Avatar, thou must aquire thine own Serpent shield from Gherick. Someone else's won't suffice...@"); + } + else + { + say("@Acquire a Silver Serpent shield and thou wilt be admitted to the order, " + polite_title + " " + player_name + ".@"); + add(["Serpent shield"]); + } + + } + + + case "courage"(remove): + say("@Go and speak to de Hugh. Observe what he believes to be courage. Though he is a fine fighter, he has yet to prove himself worthy of our order.@"); + + case "Serpent shield"(remove): + say("@The Serpent Shield of our order is a sacred symbol of our brotherhood of bravery.@"); + if (UI_count_objects(PARTY, SHAPE_MAGIC_SHIELD, QUALITY_ANY, FRAME_GHERICK) < 1 || !gflags[JOINED_OSS]) + { + say("@Its making is a magical process. Gherick the Smithy will help thee make one.@"); + //can ask Gherick to make the shield now + if (!gflags[MAKE_SERPENT_SHIELD]) + gflags[MAKE_SERPENT_SHIELD] = true; + add(["magical process", "Gherick"]); + } + else + say("@Carry it with pride!@"); + + case "magical process"(remove): + say("@Tis secret, as well.@"); + + case "Gherick"(remove): + say("@You will most likely find him at Siege Crafters.@"); + + case "join"(remove): + say("@I have responsibilities here, " + polite_title + ". But I am honored by the offer.@"); + if (!gflags[JOINED_OSS]) + { + say("@However...Dost thou wish to join the Order of the Silver Serpent?@"); + add(["Order"]); + } + + case "rune"(remove): + say("@Without the meaning, such a symbol is just a meaningless scratching. We meditate on valour here.@"); + add(["mantra"]); + + case "mantra"(remove): + say("@A mantra is a concept, a special word to be turned over and over in the mind. When we meditate on a mantra, we do so in order to find the meaning of that virtue.@"); + add(["meaning"]); + + case "meaning"(remove): + say("@It is not enough just to know a mantra or possess a rune. In order to be virtuous, one must act virtuously.@"); + add(["virtuous"]); + + case "virtuous"(remove): + say("@Sometimes one virtue conflicts with another, though both be numbered amongst the virtues of the Avatar. The hero seeks to act with an awareness of these conflicts instead of merely following instinct. My teacher Conor taught me this.@"); + add(["Conor"]); + + case "Conor"(remove): + say("@A dear friend. He was guildmaster here when I was in training. He lives humbly in New Magincia now.@"); + + + case "bye": + + avatar_goodbye = "@Goodbye!@"; + npc_goodbye = "@Fare thee well!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/LadyTessa.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/LadyTessa.uc new file mode 100755 index 0000000..f935402 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/LadyTessa.uc @@ -0,0 +1,112 @@ + +void LadyTessa object# (0x4e9) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Might we speak, milady?@"; + npc_1st_greet = "@Why, 'tis the Avatar!@"; + + av_2nd_greet = "@Hello again, Lady Tessa.@"; + npc_2nd_greet = "@Welcome again, Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A well dressed woman.*"); + item.say("@Ah, " + polite_title + " " + player_name + "! A sailor from Britain said thou had returned to the land! How glad I am to see that it is true!@"); + + } + else + item.say("@Welcome again to Serpent's Hold, Avatar!@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm Tessa. We met during thy last quest, Avatar! Strange that thou didst not recognize me. I would have hoped that the past years had not taken that much toll on me!@"); + + case "job"(remove): + say("@I'm the keeper of the Flame of Courage. I also help my husband Simon run this town. How fortunate we were to come here after the earthquake!@"); + add(["Flame of Courage", "earthquake", "Simon"]); + + case "Simon"(remove): + say("@He is the lord of this hold.@"); + + case "Flame of Courage"(remove): + say("@You'll find many courageous fighters here!@"); + + case "earthquake"(remove): + say("@After thy last quest, there were many great earthquakes. The island of Bordermarch sank into the sea, along with our keep! Only through great fortune did Simon and I make it off the island alive!@"); + + case "bye"(remove): + avatar_goodbye = "@Goodbye, milady!@"; + npc_goodbye = "@Farewell, Avatar! Be brave in thy quest!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Loubet.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Loubet.uc new file mode 100755 index 0000000..abd67c3 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Loubet.uc @@ -0,0 +1,172 @@ + +void Loubet object# (0x4ec) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var pronoun; + var title; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) + { + pronoun = "amie"; + title = "madame"; + } + else + { + pronoun = "ami"; + title = "m'sieur"; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, milord.."; + npc_1st_greet = "@Bonjour!@"; + + av_2nd_greet = "@M'siuer Loubet..@"; + npc_2nd_greet = "@Bonjour, mon " + pronoun + "!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A tall and dashing gentleman.*"); + item.say("He greets you with an elaborate bow and flourish. @Good " + time_of_day + ", mon " + pronoun + "!@"); + if (shop_is_open) + item.say("@Ave you come to moi for instruction? You 'ave but to ask, mah friend.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[TRAINED_WITH_LOUBET]) + add("lesson"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am M'sieur Loubet.@"); + say("@Touche!@ He wields his foil casually, lunging at an imaginary target."); + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + UI_set_item_flag(item, SI_ZOMBIE); + say("@Much pleased to meet you, " + title + ".@"); + } + else + say("@But you already know who I am, silly person!@"); + add(["touche"]); + + case "job"(remove): + if (shop_is_open) + say("@Oui, I teach ze fencing here in my salle, my school@"); + else + say("@Oui, I teach ze fencing.@"); + say("@Is very difficult sometimes. Most fighters, zey have no subtlety, no finesse."); + if (!gflags[TRAINED_WITH_LOUBET]) + say("@But you, you look much better than that, my friend.@"); + else + say("@He turns up his nose and sniffs aristocraticlly. Zey are not like you, mah friend! You are most talented!@"); + add("lesson"); + + + case "lesson": + + if (!shop_is_open) + { + say("@Practice? Here? Surely you jest!@*"); + say("@No, come to ma salle sometime, zen we will spar, yes?@"); + } + else + { + say("@I charge 70 gold for a session, but thou wilt benefit greatly. Is this agreeable, " + title + "?@"); + if (askYesNo()) + LoubetTrain([DEXTERITY, COMBAT], 70); + else + say("@No? When you're ready, you 'ave but to ask, mah friend.@"); + + } + + + case "touche"(remove): + say("@Zat simply means 'touch.' In fencing we score by touching ze opponent with ze foil tip.@"); + add(["foil tip"]); + + case "foil tip"(remove): + say("@Zey are blunt on ze end, see? Ze first third of ze blade -near ze 'andle- is 'forte'--strong. It is good to parry with zis part of ze sword.@*"); + say("@Ze rest of ze blade is 'foible'--weak and flexible. Ze foil, she is a very delicate thing. There must be much skill, yes?@*"); + say("@You must 'old ze sword like a living bird: Too loose and she flies away. Too tight and she smothers. Just right, and...She sings very sweet!@*"); + UI_play_sound_effect(5); //ding! + say("He strikes metal and the foil makes a pleasant ringing noise."); + add(["noise"]); + + case "noise"(remove): + say("@SHINGGG!@"); + UI_play_sound_effect(5); //ding! + + case "bye"(remove): + + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@Au revoir!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Morchella.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Morchella.uc new file mode 100755 index 0000000..4f08cca --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Morchella.uc @@ -0,0 +1,206 @@ +void Morchella object# (0x4ee) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me, miss..@"; + npc_1st_greet = "@What do ye want?@"; + + av_2nd_greet = "@Might we speak again?@"; + npc_2nd_greet = "@What now?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A tough-looking woman with a walk like a troll.*"); + item.say("She stares insolently at you."); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[TALKEDTOHOMERABOUTMAP]) + add("map"); + + if (UI_get_item_flag(item, TATTOOED) || UI_get_item_flag(SANDY, SI_ZOMBIE)) //after Dupre accuses her of being a pirate OR gave Sandy the dragon egg + add (["pirate", "sailor"]); + + if (UI_get_item_flag(item, SI_ZOMBIE)) //gave Morchella the shield for the map + add (["Caradon"]); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I'm Morchella.@"); + + case "job"(remove): + say("@I be a retired sailor, that I am.@"); + if (isNearby(DUPRE)) + { + if (!UI_get_item_flag(item, TATTOOED)) //flag used to avoid using globals - 'knows morchella is pirate' + { + UI_set_item_flag(item, TATTOOED); //sets 'knows morchella is a pirate' flag + } + DUPRE.say("@Thou wert a pirate!@"); + DUPRE.hide(); + + say("@Well!@ She turns up her nose and leaves."); + sayGoodbyeAbrupt(item, "How rude!"); + break; + } + say("@An honest one, mind ye.@"); + add(["sailor"]); + + case "pirate"(remove): + say("@I know nothing about that!@ She walks off in a huff."); + if (!UI_get_item_flag(item, TATTOOED)) + UI_set_item_flag(item, TATTOOED); // can ask her about pirate + sayGoodbyeAbrupt(item, "Nothing!"); + break; + + case "sailor"(remove): + say("@That's right, me bucko. Why, I've sailed with Lord British and Captain Johne.@"); + add(["Lord British", "Captain Johne"]); + + case "Lord British"(remove): + say("@He walks with a limp, ye know. 'Fraid of mice, too, he is.@"); + if (isNearby(SHERRY)) + { + SHERRY.say("Sherry turns to you, giving you a look of amused bewilderment only a talking mouse could."); + SHERRY.hide(); + } + + case "Captain Johne"(remove): + say("@He offered to marry me but of course I refused. Didn't want to be tied down.@"); + if ((isNearby(DUPRE)) && (isNearby(SHAMINO))) + { + DUPRE.say("Dupre leans towards Shamino and whispers, @That's an image no amount of ale could cleanse from the mind...@"); + DUPRE.hide(); + SHAMINO.say("Shamino shudders and nods in agreement"); + SHAMINO.hide(); + } + + case "map"(remove): + say("She looks around furtively first. @Well, now, I might have seen the likes of that in me travels...Tell ye what, matey: If ye give me a shield of the Order of the Serpent, I'll tell ye where that map be at.@"); + add(["shield"]); + + case "Caradon"(remove): + say("@I might even ask 'im to marry me.@ She winks slyly at you."); + + case "shield"(remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) //'gave morchella shield' + { + if (!UI_count_objects(PARTY, SHAPE_MAGIC_SHIELD, QUALITY_ANY, FRAME_ANY) > 0) + { + say("@If I had a Silver Serpent shield, I'd give it to Caradon.@"); + say("@He's a fine, brave lad, he is.@"); + add(["Caradon"]); + } + else + { + say("@That be quite a prize there, matey. Will ye trade it to me for a bit o' map?@"); // yes/no question + if (askYesNo()) + { + say("From a little box Morchella hands over a piece of paper. It is a piece of the pirate map. @I was going to give this magic shield to Caradon but methinks I'll keep it for meself instead! Good " + time_of_day + ", " + polite_title + ".@ She walks off."); // if answered yes + UI_remove_party_items(1, SHAPE_MAGIC_SHIELD, QUALITY_ANY, FRAME_ANY, true); + UI_remove_cont_items(item, 1, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP6); + UI_add_party_items(1, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP6, false); + UI_add_cont_items(item, 1, SHAPE_MAGIC_SHIELD, QUALITY_ANY, FRAME_ANY); + UI_set_item_flag(item, SI_ZOMBIE); + sayGoodbyeAbrupt(item, "@It's all mine!@"); + break; + } + else + { + say("@Then leave me be!@ She turns her back angrily on you and walks off.@"); // if answered no + sayGoodbyeAbrupt(item, "@Begone ye scalliwag!@"); + break; + } + } + + } + else + say("@Now all I need is a magic sword; then methinks I'll be a knight. @"); + + + case "bye": + avatar_goodbye = "@That will be all..@"; + npc_goodbye = "@So long, matey.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Shubin.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Shubin.uc new file mode 100755 index 0000000..6b778c1 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/Shubin.uc @@ -0,0 +1,227 @@ +void Shubin object# (0x4f1) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var barks; + var rand; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + + if (event == PROXIMITY) + { + if (UI_get_schedule_type(item) == BAKE) + { + //reorganised to make it easier to add barks + barks = [ + "@Bread fit for a king!@", + "@Where is my rolling pin??@", + "@Yum!@", + "@Wish I had a dragon's egg..@", + "@Mmm, pastry!@", + "@Smells good!@" + + ]; + + rand = UI_get_random(UI_get_array_size(barks)); + UI_item_say(item, barks[rand]); + } + //Otherwise, say generic NPC barks + else scheduleBarks(item); + } + + else + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Hello, milord..@"; + npc_1st_greet = "@Hello!@"; + + av_2nd_greet = "@Greetings..@"; + npc_2nd_greet = "@Hello, again!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A man with a wide bottom. His voice is almost like a woman's*"); + item.say("@Ooh, you look so thin! Here, have a bite of bread.@ He gives you a roll; it is still warm from the oven.*"); + UI_add_party_items(1, SHAPE_FOOD, QUALITY_ANY, FRAME_ROLL, true); + add(["roll"]); + } + else + item.say("@Why, hello there, " + polite_title + ".@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + + if (UI_get_item_flag(SANDY, MET)) + add ("Sandy"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Shubin, " + polite_title + ".@"); + + case "job"(remove): + say("@I'm a cook, " + polite_title + ".@"); + add(["cook"]); + + case "Sandy"(remove): + say("@He is my friend.@"); + add(["mantra"]); + + case "mantra"(remove): + say("@Sandy says the mantra of eating is 'yum,' " + polite_title + ". Hee, hee!@"); + if (isNearby(IOLO)) + { + IOLO.say("Your friend Iolo rolls his eyes. @Such wisdom we can surely do without!@"); + IOLO.hide(); + } + + case "roll"(remove): + if (!UI_get_item_flag(item, TATTOOED)) //flag used to avoid using globals - haven't given rolls yet + { + say("He ask anxiously @Do you like it, " + polite_title + "?@"); + if (askYesNo()) + { + say("@Have a whole tray, then.@"); + UI_add_party_items(6, SHAPE_FOOD, QUALITY_ANY, FRAME_ROLL, true); + UI_set_item_flag(item, TATTOOED); //sets 'already gave rolls' flag + } + else say("@Such a picky eater. No wonder you're so skinny, " + polite_title + ".@"); + } + else + say("@I have no more rolls, " + polite_title + ".@"); + + case "cook"(remove): + say("@Being a cook is like being an adventurer, " + polite_title + ".@"); + add(["adventurer"]); + + case "adventurer"(remove): + say("@Yes, " + polite_title + ". I must gather up all my ingredients with care.@"); + add(["care"]); + + case "care"(remove): + say("@So that I have the right ingredients, " + polite_title + ".@"); + add(["ingredients"]); + + case "ingredients"(remove): + say("@Adventurers are always searching for this or that, " + polite_title + ". So are cooks. Do you know of Magincian Pastry?@"); + if (askYesNo()) + { + say("@It is a marvellous dish, " + polite_title + ". My friend Sandy gave me the recipe...I'm only missing one ingredient...@"); + } + else + { + say("@Well, I'd like to make it, " + polite_title + ", but I cannot get one of the ingredients...@"); + say("@I sure would appreciate it if you brought it back for me if you came across one in your travels, " + polite_title + "...If you could find time for old Shubin, that is...@*"); + say("@Would it be too much trouble to bring me back a dragon's egg, " + polite_title + "?@"); + if (askYesNo()) + { + say("He sighs. @Well, " + polite_title + ", it did no harm to ask, I suppose.@"); + } + else say("@I just know you will remember Shubin, " + polite_title + ". Thank you.@"); + } + add("dragon's egg"); + if (!UI_get_item_flag(SANDY, MET)) + add("Sandy"); + + case "dragon's egg"(remove): + say("@Have you one with you?@"); + if(askYesNo()) + { + if (UI_count_objects(PARTY, SHAPE_DRAGONS_EGG, QUALITY_ANY, FRAME_ANY) > 0) + { + say("@Oh, thank you, thank you, thank you!@"); + UI_remove_party_items(1, SHAPE_DRAGONS_EGG, QUALITY_ANY, FRAME_ANY, true); + if (!UI_get_item_flag(item, FREEZE)) + { + addKarma(5); + UI_set_item_flag(item, FREEZE); + } + } + else + say("@Oh, do not tease old Shubin so, " + polite_title + "!@"); + } + else + say("@Oh, do not tease old Shubin so, " + polite_title + "!@"); + + + case "bye": + + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@Goodbye, " + polite_title + ".@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/SirSimon.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/SirSimon.uc new file mode 100755 index 0000000..6cbfee9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SerpentsHold/SirSimon.uc @@ -0,0 +1,130 @@ +void Simon object# (0x4ea) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, milord.@"; + npc_1st_greet = "@Avatar! It's been ages..@"; + + av_2nd_greet = "@Greetings, Sir Simon.@"; + npc_2nd_greet = "@Welcome, Avatar!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); //sets met flag + item.say("A muscular knight. He speaks in a raspy voice.*"); + item.say("@Greetings, " + polite_title + " Avatar! Thou art most welcome in my castle, Avatar.@ He bows deeply to you."); + + } + else + item.say("@Good " + time_of_day + ", " + polite_title + ".@"); + + //standard conversation options + var options = ["name", "job", "bye", "mantra"]; + + + if (UI_get_item_flag(CULHAM, MET)) + add ("Culham"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Call me Simon, " + polite_title + ".@"); + + case "job"(remove): + say("@I am the lord of Serpent's Hold.@"); + + case "mantra"(remove): + say("@I personally favor the mantra of Valour. I taught it to the bard Culham in a song.@"); + if (!UI_get_item_flag(CULHAM, MET)) + add("Culham"); + add("rune"); + + case "Culham"(remove): + say("@He spends much time in Jhelom, though he be a traveling bard.@"); + add(["traveling bard"]); + + case "traveling bard"(remove): + say("@Yes, there's no telling where one might find him. As I said, though, Jhelom is a good guess.@"); + + case "rune"(remove): + say("@If I had a rune, I'd wear it proudly. But others fear for the safety of such important talismans, hiding them in some peculiar places. I wonder if 'tis considered theft to seize a rune laid out for all to see...@"); + + case "bye": + say("@Goodbye. I hope thou wilt visit me again when thou hast time, friend.@"); + + avatar_goodbye = "@Farewell!@"; + npc_goodbye = "@Come back soon, friend!"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Dezana.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Dezana.uc new file mode 100755 index 0000000..f089853 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Dezana.uc @@ -0,0 +1,208 @@ + +void Dezana object# (0x48f) () +{ + + var party = UI_get_party_list([]); + + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var npc; + var party_member = ["no one"]; + var party_list; + var npcname; + var each; + var idx; + var party_number = []; + var npc_num; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Mmm...yes?@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Ah, of course.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a very large woman with a deliberate smile.*"); + item.say("@Mmm...yes?@ She looks down at you, her eyes merely slits.@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Dezana knows much. Have you returned for more talk or are you in need?@"); + + //standard conversation options + var options = ["name", "job", "bye", "talk"]; + + if (gflags[LEARNED_MICHAEL_NAME]) + add("Michael"); + + if (UI_get_item_flag(QUENTON, MET)) + add ("ghost"); + + if (UI_get_item_flag(TRENTON, MET)) + add ("Trenton Bell"); + + if (UI_get_item_flag(GIDEON, MET)) + add ("Gideon"); + + if (UI_get_item_flag(MARNEY, MET)) + add ("Marney"); + + if (UI_get_item_flag(YORL, MET)) + add ("Yorl"); + + if (UI_get_item_flag(HORANCE, MET)) + add ("Horance"); + + + ///////////////////////////////////////////////////////////////////// + //Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Dezana.@ She smiles like a cat preparing for a meal."); + add(["Dezana"]); + + case "job"(remove): + say("@I can heal, cure, and even resurrect.@"); + add(["heal", "cure", "resurrect"]); + + case "talk"(remove): + say("@There are many words which travel about this small hamlet. Many are intriguing, some are even dangerous. What words have you heard?@"); + + case "Dezana"(remove): + say("@That is correct. Now, are you here to chat, or are you in need?@"); + + case "heal": + npc = populatePartyNames(party); + healScript(npc, DEZANA, 30); + + case "cure": + npc = populatePartyNames(party); + cureScript(npc, DEZANA, 10); + + case "resurrect": + resurrectScript(DEZANA, 400); + + case "ghost"(remove): + say("@That is one worth speaking about. You see, many people travel the spirit world. Some are lost souls, others have a purpose. Quenton is not a lost soul.@"); + add(["spirit", "Quenton", "soul"]); + + case "spirit"(remove): + say("@It is a mystical place between here and the hereafter. Quenton resides there.@"); + + case "Quenton"(remove): + say("@He had attained much wisdom before he was forced from here. If his ghost has been seen...And I believe he has...Then he must be attempting to communicate with us about some unfinished business.@"); + say("@Perhaps he knows who killed him.@"); + add(["killed"]); + + case "soul"(remove): + say("@They spent their whole life without learning anything or growing inside. They are as children left alone in a crib. Never learning, always seeking.@"); + + case "killed"(remove): + say("@I know this much: if you wish to find out who murdered him, you won't be able to ask his ghost. You see, the spirit world can not communicate with ours directly. Although his ghost can hear your questions, he'll respond by manipulating the environment.@"); + add(["manipulating", "communicate"]); + + case "manipulating"(remove): + say("@Yes, you know, make him demonstrate his answers by, say, shaking a branch.@"); + + case "gargoyles"(remove): + say("@Those creatures are dangerous. I have heard that they can tear a man to pieces.@"); + if (!gflags[MICHAEL_CAPTURED]) + say("@So why, then, did the gargoyles not attack Stivius as well? Certainly he would have tasted just as good.@"); + add(["Stivius"]); + + case "Stivius"(remove): + say("@A quaint little man. He has strong feelings for me. I must admit, he has a cute way about him.@"); + + case "Horance"(remove): + say("@He was once a great man. Discovered many of the herbs I use in healing. He discovered something else, however: that total knowledge can corrupt totally. I don't know what drove him mad. And I don't want to know.@ She shudders slightly."); + + case "Marney"(remove): + if (gflags[FAILED_QUENTON_QUEST]) + say("@This town has suffered through much tragedy already, hopefully she can be found safe.@"); + else + { + say("@She has seen much pain in her life. More than even I can heal. I pity her.@"); + if (gflags[MICHAEL_CAPTURED]) + say("@It's a terrible thing to learn about her father being killed by Michael, but at least she has some sort of closure.@"); + } + case "Gideon"(remove): + say("@He is a dear old man. Never has a mean thing to say of anyone.@"); + + + case "Michael"(remove): + if (!gflags[MICHAEL_CAPTURED]) + say("@I know something about everyone in this village. However, this man is unknown to me. He never talks about his past.@"); + else + say("@There was always something suspicious about him, I am glad he will finally pay for his crime against Quenton.@"); + + case "Trenton Bell"(remove): + say("@He is a very stiff man. I believe he may be hiding something about his past.@"); + + + case "Yorl"(remove): + say("@A nice fellow, but a bit too simple for me.@"); + + //new quest options here + case "communicate"(remove): + if (!gflags[QUENTON_START]) + { + gflags[QUENTON_START] = true; + gflags[LEARNED_ABOUT_SEANCE] = true; + say("@As I said, spirits cannot communicate with our world directly...@"); + say("@However... it is said that old Horance may know of the 'Seance' spell...what he does with it, I do not wish to know.@"); + say("@Gives me the chills just thinking about it.@"); + say("@Perhaps, you being the Avatar, wouldst be brave enough to ask him.@"); + giveExperience(20); + } + else + say("@I've already told you how... I'd rather not speak of it again. The thought makes me uncomfortable.@"); + + + + + case "bye": + + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@Return when you need healing.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Gideon.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Gideon.uc new file mode 100755 index 0000000..3c7b89a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Gideon.uc @@ -0,0 +1,357 @@ +void Gideon object# (0x48c) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + + var started_talking = UI_get_item_flag(item, READ); + + var single_plural; + + if (partynum > 1) + single_plural = "you"; + else + single_plural = "everyone"; + + var time_of_day = timeFunction(hour); + + //Inn flags / variables + var GIDEON_INN_PRICE = partynum * 4; + var checkout = UI_get_item_flag(item, PETRA); + var hasKey = UI_count_objects(PARTY, SHAPE_KEY, QUALITY_GIDEON_INN, FRAME_ANY); + var door; + var open_doors; + const int SHAPE_OPEN_DOOR = 270; + const int SHAPE_CLOSED_DOOR = 376; + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + if (event == DOUBLECLICK) + { + if (partynum > 1) greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + var av_1st_greet = "@Greetings..@"; + var npc_1st_greet = "@Ah, new people!@"; + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@Come in, come in!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + + } + if (started_talking) + { + if (checkout) + { + item.say("@Good " + time_of_day + ", are you ready to check out?@"); + if (askYesNo()) + { + if (hasKey) + { + say("Gideon serves " + single_plural + " a large breakfast and you hand him the key."); + say("@Come back anytime, my friend.@"); + UI_add_party_items(partynum, SHAPE_FOOD, QUALITY_ANY, FRAME_EGG, false); + UI_add_party_items(partynum, SHAPE_BOTTLE, QUALITY_ANY, FRAME_MILK, false); + UI_remove_party_items(1, SHAPE_KEY, QUALITY_GIDEON_INN, FRAME_ANY, false); + + //clear stuff for usecode egg + UI_clear_item_flag(item, PETRA); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + + //look for open doors / unlocked doors of quality 24 + var open_doors = UI_find_nearby([0x0ee, 0x641, 0], SHAPE_OPEN_DOOR, 10, MASK_NONE); + + //change open doors to closed, locked frame, correct quality + for (door in open_doors) + { + UI_set_item_shape(door, SHAPE_CLOSED_DOOR); + UI_set_item_frame(door, 2); //locked + UI_set_item_quality(door, QUALITY_GIDEON_INN); + } + + //find closed doors, make sure they are locked + var closed_doors = UI_find_nearby([0x0ee, 0x641, 0], SHAPE_CLOSED_DOOR, 10, MASK_NONE); + for (door in closed_doors) + { + UI_set_item_frame(door, 2); //locked + UI_set_item_quality(door, QUALITY_GIDEON_INN); + } + + + } + else + say("@Well, where is the key? Perhaps you left it in your room. Come back when you're ready to check out.@"); + //send Gideon back on regular schedule to avoid loop + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + UI_run_schedule(item); + return; + } + else + say("@Okay just let me know when you're ready to check out.@"); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + return; + } + + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A man bent over with age. An old brown tunic hangs loosely on him. He looks at you, then looks over his shoulder and shouts to someone behind him.*"); + item.say("@There, I told you, Marta. New people, new food for our souls.@ He turns back to you. @Welcome to the Haunting Inn. Come and sit, for you must have many tales.@"); + UI_set_item_flag(item, MET); + } + else + { + item.say("@Is it you," + player_name + "? he says, leaning close and staring you in the eyes.@"); + item.say("@Of course it is! Welcome back, traveler.@"); + } + + var options = ["name", "job", "bye"]; + + + if (UI_get_item_flag(LORD_BRITISH, MET)) + add ("Lord British"); + + if (UI_get_item_flag(TRENTON, MET)) + add ("Trenton Bell"); + + if (UI_get_item_flag(DEZANA, MET)) + add ("Dezana"); + + if (UI_get_item_flag(MARTA, MET)) + add ("Marta"); + + //set when you use Seance on Quenton + if (gflags[LEARNED_MICHAEL_NAME]) + add("Michael"); + + if (UI_get_item_flag(STIVIUS, MET)) + add ("Stivius"); + + ///////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////// + + + converse(options) + { + case "name"(remove): + say("@Gideon, my friend, Gideon's what I'm called by one and all.@*"); + add(["Gideon"]); + + case "job"(remove): + say("@My wife would say it is to annoy the customers with idle banter. She's dear. I have rooms for let.@"); + add(["banter", "rooms"]); + + case "Gideon"(remove): + say("@Tis an old family name meaning 'one who spreads the word.' My wife tells me I spread too many of them around.@"); + add(["word", "wife"]); + + case "wife"(remove): + say("@When I was a young man I visited the shrine to contemplate an emptiness I felt inside. Marta was there, so beautiful and shy.@"); + say("@We sat in silence together for hours. Finally, she could take no more and turned and kissed me.@*"); + say("A shout comes from the room behind him. He answers, @No, Marta, our guests are not asleep yet.@*"); + add(["Marta", "shrine"]); + + case "word"(remove): + say("@The word I spread is one of kindness to all souls!@"); + + case "shrine"(remove): + say("@The shrine of Spirituality. It is where we go when we are troubled. You should visit it sometime.@*"); + + case "Marta"(remove): + say("@She hasn't come out of that room since she saw that darn ghost in the dining room a few nights ago.@*"); + say("@She told me the lanterns went out and a spectre drifted in front of her. She let out such a scream that I heard her from our bedroom.@*"); + say("He shakes his head and glances at the room behind him.*"); + add(["ghost"]); + + + case "ghost"(remove): + say("@My Marta doesn't spook that easy. After all, she's woke up next to me all these years. At first I thought maybe I should lock the cupboard where we keep the wine.@*"); + say("@But I don't think my Marta's been nippin'. I wish I knew what she saw.*"); + if (!gflags[LEARNED_ABOUT_QUENTON]) + gflags[LEARNED_ABOUT_QUENTON] = true; //set so you can ask others about ghost + + add(["cupboard"]); + + + case "cupboard"(remove): + say("@If you've never had Stivius' wine, you're in for a treat.@*"); + add(["Stivius"]); + + + case "Stivius"(remove): + say("@He lives next door. Strange fellow...I think he's sampled too much of his own wares.@*"); + + case "rooms"(remove): + say("@" + GIDEON_INN_PRICE + " gold for a room and a meal. Interested?@"); + if (askYesNo()) + { + if (hasGold(GIDEON_INN_PRICE)) + { + if (UI_add_party_items(1, SHAPE_KEY, QUALITY_GIDEON_INN, 7, false)) + { + chargeGold(GIDEON_INN_PRICE); + say("@Enjoy your room, be sure to stop by for breakfast at checkout!@"); + UI_set_item_flag(item, PETRA); + break; + } + else + say("@You don't have room for the key.@"); + } + else + { + say("@I'm sorry, but we require cash in advance for our rooms.@"); + break; + } + } + else + say("@Perhaps some other time, then.@"); + + case "banter"(remove): + say("@I'm sure by now you've heard such banter about old Quenton. He was a dear soul.@ Gideon looks past you into the distance.*"); + say("@I could not believe it was him by the well.@ His eyes become watery. @He lay so quiet, no sign of pain on his face, and just an amulet in his bloody hand.*@"); + say("He looks at the floor and mumbles. @Quen, I miss you, old mate.@*"); + add(["amulet", "Quenton"]); + + + case "word"(remove): + say("@The word I spread is one of kindness to all souls!@*"); + + case "tales"(remove): + say("@Yes, let us swap stories for a while...@*"); + + case "Haunting Inn"(remove): + say("@That name used to be just words. But now, with what Marta saw...@*"); + add(["Marta"]); + + + case "amulet"(remove): + say("@We went and told Yorl what had happened. When he returned with us to the well, he removed the amulet from Quenton's hand and took it to Marney.@*"); + say("@It took courage to tell her the news.@*"); + add("Yorl"); + + //wording about Mondain altered for quest and fixing that glaring inconsistency! + case "Quenton"(remove): + say("@We came to this island many years ago. As children we'd take the boats and race around the point. Marta and I took care of him when pirates sailing under Mondain's flag killed his wife Gwen.@*"); + say("@We care for his daughter, Marney, now. She's such a brave girl.@ He pauses a moment then continues."); + say("@Neither I nor the travelers staying here heard anything the night he was killed.@*"); + add(["Mondain", "Gwen", "travelers", "Marney", "killed"]); + + case "Mondain"(remove): + say("@Yes, Quenton and Yorl were out fishing when a few of those evil ones landed here. They were fleeing Lord British's men and apparently thought our hamlet was safe haven.@*"); + say("@Their ship's sail bore the crest of Mondain. They went around asking for some person named Relthor, or Renthar... something like that.@*"); + add(["Renthar"]); + + case "Gwen"(remove): + say("@She was an angel to view. Blonde hair, green eyes, tall slender body. Marney could be her twin. I can still see Elisa's brave face as the men led her to their boat.@*"); + say("@They said that after she got them past their pursuers she would be freed.@ He hides his face in his hands. Our beliefs held us still.@*"); + say("@She turned and handed something to her crying little girl. Then she boarded the skiff, and they were gone.@*"); + add(["Marney", "boarded", "something"]); + + case "travelers"(remove): + say("@I questioned them about the night of the murder. Still, of all of us, my Marta and I had the best vantage point from which to witness, or even hear, the murder.@*"); + say("@Still, of all of us, my Marta and I had the best vantage point from which to witness, or even hear, the murder.@"); + say("@Yet we saw and heard nothing.@"); + + case "Marney"(remove): + if (gflags[FAILED_QUENTON_QUEST]) + say("@She is still missing. I pray she will be found safe.@ He wipes his eyes."); + else + { + say("@She, like her mother, is strong in her beliefs. When we buried her father, she sang a song she wrote for him.@ He softly sings.*"); + say("@'You put your love in my heart, and now it's fallen apart, but all alone in the dark, I will remove the pain.'@"); + say("@'There is a sting in my eyes, and your name in my cries, but still I realize, that you are part of me.'@*"); + add(["beliefs"]); + } + case "killed"(remove): + say("He looks at you a moment, then leans closer. @They say that Quenton was killed by a Gargoyle.@"); + say("@I've heard these beasts eat their prey. Why did they leave Quenton alone then?*"); + + case "beliefs"(remove): + say("@We are a peaceful people. We believe that all men have hearts that can possess either good or evil.@*"); + say("@These evil ones believed that by tearing down others, they could become more powerful.@*"); + say("@The truth is, when you tear down another's ladder you become no higher, they just become lower. It is harder to build your ladder on your own, but you will see farther in the end.@*"); + + case "boarded"(remove): + say("@Gwen bowed her head as they sailed off.@ He looks absently at the floor and attempts to clear his throat."); + say("Speaking again, his voice is a whisper. @They found her body along the coast south of here.@*"); + add(["coast"]); + + case "something"(remove): + say("@I couldn't see what it was.@*"); + + + case "coast"(remove): + say("He looks at you, his eyes red and his lip quivering. He simply nods.*"); + + case "Trenton Bell"(remove): + say("@He means well, it's just his attitude is all wrong for the job. He should spend some time in New Magincia.@*"); + add("New Magincia"); + + case "New Magincia"(remove): + say("@You should sail there someday.@"); + + case "Renthar" (remove): + if (!gflags[QUENTON_MURDER_SOLVED]) + say("@We had no such person in this town. Not by that name.@"); + else + say("@We have welcomed into this town, so that he may continue his path to Spirituality. He is staying with us as long as he wants to, such a good soul.@"); + + + case "Yorl"(remove): + say("His eyes light up. @He is one of the friendliest people in this hamlet. You must go see him, down by the pier. He's been like a father to Marney.@"); + + case "Michael"(remove): + if (!gflags[QUENTON_MURDER_SOLVED]) + { + say("@Now there's a sad soul. He was so young when he got tangled up with the wrong group of kids. Had he been raised by someone with a good heart, he might have been one of Lord British's greatest knights.@"); + add (["Lord British"]); + } + else + say("@It saddens me that his soul has gotten so dark he would have done such a terrible thing. I hope with his time in prison he will contemplate the Virtues.@"); + + case "Dezana"(remove): + say("@She's a dear soul. I sometimes feel sorry for her. I mean, her weight and all. Still, she is one of the most interesting people I've ever met.@"); + + case "Horance"(remove): + say("@He's the alchemist who lives on @Iver's Rounding. You'll need a boat to get there though.@"); + add(["Ivers Rounding"]); + + case "Ivers Rounding"(remove): + say("@It was named after a famous pirate who beached his craft there during a storm.@"); + + case "Trenton Bell"(remove): + say("@He means well, it's just his attitude is all wrong for the job. He should spend some time in New Magincia.@"); + add(["New Magincia"]); + + case "Lord British"(remove): + say("@I'm just an innkeep. Ask Yorl: his father used to sail for our ruler.@"); + + case "bye": + var avatar_goodbye = "@Farewell, Gideon.@"; + var npc_goodbye = "@Come back, dear souls.@"; + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Horance.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Horance.uc new file mode 100755 index 0000000..78d09fa --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Horance.uc @@ -0,0 +1,281 @@ + +void Horance object# (0x48d) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me, mage..@"; + var npc_1st_greet = "@...@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Back so soon?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a bent, aging man with a scraggly beard and few teeth.*"); + item.say("@Dogs are at my doorstep, Yapping at my heels.@"); + item.say("@No way to ignore them. Just pretend that they are eels.@"); + UI_set_item_flag(item, MET); + } + else + { + item.say("@Once they came for wanting, Twice they came to see.@"); + item.say("@If I am relenting, In my mystery.@"); + + } + //standard conversation options + var options = ["name", "job", "bye"]; + + //Talked to Dezana about Seance / Horance + if (gflags[LEARNED_ABOUT_SEANCE]) + add("Seance spell"); + + if (UI_get_item_flag(QUENTON, MET)) + add ("ghost", "Quenton", "murder"); + + if (UI_get_item_flag(TRENTON, MET)) + add ("Trenton Bell", "shrine", "gargoyles"); + + if (UI_get_item_flag(GIDEON, MET)) + add ("Gideon", "Renthar"); + + if (UI_get_item_flag(MARNEY, MET)) + add ("Marney"); + + if (UI_get_item_flag(YORL, MET)) + add ("Yorl"); + + if (UI_get_item_flag(HORANCE, MET)) + add ("Horance"); + + //set when you use Seance on Quenton + if (gflags[LEARNED_MICHAEL_NAME]) + add("Michael"); + + if (UI_get_item_flag(LORD_BRITISH, MET)) + add ("Lord British"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Names I'm always thinking,@*"); + say("@Names I always see.@*"); + say("@Have you any inkling@*"); + say("@What they seem to mean?@"); + add(["Horance"]); + + + case "job"(remove): + say("@I have nice reagents, @*"); + say("@Also wondrous spells.@*"); + say("@If you need such things my friend, @*"); + say("@That is what I sell.@"); + add(["reagents", "spells", "spellbook"]); + + case "Horance" (remove): + say("@That is too familiar,@*"); + say("@Could it be a friend?@*"); + say("@No, none is delivered, @*"); + say("@So I must pretend.@"); + add(" "); + + case "Marney" (remove): + say("@Love has many rivers, @*"); + say("@Yet grief can twist them all.@*"); + say("@Be guided by your wisdom, @*"); + say("@And you'll achieve the goal.@"); + + case "murder" (remove): + say("@'Step into my parlor,@*"); + say("@'Said the spider to the fly..@*"); + say("@Perhaps if he could holler, @*"); + say("@He would not have to die.@"); + + case "Quenton" (remove): + say("@Ask about a traitor, @*"); + say("@Ask about a love, @*"); + say("@And if you are creative, @*"); + say("@Ask above the dove.@"); + + case "Lord British" (remove): + say("@A council has a purpose,@*"); + say("@And yet it can be wrong.@*"); + say("@There are no notes that singly@*"); + say("@Put the melody in a song.@"); + + case "Stivius" (remove): + say("@Little is the difference, @*"); + say("@That seperates ourselves.@*"); + say("@Remembering this inference, @*"); + say("@Is oft a great challenge.@"); + + case "Michael" (remove): + say("@Pain can run so deeply @*"); + say("@That one becomes a mute, @*"); + say("@In fear of leading others @*"); + say("@Where goodness is in dispute.@"); + + case "ghost" (remove): + say("He purses his lips and lets out an eery, high-pitched cry.*"); + say("@That is my impression. Tell me what you think.@*"); + say("@Can you learn a lesson, From what it has to teach?@"); + + case "Renthar" (remove): + say("@Many are pretenders, @*"); + say("@A harmless game they play. @*"); + say("@But for the few offenders, @*"); + say("@Of constant night they pray.@"); + + case "gargoyles" (remove): + say("@What is truly fearsome, @*"); + say("@What can evil be? @*"); + say("@Not all that growls is gruesome, @*"); + say("@Not all that hates has wings.@"); + + case "Yorl" (remove): + say("@Simple has its moment @*"); + say("@And often is received @*"); + say("@Much better than the brilliant, @*"); + say("@Who often will deceive.@"); + + case "Trenton Bell" (remove): + say("@He who has opinions, @*"); + say("@Thinks he knows it all, @*"); + say("@Will someday end up learning @*"); + say("@What comes before a fall.@"); + + case "Gideon" (remove): + say("@Kindness is a proverb @*"); + say("@That all can understand, @*"); + say("@And those who share it with you @*"); + say("@Will oft be in demand.@"); + + case "shrine" (remove): + say("@Through a glowing door, @*"); + say("@By the full moons' light. @*"); + say("@For me to tell you more @*"); + say("@Would take us half the night!@"); + + case "reagents": + say("@The mention of business brings the senile man to his senses momentarily.@"); + buyReagents(HORANCE); + + case "spells": + say("@The mention of business brings the senile man to his senses momentarily.@"); + magicShopkeeper(HORANCE); + + case "spellbook"(remove): + say("@The mention of business brings the senile man to his senses momentarily.@"); + buySpellbook(HORANCE, 50); + + + case " "(remove): + say("@Don't stick your arm @*"); + say("@Out too far.@*"); + say("@It may go home @*"); + say("@In another car!@*"); + say("@-- Burma Shave.@*"); + + case "Seance spell"(remove): + if (!gflags[LEARNED_SEANCE]) + { + say("As you ask Horance about the Seance spell, an eerie seriousness seems to overcome his usual mannerisms. He looks at you thoughtfully."); + say("@Thou dost know about the 'Seance spell'? Not many mages sell this spell. Very few can withstand the ravaging toll it can take on one's mind...@*"); + say("@I shall sell it to thee for 150 gold. Is this agreeable?@"); + if (askYesNo()) + { + if (hasGold(150)) + { + var spellbook = AVATAR->find_object(761, QUALITY_ANY, FRAME_ANY); + if (spellbook) + { + if (!hasSpell(SEANCE)) + { + chargeGold(150); + say("After accepting your gold, he teaches you the spell."); + UI_add_spell(SEANCE, 0, spellbook); + gflags[LEARNED_SEANCE] = true; + UI_play_music(32); + UI_set_weather(FOG); + UI_set_weather(RAIN); + say("@Do thou be careful with this spell...@*"); + say("@Speaking with the dead can be very dangerous...@"); + say("@...especially for one who hath vanquished so many into the Void such as thee...@*"); + say("As you depart, Horance laughs to himself softly at first, then the laughter becomes more ominous.*"); + say("You get a strange feeling in the pit of your stomach but you can't quite put your finger on it.*"); + say("It is obvious to you that Horance is a few bolts short of a full quiver, but you can't help but to get the chills as you leave."); + sayGoodbyeAbrupt(item, "@..heh heh heh!@"); + if (isNearby(JAANA)) + UI_item_say(JAANA, "@Creepy..@", 3); + break; + } + else say("@I already sold thee this spell.@"); + } + else say("@But thou hast not a spellbook!@"); + } + else say("@You lack the gold required.@"); + } + else say("@Very well...@"); + } + else say("@I hope thou hast found it as useful as I have...@ Horance displays a smile that makes you quite uneasy."); + + case "bye": + say("@I see that they are going, @*"); + say("@I'm sure they will return. @*"); + say("@For if they lack the knowing, @*"); + say("@They'll always need to learn.@"); + + var avatar_goodbye = "@I must be going now..@"; + var npc_goodbye = "@..you'll be back..heh hehe..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + if (isNearby(SHAMINO)) + delayedBark(SHAMINO, "..what a loon.", 14); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Marney.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Marney.uc new file mode 100755 index 0000000..2ff841e --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Marney.uc @@ -0,0 +1,259 @@ +void Marney object# (0x44b) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var avatar_goodbye; + var npc_goodbye; + + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //check to see if timer has passed, maybe 12 hours + if ((gflags[MARNEY_SAVED]) && (UI_get_item_flag(item, SI_ZOMBIE))) + { + UI_error_message("Timer for Marney is " + UI_get_timer(MARNEY_TIMER)); + if (UI_get_timer(MARNEY_TIMER) > 12 || gflags[QUENTON_MURDER_SOLVED]) //timer runs out or you solve the quest, clear flag + UI_clear_item_flag(item, SI_ZOMBIE); //enough time has lapsed, she's better + + } + + if (gflags[MARNEY_GONE]) //semi-bad ending, she's scarred for life + { + item.say("Marney looks up at you, her face puffy and red from crying, tears rolling down her eyes."); + item.say("@Please, go away. I do not wish to speak to you again. I have been traumatized enough.@"); + sayGoodbye2(MARNEY); + return; + + } + else + if (UI_get_item_flag(item, SI_ZOMBIE)) + { + item.say("Marney looks up at you from sobbing, her eyes red from the tears."); + item.say("@Please, " + polite_title + ", come back later when I've had some time to deal with everything that has come to pass recently.@"); + item.say("@It's all so overwhelming. I hope you understand.@"); + delayedBark(AVATAR, "Take care, Marney..", 3); + delayedBark(MARNEY, "Sorry..", 8); + sayGoodbye2(MARNEY); + return; + } + + + //Avatar and NPC greeting barks + var av_1st_greet = "@A moment, milady.@"; + var npc_1st_greet = "@Hello.@"; + + var av_2nd_greet = "@Marney..@"; + var npc_2nd_greet = "@Hello again.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a tall, delicate looking female. Her smile puts you at ease.*"); + item.say("@Hello " + polite_title + ", welcome to my home.@ Her eyes are as blue as the ocean and her movements as rythmic as the tide."); + UI_set_item_flag(item, MET); + } + else + item.say("@I recognize you from before.@ She winks at you."); + item.say("@What can I do for you?"); + + + //standard conversation options + var options = ["name", "job", "bye"]; + + //set when you use Seance on Quenton + if (gflags[LEARNED_MICHAEL_NAME]) + add("Michael"); + + //set by Trenton when you ask him about the rune's whereabouts + if (UI_get_item_flag(MARNEY, PETRA)) + add ("rune"); + + if (UI_get_item_flag(LORD_BRITISH, MET)) + add ("Lord British"); + + if (UI_get_item_flag(TRENTON, MET)) + add ("Trenton Bell"); + + if (UI_get_item_flag(DEZANA, MET)) + add ("Dezana"); + + if (UI_get_item_flag(MICHAEL, MET)) + add ("Michael"); + + if (UI_get_item_flag(STIVIUS, MET)) + add ("Stivius"); + + if (UI_get_item_flag(HORANCE, MET)) + add ("Horance"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name" (remove): + say("@My father chose an ancient word for my name. It means the cool breeze after a storm has passed. Marney.@"); + add(["Marney", "father"]); + + case "job" (remove): + say("@I look after the dock.@"); + add(["dock"]); + + case "Marney" (remove): + say("@It is in a poem my mother wrote to him when they first met.@ She grabs a locket that hangs around her neck and opens it. Inside is a folded piece of cloth with words printed on it. She begins to read. @At first we met and dark clouds gathered, the thunder sounding your approach. Then comes the storm of our hearts pounding and in the end the marney's touch.@"); + add(["poem", "locket"]); + + case "poem" (remove): + say("@Certainly you can look at it.@ She hands the tiny cloth to you. Looking at it, you discover that she has read only the first verse of the poem. The second reads, @If I should leave and you are lonely, Remember where my love is kept: Inside a basket made of promise, You'll find my dreams of us have slept.@"); + add(["basket"]); + + case "father" (remove): + say("@My father? He was a brave man and very strong. That he died in such a violent way was so wrong. But I am sure there is a reason for it.@*"); + say("Her blue eyes glisten with new-formed tears."); + add(["ghost", "died"]); + + case "locket" (remove): + say("@My mother gave me this just before she was taken by those evil men. My mother told me to give it to father when he returned from the sea. Yorl gave it back to me after he was killed.@"); + add(["sea"]); + + case "ghost" (remove): + say("She bows her head a moment and with a shaky voice begins to speak. @It is something I care not to talk about. His memory brings only sadness to me.@"); + + case "died" (remove): + if (!gflags[MARNEY_SAVED]) + { + say("She rubs her nose with the knuckle of her hand. @I can not see why those beasts would kill him, but perhaps it was just unfortunate.@*"); + say("@Still, I can't see why he was at the inn that late. Had he been drinking, Yorl would have been with him.@"); + } + else + say("@I would rather not talk about this if you don't mind, it's still a lot to process.@"); + add(["Yorl", "inn", "gargoyles"]); + + case "basket" (remove): + say("@A basket? I have one in my hope chest. Feel free to look for yourself.@"); + + case "sea" (remove): + say("@My father had gone out to help Yorl bring in the catch that afternoon.@"); + + case "Yorl" (remove): + say("@Oh, Yorl.@ She smiles to herself. @He and father were never apart. After my mother was kidnapped, Yorl helped my father get back on his feet. They were always together.@"); + say("Her gaze returns to you. @If my father had been drinking at the inn, Yorl would have been there.@"); + add(["inn"]); + + case "inn" (remove): + say("@My father and Yorl would go there after a good catch. Gideon had been a friend of theirs since youth. The three would would drink and reminisce together.@"); + add(["Gideon"]); + + case "Gideon" (remove): + say("@He and his wife are very kind to me. They have taught me so much about how to treat others.@"); + + case "gargoyles" (remove): + if (!gflags[MARNEY_SAVED]) + say("She looks at you and swallows. @I cannot talk about these creatures.@"); + else + say("@All this time we thought my father died at their hands. I hope that maybe they are just misunderstood, and not as evil as they are believed to be.@"); + + case "dock" (remove): + say("@Oh, you're probably wanting a skiff to get out to old Horance's island. Well, we have none for sale, but feel free to borrow the one at the dock. Be sure to return it, though!@"); + add(["Horance"]); + + case "Horance" (remove): + say("@Ah, now, Horance is much wiser than most know. He is also my mentor when it comes to poetry.@*"); + say("@He has a way of reminding me that I am too concerned with myself. It is a gentle way, but a firm reminder.@"); + + case "Lord British" (remove): + say("@I saw him once when I was a little girl. We had gone to his castle for a celebration and there he sat on a great white charger. What a sight he was.@"); + + + case "Michael" (remove): + + if (!gflags[MARNEY_SAVED]) //haven't saved her from Michael yet, she's still smitten + { + say("Her eyes brighten at the mention of his name. @He is a very handsome man. I see him only occasionally when he comes into town.@*"); + say("She looks absently out the window. @Yorl would never let me see him though.@"); + } + else + say("She looks down at the floor listlessly. @I still cannot believe he killed my father over a debt. I hope, however, that my father can finally be at rest.@"); + + case "Stivius" (remove): + say("@He is a sweet little man. He brought me wine on my sixteenth birthday. I'm quite fond of him.@"); + + case "Dezana" (remove): + say("@She has done as much as she can to heal my wounded heart. She bakes for me and we have long talks about almost everything.@*"); + say("@I wish I were as beautiful as she.@"); + + case "Trenton Bell" (remove): + say("@I believe he has done all he can for me. When my father was murdered, he took charge to find the gargoyles. None were found though.@"); + + + case "rune"(remove): + say("@I am sorry for our town. You see, my father was the caretaker of the rune stone.@*"); + say("@After he died, we had no way of finding out where he put it.@*"); + + case "bye": + if (!gflags[MARNEY_SAVED]) + { + say("@I am sorry that I wept. It is not your fault. Goodbye.@"); + avatar_goodbye = "@Goodbye..@"; + npc_goodbye = "@Sorry..@"; + + } + else + { + say("@I am sorry that I am still emotional. Thanks to thee, I have some closure, and my heart is on the mend.@"); + + avatar_goodbye = "@Take care, Marney.@"; + npc_goodbye = "@Thank thee, farewell.@"; + + } + + //prevent more talking + // UI_set_schedule_type(item, LOITER); + UI_run_schedule(item); + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Marta.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Marta.uc new file mode 100755 index 0000000..71ea2c9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Marta.uc @@ -0,0 +1,179 @@ + +void Marta object# (0x490) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + /* + if (event == PROXIMITY) + { + //barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@Insert line here..@", 0); + delayedBark(item, "@Insert line here@", 8); + delayedBark(item, "@Insert line here@", 16); + } + else if (barks == 2) + delayedBark(item, "@Other lines...@", 2); + else + delayedBark(item, "@Other lines...@", 3); + } + */ + +// if (event == DEATH) +// subtractKarma(15); + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Hello.@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@AHH! Whew, thou didst scare me.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("A rather plump woman with darting eyes."); + item.say("@Hello. How are you this fine day? What is it you need?@"); + } + else + item.say("@Hello again. Are you well " + polite_title + "?@"); + + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[LEARNED_ABOUT_QUENTON]) + add(["haunted", "ghost"]); + + if (UI_get_item_flag(DEZANA, MET)) + add (["Dezana"]); + + if (UI_get_item_flag(GIDEON, MET)) + add (["Gideon"]); + + if (UI_get_item_flag(MARNEY, MET)) + add (["Marney"]); + + if (UI_get_item_flag(YORL, MET)) + add (["Yorl"]); + + if (UI_get_item_flag(HORANCE, MET)) + add (["Horance"]); + + //set when you use Seance on Quenton + if (gflags[LEARNED_MICHAEL_NAME]) + add("Michael"); + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Marta.@"); + add(["Marta"]); + + case "job"(remove): + say("@Oh dear, my husband runs the inn. I tend my garden.@"); + add(["garden"]); + + case "Marta"(remove): + say("@It is a plain name, but I must live with it.@"); + + case "garden"(remove): + say("@You've not seen it? I have the loveliest roses.@"); + add(["roses"]); + + case "roses"(remove): + say("@Red as the evening sun on the sea.@"); + + case "Yorl"(remove): + say("@He's a messy person - and smelly too.@"); + + case "Marney"(remove): + say("@My dear little one? She is an angel - well minded, kind, thoughtful. She's a dear.@"); + + case "gargoyles"(remove): + say("@Nasty creatures, or so I hear. Can stomp a garden to pieces in minutes.@"); + + case "Gideon"(remove): + say("@My husband talks a bit too much, but I love him.@"); + + case "haunted"(remove): + say("@I want to move from this house as soon as we can.@"); + + case "Dezana"(remove): + say("@I cut myself one time in the garden. She healed it.@"); + + case "Horance"(remove): + say("@Another strange man. We have so many here.@"); + + case "Michael"(remove): + say("@He never comes into town.@"); + + case "ghost"(remove): + say("@It was the scariest thing I ever saw! I'm sure it's still lurking about somewhere...@"); + + case "bye": + var avatar_goodbye = "@Take care, Marta.@"; + var npc_goodbye = "@Goodbye and watch out for that ghost..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Michael.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Michael.uc new file mode 100755 index 0000000..410e0eb --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Michael.uc @@ -0,0 +1,218 @@ +void Michael object# (1100) () +{ + + var rand_npc; + + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var party = UI_get_party_list(); + + if (event == DEATH) + { + if (inParty(RENTHAR)) + { + RENTHAR.say("@Thy reign of murder and crime is over, Michael. You'll have the luxury of sitting in a cell awaiting the fate you deserve.@"); + MICHAEL.say("@You vile worm!@ He spits up blood. @There's no hole you can hide in that the captain won't find you! Not even running behind the Avatar's skirt will save thee from his wrath!@"); + RENTHAR.say("@I'm not afraid of death Michael, I will be seeking the virtues and trying to make amends for the wrongs I have committed over the years. The captain is running out of time, and eventually, you will too...@"); + MICHAEL.say("Michael seems to momentarily recoil, then yells: @The Captain will send aid for me, I am his chosen one! And then, I'll find you.. and make sure you suffer!@"); + RENTHAR.say("Renthar bounds Michael's hands with some rope. @Avatar, I will transport this swine to the jail in Yew and Rinaldo will decide his fate.@"); + if (gflags[MARNEY_GONE]) + RENTHAR.say("@I will try to loosen his tongue on the whereabouts of the girl on the long journey to Yew..@"); + UI_remove_from_party(RENTHAR); + + //Talk to Rinaldo to wrap things up + gflags[MICHAEL_CAPTURED] = true; + + //if Marney is gone and the Avatar let her go (worst ending), Renthar will have been killed by Michael's associates + if (gflags[FAILED_QUENTON_QUEST]) + { + RENTHAR->move_object([0822, 1876]);//move him to holding area + + //set DEAD flag + UI_set_item_flag(RENTHAR, DEAD); + + } + + else + { + + //send Renthar to Skara Brae + RENTHAR->move_object([0712, 0518]);//move him to Yew but change his schedules + RENTHAR->set_schedule_type(LOITER); + UI_set_new_schedules(RENTHAR, 0, SLEEP, [0253, 1610]); + UI_set_new_schedules(RENTHAR, 3, WANDER, [0199, 1674]); + UI_set_new_schedules(RENTHAR, 6, EAT, [0232, 1597]); + } + //set Michael's new schedules + MICHAEL->move_object([0722, 0549]);//move michael to cell + UI_set_new_schedules(MICHAEL, 2, TEND_SHOP, [0722, 0549]); + UI_set_new_schedules(MICHAEL, 6, PACE_HORIZONTAL, [0722, 0549]); // + UI_set_new_schedules(MICHAEL, 7, SLEEP, [0722, 0549]); + UI_run_schedule(MICHAEL); + return; + } + + } + if (gflags[QUENTON_MURDER_SOLVED] || gflags[MICHAEL_CAPTURED]) + { + item.say("Michael looks up as you approach, and stares a hole through you."); + item.say("@I have nothing to say to thee, Avatar. May the gargoyles tear thee into shreds!@"); + item.say("Michael spits at you, and turns away."); + script item after 3 ticks say "@Damn thee!@"; + return; + } + + if (gflags[FAILED_QUENTON_QUEST]) + { + item.say("Michael looks up as you approach, and sneers at you."); + item.say("@Avatar, thou dost look like you've lost something. Pray tell, what is it?@"); + var convo = chooseFromMenu(["Marney", "nothing"]); + if (convo == "Marney") + { + say("@Don't worry about her, " + polite_title + ". She's in good hands now and fetched a fair price for the captain.@"); + say("Michael pulls out a trinket and lets it dangle between his fingers... you then realize it's Marney's locket!"); + say("@Renthar will be dealt with in good time as well, I assure you that!!@"); + say("Michael grins and turns away from you."); + return; + } + if (convo == "nothing") + { + say("@Well then, run along Avatar...@"); + say("Michael pulls out a trinket and lets it dangle between his fingers... you then realize it's Marney's locket!"); + say("He grins at you through clenched teeth."); + return; + } + } + + if (event == DOUBLECLICK) + { + player_name = getAvatarName(); + polite_title = getPoliteTitle(); + party = UI_get_party_list(); + + if (gflags[MICHAEL_PISSED]) + { + item.say("Seeing you, Michael's eyes narrow with rage. @Leave here at once!@ he says, with clenched teeth. @Begone!!@"); + script item after 3 ticks say "@Begone!@"; + return; + } + else + item.say("You see a tall man with muscles looking like huge snakes. @Speak,@ he growls at you, his voice as rough and cold as stone."); + + + + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(QUENTON, MET)) + add ("ghost", "Quenton"); + + if (UI_get_item_flag(TRENTON, MET)) + add ("Trenton Bell"); + + if (UI_get_item_flag(GIDEON, MET)) + add ("Gideon"); + + if (UI_get_item_flag(MARNEY, MET)) + add ("Marney"); + + if (UI_get_item_flag(YORL, MET)) + add ("Yorl"); + + if (UI_get_item_flag(HORANCE, MET)) + add ("Horance"); + + if (UI_get_item_flag(LORD_BRITISH, MET)) + add ("Lord British"); + + //learned when you cast seance on Quenton + if (gflags[LEARNED_MICHAEL_NAME]) + add("Michael"); + + //Start of regular conversation tree + converse(options) + { + case "name": + say("@Are you taking a census?@ His powerful gaze is fixed on you."); + add(["census"]); + + case "job": + say("He ignores the question and you think it wise not to ask again."); + + case "census"(remove): + say("@Yes, you know, counting people, taking down names...@"); + + case "Michael"(remove): + say("@That name is given to friends so that they may feel they are close to me. Since I have none, refrain from its use.@"); + add("murderer!"); + + case "ghost"(remove): + say("@That is a concern of the town, not mine@"); + add(["murder"]); + + case "Quenton"(remove): + say("@He was not fortunate. It is written that it is better to be fortunate than skilled. He, I'm sure, would agree.@ His face betrays a slight grin."); + + case "murder"(remove): + say("@All men have enemies. A debt needed to be settled. He hadn't the strength to settle it, so someone decided to take the initiative.@ He pulls out a knife and begins to pick at his nails."); + add(["debt"]); + + case "debt"(remove): + say("@Surely you don't buy the fable of the gargoyle. There wouldn't be enough left to bury if this were the case. This was no monster who settled the debt, it was the work of man's hands.@ He brings the knife to his teeth and delicately works it between them."); + add(["gargoyle"]); + + case "gargoyle"(remove): + say("@Have you ever seen one? If you had you would not believe the fairy tales being told by that incompetent mayor.@ He grabs the knife and holds it aloft. @See this blade? Their fangs are twice as long and thrice as sharp.@"); + + case "Stivius"(remove): + say("@An annoying little man. Makes good wine though.@"); + + case "Horance"(remove): + say("@Perhaps the wisest of us all..@"); + + case "Marney"(remove): + say("@She is kind to me, and yet I believe this is genuine.@"); + + case "Gideon"(remove): + say("@Too kind for his own good.@"); + + case "Lord British"(remove): + say("@He is one to be respected. I have seen him fight, firsthand. He is a mighty warrior, as well as a just opponent.@"); + + case "Trenton Bell"(remove): + say("@He is a fool. The perfect man for his job.@"); + + + case "Yorl"(remove): + say("@I don't know him.@"); + + //quest + case "murderer!"(remove): + say("Michael looks at you sternly, almost amused."); + say("@I have no idea what you're talking about...@ he says, with a slow, condescending voice."); + add(["lie"]); + + case "lie"(remove): + say("Michael steps forward, staring you in the eyes. @Maybe you shouldn't be going around trying to drag people into the town's affairs...@"); + say("@Perhaps you should be careful of throwing around wild accusations...@"); + say("@I suggest you run along and go play with the gargoyles. Do not return here!@"); + gflags[MICHAEL_PISSED] = true; + if (UI_get_array_size(party) > 1) + { + rand_npc = randomPartyMember(); + rand_npc.say("As you depart, " + UI_get_npc_name(rand_npc) + " whispers to you. @Perhaps we should go speak with Lady Lenora of Yew " + player_name + ", and bring this fiend to justice!@"); + rand_npc.hide(); + + } + script item after 3 ticks say "@Do not return!@"; + break; + + + case "bye": + say("He resumes cleaning his nails with his knife."); + sayGoodbye2(item); + break; + + + } + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Quenton.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Quenton.uc new file mode 100755 index 0000000..c5d46ad --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Quenton.uc @@ -0,0 +1,191 @@ +void Quenton object# (0x492) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + + var player_is_female = UI_is_pc_female(); + + var avatarhealth = UI_get_npc_prop(UI_get_avatar_ref(), HEALTH); + + var time_of_day = timeFunction(hour); + + if (event == DOUBLECLICK) + { + + if (partynum > 1) greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + var met_quenton = UI_get_item_flag(item, MET); // + + //barks for Avatar + if (!met_quenton) + bark = "@...Spirit?@"; // + else + bark = "@...Quenton?@"; //barked after npc is met + + script AVATAR + { + call GenericFreeze; + face AVATAR->find_direction(item); + actor frame standing; + say bark; + wait 10; + }; + + //NPC barks + if (!met_quenton) + bark = "@...@"; // + else + bark = "@...@"; //bark when npc met you already + + script item + { + call GenericFreeze; + wait 5; + face find_direction(AVATAR); + actor frame standing; + say bark; + wait 8; + call (Quenton); + }; + } + else if (event == SCRIPTED) + { + //Unfreeze Avatar and ITEM: + AVATAR->GenericUnfreeze(); + item->GenericUnfreeze(); + + if (gflags[SEANCE_QUENTON]) + { + if (!gflags[LEARNED_MICHAEL_NAME]) + { + // gflags[SEANCE_QUENTON] = false; + UI_set_weather(FOG); + UI_set_weather(RAIN); + UI_play_music(32); + item.say("After casting the Seance spell, you approach the restless spirit of Quenton. He attempts to speak to you."); + item.say("At first, his mouth moves and you hear nothing. Moments later, you hear the faint voice of a man, but it is as if someone was speaking to you from another room entirely.*"); + item.say("You notice his mouth doesn't quite synch up with the voice that seems to be somewhere in the back of your mind. The spirit's eyes grow larger and more intense as if he was concentrating harder on his message. The voice starts to synch up more with the words, which are still muffled but becoming a bit more clear.*"); + item.say("Quenton's eyes grow more desperate and a sense of frustration comes over him. The voice, now sounding like muffled shouting from another room, starts to echo louder in your mind. You feel a draining sensation, as if your life's energy was being sucked from you and your overwhelmed with a feeling of despair.*"); + item.say("You attempt to break concentration but find yourself unable to. The spirit's eyes appear to glow, and you feel like your almost being sucked into them. Everything seems to be going black around you, and you feel faint. The shade's eyes don't avert their gaze from you as the voice starts to become a little more audible."); + item.say("In a flash, you see a series of events that happens so fast you cannot comprehend them, but you understand that you are seeing -- or somehow experiencing -- Quenton's final moments."); + item.say("From the muffled voice, now almost shouting, you discern the name 'Michael' and the look in the shade's eyes is now one of complete terror, mouth gaping open. The instantaneous image of a dagger cutting through the darkness seems to bring you to your knees, as if your mind was literally stabbed by it.*"); + item.say("A bloodcurdling scream from beyond tears through your mind. It is one of the most horrifying things you've ever heard. You don't even feel yourself hitting the ground as everything around you fades to black."); + AVATAR->reduce_health(avatarhealth, SONIC_DAMAGE); + UI_play_sound_effect(67); + if (partynum > 1) + randomPartyBark("Avatar, art thou alright??"); + + gflags[LEARNED_MICHAEL_NAME] = true; + return; + } + else + { + item.say("You feel it's probably a good idea to avoid speaking with Quenton again in this state, as his painful memories made the connection more powerful - and frightening."); + return; + } + } + else if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("A vaporous form hovering before you."); + item.say("The form is that of a man. His mouth moves, yet no words can be heard..."); + } + else + item.say("A shiver runs up your spine as you feel a chilling draft..."); + UI_play_music(40); + + var options = ["gargoyle", "name", "bye"]; + + if (UI_get_item_flag(item, SI_ZOMBIE)); //when asked about murder from someone + add("Quenton", "murder"); + if (UI_get_item_flag(MARNEY, MET)) + add ("Marney"); + + //easter egg - if player is named Doug the Eagle or Nakar, Quenton is obligated to join! (read their hilarious walkthroughs!) + if (player_name == "Doug the Eagle" || player_name == "Nakar" || (player_name == "Steve" && player_is_female)) + add("join"); + + if (inParty(QUENTON)) + add("leave"); + + //Start of regular conversation tree + converse(options) + { + case "Quenton" (remove): + say("You speak the word and the spectre responds by pointing a boney hand to his chest."); + add(["murder"]); + + case "name"(remove): + say("You hear no answer save the rustle of the leaves on the ground around you."); + + case "murder" (remove): + say("You speak the word and the spectre responds by pointing a boney hand to his eye."); + add(["eye", "how"]); + + case "gargoyle" (remove): + say("A whirlpool of leaves, twigs and stones whips up around you. Your clothing is yanked by the strong wind forcing you to grip it tightly in your hands."); + + case "Marney" (remove): + say("A cool breeze blows through your hair. You suddenly smell the scent of a storm approaching."); + UI_set_weather(RAIN); + + case "eye" (remove): + say("A wind from behind blows your hair, covering your eyes."); + + case "how" (remove): + say("The ghostly image shimmers for a moment and then he points a boney finger to his neck."); + add(["who"]); + + case "who" (remove): + say("The spectre's arm thrusts out, pointing to the sea."); + add(["sea"]); + + case "sea" (remove): + say("The spectre's arm thrusts again, this time. This time you see it points towards the pier."); + + case "join" (remove): + say("Because your name is " + player_name + ", the spirit feels compelled to join you!"); + if (partynum < 8) + { + say("@...@*"); + UI_add_to_party(item); + sayGoodbyeAbrupt(item, "..."); + break; + } + else + say("...but your party is too full. The spectre looks disappointed."); + + case "leave"(remove): + say("The spirit looks dejected, but leaves the party."); + UI_remove_from_party(item); + sayGoodbyeAbrupt2(item, "..."); + + script item + call leaveParty, MOVE_NPC2; + + return; + + + + + case "bye": + say("A strong breeze suddenly assaults you with twigs and leaves."); + avatar_bark = "@Goodbye...@"; + npc_bark = "@...@"; + delayedBark(AVATAR, avatar_bark, 0); + delayedBark(QUENTON, npc_bark, 4); + break; + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Renthar.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Renthar.uc new file mode 100755 index 0000000..14b6978 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Renthar.uc @@ -0,0 +1,279 @@ + + +void Renthar object# (0x465) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var avatar_goodbye; + var npc_goodbye; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hold!@"; + var npc_1st_greet = "@Not now.@"; + + var av_2nd_greet = "@Excuse me..@"; + var npc_2nd_greet = "@I have a moment now.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + + if (gflags[MICHAEL_CAPTURED] && !UI_get_item_flag(item, NAKED) ) + { + + avatar_goodbye = "@Goodbye, Renthar.@"; + npc_goodbye = "@Go in Spirituality!@"; + + item.say("@Greetings Avatar. Michael has been brought to justice finally and is awaiting his fate. I have given Rinaldo all of the information I know on the other pirates.@"); + item.say("@Now that he is safely behind bars, I have something that might interest you. After I left the crew, I managed to steal a great treasure from one of the Captain's hoards.@"); + item.say("@I hid it in a safe place, lest Michael managed to slay me, to keep it out of their hands. It's a powerful artifact.@"); + item.say("@I believe it to be the Mystic Armour, created by the legendary blacksmith, Zircon. I would like thee to have it.@"); + item.say("@It will serve thee well in thy quest. It will be safe with the Avatar.@"); + item.say("He hands you the Mystic Armour"); + item.say("@Farewell, Avatar, I have much to learn from the townsfolk here.@"); + UI_set_item_flag(item, NAKED);//prevent more armour + UI_add_party_items(1, SHAPE_MYSTIC_ARMOUR, QUALITY_ANY, FRAME_ANY, true); + + sayGoodbye(item, npc_goodbye, avatar_goodbye); + return; + + } + + + + + + + + if (!UI_get_item_flag(item, MET)) + { + item.say("A solemn looking man, who looks as if the weight of the world was on his shoulders.*"); + item.say("@Not now, " + polite_title + ", I must speak with Rinaldo about an important matter.@"); + UI_clear_item_flag(item, MET); + UI_set_schedule_type(item, LOITER); + return; + } + else + item.say("@Greetings, " + polite_title + ", how might I assist thee?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (!gflags[QUENTON_MURDER_SOLVED]) + add("Rinaldo"); + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + //Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Renthar, " + polite_title + ".@*"); + + case "job"(remove): + say("@Formerly, I was an assassin.@"); + say("@I am trying to put those days behind me, and become more virtuous.@"); + + case "Rinaldo"(remove): + say("@My apologies for my shortness earlier. It was urgent that I spoke with him.@*"); + add(["urgent"]); + + case "urgent"(remove): + say("@Yes, " + polite_title + ", I had to inform him of the whereabouts of my former crew...@*"); + add(["former crew"]); + + + case "former crew"(remove): + say("@Aye, I used to be an assassin for my Captain. I have since been reformed. Rinaldo has agreed to give me a pardon for my former life, in return for information leading to their capture.@*"); + add(["reformed", "Captain", "pardon"]); + + case "reformed"(remove): + say("@My former Captain sent his latest protege' to kill me, thinking I was plotting his demise.@"); + say("@Michael almost succeeded...but I was able to jump from the ship and make it to shore.@"); + say("@As I lay on that shore dying, darkness surrounded my mind and I could see the Void opening up to consume me...@"); + say("@But then...it came to me in the form of a vision... an Ankh glowing in the clouds.@*"); + say("@It vanquished the darkness in my mind, then I knew I had to seek out redemption through the virtue of Spirituality.@*"); + say("@It gave me the strength to keep fighting, and I've recovered, but the scars will always remain.@*"); + add(["Michael", "Spirituality"]); + + case "Michael"(remove): + say("@He was recruited at a young age, and the Captain trained him well.@*"); + say("@Michael was often sent to the mainland to collect debts from the Captain's 'legitimate businesses'@*"); + say("@Or assassinate those who didn't pay, or tried to evade us.@*"); + say("@He is very cunning, and sought my position as the Captain's most trusted henchman.@*"); + say("@The seeds of discontent were sown within the Captain's mind, that I was plotting against him.. thus Michael betrayed me and was ordered to kill me.@*"); + if (gflags[MICHAEL_CAPTURED]) + say("@Thanks to thee, his reign of murder is over. The guillotine is a proper fate for him.@"); + else + { + add(["Michael's whereabouts"]); + } + + case "Spirituality"(remove): + if (gflags[MICHAEL_CAPTURED]) + say("@With the guidance of the people of Skara Brae, my journey of Spiritual enlightenment will continue to grow.@"); + else + { + say("@When I recovered, I traveled to the nearby city of Skara Brae to learn more and seek out the Shrine. The townsfolk were in mourning.@*"); + say("@I learned some pirates landed in a ship, bearing the crest of Mondain on it's sails. My former crew.@*"); + say("He looks down at the floor. @They had abducted and killed the woman, and were only there because of me.@*"); + say("@They must have knew I was still alive, and assumed I had sought out the healer there.@*"); + add(["Mondain", "pirates"]); + } + + case "Mondain"(remove): + say("@Aye, the black sails, skull and glowing gem.@*"); + say("@The Captain's ship, 'The Revenge', was rumored to be the finest and most feared vessel in Mondain's fleet.@"); + say("@It was rumored to have a magical protection hex put upon it by either Mondain himself, or Minax...@"); + + case "pirates"(remove): + say("@They're the meanest, most cutthroat pirates the Captain could find.@*"); + say("@I am hoping Rinaldo can bring them to justice, with everything I know about them.@*"); + + case "pardon"(remove): + say("@The other woman, Lady Lenora, scoffed at my request for a pardon in exchange for information on the arrests of the pirates and my former Captain.@*"); + say("@She tried to have me arrested! I evaded and lived in solitude until I found that Rinaldo had returned.@*"); + say("@Rinaldo was skeptical at first, but the Captain never had any defections, and the Royal Navy had been searching for 'The Revenge' for many years.@*"); + + case "Captain"(remove): + say("@Captain Zagros...many pirates believe him to be a myth... but he's no myth.@*"); + say("@He was the Captain of Mondain's Black Fleet. It was believed his proximity to Mondain and the Gem of Immortality gave him an unnaturally long life.@*"); + say("@Zagros served under Minax, and Exodus as well during the golden age of piracy.*"); + + case "Michael's whereabouts"(remove): + say("@I watched Michael for a while, from a safe distance.@*"); + say("@The scars and pain I was feeling from the attempt on my life screamed at me to kill him...@*"); + say("@But my quest for Spirituality would have been all for naught.@*"); + add(["Michael gone"]); + + + case "Michael gone"(remove): + if (gflags[MARNEY_SAVED]) + say("You tell him that Michael has escaped when confronted about his crimes and his whereabouts unknown.*"); + else + say("You tell him that Michael has escaped with Marney when confronted about his crimes and his whereabouts unknown."); + say("@I see...@*"); + say("@I know where Michael might be. And as tempting as it might be to have thee to slay him...@*"); + say("@I want him to truly face justice for his crimes, and dread the fate that will await him.@*"); + say("@I will take you to the place he is most likely hiding, and we will bring him back -alive- and let him contemplate his fate and his actions...@"); + say("@What say you?@"); + if (askYesNo()) + { + if (partynum < 8) + { + say("Renthar joins your party. @I will lead you to the safehouse Michael is probably hiding. We must hurry because he won't be there for long.@"); + say("@We need to journey southeast of Skara Brae, where the river Maelstrom splits and empties into the sea. There is a small strip of land where a safehouse was built.@"); + say("@Michael is most likely staying there until he moves on. Let us be off, shall we?@"); + gflags[RENTHAR_IN_PARTY] = true; //flag set to keep Renthar from going too far with the party + UI_add_to_party(item); + sayGoodbye2(item); + return; + } + else say("@You have too many following you at the moment. Have one of them stay behind and we will continue, but make haste!@"); + sayGoodbye2(item); + return; + } + else say("@Time is running out, Avatar. You must reconsider if catching Michael is a priority to thee...@"); + sayGoodbye2(item); + return; + + // say("@I will tell Rinaldo of where Michael is hiding. But I will ask thee a favor in return.@*"); + // add(["favor"]); + +/* + case "favor"(remove): + say("@The Captain is one not to be trifled with. No cell will hold him, he'll only escape.@*"); + say("@Thou wilt have to stop him yourself.@*"); + say("@The last of the Black Fleet, 'The Revenge' still sails.. but it's magical protection is wearing off.@*"); + say("@He's vulnerable now, but all the more dangerous.@*"); + say("@If thou art brave enough to face him, I shall tell thee his location.@*"); + + //Disabled for now, will be in a future patch + + if (askYesNo()) + { + say("@Thou art brave indeed, " + polite_title + ". There is a mountain range near Spiritwood, where the River Maelstrom flows to the south.@"); + say("@Sail due east straight towards the mountains, - but do not be afraid!@"); + say("@Zagros' witch, Evanora, placed an illusion there. It hath protected him for a long time, and only Zagros' closest followers know about it.@"); + say("@You'll sail through the illusionary mountainside, and go through the tunnel. Be aware! His most zealous fighters will protect him at all cost!@"); + say("@You can find me later in Skara Brae, I have much to learn about Spirituality. I will ensure that any witnesses to Michael's crimes will be protected.@"); + UI_set_item_flag(item, SI_ZOMBIE); //to change 'bye' line + add(["Evanora"]); + } + else + say("@Then thou aren't as brave as the stories hath said.@*"); + */ + + case "Evanora"(remove): + say("@She likens herself to be the second coming of Minax...her loyalty to him is only outmatched by her sheer insanity.@*"); + say("@She's a dangerous one though, not to be trifled with. Do thou be careful, and don't let her put a hex upon thee.@*"); + say("@Thou wilt surely encounter her magical traps, so stay alert!@"); + + case "bye": + + if (UI_get_item_flag(item, SI_ZOMBIE)) + { + avatar_goodbye = "@Goodbye, Renthar.@"; + npc_goodbye = "@Good luck!@"; + } + else + { + avatar_goodbye = "@So long..@"; + npc_goodbye = "@Farewell to thee.@"; + + } + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Stivius.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Stivius.uc new file mode 100755 index 0000000..dbb2865 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Stivius.uc @@ -0,0 +1,291 @@ + +void Stivius object# (0x493) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + + const int SHAPE_BOTTLE = 616; + const int SKARA_RED_SELL_PRICE = 100; + const int WHITE_WINE_SELL_PRICE = 10; + const int SKARA_DRY_SELL_PRICE = 100; + + + const int FRAME_SKARA_RED = 11; + //shopkeeper options + var cant_hold = ["@You look pretty full to me.@"]; + var cant_afford = ["Stivius looks at you. @Thou dost not have enough gold.@"]; + var success = ["@Excellent!@ After accepting your gold, he hands over the wine."]; + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Yeah. Ok. Yeah."; + + var av_2nd_greet = "@A moment, milord.@"; + var npc_2nd_greet = "@Yeah. Ok. Yeah.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + item.say("A tiny little man with wild eyes.*"); + if (!UI_get_item_flag(item, PETRA)) + { + + item.say("He looks you up and down and then claps his hands together. @Yeah. Ok. Yeah. What can I do you for?@"); + UI_set_item_flag(item, PETRA); + } + else + item.say("@Back for some more wine?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + if (gflags[LEARNED_MICHAEL_NAME]) + add("Michael"); + + if (gflags[LEARNED_ABOUT_QUENTON]) + add("ghost"); + + + if (UI_get_item_flag(LORD_BRITISH, MET)) + add ("Lord British"); + + if (UI_get_item_flag(TRENTON, MET)) + add ("Trenton Bell"); + + if (UI_get_item_flag(DEZANA, MET)) + add ("Dezana"); + + ///////////////////////////////////////////////////////////////////// + //Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Stivius the wine merchant is mine.@*"); + add(["Stivius"]); + + case "job"(remove): + say("@I make wine.@"); + add(["buy"]); + + case "buy"(remove): + if (!UI_get_schedule_type(item, TEND_SHOP)) + say("@Come back tomorrow when my shop is open.@"); + else + { + //shopkeeper options + var cant_hold = "@You look pretty full to me.@"; + var cant_afford = "Stivius looks at you. @Thou dost not have enough gold.@"; + var success = "@Excellent!@ After accepting your gold, he hands over the wine."; + var askIfInterested; + var saidNo = "@It's good wine.@"; + var quantity = 1; + + say("@Yeah. Maybe you want to buy some?@"); + if (askYesNo()) + { + say("@Which of these?@"); + var choice = chooseFromMenu(["Skara Red Wine", "Skara White Wine", "Skara Dry Wine", "Red Wine", "nothing"]); + + if (choice == "Skara Red Wine") + { + askIfInterested = "@Stivius smiles at you. For Skara Red wine it will cost you 20 gold. Interested?@"; + basicSell(item, SHAPE_BOTTLE, quantity, QUALITY_ANY, FRAME_SKARA_RED, 20, cant_hold, cant_afford, success, askIfInterested, saidNo); + } + else if (choice == "Skara White Wine") + { + askIfInterested = "@Stivius smiles at you. For Skara White wine it will cost you 10 gold. Interested?@"; + basicSell(item, SHAPE_BOTTLE, quantity, QUALITY_ANY, 16, 10, cant_hold, cant_afford, success, askIfInterested, saidNo); + + } + + else if (choice == "Skara Dry Wine") + { + askIfInterested = "@Stivius smiles at you. For Skara Dry wine it will cost you " + SKARA_DRY_SELL_PRICE + " gold. Interested?@"; + basicSell(item, SHAPE_BOTTLE, quantity, QUALITY_ANY, 12, SKARA_DRY_SELL_PRICE, cant_hold, cant_afford, success, askIfInterested, saidNo); + + } + + else if (choice == "Red Wine") + { + askIfInterested = "@Stivius smiles at you. For Red wine it will cost you 20 gold. Interested?@"; + basicSell(item, SHAPE_BOTTLE, quantity, QUALITY_ANY, 5, 20, cant_hold, cant_afford, success, askIfInterested, saidNo); + + } + + else if (choice == "nothing") + say("@What else can I do for you?@"); + + + + } + else + say("@It's good wine.@"); + } + + case "Stivius"(remove): + say("@Quite a name, eh?@*"); + + case "ghost"(remove): + say("@It's not just a tale you've been hearing.@"); + add(["tale"]); + + case "tale"(remove): + say("@Everyone knows that Quenton haunts this town. If I had been murdered by those evil ones...but that's just gossip.@*"); + add(["Quenton", "murdered"]); + + case "Quenton"(remove): + say("@He was a nice enough soul. I sold many bottles to him.@*"); + + case "murdered"(remove): + say("@It was late one night and I had just returned from my fields. 'Course my path takes me right by Gideon's garden.@*"); + say("@I heard a noise by the well and saw some dark forms hunched there. They had huge wings and evil red eyes. I ran like the wind to my doorway.@"); + say("@I was sure I was dead.@*"); + add(["Gideon", "noise", "dark", "evil"]); + + case "Gideon"(remove): + say("@Gideon runs the Haunting Inn. His wife has a garden which you can see from my front door.@*"); + add(["Haunting Inn", "wife"]); + + case "noise"(remove): + say("@Twas a strange whispering, in a tongue I could not understand.@*"); + add(["whispering"]); + + case "dark"(remove): + say("@I couldn't see too clearly. They were about man-sized though.@*"); + add(["man-sized"]); + + case "Haunting Inn"(remove): + say("@It's the Inn straight across the lane from here.@*"); + + case "wife"(remove): + say("@She doesn't do much. Helps him run the place.@*"); + + case "whispering"(remove): + say("@It didn't sound like any language I ever heard. More like one o' them guild languages.@*"); + add(["languages"]); + + case "languages"(remove): + say("@Like the one the alchemist speaks.@*"); + add(["alchemist"]); + + case "alchemist"(remove): + say("Go ask old Horance. He can tell ya - if you can understand him!@*"); + add(["Horance"]); + + case "Horance"(remove): + say("@He lives over on Ivers Rounding by himself.@*"); + add(["Ivers Rounding"]); + + case "Ivers Rounding"(remove): + + say("@You must be new to this village. Go see Marney, she'll get you there.@*"); + add(["Marney"]); + + case "Marney"(remove): + say("@She's the daughter of Quenton - the ghost.@*"); + add(["Quenton"]); + + case "man-sized"(remove): + say("@Yes, but they were hunched down so it was hard to see them.@*"); + + + case "evil"(remove): + say("@His eyes widen. @Gargoyles they were! Must'a been ten or twelve of 'em.@*"); + add(["gargoyles", "twelve?"]); + + + case "gargoyles"(remove): + say("@Yes. Big, ugly, snarling beasts. 'Course, they were kneeling when I saw 'em.@*"); + add(["kneeling"]); + + case "twelve?"(remove): + say("@Well, perhaps more like two or three. I didn't stay around and count 'em.@*"); + + case "kneeling"(remove): + say("@You know, on their knees.@*"); + + + case "Trenton Bell"(remove): + say("@I don't care much for him. He's always trying to get me to sell him my wine cheaper.@"); + + + case "Dezana"(remove): + say("@She's my sweetie.@ He clasps his hands next to his cheek. @I count the hours until I can see her.@"); + + + case "Michael"(remove): + say("@I have never talked to him. He bought wine from me once but that's it.@"); + if (gflags[STARTED_INVESTIGATION]) + add(["tell me more.."]); + + + case "Lord British"(remove): + say("@Well, what's to say? I am glad he is again our ruler.@"); + + case "tell me more.."(remove): + say("@Wha.. what do you mean " + polite_title + "?@ You notice Stivius starting to sweat!"); + AVATAR.say("You tell him that you don't buy the gargoyle story and that you believe he saw Michael committing the crime."); + AVATAR.hide(); + + if (!UI_set_item_flag(item, NAKED)) + UI_set_item_flag(item, NAKED); //knows Stivius is a witness. Rinaldo can ask him to testify + + say("Stivius looks at you with wide, unbelieving eyes. @Please " + polite_title + ", I saw nothing.@"); + say("After seeing your skeptical face, he sighs. @Alright, alright...@ he says, voice trembling. @I saw Michael do it. He caught me as I was trying to go back into mine home. He brandished the knife and swore he'd kill me!@"); + say("@I made up the gargoyle tale, because I fear him and his retribution!@"); + say("He looks at you incredulously. @Oh, no " + polite_title + ". I know what you ask of me, and I cannot - and will not - do it. Please, leave me be. I'm terrified enough as it is of the man. Please go...@"); + sayGoodbyeAbrupt2(item, "@I must get back to work.@"); + if (!gflags[STIVIUS_SAW_MICHAEL]) + gflags[STIVIUS_SAW_MICHAEL] = true; + UI_set_schedule_type(item, SHY); + break; + + case "bye": + var avatar_goodbye = "@Farewell..@"; + var npc_goodbye = "@Come back if you get thirsty.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Trenton.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Trenton.uc new file mode 100755 index 0000000..4531bd2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Trenton.uc @@ -0,0 +1,223 @@ + +void Trenton object# (0x48e) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings..@"; + var npc_1st_greet = "@Yes?@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@You have come back. Well?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a tall, rather well dressed man with a wilted smile.*"); + item.say("@Yes?@ he asks, reaching over and removing something invisible from your shoulder."); + UI_set_item_flag(item, MET); + } + else + item.say("Recognizing you, his smile flickers a moment. @You have come back. Well?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //set when you use Seance on Quenton + if (gflags[LEARNED_MICHAEL_NAME]) + add("Michael"); + + if (UI_get_item_flag(DEZANA, MET)) + add ("Dezana"); + + if (UI_get_item_flag(GIDEON, MET)) + add ("Gideon"); + + if (UI_get_item_flag(YORL, MET)) + add ("Yorl"); + + if (UI_get_item_flag(MARNEY, MET)) + add ("Marney"); + + if (UI_get_item_flag(HORANCE, MET)) + add ("Horance"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) + say("@He sniffs the air as if smelling something bad. @I am, of course, Trenton Bell, the mayor. You may call me 'Your Honor'.@"); + else + say("@You've forgotten? Well, 'Your honor' will do.@"); + add(["Trenton Bell"]); + + case "job"(remove): + say("@Job? I do not labor like others.@"); + add(["labor"]); + + case "Trenton Bell"(remove): + say("@I would appreciate if you would use my title, 'Your Honor'.@"); + add(["title", "'Your Honor'"]); + + case "labor"(remove): + say("@You know: rigging the masts or swabbing the decks.@"); + add(["rigging"]); + + case "title"(remove): + say("@Yes, I am mayor.@"); + add(["mantra", "rune", "shrine"]); + + case "'Your Honor'"(remove): + say("@Yes?@"); + + case "mantra"(remove): + say("@Well, surely thou canst read, yes?@"); + add(["read"]); + + case "read"(remove): + say("@Yes, reading books is good for your spiritual side.@"); + + case "rigging"(remove): + say("@You aren't much of a sailor are you? Yorl and that young Delancy girl can tell you about that.@"); + add(["Yorl", "Marney"]); + + case "Yorl"(remove): + say("@He works at the pier with the Delancy girl.@"); + + case "Marney"(remove): + say("@She has run the pier ever since her father, Quenton, was attacked by a gargoyle.@ He coughs then clears his throat."); + add(["gargoyle", "Quenton"]); + + case "gargoyle"(remove): + say("@Huge fierce creatures, they are. Quenton didn't even have time to scream before one of those beasts had killed him.@"); + add(["scream"]); + + case "Quenton"(remove): + say("@We were not friends...not good friends, that is. He resented my position.@"); + add(["position"]); + + case "rune"(remove): + if (!UI_set_item_flag(MARNEY, PETRA)) + UI_set_item_flag(MARNEY, PETRA); //opens up rune convo option + say("@Quenton, not I, was in charge of its safe keeping. Just as I suspected, when he died, so too did our chances of finding the rune. You see, he never told anyone where it was located.@"); + add(["Quenton"]); + + case "shrine"(remove): + say("@Speak to Horance of that. He may be mad, but he is still quick and astute in the ways of magic.@"); + add(["Horance"]); + + case "position"(remove): + say("@Yes, well, as mayor, I am the shepherd of the spiritual people of this hamlet.@"); + add(["spiritual"]); + + case "spiritual"(remove): + say("@We do not believe in violence as a solution to our problems. My flock would not fight against anyone. Therefore, I'm alarmed at the recent gargoyle sightings.@"); + add(["gargoyle"]); + + case "scream"(remove): + say("@Many believe if he had screamed, someone in the inn would have heard him.@"); + add(["inn"]); + + case "inn"(remove): + say("@A couple of travelers were staying there that night, but they said they heard nothing. Still, I find this strange.@"); + add(["strange", "travelers"]); + + case "strange"(remove): + say("@Yes, you see, my brother is a guard for Lord British. A few months ago, a gargoyle attempted to enter the castle proper. He said that although they killed the beast, it's horrifying noises still give him nightmares.@"); + add(["nightmares"]); + + case "travelers"(remove): + say("@I do not know their names. 'Twas Gideon questioned them, not I.@"); + // add(["Gideon"]); + + case "Gideon"(remove): + say("@He runs the Haunting Inn.@"); + add(["Haunting Inn"]); + + case "Haunting Inn"(remove): + say("@The one the travelers were at. It's across the way.@ He frowns at you."); + add(["travelers"]); + + case "nightmares"(remove): + say("@He keeps hearing its deep growl. I'm sure that even if Quenton couldn't scream, someone would have heard that growl.@"); + + case "Horance"(remove): + say("@For the life of me I've never understood a word he's ever said. They say he drank one too many potions.@"); + +//these should be triggered if met + case "Dezana"(remove): + say("@She is a peaceful woman. Very pleasant to talk to.@"); + + case "Michael"(remove): + say("@He is a very private sort. I've never been to his abode. He lives east of here, along the road to Britain.@"); + add("investigate Michael"); + + case "investigate Michael"(remove): + say("@Investigate him? Why? We already determined it was the gargoyles who killed Quenton.@"); + say("@If you wish to re-open the investigation, you should take that up with Lady Lenora in Yew. I'm much too busy..@"); + + + case "bye": + var avatar_goodbye = "@That is all..@"; + var npc_goodbye = "@Goodbye.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Yorl.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Yorl.uc new file mode 100755 index 0000000..da846e3 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/SkaraBrae/Yorl.uc @@ -0,0 +1,283 @@ +void Yorl object# (0x491) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female; + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // noun = " "; + // title = "madame"; + } + else + { + // noun = " "; + // title = " "; + } + + //determine single/plural greeting + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Hail, fisherman!@"; + var npc_1st_greet = "@Ahoy!@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Ah!@"; + + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + if (gflags[FAILED_QUENTON_QUEST]) + { + item.say("Yorl looks like he has seen better days, his eyes look bloodshot and he looks worried."); + item.say("@She's gone... Marney's gone. I was supposed to protect her. You let her leave with that bastard!@"); + item.say("Yorl's voice cracks with anger. @It's all I kin do from taking this here hook and jammin it through yer skull. Get out of here, and don't come back...@"); + delayedBark(item, "@..shes gone...@", 3); + UI_set_schedule_type(item, SHY); + return; + } + + if (!UI_get_item_flag(item, MET)) + { + item.say("A huge, imposing man adorned in a leather apron.*"); + item.say("@Good " + time_of_day + ", friend.@ He extends a huge hand which resembles a slab of meat."); + UI_set_item_flag(item, MET); + } + else + { + item.say("@Ah!@ He rumbles up to you with a large, bloody hook."); + item.say("@You feel like bolting, but then he drops it in a pocket on his apron and extends a bloody hand. He smells strongly of fish."); + } + item.say("@What do ya need?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + // Conversation options based on MET flag of other npc's - delete all if not used + + if (gflags[LEARNED_MICHAEL_NAME]){ + add("Michael"); + } + + if (UI_get_item_flag(TRENTON, MET)){ + add("Trenton Bell"); + } + + if (UI_get_item_flag(DEZANA, MET)){ + add("Dezana"); + } + + if (UI_get_item_flag(GIDEON, MET) || UI_get_item_flag(QUENTON, MET)) + add("ghost"); + + + /*//////////////////////////////////////////////////////////////////// + Main conversation thread + + *///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Yorl. A short name, but a strong one!@"); + add(["Yorl"]); + + case "job"(remove): + say("@I'm a fisherman. 'Tisn't quite as exciting as some jobs, but it keeps me near the sea.@"); + add(["sea"]); + + case "Yorl"(remove): + say("@My father was a coastal raider. But don't let that out.@ He lets out a holler and laughs loudly."); + add(["father", "raider"]); + + case "father"(remove): + say("@Yes, I had one.@ He hollers again, this time slapping you on the back."); + + case "raider"(remove): + say("He suddenly stops laughing and looks at you, his eyes angry and wide. @Who told you?@ With that he throws his head back and laughs again."); + + case "sea"(remove): + say("@Oh, aye, love the sea I do. Even if the fishing's been poor of late.@"); + add(["fishing"]); + + case "fishing"(remove): + say("@Fish come, fish go. Right now, the fish have gone. But they'll come back! And when they do, I'll be waitin' for 'em with my nets!@"); + add(["nets"]); + + case "nets"(remove): + say("@Aye, you haveta use nets to do serious fishing. A pole'll never catch you enough to sell.@"); + add(["pole"]); + + case "ghost"(remove): + say("@That's a tale they tell in town. I've seen no spirits. Except at old Stivius'.@"); + add(["tale", "Stivius"]); + + case "tale"(remove): + say("@You know, 'bout Marn's pa haunting the vineyard.@ He leans closer wiping his hands on his apron. @I think Stivius has been drinkin' his profits.@"); + add(["Marney", "vineyard", "amulet"]); + + case "Stivius"(remove): + say("He removes a large hook from his pocket and begins to clean it as he talks. @He's a strange little guy. They say he's the only one who saw Quen murdered. I wish we'd had a better witness.@"); + say("He flips the hook over and over examining it. @Still, those gargoyles would frighten any man. 'Specially one as small as him.@"); + add(["gargoyles"]); + + case "Marney"(remove): + if (gflags[MARNEY_PISSED]) + { + say("@I can't believe she ran away with Michael, and I wasn't there to stop her. She's not been the same since.@"); + } + else if (gflags[MARNEY_SAVED]) + { + say("@I can thank ya enough Avatar, for saving my dear Marney from that scoundrel Michael. She's still heartbroken and feels guilty for wanting to leave, but she's on the mend and seems more at peace now.@"); + } + else say("@She's the loveliest thing ever seen in these parts. I'm her father now. And if any man should want her hand, he'd better be able to take me square!@ He gives you a huge grin and flexes a massive bicep."); + + case "vineyard"(remove): + say("@They say that Quen's ghost haunts that area of town. I can't imagine why. The sea was his lifeblood.@"); + add(["Quenton"]); + + case "Quenton"(remove): + say("@He and I were mates. I can still remember the moment they told me he was dead.@ He swallows hard and his eyes become glassy. @I miss old Quen.@"); + add(["they"]); + + case "they"(remove): + say("@Gideon and Stivius. They came to my house before dawn and told me that Quen had been killed by gargoyles.@"); + add(["Gideon", "Stivius", "gargoyles"]); + + case "Gideon"(remove): + say("@He owns the Haunting Inn. He's good people, though his wife is a bit of a nag.@"); + add(["wife"]); + + case "wife"(remove): + say("@She always complains that my house is an eyesore. I tell you if she comes around here, I'll show her what an eyesore really is!@ He slaps you on the back and laughs."); + add(["eyesore"]); + + case "gargoyles"(remove): + say("@I never seen a one. I seen alot o' things out at sea, serpents as big as the biggest four-master. But 'nary a single gargoyle.@ He looks out towards the sea."); + add(["serpents", "four-master"]); + + case "four-master"(remove): + say("@One o' the tall ships. My father used to pilot one o' the biggest in Lord British's fleet. The Merideth Ann. She was a sight to behold, she was.@"); + add(["Lord British", "Merideth Ann"]); + + case "Lord British"(remove): + say("@My father used to sail in one of his fleets. A brave and mighty ruler he is.@"); + + case "Merideth Ann"(remove): + say("@She'd seen many a battle with pirates. Then she went to her grave in a storm. Took nearly two hundred men with her.@"); + add(["storm"]); + + case "storm"(remove): + say("@Came up all of a sudden. I say it was Mondain's doing.@ He pulls the pipe from his mouth and tamps the tobacco with his stout thumb. @Anyhow, that's when I lost my father.@"); + add(["Mondain"]); + + case "Mondain"(remove): + say("He stops trying to relight his pipe and looks at you. @Where have you been scuttled? That's too long a story for this " + time_of_day + ".@"); + add(["scuttled"]); + + case "serpents"(remove): + say("He turns his head back towards you, purses his lips, then speaks. @It was a calm night, it was. Quen and I had 'cided to go out on that glassy sea for a fish. Not just any fish, mind ya, a light-horn.@"); + add(["light-horn"]); + + case "scuttled"(remove): + say("@Never mind.@ He sticks his hands in his apron."); + say("@Mondain, of course, was slain many years ago. There are pirates who sail under his banner still. Legend has it, the captain sailed under Mondain himself.@"); + add("captain"); + + case "captain"(remove): + say("@Aye. My father used to tell me the tales he'd hear of a pirate captain who commanded Mondain's armada of pirates and other riff-raff.@"); + say("@Legend has it that the captain swore allegance to Mondain himself, and vowed to serve him until death... and beyond.@"); + say("@Mondain's armada was vast, but supposedly only one ship remained. The tattered sail still bears the crest of Mondain.@"); + + + case "light-horn"(remove): + say("@When we were boys, Quen's father often talked about such a fish. Said if a body could catch one, good fortune would be his.@"); + add(["catch"]); + + case "catch"(remove): + say("@Yes, good fortune. He said the fish had a glowing horn on it's snout. It only comes close to the surface when the sea is like glass.@"); + + case "glass"(remove): + say("@You see, the fish thought the surface was a mirror and it came up to admire its horn.@ He chuckles to himself, teeth clenched around the pipe. @Anyway, Quen and I 'cided we'd catch us one in our skiff.@"); + add(["skiff"]); + + case "skiff"(remove): + say("He pulls the pipe from his mouth and blows some smoke rings. @Well, even though the skiff was small, we figured that we'd spear the beast and drag it back to port.@"); + add(["spear"]); + + case "spear"(remove): + say("@I know it sounds crazy now, but you have to remember, we were only boys. Anyway, we rowed out past Ivers Rounding and sat in our skiff waiting to see one.@ He looks out to sea again and chuckles."); + add(["Iver's Rounding"]); + + case "Iver's Rounding"(remove): + say("@You know, past where the alchemist lives. Anyway, we sat there for hours with 'nary a sign of life...Then, suddenly, in the distance we could see a tall neck rising out of the water and heading towards us.@"); + add(["alchemist", "neck"]); + + case "alchemist"(remove): + say("@Old Horance? He's a crazy old coot who lives on the isle.@"); + + case "neck"(remove): + say("@As it came closer, a huge wave preceded it and we could make out a giant mouth.@ He takes his pipe from his mouth and gestures at you. @I tell you, you've never seen two boys make a skiff travel so fast in all your life.@ He laughs out loud, this time bending over to support himself."); + + case "pole"(remove): + say("@Never use 'em myself. I stick to nets--faster and easier.@*"); + say("@Man's gotta make a living!@"); + + case "amulet"(remove): + say("@I took it from Quenton's dead body to give to Marney for safe keeping.@"); + + +// Should be here only when characters are MET + + case "Trenton Bell"(remove): + say("@He's a stuffy one. Never likes to come down here, says it smells.@"); + + case "Dezana"(remove): + say("@She's a heavily rigged one, she is.@ He winks at you and laughs."); + + case "Michael"(remove): + if (gflags[MARNEY_PISSED] || gflags[MARNEY_SAVED]) + { + say("@Not only did the bastard murder my best friend, he had been sneaking around here under my nose, trying to ensnare Marney with his charm.@"); + say("@I thank thee for bringing him to justice, otherwise, he would meet a worse fate at my hands!@"); + } + else say("@I don't much care for that one. He used to sail under the command of a zealot of Mondain.. I'd plot a course 'round him if I were you.@"); + + case "eyesore"(remove): + say("@This is a fishhouse. It's meant to be an eyesore.@ He laughs again.*"); + + case "bye": + say("He slaps a hand on your back. @Good fortune, and may the wind be at your back!@"); + + var avatar_goodbye = "@Farewell, Yorl.@"; + var npc_goodbye = "@Fair weather to ye!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Lawrence.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Lawrence.uc new file mode 100755 index 0000000..608c3f4 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Lawrence.uc @@ -0,0 +1,142 @@ + +void Lawrence object# (0x452) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + +//Shopkeeper options + //5 + + var food_drink_options = ["nothing", "mead", "ale", "wine", "mutton", "grapes"]; + var food_drink_frames = [FRAME_MEAD, FRAME_ALE, FRAME_WINE, FRAME_MUTTON, FRAME_GRAPES]; + var prices = [2, 5, 5, 4, 3]; + + var initial_choice_question = "@Which of these?@"; + var askIfInterested1 = "@That'll be "; //split into two to capture price + var askIfInterested2 = " gold coins. Agreeable?@"; + var ask_quantity = "@How many?@"; + var cant_afford = "@Come back when you have some gold.@"; + var cant_hold = "@You don't have room to carry it.@"; + var saidNo = "@Anything else I can do for you?@"; + var success = "Lawrence gives you the "; + var success2 = "@Enjoy it.@"; + var nothing = "@Anything else I can do for you?"; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + +////// + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me, sir.@"; + var npc_1st_greet = "@Hello, there.@"; + + var av_2nd_greet = "@Hello, again.@"; + var npc_2nd_greet = "@Ah, you're back!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A small, fussy looking man.*"); + item.say("@Welcome to the Fool's Pair o' Dice.@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Welcome to the Fool's Pair o' Dice.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@It's Lawrence.@*"); + + case "job"(remove): + say("@I sell grapes, ale, mead, wine, and mutton.@"); + add(["buy"]); + + case "buy": + if (!shop_is_open) + say("@Come by the Fool's Pair O' Dice when I'm open for business.@*"); + else + sellFood(LAWRENCE, food_drink_options, prices, food_drink_frames, dialog); + + case "bye": + + var avatar_goodbye = "@Must be going now..@"; + var npc_goodbye = "@Goodbye!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Sandy.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Sandy.uc new file mode 100755 index 0000000..34dbc84 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Sandy.uc @@ -0,0 +1,229 @@ + +void Sandy object# (0x450) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var mentioned_pastry = UI_get_item_flag(item, NAKED); + var gave_dragon_egg = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, milord.@"; + var npc_1st_greet = "@Welcome, stranger.@"; + + var av_2nd_greet = "@Greetings.@"; + var npc_2nd_greet = "@Hello, again.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + + + item.say("A shifty-eyed man with a strange smile. He smells of rancid grease and cooking smoke."); + if ((UI_count_objects(PARTY, SHAPE_DRAGONS_EGG, QUALITY_ANY, FRAME_ANY) >= 1) && (!UI_get_item_flag(item, SI_ZOMBIE))) + { + item.say("@That big, carefully wrapped bundle could only be a dragon's egg!@"); + say("@Will you give it to me?@"); + if (askYesNo()) + { + UI_remove_party_items(1, SHAPE_DRAGONS_EGG, QUALITY_ANY, FRAME_ANY, true); + item.say("@Now I can make Humble Pie!@ Overjoyed, he gives you a hug."); + + if (!UI_get_item_flag(item, SI_ZOMBIE)) + { + UI_set_item_flag(item, SI_ZOMBIE); //so you can ask him about pirates again + giveExperience(50); + } + + item.say("@So, does the subject of pirates interest you?@"); + if (askYesNo()) + { + item.say("@Well, first, there is one in Serpent's Hold. I cannot recall her name, but she has a piece of the map with her.@*"); + item.say("@Second, there is one on Dagger Isle. A hermit.@"); + item.say("@Third, I know of a pirate at Empath Abbey, or thereabouts. Nathaniel Moorehead was his name.@"); + item.say("@The fourth... but then maybe I've said too much already.@"); + add(["fourth"]); + } + else + item.say("He shrugs. @As you wish.@"); + } + else + item.say("@I guess I cannot help you much, then.@"); + } + else + item.say("@Hello there, " + polite_title + ".@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + + if (UI_get_item_flag(item, NAKED)) + add ("Magincian pastry"); + + if (gflags[TALKEDTOHOMERABOUTMAP]) + add("pirate"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Sandstone Angus. Most folks call me Sandy.@"); + + case "job"(remove): + say("@I cook for Lord Whitsaber. He especially likes my recipe for fish in a white wine sauce.@"); + add(["Lord Whitsaber", "sauce"]); + + case "sauce"(remove): + say("@It's my specialty!@"); + + + case "Lord Whitsaber"(remove): + if (!gflags[LEARNED_WHITSABERS_SECRET]) + { + say("@Hmmm. I'd better get back to cooking... Excuse me.@*"); + say("He walks away mumbling."); + + if (!mentioned_pastry) + UI_set_item_flag(item, NAKED); + + sayGoodbyeAbrupt(item, "..Magincian pastry.."); + break; + } + else + { + say("@Before Lord Whitsaber came to Trinsic to be our mayor, he had another job...@*"); + say("@As first mate to Captain Hawkins himself! His real name is Alastor Gordon.@"); + } + + case "pirate"(remove): + + if (!UI_get_item_flag(item, SI_ZOMBIE)) //has not given him dragon egg + { + say("@Hmmm. I'd better get back to cooking... Excuse me.@*"); + say("He walks away mumbling."); + + if (!mentioned_pastry) + UI_set_item_flag(item, NAKED); + + sayGoodbyeAbrupt(item, "..Magincian pastry.."); + break; + + } + else + { + say("@So, does the subject of pirates interest you?@"); + if (askYesNo()) + { + say("@Well, first, there is one in Serpent's Hold. I cannot recall her name, but she has a piece of the map with her.@*"); + say("@Second, there is one on Dagger Isle. A hermit.@"); + say("@Third, I know of a pirate at Empath Abbey, or thereabouts. Nathaniel Moorehead was his name.@"); + say("@The fourth... but then maybe I've said too much already.@"); + add(["fourth"]); + } + else say("He shrugs. @As you wish.@"); + + } + + case "favor"(remove): + say("@Let's see...@"); + say("@'A golden orb on a crystal sea, in a box sans hinges, lid, or key.'@*"); + say("@I'll give you one guess to this riddle.@"); + + var guess = chooseFromMenu(["an egg?", "the sun?", "I don't know"]); + if (guess == "an egg?") + say("@Very good! To make Magincian pastry, I require one dragon's egg.@"); + else + say("@It's an egg, of course. To make Magincian pastry, I require one dragon's egg.@"); + add("egg"); + + case "egg" (remove): + say("@Only a dragon's will do.@"); + add(["dragon"]); + + case "dragon" (remove): + say("@There's a lair in the dungeon Destard, to the northwest. It's not far.@"); + + case "fourth"(remove): + say("@Before Lord Whitsaber came to Trinsic to be our mayor, he had another job...@*"); + say("@As first mate to Captain Hawkins himself! His real name is Alastor Gordon.@"); + if (!gflags[LEARNED_WHITSABERS_SECRET]) + gflags[LEARNED_WHITSABERS_SECRET] = true; + + + case "Magincian pastry"(remove): + if (!UI_get_item_flag(item, SI_ZOMBIE)) //haven't give him the egg yet + { + say("@I could do you a favor if you did one for me first.@"); + add("favor"); + } + else + say("@Truly it shall be a magnificent desert!@"); + + case "bye": + + var avatar_goodbye = "@Take care..@"; + var npc_goodbye = "@Farewell! May thy quest succeed, Avatar!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Tobatha.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Tobatha.uc new file mode 100755 index 0000000..a7b1332 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Tobatha.uc @@ -0,0 +1,162 @@ + +void Tobatha object# (0x456) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //for healers - delete if npc is not a healer + + var npc; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + /* + if (event == PROXIMITY) + { + //barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@Insert line here..@", 0); + delayedBark(item, "@Insert line here@", 8); + delayedBark(item, "@Insert line here@", 16); + } + else if (barks == 2) + delayedBark(item, "@Other lines...@", 2); + else + delayedBark(item, "@Other lines...@", 3); + } + */ + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + var npc_1st_greet = "@Eh? Speak up!"; + + var av_2nd_greet = "@Excuse me, ma'am..@"; + var npc_2nd_greet = "@Eh? Speak up!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A doddering old woman."); + item.say("@Who are you and what d'ye want?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (UI_get_item_flag(item, SI_ZOMBIE)) + add("thanks"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + + case "name"(remove): + say("@My name's Tobatha.@*"); + say("@But you can call me ma'am, youngster.@"); + add(["Tobatha", "ma'am"]); + + case "job" (remove): + say("@Job? I'm a mender of the inflicted!@*"); + say("@If I weren't, why would you be here?@*"); + say("@Now stop this foolishness and tell me what you want, youngster.@"); + add(["inflicted"]); + + case "Tobatha"(remove): + say("@That's ma'am to you, youngster. Respect your elders!@"); + add("ma'am"); + + case "ma'am"(remove): + say("@That's better. Now, what did you want?@"); + + case "inflicted"(remove): + say("@I can heal, cure, and even raise dead!@"); + add(["heal", "cure", "raise dead"]); + + case "heal": + npc = populatePartyNames(party); + healScript(npc, TOBATHA, 30); + add("thanks"); + + case "cure": + npc = populatePartyNames(party); + cureScript(npc, TOBATHA, 10); + add("thanks"); + + + + case "raise dead": + say("@Well, ain't that just like youngsters? Makin' mistakes and expecting their elders to bail them out.@"); + say("@Well, today's your lucky day.@"); + resurrectScript(TOBATHA, 400); + add("thanks"); + + case "thanks"(remove): + say("@Oh, sure! Thou art just trying to get on my good side.@*"); + say("@Well, it won't work!@"); + + case "bye": + say("@Hmph! And not so much as a thank-you.@*"); + say("@Well, that's kids today for ye! No manners, the lot of 'em!@"); + if (!UI_get_item_flag(item, SI_ZOMBIE)) + UI_set_item_flag(item, SI_ZOMBIE); + + + var avatar_goodbye = "@Must be going now..@"; + var npc_goodbye = "@..lousy youngsters!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Whitsaber.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Whitsaber.uc new file mode 100755 index 0000000..2555222 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/Whitsaber.uc @@ -0,0 +1,233 @@ + +void Whitsaber object# (0x451) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var whitsaber_mad = UI_get_item_flag(item, NAKED); + + var know_whitsaber_is_pirate = UI_get_item_flag(item, SI_ZOMBIE); + var whitsaber_gave_map = UI_get_item_flag(item, PETRA); // Gave you the map + var kept_whitsaber_secret = UI_get_item_flag(item, FREEZE); // Kept his secret + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings, milord..@"; + npc_1st_greet = "@'tis an honor!@"; + + av_2nd_greet = "@Might we speak again?@"; + if (whitsaber_mad) + npc_2nd_greet = "@Not you again!@"; + else + npc_2nd_greet = "@Of course, honorable one.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (whitsaber_mad) //flag set if you made him mad + { + item.say("Recognizing you, fear fills the former pirate's eyes."); + item.say("@What do you want? I thought we had a deal!@"); + } + else if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("A balding but distinguished man."); + item.say("@Welcome, Avatar!@"); + + } + else + item.say ("@Welcome back, Avatar!@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[TALKEDTOHOMERABOUTMAP]) //set by Homer when asked about map pieces + add(["pirate", "map"]); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Lord Whitsaber, mayor of this honorable town!@"); + + case "job"(remove): + say("@I am entrusted with an honor above all others-that of governing Trinsic, the Town of Honor!@"); + add(["honor"]); + + case "honor"(remove): + say("@Every citizen of this fine town strives every day to be a living example of honor.@"); + say("@Of course, thy own example guides us all, Avatar!@"); + add(["rune", "mantra"]); + + case "pirate"(remove): + if (!gflags[LEARNED_WHITSABERS_SECRET]) + { + say("@Me, a pirate? Absurd!@ He laughs out loud...but you sense a trace of fear in his voice!@"); + + } + else + { + say("@Me, a pirate? Absurd!@ He laughs out loud...but you sense a trace of fear in his voice!"); + add(["Alastor Gordon"]); + } + case "Alastor Gordon"(remove): + say("@Wh--what did Sandy tell you?@*"); + say("@Did he say I was once a pirate?@"); + if (askYesNo()) + { + say("@Then all is lost!@*"); + say("@I have changed since those dark days, truly I have!@"); + if (!know_whitsaber_is_pirate) + UI_set_item_flag(item, SI_ZOMBIE); + add("map"); //could have already asked him, so adding it back + } + else + say("He seems strangely relieved. @Oh. Well, good, because it isn't true!@"); + + case "map"(remove): + + if (!UI_get_item_flag(item, PETRA)) //not given map yet + { + if (gflags[LEARNED_WHITSABERS_SECRET]) + { + say("@All right! If thou wouldst but promise to keep my secret, I'll give thee the map! Agreed?@"); + if(askYesNo()) + { + say("@Oh, thank you, Avatar.@*"); + + UI_add_party_items(1, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP2, false); + say("He hands over his piece of the map.*"); + say("@I'll rely on thy honor to keep my secret.@"); + UI_set_item_flag(item, PETRA); // Gave you the map + UI_set_item_flag(item, FREEZE); //kept whitsaber's secret + } + else + { + say("@But what more can I do? I cannot change the past!@*"); + UI_add_party_items(1, SHAPE_TREASURE_MAP, QUALITY_ANY, FRAME_MAP2, false); + say("@By giving you the map, do I not prove that I have changed my ways?@"); + say("@No pirate would willingly give up the key to such a treasure!@"); + UI_set_item_flag(item, NAKED);//Sets "Whitsaber's mad" flag + UI_set_item_flag(item, PETRA); // Gave you the map + subtractKarma(10); + } + } + else + say("@What are you insinuating?@"); + } + else + say("@I gave you the map. What more do you want?@"); + + + + case "rune"(remove): + say("@The Rune of Honor? Why, it is on a pedestal in the center of town!@"); + say("@Even though the rune is our most prized possession, we do not guard it!@"); + say("@And dost thou know why not?@"); + if (askYesNo()) + say("@Oh.@ He seems disappointed somehow."); + else + { + say("@Because Trinsic is the Town of Honor! None here would be dishonorable enough to steal it.@"); + say("@And surely, if any took the rune, they would do the honorable thing and return it afterwards!@"); + } + + + case "mantra"(remove): + say("@The Mantra of Honor? Let me think...@"); + say("@Oh yes, I remember now. It's 'summ.'@"); + if (!gflags[LEARNED_MANTRA_HONOR]) + { + gflags[LEARNED_MANTRA_HONOR] = true; + giveExperience(15); + } + + case "bye": + + if (whitsaber_gave_map) + { + if (kept_whitsaber_secret) + { + say("@Goodbye, Avatar! Thou hast my thanks!@"); + say("@Truly are thy compassion and honor an example to us all!@"); + avatar_goodbye = "@Take care, mayor.@"; + npc_goodbye = "@Farewell, honorable Avatar!@"; + + } + else + { + avatar_goodbye = "@Must be going now..@"; + npc_goodbye = "@Indeed.@"; + + } + + } + else + { + say("@Goodbye, Avatar. Return again when thou hast more time to chat!@"); + avatar_goodbye = "@Goodbye, mayor.@"; + npc_goodbye = "@Farewell, honorable Avatar!@"; + } + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/brandon.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/brandon.uc new file mode 100755 index 0000000..f76c190 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/brandon.uc @@ -0,0 +1,195 @@ + +void Brandon object# (0x453) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var price; + var item_choice; + + + var armor_options = ["nothing", "great helm", "kite shield", "plate armor", "plate leggings", "magic armor", "magic gorget", "magic leggings", "magic helm", "magic gauntlets", "magic boots"]; + var armor_shapes = [SHAPE_GREAT_HELM, SHAPE_KITE_SHIELD, SHAPE_PLATE_ARMOR, SHAPE_PLATE_LEGGINGS, SHAPE_MAGIC_ARMOR, SHAPE_MAGIC_GORGET, SHAPE_MAGIC_LEGGINGS, SHAPE_MAGIC_HELM, SHAPE_MAGIC_GAUNTLETS, SHAPE_BOOTS]; + var armor_prices = [25, 25, 100, 75, 350, 100, 250, 200, 150, 75]; + // + + var weapon_options =["nothing", "sword", "mace", "main gauche", "two-handed axe", "two-handed hammer", "two-handed sword"]; + var weapon_shapes = [SHAPE_SWORD, SHAPE_MACE, SHAPE_MAIN_GAUCHE, SHAPE_2H_AXE, "SHAPE_2H_HAMMER, SHAPE_2H_SWORD]; + var weapon_prices = [75, 35, 20, 80, 60, 175]; + + var sell_rate = 2; //integer to divide by when selling items back to npc + var sell_options = ["nothing", "great helm", "kite shield", "plate armor", "plate leggings", "magic armor", "magic gorget", "magic leggings", "magic helm", "magic gauntlets", "magic boots", "sword", "mace", "main gauche", "two-handed axe", "two-handed hammer", "two-handed sword"]; + var sell_shapes = [SHAPE_GREAT_HELM, SHAPE_KITE_SHIELD, SHAPE_PLATE_ARMOR, SHAPE_PLATE_LEGGINGS, SHAPE_MAGIC_ARMOR, SHAPE_MAGIC_GORGET, SHAPE_MAGIC_LEGGINGS, SHAPE_MAGIC_HELM, SHAPE_MAGIC_GAUNTLETS, SHAPE_BOOTS, SHAPE_SWORD, SHAPE_MACE, SHAPE_MAIN_GAUCHE, SHAPE_2H_AXE, SHAPE_2H_HAMMER, SHAPE_2H_SWORD]; + var sell_prices = [25, 25, 100, 75, 350, 100, 250, 200, 150, 75, 75, 35, 20, 80, 60, 175]; + + //Dialog options + var initial_choice_question = "@Which of these?@"; //arms or armor? etc + var askIfInterested1 = "@That costs "; //needs to be split into array to capture price + var askIfInterested2 = " gold. Interested, " + polite_title + "?@"; + var cant_afford = "@But thou hast not enough gold, " + polite_title + "!@"; + var cant_hold = "@But 'twould make thee o'erburdened, " + polite_title + "!@"; + var saidNo = "@What else can I do for thee?@"; + var nothing = "@Changed your mind, eh?@"; + var success = "@Excellent!@ After accepting your gold, Brandon hands over the "; + var success2; //"I hope this item works well for you!" etc if needed + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, cant_afford, cant_hold, saidNo, nothing, success, success2]; + //buyArmor(item, armor_options, prices, shapes, dialog); + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == BLACKSMITH) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + //************************************/ + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Might we speak?@"; + var npc_1st_greet = "@Zounds! The Avatar!@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Zounds!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("@Hey! The Avatar! Good morning, " + polite_title + "!@"); + item.say("@You've come to me to aid thee in thy quest! What an honor!@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Avatar! Good " + time_of_day + ", " + polite_title + "! How has thy quest gone?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //if you asked about weapons/armor before: + if (UI_get_item_flag(item, SHOPPED_BEFORE)) + add(["buy", "sell"]); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name's Brandon, " + polite_title + ", and I'm honored to meet thee!@"); + + case "job"(remove): + say("@Oh, I'm not important like you. I'm just a weaponsmith--and only a journeyman at that.@"); + add(["journeyman", "join"]); + + case "journeyman"(remove): + say("@Aye, just a few years ago I was a simple apprentice. Now I supply arms to all Trinsic!@"); + //automatically add buy/sell to options next time + if (!UI_get_item_flag(item, SHOPPED_BEFORE)) + UI_set_item_flag(item, SHOPPED_BEFORE); + add(["buy", "sell"]); + + case "now"(remove): + say("@I have to make weapons to help fight the gargoyles!@"); + add(["weapons"]); + + case "weapons"(remove): + say("@Perhaps you'd like to buy some. I'd be honored to have thee as a customer@"); + add(["buy", "sell"]); + + case "join"(remove): + say("@That would be a great honor! I'd love to!@*"); + say("The man comes to his senses.*"); + say("@But no, I can't. I've responsibilites here, especially now.@"); + add(["now"]); + + case "buy"(remove): + if (UI_get_schedule_type(item) != BLACKSMITH) + say("@Come by my shop when I'm open!@"); + + else + { + say("@I have a large inventory, so be more specific: Dost thou want arms or armor?@"); + add(["arms", "armor"]); + } + + case "arms": + buyWeapons(item, weapon_options, weapon_prices, weapon_shapes, dialog); + + case "armor": + buyArmor(item, armor_options, armor_prices, armor_shapes, dialog); + + case "sell": + if (shop_is_open) + sellBackItems(sell_shapes, sell_options, sell_prices, sell_rate); + else + say("@Come to me shop when it's open!@"); + + + + case "bye": + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Farewell! May thy quest succeed, Avatar!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/harold.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/harold.uc new file mode 100755 index 0000000..39332da --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/harold.uc @@ -0,0 +1,130 @@ + +void Harold object# (0x455) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + //Used if special barks needed, otherwise delete + /* + if (event == PROXIMITY) + { + //barks = UI_get_random(3); + + if (barks == 1) + { + delayedBark(item, "@Insert line here..@", 0); + delayedBark(item, "@Insert line here@", 8); + delayedBark(item, "@Insert line here@", 16); + } + else if (barks == 2) + delayedBark(item, "@Other lines...@", 2); + else + delayedBark(item, "@Other lines...@", 3); + } + */ + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings..@"; + var npc_1st_greet = "@Welcome.@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Welcome back.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A tall, muscular man with a solemn look on his face."); + item.say("@Welcome, " + polite_title + ".@"); + item.say("@What can I do for you?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@My name is Harold.@"); + + case "job"(remove): + say("@Horseshoes are my living.@"); + add(["horseshoes"]); + + case "horseshoes"(remove): + say("@It'll cost you 2 gold for the horseshoes, interested?@"); + if (askYesNo()) + { + if (hasGold(2)) + { + if (UI_add_party_items(1, SHAPE_HORSESHOES, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(2); + say("@Here you go.@"); + } + else say("@You look pretty full to me.@"); + } + else say("@Best check your coinpouch again.@"); + } + else say("@Very well.@"); + + case "bye": + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Farewell.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/immanuelle.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/immanuelle.uc new file mode 100755 index 0000000..95e639d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Trinsic/immanuelle.uc @@ -0,0 +1,145 @@ + +void Immanuelle object# (0x454) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + { + if (!UI_get_item_flag(item, MET)) + greeting = "strangers"; + else + greeting = "stranger"; + + } + else + { + if (!UI_get_item_flag(item, MET)) + greeting = "friends"; + else + greeting = "friend"; + } + + //Used if special barks needed, otherwise delete + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Pardon me..@"; + var npc_1st_greet = "@Hello, " + polite_title + ".@"; + + var av_2nd_greet = "@Hello, again..@"; + var npc_2nd_greet = "@Greetings..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("@a sultry, dark-skinned woman dressed in riding-leathers@"); + item.say("@Hello, " + greeting + ". What can I do for thee this " + time_of_day + "?@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Hello again, my " + greeting + ". What can I do for you this " + time_of_day + "?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + //heard Culham in Jhelom speak of 'arturosis' + if (gflags[ARTUROSIS]) + add("'Arturosis'"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Some call me Immanuelle, " + polite_title + ".@"); + say("@Others call me...something else.@*"); + say("She winks at you."); + add("something else"); + + case "job"(remove): + say("@I raise horses here, in the stables.@"); +// say("@I also sell horses, if you wish to buy one.@); +// add(["horses", "buy"]); TODO: add horse cart and carriage + + case "something else"(remove): + if (player_is_female) + say("@I think you get the idea.@"); + else + { + say("@Perhaps sometime I will show you...@"); + add(["show"]); + } + + case "show"(remove): + say("@Not here.@"); + + case "'Arturosis'"(remove): + say("@Never trust a gypsy! My poor horse..@"); + + case "bye": + if (!player_is_female) + say("As you leave, she blows you a kiss."); + + var avatar_goodbye = "@Must be going now..@"; + var npc_goodbye = "@Come back again soon!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Andrea.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Andrea.uc new file mode 100755 index 0000000..34422ae --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Andrea.uc @@ -0,0 +1,251 @@ + +void Andrea object# (0x40f) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var petname; + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var arm_wrestled = UI_get_item_flag(item, SI_ZOMBIE); + var arm_wrestled_won = UI_get_item_flag(item, PETRA); + var arm_wrestled_lost = UI_get_item_flag(item, FREEZE); + + var current_strength = UI_get_npc_prop(UI_get_avatar_ref(), STRENGTH); + + + //Shopkeeper options + //sellFood(var npc, var food_drink_options, var prices, dialog) + + var food_drink_options =["nothing", "mead", "ale", "wine", "rations", "ribs"]; + var food_drink_frames = [FRAME_MEAD, FRAME_ALE, FRAME_WINE, FRAME_RATIONS, FRAME_RIBS]; + var prices = [4, 3, 6, 4, 6]; + + var initial_choice_question = "@Which of these?@"; + var askIfInterested1 = "@That'll be "; //split into two to capture price + var askIfInterested2 = " gold coins, okay?@"; + var ask_quantity = "@How many?@"; + var cant_afford = "@You can't afford it, sweetie.@"; + var cant_hold = "@You haven't any room in your pack.@"; + var saidNo = "@Anything else?@"; + var success = "She gives you the "; + var success2 = "@That aught to hold you.@"; + var nothing = "@Anything else you need?"; + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + petname = "dears"; + if (partynum == 1) + petname = "my dear"; + // title = "madame"; + } + else + { + petname = "fellas"; + if (partynum == 1) + petname = "handsome"; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings..@"; + var npc_1st_greet = "@Hello there!@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Welcome back, dear!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see an enormous woman, both in size and personality."); + item.say("@Hello, " + petname + "!@ she screams as she strides over to you with beer mugs in her hands."); + UI_set_item_flag(item, MET); + } + else + item.say("@Hello again, " + petname + "!@ she screams as she strides over to you with beer mugs in her hands."); + + item.say("@Welcome to the Slaughtered Lamb. What can I get you?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + if (gflags[ASK_ANDREA_ABOUT_DRUDGEY]) + add("Drudgeworth and Saduj"); + + if (UI_get_item_flag(LENORA, MET)) + add ("Lenora"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Andrea! And yours, my fine friend?@"); + var AvatarOrName = chooseFromMenu(["The Avatar", "" + player_name + ""]); + if (player_is_female) + say("@Pleased to meet you, dear.@"); + else + say("@I'm very pleased to meet you,@ she purrs."); + add(["Andrea"]); + + case "job"(remove): + say("@Honey, I've had many jobs in my time. But runnin' this pub is the best, 'cause I get to meet the strongest men.*@"); + say("@I sell ale, mead, wine, and rations.@"); + add(["men", "buy"]); + + case "Andrea"(remove): + say("@Yes. Them's who I beat at arm wrestling call me Miss Barlap, though. Out of respect.@ She laughs."); + add(["arm wrestling"]); + + case "men"(remove): + say("@Look around. Here you'll find the men whose lives have lead them to many dangerous places.@"); + say("Someone in a dark corner shouts @Like this pub!@ and all the patrons laugh."); + + case "Drudgeworth and Saduj"(remove): + say("@Honey, I've not heard those names spoken since the former Mayor would come in for a drink, rest his soul.@"); + say("@The story that the former Mayor told me was that they were to be transported here in secret to be put in solitary confinement.@"); + say("@Only they never made it here. They overpowered the guards and killed the poor souls, and ran off into the night.@"); + say("@The mayor asked me to keep an ear out for any talk amongst the menfolk about the two, and I just love chattin' up the men!@"); + add("talk"); + + case "talk"(remove): + say("@I meet all kinds of men here, but one in particular during that time would stop in every few weeks or so for drinks and supplies.@"); + say("She sighs dreamily. @He sure knew how to sweet talk a woman! Of course he told me I was the prettiest thing he'd seen since his departed wife, Lucy.@"); + say("@...or maybe he just wanted the free drinks!@ she laughs."); + say("@Just like a man though, he offered to come back to take me to his home and then I never heard from him again. He said he lived alone as a hermit somewhere in the eastern edge of the Deep Forest.@"); + say("@I didn't say anything to the mayor though, he couldn't have been Drudgeworth or Saduj, he said his name was Chuck.@"); + + + case "arm wrestling"(remove): + if (!arm_wrestled) //SI Zombie + { + say("She looks you up and down and then feels your arm. @Care for a match?@"); + if (askYesNo()) + { + say("@Yer on!@ She grabs your arm and the contest begins!*"); + say("@Arrghh!!!@*"); + say("@'Nnghhh!!!@*"); + say("@Unghhh!!!@*"); + if (current_strength < 20) + { + say("And the winner is...Andrea!!!"); + say("@Now don't feel bad, sugar, lots of folks lose to Andrea!@ She laughs heartily."); + delayedBark(DUPRE, "Thou needest to work on your biceps, Avatar.", 12); + UI_set_item_flag(item, FREEZE); //Andrea won + } + else + { + say("And the winner is..." + player_name + "!!!"); + UI_get_item_flag(item, PETRA); //Avatar won + } + + } + else + say("@Well, maybe some other time, sugar...@"); + + + } + else + { + if (arm_wrestled_won) + say("@Alright, alright, I admit it - ya won fair an' square. No need to gloat about it...@"); + else + say("@Now don't feel bad, sugar, lots of folks lose to Andrea!@ She laughs heartily."); + + } + + + case "Lenora"(remove): //was 'chan' in files? Don't know who that is.. + if (!isNearby(LENORA)) + { + say("@That old witch? She may not have hit the bottle, but I believe a few have hit her.@*"); + say("The patrons around you chuckle."); + } + else + say("@She is around here somewhere..@"); + + + case "Ben"(remove): + say("@Now there's a man.@ She looks into a beer mug and fixes her hair. @I wish he'd come into town more often.@"); + + case "gargoyles"(remove): + say("@I've never seen any creature that could scare me. I say if they want trouble, come in this pub!@"); + say("The men around her let out a cheer and she turns, acknowledging them with a bow."); + + case "Lenard"(remove): + say("@A little girlie-man. But he does make some fine clothes.@"); + + case "Lord British"(remove): + say("@He's never been in here. Can't imagine why--it seems like his kind of establishment.@"); + + case "buy": + if (!shop_is_open) + say("@Come back when my shop is open.@*"); + else + sellFood(ANDREA, food_drink_options, prices, food_drink_frames, dialog); + + + case "bye": + say("@So long. Come back when you're thirsty. And if you see that cutie Utomo, tell him Andrea says hi...@"); + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Come back again!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Ben.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Ben.uc new file mode 100755 index 0000000..b4094ea --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Ben.uc @@ -0,0 +1,215 @@ + +void Ben object# (0x474) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var npc_1st_greet; + var npc_2nd_greet; + var av_2nd_greet; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var ben_friend = UI_get_item_flag(item, SI_ZOMBIE); //Ben is your friend now + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + + //Avatar and NPC greeting barks + var av_1st_greet = "@Excuse me..@"; + if (!ben_friend) + { + if (UI_get_schedule_type(item) == EAT) + { + npc_1st_greet = "@What?! Get out!!@"; + npc_2nd_greet = "@What?! Get out!!@"; + } + else + { + npc_1st_greet = "@Hah! Caught ya!@"; + npc_2nd_greet = "@You again?!@"; + + } + } + else + { + npc_1st_greet = "@Ah, you're welcome here.@"; + npc_2nd_greet = "@Ah, you're welcome here.@"; + av_2nd_greet = "@Hello Ben..@"; + + } + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a man as large as the trees that surround his cottage."); + item.say("@Hah, sneakin' around in my forest, huh? I told the last one of ya that came by that I'll have nothin' t'do with yer wars, so shove off!@."); + UI_set_item_flag(item, MET); + sayGoodbyeAbrupt(BEN, "Get outta here!"); + } + else + { + if (!ben_friend) + { + + if (UI_get_schedule_type(item) == EAT) + { + item.say("@Why you bargin' inta my house?@ he shouts.*"); + item.say("Hefting his large axe, he prepares to defend his home."); + + sayGoodbyeAbrupt(BEN, "Get outta here!"); + UI_set_schedule_type(item, IN_COMBAT); + return; + } + else + item.say("@I told ya once already that I want to be left alone!@"); + } + else + item.say("@Hullo again, friend.@"); + } + //standard conversation options + var options = ["name", "job", "wars", "forest", "bye"]; + + /*Variable conversation options based on global flags or people met. Remove if none///// + if (gflags[GLOBAL_FLAG_HERE]) + add("Insert Convo topic here"); + */ + + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + if (!ben_friend) + { + say("@Ben. My friends call me Big Ben.@"); + say("@But you ain't one of my friends.@"); + + } + else + say("@I guess you can call me 'Big Ben'.@ He smiles broadly."); + add(["friends", "Big Ben"]); + + + case "job"(remove): + say("@Have ya never seen a lumberman before? Look around. Those stacks o' wood don't cut themselves.@"); + add(["wood"]); + + case "wars"(remove): + say("@Ever since I won that choppin' contest, the king's had a notion I'd be good at wittlin' on men the same way.@"); + say("@Well, you can tell him I'm not interested.@"); + add(["king"]); + + case "forest"(remove): + say("@Aye, this is where I cut trees, and I don't like strangers wanderin' through!@"); + if (ben_friend) + say("@You're welcome here, though.@"); + + + case "Big Ben"(remove): + if (!ben_friend) + say("He fires a look at you. @I said only my friends call me that.@"); + + else + say("@'Tis my name. Don't wear it out.@ He laughs resoundingly at his wit."); + + + case "friends"(remove): + say("@It surprises you that I would have some. Sometimes it surprises me too.@ He laughs."); + + case "king"(remove): + say("@You are from the king, ain't ya?@"); + if (askYesNo()) + { + say ("@I knew it!@"); + if (ben_friend) + UI_clear_item_flag(item, SI_ZOMBIE); //Ben doesn't like you anymore + } + else + { + say("@Oh.@ He seems friendlier now."); + if (!ben_friend) + UI_set_item_flag(item, SI_ZOMBIE); //Ben likes you + } + + case "wood"(remove): + say("@Aye, are ya here to buy a log?@"); + say("@Logs is 5 gold apiece. Ya still want one?@"); + if (askYesNo()) + { + if (hasGold(5)) + { + if (UI_add_party_items(1, SHAPE_YEW_LOG, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(5); + say("He takes your gold and hands over a fine yew log. Ben seems friendlier now."); + if (!ben_friend) + UI_set_item_flag(item, SI_ZOMBIE); //Ben likes you + } + else say("@But you can't carry a log!@"); + } + else say("@But you don't have 5 gold!@"); + } + else say("@Well, come back sometime and I'll cut one for ya.@"); + + case "bye": + say("@Careful in those woods now...@"); + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@...Accidents happen...@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Boskin.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Boskin.uc new file mode 100755 index 0000000..1effd2d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Boskin.uc @@ -0,0 +1,212 @@ +void Boskin object# (0x415) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //make sure you can't talk to Boskin if you aren't in the same room + var avatar_pos = UI_get_object_position(AVATAR); + + var can_reach = UI_is_dest_reachable(BOSKIN, [avatar_pos]); + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var boskin_pissed = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == PROXIMITY) + { + var barks = UI_get_random(3); + + if (barks == 1) + + delayedBark(item, "@Lemme outta here!@", 0); + + + else if (barks == 2) + delayedBark(item, "@I didn't do it!...@", 2); + else + delayedBark(item, "@Me poor kids!...@", 3); + } + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Might we speak?@"; + var npc_1st_greet = "@Who's there?@"; + var npc_2nd_greet; + var av_2nd_greet = "@Might we speak again?@"; + + //can't talk to Boskin through walls + if (!can_reach) + abort; + + if (boskin_pissed) + npc_2nd_greet = "@Go away!@"; + else + npc_2nd_greet = "@Strewth!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (boskin_pissed) + { + var rand = UI_get_random(3); + if (rand != 3) + item.say("@I ain't talkin' to you, you're just like all the rest! I'll never crack, no matter 'ow many times you come back!@"); + else + { + item.say("@All right, I give up. The rune is 'idden under a potted plant at the Slaughtered Lamb. Now go away and leave me alone.@"); + UI_clear_item_flag(item, SI_ZOMBIE); + } + sayGoodbyeAbrupt(BOSKIN, "Begone!"); + return; + + } + + if (!UI_get_item_flag(item, MET)) + { + item.say("A short, heavyset man dressed in rags.*"); + item.say("@Who's there?@ the thief calls insolently. The thief's tone becomes more respectful as he recognizes you.*"); + item.say("@'Strewth, it's the Avatar! You've got to get me out of 'ere, " + polite_title + "!@"); + UI_set_item_flag(item, MET); + } + else + item.say("@" + polite_title + "! Am I glad to see thee! You're me last light in a world of darkness.@"); + + //standard conversation options + var options = ["name", "job", "bye", "crime"]; + + //Lenora said he's a liar, call him out on it + if (gflags[BOSKINLIES]) + add("lie"); + + //Lenora said no to freeing him + if (gflags[BOSKINDENIED]) + add("free"); + /* Conversation options based on MET flag of other npc's - delete all if not used + if (UI_get_item_flag(NPCNAME, MET)) + add ("NPC name"); + */ + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Me name's Boskin, Avatar.@"); + + case "job"(remove): + say("@I'm but a poor farmer, forced into crime by the harshness of these times. There weren't no other way to feed me family, Avatar!@"); + add(["crime", "family"]); + + case "family"(remove): + say("Tears fill the man's eyes. @My poor children've got no one to take care of them now. I only stole to feed them, and that's the truth.@"); + if (!gflags[BOSKINCHILDREN]) //can ask Lenora bout his kids + gflags[BOSKINCHILDREN] = true; + add(["truth"]); + + case "truth"(remove): + say("@True? Of course it's true! Even a thief like me wouldn't lie to the Avatar.@"); + + case "lie"(remove): + say("@All right, I admit it. I 'aven't got any kids. But that stupid cow they got runnin' this place won't listen to reason--a little give-and-take, know what I mean?@*"); + say("@I tell you what. If I tell you where the rune is, will you take it away? I don't want these pompous blighters to 'ave it. Okay?@."); + if (askYesNo()) + { + say("@All right, I'll take your word for it. Go to the Slaughtered Lamb; I 'id the rune under a potted plant there. And spit on Her Ladyship for me!@"); + if (!UI_get_item_flag(item, NAKED)) + { + giveExperience(50); + UI_get_item_flag(item, NAKED); + } + sayGoodbye2(BOSKIN); + gflags[BOSKINLIES] = false; + break; + } + else + { + say("@Then the gargoyles can take the lot of you! You'll never get nothin' out of me!@"); + UI_set_item_flag(item, SI_ZOMBIE); + gflags[BOSKINPISSED] = true; + break; + } + case "rune"(remove): + say("@I'll tell you where the rune is if you'll let me go. I've got me kids to think of.@"); + if (!gflags[FREEBOSKIN]) + gflags[FREEBOSKIN] = true; + + case "crime"(remove): + say("@I admit I robbed that grave. But it were only because 'is Lordship wouldn't be needin' that stuff no more. I 'ad me kids to feed, didn't I?@"); + add(["rune"]); + + case "free"(remove): + say("@You mean it, Avatar? Are they gonna let me go 'ome?@"); + if (askYesNo()) + { + say("His face lights up. @I knew I could count on you, Avatar! And I'll keep my end of the bargain. I 'id the rune under a potted plant in the Slaughtered Lamb inn.@"); + if (UI_npc_nearby(IOLO)) + { + IOLO.say("As you leave, Iolo whispers to you. @Maybe it was necessary, Avatar, but lying makes me uneasy. Even to someone like him.@"); + IOLO.hide(); + subtractKarma(5); + break; + + } + } + else say("His face falls. @Then I ain't sayin' nothin'. I've got me kids to think of, I do.@"); + + + case "bye": + item.say("@Please, Avatar! Tell them to let me go 'ome! Tell them about me poor fatherless kids! They'll listen to you!@"); + var avatar_goodbye = "@I must be going now..@"; + var npc_goodbye = "@Think of me children!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Lenard.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Lenard.uc new file mode 100755 index 0000000..ab70c79 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Lenard.uc @@ -0,0 +1,154 @@ + +void Lenard object# (0x4f5) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + if (UI_get_schedule_type(item) == TEND_SHOP) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + var item_options =["nothing", "pants", "tunic", "dress"]; + var item_shapes = [SHAPE_PANTS, SHAPE_TOP, SHAPE_TOP]; + var item_prices = [20, 30, 45]; + var item_frames = [FRAME_PANTS, FRAME_TUNIC, FRAME_DRESS]; + + var initial_choice_question = "@Which of these?@"; //arms or armor? etc + var cant_afford = "@I'm terribly sorry, but I can't sell it for less!@"; + var cant_hold = "@I'm sorry, but I really don't think you can carry that.@"; + var saidNo = "@Oh, sorry. I thought thou wanted to buy something.@"; + var nothing = "@Oh, sorry. I thought thou wanted to buy something.@"; + var askIfInterested1 = "@That costs "; + var askIfInterested2 = " gold. Do you still want it?@"; + var success = "Le'nard takes your gold and hands over the "; + var success2 = "."; + var ask_quantity = "@How many?@"; + + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + //buyArmor(item, armor_options, prices, shapes, ask_choice, askIfInterested, cant_afford, cant_hold, saidNo, success, success2); + + + //************************************/ + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings..@"; + var npc_1st_greet = "@Wh..who.. are you?@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Oh! t..tis thee..@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("You see a short, fat, rosy-cheeked man with long hair covering his eyes."); + item.say("The man seems afraid of you. @Wh-what do you want?@"); + UI_set_item_flag(item, MET); + } + else + item.say("@He--hello, " + polite_title + ". Nice to see thee again.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[READ_BALLOON_PLANS]) + add("silk"); + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("As faint as a whisper comes the word @Le'nard.@"); + + + case "job"(remove): + say("@I'm a tailor, " + polite_title + "@."); + add(["tailor"]); + + case "tailor"(remove): + say("@I sew pants, tunics and dresses, " + polite_title + ". I use a lot of thread.@"); + add(["buy", "thread"]); + + case "buy"(remove): + if (shop_is_open) + buyItems(item, item_options, item_prices, item_shapes, item_frames, dialog); + else + say("@Please come back when my shop is open.@"); + + case "thread": + var num_thread = UI_count_objects(PARTY, SHAPE_THREAD, QUALITY_ANY, FRAME_ANY); + var num_sell; + if (num_thread > 0) + { + + var sell_quantity = UI_input_numeric_value(1, num_thread, 1, 1); + var payment = num_thread * 8; + say("@Will you take " + payment + " for that thread?@"); + if (askYesNo()) + { + giveGold(payment); + UI_remove_party_items(num_thread, SHAPE_THREAD, QUALITY_ANY, FRAME_ANY, true); + say("@Good, good.@ He hands you " + payment + " gold pieces and takes the thread."); + + } + else + say("@Oh. Okay.@"); + } + else + say("@But - but none of you has any thread to sell.@"); + + case "silk"(remove): + say("@I wouldn't know where to begin. Ask Marissa in Paws.@"); + + case "bye": + say("He looks around, then waves goodbye."); + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@b..bye..@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Lenora.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Lenora.uc new file mode 100755 index 0000000..dd166c8 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Lenora.uc @@ -0,0 +1,288 @@ + +void Lenora object# (0x412) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var npc_goodbye; + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var lenora_pissed = UI_get_item_flag(item, SI_ZOMBIE); + + //FAILSAFE: make sure Avatar can only ask about murder while she's sitting in the courtroom + if (UI_get_schedule_type(item) == MAJOR_SIT && hour >= 6 && hour < 21) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Excuse me, milady..@"; + npc_1st_greet = "@Ah, the Avatar has returned.@"; + + av_2nd_greet = "@Lady Lenora..@"; + if (lenora_pissed) + npc_2nd_greet = "@Back again?@"; + else + npc_2nd_greet = "Greetings, Avatar."; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (lenora_pissed) + { + item.say("@Well, Avatar. I graciously grant thee another interview. I certainly hope thou wilt be more respectful this time.@"); + UI_clear_item_flag(item, SI_ZOMBIE); + } + + else if (!UI_get_item_flag(item, MET)) + { + item.say("You see a tall, stern woman, with graying red hair and a perpetual scowl."); + item.say("@Welcome, worthy Avatar, to the Hall of Justice. How may we assist thee in thy quest?@"); + UI_set_item_flag(item, MET); + } + else + item.say("@Welcome again, worthy Avatar, to my hall.@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + if (gflags[ASKEDABOUTPERMISSION]) + add("letter"); + + if (gflags[BOSKINCHILDREN]) + add("children"); + + if (gflags[FREEBOSKIN]) + add("free thief"); + + if (gflags[MICHAEL_PISSED]) + add("murder in Skara Brae"); + + if (gflags[ASKED_PRIDGARM_ABOUT_DRUDGEY]) + add("Drudgeworth and Saduj"); + + if (UI_get_item_flag(NICODEMUS, MET) || (gflags[LEARNED_ABOUT_NICODEMUS])) //asked Thairand about him + add ("enchanter"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Lenora, Lady Mayor of Yew.@"); + + case "job"(remove): + say("@It is my honor to preside over this town and its courts. We also provide the finest wood in the realm.@"); + add(["courts", "wood"]); + + case "wood"(remove): + say("@Go ask Ben the logger. Head west from here into the forest until you can go no further. Then look for a way through the trees to the north.@"); + + case "courts"(remove): + say("@In Yew we take pride in our system of justice.@"); + if (gflags[RINALDO_BACK]) + { + say("@Now that Rinaldo is back, he will be assuming his duties of presiding over the courts.@"); + } + add(["justice"]); + + case "justice"(remove): + say("@Indeed, the Rune of Justice itself was sent here for safekeeping.@"); + add(["Rune", "mantra"]); + + case "Rune"(remove): + say("@A thief stole the rune from the grave of our most respected resident, the former Lord Mayor. Even though the thief was caught, we have not yet found the rune.@"); + add(["thief"]); + + case "thief"(remove): + say("@The thief is in the jail, awaiting the carriage of justice.@"); + + case "mantra"(remove): + say("@'Tis most strange, Avatar, that thou knowest not the Mantra of Justice. How can that be?@"); + var choice = chooseFromMenu(["I forgot..", "say nothing"]); + if (choice == "I forgot..") + { + say("@Hmmm...well, no matter,@ she says suspiciously."); + say("@I suppose 'twould be improper to deny anything the Avatar requires. The Mantra of Justice is 'beh'.@"); + if (!gflags[LEARNED_MANTRA_JUSTICE]) + { + gflags[LEARNED_MANTRA_JUSTICE] = true; + giveExperience(15); + } + } + else + { + say("@Hmpf! Well, mayhap 'twould be best for you to seek such wisdom elsewhere!*@"); + say("@Thou may return when thou seest fit to answer my question!@"); + UI_set_item_flag(item, SI_ZOMBIE); //Lenora pissed + sayGoodbyeAbrupt(item, "Hmpf!..'Avatar', indeed!"); + return; + + } + + case "letter"(remove): + if (!gflags[LENORA_GAVE_LETTER]) + { + say("@A letter of permission? Dost thou truly need to speak with that reprehensible thief?@"); + + if (askYesNo()) + { + if (UI_add_party_items(1, SHAPE_SCROLL, 52, 3, false)) + { + say("@Very well then.@ Putting quill to parchment, she drafts a quick letter. @The jailer will now let you in, or verily shall he answer to me!@"); + //give letter to Avatar + gflags [LENORA_GAVE_LETTER] = true; + } + else say("@Ask again when you have room to carry the letter@"); + } + else + { + say("@Then why dost thou waste my time with frivolous requests?! Begone, Avatar, and return when thou hast more serious business on thy mind!@"); + UI_set_item_flag(LENORA, SI_ZOMBIE); //lenora pissed + sayGoodbyeAbrupt(item, "Don't waste my time!"); + return; + } + } + + else + say("@I already gave thee the letter, Avatar.@"); + + case "free thief"(remove): + say("@What, free the thief in return for the rune? Never! To do so would betray everything the rune itself stands for! Better to leave it lost.@"); + gflags[BOSKINDENIED] = true; + + case "children"(remove): + say("@What? What stories has that thief been telling you? He has no family--he's just a drifter! Don't be taken in by his lies.@"); + gflags[BOSKINLIES] = true; + add(["lies"]); + + case "lies"(remove): + say("@Tell him he's not fooling anyone.@"); + + case "enchanter"(remove): + say("@Nicodemus the enchanter lives near here. His house lies between two rivers.@"); + + case "Drudgeworth and Saduj"(remove): + say("@What do you know of them? They were responsible for the murder of a few guards during their transport.@"); + say("@It happened during the former Lord Mayor's tenure while I was just a clerk. What he knew about the case most likely died with him.@"); + say("@It's possible he might have talked to the barmaid about it as he enjoyed a good drink in the evenings, but he never discussed it with me.@"); + if (!gflags[ASK_ANDREA_ABOUT_DRUDGEY]) //open up Drudgeworth conversation on ANDREA + gflags[ASK_ANDREA_ABOUT_DRUDGEY] = true; + + + + case "murder in Skara Brae"(remove): + + + if (!gflags[ASKED_LENORA_ABOUT_MURDER]) + { + if (shop_is_open) + { + gflags[ASKED_LENORA_ABOUT_MURDER] = true; + + say("You inform Lenora of the events in Skara Brae surrounding Quenton's murder and the seance, in which Quenton indicated Michael was the culprit."); + say("@Yes, I'm aware of the unfortunate death in Skara Brae, but people die all the time to gargoyle attacks these days.@"); + say("@What wouldst thou have me do? Drop everything and send our already overstretched guards to arrest someone, based on a ghost's testimony?@"); + say("@It sounds more credible that it was the doings of those vile gargoyles. Please run along and trouble me not with this nonsense...@"); + //AVATAR->set_item_flag(BG_DONT_MOVE); + RINALDO->move_object([0x2b6, 0x208, 0x0]); + + //failsaife - make sure Rinaldo is "alive" and havne't met + RINALDO->clear_item_flag(DEAD); + + UI_set_schedule_type(RINALDO, TALK); + + //Lenora gives up the seat for Rinaldo + UI_modify_schedule(LENORA, 3, LOITER, [0654, 0515]); + sayGoodbye2(item); + break; + } + else + say("@Come back tomorrow when I'm working and we'll discuss this matter.@"); + + } + else + say("@As I have said, all further discussion on this matter should be with Rinaldo.@"); + + case "bye": + if (lenora_pissed) + { + say("@Hmpf! Well, mayhap 'twould be best for you to seek such wisdom elsewhere!@"); + say("@Thou may return when thou seest fit to answer my question!@"); + sayGoodbyeAbrupt(item, "Avatar, indeed!"); + + } + else + say("@May you find that which thou deservest on thy quest.@"); + + var avatar_goodbye = "@Goodbye..@"; + + if (lenora_pissed) + npc_goodbye = "@Goodbye, indeed! Hmpfh!@"; + else + npc_goodbye = "@Go in Justice, Avatar.@"; + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Nicodemus.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Nicodemus.uc new file mode 100755 index 0000000..8471c19 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Nicodemus.uc @@ -0,0 +1,156 @@ + +void Nicodemus object# (0x466) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + if (UI_get_schedule_type(item) == LAB) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Might we speak, mage?@"; + var npc_1st_greet = "@Ah the Avatar, come in!@"; + + var av_2nd_greet = "@Nicodemus..@"; + var npc_2nd_greet = "@Welcome back, Avatar.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + item.say("A wizened old man with a ready smile.*"); + item.say("@Good " + time_of_day + ", Avatar. For what purpose hast thou come?*@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + /////////////////////////////////////////// ////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Nicodemus.@"); + + case "job"(remove): + say("@Why, bless me, I work here!@"); + say("@I sell reagents, teach spells, and craft magic staves.@"); + say("@I also do a little experimenting.@"); + add(["reagents", "spells", "spellbook", "staves", "experimenting"]); + + case "experimenting"(remove): + say("@Oh, nothing a great adventurer such as yourself would be interested in.@"); + add(["interested"]); + + case "interested"(remove): + say("@He gets a suspicious look in his eyes.@*"); + if(player_is_female) + say("@Don't be too nosy, girlie!@"); + else + say("@Don't be too nosy, sonny!@"); + + case "spellbook"(remove): + if (!shop_is_open) + say("@Come to my shop when it's open!@"); + else + buySpellbook(NICODEMUS, 45); + + + + case "spells": + if (!shop_is_open) + say("@Come to my shop when it's open!@"); + else + magicShopkeeper(NICODEMUS); + + case "reagents"(remove): + if (!shop_is_open) + say("@Come to my shop when it's open!@"); + else + buyReagents(NICODEMUS); + + case "staves"(remove): + say("@Yes, I make magical yew staves. If thou knowest the Enchant spell, thou canst lock a spell within the staff for quick use!@*"); + say("@A yew staff costs 100 gold pieces, but it's worth twice that!@*"); + say("@Wouldst thou like to buy one?@"); + if (askYesNo()) + { + if (hasGold(100)) + { + if (UI_add_party_items(1, SHAPE_YEW_STAFF, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(100); + say("@The old man hands over a yew staff.@*"); + } + else say("@But thou cannot carry the staff!@"); + } + else say("@But thou cannot afford a staff!@"); + } + else say("@Perhaps some other time, then.@"); + + case "bye": + + var avatar_goodbye = "@Farewell, Nicodemus!@"; + var npc_goodbye = "@Come back anytime!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Pridgarm.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Pridgarm.uc new file mode 100755 index 0000000..4445af5 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Pridgarm.uc @@ -0,0 +1,255 @@ + +void Pridgarm object# (0x413) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + //if (UI_get_item_flag(item, DEAD)) + // subtractKarma(10); + + if (event == DEATH)//doesn't work currently + { + subtractKarma(10); + UI_error_message("DEATH event called on Pridgarm"); + } + + if (event == DOUBLECLICK) + { + //Avatar is in jail + if (UI_get_item_flag(item, SI_ZOMBIE)) //set by Arrest function + { + item.say("@Say, you looking to get the keys to my jail cells?@"); + if (askYesNo()) + { + item.say("@Well, ya know, I shouldn't do this. But Her Ladyship is a little too strict about who she puts in here.@*"); + item.say("@So I make up fer it by being a little careless with the keys, if you take my meaning.@*"); + item.say("He tosses you some keys, then turns his back on you."); + UI_add_party_items(1, SHAPE_KEY, QUALITY_BOSKIN_CELL_KEY, FRAME_BOSKIN_CELL_KEY); + UI_clear_item_flag(item, SI_ZOMBIE); + sayGoodbye2(item); + return; + } + else + item.say("@Okay. Never had nobody sound so interested in jest hearing about the jail before.@"); + + sayGoodbye2(item); + return; + } + + + + + + //Avatar and NPC greeting barks + var av_1st_greet = "@Greetings, jailer..@"; + var npc_1st_greet = "@Greetin's to ya.@"; + + var av_2nd_greet = "@Might we speak again?@"; + var npc_2nd_greet = "@Yup? Watcha need?@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + + + if (gflags[GOT_BOSKIN_CELL_KEY]) + { + item.say("@Good " + time_of_day + "," + player_name + ". Done with the key yet?@"); + if (askYesNo()) + { + if (UI_count_objects(PARTY, SHAPE_KEY, QUALITY_BOSKIN_CELL_KEY, FRAME_ANY) >= 1) + { + item.say("@Much obliged,@ the taciturn jailer says as he takes the key."); + UI_remove_party_items(1, SHAPE_KEY, QUALITY_BOSKIN_CELL_KEY, FRAME_BOSKIN_CELL_KEY, true); + gflags[GOT_BOSKIN_CELL_KEY] = false; + giveExperience(20); + sayGoodbye2(item); + return; + } + else + { + item.say("@Well, where is it?@"); + item.say("@Well, that does me no good. Need it here.@"); + item.say("Without another word, the jailer returns to his carving."); + sayGoodbye2(item); + return; + } + } + else + { + item.say("@Well, bring it back to me when you are.@ Without another word, the jailer returns to his carving."); + sayGoodbye2(item); + return; + + } + } + if (!UI_get_item_flag(item, MET)) + { + item.say("An old man, tall and thin. He spends all his time whittling.*"); + + UI_set_item_flag(item, MET); + } + item.say("@Good " + time_of_day + ", " + polite_title + ". What can I do for you?@"); + + //standard conversation options + var options = ["name", "job", "bye"]; + + //read leaflet found in royal dungeon + if (gflags[READ_LEAFLET]) + add("Drudgeworth and Saduj"); + + //BOskin asks you to free him + if (gflags[FREEBOSKIN]) + add("free thief"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@Name's Pridgarm.@"); + + case "job"(remove): + say("@I mind the jail. Got a prisoner in solitary right now.@"); + add(["jail", "prisoner", "solitary"]); + + case "jail"(remove): + say("@Got four of the cleanest cells you could ask fer.@"); + + case "prisoner"(remove): + say("@Feller broke into the grave of His Lordship, the late Mayor.@"); + add(["grave", "thief"]); + + case "solitary"(remove): + say("@You'll need my key to get in there.@"); + add(["key"]); + + case "thief"(remove): + say("@He's in solitary, right over there.@"); + add(["solitary"]); + + case "key"(remove): + say("@Yup, I could give you the key.... But not without Her Ladyship's permission.@"); + if (!gflags[ASKEDABOUTPERMISSION]) + gflags[ASKEDABOUTPERMISSION] = true; + add(["permission", "bribe"]); + + case "permission"(remove): + say("@You got a letter of permission from Her Ladyship?@"); + if (askYesNo()) + { + if (UI_count_objects(PARTY, SHAPE_SCROLL, QUALITY_LENORASLETTER, 3) >= 1) + { + if (UI_add_party_items(1, SHAPE_KEY, QUALITY_BOSKIN_CELL_KEY, FRAME_BOSKIN_CELL_KEY, false)) + { + say("@Okay, here's the key. Give it back when you're done.@"); + UI_remove_party_items(1, SHAPE_SCROLL, QUALITY_LENORASLETTER, FRAME_ANY);//to prevent circular xp + gflags[GOT_BOSKIN_CELL_KEY] = true; + } + else + say("@Ask again when you have room to carry the key@"); + } + else + say("@Gotta have a letter if you want to see the thief.@"); + } + else + say("@Well, gotta have a letter if you want to see the thief.@"); + + + + case "bribe"(remove): + say("@You offering me a bribe?@"); + if (askYesNo()) + say("He thinks for a moment. @Nope. Sorry, not interested.@"); + else + say("@Pity. Never been offered a bribe before.@"); + + + case "free thief"(remove): + say("@'Taint my place to talk about that. You should go see Her Ladyship, the Mayor.@"); + + case "grave"(remove): + say("@'Taint my place to talk about that. You should go see Her Ladyship, the Mayor.@"); + + + + //Drudgeworth quest + case "Drudgeworth and Saduj"(remove): + say("@Drudgeworth and Saduj?@ He thinks a moment. @Doesn't ring a bell. We got lotsa prisoners 'round here these days.@"); + add(["leaflet"]); + + + case "leaflet"(remove): + if (UI_count_objects(PARTY, SHAPE_SCROLL, QUALITY_LEAFLET, FRAME_ANY) > 0) + { + say("You hand him the leaflet. @Hmm, come to think of it.. this all sounds familiar now. I was a younger lad just starting out here as the jailer. Them prisoners never made it here.@"); + say("@They somehow escaped the transport cart and murdered the guards.@"); + say("@Seems like they found the abandoned cart and the guards some ways down the road from the Abbey. The former mayor led the investigation, but the two were never found.@"); + say("@They musta made their escape in the Deep Forest. Probably long gone now as that was years ago.@"); + say("@Maybe Her Ladyship could tell ya more.@"); + if (!gflags[ASKED_PRIDGARM_ABOUT_DRUDGEY]) + gflags[ASKED_PRIDGARM_ABOUT_DRUDGEY] = true; + } + else + say("@Well, where is it?@"); + + case "bye": + say("The jailer nods and says g'" + time_of_day + ".@"); + + var avatar_goodbye = "@That is all..@"; + var npc_goodbye = "@Be seein' ya.@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Rinaldo.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Rinaldo.uc new file mode 100755 index 0000000..7b081d8 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Rinaldo.uc @@ -0,0 +1,382 @@ + +void Rinaldo object# (0x432) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + + var av_1st_greet; + var npc_1st_greet; + + var av_2nd_greet; + var npc_2nd_greet; + + var avatar_goodbye; + var npc_goodbye; + + var pronoun; + + const int QUALITY_QUENTONLETTER = 62; + + + //Get time since 9am. That way this quest is time limited, after midnight, its done! + var hours_since_9am = (hour - 9); + var time_lapsed = (24 - hours_since_9am); //this determines how much time needs to lapse + + var whole_day = 24; //used for adding an entire day before Rinaldo announces Michael's capture + + + + + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == WAITER) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var example = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else + greeting = "friend"; //Avatar is solo + + //Initial first meeting with Rinaldo. + if (UI_get_schedule_type(item) == TALK && !UI_get_item_flag(RINALDO, SI_ZOMBIE)) + { + item.say("@Greetings, milady Lenora. Didst I overhear of a murder in Skara Brae?@"); + LENORA.say("@This situation is being taken care of, Rinaldo. There is no need for thy concern.@"); + item.say("@Lest ye not forget that Lord British himself appointed me to properly administrate Justice, after it had been twisted during his absense for so long.@"); + item.say("@While I do not doubt the Avatar's integrity, relying on the testimony of a spirit could set a horrible precedent. There is nothing on the books that would make it proper evidence.@"); + LENORA.say("Lenora, looking flustered, says @Then we shall arrest Michael, if that wouldst make thee happy. Tis enough evidence for me, Rinaldo. Mine intuitions have not failed me yet. The cells are full of prisoners who deserved their sentences...@"); + item.say("@I shall relieve you from the duties of judicial matters so you can concentrate on governing the city. Thank thee for filling in during my absense.@"); + LENORA.say("Lenora, looking both irate and insulted at the same time, resigns herself to authority."); + LENORA.say("@Very well, milord.@ she sighs. @Avatar, thou shouldst consult with Rinaldo concerning this matter. Good luck.@"); + LENORA.say("She glances at Rinaldo and then goes about her duties, quietly fuming to herself."); + LENORA.hide(); + UI_set_schedule_type(item, LOITER); + UI_clear_item_flag(item, MET); + UI_set_item_flag(item, SI_ZOMBIE); + AVATAR->clear_item_flag(BG_DONT_MOVE); + return; + } + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + av_1st_greet = "@Greetings milord.@"; + npc_1st_greet = "@Well met, Avatar.@"; + + av_2nd_greet = "@Hello again, Rinaldo.@"; + npc_2nd_greet = "@Ah yes, welcome back Avatar.@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (gflags[FAILED_QUENTON_QUEST]) //BAD ending + { + item.say("@Cheating are we? Tisk tisk.@"); + sayGoodbye2(item); + return; + + } + + + if ((isNearby(RENTHAR)) && (!UI_get_item_flag(RENTHAR, MET))) + { + UI_set_item_flag(RENTHAR, MET); //so Rinaldo and Renthar have discussed already + item.say("@If you will excuse me Avatar, Renthar is discussing an important matter with me. Please come back later.@"); + + //clear their wait schedules + UI_set_schedule_type(RENTHAR, LOITER); + UI_set_schedule_type(RINALDO, LOITER); + + sayGoodbye2(item); + return; + } + + //killed Michael in his hideaway but haven't talked to Rinaldo about it yet + if (gflags[MICHAEL_CAPTURED] && (!gflags[QUENTON_MURDER_SOLVED])) + { + item.say("@I thank thee for helping bring a murderer to justice, noble Avatar. With the gargoyles running roughshod across Britannia, manpower has been quite scarce in dealing with such crimes.@"); + if (gflags[MARNEY_GONE]) //semi-Good ending + { + item.say("@Renthar was able to make Michael reveal the location of Marney and he is en route to the location. He promised to return her to Skara Brae, let us hope he is not too late.@"); + item.say("@Take this reward for your troubles.@"); + //give money + if (UI_add_party_items(100, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY, false)) + { + gflags[QUENTON_MURDER_SOLVED] = true; + UI_add_party_items(100, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY, true); + item.say("He hands you a pouch of 100 gold coins."); + + //free up Marney from the holding place + UI_set_schedule_type(MARNEY, LOITER); + UI_run_schedule(MARNEY); + + item.say("@Thou art truly a shining example of the virtue of Justice.@"); + sayGoodbye2(item); + return; + + //set flag to where Marney will be reeling from the experience and be angry with the Avatar + gflags[MARNEY_PISSED] = true; + giveExperience(50); + + } + else + item.say("@Ask again when you have room to carry thy reward.@"); + } + else if (gflags[MARNEY_SAVED]) + { + item.say("@Take this reward for your troubles.@"); + //give money + if (UI_add_party_items(200, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY, false)) + { + gflags[QUENTON_MURDER_SOLVED] = true; + UI_add_party_items(200, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY, true); + item.say("He hands you a pouch of 200 gold coins."); + addKarma(20); + giveExperience(200); + item.say("@Thou art truly a shining example of the virtue of Justice, noble Avatar.@"); + sayGoodbye2(item); + return; + } + else + item.say("@Ask again when you have room to carry thy reward.@"); + + + + } + + + } + + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("You see a nobleman in judge's robes."); + item.say("@Avatar, 'tis an honor to meet thee.@ He shakes your hand.@"); + } + else + item.say("@A pleasure to see thee again, " + player_name + ". What wouldst thou speak of?@"); + + //standard conversation options + var options = ["name", "job", "bye", "murder in Skara Brae"]; + + //Marney is either saved or gone + if ((gflags[MARNEY_GONE] || gflags[MARNEY_SAVED]) && !gflags[QUENTON_MURDER_SOLVED]) + add("Michael's whereabouts"); + + if (gflags[STARTED_INVESTIGATION] && !gflags[QUENTON_MURDER_SOLVED]) + add("evidence"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + say("@I am Rinaldo, and I strive to uphold the virtue of Justice.@"); + + case "job"(remove): + say("@I was appointed a judge of the High Court of Yew, by Lord British. In my absense, Lenora took care of my duties.@"); + add(["absense", "Lenora", "Lord British"]); + + case "absense"(remove): + say("@I was away for a while on a sabbatical, scouring books in the Lycaeum for any information regarding moongates and their functions.@"); + add(["moongates"]); + + case "Lenora"(remove): + + say("@Lenora was gracious enough to temporarily take over my duties overseeing the High Court of Yew.@"); + if (isNearby(LENORA)) + { + LENORA.say("Lenora looks over and scowls, then goes back to what she was doing."); + LENORA.hide(); + say("Rinaldo looks at you and grins slightly"); + } + say("He whispers: @Between you and I, her idea of justice was a bit too heavy handed and apparently based on her emotions...usually anger!@"); + say("Rinaldo laughs."); + + + case "Lord British"(remove): + say("@Such a noble and just ruler. The former lord mayor of Yew recommended me to him for this position. I hope my service doth make him proud, and I strive to dispense justice fairly and according to the law.@"); + + case "murder in Skara Brae"(remove): + if (gflags[QUENTON_MURDER_SOLVED]) + { + say("@Such a shame. My thoughts go out to the young woman left behind without her father. I am glad thou hast brought the murderer to justice.@"); + } + else + { + say("@I hope thou weren't offended by mine interjection. I strive for Justice, even for those who may seem like scoundrels. From what I understand about thy last visit here, justice was grossly misapplied...@"); + say("@Let us have a thorough investigation into this matter so we can properly prosecute the murderer by the books.@"); + add(["investigation"]); + } + case "moongates"(remove): + say("@Yes, very interesting topic. Much like thyself, I come from another land.@"); + add(["another land", "why?"]); + + case "another land"(remove): + say("@Yes, far away. I like Britannia much better. In fact, I hope to see my sister here again one day as well. I was hoping that I might be able to find something on moongate appearances and how often inter-wordly gates appear. I didn't find much of use though.@"); + add(["sister"]); + + case "sister"(remove): + say("@She's powerful in the art of magic. It was her who found a way for us to come here, via the moongates.@"); + say("@I do not know the specifics, but she studied legends of strange people appearing through moongates, or disappearing through them altogther.@"); + say("@Somehow she was able to discern exactly when a moongate would appear and that it would lead us to this land.@"); + add(["how?"]); + + case "why?"(remove): + say("@Why I came here? Let's just say mine homeland cares not for the true meaning of justice.@"); + + case "how?"(remove): + say("@My knowledge of magic is very miniscule. She just told me to trust her intiutions, that we would be going to a far better place than our own homeland.@"); + add(["homeland"]); + + case "homeland"(remove): + say("@We do not have a system of virtues like here in Britannia. My interest in law led me to Yew, the city of Justice. This was some time after Blackthorn's reign. My sister stayed briefly, but left for an unknown destination.@"); + add(["virtues", "law", "unknown destination"]); + + case "virtues"(remove): + say("@Thy legendary Quest was very inspiring. Justice is a virtue that I strive to uphold.@"); + + case "law"(remove): + say("@I spent years studying Britannian law. Quite interesting stuff.@"); + + case "unknown destination"(remove): + say("@Her quest for knowledge has lead her to many different lands, and quite possibly different planes of existence. She promised she would return to Britannia eventually.@"); + say("@She had mentioned wanting to move to Skara Brae when she returns. 'Tis the City of Spirituality of course.@"); + add(["Skara Brae"]); + + case "Skara Brae"(remove): + say("@Never been there.@"); + + case "investigation"(remove): + if (gflags[QUENTON_MURDER_SOLVED]) + say("@Thou hast successfully completed the investigation already. Good work.@"); + + else + { + say("@Start at the scene of the crime. Talk to all the townsfolk again. Were there witnesses? If so, ask them.@"); + say("@A credible witness willing to testify would be beneficial to our case. Leave no stone unturned.@"); + say("@Report back here with me if thou dost need more assitance, or if you have evidence we can act upon. Make haste!@"); + + /* When the investigation starts, Michael is moved to his house and won't allow the Avatar to look around. + * That will start a timer waiting until 9pm which will move Michael and Marney to the docks + * If the player is too late, they will both be gone, Marney having went along with Michael. + */ + + if (!gflags[STARTED_INVESTIGATION]) + { + gflags[STARTED_INVESTIGATION] = true; + + //Move michael to center of his house, make him wait. + MICHAEL->move_object([0626, 1381, 0]); + MICHAEL->set_schedule_type(WAIT); + + + //Set Rinaldo's npc ID to the time_lapsed so it can be accessed in quenton_sidequest_eggs + UI_set_npc_id(RINALDO, time_lapsed); + + //start actual timer + UI_set_timer(INVESTIGATION_TIMER); + var timer_num = UI_get_timer(INVESTIGATION_TIMER); + UI_error_message("gflag STARTED_INVESTIGATION is set"); + UI_error_message("Current hour is: " + hour + " and INVESTIGATION_TIMER is set to " + timer_num); + + } + } + + + case "evidence"(remove): + say("@Thou hast found some evidence? Let me see it.@"); + if (UI_count_objects(PARTY, SHAPE_SCROLL, QUALITY_QUENTONLETTER, FRAME_ANY) >= 1) + { + say("You show Rinaldo the scroll you found, and inform him that Michael has fled on his ship."); + say("@So, Quenton owed him a debt. Seems as though Michael murdered him when he didn't pay.@"); + say("@Any potential witnesses?@"); + if (gflags[STIVIUS_SAW_MICHAEL]) + add("Stivius"); + + } + else + say("@Well, where is it? Where is thine evidence?@"); + + //this should only come about when Michael is gone, and you haven't "met" Renthar yet + case "Michael's whereabouts"(remove): + if (gflags[MARNEY_SAVED]) + say("You inform Rinaldo that Michael had fled on a ship and Marney was saved."); + else if (gflags[MARNEY_GONE]) + say("You inform Rinaldo that Michael had fled on a ship with Marney."); + + say("@Indeed... he could be anywhere by now. Avatar, please speak with this fellow here, Renthar, immediately.@"); + say("@Before you came in, he was revealing some information on a pirate crew that may be interesting to you.@"); + say("@Michael has a connection to them! Talk to him, and find out where Michael might be hiding. I'm afraid due to the lack of manpower with the gargoyle war, it is up to thee to bring him to Justice!@"); + say("@Do what thou must, but bring him in alive, so that he faces a proper trial.@"); + UI_set_item_flag(RENTHAR, MET); //so you can talk to Renthar now. + sayGoodbyeAbrupt(item, "@Make haste and good fortune to thee!@"); + return; + + + case "Stivius"(remove): + say("Rinaldo listens as you inform him that Stivius witnessed the murder, but made the gargoyle story up to save himself from Michael."); + say("@I see. I will see to it that he testifies against Michael and his safety will be guaranteed. Excellent work.@"); + + + case "bye": + avatar_goodbye = "@Goodbye, Rinaldo.@"; + npc_goodbye = "@Til we meet again, " + player_name + ".@"; + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Rowan.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Rowan.uc new file mode 100755 index 0000000..2126f21 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Rowan.uc @@ -0,0 +1,363 @@ +void Rowan object# (0x4fb) () +{ +var player_name; //" + player_name + " +var polite_title; //" + polite_title + " +var player_is_female; +var schedule; +var hour; +var party; +var rand; + + +if (event == PROXIMITY) +{ +scheduleBarks(item); +} + +else + + if (gflags[ROWAN_RELEASED]) + { + if (event == DOUBLECLICK) + { + + item.say("@Well, hast thou secured my release?@"); + + var options2 = ["decipher scroll", "bye"]; + + if (gflags[READ_LETTER]) options2 = options2 & "about letter"; + + //Start of regular conversation tree + converse(options2) + { + + case "decipher scroll" (remove): + if (!gflags[DECIPHERED]) + { + say("@Rinaldo will speak later on the terms of me release? Fair enough. Let me see the letter.@"); + if (UI_count_objects(PARTY, SHAPE_SCROLL, 55, FRAME_ANY) >= 1) + { + gflags[DECIPHERED] = true; + var pos_house = [0678, 2067, 00 ]; + + MICHAEL->move_object([0x2a6, 0x814, 0x0]); //hex coords - this moves Michael to the safe house + UI_set_schedule_type(MICHAEL, WAIT); + UI_set_new_schedules(MICHAEL, 2, 15, [pos_house]); + UI_set_new_schedules(MICHAEL, 6, 15, [pos_house]); + UI_set_new_schedules(MICHAEL, 7, 15, [pos_house]); + + + say("@Alright matey, get me a quill an' I'll write the translation. 'twas written in our code language. Not many know it, because its secret.@"); + say("You borrow a quill from Pridgarm's desk and bring it back to Rowan. He starts to write the correct word below each line of text in the letter. After some time, he finishes."); + say("@There ye be. Hope ye can read me handwritin'!@ He laughs."); + say("He returns the scroll to you."); + add(["code"]); + } + else say("@Didst thou drop it? Thou'll be needin' to find it for me to translate.@"); + return; + } + else say("@Didn't I already do that for ye?@"); + + case "code"(remove): + say("@The crew I be with uses that language made up of different symbols, on all our maps and orders to shield 'em from prying eyes.@"); + add(["crew"]); + + case "crew"(remove): + say("@Thou wouldst be better off not knowin' matey. At least not right now.@"); + + + case "about letter"(remove): + say("@Well, whattya be wantin' to know?@"); + add(["Renthar", "'The Captain'", "'he'"]); + + case "Renthar"(remove): + say("@Renthar is an assassin. That bastard nearly killed me, and killed several of the crew.@"); + say("@According to this letter, the Captain must believe me for dead. 'Twil buy me some time at least, to disappear into the population with a new identity.@ He trails off, lost in his thoughts."); + say("@Ah yes, you were inquirin' about Renthar. He was once the Captain's right-hand man. He killed many a man at the Captain's bidding. Meaner than a viper too.@"); + say("@Well, rumor has it, he was conspirin' to kill the Captain. 'Twouldn't be the first time someone made an attempt on the Captain's life, those unfortunate enough to try were tortured in the dungeon and killed. I heard it was Michael who ratted 'em out.@"); + say("@Anyways, Renthar and Michael were both in the Captain's inner circle. Renthar was currently on the mainland, presumably doing a hit on some nobleman from Britain who owed some money to our 'legitimate operations'.@"); + say("@It was then that Michael went to the Captain. I was never in the inner circle, but word would filter down that Michael was jealous of Renthar's status and wanted it for himself.@"); + say("@The Captain was enraged, so he sent a ship of men to re-aquire Renthar before he could strike. I wasn't apart of this expedition, but I heard they were almost caught by the Royal Navy.@"); + say("@The crew finally ambushed Renthar, and brought him back, where he was locked into the dungeon and tortured. Of course the crew boasted of their exploits, and the kidnapping of some lass from Skara Brae.@"); + add(["Michael", "'legitimate operations'"]); + + case "'he'"(remove): + say("@No idea, matey. That tidbit of information must be above my rankin'.@"); + + case "Michael"(remove): + say("@Once Renthar was imprisoned, Michael became the Captain's right-hand man. Of course as of late, the Captain's paranoia forced him to re-locate Michael onto the mainland, fronting loan operations, an' of course, doing hits here and there.@"); + say("@I'd imagine that if the Captain finds out I'm alive, Michael would be sent to gut me.@"); + say("@I assume ye are trying to catch him? Thou shouldst be careful then, matey. I'll breathe a sigh of relief once he's wailing in the abyss.@"); + + case "'legitimate operations'"(remove): + say("@We're no run of the mill pirates, " + polite_title + ". The Captain has legit operations such as loaning money, gambling and the like. Of course those who don't pay up, find themselves on the wrong end of the sword by the Captain's assassins.@"); + + + case "'The Captain'"(remove): + say("In a whisper, Rowan speaks. @Gaspard. He keeps a tight lid on the crew. Half of us ne'er even seen 'em. He deals with the underlings through others in higher ranking than us.@"); + say("@All I know of Gaspard, is that he's been around for a very long time and he's no ordinary pirate. Rumour has it, that he once served under Mondain hisself. I assume that's why we be called the 'Order of Mondain'.@"); + add(["Order of Mondain"]); + + case "Order of Mondain" (remove): + say("@Not sure why we're called that. Methinks that it is to strike fear into the hearts of men with the memory of Mondain.@"); + say("@That is why the letter was written in the code language. The Order is pretty organized, and mysterious.@"); + + + + case "bye": + say("@Thank ye kindly for securing me release, friend.@"); + break; + } + } + } + + + + + + if (event == DOUBLECLICK) + { + + script AVATAR + + { + + call GenericFreeze; + + face AVATAR->find_direction(item); + + actor frame standing; + + say "@Might I have a word with thee?@"; + + wait 10; + + }; + + script item + + { + + call GenericFreeze; + + wait 5; + + face find_direction(AVATAR); + + actor frame standing; + + say "@Yea?@"; + + wait 8; + + call (Dampe); + + } + + } + + else if (event == SCRIPTED) + + { + + + //Unfreeze Avatar and ITEM: + + AVATAR->GenericUnfreeze(); + + item->GenericUnfreeze(); + + + + + + + player_name = getAvatarName(); + polite_title = getPoliteTitle(); + player_is_female = UI_is_pc_female(); + + if (!UI_get_item_flag(item, MET)) + { + UI_set_item_flag(item, MET); + item.say("A wounded pirate with bandages wrapped around his chest and stomach."); + item.say("@Has Gaspard sent ye to kill me? Very well.. make it quick.@"); + add(["Gaspard?"]); + } + else + + item.say("@Well, whatddya need?@"); + +var options = ["name", "job", "bye", "scroll"]; + + + //Start of regular conversation tree + converse(options) + { + case "name": + say("@I am Rowan, pirate and soon to be a dead man.@"); + add(["dead man?"]); + + case "job": + say("@Yes, I be a pirate. Or were a pirate. I s'pose I'm on 'the list' now..@"); + add(["the list?"]); + + case "Gaspard?"(remove): + say("Pausing for a moment, he studies your face to make sure your confusion is genuine."); + say("@Never mind me, " + polite_title + ". Methinks I'm delirious...@"); + + case "dead man?"(remove): + say("@No one walks away. They always be found, and death is welcomed after they'be through with ya.@"); + add(["they"]); + + case "they"(remove): + say("@Doesn't matter now, matey. I'll soon be dead.@"); + + case "the list?"(remove): + say("@I didn't stutter.. thas what I said!@"); + say("@I don't wish to tell ye anything, for it doesn't matter and they's nothing you can do about it!@"); + + + case "scroll"(remove): + say("You show him the scroll through the bars and ask him if the language is familiar."); + say("Rowan seems to be able to read it, and in his eyes you can tell he's calculating."); + say("@Where did ye find this? You pilfered this from Michael, eh? This bit of information gives me some hope, an' perhaps I might be willin' to help ye...@"); + say("@...for a price.@"); + if (isNearby(DUPRE)) + { + DUPRE.say("@Of course. Because pirates are so well renowned for their generosity...@ Dupre says as he rolls his eyes."); + DUPRE.hide(); + } + if (isNearby(IOLO)) + { + IOLO.say("Iolo slightly elbows Dupre and whispers to him. @Hush my friend! Now is not time for thy sarcasm!@"); + IOLO.hide(); + } + if (isNearby(SHAMINO)) + { + SHAMINO.say("Out of the corner of your eye, you see Shamino grinning and shaking his head."); + SHAMINO.hide(); + } + add (["price"]); + + + case "price"(remove): + say("@Alright " + polite_title + ", I'll make thee a deal. I'll decipher this letter for ye-- if thou wouldst talk to the judge and have me released.@"); + if (isNearby(DUPRE)) + { + DUPRE.say("@And why shouldst the Avatar trust a pirate?@"); + DUPRE.hide(); + say("@Suits thyself, but thems be the terms.@"); + } + add(["release"]); + + case "release"(remove): + say("@The contents of this letter gives me great hope. If thou canst secure my freedom, I'll decipher it for ye and perhaps I might tell ye more.@"); + say("@Do we have an accord then?@"); + if (askYesNo()) + { + say("Alright then. And tell his judgeship that under the right circumstances, I'll reveal a treasure trove of useful testimony for him.@"); + say("Motioning at his bandages with his hands, he says @I'm done with pirating matey. The last scuffle I was in wounded me severely as thou can see.@"); + say("@I'll need to start a new life. A new identity. From whence I came, I cannot return.. so thou dost have my word that I'll cooperate. Return when thou hast talked to the judge.@"); + + gflags[ASK_TO_RELEASE_ROWAN] = true; + + if (isNearby(DUPRE)) + { + DUPRE.say("As you leave, Dupre leans in and whispers to you. @Careful " + polite_title + ",... never trust a pirate.@"); + DUPRE.hide(); + } + item->clear_item_flag(BG_DONT_MOVE); + AVATAR->clear_item_flag(BG_DONT_MOVE); + break; + } + else say("@Then ye will get no help from me!@"); + item->clear_item_flag(BG_DONT_MOVE); + AVATAR->clear_item_flag(BG_DONT_MOVE); + break; + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + case "blank"(remove): + say("@ @"); + add(["blank"]); + + + case "bye": + + item.say("He nods as you leave."); + item->clear_item_flag(BG_DONT_MOVE); + AVATAR->clear_item_flag(BG_DONT_MOVE); + break; + +} +} +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Sinjen.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Sinjen.uc new file mode 100755 index 0000000..5ba7e38 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Sinjen.uc @@ -0,0 +1,63 @@ +void Sinjen shape# (1160) () +{ + var player_name; + var polite_title; + + + + if (event == DOUBLECLICK) + { + UI_show_npc_face(129, 0); + item.say("A long haired, raggedy man in stocks."); + + var options = ["name", "job", "bye"]; + + + //Start of regular conversation tree + converse(options) + { + case "name"(remove): + say("@I'm Sinjen the warrior.@"); + add(["warrior"]); + + case "job"(remove): + say("@Lenora said I should stay in these stocks for a while and make sure they work properly.@"); + add(["Lenora"]); + + case "warrior"(remove): + say("@Well, these days I'm more into stocks.@"); + add(["stocks"]); + + case "stocks"(remove): + say("@I didn't really do anything wrong. I told them to go ahead and put me here anyway, so I could get a different perspective on life.@"); + add(["life", "perspective"]); + + case "Lenora"(remove): + say("@Justice may be a virtue, but I think she carries it too far.@"); + add(["virtue"]); + + case "perspective"(remove): + say("@Normally we stumble around through life on our own. But here I can stand still and watch it go by all around me.@"); + + case "life"(remove): + say("@The meaning of life? I'm still trying to figure it out myself.@"); + + + case "virtue"(remove): + say("@I prefer Mandrake's version of the eight virtues.@"); + add(["Mandrake"]); + + case "Mandrake"(remove): + say("@You should ask him about it sometime.@"); + + + + case "bye": + + item.say("@Come back and chat again sometime. I'll be right here...@"); + break; + + + } + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Utomo.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Utomo.uc new file mode 100755 index 0000000..758bfe2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/npcs/Yew/Utomo.uc @@ -0,0 +1,237 @@ + +void Utomo object# (0x414) () +{ + + var party = UI_get_party_list(); + var player_name = getAvatarName(); + var polite_title = getPoliteTitle(); + var hour = UI_game_hour(); + var partynum = UI_get_array_size(party); + var bark; + var player_is_female = UI_is_pc_female(); + var greeting; //When addressing party as plural or singular + var avatar_bark; + var npc_bark; + var time_of_day = timeFunction(hour); + var schedule = UI_get_schedule_type(item); //use for schedule specific convos + var current_schedule = schedule; + var price; + var item_choice; + var armor_options = ["nothing", "brass helm", "leather helm", "ring mail", "swamp boots"]; + var armor_shapes = [SHAPE_CRESTED_HELM, SHAPE_LEATHER_HELM, SHAPE_RING_MAIL, SHAPE_SWAMP_BOOTS]; + var armor_prices = [20, 7, 40, 10]; + // + + var weapon_options =["nothing", "club", "dagger", "spear", "throwing axe", "two-handed axe"]; + var weapon_shapes = [SHAPE_CLUB, SHAPE_DAGGER, SHAPE_SPEAR, SHAPE_THROWING_AXE, SHAPE_2H_AXE]; + var weapon_prices = [10, 10, 12, 12, 45]; + + var sell_rate = 2; //integer to divide by when selling items back to npc + var sell_shapes = [SHAPE_CRESTED_HELM, SHAPE_LEATHER_HELM, SHAPE_RING_MAIL, SHAPE_SWAMP_BOOTS, SHAPE_CLUB, SHAPE_DAGGER, SHAPE_SPEAR, SHAPE_THROWING_AXE, SHAPE_2H_AXE]; + var sell_options = ["nothing", "crested helm", "leather helm", "ring mail", "swamp boots", "club", "dagger", "spear", "throwing axe", "2-handed axe"]; + var sell_prices = [20, 7, 40, 10, 10, 10, 12, 12, 45]; + + //Dialog options + var initial_choice_question = "@Which of these?@"; //arms or armor? etc + var askIfInterested1 = "@Sell for "; //needs to be split into array to capture price + var askIfInterested2 = " gold. Okay?@"; + var cant_afford = "@Cost too much for you!@"; + var cant_hold = "@It is too heavy for you!@"; + var saidNo = "@Which item?@"; + var nothing = "@No more, ah? Okay.@"; + var success = "@Good!@ After accepting your gold, he hands over the "; + var success2; //"I hope this item works well for you!" etc if needed + + //group together dialog options in array for cleaner look + var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, cant_afford, cant_hold, saidNo, nothing, success, success2]; + //buyArmor(item, armor_options, prices, shapes, dialog); + + //For schedule specific behavior - Change WAITER with the 'working' schedule of the npc (BLACKSMITH/ TEND SHOP / etc) + if (UI_get_schedule_type(item) == BLACKSMITH) + { + UI_set_item_flag(item, SHOP_IS_OPEN); + UI_error_message("Shop is open"); + } + + //this makes sure you can talk to them still if their shop is open (convo function turns it to TALK) + var shop_is_open = UI_get_item_flag(item, SHOP_IS_OPEN); + + //************************************/ + //Flags used for conversation flags + // use PETRA, SI_ZOMBIE, FREEZE, NAKED, POLYMORPH + var met_utomo = UI_get_item_flag(item, SI_ZOMBIE); + + + //READ flag used to initiate conversations via TALK + var started_talking = UI_get_item_flag(item, READ); + + if (player_is_female) // + { + // pronoun = " "; + // title = "madame"; + } + else + { + // pronoun = " "; + // title = " "; + } + + //determine single/plural greeting - change as needed + if (partynum > 1) + greeting = "friends"; + else greeting = "friend"; //Avatar is solo + + + if (event == DOUBLECLICK) + { + //Avatar and NPC greeting barks + var av_1st_greet = "@Might we speak?@"; + var npc_1st_greet = "@Ombogo dono.@"; + + var av_2nd_greet = "@Hello again..@"; + var npc_2nd_greet = "@Ombogo sano!@"; + + //call convo script + startConvo(item, av_1st_greet, npc_1st_greet, av_2nd_greet, npc_2nd_greet); + } + + if (started_talking) + { + //reset schedule for after convo + UI_run_schedule(item); + + if (!UI_get_item_flag(item, MET)) + { + item.say("A huge, dark-skined man with a close-set face.*"); + item.say("@Ombogo dono,@ he grunts at you from behind a large forge.@"); + UI_set_item_flag(item, MET); + } + else + { + item.say("@Ombogo sano!@ he says, smiling widely."); + add(["sano", "Omdu Yaf"]); + + } + + //standard conversation options + var options = ["name", "job", "bye", "Ombogo", "dono"]; + + + if (UI_get_item_flag(ANDREA, MET)) + add ("Andrea"); + + + + ///////////////////////////////////////////////////////////////////// + // Main conversation thread + + ///////////////////////////////////////////////////////////////////// + converse(options) + { + case "name"(remove): + if (!UI_get_item_flag(UTOMO, SI_ZOMBIE)) + { + say("@Utomo, from island."); + UI_set_item_flag(UTOMO, SI_ZOMBIE); + } + else + say("@Utomo remember you, how you not remember Utomo? Utomo, from island.@"); + add(["Utomo"]); + + + case "job"(remove): + say("@Utomo make good weapons. Make one for you if you like.@"); + add(["weapons", "buy", "sell"]); + + + case "Ombogo"(remove): + say("@That mean 'hello.'@"); + + + + case "dono"(remove): + say("@That mean 'person I don't know.'@"); + + + case "sano"(remove): + say("@That mean 'friend.'@"); + + + case "Utomo"(remove): + say("@Utomo mean 'island' in my language. I also from island. Bring magic fan from island. This town new home for Utomo now.@"); + add(["fan", "home"]); + + case "weapons"(remove): + say("@Learn to make as boy. I live on island then.@"); + + case "fan"(remove): + say("@Lady on island make magic fans. They make big wind, blow ships all around.@"); + + case "home"(remove): + say("@I come here from many days away. My home burned by evil man.@"); + add(["many", "evil"]); + + case "many"(remove): + say("@I not sure where. Got ride on big ship.@"); + add(["ship"]); + + case "evil"(remove): + say("@He say to me, 'You man, you leave home and kill good people with me.' I ran from him.@"); + add(["kill"]); + + case "ship"(remove): + say("@I stow away when night come. After long time we land and I jump off.@"); + + case "kill"(remove): + say("@Like people in town. Like Lord British.@"); + + case "Andrea"(remove): + say("@Utomo go and drink at her home. She try kiss Utomo. Utomo say, 'I no want you' but she kiss anyway. Utomo not go back there.@"); + add(["kiss"]); + + case "kiss"(remove): + say("@Utomo have girl back home. She not thin like Andrea. Someday Utomo go back and get her. Someday.@ He plays the poker over the hot coals and looks absently into the fire."); + add(["girl"]); + + case "girl"(remove): + say("@Her name Yuna. She good tree climber. I not see her for long time.@"); + + case "Omdu Yaf"(remove): + say("@In my land it mean 'You have good meal in sun.' It is goodbye in my land.@"); + + case "buy"(remove): + if (!shop_is_open) + say("@You come to shop when it open.@*"); + else + { + say("@I have many things here. You want arms or armor.@"); + add(["arms", "armor"]); + } + + case "sell": + if (!shop_is_open) + say("@You come to shop when it open.@*"); + else + { + sellBackItems(sell_shapes, sell_options, sell_prices, sell_rate); + } + + case "arms": + buyWeapons(item, weapon_options, weapon_prices, weapon_shapes, dialog); + + case "armor": + buyArmor(item, armor_options, armor_prices, armor_shapes, dialog); + + case "bye": + + var avatar_goodbye = "@Goodbye..@"; + var npc_goodbye = "@Omdu Yaf!@"; + + //function that is called, do not change this: + sayGoodbye(item, npc_goodbye, avatar_goodbye); + break; + + } + } + else scheduleBarks(item); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/ChainBolt.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/ChainBolt.uc new file mode 100755 index 0000000..ba6d164 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/ChainBolt.uc @@ -0,0 +1,231 @@ +static var old_target; + +var setTarget(var target) +{ + old_target = target; +} + +var getTarget() +{ + UI_error_message("Old target is " + old_target); + return old_target; + + +} + + +//Chain bolt replaces create gold. +void chainLightning object#()() +// void chainLightning shape#(var target, var shots_left)() +//var chainLightning(var target, var shots_left) +{ + var target_count = 9; + var target = item; //getTarget(); + + enum chainLightning_events + { + CHAIN_BOLT = 1, + CHAIN_BOLT_LOOP = 2 + + }; + + if (event == CHAIN_BOLT_LOOP) + { + var num_shots = UI_get_npc_id(CHAIN_BOLT); //npc -132 + UI_error_message("Chain bolt loop called. Num shots left is " + num_shots); + if (num_shots > 9) + { + script target after 10 ticks + { + call chainLightning, CHAIN_BOLT; + } + target_count -= 1; + UI_error_message("target count is " + target_count); + } + UI_set_npc_id(CHAIN_BOLT, num_shots - 1); //lower "count" + } + + if (event == CHAIN_BOLT) + { + const int SHAPE_LIGHTNING = 807; //807 + //target chosen should be the one chosen by the initial casting of the spell + var target = item; //getTarget(); + var current_target_shape = UI_get_item_shape(target); + UI_error_message("Current target shape in event CHAIN_BOLT is " + current_target_shape); + var current_target_npc_num = UI_get_npc_number(target); + var current_target_npc_name = UI_get_npc_name(target); + var current_target_object = UI_get_npc_object(target); + + + UI_error_message("chainLightning called, event CHAIN_BOLT. Target 1 is " + current_target_object); + + if (target) + UI_error_message("There is an initial target"); + else + UI_error_message("No initial target"); + + //var avatar_level = getExpLevel(AVATAR); + var num_shots = UI_get_npc_id(CHAIN_BOLT); //npc -132 + + //select a new target: + //first get all npcs in a 15 tile range of target, then add them to an array. Discards any GOOD aligned targets. Select a random target from that array: + + var dist = 20; //tiles which we want to check + var npc_list = target->find_nearby(-359, dist, 0x08); + var npc_list_num = UI_get_array_size(npc_list); + + var target_list = []; + var npc_alignment; + UI_error_message("NPC list initially is " + npc_list_num); + + var count = 0; + + + //take npc list and take out party members, put all valid targets in new array + for (npc in npc_list) + { + + npc_alignment = UI_get_alignment(npc); + if (npc_alignment == GOOD) + continue; + else + { + UI_error_message("NPC is not GOOD aligned, adding to target list."); + target_list << npc; + count+= 1; + + } + + } + + //randomly select target from npc list: + var target_list_size = UI_get_array_size([target_list]); + UI_error_message("target_list_size array has " + target_list_size + " elements"); + var rand = UI_get_random(target_list_size); + UI_error_message("random number for array is " + rand); + var new_target = target_list[rand]; + + while (target == new_target && count < 10) + { + UI_error_message("Target is the same, re-rolling.."); + new_target = target_list[rand]; + count += 1; + + if (count == 9) + new_target = target_list[2]; + + } + var new_target_object = UI_get_npc_object(new_target); + UI_error_message("random target is shape " + UI_get_item_shape(new_target) + " and new target object is " + new_target_object); + + if (new_target) + UI_error_message("new target should be selected"); + + //attack the target: + // target->set_to_attack(new_target, SHAPE_LIGHTNING); + // if (UI_set_to_attack(target, new_target, SHAPE_LIGHTNING)) + // UI_error_message("Target 1 attacks target 2 successfully"); + // else + // UI_error_message("attack failed"); + var direction = UI_find_direction(target, new_target); + UI_error_message("direction from target 1 to target 2 is " + direction); + //UI_fire_projectile(target, direction, SHAPE_LIGHTNING, 1, SHAPE_LIGHTNING, SHAPE_LIGHTNING); + + UI_set_to_attack(target, new_target, SHAPE_LIGHTNING); + + + //subtract shots left + //shots_left -= 1; + + //set old target + //setTarget(target); + + //script target to run chain lightning again, choosing another target + if (target) + { + script new_target after 15 ticks + { + //chainLightning(target, shots_left); + call chainLightning, CHAIN_BOLT_LOOP; + } + } + else + UI_error_message("No more targets."); + + } + + + + + + + +} + + + + + + +//SPELL//////////////////////////////////////////////////////////////////////////////////////////////// +void spellChainBolt object# (0x678)() +{ + //var num_shots = getExpLevel(AVATAR); //times the chain lightning will attack different people + + if (event == DOUBLECLICK) + { + + var target = UI_click_on_item(); + var target_shape = target->get_item_shape(); + var dir = direction_from(target); + const int SHAPE_LIGHTNING = 807; //807 + var dist = 15; + + //var target_list = []; + //var num_targets; + //var new_target; + //var npc_alignment; + + halt_scheduled(); + item_say("@Ort Grav@"); + if (inMagicStorm()) + { + UI_set_to_attack(AVATAR, target, SHAPE_LIGHTNING); + + + script AVATAR + { nohalt; face dir; + actor frame raise_1h; actor frame cast_up; + sfx 65; actor frame cast_out; + actor frame strike_2h; actor frame strike_2h; + attack; actor frame standing; + + } + + //get random number for "shots left". Adding 2 so there is at least 3 shots to be fired + var shots_left = UI_get_random(6) + 2; + + //call the chain lightning script + target->chainLightning(); + + var num_shots = UI_get_npc_id(CHAIN_BOLT); + UI_set_npc_id(CHAIN_BOLT, 10); //npc -132 + UI_error_message("Shots are initially " + num_shots); + + + // call chainLightning, CHAIN_BOLT_LOOP; + + } + else + { + script item + { nohalt; face dir; + actor frame raise_1h; actor frame cast_up; + actor frame cast_out; actor frame strike_2h; + call spellFails; + } + } + + + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/Enchant.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/Enchant.uc new file mode 100755 index 0000000..fe2878e --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/Enchant.uc @@ -0,0 +1,242 @@ +void spellEnchantEffect object#() () +{ + var normal_missiles = [SHAPE_ARROWS, SHAPE_BOLTS]; + var magic_missiles = [SHAPE_MAGIC_ARROWS, SHAPE_MAGIC_BOLTS]; + for (missile in normal_missiles with index) + if (missile == get_item_shape()) + set_item_shape(magic_missiles[index]); +} + + + + + +void spellEnchant object#(0x651) () +{ + var normal_missiles = [SHAPE_ARROWS, SHAPE_BOLTS]; + var magic_missiles = [SHAPE_MAGIC_ARROWS, SHAPE_MAGIC_BOLTS]; + + var BP = UI_count_objects(AVATAR, SHAPE_REAGENT, QUALITY_ANY, FRAME_BLACK_PEARL); + var NS = UI_count_objects(AVATAR, SHAPE_REAGENT, QUALITY_ANY, FRAME_NIGHTSHADE); + var SA = UI_count_objects(AVATAR, SHAPE_REAGENT, QUALITY_ANY, FRAME_SULFUR_ASH); + var BM = UI_count_objects(AVATAR, SHAPE_REAGENT, QUALITY_ANY, FRAME_BLOOD_MOSS); + var MR = UI_count_objects(AVATAR, SHAPE_REAGENT, QUALITY_ANY, FRAME_MANDRAKE_ROOT); + var SS = UI_count_objects(AVATAR, SHAPE_REAGENT, QUALITY_ANY, FRAME_SPIDER_SILK); + var GL = UI_count_objects(AVATAR, SHAPE_REAGENT, QUALITY_ANY, FRAME_GARLIC); + + var Avatar_Level = getExpLevel(AVATAR); + + if (event == DOUBLECLICK) + { + halt_scheduled(); + var target = UI_click_on_item(); + var target_shape = target->get_item_shape(); + var dir = direction_from(target); + item_say("@Ort Ylem@"); + + if (target_shape == SHAPE_YEW_STAFF) + { + AVATAR.say("Which spell do you want to enchant it with?"); + var spell_options = ["none"]; + + if (hasSpell(FIRE_BLAST)) + add("Fire Blast"); + + if (hasSpell(DEATH_BOLT)) + add("Death Bolt"); + + if (hasSpell(POISON)) + add("Poison"); + + if (hasSpell(LIGHTNING)) + add("Lightning"); + + converse(spell_options) + { + case "Poison": //BP, BM, NS lvl 3 + if (BP >= 10 && BM >= 10 && NS >= 10) + { + if (Avatar_Level >= 3) + { + //set yew staff to enchanted staff (change type!) + UI_set_item_shape(target, SHAPE_YEW_STAFF_POISON); + + //give it 10 charges + UI_set_item_quality(target, 10); + + //remove regs: + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_BLOOD_MOSS); + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_BLACK_PEARL); + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_NIGHTSHADE); + + script item + { nohalt; face dir; + sfx 67; actor frame reach_1h; + actor frame raise_1h; actor frame strike_1h; + } + + return; + } + else + { + AVATAR->spellFails(); + avatarBark("@I can't cast that spell yet.@"); + return; + + } + + } + else + { + AVATAR->spellFails(); + avatarBark("Requires 10 of each Poison reagent."); + return; + + } + + + case "Fire Blast": + if (BP >= 10 && SA >= 10) + { + if (Avatar_Level >= 2) + { + //set yew staff to enchanted staff (change type!) + UI_set_item_shape(target, SHAPE_YEW_STAFF_FIREBOLT); + + //give it 10 charges + UI_set_item_quality(target, 10); + + script item + { nohalt; face dir; + sfx 67; actor frame reach_1h; + actor frame raise_1h; actor frame strike_1h; + } + + //remove regs: + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_SULFUR_ASH); + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_BLACK_PEARL); + return; + } + else + { + AVATAR->spellFails(); + avatarBark("@I can't cast that spell yet.@"); + return; + + } + + } + else + { + AVATAR->spellFails(); + avatarBark("Requires 10 of each Fire Bolt reagent."); + return; + + } + + case "Death Bolt": + if (BP >= 10 && NS >= 10 && SA >= 10) + { + if (Avatar_Level >= 7) + { + //set yew staff to enchanted staff (change type!) + UI_set_item_shape(target, SHAPE_YEW_STAFF_DEATHBOLT); + + //give it 10 charges + UI_set_item_quality(target, 10); + + script item + { nohalt; face dir; + sfx 67; actor frame reach_1h; + actor frame raise_1h; actor frame strike_1h; + } + + //remove regs: + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_SULFUR_ASH); + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_NIGHTSHADE); + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_BLACK_PEARL); + return; + } + else + { + AVATAR->spellFails(); + avatarBark("@I can't cast that spell yet.@"); + return; + + } + + } + else + { + AVATAR->spellFails(); + avatarBark("Requires 10 of each Death Bolt reagent."); + return; + } + + case "Lightning": //BP, MR, SA + if (BP >= 10 && SA >= 10 && MR >=10) + { + if (Avatar_Level >= 4) + { + //set yew staff to enchanted staff (change type!) + UI_set_item_shape(target, SHAPE_YEW_STAFF_LIGHTNING); + + //give it 10 charges + UI_set_item_quality(target, 10); + + script item + { nohalt; face dir; + sfx 67; actor frame reach_1h; + actor frame raise_1h; actor frame strike_1h; + } + + //remove regs: + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_SULFUR_ASH); + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_BLACK_PEARL); + UI_remove_party_items(10, SHAPE_REAGENT, QUALITY_ANY, FRAME_MANDRAKE_ROOT); + return; + } + else + { + AVATAR->spellFails(); + avatarBark("@I can't cast that spell yet.@"); + return; + + + } + + } + else + { + AVATAR->spellFails(); + avatarBark("Requires 10 of each Lightning reagent."); + return; + } + + case "none": + return; + + } + + } + else if (inMagicStorm() && (target_shape in normal_missiles)) + { + script item + { nohalt; face dir; + sfx 67; actor frame reach_1h; + actor frame raise_1h; actor frame strike_1h;} + script target after 4 ticks + { nohalt; call spellEnchantEffect;} + } + else + { + script item + { nohalt; face dir; + actor frame reach_1h; actor frame raise_1h; + actor frame strike_1h; call spellFails; + } + } + } + + +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/Help.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/Help.uc new file mode 100755 index 0000000..920e204 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/Help.uc @@ -0,0 +1,36 @@ +void spellHelp_Override object#(0x645) () +{ + if (event == DOUBLECLICK) + { + var exp = UI_get_npc_prop(AVATAR, EXPERIENCE); + var ten_pct = exp / 10; //gets 10 percent of current exp to dock + var pos = [0x03A7, 0x0432, 0x0, 0x0]; + item_say("@Kal Lor@"); + if (inMagicStorm()) + { + + script item + { nohalt; sfx 67; + actor frame cast_up; actor frame cast_out; + actor frame ready; wait 4; + + } + PARTY->move_object(pos); + //dock avatar EXP per original? Cannot find correct amount, docking 10% instead + //UI_set_npc_prop(AVATAR, EXPERIENCE, ten_pct *-2); //DISABLED FOR NOW! (to avoid duplicate training points) + + //subtract karma instead (for now?) + subtractKarma(10); + } + else + { + script item + { nohalt; + actor frame reach_1h; actor frame raise_1h; + actor frame strike_1h; call spellFails; + } + } + + + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/Pickpocket.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/Pickpocket.uc new file mode 100755 index 0000000..b7e03e5 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/Pickpocket.uc @@ -0,0 +1,153 @@ +void spellPickpocket object#(0x669) () +{ + + var frame = UI_get_item_frame(item); + var quality = UI_get_item_quality(item); + var level = getExpLevel(AVATAR); + var BM = UI_count_objects(PARTY, SHAPE_REAGENT, QUALITY_ANY, FRAME_BLOOD_MOSS); + var NS = UI_count_objects(PARTY, SHAPE_REAGENT, QUALITY_ANY, FRAME_NIGHTSHADE); + var SS = UI_count_objects(PARTY, SHAPE_REAGENT, QUALITY_ANY, FRAME_SPIDER_SILK); + var AvatarMana = UI_get_npc_prop(AVATAR, MANA); + var stuff; + var counter = 1; + var avatar_pos = UI_get_object_position(AVATAR); + var target_contents; + var stealable_items_count = 0; + var stealable_items; + var cant_steal_items = [807, 731, 857, 856, 902, 1118, 281, 288]; + + var spots = [BG_WEAPON_HAND, BG_OFF_HAND, BG_BACKPACK, BG_CLOAK, BG_AMULET, BG_HEAD, BG_GLOVES, + BG_RIGHT_RING, BG_LEFT_RING, BG_QUIVER, BG_BELT, BG_TORSO, BG_FEET, + BG_LEGS, BG_BACK_SHIELD, BG_BACK_2H]; + + + if (event == DOUBLECLICK) + { + //check for proper level, mana, reagents + if ((level >= 5) && (BM > 0) && (NS > 0) && (SS > 0) && (AvatarMana >=5)) + { + + //remove regs and mana points + UI_remove_party_items(1, SHAPE_REAGENT, QUALITY_ANY, FRAME_BLOOD_MOSS); + UI_remove_party_items(1, SHAPE_REAGENT, QUALITY_ANY, FRAME_NIGHTSHADE); + UI_remove_party_items(1, SHAPE_REAGENT, QUALITY_ANY, FRAME_SPIDER_SILK); + UI_set_npc_prop(AVATAR, MANA, -5); + + //close all windows + UI_close_gumps(); + + //get target + var target = UI_click_on_item(); + UI_error_message("Target is " + target); + + //get array of target contents: + if (UI_is_npc(target)) + { + var dir = direction_from(target); + target_contents = UI_get_cont_items(target, SHAPE_ANY, QUALITY_ANY, FRAME_ANY); + var count = UI_count_objects(target); + + //TODO: discern between wearable items and backpack items + //array to put stealable items in - stuff in pouches, non magic stuff + + var object; + for (object in target_contents) + { + + count = count + 1; + + } + + UI_error_message("Target has " + count + " objects in their inventory"); + + //pick random item in inventory to steal: + var rand = UI_get_random(count); + + + //to avoid infinite loop, counter will go up to 20 then give Avatar random amount of stolen gold + var counter = 0; + var invalid_item = true; + + while (invalid_item && counter < 21) + { + invalid_item = false; + + //determine if item selected to steal is being worn/held + for (spot in spots) + { + UI_error_message("Spot is : " + spot); + var item_to_take = UI_get_item_shape(target_contents[rand]); + + UI_error_message("Item is : " + item_to_take); + + if (UI_is_readied(target, spot, item_to_take, FRAME_ANY)) + { + + //item found readied, re-roll + rand = UI_get_random(count); + + UI_error_message("Reroll - carrying item found in spot " + spot + " Rand is now: " + rand); + + invalid_item = true; + break; + } + + + } + counter += 1; + } + + //no items OR counter was too high + if (count < 1 || counter == 21) + { + rand = UI_get_random(50); + UI_error_message("no items or counter is over 20. Stealing gold instead. Counter is: " + counter); + giveGold(rand); + + } + else + { + //transfer item to Avatar + //UI_error_message("Counter is " + counter + " . Item stolen is: " + item_to_take + "."); + UI_set_last_created(target_contents[rand]); + UI_give_last_created(AVATAR); + } + + //steal successful, karma loss + subtractKarma(5); + + //play sprite effects + UI_obj_sprite_effect(AVATAR, 21, 0, 0, 0, 0, 0, -1); //purple + + UI_obj_sprite_effect(target, 13, 0, 0, 0, 0, 0, -1); //green + + script AVATAR + { + nohalt; face dir; + say"@Por Ylem@"; + actor frame reach_1h; actor frame raise_1h; + actor frame strike_1h; sfx 66; + + + } + + + //TODO - chance to call the guards? + + } + else //targeted something other than an npc + { + + AVATAR->spellFails(); + + } + + + } + else + UI_flash_mouse(1); + + + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/spellbook_override.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/spellbook_override.uc new file mode 100755 index 0000000..5b31d66 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/spellbook_override.uc @@ -0,0 +1,59 @@ +/* + * + * Copyright (C) 2006 The Exult Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * This header file overrides the spellbook's spells (most of them, anyway) + * to use the new versions. I preferred to do it this way for four reasons: + * (1) There is a clean algorythm by which NPC spells are cast; + * (2) It allows me to override specific spells and leave others; + * (3) I can add new NPC-only spells without removing existing spells. + * (4) It is easier to add NPC-specific spells which only one NPC + * can cast (although I haven't made any such spells yet). + * + * Presently, I haven't overriden Help (except for Multimap support), Recall + * and Armageddon -- I don't think that they are appropriate for NPCs, so I + * left them alone. I _have_ overriden Mark, but only so that is won't be + * possible to use it while inside the Shrine of the Codex. + * All other spells are overriden so that the Avatar and the NPCs play by the + * same rules. + * + * Author: Marzo Junior + * Last Modified: 2006-02-27 + */ + +//spellAwaken_Override object#(0x640) () {spellAwaken(UI_click_on_item());} +//spellWeather_Override object#(0x641) () {spellWeather();} +//spellDouse_Override object#(0x642) () {spellDouse(UI_click_on_item());} +//spellFireworks_Override object#(0x643) () {spellFireworks();} +//spellGlimmer_Override object#(0x644) () {spellGlimmer();} +spellHelp_Override object#(0x645) () +{ + if (event == DOUBLECLICK) + //If we came here from a doubleclick, forward to original: + spellHelp_Override.original(); + else if (event == SCRIPTED) + { + //We got here from a Usecode script, so we override it + //for multi-map support: + var pos = [0x03A7, 0x0432, 0x0, 0x0]; + PARTY->move_object(pos); + } +} + +extern void spellUnlockMagic_Override object#(0x667) () {spellUnlockMagic(UI_click_on_item());} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/unlock_magic.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/unlock_magic.uc new file mode 100755 index 0000000..e6edacc --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/spells/unlock_magic.uc @@ -0,0 +1,75 @@ +void spellUnlockMagic object#(0x667) () //667 //65f is SLEEP! +{ + // Regular Doors + // Same numbers as BG doors plus brass doors + const int SHAPE_DOOR_H1 = 270; + const int SHAPE_DOOR_V1 = 376; + const int SHAPE_DOOR_H2 = 432; + const int SHAPE_DOOR_V2 = 433; + + // Secret 'Wall' Doors + const int SHAPE_SECRET_WALL_V = 828; + const int SHAPE_SECRET_WALL_H = 845; + + const int SHAPE_LOCKED_CHEST = 522; + const int FRAME_MAGIC_LOCKED_CHEST_H = 2; + const int FRAME_MAGIC_LOCKED_CHEST_V = 3; + const int SHAPE_CHEST = 800; + const int FRAME_CHEST_H = 0; + const int SHAPE_MAGIC_LOCKED_CHEST = 1187; + + + + + if (event == DOUBLECLICK) + { + var target = UI_click_on_item(); + var target_shape = UI_get_item_shape(target); + var target_frame = UI_get_item_frame(target); + var dir = direction_from(target); + halt_scheduled(); + var unlockables = [SHAPE_DOOR_HORIZONTAL, SHAPE_DOOR_VERTICAL, SHAPE_DOOR2_HORIZONTAL, SHAPE_DOOR2_VERTICAL, SHAPE_LOCKED_CHEST, SHAPE_MAGIC_LOCKED_CHEST]; + item_say("@Ex Por@"); + UI_error_message("Casting unlock magic"); + if (inMagicStorm()) + { + if (target_shape == SHAPE_MAGIC_LOCKED_CHEST) + { + UI_error_message("Magic chest targeted"); + // Set to unlocked chest shape first. + UI_set_item_shape(target, SHAPE_CHEST); + + // Set the frame as well, since shape-changes don't reset the frame to 0. + UI_set_item_frame(target, FRAME_CHEST_H); + } + else + UI_error_message("target is NOT magic locked chest"); + + if (target_shape in unlockables || target_frame in unlockables) + { + + if (((target_frame + 1) % 4) == 0) + { + script item + { nohalt; face dir; + actor frame reach_1h; actor frame raise_1h; + actor frame strike_1h; sfx 66;} + + script target after 6 ticks + { nohalt; frame target_frame - 3;} + return; + } + } + + + } + else + UI_error_message("Avatar in Magic Storm"); + + script item + { nohalt; face dir; + actor frame reach_1h; actor frame raise_1h; + actor frame strike_1h; call spellFails;} + } +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/usecode.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/usecode.uc new file mode 100755 index 0000000..b257032 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/usecode.uc @@ -0,0 +1,301 @@ + + +//Tells the compiler the game type +#game "blackgate" + + +//Starts autonumbering at function number 0xC00. +//I leave function numbers in the range 0xA00 to +//0xBFF for weapon functions; this is a total of +//512 unique functions. That is likely much more +//than enough... +#autonumber 0xC00 + + + +#include "headers/u6_npcs.uc" //Ultima 6 npcs + +#include "headers/bg_externals.uc" //extern declarations for BG functions + +#include "headers/bg_externals2.uc" //extern declarations for BG functions + +#include "headers/constants.uc" //standard constant definitions + +#include "headers/constants2.uc" + +#include "headers/array_functions.uc" + +#include "headers/global_flags.uc" + + +#include "headers/shapes.uc" + +#include "headers/functions.uc" + +#include "headers/functions2.uc" + +#include "headers/services.uc" + +#include "utility/gypsy_schedules.uc" + + + + +////////Utility Functions +#include "utility/karmafunctions.uc" + +#include "utility/si_usecode_script.uc" + +#include "utility/check_can_npc_talk.uc" + +#include "utility/choose_from_menu.uc" + +#include "utility/transfer_all_items.uc" + +#include "utility/create_new_shape2.uc" //disabled, not needed? + +#include "utility/leaveParty.uc" //handles leaving party members better (putting them on correct maps) + + +//#include "utility/get_party_items.uc" + +#include "utility/make_party_face_npc.uc" + +#include "utility/NIM_DR_CAT.uc" + +#include "utility/shrine_functions.uc" + + +#include "utility/drop_all_items.uc" + +#include "utility/guardArrest.uc" + +#include "utility/deleteEggs.uc" + +#include "utility/codexWall.uc" + + + +#include "utility/openCodex.uc" +#include "utility/body_function.uc" //finds body that can be rezzed +#include "utility/callGuards.uc" //for testing + +#include "utility/deleteBarrier.uc" + +#include "utility/time_function.uc" + +//#include "utility/wearing_amulet.uc" + +#include "utility/convo_start.uc" + +#include "utility/CenterOnAvatar.uc" + +#include "utility/createShip.uc" + +#include "utility/basic_sell.uc" + +#include "utility/healer_functions.uc" + +#include "utility/npc_functions.uc" + +#include "utility/glenCremation.uc" + +//#include "utility/ringBell.uc" + +#include "utility/RentharScript.uc" + +#include "utility/randomizeBooks.uc" + +#include "utility/convertSpell.uc" + +#include "utility/magicShopkeeper.uc" + +#include "utility/u6_shopkeepers.uc" + +#include "utility/teleportCastle.uc" //used to teleport to the castle and bypass intro which is buggy + +//#include "utility/erupt_volcano.uc" -removed for now, doesn't work right + +#include "utility/canCarry.uc" + + +//MONSTERS + +#include "monsters/createGargoyle.uc" + +#include "monsters/createWingedGargoyle.uc" + +#include "monsters/createHighwayman.uc" + +#include "monsters/guards.uc" + +//////// + +#include "cutscenes/script_test.uc" //for testing + +#include "items/Ankh.uc" //for utility, merge with U6 npc file + +#include "headers/keys.uc" + +#include "utility/isEquipped.uc" + +//SPELL STUFF +#include "spells/unlock_magic.uc" //custom spell +#include "spells/Pickpocket.uc" //custom spell +#include "spells/Enchant.uc" //custom spell +#include "spells/Help.uc" //custom spell +#include "spells/ChainBolt.uc" //custom spell - replaces Create Gold DISABLED - doesn't work correctly + +/////CUTSCENES +#include "cutscenes/intro_functions.uc" //REWORKED 4/15/2024 , changed to intro.uc + +//#include "cutscenes/intro.uc" + +#include "cutscenes/gypsy_cutscene.uc" + +#include "cutscenes/freeShrines.uc" + +#include "cutscenes/crypts.uc" + +#include "cutscenes/innkeepers.uc" + +#include "cutscenes/GetValorRune.uc" + +#include "cutscenes/death_events.uc" + +#include "cutscenes/BrawlEngine.uc" + +//#include "cutscenes/Glen_Cremation.uc" + +#include "cutscenes/SendCodexToVoid.uc" + +#include "cutscenes/quenton_sidequest.uc" + +#include "cutscenes/quenton_sidequest_eggs.uc" + +#include "cutscenes/startEndgame.uc" + + +//#include "items/Ankh.uc" + + + +//#include "items/Alcohol_Functions.uc" //disabled, does not work + +#include "npcs.uc" //npc functions + +#include "items/signs.uc" + +#include "items/rubberducky.uc" + +#include "items/runes.uc" + +#include "items/CastleSchedules.uc" + +#include "items/eggs.uc" + +//#include "items/belltimer.uc" //disabled + +#include "items/scrolls.uc" + +#include "items/tombstones.uc" + +#include "items/lamp.uc" + +#include "items/yew_staff.uc" + +//#include "items/orb_of_the_moons.uc" + +#include "items/orb_of_the_moons_new.uc" //updated for U6 + +#include "items/litlamp.uc" + +#include "items/packed_balloon.uc" + +#include "items/books.uc" + +#include "items/shovel.uc" + +//#include "items/volcano.uc" + +#include "items/dagger.uc" + +#include "items/rawmeat.uc" + +#include "monsters/sheep.uc" + +#include "items/shears.uc" + +#include "items/kindling.uc" + +#include "items/balloon.uc" + +//#include "items/anchor.uc" + +#include "items/lever.uc" + +//#include "items/BlackSword.uc" //used to test 'officer sword' for another mod maybe + +#include "npcs/Misc/GenericGuard.uc" + +//#include "npcs/Misc/GenericGuard1.uc" + +#include "items/garg_signs.uc" + +//#include "headers/drunk_events.uc" //Working, but disabled for testing + +//#include "headers/AvatarDrunkEvents.uc" //not sure? + +#include "items/fishingrod.uc" + +#include "items/Shrines.uc" + +//#include "headers/PartyDrunkEvents.uc" //Disabled for now + +//#include "items/bottle.uc" //Disabled for now + +#include "items/new_balloon.uc" //used to land it + +#include "items/raft.uc" // + +#include "items/spell_scroll.uc" + +//#include "npcs/test_npc.uc" + +#include "items/AmuletOfSubmission.uc" + +#include "items/gargishbooks.uc" + +#include "items/altar_of_singularity.uc" + +#include "items/Codex.uc" + +#include "items/moonstone.uc" + +#include "items/rusty_cutlass.uc" //Drudgeworth quest item + +#include "utility/checkVortexCube.uc" + +#include "items/storm_cloak.uc" + +#include "items/endgame_eggs.uc" + +#include "items/horseflesh.uc" + +#include "items/baking.uc" //from quests and interactions mod, cleaned up and working now + +#include "items/horn.uc" // silver serpent horn in gargoyle land + +#include "items/magic_quill.uc" //utility item to randomize nearby books + +#include "items/ChaosSword.uc" // + +#include "items/book.uc" // + +#include "items/crystal_ball.uc" // + +#include "items/desk_item.uc" // rework of desk items to use parrot + +#include "items/gems.uc" + +#include "items/lion_statue.uc" diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/CenterOnAvatar.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/CenterOnAvatar.uc new file mode 100755 index 0000000..3ba7272 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/CenterOnAvatar.uc @@ -0,0 +1,4 @@ +void centerOnAvatar object# () () +{ + UI_center_view(AVATAR); +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/NIM_Dr_Cat.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/NIM_Dr_Cat.uc new file mode 100755 index 0000000..961563c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/NIM_Dr_Cat.uc @@ -0,0 +1,261 @@ + + +void Dr_CatFirst (var wager) +{ +/*In this scenario, Dr. Cat always chooses 2. +* In the original, he'd always choose 2 if you beat him +* for a bet when a flag was set and there was no way to win +* back your money. +*/ + + var avatar_beads; + var dr_cat_beads; + var remaining = 10; + var max; + + if (remaining > 3) + { + max = 3; + } + else + max = remaining; + +//Round 1 + say("@I'll play first this time.@"); //Dr Cat always takes 2 on first try + say("@I'll take 2 beads.@"); + remaining = 8; + +//Round 2 + say("@There are " + remaining + " beads left. How many do you take?@"); + avatar_beads = (UI_input_numeric_value(1, max, 1, 1)); + if (avatar_beads == 1) + dr_cat_beads = 3; + if (avatar_beads == 2) + dr_cat_beads = 2; + if (avatar_beads == 3) + dr_cat_beads = 1; + remaining = remaining - avatar_beads; + +//Round 3 + say("@I'll take " + dr_cat_beads + ".@"); //should be 4 beads left here. + remaining = remaining - dr_cat_beads; + + say("@There are " + remaining + " beads left. How many do you take?@"); + avatar_beads = (UI_input_numeric_value(1, max, 1, 1)); + remaining = remaining - avatar_beads; + + say("@I'll take " + remaining + " beads.@"); + say("@I won!@"); + say("@Don't take it too hard... I've had a lot of practice.@"); + say("@I'll put your money someplace safe, in case you want to come and win it back later.@"); + chargeGold(wager); + UI_set_item_flag(DR_CAT, SI_ZOMBIE); //set to keep playing + return; + +} + + +void DrCatRandom (var wager) +{ + +/*In the original, Dr. Cat mostly chooses 2 at first, +* but sometimes chooses something random like 1. +* In these cases he can be beaten, but we'll make it rare. +* If the Avatar wins money from Dr. Cat, a flag was set +* to where Dr. Cat would ALWAYS go first and choose 2, +* therefore making it impossible to win again. We're going for +* a bit more randomness - he'll allow you to bet the farm, but +* he won't always go first this time. +*/ + +//For NIM + var avatar_beads; + var dr_cat_beads; + var remaining = 10; + var max; + var round; //for debugging + + say("@I'll play first this time.@"); + UI_error_message("Remaining equals " + remaining + "."); + while (remaining > 0) + { + round = round + 1; + UI_error_message("Round = " + round + " Dr Cat's turn"); + + if (remaining >= 8) + dr_cat_beads = UI_get_random(3); + if (remaining == 7) + dr_cat_beads = 3; + if (remaining == 6) + dr_cat_beads = 2; + if (remaining == 5) + dr_cat_beads = 1; + if (remaining == 4) + dr_cat_beads = UI_get_random(3); + if (remaining <= 3) + dr_cat_beads = remaining; + + //Dr Cat Picks + UI_error_message("Dr Cat picks " + dr_cat_beads + ""); + say("@I'll take " + dr_cat_beads + ".@"); + remaining = remaining - dr_cat_beads; + UI_error_message("Remaining equals " + remaining + "."); + + //check for win condition for Dr. Cat + if (remaining == 0) + { + say("@I won! Don't take it too hard... I've had a lot of practice.@"); + if (wager > 0) say("@I'll put your money someplace safe, in case you want to come and win it back later.@"); + chargeGold(wager); + UI_set_item_flag(item, SI_ZOMBIE); //set to keep playing + return; + } + + //First, recalculate max beads Avatar can take + if (remaining > 3) + { + max = 3; + } + else max = remaining; + + + + //Avatar picks. While loop required to prevent Avatar from taking 0. Resets avatar beads til assigned again. + avatar_beads = 0; + while (avatar_beads == 0) + { + say("@There are " + remaining + " beads left. How many do you take?@"); + avatar_beads = (UI_input_numeric_value(0, max, 1, 1)); + } + remaining = remaining - avatar_beads; + + + //check for win condition for Avatar + if (remaining == 0) + { + say("@Well done! You got the last bead.@"); + + if (wager > 0) + { + say("He takes some money out of a pouch and pays off your wager."); + giveGold(wager); + + //If you beat him for a wager, he'll allow you to wager the farm next. + if (!UI_set_item_flag(item, PETRA)) + UI_set_item_flag(item, PETRA); // + } + + //remaining = 0; //remaining - avatar_beads; + UI_set_item_flag(item, SI_ZOMBIE); //set to keep playing + return; + } + + } + + +} + + +void AvatarFirst (var wager) //this seems to be the highest probability he'll be beaten. +{ + +/*In the original, Dr. Cat mostly chooses 2 at first, +* but sometimes chooses something random like 1. +* In these cases he can be beaten, but we'll make it rare. +* If the Avatar wins money from Dr. Cat, a flag was set +* to where Dr. Cat would ALWAYS go first and choose 2, +* therefore making it impossible to win again. We're going for +* a bit more randomness - he'll allow you to bet the farm, but +* he won't always go first this time. +*/ + + //For NIM + var avatar_beads; + var dr_cat_beads; + var remaining = 10; + var max; + var round; //for debugging + + say("@I'll let you play first this time.@"); + UI_error_message("Remaining equals " + remaining + "."); + while (remaining > 0) + { + //First, recalculate max beads Avatar can take + if (remaining > 3) + { + max = 3; + } + else + max = remaining; + + //Avatar picks. While loop required to prevent Avatar from taking 0. Resets avatar beads til assigned again. + avatar_beads = 0; + while (avatar_beads == 0) + { + say("@There are " + remaining + " beads left. How many do you take?@"); + avatar_beads = (UI_input_numeric_value(0, max, 1, 1)); + } + remaining = remaining - avatar_beads; + + + //check for win condition for Avatar + if (remaining == 0) + { + say("@Well done! You got the last bead.@"); + + if (wager > 0) + { + say("He takes some money out of a pouch and pays off your wager."); + giveGold(wager); + + //If you beat him for a wager, he'll allow you to wager the farm next. + if (!UI_set_item_flag(DR_CAT, PETRA)) + { + UI_set_item_flag(DR_CAT, PETRA); // + } + + + } + + //remaining = 0; //remaining - avatar_beads; + UI_set_item_flag(DR_CAT, SI_ZOMBIE); //set to keep playing + return; + } + + round = round + 1; + UI_error_message("Round = " + round + " Dr Cat's turn"); + if (remaining >= 8) + dr_cat_beads = UI_get_random(3); + if (remaining == 7) + dr_cat_beads = 3; + if (remaining == 6) + dr_cat_beads = 2; + if (remaining == 5) + dr_cat_beads = 1; + if (remaining == 4) + dr_cat_beads = UI_get_random(3); + if (remaining <= 3) + dr_cat_beads = remaining; + + //Dr Cat Picks + UI_error_message("Dr Cat picks " + dr_cat_beads + ""); + say("@I'll take " + dr_cat_beads + ".@"); + remaining = remaining - dr_cat_beads; + UI_error_message("Remaining equals " + remaining + "."); + + //check for win condition for Dr. Cat + if (remaining == 0) + { + say("@I won! Don't take it too hard... I've had a lot of practice.@"); + if (wager > 0) + say("@I'll put your money someplace safe, in case you want to come and win it back later.@"); + chargeGold(wager); + UI_set_item_flag(DR_CAT, SI_ZOMBIE); //set to keep playing + return; + } + + + + } + +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/RentharScript.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/RentharScript.uc new file mode 100755 index 0000000..37830ba --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/RentharScript.uc @@ -0,0 +1,111 @@ +// this file is to keep Renthar from being a permanent member in the party. If the Avatar strays too far +// Renthar will complain then leave eventually + +void RentharScript(){ + + var leftboundX = 0; + var rightboundX = 1021; + var topboundY = 0138; + var bottomboundY = 2426; + var renthar_level = UI_get_npc_id(RENTHAR); + + var AvatarLocation = UI_get_object_position(AVATAR); + + var directionToMichael = UI_find_direction(RENTHAR, MICHAEL); + var direction; + + // The Avatar is outside of the bounds and Renthar gets a little antsy + if ((AvatarLocation[X] > rightboundX) || (AvatarLocation[Y] < topboundY) || (AvatarLocation[Y] > bottomboundY)) + { + renthar_level += 1; + if (renthar_level == 1) + { + RENTHAR.say("@I do believe we are going the wrong way. Let us get back on the trail to Michael.@"); + RENTHAR.say("Renthar looks around. @I believe we should be heading " + direction + " from here. Let us keep moving.@"); + RENTHAR.hide(); + return; + } + else if (renthar_level == 2) + { + RENTHAR.say("@It would appear we are way off course Avatar. Let's not waste any more time. Michael's hideout lies to the " + direction + " .@"); + RENTHAR.hide(); + return; + } + else if (renthar_level == 3) + { + RENTHAR.say("@Avatar, 'twould seem as though you aren't in a hurry to get to Michael. If you want to dally around, I shall have to leave thee.@"); + RENTHAR.say("@We must travel " + direction + " from here. Let's make haste before he gets away!@"); + RENTHAR.hide(); + return; + } + else + { + RENTHAR.say("@It appears you aren't serious about capturing Michael. I didn't sign up to be dragged all over Britannia!@"); + RENTHAR.say("@I'm going back to Yew. If you decide you're finished wasting time, perhaps we can find Michael before he leaves.@"); + RENTHAR.hide(); + UI_clear_item_flag(RENTHAR, IN_PARTY); + gflags[RENTHAR_IN_PARTY] = false; + UI_set_schedule_type(RENTHAR, WANDER); + return; + + } + + + } + else + { + RENTHAR.say("@From here, we should travel " + direction + " to the River Maelstrom, and look for the hideout where Michael should be.@"); + RENTHAR.hide(); + return; + + } + + + //used when Renthar will tell you which direction to head + switch(directionToMichael) + { + case 0: + direction = "North"; + break; + + case 1: + direction = "Northeast"; + break; + + case 2: + direction = "East"; + break; + + case 3: + direction = "Southeast"; + break; + + case 4: + direction = "South"; + break; + + case 5: + direction = "Southwest"; + break; + + case 6: + direction = "West"; + break; + + case 7: + direction = "Northwest"; + break; + + } + + + + + + + + + } + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/balloon_handling.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/balloon_handling.uc new file mode 100755 index 0000000..c4dcc18 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/balloon_handling.uc @@ -0,0 +1,522 @@ +void balloonHandling object# () () +{ + + enum balloon_levels + { + UNPACK_BALLOON = 1, + BOARD_BALLOON = 2, + BALLOON_RISE = 3, + LAND_BALLOON = 4, + RENDER_PARTY = 5, + CHECK_VOID = 6, + PACK_BALLOON = 7 + + + }; + + + if (event == UNPACK_BALLOON) + { + UI_error_message("Event UNPACK_BALLOON called."); + if (UI_get_item_frame(item) == 0) //Balloon is freshly placed and ready to ride + { + var barge = UI_find_nearby(basket_pos, 961, 10, MASK_EGG); //hopefully find the barge before placing + + if ((UI_get_container(item) == 0)) //checks if on the ground and not in container + { + if (!UI_is_pc_inside()) //checks if no roof above + { + if (!UI_find_nearby(basket_pos, 961, 10, MASK_EGG)) //will create barge if one not found + { + UI_create_barge_object(7, 7, NORTH); + UI_update_last_created([basket_pos]); + + } + + if (UI_on_barge()) //everyone should be on barge + { + var barge = UI_find_nearby(basket_pos, 961, 10, MASK_EGG); //hopefully find the barge before placing + + UI_remove_item(barge); //removes barge to create new one at proper z level + UI_set_polymorph(AVATAR, 639); //death vortex + + //attempt to put Avatar in the middle of the barge + UI_si_path_run_usecode(AVATAR, [basket_pos[X] -1, basket_pos[Y] -1]); + + item->balloonHandling, BALLOON_RISE; + + + + }//on barge + else + { //UI_si_path_run_usecode(actor npc, int pos[], int event, object obj, function fun, bool flag) + UI_si_path_run_usecode(AVATAR, [basket_pos[X] -1, basket_pos[Y] -1], DOUBLECLICK, item, balloonbasket, false); + //AVATAR->path_run_usecode([basket_pos[X] -1, basket_pos[Y] -1], balloonbasket, item, DOUBLECLICK, false); + UI_error_message("Avatar should walk to balloon and call doubldlick"); + for (npc in party) + { + UI_error_message("Attempting to move " + npc); + + UI_si_path_run_usecode(npc, [basket_pos[X] -1, basket_pos[Y] -1], SCRIPTED, item, balloonbasket, false); + } + + + + } + + } + else randomPartyBark("@The balloon can't be used here.@"); + } + else randomPartyBark("@Place it on the ground first..@"); + + } + else //packing the balloon + { + UI_set_item_frame(item, 0); //to make sure the packed balloon renders + + var item_frame = UI_get_item_frame(item); + //var location = UI_get_object_position(item); + UI_set_item_shape(item, SHAPE_PACKED_BALLOON); //landed, packed balloon + UI_set_item_frame(item, 0); //to correct the frame + + + //UI_move_object(item, location, false); + + var item_shape = UI_get_item_shape(item); + UI_error_message("Balloon should be packed. Item frame is " + item_frame + " and item shape is now: " + item_shape); + } + } + + + if (event == BOARD_BALLOON) + { + UI_error_message("Event BOARD_BALLOON called."); + var barge = get_barge(); + var party = UI_get_party_list(); + var balloon = UI_find_nearest(AVATAR, SHAPE_BALLOON, 31); // + var quality = UI_get_item_quality(item); + var basket_pos = UI_get_object_position(item); + + + if (UI_get_item_frame(item) == 0) //Balloon is freshly placed and ready to ride + { + var barge = UI_find_nearby(basket_pos, 961, 10, MASK_EGG); //hopefully find the barge before placing + + if ((UI_get_container(item) == 0)) //checks if on the ground and not in container + { + if (!UI_is_pc_inside()) //checks if no roof above + { + if (!UI_find_nearby(basket_pos, 961, 10, MASK_EGG)) //will create barge if one not found + { + UI_create_barge_object(7, 7, NORTH); + UI_update_last_created([basket_pos]); + + } + + if (UI_on_barge()) //everyone should be on barge + { + var barge = UI_find_nearby(basket_pos, 961, 10, MASK_EGG); //hopefully find the barge before placing + + UI_remove_item(barge); //removes barge to create new one at proper z level + UI_set_polymorph(AVATAR, 639); //death vortex + + //attempt to put Avatar in the middle of the barge + UI_si_path_run_usecode(AVATAR, [basket_pos[X] -1, basket_pos[Y] -1]); + + + + + + + }//on barge + + + } + + if (event == BALLOON_RISE) + { + UI_error_message("Event BALLOON_RISE called."); + script item + { + repeat 9 + { + rise; //should lift item on z level 8 + //add sfx + //sfx + }; + + wait 3; + call AddBarge; + + } + + + + script AVATAR + { + repeat 9 + { + rise; //should lift item on z level 9 + }; + + + + + } + + for (npc in party) + { + script npc + { + repeat 9 + { + rise; //should lift item on z level 9 + }; + + } + + UI_set_item_flag(npc, DONT_RENDER); + UI_clear_item_flag(AVATAR, DONT_RENDER); + + + } + //carpet theme + UI_play_music(25); + + call balloonHandling, CHECK_VOID; + + + + } + + if (event == CHECK_VOID) + { + var warningLevel = UI_get_npc_id(BALLOON_DOG); + //var balloon = UI_find_nearby_avatar(SHAPE_BALLOON); + var balloon = UI_find_object(FIND_ON_SCREEN, SHAPE_BALLOON, QUALITY_ANY, FRAME_ANY); + + if (balloon) + UI_error_message("Balloon found."); + else + UI_error_message("Balloon NOT found."); + //get current position and map + var current_pos = UI_get_object_position(AVATAR); + var currentX = current_pos[X]; + var currentY = current_pos[Y]; + var top_left = [0923, 0678, 0]; + var bottom_right = [2230, 2099, 0]; + var current_map = UI_get_map_num(AVATAR); + + + if (warningLevel > 2) //have been warned several times already to go back to land + { + randomPartyBark("@The balloon is falling into the void!!@"); + // script AVATAR after 10 ticks + // { + // call balloonSinking; //falling into the void + // + // } + + + } + + //if map is not 3, do nothing + if (current_map == 3) + { + if (currentX > top_left[X] && currentX < bottom_right[X] && currentY > top_left[Y] && currentY < bottom_right[Y]) //in bounds, do nothing + UI_error_message("Balloon is in bounds of the gargoyle world"); + else + { + //balloon is out of bounds, give warning + UI_error_message("Balloon OUT of bounds of the gargoyle world - warning level " + warningLevel); + + //set ID level for balloon dog (holder for warning level) + UI_set_npc_id(BALLOON_DOG, warningLevel + 1); + + //give party warning + randomPartySay("@We should probably turn back, it feels like the balloon is getting sucked into the void!@"); + + + + } + + script AVATAR after 30 ticks + { + call balloonHandling, CHECK_VOID; + } + } + + if (gflags[BALLOON_IS_LANDED]) + { + UI_error_message("Balloon is landed, call off the script"); + UI_halt_scheduled(balloon); + UI_set_npc_id(BALLOON_DOG, 0); // reset warning level + } + + + + + + } + + + + + + + +} + + + + + + + +//packed balloon +void balloonbasket shape#(1201) () +{ + + var barge = get_barge(); + var party = UI_get_party_list(); + var balloon = UI_find_nearest(AVATAR, SHAPE_BALLOON, 31); // + var quality = UI_get_item_quality(item); + var basket_pos = UI_get_object_position(item); + + if (event == DOUBLECLICK) + { + UI_error_message("Balloon event called from Doubleclick from new_balloon.uc"); + item->balloonHandling(); + + + } + + + + + + + if (UI_get_item_frame(item) == 0) //Balloon is freshly placed and ready to ride + { + var barge = UI_find_nearby(basket_pos, 961, 10, MASK_EGG); //hopefully find the barge before placing + + if ((UI_get_container(item) == 0)) //checks if on the ground and not in container + { + if (!UI_is_pc_inside()) //checks if no roof above + { + if (!UI_find_nearby(basket_pos, 961, 10, MASK_EGG)) //will create barge if one not found + { + UI_create_barge_object(7, 7, NORTH); + UI_update_last_created([basket_pos]); + + } + + if (UI_on_barge()) //everyone should be on barge + { + var barge = UI_find_nearby(basket_pos, 961, 10, MASK_EGG); //hopefully find the barge before placing + + UI_remove_item(barge); //removes barge to create new one at proper z level + UI_set_polymorph(AVATAR, 639); //death vortex + + //attempt to put Avatar in the middle of the barge + UI_si_path_run_usecode(AVATAR, [basket_pos[X] -1, basket_pos[Y] -1]); + + //call check void function to test how far in void Avatar is + AVATAR->checkVoid(); + + + script item + { + repeat 9 + { + rise; //should lift item on z level 8 + //add sfx + //sfx + }; + + wait 3; + call AddBarge; + + } + + + + script AVATAR + { + repeat 9 + { + rise; //should lift item on z level 9 + }; + + + + + } + + for (npc in party) + { + script npc + { + repeat 9 + { + rise; //should lift item on z level 9 + }; + + } + + UI_set_item_flag(npc, DONT_RENDER); + UI_clear_item_flag(AVATAR, DONT_RENDER); + + + } + //carpet theme + UI_play_music(25); + + + + + }//on barge + else + { //UI_si_path_run_usecode(actor npc, int pos[], int event, object obj, function fun, bool flag) + UI_si_path_run_usecode(AVATAR, [basket_pos[X] -1, basket_pos[Y] -1], DOUBLECLICK, item, balloonbasket, false); + //AVATAR->path_run_usecode([basket_pos[X] -1, basket_pos[Y] -1], balloonbasket, item, DOUBLECLICK, false); + UI_error_message("Avatar should walk to balloon and call doubldlick"); + for (npc in party) + { + UI_error_message("Attempting to move " + npc); + + UI_si_path_run_usecode(npc, [basket_pos[X] -1, basket_pos[Y] -1], SCRIPTED, item, balloonbasket, false); + } + + + + } + + } + else randomPartyBark("@The balloon can't be used here.@"); + } + else randomPartyBark("@Place it on the ground first..@"); + + } + else //packing the balloon + { + UI_set_item_frame(item, 0); //to make sure the packed balloon renders + + var item_frame = UI_get_item_frame(item); + //var location = UI_get_object_position(item); + UI_set_item_shape(item, SHAPE_PACKED_BALLOON); //landed, packed balloon + UI_set_item_frame(item, 0); //to correct the frame + + + //UI_move_object(item, location, false); + + var item_shape = UI_get_item_shape(item); + UI_error_message("Balloon should be packed. Item frame is " + item_frame + " and item shape is now: " + item_shape); + } + } + else + return; + + if (event == SCRIPTED) + { + UI_error_message("Balloon event called from Scripted from new_balloon.uc"); + if (UI_on_barge()) //should wait til everyone is on barge before running the script + { + + script item + { + repeat 9 + { + rise; //should lift item on z level 8 + //add sfx + //sfx + }; + + wait 3; + call AddBarge; + + } + + script AVATAR + { + repeat 9 + { + rise; //should lift item on z level 9 + }; + + + + } + + for (npc in party) + { + script npc + { + repeat 9 + { + rise; //should lift item on z level 9 + }; + + } + + UI_set_item_flag(npc, DONT_RENDER); + UI_clear_item_flag(AVATAR, DONT_RENDER); + UI_set_polymorph(AVATAR, 639); //death vortex + + } + + //carpet theme + UI_play_music(25); + UI_error_message("Scripted event called on balloon"); + } + } + +} + + +void packed_balloon shape#(1232) () +{ + + + var barge = get_barge(); + var party = UI_get_party_list(); + var newballoon = UI_find_nearest(AVATAR, SHAPE_NEW_BALLOON, 31); // + var quality = UI_get_item_quality(item); + var basket_pos = UI_get_object_position(item); + + if ((event == DOUBLECLICK) && (get_distance(AVATAR) < 6)) + { + + if ((UI_get_container(item) == 0)) //checks if on the ground and not in container + { + if (!UI_is_pc_inside(item)) //checks if no roof above + { + UI_set_item_shape(item, SHAPE_BALLOON); + UI_set_item_frame(item, 0); + //play SFX ? + UI_play_sound_effect(88); + //add animations - Avatar bowing + + UI_error_message("Packed balloon clicked"); + + script item + { + call balloonHandling, UNPACK_BALLOON; + + } + + } + else randomPartyBark("@The balloon can't be used here.@"); + } + else randomPartyBark("@Place it on the ground first..@"); + + + } + else randomPartyBark("@Get a little closer to it..@"); + + +} + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/basic_sell.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/basic_sell.uc new file mode 100755 index 0000000..d399c14 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/basic_sell.uc @@ -0,0 +1,70 @@ + + + +void basicSell(var npc, var shape, var quantity, var quality, var frame, var price, var cant_hold, var cant_afford, var success, var askIfInterested, var saidNo) +{ + say(askIfInterested); + if (askYesNo()) + { + if (hasGold(price * quantity)) + { + if (UI_add_party_items(quantity, shape, quality, frame, true)) + { + chargeGold(price * quantity); + say(success); + //For special case npcs who give a freebie: + if (npc == CULLEN) + UI_add_party_items(1, shape, quality, frame, true); + + } + else say(cant_hold); + } + else + say(cant_afford); + } + else + say(saidNo); +} + +//Used if the player will get a discount or credit based on who they are or karma (ex: Gwenneth giving a free credit) +void basicSellGwenneth(var npc, var shape, var quantity, var quality, var frame, var price, var cant_hold, var cant_afford, var success, var askIfInterested, var saidNo) +{ + var player_name = getAvatarName(); + say(askIfInterested); + if (askYesNo()) + { + if (hasGold(price * quantity)) + { + if (UI_add_party_items(quantity, shape, quality, frame, true)) + { + chargeGold(price * quantity); + say(success); + //For special case npcs who give a freebie: + if (npc == CULLEN) + UI_add_party_items(1, shape, quality, frame, true); + + } + else say(cant_hold); + } + else if(isNearby(IOLO)) + { + //Haven't gotten a freebie yet + if (!UI_get_item_flag(GWENNETH, SI_ZOMBIE)) + { + say("@Thou hast not enough gold, " + player_name + ".@"); + say("She winks at Iolo. @But I think I can trust thee with credit, just this once!@"); + //chargeGold(0); + UI_add_party_items(1, shape, quality, frame, true); + + //set Gwenneth's flag to prevent more freebies + UI_set_item_flag(npc, SI_ZOMBIE); + } + else say("@I'm sorry, " + player_name + ", but I cannot offer more credit, even to thee. The gargoyle wars make my wares much in demand!@"); + + } + else say(cant_afford); + } + else + say(saidNo); +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/body_function.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/body_function.uc new file mode 100755 index 0000000..01d41d9 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/body_function.uc @@ -0,0 +1,315 @@ +//Get a count of bodies in the party's inventory +var getBodyCount(var container) +{ + const int SHAPE_BODY1 = 400; + const int SHAPE_BODY2 = 414; + var body_frames2 = [24, 25]; //frames to exclude + const int SHAPE_BODY3 = 762; + const int SHAPE_BODY4 = 892; //need to limit by frames + var body_frames4 = [1, 2, 3, 4, 5, 6, 7, 10, 11, 29]; //frames to exclude + const int SHAPE_BODY5 = 1140; + + var bodycount = 0; + var bodyframe; + var bodyshape; + var bodies; + var body; + + var body1 = UI_count_objects(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY); + var body2count = UI_count_objects(PARTY, SHAPE_BODY2, QUALITY_ANY, FRAME_ANY); + if (body2count) + { + for (body in body2count with index to max) + { + bodyshape = UI_get_item_shape(body); + bodyframe = UI_get_item_frame(bodyshape); + UI_error_message("Body 2 shape found is, " + bodyshape); + UI_error_message("Body 2 frame found is, " + bodyframe); + + if (!bodyframe in body_frames2) + bodycount += 1; + + } + } + + + + var body3 = UI_count_objects(PARTY, SHAPE_BODY3, QUALITY_ANY, FRAME_ANY); + var body4 = UI_count_objects(PARTY, SHAPE_BODY4, QUALITY_ANY, FRAME_ANY); + + bodycount = (body1 + body2count + body3 + body4); + UI_error_message("Bodies in body 1 found are: , " + body1); + UI_error_message("Bodies in body 2 found are: , " + body2count); + UI_error_message("Bodies in body 3 found are: , " + body3); + UI_error_message("Bodies in body 4 found are: , " + body4); + + UI_error_message("Total bodies found are: , " + bodies); + + return bodycount; + +} + + +//function to find a body that glen can cremate +var findBodyCont(var container) +{ + var body; + const int SHAPE_BODY1 = 400; + const int SHAPE_BODY2 = 414; + var body_frames2 = [24, 25]; //frames to exclude + const int SHAPE_BODY3 = 762; + const int SHAPE_BODY4 = 892; //need to limit by frames + var body_frames4 = [1, 2, 3, 4, 5, 6, 7, 10, 11, 29]; //frames to exclude + const int SHAPE_BODY5 = 1140; + + if (UI_find_object(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY) > 0) + { + body = UI_find_object(PARTY, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY); + return body; + } + + else if (UI_find_object(PARTY, SHAPE_BODY2, QUALITY_ANY, FRAME_ANY) > 0) + { + body = UI_find_object(PARTY, SHAPE_BODY2, QUALITY_ANY, FRAME_ANY); + return body; + } + + else if (UI_find_object(PARTY, SHAPE_BODY3, QUALITY_ANY, FRAME_ANY) > 0) + { + body = UI_find_object(PARTY, SHAPE_BODY3, QUALITY_ANY, FRAME_ANY); + return body; + } + + else if (UI_find_object(PARTY, SHAPE_BODY4, QUALITY_ANY, FRAME_ANY) > 0) + { + body = UI_find_object(PARTY, SHAPE_BODY4, QUALITY_ANY, FRAME_ANY); + return body; + } + + else if (UI_find_object(PARTY, SHAPE_BODY5, QUALITY_ANY, FRAME_ANY) > 0) + { + body = UI_find_object(PARTY, SHAPE_BODY5, QUALITY_ANY, FRAME_ANY); + return body; + } + else return body; //There SHOULD be a body returned! + UI_error_message("Body returned is: " + body); +} + + + +var getBody(var container) +{ + const int SHAPE_BODY1 = 400; + const int SHAPE_BODY2 = 414; + const int SHAPE_BODY3 = 762; + const int SHAPE_BODY4 = 892; + const int SHAPE_BODY5 = 1140; + + var body; + var npc_body; + + var body1 = UI_get_cont_items(container, SHAPE_BODY1, QUALITY_ANY, FRAME_ANY); + var body2 = UI_get_cont_items(container, SHAPE_BODY2, QUALITY_ANY, FRAME_ANY); + var body3 = UI_get_cont_items(container, SHAPE_BODY3, QUALITY_ANY, FRAME_ANY); + var body4 = UI_get_cont_items(container, SHAPE_BODY4, QUALITY_ANY, FRAME_ANY); + var body5 = UI_get_cont_items(container, SHAPE_BODY5, QUALITY_ANY, FRAME_ANY); + + for (body in body1) + { + UI_error_message("Body 1 found"); + if (UI_get_body_npc(body)) + { + UI_error_message("Body 1 assigned to npc_body"); + npc_body = body; + + } + return npc_body; + + } + + for (body in body2) + { + UI_error_message("Body 2 found"); + if (UI_get_body_npc(body)) + { + UI_error_message("Body 2 assigned to npc_body"); + npc_body = body; + + } + return npc_body; + + } + + for (body in body3) + { + UI_error_message("Body 3 found"); + if (UI_get_body_npc(body)) + { + UI_error_message("Body 3 assigned to npc_body"); + npc_body = body; + + } + return npc_body; + } + + for (body in body4) + { + UI_error_message("Body 4 found"); + if (UI_get_body_npc(body)) + { + UI_error_message("Body 4 assigned to npc_body"); + npc_body = body; + + } + return npc_body; + } + + for (body in body5) + { + UI_error_message("Body 5 found"); + if (UI_get_body_npc(body)) + { + UI_error_message("Body 5 assigned to npc_body"); + npc_body = body; + + } + return npc_body; + } + + + UI_error_message("npc_body is: " + npc_body); + return npc_body; +} + + +//This function will find viable npc bodies on the ground 15 tiles away from the healer +//or npc passed in the function + +var findBody(var npc) //use healer to search by +{ + const int SHAPE_BODY1 = 400; + const int SHAPE_BODY2 = 414; + const int SHAPE_BODY3 = 762; + const int SHAPE_BODY4 = 892; + const int SHAPE_BODY5 = 1140; + + var body; + var npc_body; + + var body1 = UI_find_nearby(npc, SHAPE_BODY1, 15, MASK_NONE); + var body2 = UI_find_nearby(npc, SHAPE_BODY2, 15, MASK_NONE); + var body3 = UI_find_nearby(npc, SHAPE_BODY3, 15, MASK_NONE); + var body4 = UI_find_nearby(npc, SHAPE_BODY4, 15, MASK_NONE); + var body5 = UI_find_nearby(npc, SHAPE_BODY5, 15, MASK_NONE); + + for (body in body1) + { + UI_error_message("Body 1 found"); + if (UI_get_body_npc(body)) + { + UI_error_message("Body 1 assigned to npc_body"); + npc_body = body; + + } + + + } + + for (body in body2) + { + UI_error_message("Body 2 found"); + if (UI_get_body_npc(body)) + { + UI_error_message("Body 2 assigned to npc_body"); + npc_body = body; + + } + + + } + + for (body in body3) + { + UI_error_message("Body 3 found"); + if (UI_get_body_npc(body)) + { + UI_error_message("Body 3 assigned to npc_body"); + npc_body = body; + + } + + } + + for (body in body4) + { + UI_error_message("Body 4 found"); + if (UI_get_body_npc(body)) + { + UI_error_message("Body 4 assigned to npc_body"); + npc_body = body; + + } + + } + + for (body in body5) + { + UI_error_message("Body 5 found"); + if (UI_get_body_npc(body)) + { + UI_error_message("Body 5 assigned to npc_body"); + npc_body = body; + + } + + } + + + UI_error_message("npc_body is: " + npc_body); + return npc_body; +} + + +//this will find a viable body within 5 tiles near the passed location, used for Glen's cremation +var findBodyL(var x, var y, var z) //search by location +{ + const int SHAPE_BODY1 = 400; + const int SHAPE_BODY2 = 414; + const int SHAPE_BODY3 = 762; + const int SHAPE_BODY4 = 892; + const int SHAPE_BODY5 = 1140; + + var body; + var npc_body; + + var body1 = UI_find_nearby([x, y, z], SHAPE_BODY1, 5, MASK_NONE); + var body2 = UI_find_nearby([x, y, z], SHAPE_BODY2, 5, MASK_NONE); +// var body3 = UI_get_array_size([UI_find_nearby([0375, 0599, 0], SHAPE_BODY3, 5, MASK_NONE)]); + var body3 = UI_find_object([x, y, z], SHAPE_BODY3, QUALITY_ANY, FRAME_ANY); + var body4 = UI_find_nearby([x, y, z], SHAPE_BODY4, 5, MASK_NONE); + var body5 = UI_find_nearby([x, y, z], SHAPE_BODY5, 5, MASK_NONE); + + if (body1) + return body1; + else if (body2) + return body2; + + else if (body3) + return body3; + + else if (body4) + return body4; + + else if (body5) + return body5; + + else + UI_error_message("No bodies found"); + UI_error_message("npc_body is: " + npc_body); + +} + + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/callGuards.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/callGuards.uc new file mode 100755 index 0000000..a6bb3cd --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/callGuards.uc @@ -0,0 +1,8 @@ +void callGuards object#(0x7A)() +{ + + + randomPartySay("@No more guards?@"); + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/canCarry.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/canCarry.uc new file mode 100755 index 0000000..9aabeeb --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/canCarry.uc @@ -0,0 +1,18 @@ +//works but not as intended.. +var canCarry (var amount, var shape, var frame) +{ + if (UI_add_party_items(amount, shape, QUALITY_ANY, frame, true)) + { + UI_error_message("Can carry is true"); + return true; + + + } + else + { + UI_error_message("Can carry is false"); + return false; + + } +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/checkVortexCube.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/checkVortexCube.uc new file mode 100755 index 0000000..213c1eb --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/checkVortexCube.uc @@ -0,0 +1,70 @@ +//checks to see if all 8 moonstones are inside of the Vortex Cube for endgame + + + var isCubeFull() + { + UI_error_message("is CubeFull function called"); + var vortexcube = UI_find_object(FIND_ON_SCREEN, SHAPE_VORTEX_CUBE, QUALITY_ANY, FRAME_ANY); + + //check for each stone, set a flag + if (UI_get_cont_items(vortexcube, SHAPE_MOONSTONE, QUALITY_ANY, 0)){ + gflags[MOONSTONE1] = true; + UI_error_message("Moonstone 1 found in cube."); + } + if (UI_get_cont_items(vortexcube, SHAPE_MOONSTONE, QUALITY_ANY, 1)){ + gflags[MOONSTONE2] = true; + UI_error_message("Moonstone 2 found in cube."); + } + + + if (UI_get_cont_items(vortexcube, SHAPE_MOONSTONE, QUALITY_ANY, 2)){ + gflags[MOONSTONE3] = true; + UI_error_message("Moonstone 3 found in cube."); + } + + + if (UI_get_cont_items(vortexcube, SHAPE_MOONSTONE, QUALITY_ANY, 3)){ + gflags[MOONSTONE4] = true; + UI_error_message("Moonstone 4 found in cube."); + } + if (UI_get_cont_items(vortexcube, SHAPE_MOONSTONE, QUALITY_ANY, 4)){ + gflags[MOONSTONE5] = true; + UI_error_message("Moonstone 5 found in cube."); + } + + if (UI_get_cont_items(vortexcube, SHAPE_MOONSTONE, QUALITY_ANY, 5)){ + gflags[MOONSTONE6] = true; + UI_error_message("Moonstone 6 found in cube."); + } + if (UI_get_cont_items(vortexcube, SHAPE_MOONSTONE, QUALITY_ANY, 6)){ + gflags[MOONSTONE7] = true; + UI_error_message("Moonstone 7 found in cube."); + } + + if (UI_get_cont_items(vortexcube, SHAPE_MOONSTONE, QUALITY_ANY, 7)){ + gflags[MOONSTONE8] = true; + UI_error_message("Moonstone 8 found in cube."); + } + + // Check each flag, if its set true on all of them, all stones are there and returns true, otherwise returns false + if (!gflags[VORTEX_CUBE_FULL]) + { + if (gflags[MOONSTONE1] && gflags[MOONSTONE2] && gflags[MOONSTONE3] && gflags[MOONSTONE4] && gflags[MOONSTONE5] && gflags[MOONSTONE6] && gflags[MOONSTONE7] && gflags[MOONSTONE8]) + { + gflags[VORTEX_CUBE_FULL] = true; + return true; + } + else + { + + return false; + + } + + } + else + return true; + + + } + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/check_can_npc_talk.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/check_can_npc_talk.uc new file mode 100755 index 0000000..40b4051 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/check_can_npc_talk.uc @@ -0,0 +1,15 @@ + + +var npcCanTalk 0x983 (var npc) +{ + if ((UI_get_npc_prop(npc, INTELLIGENCE) >= 10) && + ((!UI_get_item_flag(npc, ASLEEP)) && + ((!UI_get_item_flag(npc, PARALYZED)) && + ((!UI_get_item_flag(npc, DEAD)) && + ((UI_get_npc_prop(npc, CURSED) > 0) && + UI_is_npc(npc)))))) + return true; + + else + return false; +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/choose_from_menu.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/choose_from_menu.uc new file mode 100755 index 0000000..f9cc7f6 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/choose_from_menu.uc @@ -0,0 +1,23 @@ + + +var chooseFromMenu 0x956 (var choices) +{ + var selection; + + UI_push_answers(); + add(choices); + selection = UI_select_from_menu(); + UI_pop_answers(); + return selection; +} + +//var chooseFromMenu2 0x957 (var choices) +//{ +// var selection; + + //UI_push_answers(); +// add(choices); +// selection = UI_select_from_menu2(); +// UI_pop_answers(); +// return selection; +//} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/codexWall.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/codexWall.uc new file mode 100755 index 0000000..ced8867 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/codexWall.uc @@ -0,0 +1,29 @@ +void codexWall() +{ + var codex_wall = UI_find_object(FIND_ON_SCREEN, 1246, QUALITY_ANY, FRAME_ANY); //find codex wall + var frame = UI_get_item_frame(1246); + + script codex_wall after 3 ticks + { + + next frame; wait 5; //1 + next frame; wait 5; //2 + next frame; wait 5; //3 + next frame; wait 5; //4 + next frame; wait 5; //5 + next frame; wait 5; //6 + next frame; wait 5; //7 + next frame; wait 5; //8 + next frame; wait 5; //9 + next frame; wait 5; //10 + + repeat 999 + { + next frame; wait 2; + next frame; wait 2; + next frame; wait 2; + frame 10; wait 5; + }; + }; + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/convertSpell.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/convertSpell.uc new file mode 100755 index 0000000..99f83e2 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/convertSpell.uc @@ -0,0 +1,312 @@ + +//takes spell name, converts it to actual spell variables +var convertSpell(var spellname) +{ + var spell; + switch(spellname) + { + //Linear + case "Awaken": + spell = AWAKEN; + break; + + case "Weather": + spell = WEATHER; + break; + + case "Douse": + spell = DOUSE; + break; + + case "Fireworks": + spell = FIREWORKS; + break; + + case "Glimmer": + spell = GLIMMER; + break; + + case "Help": + spell = HELP; + break; + + case "Ignite": + spell = IGNITE; + break; + + case "Thunder": + spell = THUNDER; + break; + + + //First circle + case "Create Food": + spell = CREATE_FOOD; + break; + + case "Cure": + spell = CURE; + break; + + case "Detect Trap": + spell = DETECT_TRAP; + break; + + case "Great Douse": + spell = GREAT_DOUSE; + break; + + case "Great Ignite": + spell = GREAT_IGNITE; + break; + + case "Light": + spell = LIGHT; + break; + + case "Locate": + spell = LOCATE; + break; + + case "Awaken All": + spell = AWAKEN_ALL; + break; + + + //Second circle + case "Destroy Trap": + spell = DESTROY_TRAP; + break; + + case "Enchant": + spell = ENCHANT; + break; + + case "Fire Blast": + spell = FIRE_BLAST; + break; + + case "Great Light": + spell = GREAT_LIGHT; + break; + + case "Mass Cure": + spell = MASS_CURE; + break; + + case "Protection": + spell = PROTECTION_SPELL; + break; + + case "Telekinesis": + spell = TELEKINESIS; + break; + + case "Wizard Eye": + spell = WIZARD_EYE; + break; + +//Third Circle + case "Curse": + spell = 24; + break; + + case "Heal": + spell = 25; + break; + + case "Swarm": + spell = SWARM; + break; + + case "Protect All": + spell = 27; + break; + + case "Paralyze": + spell = PARALYZE; + break; + + case "Peer": + spell = PEER_SPELL; + break; + + case "Poison": + spell = POISON; + break; + + case "Sleep": + spell = SLEEP_SPELL; + break; + +//Fourth Circle + case "Conjure": + spell = CONJURE; + break; + + case "Lightning": + spell = LIGHTNING; + break; + + case "Mark": + spell = MARK; + break; + + case "Mass Curse": + spell = MASS_CURSE; + break; + + case "Recall": + spell = RECALL; + break; + + case "Reveal": + spell = REVEAL; + break; + + case "Seance": + spell = SEANCE; + break; + + case "Unlock Magic": + spell = UNLOCK_MAGIC; + break; + + +//Fifth Circle + case "Charm": + spell = CHARM; + break; + + case "Pickpocket": + spell = DANCE_SPELL; //DANCE replaced with PICKPOCKET + break; + + case "Dispel Field": + spell = DISPEL_FIELD; + break; + + case "Explosion": + spell = EXPLOSION; + break; + + case "Greater Heal": + spell = GREAT_HEAL; + break; + + case "Invisibility": + spell = INVISIBILITY; + break; + + case "Fire Field": + spell = FIRE_FIELD; + break; + + case "Mass Sleep": + spell = MASS_SLEEP; + break; + +//Sixth Circle + case "Cause Fear": + spell = CAUSE_FEAR; + break; + + case "Clone": + spell = CLONE; + break; + + case "Fire Ring": + spell = FIRE_RING; + break; + + case "Flamestrike": + spell = FLAMESTRIKE; + break; + + case "Magic Storm": + spell = MAGIC_STORM; + break; + + case "Poison Field": + spell = POISON_FIELD; + break; + + case "Sleep Field": + spell = SLEEP_FIELD; + break; + + case "Tremor": + spell = TREMOR; + break; + +//Seventh Circle + case "Create Gold": + spell = CREATE_GOLD; + break; + + case "Death Bolt": + spell = DEATH_BOLT; + break; + + case "Delayed Blast": + spell = DELAYED_BLAST; + break; + + case "Energy Field": + spell = ENERGY_FIELD; + break; + + case "Energy Mist": + spell = ENERGY_MIST; + break; + + case "Mass Charm": + spell = MASS_CHARM; + break; + + case "Mass Might": + spell = MASS_MIGHT; + break; + + case "Restoration": + spell = RESTORATION; + break; + +//Eighth Circle + case "Armageddon": + spell = ARMAGEDDON; + break; + + case "Death Vortex": + spell = DEATH_VORTEX; + break; + + case "Mass Death": + spell = MASS_DEATH; + break; + + case "Invisible All": + spell = INVISIBLE_ALL; + break; + + case "Resurrect": + spell = RESURRECT; + break; + + case "Summon": + spell = SUMMON; + break; + + case "Swordstrike": + spell = SWORDSTRIKE; + break; + + case "Time Stop": + spell = TIME_STOP; + break; + + } + + return spell; + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/convo_start.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/convo_start.uc new file mode 100755 index 0000000..9fe671a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/convo_start.uc @@ -0,0 +1,266 @@ +/* + * Copyright 2024 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + + //Used to initiate SI-style conversations + + + void playRandomSong() + { + var track; + var rand = UI_get_random(4); + + //get avatar's map + var map = UI_get_map_num(AVATAR); + + if (map == 1 || map == 2) + track = 52; //U6 dungeon + else if (map == 3) + track = 103; //gargish theme + else + { + + if (rand == 1) + track = 3; //U6 theme + else if (rand == 2) + track = 206; //Rule Britannia + else if (rand == 3) + track = 207; //U6 Forest theme + else if (rand == 4) + track = 208; //U6 stones + + } + UI_play_music(track); + + + } + + var startConvo(var npc, var av_1st_greet, var npc_1st_greet, var av_2nd_greet, var npc_2nd_greet) + { + var bark; + var met_npc = UI_get_item_flag(npc, MET); + var current_track = UI_get_music_track(); + var avatar_pos = UI_get_object_position(AVATAR); + var wait = UI_get_schedule_type(npc, WAIT); + + if (!UI_is_dest_reachable(npc, avatar_pos)) + { + UI_clear_item_flag(item, READ); //to allow greeting barks to play next time + + } + else + { + //Avatar barks + if (!met_npc) + bark = av_1st_greet; + else + bark = av_2nd_greet; + + delayedBark(AVATAR, bark, 0); + + //attempt to clear the default "Stop!" barks + UI_clear_item_say(npc); + + //if annoying combat music is played, clear it. + if (current_track == 10 || current_track == 11 || current_track == 12 || current_track == 16) + UI_play_music(255); + + + //NPC barks + if (!met_npc) + bark = npc_1st_greet; + else + bark = npc_2nd_greet; + delayedBark(npc, bark, 3); + + //if npc is in WAIT schedule, don't move them. Otherwise put them in TALK mode + if (UI_get_schedule_type(npc) != WAIT) + { + UI_set_schedule_type(npc, TALK); + UI_error_message("Npc is not in WAIT schedule, set to TALK"); + } + else + UI_error_message("Npc is in WAIT schedule, do nothing."); + UI_set_item_flag(npc, READ); //to start convo + } + } + + void sayGoodbye(var npc, var npc_goodbye, var avatar_goodbye) + { + + // Prevent circular conversation, clear flags and schedules as needed + // Also, clear TALK schedule and go back to activities if npc is not in WAIT schedule + + if (UI_get_schedule_type(npc) != WAIT) + { + UI_set_schedule_type(npc, LOITER); + + //if NPC is in party, make them get back with the Avatar instead of wandering around + if (UI_get_item_flag(npc, IN_PARTY)) + UI_set_schedule_type(npc, FOLLOW_AVATAR); + else + UI_run_schedule(npc); + } + + //clear any initial Avatar & npc barks to prevent overlapping + UI_clear_item_say(AVATAR); + UI_clear_item_say(npc); + UI_clear_item_flag(item, READ); //to allow greeting barks to play next time + UI_clear_item_flag(item, SHOP_IS_OPEN); //will re-set in shopkeeper's code if they are open. Clear it here + UI_clear_item_flag(item, IS_EATING); //will re set when the npc is in EAT AT INN or EAT schedule + + //Avatar and NPC goodbye barks + delayedBark(AVATAR, avatar_goodbye, 4); + delayedBark(npc, npc_goodbye, 12); + + //should play random song if song isn't already playing, or Brawling flag isn't set (Jhelom) + + // also will play if ambient songs are playing (track 4 - 8) + // var current_track = UI_get_music_track(); + // if (current_track == -1 || (current_track > 3 && current_track < 9) && gflags[PLAY_ORIGINAL_TRACKS] && !gflags[BRAWLING]) + // playRandomSong(); + + } + + //when you want to abruptly end a convo without saying anything + void sayGoodbye2(var npc) + { + //clear previous barks + UI_clear_item_say(npc); + + // Prevent circular conversation, clear flags and schedules as needed + // Also, clear TALK schedule and go back to activities if npc is not in WAIT schedule + + if (UI_get_schedule_type(npc) != WAIT) + { + UI_set_schedule_type(npc, LOITER); + + //if NPC is in party, make them get back with the Avatar instead of wandering around + if (UI_get_item_flag(npc, IN_PARTY)) + UI_set_schedule_type(npc, FOLLOW_AVATAR); + else + UI_run_schedule(npc); + } + + //clear any initial Avatar & npc barks to prevent overlapping + UI_clear_item_say(AVATAR); + UI_clear_item_say(npc); + UI_clear_item_flag(item, READ); //to allow greeting barks to play next time + UI_clear_item_flag(item, SHOP_IS_OPEN); //will re-set in shopkeeper's code if they are open. Clear it here + UI_clear_item_flag(item, IS_EATING); //will re set when the npc is in EAT AT INN or EAT schedule + + //should play random song if song isn't already playing, or Brawling flag isn't set (Jhelom) + // also will play if ambient songs are playing (track 4 - 8) + // var current_track = UI_get_music_track(); + // if (current_track == -1 || (current_track > 3 && current_track < 9) && gflags[PLAY_ORIGINAL_TRACKS] && !gflags[BRAWLING]) + // playRandomSong(); + + + } + + //when you want them to say something as they leave abruptly + void sayGoodbyeAbrupt(var npc, npc_goodbye) + { + // Prevent circular conversation, clear flags and schedules as needed + // Also, clear TALK schedule and go back to activities if npc is not in WAIT schedule + + if (UI_get_schedule_type(npc) != WAIT) + { + UI_set_schedule_type(npc, LOITER); + + //if NPC is in party, make them get back with the Avatar instead of wandering around + if (UI_get_item_flag(npc, IN_PARTY)) + UI_set_schedule_type(npc, FOLLOW_AVATAR); + else + UI_run_schedule(npc); + } + + //clear any initial Avatar & npc barks to prevent overlapping + UI_clear_item_say(AVATAR); + UI_clear_item_say(npc); + UI_clear_item_flag(item, READ); //to allow greeting barks to play next time + + UI_clear_item_flag(item, SHOP_IS_OPEN); //will re-set in shopkeeper's code if they are open. Clear it here + UI_clear_item_flag(item, IS_EATING); //will re set when the npc is in EAT AT INN or EAT schedule + + delayedBark(npc, npc_goodbye, 4); + + + //should play random song if song isn't already playing, or Brawling flag isn't set (Jhelom) + // also will play if ambient songs are playing (track 4 - 8) + // var current_track = UI_get_music_track(); + // if (current_track == -1 || (current_track > 3 && current_track < 9) && gflags[PLAY_ORIGINAL_TRACKS] && !gflags[BRAWLING]) + // playRandomSong(); + + } + + // when you want them to say something as they leave abruptly, but you don't want them to go back to their + // regular schedule (they fall asleep, in combat, etc.) + void sayGoodbyeAbrupt2(var npc, npc_goodbye) + { + // Prevent circular conversation, clear flags and schedules as needed + // Also, clear TALK schedule and go back to activities if npc is not in WAIT schedule + + if (UI_get_schedule_type(npc) != WAIT) + { + UI_set_schedule_type(npc, LOITER); + + //if NPC is in party, make them get back with the Avatar instead of wandering around + if (UI_get_item_flag(npc, IN_PARTY)) + UI_set_schedule_type(npc, FOLLOW_AVATAR); + + } + + //clear any initial Avatar & npc barks to prevent overlapping + UI_clear_item_say(AVATAR); + UI_clear_item_say(npc); + UI_clear_item_flag(item, READ); //to allow greeting barks to play next time + + UI_clear_item_flag(item, SHOP_IS_OPEN); //will re-set in shopkeeper's code if they are open. Clear it here + UI_clear_item_flag(item, IS_EATING); //will re set when the npc is in EAT AT INN or EAT schedule + + delayedBark(npc, npc_goodbye, 4); + + + //should play random song if song isn't already playing, or Brawling flag isn't set (Jhelom) + // also will play if ambient songs are playing (track 4 - 8) + // var current_track = UI_get_music_track(); + // if (current_track == -1 || (current_track > 3 && current_track < 9) && gflags[PLAY_ORIGINAL_TRACKS] && !gflags[BRAWLING]) + // playRandomSong(); + + } + + + + + + + +// DISABLED***function to return the NPC's schedule at a given time. Currently, the TALK schedule will override what it should be, +// so we want to pull the schedule type from the NPC's actual schedule and not what it is currently. Ex: we want the smith shop to be open +// if they are supposed to be in BLACKSMITH schedule + +//should return an integer corresponding to their schedule type +/*var getSchedule(var npc) +{ + var schedule = UI_get_schedule_type(npc); + UI_error_message("Schedule in 'getSchedule' is " + schedule); + return schedule; + + + + + +} +*/ \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/createShip.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/createShip.uc new file mode 100755 index 0000000..6e8c82f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/createShip.uc @@ -0,0 +1,107 @@ +/* Used to create a ship at the Skara Brae docks via usecode conversation cutscene with Michael. + +*/ + + + +void createShip object# (3009) () +{ + var piece; + var piece_location; + var barge; + var shape; + +//update piece location, create new piece at location, set new frame + + //floor deck & gangplanks from L to R + createNewShape2(700, 39, 0126, 1460, 0); + createNewShape2(700, 35, 0130, 1460, 0); + createNewShape2(700, 41, 0134, 1460, 0); + createNewShape2(700, 33, 0138, 1460, 0); + createNewShape2(700, 37, 0142, 1460, 0); + createNewShape2(680, 33, 0134, 1461, 0); + createNewShape2(150, 33, 0134, 1464, 0); + createNewShape2(781, 35, 0134, 1456, 1); + createNewShape2(680, 35, 0134, 1456, 0); + + // On deck items: hold, mast and sails, seats + //piece 10 - hold + createNewShape2(405, 32, 0140, 1459, 1); + + //piece 11 - mast + createNewShape2(199, 32, 0132, 1459, 1); + + //piece 12 - sails bottom + createNewShape2(251, 38, 0131, 1460, 5); + + //piece 13 -sails top + createNewShape2(251, 37, 0131, 1458, 5); + + /* + //piece 14 - 21 seats + createNewShape2(292, 3, 0129, 1457, 1); + createNewShape2(292, 3, 0126, 1457, 1); + createNewShape2(292, 3, 0134, 1457, 1); + createNewShape2(292, 3, 0137, 1457, 1); + createNewShape2(292, 3, 0129, 1460, 1); + createNewShape2(292, 3, 0130, 1460, 1); + createNewShape2(292, 3, 0137, 1460, 1); + */ + + //piece 22 - prow and rails + createNewShape2(665, 37, 0122, 1459, 3); + createNewShape2(1017, 35, 0122, 1460, 0); + createNewShape2(791, 35, 0122, 1456, 0); + createNewShape2(775, 39, 0126, 1456, 0); + createNewShape2(775, 35, 0130, 1456, 0); + + + //piece 27 - prow and rails + createNewShape2(775, 34, 0138, 1456, 0); + + //piece 28 - prow and rails + createNewShape2(775, 38, 0142, 1456, 0); + + //piece 29 - prow and rails + createNewShape2(791, 34, 0143, 1456, 0); + + + //piece 31 - prow and rails + createNewShape2(775, 34, 0138, 1456, 0); + + //piece 32 - prow and rails + createNewShape2(1017, 33, 0143, 1460, 0); + + //piece 33 - prow and rails + createNewShape2(665, 39, 0143, 1459, 3); + + //piece 34 - prow and rails + createNewShape2(791, 32, 0122, 1461, 0); + + //piece 35 - prow and rails + createNewShape2(775, 36, 0126, 1461, 0); + + //piece 36 - prow and rails + createNewShape2(775, 32, 0130, 1461, 0); + + //piece 37 - prow and rails + createNewShape2(775, 33, 0138, 1461, 0); + + //piece 38 - prow and rails + createNewShape2(775, 37, 0142, 1461, 0); + + //piece 39 - prow and rails + createNewShape2(791, 33, 0143, 1461, 0); + + //piece 40 - barge + UI_create_barge_object(22, 8, WEST); //create barge egg + UI_update_last_created([0143, 1462, 0]); //adds the barge from limbo + + gflags[MICHAEL_SHIP_BUILT] = true; +} + + + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/create_new_shape2.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/create_new_shape2.uc new file mode 100755 index 0000000..9a1e371 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/create_new_shape2.uc @@ -0,0 +1,40 @@ + +// New number specified, unused in the original code. +// Both void and var can work here, but var has the advantage of returning results. +// Assuming it works similar to the UI_create_new_object2 intrinsic, the values are: +// 1 for success, 0 for failure, opposite many other earlier (non-2) functions. +// 2017-03-15 KC changed to set_item_frame_rot to preserve rotated shapes (barrier). + +var createNewShape2 0x9CA (var shape, var frame, var pos_x, var pos_y, var pos_z) +{ + var new_shape = UI_create_new_object2(shape, [pos_x, pos_y, pos_z]); + + // Check that it was created + if (new_shape) + { + // new_shape->set_lift(pos_z); + new_shape->set_item_frame_rot(frame); + // Not sure if this is required in Exult, but common in the original game: + new_shape->clear_item_flag(TEMPORARY); + return 1; + } + else + return 0; +} + +var createNewTempShape2 0x9D5 (var shape, var frame, var pos_x, var pos_y, var pos_z) +{ + var new_shape = UI_create_new_object2(shape, [pos_x, pos_y, pos_z]); + + // Check that it was created + if (new_shape) + { + // new_shape->set_lift(pos_z); + new_shape->set_item_frame_rot(frame); + // Make this item disappear later. + new_shape->set_item_flag(TEMPORARY); + return 1; + } + else + return 0; +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/delayed_bark.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/delayed_bark.uc new file mode 100755 index 0000000..297e676 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/delayed_bark.uc @@ -0,0 +1,14 @@ + + +void delayedBark 0x97F (var npc, var bark_text, var delay) +{ + var action; + + if (UI_get_array_size(bark_text) > 1) + bark_text = bark_text[1]; + + if (npcCanTalk(npc)) + action = UI_delayed_execute_usecode_array(UI_get_npc_object(npc), [no_halt, script_bark, bark_text], delay); + + return; +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/deleteBarrier.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/deleteBarrier.uc new file mode 100755 index 0000000..2b1e1ae --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/deleteBarrier.uc @@ -0,0 +1,30 @@ +//This function is used to delete the "barrier" fields (shape 1223) via global flags and switches + + +void deleteBarrier () //used to delete barries in control shrine +{ + const int barrier = 1223; + var barrier_list = UI_find_nearby(item, barrier, 31, MASK_NONE); // + var barrier_quality = UI_get_item_quality(barrier); + + if (gflags[SWITCH_CONTROL] == true) + { + for (barrier in barrier_list) + { + if (barrier_quality == 1) + { + UI_remove_item(barrier); + } + } + } + else if (gflags[SWITCH_TOMBKINGS]) + for (barrier in barrier_list with index to max) + { + if (barrier_quality == 2) + { + UI_remove_item(barrier); + } + } + else + return; +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/deleteEggs.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/deleteEggs.uc new file mode 100755 index 0000000..6044dcb --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/deleteEggs.uc @@ -0,0 +1,12 @@ +//Used to delete nearby eggs such as gargoyle eggs + +void deleteEggs() +{ + var eggs = UI_find_nearby(AVATAR, 275, 25, MASK_EGG); + var egg; + for (egg in eggs with index to max) + { + UI_remove_item(egg); + } + +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/drop_all_items.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/drop_all_items.uc new file mode 100755 index 0000000..f58c37d --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/drop_all_items.uc @@ -0,0 +1,23 @@ +void dropAllItems (var npc, var pos) // Newly assigned number +{ + // Here, we drop only objects directly held by the character: + var spots = [BG_WEAPON_HAND, BG_OFF_HAND, BG_BACKPACK, BG_CLOAK, BG_AMULET, BG_HEAD, BG_GLOVES, + BG_RIGHT_RING, BG_LEFT_RING, BG_QUIVER, BG_BELT, BG_TORSO, BG_FEET, + BG_LEGS, BG_BACK_SHIELD, BG_BACK_2H]; + + for (spot in spots) + { + + var obj = npc->get_readied(spot); + var object_shape = UI_get_item_shape(obj); + + //if item is amulet of submission, cannot take off + if (object_shape == SHAPE_AMULET_SUBMISSION) + continue; + else + { + if (obj->set_last_created()) + UI_update_last_created(pos); + } + } +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/erupt_volcano.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/erupt_volcano.uc new file mode 100755 index 0000000..b2f30c3 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/erupt_volcano.uc @@ -0,0 +1,65 @@ + + +void causeEruption object# (0x4a5) +{ + //var egg = + var rand_tick = UI_get_random(40) + 20; + script item after rand_tick ticks + { + call eruptVolcano; + }; + return 0; + + UI_error_message("causeEruption called"); +} + +var eruptVolcano (var egg) +{ + const int SPRITE_EXPLOSION = 1; + const int SFX_ERUPT = 60; + var avatar_distance = UI_get_distance(egg, AVATAR); + + //determine if it explodes + var rand = UI_get_random(100); + UI_error_message("Volcano egg hatched: rand number is " + rand); + + if (rand < 45) + { + UI_error_message("Rand numb was " + rand + ", volcano erupts"); + var target; + + + //determine how many npcs are neaby + var targets = UI_find_nearby(egg, SHAPE_ANY, 6, MASK_NPC2); + + //exp effect + + UI_obj_sprite_effect(egg, SPRITE_EXPLOSION, 0, 0, 0 ,0, 0, -1); + + //play sound + UI_play_sound_effect(SFX_ERUPT, item); + + UI_earthquake(1); + var count = 0; + //apply damage + for (target in targets) + { + count += 1; + UI_error_message("Target " + count + ", is damaged!"); + var target_distance = UI_get_distance(egg, target); + var damage_base = (50 / target_distance); + UI_apply_damage(damage_base, 15, FIRE_DAMAGE, target); + } + + return 0; + + } + else + return 0; + + + + causeEruption(); + +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/get_party_items.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/get_party_items.uc new file mode 100755 index 0000000..f694d5f --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/get_party_items.uc @@ -0,0 +1,133 @@ +/* + * Copyright 2018 Scott Cooper + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + +/* + * The standard UI_get_cont_items command cannot be used to search the entire Party. + * This is problematic if you wish to get an array of each of a shape carried by the Party, + * using a single command. + * + * 2018-12-23 Knight Captain + + + Added getPartySellableItems 4/28/2023 - AOG + + + */ + +var getPartyItems 0x9D8 (var shape, var quality, var frame) +{ + var count; + var party; + var each_member; + var index; + var max; + var member_name; + var found; + + // Check if the party has any of the item. If not, there is no need to continue. + count = UI_count_objects(PARTY, shape, quality, frame); + if (count == 0) + { + UI_error_message("getPartyItems The Party has none of Shape ", shape, " Quality ", quality, " Frame ", frame, "."); + return 0; + } + + // Documentation does not describe a difference between versions list and list2. + party = UI_get_party_list(); + + UI_error_message("getPartyItems counted ", count, " of Shape ", shape, " Quality ", quality, " Frame ", frame, " in the Party."); + + for (each_member in party with index to max) + { + member_name = UI_get_npc_name(each_member); + count = UI_count_objects(each_member, shape, quality, frame); + if (count == 0) + { + UI_error_message("getPartyItems ", member_name, " has none."); + } + else + { + UI_error_message("getPartyItems ", member_name, " has ", count, "."); + // This check is necessary to prevent a non-existent "found" being counted by UI_get_array_size below. + if (found == 0) + found = (UI_get_cont_items(each_member, shape, quality, frame)); + else + found = (found & UI_get_cont_items(each_member, shape, quality, frame)); + } + } + + count = UI_get_array_size(found); + if (quality == -359) + quality = "ANY"; + if (frame == -359) + frame = "ANY"; + UI_error_message("getPartyItems has ", count, " of Shape ", shape, " Quality ", quality, " Frame ", frame, " in the array."); + + return found; +} + +var getPartySellableItems(var shape, var item_array) +{ + var count; + var party; + var each_member; + var index; + var max; + var member_name; + var found; + + // Check if the party has any of the item. If not, there is no need to continue. + count = UI_count_objects(PARTY, shape, quality, frame); + if (count == 0) + { + UI_error_message("getPartyItems The Party has none of Shape ", shape, " Quality ", quality, " Frame ", frame, "."); + return 0; + } + + // Documentation does not describe a difference between versions list and list2. + party = UI_get_party_list(); + + UI_error_message("getPartyItems counted ", count, " of Shape ", shape, " Quality ", quality, " Frame ", frame, " in the Party."); + + for (each_member in party with index to max) + { + member_name = UI_get_npc_name(each_member); + count = UI_count_objects(each_member, shape, quality, frame); + if (count == 0) + { + UI_error_message("getPartyItems ", member_name, " has none."); + } + else + { + UI_error_message("getPartyItems ", member_name, " has ", count, "."); + // This check is necessary to prevent a non-existent "found" being counted by UI_get_array_size below. + if (found == 0) + found = (UI_get_cont_items(each_member, shape, quality, frame)); + else + found = (found & UI_get_cont_items(each_member, shape, quality, frame)); + } + } + + count = UI_get_array_size(found); + if (quality == -359) + quality = "ANY"; + if (frame == -359) + frame = "ANY"; + UI_error_message("getPartyItems has ", count, " of Shape ", shape, " Quality ", quality, " Frame ", frame, " in the array."); + + return found; + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/glenCremation.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/glenCremation.uc new file mode 100755 index 0000000..cf73f93 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/glenCremation.uc @@ -0,0 +1,243 @@ +void glenCremation object# ()(){ + const int SHAPE_DUST = 224; + const int SHAPE_URN = 1240; + const int FRAME_CHUCKLES = 1; + var body; + UI_error_message("body shape is: " + UI_get_item_shape(body)); + enum cremation_levels + { + MOVE_BODY = 1, + ANIMATE_GLEN = 2, + GREEN_FLAME = 3, + DELETE_BODY = 4, + SWEEP_ASHES = 5, + GIVE_URN = 6, + FAILED = 7 + + }; + + if (event == MOVE_BODY) + { + + UI_error_message("glenCremation MOVE_BODY event called"); + UI_set_item_flag(AVATAR, BG_DONT_MOVE); + //find if body was holding anything and dump at Avatar's feet + var item_list = UI_get_cont_items(item, SHAPE_ANY, QUALITY_ANY, FRAME_ANY); + var AvatarLoc = UI_get_object_position(AVATAR); + var obj; + if (item_list){ + GLEN.say("@I will place the items they were holding at your feet.@"); + GLEN.hide(); + for (obj in item_list with index to max) + UI_move_object(obj, [AvatarLoc]); + } + + + UI_set_schedule_type(GLEN, WAIT); //to keep him from running around + + //make sure he's standing there at the cremator space + GLEN->move_object([375, 603]); + + + script GLEN after 13 ticks + { + nohalt; + face north; + actor frame USE; + wait 3; + call glenCremation, ANIMATE_GLEN; + + } + + + + } + + + if (event == ANIMATE_GLEN) + { + + + //move body when Glen gets there + var body = findBodyCont(PARTY); + var body_pos = [0375, 0599]; //body position in crematoriam pit + + body->move_object([body_pos]); + + UI_error_message("Item shape is event ANIMATE_GLEN: " + UI_get_item_shape(body)); + + //animate Glen + script GLEN after 25 ticks //changed from 30 + { + + nohalt; + + face north; + wait 1; + actor frame USE; + wait 3; + actor frame SWING_2H_1; + wait 3; + actor frame CAST_1; + wait 3; + actor frame CAST_2; + wait 3; + say "@Kal Corp Flam!@"; + wait 3; + actor frame SWING_3; + wait 3; + actor frame STAND; + call glenCremation, GREEN_FLAME; + + } + } + + if (event == GREEN_FLAME) + { + UI_error_message("Item shape in EVENT GREEN_FLAME is: " + UI_get_item_shape(item)); + + UI_play_sound_effect(8); + const int GREEN_FLAME = 1242; + //make green flame + var flame1 = UI_create_new_object2(GREEN_FLAME, [0375, 0598, 01]); + var flame2 = UI_create_new_object2(GREEN_FLAME, [0375, 0599, 01]); + var flame3 = UI_create_new_object2(GREEN_FLAME, [0375, 0600, 01]); + + script flame1 after 3 ticks + { + wait 50; + remove; + } + + script flame2 after 3 ticks + { + wait 51; + remove; + } + + script flame3 after 3 ticks + { + wait 49; + remove; + } + + + + script item after 55 ticks //one minute? + { + call glenCremation, DELETE_BODY; + } + + } + + if (event == DELETE_BODY) + { + //get body to cremate + var body = findBodyL(0375, 0599, 0); + + //if body is Chuckles, set a flag so it can have a certain frame ID + var body_id = UI_get_body_npc(body); + var npc_name = UI_get_npc_name(body_id); + UI_error_message("Body ID is " + body_id + " which belongs to npc: " + npc_name); + + if (body_id == -55) //should be Chuckles, if so sets global flag to true so urn ID can be set + { + gflags[CHUCKLES_CREMATED] = true; + UI_error_message("Body being cremated is Chuckles."); + } + + //get positon of body to place ashes + var body_pos = UI_get_object_position(body); + + + + //create ashes where it was + UI_create_new_object2(224, [body_pos]); + + //remove body (change to ashes) + //UI_set_item_shape(body, 224); + UI_remove_item(body); + + + + script GLEN after 3 ticks + { + call glenCremation, SWEEP_ASHES; + } + + + } + + if (event == SWEEP_ASHES) + { + script GLEN after 3 ticks + { + nohalt; + actor frame LEAN_NORTH; + wait 2; + sfx 12; + wait 1; + sfx 12; + wait 1; + sfx 12; + wait 1; + actor frame STAND; + wait 3; + face find_direction(AVATAR); + call glenCremation, GIVE_URN; + + } + + + } + + if (event == GIVE_URN) + { + var ashes = UI_find_nearby([0375, 0599, 0], SHAPE_DUST, 5, MASK_NONE); + var urn_holder; + var urn_holder_name; + + + //get rid of dust + UI_remove_item(ashes); + + //give urn to party. If body is Chuckles, special urn is given + if (gflags[CHUCKLES_CREMATED]) + { + urn_holder->get_container(UI_add_party_items(1, SHAPE_URN, QUALITY_ANY, FRAME_CHUCKLES, false)); //who urn was given to + gflags[CHUCKLES_CREMATED] = false; + } + else + urn_holder->get_container(UI_add_party_items(1, SHAPE_URN, QUALITY_ANY, FRAME_ANY, false)); //who urn was given to + //so he says the proper name + if (urn_holder == AVATAR) + urn_holder_name = getAvatarName(); + else + urn_holder_name = UI_get_npc_name(urn_holder); + UI_error_message("urn holder's name is" + urn_holder_name); + + GLEN.say("An eerie green flame engulfed the corpse, consuming it in seconds. Nothing but ashes remain. The mortician sweeps them up, puts them in an urn."); + GLEN.say("Glen hands you the urn. @Please come again if any more of your friends need my services.@"); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + UI_remove_item(body); //delete urn on ground + UI_clear_item_flag(item, BG_DONT_MOVE); + + //reset his schedule to normal TEND SHOP + UI_set_new_schedules(GLEN, 2, TEND_SHOP, [0360, 0600]); + + UI_run_schedule(GLEN); + GLEN.hide(); + + + + } + + if (event == FAILED) + { + delayedBark(GLEN, "Try again later.", 3); + UI_clear_item_flag(AVATAR, BG_DONT_MOVE); + + } + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/guardArrest.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/guardArrest.uc new file mode 100755 index 0000000..ee5a7dd --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/guardArrest.uc @@ -0,0 +1,77 @@ + +void guardArrest() +{ + var counter = 0; + var npc; + var party = UI_get_party_list(); + var loot_pos; + + + var cellpos= [0679, 0582, 0]; + // fade to black + UI_fade_palette(3, 0, false); + + UI_set_item_flag(PRIDGARM, SI_ZOMBIE); //set on Pridgarm so he'll offer the key out. + + //teleport party to the slammer + UI_move_object(PARTY, cellpos, true); + + //if the door was already open, close it and set it to locked: + var door; + var open_doors = UI_find_nearby([0679, 0579, 0], 376, 5, MASK_NONE); + + //change open door to closed, correct quality + for (door in open_doors) + { + UI_set_item_shape(door, 270); + UI_set_item_frame(door, 6); + + } + + //to add: confiscate gold to pay for fine + var partyGold = countGold(PARTY); + var confiscated_gold = partyGold / 3; + UI_error_message("Avatar arrested. Party gold is: " + partyGold + " and confiscated gold is: " + confiscated_gold); + + if (partyGold < 1) + confiscated_gold = 0; + + //take gold for fine + chargeGold(confiscated_gold); + + //karma hit + subtractKarma(10); + + + //remove goods from party + for (npc in party with index to max) + { + if (counter == 0) + loot_pos = [0688, 0585, 02]; + if (counter == 1) + loot_pos = [0691, 0585, 02]; + if (counter == 3) + loot_pos = [0688, 0587, 02]; + if (counter == 4) + loot_pos = [0699, 0585, 02]; + if (counter == 5) + loot_pos = [0702, 0585, 02]; + if (counter == 6) + loot_pos = [0688, 0585, 02]; + if (counter == 7) + loot_pos = [0699, 0587, 02]; + if (counter == 8) + loot_pos = [0702, 0587, 02]; + + dropAllItems(npc, loot_pos); + counter += 1; + + } + + script AVATAR after 30 ticks + { + call GenericUnfade; + } + + +} diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/gypsy_schedules.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/gypsy_schedules.uc new file mode 100755 index 0000000..1b2ea01 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/gypsy_schedules.uc @@ -0,0 +1,238 @@ +var gypsySchedule (var day) +{ + //used with a usecode egg placed in each location, checks for game day then converts to "day" + + /* Taynith starts in Yew on Day 1, then catches up with the Gypsies there. + * On day 5 she deviates from the main Gypsy schedule to chill with Dr. Cat + * and on day 6 she catches up with them in Britain? + * + */ + var sleep_pos; + var loiter_pos; + var tavern_pos; + + + if (day == 0) + { + + //Britain + UI_modify_schedule(TAYNITH, 0, SLEEP, [1236, 1315]); //midnight + UI_modify_schedule(TAYNITH, 2, LOITER, [1215, 1293]); //6am + UI_modify_schedule(TAYNITH, 7, EAT_AT_INN, [1199, 1262]); //9pm + + UI_modify_schedule(BLAINE, 0, SLEEP, [1224, 1325]); //midnight + UI_modify_schedule(BLAINE, 2, DANCE, [1217, 1294]); //6am + UI_modify_schedule(BLAINE, 7, EAT_AT_INN, [1214, 1263]); //9pm + + UI_modify_schedule(ZOLTAN, 0, SLEEP, [1213, 1317]); //midnight + UI_modify_schedule(ZOLTAN, 2, LOITER, [1215, 1297]); //6am + UI_modify_schedule(ZOLTAN, 7, EAT_AT_INN, [1204, 1265]); //9pm + + UI_modify_schedule(KARINA, 0, SLEEP, [1234, 1311]); //midnight + UI_modify_schedule(KARINA, 2, LOITER, [1228, 1294]); //6am + UI_modify_schedule(KARINA, 7, EAT_AT_INN, [1220, 1274]); //9pm + + UI_modify_schedule(KADOR, 0, SLEEP, [1215, 1323]); //midnight + UI_modify_schedule(KADOR, 2, LOITER, [1209, 1287]); //6am + UI_modify_schedule(KADOR, 7, TEND_SHOP, [1206, 1260]); //9pm + + //Trinsic + UI_modify_schedule(MANDRAKE, 0, SLEEP, [1280, 2471]); //midnight + UI_modify_schedule(MANDRAKE, 4, LOITER, [1237, 2256]); //noon + UI_modify_schedule(MANDRAKE, 7, EAT_AT_INN, [1237, 2256]); //9pm + + + + + } + + else if (day == 1) + { + + //Yew + UI_modify_schedule(TAYNITH, 0, SLEEP, [0782, 0513]); //midnight + UI_modify_schedule(TAYNITH, 2, LOITER, [0743, 0521]); //6am + UI_modify_schedule(TAYNITH, 7, EAT_AT_INN, [0716, 0486]); //9pm + + UI_modify_schedule(BLAINE, 0, SLEEP, [0781, 0523]); //midnight + UI_modify_schedule(BLAINE, 2, DANCE, [0743, 0518]); //6am + UI_modify_schedule(BLAINE, 7, EAT_AT_INN, [0700, 0479]); //9pm + + UI_modify_schedule(ZOLTAN, 0, SLEEP, [0793, 0523]); //midnight + UI_modify_schedule(ZOLTAN, 2, LOITER, [0745, 513]); //6am + UI_modify_schedule(ZOLTAN, 7, EAT_AT_INN, [0700, 0473]); //9pm + + UI_modify_schedule(KARINA, 0, SLEEP, [0793, 0516]); //midnight + UI_modify_schedule(KARINA, 2, LOITER, [0747, 0528]); //6am + UI_modify_schedule(KARINA, 7, EAT_AT_INN, [0715, 0488]); //9pm + + UI_modify_schedule(KADOR, 0, TEND_SHOP, [0786, 0525]); //midnight + UI_modify_schedule(KADOR, 2, LOITER, [0745, 0514]); //6am + UI_modify_schedule(KADOR, 7, LOITER, [0703, 0479]); //9pm + + //Paws + UI_modify_schedule(MANDRAKE, 0, SLEEP, [1144, 1891]); //midnight + UI_modify_schedule(MANDRAKE, 4, LOITER, [1192, 1785]); //noon + UI_modify_schedule(MANDRAKE, 7, EAT_AT_INN, [1192, 1785]); //9pm + + } + + else if (day == 2) + { + + //Yew + UI_modify_schedule(TAYNITH, 0, SLEEP, [0782, 0513]); //midnight + UI_modify_schedule(TAYNITH, 2, LOITER, [0743, 0521]); //6am + UI_modify_schedule(TAYNITH, 7, EAT_AT_INN, [0716, 0486]); //9pm + + UI_modify_schedule(BLAINE, 0, SLEEP, [0781, 0523]); //midnight + UI_modify_schedule(BLAINE, 2, DANCE, [0743, 0518]); //6am + UI_modify_schedule(BLAINE, 7, EAT_AT_INN, [0700, 0479]); //9pm + + UI_modify_schedule(ZOLTAN, 0, SLEEP, [0793, 0523]); //midnight + UI_modify_schedule(ZOLTAN, 2, LOITER, [0745, 513]); //6am + UI_modify_schedule(ZOLTAN, 7, EAT_AT_INN, [0700, 0473]); //9pm + + UI_modify_schedule(KARINA, 0, SLEEP, [0793, 0516]); //midnight + UI_modify_schedule(KARINA, 2, LOITER, [0747, 0528]); //6am + UI_modify_schedule(KARINA, 7, EAT_AT_INN, [0715, 0488]); //9pm + + UI_modify_schedule(KADOR, 0, TEND_SHOP, [0786, 0525]); //midnight + UI_modify_schedule(KADOR, 2, LOITER, [0745, 0514]); //6am + UI_modify_schedule(KADOR, 7, LOITER, [0703, 0479]); //9pm + + //Paws + UI_modify_schedule(MANDRAKE, 0, SLEEP, [1144, 1891]); //midnight + UI_modify_schedule(MANDRAKE, 4, LOITER, [1192, 1785]); //noon + UI_modify_schedule(MANDRAKE, 7, EAT_AT_INN, [1192, 1785]); //9pm + + } + + else if (day == 3) + { + //Trinsic + UI_modify_schedule(TAYNITH, 0, SLEEP, [1278, 2260]); //midnight + UI_modify_schedule(TAYNITH, 2, LOITER, [1259, 2273]); //6am + UI_modify_schedule(TAYNITH, 7, EAT_AT_INN, [1252, 2258]); //9pm + + UI_modify_schedule(BLAINE, 0, SLEEP, [1268, 2255]); //midnight + UI_modify_schedule(BLAINE, 2, DANCE, [1261, 2279]); //6am + UI_modify_schedule(BLAINE, 7, EAT_AT_INN, [1232, 2288]); //9pm + + UI_modify_schedule(ZOLTAN, 0, SLEEP, [1274, 2266]); //midnight + UI_modify_schedule(ZOLTAN, 2, LOITER, [1253, 2279]); //6am + UI_modify_schedule(ZOLTAN, 7, EAT_AT_INN, [1258, 2259]); //9pm + + UI_modify_schedule(KARINA, 0, SLEEP, [1278, 2256]); //midnight + UI_modify_schedule(KARINA, 2, LOITER, [1254, 2273]); //6am + UI_modify_schedule(KARINA, 7, EAT_AT_INN, [1241, 2256]); //9pm + + UI_modify_schedule(KADOR, 0, TEND_SHOP, [1280, 2259]); //midnight + UI_modify_schedule(KADOR, 2, LOITER, [1242, 2287]); //6am + UI_modify_schedule(KADOR, 7, LOITER, [1243, 2256]); //9pm + + //Britain + UI_modify_schedule(MANDRAKE, 0, SLEEP, [1045, 1356]); //midnight + UI_modify_schedule(MANDRAKE, 4, LOITER, [1206, 1264]); //noon + UI_modify_schedule(MANDRAKE, 7, EAT_AT_INN, [1206, 1264]); //9pm + + } + else if (day == 4) + { + + //Paws + UI_modify_schedule(TAYNITH, 0, TEND_SHOP, [1192, 1767]); //midnight when she talks to Dr Cat + UI_modify_schedule(TAYNITH, 2, LOITER, [1210, 1785]); //6am + UI_modify_schedule(TAYNITH, 7, EAT_AT_INN, [1210, 1785]); //9pm + + //Trinsic + UI_modify_schedule(BLAINE, 0, SLEEP, [1268, 2255]); //midnight + UI_modify_schedule(BLAINE, 2, DANCE, [1261, 2279]); //6am + UI_modify_schedule(BLAINE, 7, EAT_AT_INN, [1232, 2288]); //9pm + + UI_modify_schedule(ZOLTAN, 0, SLEEP, [1274, 2266]); //midnight + UI_modify_schedule(ZOLTAN, 2, LOITER, [1253, 2279]); //6am + UI_modify_schedule(ZOLTAN, 7, EAT_AT_INN, [1258, 2259]); //9pm + + UI_modify_schedule(KARINA, 0, SLEEP, [1278, 2256]); //midnight + UI_modify_schedule(KARINA, 2, LOITER, [1241, 2285]); //6am + UI_modify_schedule(KARINA, 7, EAT_AT_INN, [1241, 2256]); //9pm + + UI_modify_schedule(KADOR, 0, TEND_SHOP, [1280, 2259]); //midnight + UI_modify_schedule(KADOR, 2, LOITER, [1242, 2287]); //6am + UI_modify_schedule(KADOR, 7, LOITER, [1243, 2256]); //9pm + + //Britain + UI_modify_schedule(MANDRAKE, 0, SLEEP, [1045, 1356]); //midnight + UI_modify_schedule(MANDRAKE, 4, LOITER, [1206, 1264]); //noon + UI_modify_schedule(MANDRAKE, 7, EAT_AT_INN, [1206, 1264]); //9pm + + + } + else if (day == 5) + { + //Britain + UI_modify_schedule(BLAINE, 0, SLEEP, [1224, 1325]); //midnight + UI_modify_schedule(BLAINE, 2, DANCE, [1217, 1294]); //6am + UI_modify_schedule(BLAINE, 7, EAT_AT_INN, [1214, 1263]); //9pm + + UI_modify_schedule(ZOLTAN, 0, SLEEP, [1213, 1317]); //midnight + UI_modify_schedule(ZOLTAN, 2, LOITER, [1215, 1297]); //6am + UI_modify_schedule(ZOLTAN, 7, EAT_AT_INN, [1204, 1265]); //9pm + + UI_modify_schedule(KARINA, 0, SLEEP, [1234, 1311]); //midnight + UI_modify_schedule(KARINA, 2, LOITER, [1228, 1294]); //6am + UI_modify_schedule(KARINA, 7, EAT_AT_INN, [1220, 1274]); //9pm + + UI_modify_schedule(KADOR, 0, SLEEP, [1215, 1323]); //midnight + UI_modify_schedule(KADOR, 2, LOITER, [1209, 1287]); //6am + UI_modify_schedule(KADOR, 7, TEND_SHOP, [1206, 1260]); //9pm + + //Trinsic + UI_modify_schedule(TAYNITH, 0, SLEEP, [1278, 2260]); //midnight + UI_modify_schedule(TAYNITH, 2, LOITER, [1229, 2283]); //6am + UI_modify_schedule(TAYNITH, 7, EAT_AT_INN, [1242, 2258]); //9pm + + UI_modify_schedule(MANDRAKE, 0, SLEEP, [1280, 2471]); //midnight + UI_modify_schedule(MANDRAKE, 4, LOITER, [1240, 2256]); //6am + UI_modify_schedule(MANDRAKE, 7, EAT_AT_INN, [1221, 2256]); //9pm + + + + + } + else if (day == 6) + { + + //Britain + UI_modify_schedule(BLAINE, 0, SLEEP, [1224, 1325]); //midnight + UI_modify_schedule(BLAINE, 2, DANCE, [1217, 1294]); //6am + UI_modify_schedule(BLAINE, 7, EAT_AT_INN, [1214, 1263]); //9pm + + UI_modify_schedule(ZOLTAN, 0, SLEEP, [1213, 1317]); //midnight + UI_modify_schedule(ZOLTAN, 2, LOITER, [1215, 1297]); //6am + UI_modify_schedule(ZOLTAN, 7, EAT_AT_INN, [1204, 1265]); //9pm + + UI_modify_schedule(KARINA, 0, SLEEP, [1234, 1311]); //midnight + UI_modify_schedule(KARINA, 2, LOITER, [1228, 1294]); //6am + UI_modify_schedule(KARINA, 7, EAT_AT_INN, [1220, 1274]); //9pm + + UI_modify_schedule(KADOR, 0, SLEEP, [1215, 1323]); //midnight + UI_modify_schedule(KADOR, 2, LOITER, [1209, 1287]); //6am + UI_modify_schedule(KADOR, 7, TEND_SHOP, [1206, 1260]); //9pm + + UI_modify_schedule(TAYNITH, 0, SLEEP, [1236, 1315]); //midnight + UI_modify_schedule(TAYNITH, 2, LOITER, [1215, 1293]); //6am + UI_modify_schedule(TAYNITH, 7, EAT_AT_INN, [1199, 1262]); //9pm + + //Trinsic + UI_modify_schedule(MANDRAKE, 0, SLEEP, [1280, 2471]); //midnight + UI_modify_schedule(MANDRAKE, 4, LOITER, [1240, 2256]); //6am + UI_modify_schedule(MANDRAKE, 7, EAT_AT_INN, [1221, 2256]); //9pm + + } + + +} + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/healer_functions.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/healer_functions.uc new file mode 100755 index 0000000..6910217 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/healer_functions.uc @@ -0,0 +1,341 @@ +/* + * Copyright 2019 AgentOrangeGuy + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + * + * Healer Script + */ + + var healScript(var npc, var healer, var price) + { + var npc_num = npc->get_npc_number(); + var npc_name = npc->get_npc_name(); + var avatar = UI_get_avatar_ref(); + var max_health = npc->get_npc_prop(STRENGTH); + var current_health = npc->get_npc_prop(HEALTH); + var AvatarKarma = getKarma(); + + //healer prices + const int SASHA_HEAL_PRICE = 40; + const int SASHA_CURE_PRICE = 15; + const int SASHA_REZ_PRICE = 400; + + if (npc == AVATAR) + { + max_health = avatar->get_npc_prop(STRENGTH); + current_health = avatar->get_npc_prop(HEALTH); + UI_error_message("Avatar number is: " + npc_num); + UI_error_message("Avatar current health is: " + current_health); + } + + UI_error_message("-----------------------"); + UI_error_message("NPC number is: " + npc_num); + UI_error_message("NPC current health is: " + current_health); + + //for npc healer convos. Leave for default. + var giveprice = "@Healing is " + price + " gold. Agreeable?@"; + var success = "" + healer + " successfuly binds " + npc_name + "'s wounds."; + var cant_afford = "@I'm sorry but you cannot afford this.@"; + var declined_help = "@Come back later if thou dost need help.@"; + var not_hurt = "@You look fine to me.@"; + + //Change individual healer scripts as needed for different text + if (healer == DEZANA) + { + giveprice = "@I see thy injury, " + npc_name + ". It will cost you 30 gold, interested?"; + success = "Dezana approaches " + npc_name + " and binds their wounds."; + cant_afford = "@You must pay before I can heal you.@"; + declined_help = "@Very well.@"; + } + else if (healer == SASHA) + { + giveprice = "@I see thy injury, " + npc_name + ". Wilt thou make an offering of " + SASHA_HEAL_PRICE + " gold?"; + success = "Sasha approaches " + npc_name + " and binds their wounds."; + cant_afford = "@If thou wilt not pay, I cannot heal thee.@"; + declined_help = "@Is there aught else I can do for thee?@"; + not_hurt = "@Don't waste my time! You are not wounded! 'Tis hard enough tending to those truly sick. Begone!@"; + } + else if (healer == STEPHANIE) + { + giveprice = "@I sense thy injury, " + npc_name + ". Wilt thou make an offering of 25 gold?@"; + success = "She closes her eyes, puts a delicate hand on " + npc_name + "'s brow and chants softly. " + npc_name + " feels much better."; + cant_afford = "@I'm sorry. Without an offering I cannot heal you.@"; + declined_help = "Her blue eyes pierce you. @What else can I do for you?@"; + not_hurt = "She feels each brow and holds her ear close to your mouths. @None of you are sick!@"; + } + + else if (healer == TOBATHA) + { + giveprice = "@Aye, I see thy wound, " + npc_name + " Wilt thou make an offering of 30 gold?@"; + success = "Laying hands upon " + npc_name + ", Tobatha mends the wounds."; + cant_afford = "@Well, if thou wilt not pay, why should I heal thee?@"; + declined_help = "@Well, if thou wilt not pay, why should I heal thee?@"; + not_hurt = "@What do you mean, heal? None of you are wounded!@"; + } + + //Start of heal script. + if (npc) + { + if (current_health < max_health) + { + say(giveprice); + if (askYesNo()) + { + if (hasGold(price)) + { + say(success); + chargeGold(price); + + //First, zero out health to avoid going over or under + UI_set_npc_prop(npc, HEALTH, -current_health); + + //set health back to max + UI_set_npc_prop(npc, HEALTH, max_health); + } + else if (healer == STEPHANIE && AvatarKarma > 40) //for freebies based on karma + { + say("@I sense your hesitation is based on your empty pockets. I also sense your cause is a just one.@"); + say("She closes her eyes, puts a delicate hand on " + npc_name + "'s brow and chants softly. " + npc_name + " feels much better.@"); + + //First, zero out health to avoid going over or under + UI_set_npc_prop(npc, HEALTH, -current_health); + + //set health back to max + UI_set_npc_prop(npc, HEALTH, max_health); + + } + else if (healer == TOBATHA) + { + if (AvatarKarma >= 40) + { + say("@Thou art not too bad, for a youngster. All right, I'll heal ye.@ Laying hands upon " + npc_name + ", Tobatha mends the wounds.@"); + //First, zero out health to avoid going over or under + UI_set_npc_prop(npc, HEALTH, -current_health); + + //set health back to max + UI_set_npc_prop(npc, HEALTH, max_health); + } + else + say("@You youngsters think everything should be free!@"); + + } + else + say(cant_afford); + } + else say(declined_help); + } + else say(not_hurt); + } + else say(declined_help); +} + + var cureScript(var npc, var healer, var price) + { + var npc_num = npc->get_npc_number(); + var npc_name = npc->get_npc_name(); + + var isPoisoned = UI_get_item_flag(npc, POISONED); + + var AvatarKarma = getKarma(); + + UI_error_message("-----------------------"); + UI_error_message("NPC number is: " + npc_num); + + + //for npc healer convos. Leave for default. + var giveprice = "@To cure poison is " + price + " gold. Agreeable?@"; + var success = "" + healer + " successfuly cures " + npc_name + " of poison."; + var cant_afford = "@I'm sorry but you cannot afford this.@"; + var declined_help = "@Come back later if thou dost need help.@"; + var not_hurt = "@You don't look poisoned to me.@"; + + //Change individual healer scripts as needed for different text + if (healer == DEZANA) + { + giveprice = "@You look poisoned to me.@ She nods at " + npc_name + ". It'll cost you 10 gold, interested?"; + success = "Dezana grabs a vial and pours it down " + npc_name + "'s throat. " + npc_name + " feels much better."; + cant_afford = "@You must pay before I can cure you.@"; + declined_help = "@As you wish.@"; + not_hurt = "@Perhaps you have a hangover, 'cause you aren't poisoned.@"; + } + if (healer == SASHA) + { + giveprice = "@I sense thou art poisoned, " + npc_name + ". Wilt thou make an offering of " + 40 + " gold?"; + success = "Sasha grabs a vial and pours it down " + npc_name + "'s throat. " +npc_name + " feels much better."; + cant_afford = "@If thou wilt not pay, I cannot cure thee.@"; + declined_help = "@Is there aught else I can do for thee?@"; + var not_hurt = "@Don't waste my time! You are not poisoned! 'Tis hard enough tending to those truly sick. Begone!@"; + + } + if (healer == STEPHANIE) + { + giveprice = "@I sense thou art poisoned, " + npc_name + ". Wilt thou make an offering of " + 5 + " gold?"; + success = "@Placing " + npc_name + "'s hand over her heart, she closes her eyes and whispers something. The fever leaves " + npc_name + "'s brow."; + cant_afford = "@I cannot cure you if you won't tithe.@"; + declined_help = "Her blue eyes pierce you. @What else can I do for you?@"; + var not_hurt = "@Holding " + npc_name + "'s hand against her lips she states @You are not poisoned.@"; + + } + + if (healer == TOBATHA) + { + + giveprice = "@Aye, " + npc_name + ", I can tell that thou art poisoned. Wilt thou make an offering of 10 gold?@"; + success = "Laying hands upon " + npc_name + ", Tobatha removes the poison."; + cant_afford = "@Well if thou won't pay, thou won't get cured!@"; + declined_help = "@What else ya want?@"; + var not_hurt = "@What do you mean, cure? Thou art not poisoned!@"; + + + } + + //Start of cure script. + if (npc) + { + if (isPoisoned) + { + say(giveprice); + if (askYesNo()) + { + if (hasGold(price)) + { + say(success); + chargeGold(price); + UI_clear_item_flag(npc, POISONED); + } + else if (healer == STEPHANIE && AvatarKarma > 40) //for freebies based on karma + { + say("A tear comes to her eyes. @I should have known you would not ask unless you were in grave need.@"); + say("@Come, put your hand on my heart.@ Placing " + npc_name + "'s hand over her heart, she closes her eyes and whispers something."); + say("The fever leaves " + npc_name + "'s brow.@"); + + UI_clear_item_flag(npc, POISONED); + } + else if (healer == TOBATHA) + { + if (AvatarKarma >= 40) + { + say("@Thou art not too bad, for a youngster. All right, I'll cure ye.@ Laying hands upon " + npc_name + ", Tobatha removes the poison.@"); + UI_clear_item_flag(npc, POISONED); + } + else + say("@You youngsters think everything should be free!@"); + + } + else + say(cant_afford); + } + else say(declined_help); + } + else say(not_hurt); + } + else say(declined_help); + + + } + + var resurrectScript(var healer, var price) + { + var party = UI_get_party_list(); + var body; + var body_ground = findBody(healer); //finds bodies on the ground + var body_carrying = getBody(party); //finds bodies that are carried + + var valid_body_ground = body_ground->get_body_npc(); //ref to valid npc body on ground + var valid_body_carrying = body_carrying->get_body_npc(); //ref to valid npc body in party + var partyGold = UI_count_objects(PARTY, SHAPE_GOLD, QUALITY_ANY, FRAME_ANY); + var remainder = (price - partyGold); + +// UI_error_message("npcbody var is: " + npcbody); + + //for npc healer convos. Leave for default. + var giveprice = "@Resurrection costs 400 gold, interested?@"; + var success = "@And the dead live again!@"; + var cant_afford = "@I'm sorry but you cannot afford this.@"; + var declined_help = "@Come back later if thou dost need help.@"; + var not_hurt = "@You don't look poisoned to me.@"; + var body_nearby; + if (body_ground > 0 || body_carrying > 0) + body_nearby = "@I sense that someone has met a terrible fate. Will you make an offering of 350 gold?@"; + + //Change individual healer scripts as needed for different text + if (healer == DEZANA) + { + success = "Dezana lays hands upon the corpse...@Doman...thixus...anretu! And the dead live again!@"; + cant_afford = "@You don't have enough gold. You might think about a proper burial.@"; + declined_help = "@As you wish.@"; + not_hurt = "@I don't see a body that can be resurrected.@"; + } + + if (healer == SASHA) + { + success = "Dezana lays hands upon the corpse...@Doman...thixus...anretu! And the dead live again!@"; + cant_afford = "@You don't have enough gold. You might think about a proper burial.@"; + declined_help = "@As you wish.@"; + not_hurt = "@I don't see a body that can be resurrected.@"; + } + + if (healer == STEPHANIE) + { + success = "Stephanie lays hands upon the corpse...@Doman...thixus...anretu! And the dead live again!@"; + cant_afford = "@You haven't enough gold. I'm sorry, all I can do is grieve with you.@"; + declined_help = "@As you wish.@"; + not_hurt = "@I don't see a body that can be resurrected.@"; + } + if (healer == TOBATHA) + { + giveprice = "@Wilt thou make an offering of 400 gold?@"; + success = "Tobatha lays hands upon the corpse...@Doman...thixus...anretu! And the dead live again!@"; + cant_afford = "@That ain't enough money. Thou art " + remainder + " gold pieces short. Go see a gravedigger. I'll reckon his price'll be lower.@"; + declined_help = "@Then go see a gravedigger. I'll reckon his price'll be lower.@"; + not_hurt = "@Eh? What foolishness is this? There ain't no dead person here!@"; + } + + + + + //Start of res script. + + if (body_ground) + { + say(body_nearby); //I see a body, it will cost you X gold + say(giveprice); + if (askYesNo()) + { + if (hasGold(price)) + { + say(success); + chargeGold(price); + body = findBody(healer); + body->resurrect(); + //UI_resurrect(valid_body_ground); + + //body = body_ground[0]; + //body->resurrect(); + + //after rez, looks for another body you are carrying + body_carrying = getBody(party); //finds bodies that are carried + if (body_carrying) + say("@I see that you carry another departed friend. Place them upon the ground so they can be resurrected.@"); + } + else say(cant_afford); + } + else say(declined_help); + } + else if (body_carrying) // + { + say("@I see that you carry a departed friend. Place them upon the ground so they can be resurrected.@"); + } + else say(not_hurt); + + + } \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/isEquipped.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/isEquipped.uc new file mode 100755 index 0000000..1142d3e --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/isEquipped.uc @@ -0,0 +1,29 @@ +var isEquipped(var npc, var itemtocheck) +{ + var spot; + var equipped = false; + var spots = [BG_WEAPON_HAND, BG_OFF_HAND, BG_BACKPACK, BG_CLOAK, BG_AMULET, BG_HEAD, BG_GLOVES, + BG_RIGHT_RING, BG_LEFT_RING, BG_QUIVER, BG_BELT, BG_TORSO, BG_FEET, + BG_LEGS, BG_BACK_SHIELD, BG_BACK_2H]; + + for (spot in spots) + { + if (UI_is_readied(npc, spot, itemtocheck, FRAME_ANY)) + { + UI_error_message("Item " + itemtocheck + " is readied in " + spot + "."); + equipped = true; + + } + else + { + UI_error_message("Item " + itemtocheck + " is not readied in " + spot + "."); + + + } + + + } + return equipped; + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/karmafunctions.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/karmafunctions.uc new file mode 100755 index 0000000..288e824 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/karmafunctions.uc @@ -0,0 +1,55 @@ +//Karma system based on Avatar's npc id #. Code should add or subtract karma based +//on instances where karma is gained or lost in conversations, etc. If Karma > 100, it *should* +//stay at 100 and not go over. + +var getKarma 2260() +{ + var AvatarKarma = UI_get_npc_prop(KARMA1, EXPERIENCE); + + return AvatarKarma; +} + +void addKarma 2257(var amount) +{ + + + UI_set_npc_prop(KARMA1, EXPERIENCE, amount*2); + var currentKarma = UI_get_npc_prop(KARMA1, EXPERIENCE); + //we don't want karma rolling past 100, so clear out karma, then re-add 100 + if (currentKarma > 100) + { + UI_set_npc_prop(KARMA1, EXPERIENCE, -(currentKarma*2)); + //re-add 100 karma + UI_set_npc_prop(KARMA1, EXPERIENCE, 100*2); + } + + +} + +void resetKarma 2259() +{ + //reset karma to 75 default + var currentKarma = UI_get_npc_prop(KARMA1, EXPERIENCE); + UI_set_npc_prop(KARMA1, EXPERIENCE, -currentKarma*2); + + //re-add 75 karma + UI_set_npc_prop(KARMA1, EXPERIENCE, 75*2); + +} + +void subtractKarma 2261(var amount) +{ + var currentKarma = UI_get_npc_prop(KARMA1, EXPERIENCE); + + //check for current karma. if subtracting would make it below zero, set to 0 + if (amount > currentKarma) + { + UI_set_npc_prop(KARMA1, EXPERIENCE, -(currentKarma*2)); + + } + else + { + UI_set_npc_prop(KARMA1, EXPERIENCE, -(amount*2)); + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/leaveParty.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/leaveParty.uc new file mode 100755 index 0000000..6d35899 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/leaveParty.uc @@ -0,0 +1,102 @@ +enum party_levels +{ + MOVE_NPC = 1, + MOVE_NPC2 = 2 + +}; + + + + + +// Function to handle leaving the party, making sure they go back to correct +// map. +void moveNPC(var npc) +{ + + UI_error_message("moveNPC called on " + npc); + //Should be called if you try to make them leave on another map + if (npc == GORN) + UI_move_object(npc, [2074, 2549, 0, 1], true); //Sutek's lair + else + UI_move_object(npc, [2883, 2826, 0, 0], true); //entrance to Hythloth + UI_error_message("MOVE_NPC called for npc " + npc + ". "); + return; + + + + + + +} + +void leaveParty object#()() +{ + var map_num = UI_get_map_num(AVATAR); + UI_error_message("Map num is " + map_num); + + if (map_num == 0) + { + gflags[MAP_IS_OVERWORLD] = true; + UI_error_message("Map is on overworld, flag set"); + } + else + gflags[MAP_IS_OVERWORLD] = false; + UI_error_message("leaveParty initiated."); + + //call scripted in each party member! + + + UI_set_schedule_type(item, WANDER); + UI_remove_from_party(item); + UI_clear_item_flag(item, IN_PARTY); + + + if (event == MOVE_NPC2) + { + var npc = UI_get_npc_id(item); + var npc_name = UI_get_npc_name(item); + UI_error_message("Event MOVE_NPC2 called on " + npc_name); + //Should be called if you try to make them leave on another map + + //NPC isn't Gorn and npc is on mainland, do nothing + if (npc_name != "Gorn" && map_num == 0 && gflags[MAP_IS_OVERWORLD]) + { + gflags[MAP_IS_OVERWORLD] = false; + return; + } + else + { + script item after 150 ticks + { + call leaveParty, MOVE_NPC; + + } + UI_error_message("NPC is not Gorn or on another map."); + return; + } + } + + //NPC is either Gorn or NPC is not on map 0. + if (event == MOVE_NPC) + { + var npc = UI_get_npc_id(item); + var npc_name = UI_get_npc_name(item); + + UI_error_message("Event MOVE_NPC is called."); + if (npc_name == "Gorn") + { + UI_error_message("NPC is Gorn, moving him back to Sutek's lair"); + UI_move_object(item, [2074, 2549, 0, 1], true); //Sutek's lair + } + else + { + UI_move_object(item, [2883, 2826, 0, 0], true); //entrance to Hythloth + UI_error_message("NPC is not Gorn, moving to Hythloth entrance"); + } + + } + + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/magicShopkeeper.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/magicShopkeeper.uc new file mode 100755 index 0000000..f43bba5 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/magicShopkeeper.uc @@ -0,0 +1,486 @@ +var magicShopkeeper(var npc) +{ + var spellbook = AVATAR->find_object(761, QUALITY_ANY, FRAME_ANY); //makes sure Avatar has spellbook + var Avatar_Level = getExpLevel(AVATAR); //used for Rudyom's level sensing + var npcname = UI_get_npc_name(npc); + var spell; + + //empty array to determine spell circles npc can sell. 0 no, 1 yes + var circleOptions = [""]; + + //options for circle + var spellOptions = []; + + var price; + + //empty array to determine which spells in that circle they can cast + var first_circle = []; + var second_circle = []; + var third_circle = []; + var fourth_circle = []; + var fifth_circle = []; + var sixth_circle = []; + var seventh_circle = []; + var eighth_circle = []; + + //spell prices + var first_circle_price = 0; + var second_circle_price = 0; + var third_circle_price = 0; + var fourth_circle_price = 0; + var fifth_circle_price = 0; + var sixth_circle_price = 0; + var seventh_circle_price = 0; + var eighth_circle_price = 0; + + + if (npc == RUDYOM) + { + //circles they offer + circleOptions = ["nothing", "First", "Third", "Fourth", "Fifth", "Eighth"]; + + //spells in each circle + first_circle = ["Create Food", "Douse", "Great Douse", "Great Ignite", "Awaken All", "nothing"]; + third_circle = ["Heal", "nothing"]; + fourth_circle = ["Recall", "Mark", "nothing"]; + fifth_circle = ["Greater Heal", "Pickpocket", "nothing"]; + eighth_circle = ["Resurrect", "nothing"]; + + //spell prices per circle + first_circle_price = 20; + third_circle_price = 60; + fourth_circle_price = 75; + fifth_circle_price = 100; + eighth_circle_price = 160; + } + + if (npc == HORANCE) + { + //circles they offer + circleOptions = ["nothing", "Second", "Third", "Fourth", "Fifth", "Seventh", "Eighth"]; + + //spells in each circle + second_circle = ["Fire Blast", "nothing"]; + third_circle = ["Curse", "Paralyze", "Poison", "nothing"]; + fourth_circle = ["Conjure", "Lightning", "Mass Curse", "Unlock Magic", "nothing"]; + fifth_circle = ["Charm", "Explosion", "nothing"]; + sixth_circle = ["Fire Ring", "Flamestrike", "Magic Storm", "nothing"]; + seventh_circle = ["Death Bolt", "Delayed Blast", "Energy Mist", "nothing"]; + eighth_circle = ["Death Vortex", "Mass Death", "Swordstrike", "nothing"]; + + //spell prices per circle + first_circle_price = 20; + second_circle_price = 60; + third_circle_price = 90; + fourth_circle_price = 120; + fifth_circle_price = 150; + sixth_circle_price = 180; + seventh_circle_price = 210; + eighth_circle_price = 240; + } + + if (npc == NICODEMUS) + { + //circles they offer + circleOptions = ["nothing", "First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh", "Eighth"]; + + //spells in each circle + first_circle = ["Detect Trap", "Great Douse", "nothing"]; + second_circle = ["Destroy Trap", "Enchant", "Sleep", "Protection", "Telekenisis", "nothing"]; + third_circle = ["Protect All", "Swarm", "nothing"]; + fourth_circle = ["Conjure", "Unlock Magic", "nothing"]; + fifth_circle = ["Charm","nothing"]; + sixth_circle = ["Cause Fear", "nothing"]; + seventh_circle = ["Create Gold", "Restoration", "nothing"]; + eighth_circle = ["Invisible All", "nothing"]; + + //spell prices per circle + first_circle_price = 20; + second_circle_price = 40; + third_circle_price = 60; + fourth_circle_price = 80; + fifth_circle_price = 100; + sixth_circle_price = 120; + seventh_circle_price = 140; + eighth_circle_price = 160; + } + + if (npc == XIAO) + { + //circles they offer + circleOptions = ["nothing", "First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh", "Eighth"]; + + //spells in each circle + first_circle = ["Detect Trap", "Light", "Cure", "Locate", "nothing"]; + second_circle = ["Great Light", "Wizard Eye", "Mass Curse", "Telekinesis", "nothing"]; + third_circle = ["Reveal", "Peer", "nothing"]; + fourth_circle = ["Recall", "Mark", "nothing"]; + fifth_circle = ["Dispel Field", "Fire Field", "Invisibility","nothing"]; + sixth_circle = ["Poison Field", "Sleep Field", "Clone", "Magic Storm", "Cause Fear", "Tremor", "nothing"]; + seventh_circle = ["Energy Field", "Energy Mist", "Mass Charm", "nothing"]; + eighth_circle = ["Death Vortex", "Mass Death", "Summon", "Time Stop", "Swordstrike", "nothing"]; + + //spell prices per circle + first_circle_price = 25; + second_circle_price = 50; + third_circle_price = 75; + fourth_circle_price = 100; + fifth_circle_price = 125; + sixth_circle_price = 150; + seventh_circle_price = 175; + eighth_circle_price = 200; + + + + + } + + + + //ask what circle + say("@In which Circle dost thou wish to study?@"); + var circle = chooseFromMenu(circleOptions); + + if (circle == "First") + { + + spellOptions = first_circle; + price = first_circle_price; + } + else if (circle == "Second") + { + if (Avatar_Level < 2) + say("@I sense that you are not yet ready for this Circle. But such matters are not my concern...@"); + + spellOptions = second_circle; + price = second_circle_price; + } + else if (circle == "Third") + { + if (Avatar_Level < 3) + say("@I sense that you are not yet ready for this Circle. But such matters are not my concern...@"); + spellOptions = third_circle; + price = third_circle_price; + } + else if (circle == "Fourth") + { + if (Avatar_Level < 4) + say("@I sense that you are not yet ready for this Circle. But such matters are not my concern...@"); + spellOptions = fourth_circle; + price = fourth_circle_price; + } + else if (circle == "Fifth") + { + if (Avatar_Level < 5) + say("@I sense that you are not yet ready for this Circle. But such matters are not my concern...@"); + spellOptions = fifth_circle; + price = fifth_circle_price; + } + else if (circle == "Sixth") + { + if (Avatar_Level < 6) + say("@I sense that you are not yet ready for this Circle. But such matters are not my concern...@"); + spellOptions = sixth_circle; + price = sixth_circle_price; + } + else if (circle == "Seventh") + { + if (Avatar_Level < 7) + say("@I sense that you are not yet ready for this Circle. But such matters are not my concern...@"); + spellOptions = seventh_circle; + price = seventh_circle_price; + + } + else if (circle == "Eighth") + { + if (Avatar_Level < 8 && npc != XIAO) + say("@I sense that you are not yet ready for this Circle. But such matters are not my concern...@"); + spellOptions = eighth_circle; + price = eighth_circle_price; + } + else //nothing + { + spellOptions = "nothing"; + } + + //choose spell from circle menu + + if (spellOptions != "nothing") + { + say("@Which of these?@"); + spell = chooseFromMenu(spellOptions); + + if (circle == "Eighth" && npc == XIAO && !gflags[GOT_ARMAGEDDON]) + { + say("@Thou art not yet ready for such knowledge.@"); + say("@Seek out and speak with the wisps, and learn their secrets. Then wilt thou will be prepared to enter the Eighth Circle.@"); + + } + else if (spell != "nothing") + { + say("That " + spell + " spell costs " + price + ". Interested?@"); + if (askYesNo()) + { + //convert spell to useable SPELL format + var spell_converted = convertSpell(spell); + UI_error_message("spell converted is: " + spell_converted); + + if (spellbook > 0) + { + if (hasGold(price)) + { + if (!hasSpell(spell_converted)) + { + chargeGold(price); + UI_add_spell(spell_converted, 0, spellbook); + say(npcname + " hands you a piece of rune-covered parchment which you transcibe into your spellbook."); + + + } + else + say("@You already have the spell!@"); + } + else + say("@You lack the gold required.@"); + } + else + say("@But thou hast not a spellbook!@"); + } + else + say("@As you wish.@"); + } + else + say ("@As you wish.@"); + + } + else say("@Anything else?@"); +} + +var buyReagents(var npc) +{ + var npcname = UI_get_npc_name(npc); + var reagent; + var reg_frame; + var price; + + // Reagents they offer: + var regOptions = ["Mandrake Root", "Ginseng", "Nightshade", "Spider Silk", "Sulfur Ash", "Garlic", "Bloodmoss", "Black Pearl", "nothing"]; + + //Reagent prices standard + var MANDRAKE_ROOT_PRICE = 0; + var GINSENG_PRICE = 0; + var NIGHTSHADE_PRICE = 0; + var SPIDER_SILK_PRICE = 0; + var SULFUR_ASH_PRICE = 0; + var GARLIC_PRICE = 0; + var BLOOD_MOSS_PRICE = 0; + var BLACK_PEARL_PRICE = 0; + + + //******************Info for individual mages:********************\\ + + if (npc == HORANCE) + { + //Regs they offer + regOptions = ["Mandrake Root", "Nightshade", "Spider Silk", "Sulfur Ash", "Bloodmoss", "Black Pearl", "nothing"]; + + //Reagent prices for mage + MANDRAKE_ROOT_PRICE = 5; + NIGHTSHADE_PRICE = 2; + SPIDER_SILK_PRICE = 1; + SULFUR_ASH_PRICE = 2; + BLOOD_MOSS_PRICE = 3; + BLACK_PEARL_PRICE = 3; + + } + + if (npc == ZOLTAN) + { + //Regs they offer + regOptions = ["Bloodmoss", "Garlic", "Ginseng", "Nightshade", "Spider Silk", "Sulfur Ash", "nothing"]; + + //Reagent prices for mage + BLOOD_MOSS_PRICE = 3; + GARLIC_PRICE = 2; + GINSENG_PRICE = 1; + NIGHTSHADE_PRICE = 1; + SPIDER_SILK_PRICE = 2; + SULFUR_ASH_PRICE = 3; + + + + } + + + if (npc == RUDYOM) + { + //Regs they offer + regOptions = ["Ginseng", "Nightshade", "Spider Silk", "Sulfur Ash", "Garlic", "Bloodmoss", "nothing"]; + + //Reagent prices sfor mage + + GINSENG_PRICE = 2; + NIGHTSHADE_PRICE = 2; + SPIDER_SILK_PRICE = 2; + SULFUR_ASH_PRICE = 1; + GARLIC_PRICE = 1; + BLOOD_MOSS_PRICE = 3; + + } + if (npc == NICODEMUS) + { + regOptions = ["Ginseng", "Spider Silk", "Sulfur Ash", "Garlic", "Bloodmoss", "nothing"]; + + //Reagent prices standard + MANDRAKE_ROOT_PRICE = 0; + GINSENG_PRICE = 1; + NIGHTSHADE_PRICE = 0; + SPIDER_SILK_PRICE = 1; + SULFUR_ASH_PRICE = 2; + GARLIC_PRICE = 1; + BLOOD_MOSS_PRICE = 2; + BLACK_PEARL_PRICE = 0; + + } + + if (npc == XIAO) + { + regOptions = ["Mandrake Root", "Ginseng", "Nightshade", "Spider Silk", "Sulfur Ash", "Garlic", "Black Pearl", "nothing"]; + + //Reagent prices standard + MANDRAKE_ROOT_PRICE = 6; + GINSENG_PRICE = 3; + NIGHTSHADE_PRICE = 6; + SPIDER_SILK_PRICE = 3; + SULFUR_ASH_PRICE = 3; + GARLIC_PRICE = 3; + BLACK_PEARL_PRICE = 4; + + } + + + + + + + + + + /* + if (npc == DEFAULT) + { + regOptions = ["Mandrake Root", "Ginseng", "Nightshade", "Spider Silk", "Sulfur Ash", "Garlic", "Bloodmoss", "Black Pearl", "nothing"]; + + //Reagent prices standard + MANDRAKE_ROOT_PRICE = 0; + GINSENG_PRICE = 0; + NIGHTSHADE_PRICE = 0; + SPIDER_SILK_PRICE = 0; + SULFUR_ASH_PRICE = 0; + GARLIC_PRICE = 0; + BLOOD_MOSS_PRICE = 0; + BLACK_PEARL_PRICE = 0; + + } + */ + + //***************************************************************** + + //ask what reagent + say("@Which of these?@"); + reagent = chooseFromMenu(regOptions); + + if (reagent == "Mandrake Root") + { + reg_frame = FRAME_MANDRAKE_ROOT; + price = MANDRAKE_ROOT_PRICE; + } + else if (reagent == "Nightshade") + { + reg_frame = FRAME_NIGHTSHADE; + price = NIGHTSHADE_PRICE; + } + else if (reagent == "Spider Silk") + { + reg_frame = FRAME_SPIDER_SILK; + price = SPIDER_SILK_PRICE; + } + else if (reagent == "Sulfur Ash") + { + reg_frame = FRAME_SULFUR_ASH; + price = SULFUR_ASH_PRICE; + } + else if (reagent == "Bloodmoss") + { + reg_frame = FRAME_BLOOD_MOSS; + price = BLOOD_MOSS_PRICE; + } + else if (reagent == "Black Pearl") + { + reg_frame = FRAME_BLACK_PEARL; + price = BLACK_PEARL_PRICE; + } + else if (reagent == "Ginseng") + { + reg_frame = FRAME_GINSENG; + price = GINSENG_PRICE; + } + else if (reagent == "Garlic") + { + reg_frame = FRAME_GARLIC; + price = GARLIC_PRICE; + } + else //nothing + { + reagent = "nothing"; + } + + + //reagent choice selected, now buy + if (reagent != "nothing") + { + say("@" + reagent + " costs " + price + " gold per portion. How many dost thou want?@"); + var USER_INPUT = (UI_input_numeric_value(0, 20, 1, 1)); + if (hasGold(USER_INPUT * price)) + { + if (UI_add_party_items(USER_INPUT, SHAPE_REAGENT, QUALITY_ANY, reg_frame, true)) + { + chargeGold(USER_INPUT * price); + say("@" + npcname + " hands you the " + reagent + ".@*"); + + } + else say("@Thou cannot carry that much!@"); + } + else say("@Thou cannot afford that much!@"); + + } + else + say("@As you wish.@"); + +} + +var buySpellbook(var npc, var price) +{ + var npcname = UI_get_npc_name(npc); + + say("A spellbook costs " + price + " gold pieces. Interested?@"); + if (askYesNo()) + { + if (hasGold(price)) + { + if (UI_add_party_items(1, SHAPE_SPELLBOOK, QUALITY_ANY, FRAME_ANY, true)) + { + chargeGold(price); + say(npcname + " hands you a spellbook."); + } + else say("@But thou cannot carry a spellbook!@"); + } + else say("@But thou cannot afford a spellbook!@"); + } + else say("@As you wish.@"); + +} + + + + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/make_party_face_npc.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/make_party_face_npc.uc new file mode 100755 index 0000000..a678e4c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/make_party_face_npc.uc @@ -0,0 +1,70 @@ + + + +void makePartyFaceNPC object#(0x7D1) () // Approach Avatar for conversation start. +{ + var party_list = UI_get_party_list(); + var index; + var max; + var party_member; + var way_to_face; + var turn_towards; + + + for (party_member in party_list with index to max) + { + if (UI_npc_nearby(party_member)) + { + way_to_face = UI_direction_from(party_member, item); + turn_towards = UI_execute_usecode_array(party_member, [no_halt, npc_frame_stand, face_dir, way_to_face]); + } + } + + return; +} + +//added by DB + + +//force npc's to face each other - Nystul & Geoffry in LB throne room, Sylania and Sionnach in Empath Abbey +var makeNPCFaceNPC(var npc1, var npc2) +{ + + var way_to_face = UI_direction_from(npc1, npc2); + var turn_towards = UI_execute_usecode_array(npc1, [no_halt, npc_frame_stand, face_dir, way_to_face]); + + + return turn_towards; +} + +//check to see if npc's are facing each other +var isFacingNPC(var npc1, var npc2) +{ + //get directions both npcs are facing + var npc1_dir = getFacing(npc1); + var npc2_dir = getFacing(npc2); + + var npc1_inverse_dir = invertDirection(npc1); + var npc2_inverse_dir = invertDirection(npc2); + + //first npc's direction should equal to npc 2's inverse. If not, return false; + if (npc1_dir != npc2_inverse_dir || npc2_dir != npc1_inverse_dir) + return false; + else + return true; + +} + + + + + +var makeNPCFaceDirection(var npc, var direction) +{ + + var way_to_face = direction; + var turn_towards = UI_execute_usecode_array(npc, [no_halt, npc_frame_stand, face_dir, way_to_face]); + + + return turn_towards; +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/npc_functions.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/npc_functions.uc new file mode 100755 index 0000000..0c2ca05 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/npc_functions.uc @@ -0,0 +1,33 @@ +var populatePartyNames(var array) +{ + var npc; + var npcname; + var npc_num; + var party_member = ["no one"]; //to prevent being stuck in convo + var party_number; + + say("@Which of you?@"); + for (npc in array with index to max) + { + npcname = npc->get_npc_name(); + npc_num = npc->get_npc_number(); + party_member << npcname; + party_number << npc_num; + + } + + var choice = chooseFromMenu2(party_member); //works + + if (choice == 1) + return false; + + else + { + //Since party array starts at index 0, subtract one to get correct index + npc = array[choice-1]; + UI_error_message("npc num is: " + npc); + UI_error_message("choice is: " + choice); + } + return npc; + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/openCodex.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/openCodex.uc new file mode 100755 index 0000000..b0568ad --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/openCodex.uc @@ -0,0 +1,22 @@ +//Opens the codex on the wall + +void openCodex() +{ + var codex_wall = UI_find_object(FIND_ON_SCREEN, 1246, QUALITY_ANY, FRAME_ANY); //find codex wall + UI_halt_scheduled(codex_wall); + var frame = UI_get_item_frame(1246); + + script codex_wall after 3 ticks + { + + repeat 999 + { + frame 14; wait 2; + frame 15; wait 2; + frame 16; wait 2; + frame 17; wait 2; + + }; + } + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/randomizeBooks.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/randomizeBooks.uc new file mode 100755 index 0000000..174011a --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/randomizeBooks.uc @@ -0,0 +1,278 @@ + +//function to traverse an array of "u6 friendly books" +var isBookValid(var quality) +{ + var count = 0; + + + var u6_books = [2, 3, 4, 5, 7, 8, 9, 18, 19, 20, 21, 22, 23, 31, 35, 37, 38, 45, 49, 50, 51, 54, 56, 57, 61, 62, 63, 66, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 102, 103, 105, 110, 112, 126, 127, 128, 130, 131, 133, 135, 137, 139, 141, 147]; + + var book_array = [2, 3, 4, 5, 7, 8, 9, 18, 19, 20, 21, 22, 23, 31, 35, 37, 38, 45, 49, 50, 51, 54, 56, 57, 61, 62, 63, 66, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 102, 103, 105, 110, 112, 126, 127, 128, 130, 131, 133, 135, 137, 139, 141, 147]; + + + while (count < 148) + { + if (quality == u6_books[count]) + return true; + else + count += 1; + + } + return false; + + + +} + + + +var randomizeBooks() +{ + var default_u6_books = [2, 3, 4, 5, 7, 8, 9, 18, 19, 20, 21, 22, 23, 31, 35, 37, 38, 45, 49, 50, 51, 54, 56, 57, 61, 62, 63, 66, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 102, 103, 105, 110, 112, 126, 127, 128, 130, 131, 133, 135, 137, 139, 141, 147]; + + + /*************** + * The list of in game books: + + Quality/Title/(Writer/note): + 0 - Morgan's Guide to Unifinished Novels (by Morgan) --- Unifinished is spelled like that in-game. - REPLACED W/ U6 BOOK + 1 - "How Death Affects Those Who Work Around It With Regularity" - REPLACED W/ U6 BOOK + 2 - My Notebook (by Alagner) - REPLACED W/ U6 BOOK + 3 - Observations of Black Rock (by Rudyom The Mage) - REPLACED W/ U6 BOOK + 4 - Stranger in a Strange Land (by Robert Heinlein) + 5 - Chitty-Chitty-Bang-Bang (by Ian Fleming) + 6 - The Wizard of Oz (by Frank L. Baum) + 7 - Hubert's Hair-Raising Adventure (by Bill Peet) + 8 - Records of the High Court of Yew - REPLACED W/ U6 BOOK + 9 - Morfin of Paws, Ledger of Venom Sales - REPLACED W/ U6 BOOK + 10 - Ultima: The Avatar Adventures (by Rusel DeMaria and Caroline Spector) REPLACED W/ U6 BOOK + 11 - Everything An Avatar Should Know About Sex: --- Empty book, hahaha + 12 - Encyclopedia Britannia (Volume I. A - E.) + 13 - Encyclopedia Britannia (Volume II. F - L.) + 14 - Encyclopedia Britannia (Volume III. M - P.) + 15 - Encyclopedia Britannia (Volume IV. Q - U.) + 16 - Encyclopedia Britannia (Volume V. V - Z.) + 17 - Key to the Black Gate. --- Joke, supposedly a hint book - REPLACED W/ U6 BOOK + 18 - Collected Plays (by Raymundo) - REPLACED W/ U6 BOOK + 19 - No Time to Dance (by B.A. Morler.) + 20 - The Silence of Chastity (by I.M. Munk.) + 21 - Murder by Mongbat (by J. Dial.) + 22 - Dolphin in the Dunes (by Pietre Hueman.) + 23 - Mandibles (by Peter Munchley.) + 24 - The Book of the Fellowship (by Batlin of Britain.) - REPLACED W/ U6 BOOK + 25 - Lord British - The biography of Britannia's longtime ruler (by K.Bennos) + 26 - Gargoyle Like Me (by Darok.) - REPLACED W/ U6 BOOK + 27 - To be or not to be (by Wislem.) + 28 - Book of Prophecy (by Naxatilor the Seer) + 29 - The Book of Forgotten Mantras. + 30 - Struck Commander (by Gilberto) + 31 - Gone With The Wisp (by Margareta Mitchellino.) + 32 - Karenna's Workout (by Karenna.) + 33 - Karenna's Pregnancy Workout (by Karenna.) + 34 - Karenna's Total Body Workout (by Karenna.) + 35 - The Five Stages of Lawn Care (by A.P. Berk.) + 36 - And Then There Was Karen... (by B. MacDae) + 37 - The Intrinsic Complexities of Investigating a new Species of Flora in the Land of Britannia (by Perrin) + 38 - Ringworld (by Larry Niven) + 39 - The Apothecary's Desk Reference (by Fetoau) + 40 - Magic and the Art of Horse-and-Wagon Maintenance + 41 - Jesse's Book of Performance Art (by Jesse.) + 42 - The Write Stuff (by Perrin) + 43 - That Beer Needs a Head on It! (by Yongi) + 44 - The Provisioner's Guide to Useful Equipment (by Dell) + 45 - The Accedens of Armoury (by Legh) + 46 - The Bioparaphysics of the Healing Arts (by Lady Leigh) + 47 - What Color is Thy Blade? (by Menion) + 48 - The Blacksmith's Handbook (by Christopher) + 49 - Thirteen Months in a Year (by Euralyn) + 50 - The Day it Didn't Work (by R. Allen G.) + 51 - No One Leaves (by R. Allen G.) + 52 - A Complete Guide to Britannian Minerals, Precious, and Semi-Precious Stones (by B. Ledbetter) + 53 - Trees, and then Some! (by Ben) + 54 - Bloodied Blades and Buxom Beauties (A.G. Fishmor) + 55 - The Hundred and Eleven Year, Three-Month, Seven-Day War (by Perrin) + 56 - Black Moon, Red Day (by Euralyn) + 57 - Two in the Fold (by Morian) + 58 - The Forest of Yew (by Taylor) + 59 - This Olde Ship (by Owen of Minoc) + 60 - The Carver Chronicles (by Morfin) + 61 - Hero Fertilizer (by Werdron) + 62 - What could be left but the Ashes (by N. Flaims) + 63 - The Summer of my Satisfaction (by Plexes) + 64 - Hither Comes The Rain (by Perrin) + 65 - White Rain (by Perrin) + 66 - Milord Conduct (by Aleina) + 67 - To The Death! (by Zaksam) + 68 - Blade of the Gryphon Barony (by Pebrogdy) + 69 - The Winning Number (by A.P. Berk) + 70 - The Scent of Valor (by Wetterson) + 71 - How The West Was (by Yuclydia) + 72 - Thy Message Received! (by For-Lem. Translated by Jillian) + 73 - Ribald Encounters (by Madden) + 74 - The Knight and the Thief (by Hobbs) + 75 - The Trio (by Leepeartson) + 76 - The Black Compendium (Written by Mondain, with annotations by the enchantress Minax and magical formulae by the hellspawn Exodus.) + 77 - No Way to Jump (by Desmonth) + 78 - Stealing the Wind (by Brianna) + 79 - Brommer's Flora (by Brommer) + 80 - Brommer's Fauna (by Brommer) + 81 - Brommer's Britannia (by Brommer) --- Shows a world map upon use + 82 - Up is Out (by Goodefellow) + 83 - Weaving (by Carlyn) + 84 - Follow the Stars (by Laurnen) + 85 - How to Conquer the World in Three Easy Steps (by Maximillian the Amazingly Mean) + 86 - Tren I, II, III, IV, . . . XVII + 87 - Sir Kilroy (Anonymous) + 88 - My Cup Runneth Over (by Marseine) + 89 - Spring Planting, Autumn Harvest + 90 - Shoot the Moon (by Oswauld) + 91 - Outpost (by Gasreth) + 92 - Landships (by Equinestra) + 93 - Landships of War (by Equinestra) + 94 - Why Good Mages Like Black Magic (by Magus) + 95 - When Starts The Adventure (by Sabra) + 96 - What a Fool Believes (by P. Nolan) + 97 - The Complete History of the Lute (by Devonaillion, with foreword by the Master Bard, Iolo) + 98 - Birds of Britannia (by Brother Wayne) + 99 - I am not a Dragon (by Thomson) + 100 - The Dragon Compendium (by Perrin) + 101 - The Journal of Garret Moore --- Found on Ambrosia + 102 - The Transitive Vampire, by Karen Elizabeth Gordon + 103 - The Tome of the Dead (by Suvol Shadowface) + 104 - Artifacts of Darkness (by Mordra Morgaelin) + 105 - The Light Until Dawn (by Drennal) + 106 - Codavar (by Nexa) + 107 - Ritual Magic (by Nicodemus) + 108 - Pathways of Planar Travel (by Nicodemus) + 109 - Enchanting Items for Household Use (by Nicodemus) + 110 - Miscellaneous Cantrips (Anonymous) + 111 - Modern Necromancy (by Horance) + 112 - The Symbology of Runes (by Smidgeon the Green) + 113 - The Bunk and Stool (Register) + 114 - The Modest Damsel (Register) + 115 - The Checquered Cork (Register) + 116 - The Honorable Hound (Register) + 117 - The Out'N'Inn (Register) + 118 - The Wayfarerer's Inn (Register) + 119 - The Fallen Virgin (Register) + 120 - Britannian Mining Company --- Mining log + 121 - The Salty Dog (Register) + 122 - A Guide to Childcare for the Rich and Famous (by Lady M) + 123 - Alagner's Book of Marvelous and Astonishing Things (by Alagner) + 124 - Baths - Profits --- Ledger + 125 - The History of Stonegate (by Shazle) + 126 - The Way of the Swallow (by Foiles) + 127 - Vetrons Guide to Weapons and Armour (Their effectiveness and value) + 128 - Vargaz's Stories of Legend (Reasons why one should never build doors facing north or west. --- Hahahahaha + 129 - One Hundred and One Ways to Cheat at Nim (by Dr. Cat) + 130 - Play Directing: Analysis, Communication and Style (by Francis Hodge) + 131 - On Acting (by Laurence Olivier) + 132 - Thou Art What Thee Eats (by Fordras) + 133 - Man Versus Fish: The Ultimate Conflict (by Aquastyr) + 134 - Knight's Bridge in a Nutshell (by Nicodemus) + 135 - Mempto Rays (A qualitative study in metaparaphilosophical radiation - by Mempto) + 136 - The Book of Circles (Translated from Gargish to Britannian by Jillian) + 137 - Chicken Raising (by Daheness Gon) + 138 - The Art of Field Dressing (by Creston - Forward by Lady Leigh) + 139 - Water on the Cat (by Mowze) + 140 - A Short Treatise on Britannian Society (by Clayton) + 141 - A Baker's Handbook (by Settlar) + 142 - Logbook (Astelleron) --- Isle of Fire, test of love + 143 - Golems: From Clay to Stone (by Castadon) + 144 - The Stone of Castambre (by MacCuth) + 145 - --- second part of 144 + 146 - The Dark Core of Exodus (by Erethian) + 147 - Ethical Hedonism (by R. Allen G.) + 148 - Converting Moongates to Thine Own Use (by Erethian) + + + */ + + var random_num; + + + //get array of all books on screen + var books = UI_find_nearby_avatar(SHAPE_BOOK); + + //amount of books found + var num_books = UI_get_array_size([books]); + + var book; + + // var book_num = UI_find_object(FIND_ON_SCREEN, SHAPE_BOOK, QUALITY_ANY, FRAME_ANY); + + //array of U6 friendly books + var book_array = [2, 3, 4, 5, 7, 8, 9, 18, 19, 20, 21, 22, 23, 31, 35, 37, 38, 45, 49, 50, 51, 54, 56, 57, 61, 62, 63, 66, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 102, 103, 105, 110, 112, 126, 127, 128, 130, 131, 133, 135, 137, 139, 141, 147]; + + //size of array + var u6book_array_length = UI_get_array_size([book_array]); + + + //var quality = UI_get_random(148); + var count = 0; + + var book_found = false; + + //check to see if books exist in the Avatar's vicinity + if (num_books < 1) + { + UI_error_message("No books found."); + } + else + { + var randomized = 0; + //cycle through each book found + while (count <= num_books) + { + UI_error_message(num_books + " books found."); + + + //traverse array and assign each book a new quality from books in game that are "U6 friendly" + + //get a random quality + var quality = UI_get_random(u6book_array_length); + + UI_error_message("Quality is " + quality + " and book quality element is: " + book_array[quality]); + + + //set book to proper quality + var new_quality = book_array[quality]; + UI_error_message("New book quality is: " + new_quality); + UI_set_item_quality(books[count], new_quality); + + //remove that item in book array to not repeat: + book_array = removeFromArrayByIndex(book_array, quality); + + //recalculate length of array + u6book_array_length = UI_get_array_size([book_array]); + UI_error_message("Book array length is now " + u6book_array_length); + + //if no more elements in u6 book array, reset to default + if (u6book_array_length <= 1) + { + book_array = default_u6_books; + UI_error_message("Book array less than 1, resetting books"); + } + + UI_error_message("Book array now has " + u6book_array_length); + + //increase counters + randomized += 1; + count+= 1; + } + + avatarBark(randomized + " books were randomized."); + UI_error_message("books should be randomized now. "); + + + + } + + + + +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/ringBell.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/ringBell.uc new file mode 100755 index 0000000..b228e34 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/ringBell.uc @@ -0,0 +1,36 @@ +void RingBell shape#(1136) () +{ + var hour = UI_game_hour(); + var minute = UI_game_minute(); + var bell = UI_find_nearby(SHAPE_BELL); + if (isNearby(DAVER)) + { + if (minute == 00) + { + UI_error_message("Ring bell triggered"); + script bell + { + + nohalt; + frame 6; + repeat hour //should repeat every hour + { + repeat 7 + { + next frame cycle; + wait 30; + }; + }; + + } + } + else + { + script bell after 30 ticks + { + call RingBell; + } + } + } + else abort; +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/shrine_functions.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/shrine_functions.uc new file mode 100755 index 0000000..83d3c85 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/shrine_functions.uc @@ -0,0 +1,466 @@ +/***Individual stat raising functions*****/ +//Gets the current Str, Dex, Int of the npc +//then functions like the original + +void addDexterity(npc, amount) +{ + var npcDexterity = UI_get_npc_prop(npc, DEXTERITY); + + UI_set_npc_prop(npc, TRAINING, -amount); + if (npcDexterity == 29) amount = 1; + if ((npcDexterity == 28) && (amount > 2)) amount = 2; + UI_set_npc_prop(npc, DEXTERITY, amount); + +} + +void addIntelligence(npc, amount) +{ + var npcIntelligence = UI_get_npc_prop(npc, INTELLIGENCE); + var npcMana = UI_get_npc_prop(npc, MAX_MANA); + + UI_set_npc_prop(npc, TRAINING, -amount); + if (npcIntelligence == 29) amount = 1; + if ((npcIntelligence == 28) && (amount > 2)) amount = 2; + //If npc has Mana such as the Avatar , add to max mana as well. + if (npcMana > 0) UI_set_npc_prop(npc, amount); + UI_set_npc_prop(npc, INTELLIGENCE, amount); + +} + +void addStrength(npc, amount) +{ + var npcStrength = UI_get_npc_prop(npc, STRENGTH); + UI_set_npc_prop(npc, TRAINING, -amount); + if (npcStrength == 29) amount = 1; + if ((npcStrength == 28) && (amount > 2)) amount = 2; + UI_set_npc_prop(npc, STRENGTH, amount); + +} +/*********************************************/ + +void raiseStats(var npc, var shrine) +{ + var msg; + var npcname = UI_get_npc_name(npc); + var failure_msg; + var success_msg; + var training_points = UI_get_npc_prop(npc, TRAINING); + var avatar_training_points = UI_get_npc_prop(AVATAR, TRAINING); + var npcStrength = UI_get_npc_prop(npc, STRENGTH); + var npcDexterity = UI_get_npc_prop(npc, DEXTERITY); + var npcIntelligence = UI_get_npc_prop(npc, INTELLIGENCE); + + UI_error_message("NPC training points are: " + training_points + ". Avatar's training points are " + avatar_training_points + "."); + var shrine_face; + + + + //get Shrine +//***COMPASSION SHRINE*****// + if (shrine == "Compassion") //adds +3 Dexterity + { + shrine_face = NPC_COMPASSION; + shrine_face.say("@Speak the Mantra of Compassion.@"); + if (npc != AVATAR) + { + npc.say("@Mu...Mu...Mu...@"); + npc.hide(); + } + else AVATAR.say("@Mu...Mu...Mu....@"); AVATAR.hide(); + say("@No beast so fierce but shows some touch of pity. Sweet mercy is nobility's true badge.@"); + + if ((training_points >=3) && (npcDexterity < 30)) + { + addDexterity(npc, 3); + say("@" + npcname + " has gained Dexterity! There is naught else for you to learn here and now. Return when thy journey has progressed further.@"); + if (!gflags[MEDITATE_COMPASSION]) + { + addKarma(10); + gflags[MEDITATE_COMPASSION] = true; + } + + } + else say("@" + npcname + " receives no enlightenment.@"); + return; + } + +//***VALOR SHRINE*****// + if (shrine == "Valor") //adds +3 Strength + { + shrine_face = NPC_VALOR; + shrine_face.say("@Speak the Mantra of Valor.@"); + if (npc != AVATAR) + { + npc.say("@Ra...Ra...Ra...@"); + npc.hide(); + } + else AVATAR.say("@Ra...Ra...Ra...@"); + AVATAR.hide(); + say("@Tender-handed stroke a nettle, and it stings you for your pains.@*"); + say("@Grasp it as a man of mettle, and it soft as silk remains.@"); + + if ((training_points >=3) && (npcStrength < 30)) + { + addStrength(npc, 3); + say("@" + npcname + " has gained Strength! There is naught else for you to learn here and now. Return when thy journey has progressed further.@"); + if (!gflags[MEDITATE_VALOR]) + { + addKarma(10); + gflags[MEDITATE_VALOR] = true; + } + + } + else say("@" + npcname + " receives no enlightenment.@"); + return; + } +//***HONESTY SHRINE*****// + if (shrine == "Honesty") //adds +3 Intelligence. If you are the Avatar, it trains mana as well + { + shrine_face = NPC_HONESTY; + shrine_face.say("@Speak the Mantra of Honesty.@"); + if (npc != AVATAR) + { + + npc.say("@Ahm....Ahm....Ahm....@"); + npc.hide(); + } + else + { + AVATAR.say("@Ahm...Ahm...Ahm...@"); + AVATAR.hide(); + } + say("@Whatsoever things are true...@*"); + say("@Whatsoever things are honest...@*"); + say("@If there be any virtue and if there be any praise, think on these things.@*"); + + if ((training_points >=3) && (npcIntelligence < 30)) + { + if (npc == AVATAR) + trainMagic(AVATAR, 3); + + addIntelligence(npc, 3); + + say("@" + npcname + " has gained Intelligence! There is naught else for you to learn here and now. Return when thy journey has progressed further.@"); + if (!gflags[MEDITATE_HONESTY]) + { + addKarma(10); + gflags[MEDITATE_HONESTY] = true; + } + + } + else say("@" + npcname + " receives no enlightenment.@"); + return; + } +//***JUSTICE SHRINE*****// + + if (shrine == "Justice") //adds +3 Intelligence + { + shrine_face = NPC_JUSTICE; + shrine_face.say("@Speak the Mantra of Justice.@"); + if (npc != AVATAR) + { + npc.say("@Beh....Beh....Beh....@"); + npc.hide(); + } + else + { + AVATAR.say("@Beh....Beh....Beh....@"); + AVATAR.hide(); + + } + shrine_face.say("@Justice without force is impotent.@*"); + shrine_face.say("@Force without justice is tyranny.@*"); + + if (training_points >=2) + { + if (npcIntelligence < 30) + addIntelligence(npc, 1); + if (npcDexterity < 30) + addDexterity(npc, 1); + say("@" + npcname + " has gained Intelligence and Dexterity! There is naught else for you to learn here and now. Return when thy journey has progressed further.@"); + if (!gflags[MEDITATE_JUSTICE]) + { + addKarma(10); + gflags[MEDITATE_JUSTICE] = true; + } + } + else say("@" + npcname + " receives no enlightenment.@"); + return; + } + +//***SACRIFICE SHRINE*****// + + if (shrine == "Sacrifice") //adds +1 Strength and +1 Dexterity + { + shrine_face = NPC_SACRIFICE; + shrine_face.say("@Speak the Mantra of Sacrifice.@"); + if (npc != AVATAR) + { + npc.say("@Cah....Cah....Cah....@"); + npc.hide(); + } + else + { + AVATAR.say("@Cah....Cah....Cah....@"); + AVATAR.hide(); + } + say("@The universe is so vast and so ageless..@*"); + say("@..that the life of one man can only be justified@*"); + say("@by the measure of his sacrifice.@"); + + if (training_points >=2) + { + if (npcStrength < 30) + addStrength(npc, 1); + if (npcDexterity < 30) + addDexterity(npc, 1); + say("@" + npcname + " has gained Dexterity and Strength! There is naught else for you to learn here and now. Return when thy journey has progressed further.@"); + if (!gflags[MEDITATE_SACRIFICE]) + { + addKarma(10); + gflags[MEDITATE_SACRIFICE] = true; + } + } + else say("@" + npcname + " receives no enlightenment.@"); + return; + } + +//***HONOR SHRINE*****// + + if (shrine == "Honor") //adds +1 Strength and +1 Intelligence + { + shrine_face = NPC_HONOR; + shrine_face.say("@Speak the Mantra of Honor.@"); + if (npc != AVATAR) + { + npc.say("@Summ....Summ....Summ....@"); + npc.hide(); + } + else AVATAR.say("@Summ....Summ....Summ....@"); AVATAR.hide(); + + say("@Honor may be assailed, but can never be hurt.@*"); + say("@Surprised by unjust force, but not enthralled.@*"); + + if ((training_points >=2) && (npcStrength < 30)||(npcIntelligence < 30)) + { + if (npcStrength < 30) + addStrength(npc, 1); + if (npcIntelligence < 30) + addIntelligence(npc, 1); + say("@" + npcname + " has gained Intelligence and Strength! There is naught else for you to learn here and now. Return when thy journey has progressed further.@"); + if (!gflags[MEDITATE_HONOR]) + { + addKarma(10); + gflags[MEDITATE_HONOR] = true; + } + } + else say("@" + npcname + " receives no enlightenment.@"); + return; + } + +//***SPIRITUALITY SHRINE*****// + + if (shrine == "Spirituality") //adds +1 Strength ,Intelligence and Dexterity + { + shrine_face = NPC_SPIRITUALITY; + shrine_face.say("@Speak the Mantra of Spirituality.@"); + if (npc != AVATAR) + { + npc.say("@Om....Om....Om....@"); + npc.hide(); + } + else AVATAR.say("@Om....Om....Om....@"); + AVATAR.hide(); + + say("@Throughout this varied and eternal world, soul is the only element.@*"); + say("@The wealth of the spirit is the only true wealth..@*"); + + if (training_points >= 3) + { + if (npcStrength < 30) + addStrength(npc, 1); + if (npcIntelligence < 30) + addIntelligence(npc, 1); + if (npcDexterity < 30) + addDexterity(npc, 1); + + say("@" + npcname + " has gained Dexterity, Intelligence and Strength! There is naught else for you to learn here and now. Return when thy journey has progressed further.@"); + if (!gflags[MEDITATE_SPIRITUALITY]) + { + addKarma(10); + gflags[MEDITATE_SPIRITUALITY] = true; + } + } + else + say("@" + npcname + " receives no enlightenment.@"); + return; + } + +//***HUMILITY SHRINE*****// + + if (shrine == "Humility") //adds NOTHING, what a waste of points! + { + shrine_face = NPC_HUMILITY; + shrine_face.say("@Speak the Mantra of Humility.@"); + if (npc != AVATAR) + { + npc.say("@Lum....Lum....Lum....@"); + npc.hide(); + } + else AVATAR.say("@Lum....Lum....Lum....@"); AVATAR.hide(); + + say("@The humblest citizen of all the land, when clad in the armor of a righteous cause,@*"); + say("@is stronger than all the hosts of error.@*"); + + if (training_points >=3) + { + say("@There is naught else for you to learn here and now. Return when thy journey has progressed further.@"); + if (!gflags[MEDITATE_HUMILITY]) + { + addKarma(10); + gflags[MEDITATE_HUMILITY] = true; + } + UI_set_npc_prop(npc, TRAINING, -3); + } + else say("@" + npcname + " receives no enlightenment.@"); + return; + } + + +} + + + +/*********************************************/ + +void Meditate(var shrine, var virtue) +{ + var party_list = UI_get_party_list(); + var karma = getKarma(); + var SHRINE; + + if (shrine == "Sacrifice") + SHRINE = NPC_SACRIFICE; + else if (shrine == "Justice") + SHRINE = NPC_JUSTICE; + else if (shrine == "Humility") + SHRINE = NPC_HUMILITY; + else if (shrine == "Spirituality") + SHRINE = NPC_SPIRITUALITY; + else if (shrine == "Valor") + SHRINE = NPC_VALOR; + else if (shrine == "Honesty") + SHRINE = NPC_HONESTY; + else if (shrine == "Compassion") + SHRINE = NPC_COMPASSION; + else if (shrine == "Honor") + SHRINE = NPC_HONOR; + else + SHRINE = AVATAR; + + SHRINE.say("The altar of " + shrine + "."); + if (karma < 40) + item.say("@Thou hast much to learn about " + virtue + ".@"); + else if ((karma >=40) && (karma < 80)) + item.say("@Thy deeds have shown admirable " + virtue + ".@"); + else + item.say("@Thy deeds serve as an example to all.@"); + SHRINE.say("@Do you wish to meditate at this altar?@"); + if (askYesNo()) + { + SHRINE.say("@Who will meditate?@"); + add("no one"); + add("Avatar"); + if (inParty(BEHLEM)) add("Beh Lem"); + if (inParty(BLAINE)) add("Blaine"); + if (inParty(DUPRE)) add("Dupre"); + if (inParty(GORN)) add("Gorn"); + if (inParty(GWENNO)) add("Gwenno"); + if (inParty(IOLO)) add("Iolo"); + if (inParty(JAANA)) add("Jaana"); + if (inParty(JULIA)) add("Julia"); + if (inParty(KATRINA)) add("Katrina"); + if (inParty(LEODON)) add("Leodon"); + if (inParty(LEONNA)) add("Leonna"); + if (inParty(SEGGALLION)) add("Segallion"); + if (inParty(SENTRI)) add("Sentri"); + if (inParty(SHERRY)) add("Sherry"); + if (inParty(SHAMINO)) add("Shamino"); + //add any new party members here + + converse(0) + { + case "no one": + return; + case "Avatar": + raiseStats(AVATAR, shrine); + return; + + case "Beh Lem": + raiseStats(BEHLEM, shrine); + return; + + case "Blaine": + raiseStats(BLAINE, shrine); + return; + + case "Dupre": + raiseStats(DUPRE, shrine); + return; + + case "Gorn": + raiseStats(GORN, shrine); + return; + + case "Gwenno": + raiseStats(GWENNO, shrine); + return; + + case "Iolo": + raiseStats(IOLO, shrine); + return; + + case "Jaana": + raiseStats(JAANA, shrine); + return; + + case "Julia": + raiseStats(JULIA, shrine); + return; + + case "Katrina": + raiseStats(KATRINA, shrine); + return; + + case "Leodon": + raiseStats(LEODON, shrine); + return; + + case "Leonna": + raiseStats(LEONNA, shrine); + return; + + case "Segallion": + raiseStats(SEGGALLION, shrine); + return; + + case "Sherry": + raiseStats(SHERRY, shrine); + return; + + case "Sentri": + raiseStats(SENTRI, shrine); + return; + + case "Shamino": + raiseStats(SHAMINO, shrine); + return; + + + + + + } + } + + } \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/si_usecode_script.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/si_usecode_script.uc new file mode 100755 index 0000000..0f5cc41 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/si_usecode_script.uc @@ -0,0 +1,86 @@ +/* + * Copyright 2017 Scott Cooper + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. + * If not, see . + */ + +/* The Usecode Compiler (UCC.exe) does not recognize commands it should + * know, but apparently does not. + * + * 2017-01-26 Knight Captain + */ + +enum script_commands +{ + continue_script = (byte)0x01, + // (byte)0x02 only used once + repeat_script = (byte)0x0B, + wait_1_tick = (byte)0x21, + no_halt = (byte)0x23, + wait_ticks = (byte)0x27, + wait_avatar_tiles = (byte)0x2B, + finish_script = (byte)0x2C, + remove_script = (byte)0x2D, + step_n = (byte)0x30, + step_ne = (byte)0x31, + step_e = (byte)0x32, + step_se = (byte)0x33, + step_s = (byte)0x34, + step_sw = (byte)0x35, + step_w = (byte)0x36, + step_nw = (byte)0x37, + lower_z = (byte)0x38, + raise_z = (byte)0x39, + set_frame = (byte)0x46, + hatch_egg = (byte)0x48, + set_egg = (byte)0x49, + next_frame_stop_at_max = (byte)0x4D, + next_frame_wrap_to_zero = (byte)0x4E, + prev_frame_stop_at_zero = (byte)0x4F, + prev_frame_wrap_to_max = (byte)0x50, + script_bark = (byte)0x52, + step_forward = (byte)0x53, + music_track = (byte)0x54, + call_usecode = (byte)0x55, + sound_effect = (byte)0x58, + face_dir = (byte)0x59, + npc_frame_stand = (byte)0x61, // Do these all automatically face the current direction? + npc_frame_walk1 = (byte)0x62, + npc_frame_walk2 = (byte)0x63, + npc_frame_use_it = (byte)0x64, + npc_frame_swing1 = (byte)0x65, + npc_frame_swing2 = (byte)0x66, + npc_frame_swing3 = (byte)0x67, + npc_frame_swing2h1 = (byte)0x68, // S 23 + npc_frame_swing2h2 = (byte)0x69, // S 24 + npc_frame_swing2h3 = (byte)0x6A, // S 25 + npc_frame_sit = (byte)0x6B, + npc_frame_lean = (byte)0x6C, + npc_frame_kneel = (byte)0x6D, + npc_frame_lie = (byte)0x6E, + npc_frame_cast1 = (byte)0x6F, + npc_frame_cast2 = (byte)0x70, + script_damage = (byte)0x78, + attack = (byte)0x7A +}; + +/* +# Assuming these aren't defined with other variables for directions +(byte)0x59, 0x000,,face_dir NORTH; = +(byte)0x59, 0x001,,face_dir NORTHEAST; = +(byte)0x59, 0x002,,face_dir EAST; = +(byte)0x59, 0x003,,face_dir SOUTHEAST; = +(byte)0x59, 0x004,,face_dir SOUTH; = +(byte)0x59, 0x005,,face_dir SOUTHWEST; = +(byte)0x59, 0x006,,face_dir WEST; = +(byte)0x59, 0x007,,face_dir NORTHWEST; = +*/ diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/teleportCastle.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/teleportCastle.uc new file mode 100755 index 0000000..798bce6 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/teleportCastle.uc @@ -0,0 +1,51 @@ +//used to bypass intro which is buggy + +void teleportToCastle object# ()() +{ + + var pos = [0935, 1071, 0, 0]; + var pos1 = [0936, 1072, 0, 0]; + var pos2 = [0934, 1074, 0, 0]; + var pos3 = [0932, 1072, 0, 0]; + + //advance game time to 9am-ish + UI_advance_time(HOUR * 6); + + AVATAR->move_object(pos); + SHAMINO->move_object(pos1); + IOLO->move_object(pos2); + DUPRE->move_object(pos3); + + UI_add_to_party(SHAMINO); + UI_add_to_party(IOLO); + UI_add_to_party(DUPRE); + + AVATAR->clear_item_flag(BG_DONT_MOVE); + AVATAR->clear_item_flag(DONT_RENDER); + + //frees LB and company from the WAIT schedule + UI_run_schedule(LORD_BRITISH); + UI_run_schedule(NYSTUL); + UI_run_schedule(GEOFFREY); + + //failsafe - Michael seems to revert to "Wait" schedule for some reason - clear it. + UI_set_schedule_type(MICHAEL, LOITER); + UI_run_schedule(MICHAEL); + + IOLO->clear_item_flag(DONT_RENDER); + SHAMINO->clear_item_flag(DONT_RENDER); + DUPRE->clear_item_flag(DONT_RENDER); + UI_add_cont_items(IOLO, 1, SHAPE_BOOKOFPROPHESIES, QUALITY_ANY, FRAME_ANY); + UI_add_cont_items(AVATAR, 1, SHAPE_ORB, QUALITY_ANY, FRAME_ANY); + +} + +void teleportToCheatRoom object#()() +{ + PARTY->move_object([2429, 2489, 01, 02]); + UI_obj_sprite_effect(AVATAR, 17, 0, 0, 1, 1, 0, -1); + UI_play_sound_effect(109); + return; + +} + diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/time_function.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/time_function.uc new file mode 100755 index 0000000..4da970c --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/time_function.uc @@ -0,0 +1,18 @@ +//Used for conversations that say "good afternoon/morning/evening" +var timeFunction(var hour) +{ + var time_of_day; + if ((hour >= 6) && (hour < 12)) //'good morning' + { + time_of_day = "morning"; + } + + else if ((hour >= 12) && (hour < 18)) //'good afternoon' + { + time_of_day = "afternoon"; + } + else + time_of_day = "evening"; + + return time_of_day; +} \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/transfer_all_items.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/transfer_all_items.uc new file mode 100755 index 0000000..2eb4951 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/transfer_all_items.uc @@ -0,0 +1,78 @@ + + +void transferAllItems 0x9E1 (var giving_npc, receiving_npc) +{ + var each_spot; + // Here, we transfer only objects directly held by the character: + var spots = [BG_WEAPON_HAND, BG_OFF_HAND, BG_BACKPACK, BG_CLOAK, BG_AMULET, BG_HEAD, BG_GLOVES, + BG_RIGHT_RING, BG_LEFT_RING, BG_QUIVER, BG_BELT, BG_TORSO, BG_FEET, + BG_LEGS, BG_BACK_SHIELD, BG_BACK_2H]; + + var got_gear = UI_get_cont_items(giving_npc, SHAPE_ANY, FRAME_ANY, QUALITY_ANY); + if (got_gear) + { + for (each_spot in spots) + { + var equiped_gear = UI_get_readied(giving_npc, each_spot); + if (equiped_gear) + { + // If there is nothing in the way + // if (UI_get_readied(receiving_npc, each_spot) == 0) + { + UI_set_last_created(equiped_gear); + UI_give_last_created(receiving_npc); + } + } + } + } +} + + + + + +void transferNeckItems (var giving_npc, receiving_npc) +{ + var avatar_neck_item = UI_get_readied(AVATAR, BG_AMULET); + var avatar_pos = UI_get_object_position(AVATAR); + + //find which object Avatar has on the neck and transfer it to HOLDERGUY + UI_set_last_created(avatar_neck_item); + + UI_update_last_created(avatar_pos);//just put it on the ground + + +// UI_give_last_created(HOLDERGUY); + + UI_error_message("transferNeckItems should have been put on the ground"); + + +} + + +/* //OLD +void transferNeckItems (var giving_npc, receiving_npc) +{ + var each_spot; + // Here, we transfer only objects directly held by the character: + var spots = [BG_AMULET]; + + var got_gear = UI_get_cont_items(giving_npc, SHAPE_ANY, FRAME_ANY, QUALITY_ANY); + if (got_gear) + { + for (each_spot in spots) + { + var equiped_gear = UI_get_readied(giving_npc, each_spot); + if (equiped_gear) + { + // If there is nothing in the way + // if (UI_get_readied(receiving_npc, each_spot) == 0) + { + UI_set_last_created(equiped_gear); + UI_give_last_created(receiving_npc); + } + } + } + } +} +*/ \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/u6_shopkeepers.uc b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/u6_shopkeepers.uc new file mode 100755 index 0000000..158a320 --- /dev/null +++ b/info.exult.exult/data/blackgate/mods/Ultima6v1.2/src/usecode/utility/u6_shopkeepers.uc @@ -0,0 +1,676 @@ +// function to find all "sellable items" left in the inventory that weren't sold, and change their frames back to 0 - 'un-sellable = worn" +var clearSellableItems(var item_shape) +{ + var sellable_item_array; + var has_item = false; + var count = 0; + const int FRAME_SELLABLE = 32; + const int SHAPE_SELLABLE = 921; + var shape; + var party = UI_get_party_list(); + + var npc; + + UI_error_message("item shape passed to clearSellableItems is: " + item_shape); + + var original_shape = UI_get_item_shape(item_shape); + + //get an array of all objects held by the party + + for (npc in party) + { + //UI_get_cont_items(npc, SHAPE_SELLABLE, QUALITY_ANY, FRAME_ANY); + sellable_item_array = sellable_item_array + UI_get_cont_items(npc, SHAPE_SELLABLE, QUALITY_ANY, FRAME_ANY); + //sellable_item_array[count] = UI_get_cont_items(npc, SHAPE_SELLABLE, QUALITY_ANY, FRAME_ANY); + count += 1; + } + UI_error_message("Item array of 'betting markers' is " + UI_get_array_size(sellable_item_array) - 1); + + //reset count + count = 0; + + for (shape_betting_marker in sellable_item_array with index to max) + { + UI_set_item_shape(shape_betting_marker, item_shape); + shape_betting_marker->set_item_shape(item_shape); //back to normal shape + count += 1; + } + UI_error_message("There were " + count + " objects frames changed back to 0."); +} + +var sellBackItems(var item_array, var item_choices, var item_prices, var rate) +{ + var sellable_items; + var count = 0; + var party = UI_get_party_list(); + var npc; + UI_error_message("Party size is " + UI_get_array_size(party) + "."); + const int FRAME_SELLABLE = 1; + + const int SHAPE_SELLABLE = 921; //temporary shape + var sell_item_choices; + var shape_item; + var item_array_length = UI_get_array_size(item_array); + + var index = 0; + + say("@I will only buy back these items, which do you have to sell?@"); + + //get index of item choice they want to sell **NOTE** INDEX BY DEFAULT STARTS OUT AS '1'! + var item_index = chooseFromMenu2(item_choices); + UI_error_message("item_index is " + item_index); + + //get shape of item based on index + var item_shape_choice = item_choices[item_index]; + var item_shape = item_array[item_index-1]; + var price = item_prices[item_index-1]; + + UI_error_message("Item shape choice is " + item_shape_choice + " and item price initally is " + price + ". Item shape num is " + item_shape + ". Index is " + item_index); + + + + if (item_index == 1) + { + say("@Very well, what else can I help you with?@"); + + } + else + { + + //get how many of the shape the party has + //check party for each shape, add it to array of sellable items + if (UI_count_objects(PARTY, item_shape, QUALITY_ANY, FRAME_ANY) > 0) //shape found in party + { + UI_error_message("There are " + UI_count_objects(PARTY, item_shape, QUALITY_ANY, FRAME_ANY) + " of item " + item_shape_choice + "."); + + //get array of all items of the current shape by checking each person in party + var shape_items; + for (npc in party) + { + shape_items << UI_get_cont_items(npc, item_shape, QUALITY_ANY, FRAME_ANY); //changed from = shape_items + UI_get_cont_items(npc, item_shape, QUALITY_ANY, FRAME_ANY); + } + UI_error_message("There are " + UI_get_array_size(shape_items) + " found in shape_items array."); + + //check and make sure item isn't worn + for (shape_item in shape_items) + { + //sellable item is found in Party's inventory. Determine if it's in a container: + var item_container = UI_get_container(shape_item); + if (!UI_is_npc(item_container)) + { + UI_error_message("Item shape is " + UI_get_item_shape(shape_item) + "."); + sellable_items[count] = shape_item; //add item at index to sellable items + + //****Change item frame to "32" if item is not worn / held by npc*****// + //UI_set_item_frame(shape_item, FRAME_SELLABLE); + + //Set to temporary shape to discern if sellable or not: + UI_set_item_shape(shape_item, SHAPE_SELLABLE); + + UI_error_message("Item shape is " + UI_get_item_shape(shape_item) + ", item frame is " + UI_get_item_frame_rot(shape_item) + "."); + UI_error_message("Item not worn, adding to sellable_items array."); + count += 1; + UI_error_message("Index is now " + count); + } + else + { + UI_error_message("Item worn, NOT adding to sellable_items array."); + continue; + } + } + + //determine how many sellable items are + var max_sellable_items = UI_count_objects(PARTY, SHAPE_SELLABLE, QUALITY_ANY, FRAME_ANY); + + if (max_sellable_items > 0) + { + //display sellable items and ask how many they want to sell + say("@How many " + item_shape_choice + " do you want to sell?@"); + max_sellable_items = UI_count_objects(PARTY, SHAPE_SELLABLE, QUALITY_ANY, FRAME_ANY); + + //get player input from 0 to max items able to be sold of type + var num_to_sell = UI_input_numeric_value(0, max_sellable_items, 1, 1); + + if (num_to_sell == 0) + { + say("@Very well, but I don't haggle on price!@"); + + //cleanup - any unsold items switch back to normal frame: + clearSellableItems(item_shape); + } + else + { + + //calculate sell price and add to total + var sell_price = num_to_sell * price / rate; + + //remove items from party and add sell price to party's funds + + UI_remove_party_items(num_to_sell, SHAPE_SELLABLE, QUALITY_ANY, FRAME_ANY); + + + + + //display message confirming sale and new funds balance + say("You sold " + num_to_sell + " " + item_shape_choice + " for " + sell_price + " gold. @What else can I do for you?@"); + + //cleanup - any unsold items switch back to normal frame: + clearSellableItems(item_shape); + } + + } + else + { + say("@Sorry, but you have no sellable " + item_shape_choice + " items.@"); + + } + + + } + else + say("@Sorry, but you have no sellable " + item_shape_choice + " items.@"); + + } + + +} + + + +//buy armor +var buyArmor(var npc, var armor_options, var armor_prices, var armor_shapes, var dialog) +{ + var index; + var armor_index = 1; + var frame; + var quantity = 1; + var quality = 0; + var success; + var success2; + + //Which of these? + say(dialog[1]); + UI_error_message("Dialog[3] is " + dialog[3] + "."); //"That will cost you " (gold) "gold coins") + + //choose from menu of armor options + var item_choice = chooseFromMenu(armor_options); //item selected from choice + + //find index of item in armor options + //should cycle through armor options and return the index when it is the same + for (index in armor_options) + { + if (index == item_choice) + break; //return armor_index; + else + armor_index += 1; + + } + + //get shape of armor based on index + var shape = armor_shapes[armor_index-1]; + var price = armor_prices[armor_index-1]; + + + if (item_choice == "magic boots") + frame = 1; + + + UI_error_message("Price is " + price); + UI_error_message("Armor index is " + armor_index); + UI_error_message("frame is " + frame); + UI_error_message("item choice is " + item_choice); + + // 1 2 3 4 5 6 7 8 9 + //buy dialog = [initial_choice_question, askIfInterested1, askIfInterested2, cant_afford, cant_hold, saidNo, nothing,success, success2]; + + + //***NPC DIALOGUE**** + if (item_choice != "nothing") + { + say(dialog[2] + price + dialog[3]); //Ask if interested? + if (askYesNo()) + { + if (hasGold(price * quantity)) + { + + + if (UI_add_party_items(quantity, shape, quality, frame, true)) + { + chargeGold(price * quantity); + say(dialog[8] + item_choice); //success + if (success2) + say(dialog[9]); //only if extra success message. ex: "Hope this serves you well!" + } + else + say([5]); //Can't carry + } + else + say(dialog[4]); //Cant afford + } + else + say(dialog[6]); //said no + } + else + say(dialog[7]); //chose "nothing" +} + +//*************************************************************************************// +var buyWeapons(var npc, var weapon_options, var weapon_prices, var weapon_shapes, var dialog) +{ + var index; + var weapon_index = 1; + + var frame; + var quantity = 1; + var quality = 0; + var success; + var success2; + + + //Which of these? + say(dialog[1]); + + //choose from menu of weapon options + var item_choice = chooseFromMenu(weapon_options); //item selected from choice + + + + //find index of item in weapon options + //should cycle through weapon options and return the index when it is the same + for (index in weapon_options) + { + if (index == item_choice) + break; //return weapon_index; + else + weapon_index += 1; + + } + + //get shape of armor based on index + var shape = weapon_shapes[weapon_index-1]; + var price = weapon_prices[weapon_index-1]; + + UI_error_message("Price is " + price); + UI_error_message("Weapon index is " + weapon_index); + + // 1 2 3 4 5 6 7 8 9 + //buy dialog = [initial_choice_question, askIfInterested1, askIfInterested2, cant_afford, cant_hold, saidNo, nothing,success, success2]; + + if (item_choice == "arrows" || item_choice == "bolts") + { + dialog[3] = " gold for a dozen. Okay?@"; + quantity = 12; + + + } + + //***NPC DIALOGUE**** + if (item_choice != "nothing") + { + say(dialog[2] + price + dialog[3]); //Ask if interested? + if (askYesNo()) + { + if (hasGold(price * quantity)) + { + if (UI_add_party_items(quantity, shape, quality, frame, true)) + { + chargeGold(price * quantity); + say(dialog[8] + item_choice); //success + if (success2) + say(dialog[9]); //only if extra success message. ex: "Hope this serves you well!" + } + else + say([5]); //Can't carry + } + else + say(dialog[4]); //Cant afford + } + else + say(dialog[6]); //said no + } + else + say(dialog[7]); //chose "nothing" +} + + + +//*********************************************// + +var buyItems(var npc, var item_options, var prices, var item_shapes, var item_frames, var dialog) +{ + var npcname = UI_get_npc_name(npc); + var shape; + var quantity = 1; + var quality; + var frame; + var price; + + var item_cost = price * quantity; //this is used normally unless it's an item that requires extra handling such as arrows and bolts + + + var item_choice; + // 1 2 3 4 5 6 7 8 9 10 + //var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + var initial_choice_question = dialog[1];//which of these? + var askIfInterested1 = dialog[2]; + var askIfInterested2 = dialog[3]; + var ask_quantity = dialog[4]; + var cant_afford = dialog[5]; + var cant_hold = dialog[6]; + var saidNo = dialog[7]; + var nothing = dialog[8]; + var success = dialog[9]; // Ex: " + npcname + " hands you the " + item + "."; + var success2 = dialog[10]; //"I hope this item works well for you!" etc + var success_msg; + + var has_quantity; + + say(initial_choice_question); //Which of these? + item_choice = chooseFromMenu(item_options); //item selected from choice + + + //should get price and frame based on index of item choice + var item_index = 0; + var index; + + //should cycle through item options and return the index when it is the same + for (index in item_options) + { + if (index == item_choice) + break; //return food_index; + else + item_index += 1; + + } + + + //Item frame + frame = item_frames[item_index]; + + //Item shape + shape = item_shapes[item_index]; + + //Item price + price = prices[item_index]; //from +1 + + UI_error_message("item index is " + item_index); + UI_error_message("Item chosen is " + shape + " with frame of " + frame + " and cost of " + price); + + + + +//special cases for NPCS's + + if (npc == BUDO) + { + if (item_choice == "lockpicks" || item_choice == "torch" || item_choice == "bag"); + has_quantity = true; + + + } + + if (item_choice == "arrows" || item_choice == "bolts" || item_choice == "torch" || item_choice == "oil") + has_quantity = true; + + + +//////////////////////////Main conversation///////////////////////////////////////////////////// + + if (item_choice != "nothing") // "nothing" - Avatar didn't want anything + { + say(askIfInterested1 + price + askIfInterested2); + if (askYesNo()) + { + + if (has_quantity) + { + say(ask_quantity); + + + //special handling for arrows and bolts which come by dozens (12) + if (item_choice == "arrows" || item_choice == "bolts") + { + quantity = UI_input_numeric_value(1, 8, 1, 1) * 12; + item_cost = (quantity / 12 )* price; // so we're only paying for price per dozen + + } + else + quantity = UI_input_numeric_value(1, 20, 1, 1); + } + else + quantity = 1; + UI_error_message("Quantity is " + quantity); + + if (hasGold(item_cost)) // (price * quantity) + { + if (UI_add_party_items(quantity, shape, quality, frame, true)) + { + chargeGold(item_cost); + say(success + item_choice + success2); + //For special case npcs who give a freebie: + if (npc == CULLEN) + UI_add_party_items(1, shape, quality, frame, true); + + } + else + say(cant_hold); + } + else + say(cant_afford); + } + else + say(saidNo); + } + else + say(nothing); +} + + +//*********************************************// + + +var sellFood(var npc, var food_drink_options, var prices, var food_drink_frames, var dialog) +{ + var npcname = UI_get_npc_name(npc); + var shape; + var quantity = 1; + var quality; + var frame; + + var price; + var item_choice; + // 1 2 3 4 5 6 7 8 9 10 + //var dialog = [initial_choice_question, askIfInterested1, askIfInterested2, ask_quantity, cant_afford, cant_hold, saidNo, nothing, success, success2]; + + + var initial_choice_question = dialog[1];//which of these? + var askIfInterested1 = dialog[2]; + var askIfInterested2 = dialog[3]; + var ask_quantity = dialog[4]; + var cant_afford = dialog[5]; + var cant_hold = dialog[6]; + var saidNo = dialog[7]; + var nothing = dialog[8]; + var success = dialog[9]; // Ex: " + npcname + " hands you the " + item + "."; + var success2 = dialog[10]; //"I hope this item works well for you!" etc + + //for food, has quanity is true until otherwise + var has_quantity = true; + + say(initial_choice_question); //Which of these? + item_choice = chooseFromMenu(food_drink_options); //item selected from choice + + //determine whether shape is bottle or food item + switch (item_choice) + { + case "ale": case "wine": case "mead": case "Frasier's Folly": case "milk": + shape = SHAPE_BOTTLE; + break; + + default: + shape = SHAPE_FOOD; + + //for npcs who only sell wine + if (npc == FAREN || npc == STIVIUS) + shape = SHAPE_BOTTLE; + + } + + + + + + //should get price and frame based on index of item choice + var food_index = 0; + var index; + + //should cycle through food options and return the index when it is the same + for (index in food_drink_options) + { + if (index == item_choice) + break; //return food_index; + else + food_index += 1; + + } + + + //get frame of food based on index + frame = food_drink_frames[food_index]; + price = prices[food_index]; //from +1 + UI_error_message("Price is " + price); + UI_error_message("food index is " + food_index); + UI_error_message("Frame is " + frame); + + +//special cases for NPCS's + if (npc == ROB) + { + if (shape == SHAPE_BOTTLE) + { + has_quantity = false; + // success2 = "@Drink up and enjoy, for who knows what tomorrow may bring?@"); + } + + if (item_choice == "baked brie") + { + ask_quantity = "@It's a fine cheese. We serve it warm with sliced almonds on top. It costs 6 crowns each.@"; + has_quantity = true; + + } + + if (item_choice == "bread") + { + ask_quantity = "@I charge 3 gold per loaf. How many do you want?@"; + has_quantity = true; + + } + + } + + if (npc == DR_CAT) + { + if (shape == SHAPE_BOTTLE) + { + has_quantity = false; + success = "Dr Cat gives you the "; + success2 = ". @Drink up and enjoy, for who knows what tomorrow may bring?@"; + + if (item_choice == "milk") + success2 = ". @You have good taste, my friend.@"; + } + + + + } + + if (npc == AMANDA) + { + if (item_choice == "waybread") + { + has_quantity = true; + askIfInterested1 = "@Some say I make the best Waybread in these parts. It costs just "; + askIfInterested2 = " gold. You want to try some?@"; + } + + if (shape == SHAPE_BOTTLE) + success2 = "@Y'all enjoy it, now.@"; + + + if (item_choice == "milk") + success2 = "@You have good taste, my friend.@"; + + + + + } + + + if (npc == DUNBAR) + { + if (item_choice == "fish") + { + has_quantity = true; + askIfInterested1 = "@I buy all my fish fresh from Conor. It's "; + askIfInterested2 = " gold per serving. Would you like some?@"; + success = "@Here you go. I hope you enjoy it.@"; + success2 = "@Next week we should have some red snapper.@"; + } + + if (item_choice == "beef" || item_choice == "mutton") + { + askIfInterested1 = "@That will cost "; + askIfInterested2 = " gold per portion. Do you want some?@"; + + + } + + + + } + + +//////////////////////////Main conversation///////////////////////////////////////////////////// + + if (item_choice != "nothing") // "nothing" - Avatar didn't want anything + { + say(askIfInterested1 + price + askIfInterested2); + if (askYesNo()) + { + + if (has_quantity) + { + say("How many?"); + quantity = UI_input_numeric_value(1, 20, 1, 1); + } + else + quantity = 1; + + if (hasGold(price * quantity)) + { + if (UI_add_party_items(quantity, shape, quality, frame, true)) + { + chargeGold(price * quantity); + say(success + item_choice + success2); + //For special case npcs who give a freebie: + if (npc == CULLEN) + UI_add_party_items(1, shape, quality, frame, true); + + } + else + say(cant_hold); + } + else + say(cant_afford); + } + else + say(saidNo); + } + else + say(nothing); + + +} + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/save/exult00bg.sav b/info.exult.exult/data/blackgate/save/exult00bg.sav new file mode 100644 index 0000000..536e24b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/exult00bg.sav differ diff --git a/info.exult.exult/data/blackgate/save/exult01bg.sav b/info.exult.exult/data/blackgate/save/exult01bg.sav new file mode 100644 index 0000000..29259e5 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/exult01bg.sav differ diff --git a/info.exult.exult/data/blackgate/save/exult02bg.sav b/info.exult.exult/data/blackgate/save/exult02bg.sav new file mode 100644 index 0000000..82ab39c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/exult02bg.sav differ diff --git a/info.exult.exult/data/blackgate/save/exult03bg.sav b/info.exult.exult/data/blackgate/save/exult03bg.sav new file mode 100644 index 0000000..59b12da Binary files /dev/null and b/info.exult.exult/data/blackgate/save/exult03bg.sav differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/exult.ver b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/exult.ver new file mode 100644 index 0000000..31a0e5c --- /dev/null +++ b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/exult.ver @@ -0,0 +1,10 @@ +Exult version 1.9.0git +Git Branch: master +Git Revision: d259c96446e171c84450f2f5080ebd08c1501b15 +Source url: https://github.com/exult/exult/tree/d259c96446e171c84450f2f5080ebd08c1501b15 +Build Architechture: x86_64 +Built at: Aug 2 2024 01:35:42 +Compile-time options: USE_TIMIDITY_MIDI, USE_FMOPL_MIDI, USE_MT32EMU_MIDI, USE_EXULTSTUDIO, HAVE_ZIP_SUPPORT +Compiler: GCC 14.1.0 + +Platform: Windows 10 Version 10.0 Build 19045 x64 2 Processors diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/flaginit b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/flaginit new file mode 100644 index 0000000..c50e275 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/flaginit differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/gamewin.dat b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/gamewin.dat new file mode 100644 index 0000000..2ff6042 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/gamewin.dat differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/identity b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/identity new file mode 100644 index 0000000..cbac40f --- /dev/null +++ b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/identity @@ -0,0 +1,3 @@ +FORGE + + \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg00 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg00 new file mode 100644 index 0000000..e2bf5f5 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg00 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg01 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg01 new file mode 100644 index 0000000..db94075 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg01 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg02 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg02 new file mode 100644 index 0000000..d1ad29d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg02 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg03 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg03 new file mode 100644 index 0000000..518fe84 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg03 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg04 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg04 new file mode 100644 index 0000000..1a4cbca Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg04 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg05 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg05 new file mode 100644 index 0000000..e10145f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg05 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg06 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg06 new file mode 100644 index 0000000..5dd0e90 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg06 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg07 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg07 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg07 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg08 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg08 new file mode 100644 index 0000000..1b80854 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg08 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg09 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg09 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg09 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0c new file mode 100644 index 0000000..6f19d75 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0e new file mode 100644 index 0000000..072eae2 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0f new file mode 100644 index 0000000..0998bd4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg0f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg10 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg10 new file mode 100644 index 0000000..dc331d8 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg10 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg11 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg11 new file mode 100644 index 0000000..9c07ea6 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg11 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg12 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg12 new file mode 100644 index 0000000..1d1199b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg12 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg13 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg13 new file mode 100644 index 0000000..5163d4b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg13 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg14 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg14 new file mode 100644 index 0000000..a5c855f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg14 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg15 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg15 new file mode 100644 index 0000000..7e90159 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg15 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg16 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg16 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg16 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg17 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg17 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg17 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg18 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg18 new file mode 100644 index 0000000..297fb78 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg18 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg19 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg19 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg19 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1a new file mode 100644 index 0000000..cf4332c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1b new file mode 100644 index 0000000..9e3c6a4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1c new file mode 100644 index 0000000..a4305ad Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1d new file mode 100644 index 0000000..98b8cc8 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1e new file mode 100644 index 0000000..c3798dd Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1f new file mode 100644 index 0000000..b86edda Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg1f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg20 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg20 new file mode 100644 index 0000000..172bf09 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg20 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg21 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg21 new file mode 100644 index 0000000..757679b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg21 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg22 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg22 new file mode 100644 index 0000000..fb4e5aa Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg22 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg23 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg23 new file mode 100644 index 0000000..55cd0db Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg23 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg24 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg24 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg24 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg25 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg25 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg25 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg26 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg26 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg26 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg27 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg27 new file mode 100644 index 0000000..3dae6da Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg27 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg28 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg28 new file mode 100644 index 0000000..44ec549 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg28 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg29 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg29 new file mode 100644 index 0000000..ea0b3b3 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg29 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2a new file mode 100644 index 0000000..769275f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2b new file mode 100644 index 0000000..7a2b858 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2c new file mode 100644 index 0000000..34751ec Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2e new file mode 100644 index 0000000..aa87798 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg2f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg30 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg30 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg30 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg31 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg31 new file mode 100644 index 0000000..cf69686 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg31 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg32 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg32 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg32 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg33 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg33 new file mode 100644 index 0000000..8945159 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg33 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg34 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg34 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg34 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg35 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg35 new file mode 100644 index 0000000..e9cf644 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg35 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg36 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg36 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg36 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg37 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg37 new file mode 100644 index 0000000..aa508c5 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg37 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg38 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg38 new file mode 100644 index 0000000..344a91e Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg38 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg39 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg39 new file mode 100644 index 0000000..94ca05f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg39 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3a new file mode 100644 index 0000000..045232d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3b new file mode 100644 index 0000000..9baacc7 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3c new file mode 100644 index 0000000..74fe42a Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3d new file mode 100644 index 0000000..c301b0f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3f new file mode 100644 index 0000000..d7a7128 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg3f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg40 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg40 new file mode 100644 index 0000000..861ce67 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg40 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg41 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg41 new file mode 100644 index 0000000..e46078b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg41 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg42 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg42 new file mode 100644 index 0000000..1a01c8c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg42 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg43 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg43 new file mode 100644 index 0000000..371e6ff Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg43 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg44 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg44 new file mode 100644 index 0000000..257f0f2 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg44 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg45 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg45 new file mode 100644 index 0000000..047e98b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg45 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg46 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg46 new file mode 100644 index 0000000..e7cb25a Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg46 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg47 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg47 new file mode 100644 index 0000000..c254c8a Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg47 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg48 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg48 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg48 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg49 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg49 new file mode 100644 index 0000000..a539494 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg49 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4a new file mode 100644 index 0000000..ad84ad4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4b new file mode 100644 index 0000000..d592d96 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4c new file mode 100644 index 0000000..26b633a Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4d new file mode 100644 index 0000000..5e097e7 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4e new file mode 100644 index 0000000..f6b9933 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4f new file mode 100644 index 0000000..e3b6573 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg4f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg50 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg50 new file mode 100644 index 0000000..2d05a19 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg50 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg51 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg51 new file mode 100644 index 0000000..99cc788 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg51 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg52 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg52 new file mode 100644 index 0000000..b58a16b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg52 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg53 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg53 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg53 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg54 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg54 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg54 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg55 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg55 new file mode 100644 index 0000000..468c363 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg55 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg56 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg56 new file mode 100644 index 0000000..00dd57b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg56 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg57 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg57 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg57 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg58 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg58 new file mode 100644 index 0000000..9bc85df Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg58 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg59 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg59 new file mode 100644 index 0000000..f718495 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg59 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5a new file mode 100644 index 0000000..ac25593 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5b new file mode 100644 index 0000000..1c4532c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5c new file mode 100644 index 0000000..808fea5 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5d new file mode 100644 index 0000000..c9a237f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5e new file mode 100644 index 0000000..e22cedd Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5f new file mode 100644 index 0000000..81003ce Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg5f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg60 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg60 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg60 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg61 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg61 new file mode 100644 index 0000000..7d1a4fb Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg61 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg62 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg62 new file mode 100644 index 0000000..10ca81d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg62 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg63 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg63 new file mode 100644 index 0000000..bb71f69 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg63 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg64 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg64 new file mode 100644 index 0000000..b3ccaad Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg64 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg65 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg65 new file mode 100644 index 0000000..9dadbe0 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg65 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg66 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg66 new file mode 100644 index 0000000..300daca Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg66 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg67 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg67 new file mode 100644 index 0000000..8d88207 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg67 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg68 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg68 new file mode 100644 index 0000000..76cdad8 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg68 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg69 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg69 new file mode 100644 index 0000000..7421ed7 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg69 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6a new file mode 100644 index 0000000..11bd04e Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6b new file mode 100644 index 0000000..dcfeb94 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6c new file mode 100644 index 0000000..725d14b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6d new file mode 100644 index 0000000..d9417ff Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6e new file mode 100644 index 0000000..d433606 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6f new file mode 100644 index 0000000..1496185 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg6f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg70 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg70 new file mode 100644 index 0000000..a54eb66 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg70 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg71 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg71 new file mode 100644 index 0000000..1193e6c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg71 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg72 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg72 new file mode 100644 index 0000000..15ba5f6 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg72 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg73 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg73 new file mode 100644 index 0000000..6e05530 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg73 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg74 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg74 new file mode 100644 index 0000000..90f4541 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg74 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg75 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg75 new file mode 100644 index 0000000..7eccee4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg75 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg76 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg76 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg76 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg77 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg77 new file mode 100644 index 0000000..5d29b2d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg77 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg78 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg78 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg78 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg79 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg79 new file mode 100644 index 0000000..607a3c2 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg79 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7b new file mode 100644 index 0000000..0de058e Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7c new file mode 100644 index 0000000..c7400e8 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7d new file mode 100644 index 0000000..3526565 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7e new file mode 100644 index 0000000..a9e7095 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7f new file mode 100644 index 0000000..b7e1d9e Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg7f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg80 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg80 new file mode 100644 index 0000000..d9b66bf Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg80 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg81 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg81 new file mode 100644 index 0000000..7dbb041 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg81 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg82 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg82 new file mode 100644 index 0000000..3cf09db Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg82 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg83 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg83 new file mode 100644 index 0000000..8400616 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg83 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg84 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg84 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg84 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg85 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg85 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg85 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg86 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg86 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg86 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg87 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg87 new file mode 100644 index 0000000..221c338 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg87 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg88 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg88 new file mode 100644 index 0000000..5e478bb Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg88 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg89 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg89 new file mode 100644 index 0000000..7a3b3b4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg89 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8c new file mode 100644 index 0000000..e1dcfb4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8d new file mode 100644 index 0000000..0888c8b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8e new file mode 100644 index 0000000..787b5f1 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8f new file mode 100644 index 0000000..6452794 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map01/u7ireg8f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg00 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg00 new file mode 100644 index 0000000..66914d8 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg00 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg01 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg01 new file mode 100644 index 0000000..25a699b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg01 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg02 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg02 new file mode 100644 index 0000000..2f53853 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg02 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg03 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg03 new file mode 100644 index 0000000..a19ff25 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg03 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg04 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg04 new file mode 100644 index 0000000..f153d86 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg04 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg05 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg05 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg05 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg06 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg06 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg06 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg07 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg07 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg07 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg08 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg08 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg08 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg09 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg09 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg09 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0c new file mode 100644 index 0000000..6a2cc54 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0d new file mode 100644 index 0000000..d0578aa Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0e new file mode 100644 index 0000000..5632848 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg0f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg10 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg10 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg10 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg11 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg11 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg11 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg12 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg12 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg12 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg13 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg13 new file mode 100644 index 0000000..9fe8a1e Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg13 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg14 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg14 new file mode 100644 index 0000000..0023c5c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg14 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg15 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg15 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg15 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg16 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg16 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg16 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg17 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg17 new file mode 100644 index 0000000..38c0bc2 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg17 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg18 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg18 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg18 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg19 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg19 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg19 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1b new file mode 100644 index 0000000..eaaebc2 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1f new file mode 100644 index 0000000..e705d20 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg1f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg20 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg20 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg20 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg21 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg21 new file mode 100644 index 0000000..0e98a0f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg21 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg22 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg22 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg22 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg23 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg23 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg23 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg24 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg24 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg24 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg25 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg25 new file mode 100644 index 0000000..d867847 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg25 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg26 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg26 new file mode 100644 index 0000000..29dcfbe Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg26 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg27 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg27 new file mode 100644 index 0000000..b4c19f4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg27 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg28 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg28 new file mode 100644 index 0000000..2b5ab02 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg28 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg29 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg29 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg29 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg2f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg30 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg30 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg30 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg31 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg31 new file mode 100644 index 0000000..5d5b691 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg31 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg32 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg32 new file mode 100644 index 0000000..40d544c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg32 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg33 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg33 new file mode 100644 index 0000000..1967a6f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg33 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg34 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg34 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg34 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg35 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg35 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg35 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg36 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg36 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg36 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg37 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg37 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg37 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg38 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg38 new file mode 100644 index 0000000..dbe2101 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg38 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg39 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg39 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg39 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg3f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg40 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg40 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg40 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg41 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg41 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg41 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg42 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg42 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg42 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg43 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg43 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg43 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg44 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg44 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg44 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg45 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg45 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg45 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg46 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg46 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg46 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg47 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg47 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg47 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg48 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg48 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg48 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg49 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg49 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg49 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg4f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg50 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg50 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg50 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg51 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg51 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg51 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg52 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg52 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg52 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg53 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg53 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg53 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg54 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg54 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg54 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg55 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg55 new file mode 100644 index 0000000..0dad530 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg55 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg56 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg56 new file mode 100644 index 0000000..5f8e959 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg56 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg57 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg57 new file mode 100644 index 0000000..231ee94 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg57 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg58 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg58 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg58 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg59 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg59 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg59 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5a new file mode 100644 index 0000000..2e51bf6 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5b new file mode 100644 index 0000000..029e08f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg5f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg60 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg60 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg60 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg61 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg61 new file mode 100644 index 0000000..75a4ec4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg61 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg62 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg62 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg62 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg63 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg63 new file mode 100644 index 0000000..cad46a7 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg63 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg64 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg64 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg64 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg65 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg65 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg65 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg66 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg66 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg66 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg67 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg67 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg67 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg68 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg68 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg68 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg69 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg69 new file mode 100644 index 0000000..743a63d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg69 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6e new file mode 100644 index 0000000..8aceea1 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6f new file mode 100644 index 0000000..0de0d70 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg6f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg70 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg70 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg70 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg71 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg71 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg71 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg72 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg72 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg72 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg73 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg73 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg73 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg74 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg74 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg74 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg75 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg75 new file mode 100644 index 0000000..433510b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg75 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg76 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg76 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg76 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg77 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg77 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg77 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg78 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg78 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg78 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg79 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg79 new file mode 100644 index 0000000..121000c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg79 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7b new file mode 100644 index 0000000..92caf5f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg7f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg80 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg80 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg80 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg81 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg81 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg81 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg82 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg82 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg82 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg83 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg83 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg83 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg84 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg84 new file mode 100644 index 0000000..8caa59c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg84 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg85 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg85 new file mode 100644 index 0000000..913d4ba Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg85 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg86 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg86 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg86 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg87 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg87 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg87 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg88 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg88 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg88 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg89 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg89 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg89 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map02/u7ireg8f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg00 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg00 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg00 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg01 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg01 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg01 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg02 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg02 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg02 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg03 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg03 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg03 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg04 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg04 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg04 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg05 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg05 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg05 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg06 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg06 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg06 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg07 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg07 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg07 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg08 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg08 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg08 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg09 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg09 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg09 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0d new file mode 100644 index 0000000..6095ded Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0f new file mode 100644 index 0000000..2e2bd63 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg0f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg10 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg10 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg10 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg11 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg11 new file mode 100644 index 0000000..c7da27a Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg11 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg12 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg12 new file mode 100644 index 0000000..ae2b821 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg12 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg13 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg13 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg13 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg14 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg14 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg14 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg15 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg15 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg15 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg16 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg16 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg16 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg17 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg17 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg17 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg18 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg18 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg18 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg19 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg19 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg19 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg1f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg20 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg20 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg20 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg21 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg21 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg21 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg22 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg22 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg22 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg23 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg23 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg23 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg24 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg24 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg24 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg25 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg25 new file mode 100644 index 0000000..9f39ae8 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg25 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg26 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg26 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg26 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg27 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg27 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg27 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg28 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg28 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg28 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg29 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg29 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg29 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg2f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg30 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg30 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg30 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg31 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg31 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg31 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg32 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg32 new file mode 100644 index 0000000..06cea3d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg32 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg33 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg33 new file mode 100644 index 0000000..a276d34 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg33 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg34 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg34 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg34 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg35 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg35 new file mode 100644 index 0000000..3a81db4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg35 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg36 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg36 new file mode 100644 index 0000000..70d0818 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg36 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg37 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg37 new file mode 100644 index 0000000..7d0e00d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg37 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg38 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg38 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg38 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg39 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg39 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg39 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3f new file mode 100644 index 0000000..61583bf Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg3f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg40 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg40 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg40 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg41 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg41 new file mode 100644 index 0000000..1106fc5 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg41 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg42 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg42 new file mode 100644 index 0000000..1bb4aa9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg42 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg43 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg43 new file mode 100644 index 0000000..3e5adb3 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg43 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg44 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg44 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg44 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg45 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg45 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg45 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg46 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg46 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg46 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg47 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg47 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg47 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg48 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg48 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg48 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg49 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg49 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg49 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4d new file mode 100644 index 0000000..7229aa4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4e new file mode 100644 index 0000000..08ebfe1 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4f new file mode 100644 index 0000000..8de0c4e Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg4f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg50 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg50 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg50 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg51 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg51 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg51 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg52 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg52 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg52 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg53 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg53 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg53 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg54 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg54 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg54 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg55 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg55 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg55 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg56 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg56 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg56 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg57 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg57 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg57 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg58 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg58 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg58 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg59 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg59 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg59 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5a new file mode 100644 index 0000000..d623c2c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg5f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg60 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg60 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg60 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg61 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg61 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg61 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg62 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg62 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg62 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg63 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg63 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg63 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg64 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg64 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg64 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg65 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg65 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg65 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg66 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg66 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg66 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg67 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg67 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg67 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg68 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg68 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg68 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg69 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg69 new file mode 100644 index 0000000..ae2d83c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg69 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6a new file mode 100644 index 0000000..fe81544 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6d new file mode 100644 index 0000000..5039d06 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6f new file mode 100644 index 0000000..54cdb6d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg6f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg70 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg70 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg70 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg71 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg71 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg71 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg72 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg72 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg72 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg73 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg73 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg73 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg74 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg74 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg74 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg75 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg75 new file mode 100644 index 0000000..e9ec4c8 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg75 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg76 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg76 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg76 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg77 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg77 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg77 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg78 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg78 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg78 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg79 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg79 new file mode 100644 index 0000000..e9415b0 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg79 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7b new file mode 100644 index 0000000..fb11ff1 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7d new file mode 100644 index 0000000..cc3d0ee Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg7f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg80 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg80 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg80 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg81 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg81 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg81 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg82 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg82 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg82 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg83 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg83 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg83 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg84 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg84 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg84 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg85 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg85 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg85 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg86 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg86 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg86 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg87 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg87 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg87 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg88 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg88 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg88 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg89 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg89 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg89 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8d new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/map03/u7ireg8f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/monsnpcs.dat b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/monsnpcs.dat new file mode 100644 index 0000000..09f370e Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/monsnpcs.dat differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/newgame.ver b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/newgame.ver new file mode 100644 index 0000000..ee1e592 --- /dev/null +++ b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/newgame.ver @@ -0,0 +1,18 @@ +Exult version 1.10.1 +Source url: https://github.com/exult/exult +Build Architechture: x86_64 +CPUID: AuthenticAMD, AMD Ryzen 5 5600X 6-Core Processor +stepping: 2 +type: 0 +family: 15 +ext family: 10 +model: 1 +ext model: 2 +SSE: supported +SSE2: supported +X86-64-v3 supported +Built at: Jan 28 2025 16:00:33 +Compile-time options: USE_TIMIDITY_MIDI, USE_FMOPL_MIDI, USE_MT32EMU_MIDI, USE_ALSA_MIDI, USE_EXULTSTUDIO, HAVE_ZIP_SUPPORT, ENABLE_MIDISFX +Compiler: GCC 14.2.0 + +Platform: Linux version 6.12.10-arch1-1 diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/notebook.xml b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/notebook.xml new file mode 100644 index 0000000..3791526 --- /dev/null +++ b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/notebook.xml @@ -0,0 +1,16 @@ + + + + 271:676 + + + + + + + 1189:1179 + + + + + diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/npc.dat b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/npc.dat new file mode 100644 index 0000000..12a302d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/npc.dat differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/saveinfo.dat b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/saveinfo.dat new file mode 100644 index 0000000..4df0453 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/saveinfo.dat differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/schedule.dat b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/schedule.dat new file mode 100644 index 0000000..a72451d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/schedule.dat differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/scrnshot.shp b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/scrnshot.shp new file mode 100644 index 0000000..27cf373 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/scrnshot.shp differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg00 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg00 new file mode 100644 index 0000000..baba55b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg00 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg01 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg01 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg01 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg02 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg02 new file mode 100644 index 0000000..e9f9567 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg02 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg03 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg03 new file mode 100644 index 0000000..ea61bc7 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg03 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg04 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg04 new file mode 100644 index 0000000..7fb8e0a Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg04 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg05 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg05 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg05 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg06 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg06 new file mode 100644 index 0000000..e8e6461 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg06 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg07 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg07 new file mode 100644 index 0000000..bbee98d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg07 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg08 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg08 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg08 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg09 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg09 new file mode 100644 index 0000000..f847daf Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg09 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0a new file mode 100644 index 0000000..449fbc1 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0b new file mode 100644 index 0000000..55c837f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0d new file mode 100644 index 0000000..2261838 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0e new file mode 100644 index 0000000..a059d00 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0f new file mode 100644 index 0000000..bd02c36 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg0f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg10 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg10 new file mode 100644 index 0000000..fe72743 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg10 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg11 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg11 new file mode 100644 index 0000000..b126743 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg11 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg12 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg12 new file mode 100644 index 0000000..f4ff534 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg12 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg13 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg13 new file mode 100644 index 0000000..1205001 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg13 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg14 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg14 new file mode 100644 index 0000000..ca39daa Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg14 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg15 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg15 new file mode 100644 index 0000000..193418f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg15 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg16 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg16 new file mode 100644 index 0000000..bd7ac27 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg16 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg17 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg17 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg17 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg18 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg18 new file mode 100644 index 0000000..5e6b2c0 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg18 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg19 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg19 new file mode 100644 index 0000000..44e5071 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg19 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1a new file mode 100644 index 0000000..16f9f9f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1b new file mode 100644 index 0000000..2d0766a Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1c new file mode 100644 index 0000000..f7b7515 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1d new file mode 100644 index 0000000..4c96cca Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1e new file mode 100644 index 0000000..a19728f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1f new file mode 100644 index 0000000..fc56bdc Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg1f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg20 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg20 new file mode 100644 index 0000000..0e5c4a1 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg20 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg21 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg21 new file mode 100644 index 0000000..2d9fdac Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg21 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg22 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg22 new file mode 100644 index 0000000..ec5721e Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg22 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg23 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg23 new file mode 100644 index 0000000..36ca6d5 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg23 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg24 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg24 new file mode 100644 index 0000000..1154447 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg24 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg25 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg25 new file mode 100644 index 0000000..ff47ab6 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg25 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg26 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg26 new file mode 100644 index 0000000..37adeaa Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg26 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg27 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg27 new file mode 100644 index 0000000..250b5df Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg27 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg28 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg28 new file mode 100644 index 0000000..70770b6 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg28 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg29 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg29 new file mode 100644 index 0000000..e66caa8 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg29 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2a new file mode 100644 index 0000000..dc20e54 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2b new file mode 100644 index 0000000..6e2e2ba Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2c new file mode 100644 index 0000000..439b783 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2d new file mode 100644 index 0000000..3cffcda Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2e new file mode 100644 index 0000000..99577a1 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2f new file mode 100644 index 0000000..9cc1492 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg2f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg30 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg30 new file mode 100644 index 0000000..242c737 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg30 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg31 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg31 new file mode 100644 index 0000000..b54d865 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg31 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg32 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg32 new file mode 100644 index 0000000..b4b0222 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg32 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg33 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg33 new file mode 100644 index 0000000..4f78d3d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg33 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg34 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg34 new file mode 100644 index 0000000..236d685 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg34 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg35 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg35 new file mode 100644 index 0000000..b19d014 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg35 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg36 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg36 new file mode 100644 index 0000000..39f87f5 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg36 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg37 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg37 new file mode 100644 index 0000000..5642f7a Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg37 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg38 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg38 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg38 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg39 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg39 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg39 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3a new file mode 100644 index 0000000..cf16a3c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3b new file mode 100644 index 0000000..e06007c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3c new file mode 100644 index 0000000..bca2aa6 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3d new file mode 100644 index 0000000..0cc1609 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3e new file mode 100644 index 0000000..014fac9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3f new file mode 100644 index 0000000..5c90f2a Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg3f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg40 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg40 new file mode 100644 index 0000000..902010e Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg40 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg41 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg41 new file mode 100644 index 0000000..532df69 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg41 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg42 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg42 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg42 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg43 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg43 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg43 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg44 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg44 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg44 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg45 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg45 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg45 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg46 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg46 new file mode 100644 index 0000000..01079b5 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg46 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg47 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg47 new file mode 100644 index 0000000..cd20d3f Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg47 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg48 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg48 new file mode 100644 index 0000000..44e564b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg48 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg49 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg49 new file mode 100644 index 0000000..85eccbe Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg49 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4a new file mode 100644 index 0000000..34b5a93 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4b new file mode 100644 index 0000000..cce9463 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4c new file mode 100644 index 0000000..8699bee Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4d new file mode 100644 index 0000000..dd09993 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4e new file mode 100644 index 0000000..e84b559 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg4f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg50 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg50 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg50 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg51 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg51 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg51 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg52 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg52 new file mode 100644 index 0000000..d43ee98 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg52 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg53 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg53 new file mode 100644 index 0000000..d2e50cf Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg53 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg54 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg54 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg54 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg55 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg55 new file mode 100644 index 0000000..e682929 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg55 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg56 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg56 new file mode 100644 index 0000000..4d4ab9e Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg56 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg57 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg57 new file mode 100644 index 0000000..1e10fbf Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg57 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg58 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg58 new file mode 100644 index 0000000..12545b1 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg58 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg59 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg59 new file mode 100644 index 0000000..f10c364 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg59 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5a new file mode 100644 index 0000000..f44d21b Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5b new file mode 100644 index 0000000..2c9b116 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5c new file mode 100644 index 0000000..cbbae58 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5d new file mode 100644 index 0000000..62794c4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5f new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg5f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg60 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg60 new file mode 100644 index 0000000..28f7183 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg60 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg61 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg61 new file mode 100644 index 0000000..d0cf433 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg61 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg62 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg62 new file mode 100644 index 0000000..d0da61d Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg62 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg63 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg63 new file mode 100644 index 0000000..dec7ca9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg63 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg64 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg64 new file mode 100644 index 0000000..af326cc Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg64 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg65 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg65 new file mode 100644 index 0000000..55f1616 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg65 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg66 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg66 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg66 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg67 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg67 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg67 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg68 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg68 new file mode 100644 index 0000000..057af51 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg68 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg69 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg69 new file mode 100644 index 0000000..2c08ff7 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg69 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6b new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6c new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6d new file mode 100644 index 0000000..9ee6498 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6e new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6f new file mode 100644 index 0000000..5bb1e33 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg6f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg70 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg70 new file mode 100644 index 0000000..6506904 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg70 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg71 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg71 new file mode 100644 index 0000000..120a4b3 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg71 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg72 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg72 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg72 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg73 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg73 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg73 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg74 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg74 new file mode 100644 index 0000000..16c4573 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg74 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg75 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg75 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg75 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg76 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg76 new file mode 100644 index 0000000..4e7068c Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg76 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg77 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg77 new file mode 100644 index 0000000..a84aa71 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg77 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg78 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg78 new file mode 100644 index 0000000..07c06d1 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg78 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg79 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg79 new file mode 100644 index 0000000..6df6017 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg79 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7a new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7b new file mode 100644 index 0000000..42d5026 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7c new file mode 100644 index 0000000..d79b8d7 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7d new file mode 100644 index 0000000..9a34bad Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7e new file mode 100644 index 0000000..6ca6985 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7f new file mode 100644 index 0000000..fedce66 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg7f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg80 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg80 new file mode 100644 index 0000000..3d190ee Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg80 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg81 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg81 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg81 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg82 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg82 new file mode 100644 index 0000000..cd5dac4 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg82 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg83 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg83 new file mode 100644 index 0000000..aeb18b5 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg83 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg84 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg84 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg84 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg85 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg85 new file mode 100644 index 0000000..251d8f0 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg85 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg86 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg86 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg86 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg87 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg87 new file mode 100644 index 0000000..a64a5a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg87 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg88 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg88 new file mode 100644 index 0000000..0dc4d8a Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg88 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg89 b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg89 new file mode 100644 index 0000000..36261e5 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg89 differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8a b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8a new file mode 100644 index 0000000..3a58501 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8a differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8b b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8b new file mode 100644 index 0000000..ae618f7 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8b differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8c b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8c new file mode 100644 index 0000000..0825782 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8c differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8d b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8d new file mode 100644 index 0000000..815d026 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8d differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8e b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8e new file mode 100644 index 0000000..d016a67 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8e differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8f b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8f new file mode 100644 index 0000000..00c8969 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/u7ireg8f differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/usecode.dat b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/usecode.dat new file mode 100644 index 0000000..2b7de93 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/usecode.dat differ diff --git a/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/usecode.var b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/usecode.var new file mode 100644 index 0000000..94ed689 Binary files /dev/null and b/info.exult.exult/data/blackgate/save/mods/Ultima6v1.2/gamedat/usecode.var differ diff --git a/info.exult.exult/data/blackgate/tmp/1421404763_brazilian.jpg b/info.exult.exult/data/blackgate/tmp/1421404763_brazilian.jpg new file mode 100644 index 0000000..8135c46 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1421404763_brazilian.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1421404763_chinese.jpg b/info.exult.exult/data/blackgate/tmp/1421404763_chinese.jpg new file mode 100644 index 0000000..c0743dc Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1421404763_chinese.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1421404763_english.jpg b/info.exult.exult/data/blackgate/tmp/1421404763_english.jpg new file mode 100644 index 0000000..6fedfa1 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1421404763_english.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1421404763_french.jpg b/info.exult.exult/data/blackgate/tmp/1421404763_french.jpg new file mode 100644 index 0000000..f27b741 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1421404763_french.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1421404763_german.jpg b/info.exult.exult/data/blackgate/tmp/1421404763_german.jpg new file mode 100644 index 0000000..ee9aff2 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1421404763_german.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1421404763_polish.jpg b/info.exult.exult/data/blackgate/tmp/1421404763_polish.jpg new file mode 100644 index 0000000..b56505d Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1421404763_polish.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1421404763_russian.jpg b/info.exult.exult/data/blackgate/tmp/1421404763_russian.jpg new file mode 100644 index 0000000..2d8da45 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1421404763_russian.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1441355933_brazilian.jpg b/info.exult.exult/data/blackgate/tmp/1441355933_brazilian.jpg new file mode 100644 index 0000000..05c3f22 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1441355933_brazilian.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1441355933_chinese.jpg b/info.exult.exult/data/blackgate/tmp/1441355933_chinese.jpg new file mode 100644 index 0000000..0b1ad39 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1441355933_chinese.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1441355933_english.jpg b/info.exult.exult/data/blackgate/tmp/1441355933_english.jpg new file mode 100644 index 0000000..cb644e8 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1441355933_english.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1441355933_french.jpg b/info.exult.exult/data/blackgate/tmp/1441355933_french.jpg new file mode 100644 index 0000000..9e3605e Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1441355933_french.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1441355933_german.jpg b/info.exult.exult/data/blackgate/tmp/1441355933_german.jpg new file mode 100644 index 0000000..a92a880 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1441355933_german.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1441355933_polish.jpg b/info.exult.exult/data/blackgate/tmp/1441355933_polish.jpg new file mode 100644 index 0000000..ff5cdd8 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1441355933_polish.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/1441355933_russian.jpg b/info.exult.exult/data/blackgate/tmp/1441355933_russian.jpg new file mode 100644 index 0000000..1a17451 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/1441355933_russian.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/BigFail.png b/info.exult.exult/data/blackgate/tmp/BigFail.png new file mode 100644 index 0000000..fef35c3 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/BigFail.png differ diff --git a/info.exult.exult/data/blackgate/tmp/BigFail200.png b/info.exult.exult/data/blackgate/tmp/BigFail200.png new file mode 100644 index 0000000..7b16f33 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/BigFail200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/BigOK.png b/info.exult.exult/data/blackgate/tmp/BigOK.png new file mode 100644 index 0000000..33f4414 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/BigOK.png differ diff --git a/info.exult.exult/data/blackgate/tmp/BigOK200.png b/info.exult.exult/data/blackgate/tmp/BigOK200.png new file mode 100644 index 0000000..9ea28f9 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/BigOK200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/BigWarn.png b/info.exult.exult/data/blackgate/tmp/BigWarn.png new file mode 100644 index 0000000..5ff7f5d Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/BigWarn.png differ diff --git a/info.exult.exult/data/blackgate/tmp/BigWarn200.png b/info.exult.exult/data/blackgate/tmp/BigWarn200.png new file mode 100644 index 0000000..b016082 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/BigWarn200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/EULA.png b/info.exult.exult/data/blackgate/tmp/EULA.png new file mode 100644 index 0000000..1017fb4 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/EULA.png differ diff --git a/info.exult.exult/data/blackgate/tmp/EULA.txt b/info.exult.exult/data/blackgate/tmp/EULA.txt new file mode 100644 index 0000000..e35fa4e --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/EULA.txt @@ -0,0 +1,1600 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM USER AGREEMENT + +## 1\. ABOUT THIS AGREEMENT + + + +1.1 This Agreement is a contract between you (we will further call you just +“youâ€) and GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Warsaw, Poland (we will +further call ourselves “GOG†or just “usâ€) and applies to www.GOG.COM, your +GOG user account, GOG GALAXY application (including GOG GALAXY store), any +games or videos or other content or services which you purchase or access via +us, the GOG web forums, GOG customer and technical support and other services +we provide to you (we'll just call all this “GOG services†for short). Here we +set out your rights and obligations as a recipient of GOG services. + + + +1.2. Additional terms may apply to GOG services and in such a case we will +post them for your acceptance. For example, if you would like to use the GOG +GALAXY application, the relevant terms will be posted for your acceptance +before you start using these services. + + + +1.3 Also, when we're talking about games, in-game content, virtual items or +currency or GOG videos or other content or services which you can purchase or +access via GOG services, we’ll just call them “GOG games†or “GOG videos†+respectively and when we talk about them all together they are “GOG contentâ€. + + + +1.4 We didn’t want to make this document too long, but keep in mind that by +accepting our User Agreement you also accept: + + * our [ Privacy Policy ](https://support.gog.com/hc/articles/212632109) \- which explains what data we collect from you and how we protect it, + + * [ GOG Code of Conduct ](https://support.gog.com/hc/articles/16033977811613) which is a set of rules you need to follow as part of our community, + + * [ Infringing Content and Copyright Policy ](https://support.gog.com/hc/articles/16033687971613) which explains how you can report unlawful content on GOG and what happens when you do. + + + +1.5 GOG works with trusted partners, including our related company CD PROJEKT +S.A., developers and publishers, payment providers, customer service software +providers and others (“Partnersâ€) – more on them later in this Agreement. + + + +1.6 If you're over 18, then welcome! If you're between 16 and 18, before we +extend an equally warm welcome, please ask your parent or guardian to review +and approve this Agreement on your behalf (because in some countries people +under a certain age cannot legally enter into contracts like this Agreement). +If you’re not 16 yet you cannot have a GOG account or use the GOG services +because legally we cannot handle personal data of children without a special +parental or guardian’s permission (but your parents/guardians are welcome to +sign up themselves). + +## 2\. USING GOG SERVICES AND GOG CONTENT + + + +2.1 We give you and other GOG users the personal right (known legally as a +'license') to use GOG services and to download, access and/or stream +(depending on the content) and use GOG content. This license is for your +personal use. We can stop or suspend this license in some situations, which +are explained later on. + + + +2.2 When you buy, access or install GOG games, you might have to agree to +additional contract terms with the developer/publisher of the game (e.g. they +might ask you to agree to a game specific End User License Agreement). If +there is any inconsistency or dispute between those ‘EULAs’ and this +Agreement, then this Agreement wins. + + + +2.3 With GOG videos, you can also stream purchased video content or download +it to watch the way you want. + + + +2.4 Using certain third-party scripts is recommended for your full use of GOG +functionality and, although that usage is optional, we cannot promise full +service performance without them. + + + +2.5 A quick word about GOG GALAXY, which is our (optional) application which +not only allows you to buy and access GOG content but also provides cool +features like unified game library, and one friends list across platforms, +online multiplayer, achievements, cross-platform chat, game-time tracking, +cloud-saves and game overlay. You can learn more about +it[here](https://www.gog.com/galaxy). + + + +2.6 In some parts of GOG services, we use recommendation systems to present +you the content that you are most likely to be interested in. You can learn +where we use them and how they work[here](https://support.gog.com/hc/en- +us/articles/16034228157213), including what main parameters we use and how to +influence them. + +## 3\. GOG ACCOUNT + + + +3.1 To buy GOG content from GOG services, and in some cases to play/use GOG +content where our partners require use of a GOG account, you will need to set +up a GOG account. This will involve creating a password (which is encrypted so +we can’t access it) and a username, plus giving us (for identification +purposes) your email address. Please make sure your login credentials are kept +secure and your account is used properly. In your GOG account settings you can +also optionally set your country of residence, birthday and avatar. Our +Privacy Policy gives more details about the information we collect from you +and how we use it and protect it. +It's[here](https://support.gog.com/hc/articles/212632109). + + + +3.2 You can use your GOG account to set up a public profile accessible by +other people. You can also use your GOG account to connect with other GOG +users. Please act sensibly and remember you are responsible for your own +actions. + + + +3.3 Your GOG account and GOG content are personal to you and cannot be shared +with, sold, gifted or transferred to anyone else. Your access to and use of +them is subject to GOG’s [ Privacy Policy +](https://support.gog.com/hc/articles/212632109) and [ Code of Conduct +](https://support.gog.com/hc/articles/16033977811613) which are updated or +amended when necessary. + + + +3.4. Access to and use of the games purchased from different platforms (i.e. +with what we call ‘Keyless Access’), including their minimum system +requirements is governed by respective third-party platform policies and (as +applicable) additional contract terms with the developer/publisher of the game +(e.g. they might ask you to agree to a game specific End User License +Agreement). It may require having a third-party platform account. These +platforms may roll out patches or updates for your purchased games. + +## 4\. SYSTEM REQUIREMENTS + + + +4.1 Because GOG gives you access to many different services and games created +at different times and via different platforms, we cannot give you one set of +system requirements for all GOG services or GOG content. Please make sure your +computer and Internet connection are good enough to use GOG services and play +GOG games and videos. + + + +4.2 What we can tell you is that using any GOG game will require a computer, +equipped with a mouse and keyboard (touchscreen controls are not supported), +with an appropriate operating system (please refer to the relevant GOG product +page) with all service packs and important updates installed on it. All GOG +games should be natively installed on a computer that meets or exceeds the +minimum hardware and software specifications shown on the GOG product page. +GOG games are not tested on virtual machine software and therefore we do not +support playing through them. + + + +4.3 For GOG videos, please make sure your video player supports the videos’ +format specified in the GOG product page. + + + +4.4 If you have questions about system requirements, please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). Just so we're clear, you are +responsible for making sure you have sufficient Internet access to download +purchased GOG games or GOG videos from us or to stream GOG videos and that +your system can play GOG games and watch GOG videos. + +## 5\. BETAS + + + +5.1 As GOG develops, we may offer you optional access to 'beta' versions of +GOG software or services (e.g. new versions of the GOG GALAXY application made +available prior to its general release) or GOG content. + + + +Here are the rules: + + + +a) We (or any applicable publisher/partner) will set the conditions and +requirements for your beta access. Providing and maintaining a beta, and who +can use a beta, is at our discretion. + + + +b) You may be required to go through a registration process or other +requirements to access the beta (and this may include you meeting eligibility +criteria). + + + +c) Betas will be time-limited and there may be extra contract requirements. + + + +d) The beta may involve temporary or permanent server/progress/content wipes, +resets or amendments. + + + +e) The beta may be subject to confidentiality restrictions (which will be +notified to you in advance if so). + + + +f) You may be invited to participate in a feedback process regarding the beta +– this is totally optional but would be really valued. + + + +g) The beta is for your personal use and enjoyment, so you must not sell, loan +or otherwise transfer it to anyone else. + + + +h) The point of you getting beta access is to allow you to try something new, +but we would expect you to recognise that it will not be complete yet. +Therefore betas will be provided 'as is' without any additional promises from +us or any liability on us if it is not complete or does not work fully or +causes issues. Betas may not be totally feature-complete and there may be +feature changes, modifications or removals during the beta. + +## 6\. PAYING FOR GOG CONTENT AND GETTING REFUNDS + +### Paying for GOG content + +6.1 After you decide that you like a GOG game, GOG video or other GOG content, +you usually will need to pay for it before you can access it (though we do +have some free content too!). You can pay in different ways: (i) using a valid +debit or credit card; or (ii) using PayPal or any other authorized payment +provider. Remember to keep your payment details secure. + + + +6.2 When you use a payment method to buy GOG content, we're relying on your +promise that you're able to use that method. You are responsible for any +purchases made using your GOG account or payment method and you agree to the +pricing, payment and billing policies applicable to them, as notified to you +at the time of purchase. All payments are non-refundable and non-transferable +except as expressly provided in this Agreement. + + + +6.3 You can always pay for GOG content in US Dollars. However if you happen to +live in countries where your local currency is supported (see our Support +section [ here ](https://support.gog.com/hc/en- +us/articles/360001947034?product=gog) for details), you will be able to pay in +your local currency. You might have to pay a currency conversion charge if you +are not paying in your home currency and some banks might also add other kinds +of transaction fees. + + + +6.4. All prices are visible in the product catalog page. They’re inclusive of +taxes like VAT, if applicable. You should also expect some sales taxes/VAT to +be added to your price at checkout, if required by your local laws (f.ex. in +US or Canada). + + + +### GOG Wallet + +6.5 GOG offers users a digital account balance called the “GOG Wallet†in +connection with your user account, which you can use to make purchases of GOG +content on dedicated GOG services. Funds can be added to it in two ways: (i) +using your chosen payment method; or (ii) by us as part of our ‘Voluntary +Refund Policy’ (see link[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy)) in which case we may offer refunds +to GOG Wallet that you can use to get a replacement GOG game or other GOG +content. The GOG Wallet is made available subject to rules which are set out +on our GOG Wallet page[here](https://support.gog.com/hc/en- +us/articles/360001941953-FAQ-GOG-Wallet?product=galaxy). + +### GOG Bonus Codes + +6.6. We may also issue usually time-limited bonus codes which give you free or +reduced price access to GOG content (we’ll call them “Bonus Codesâ€). If you +receive Bonus Codes when you buy GOG content but later decide to return that +GOG content, then we think it’s fair for you to return the Bonus Codes too. +Therefore, we will terminate it or, if it has been redeemed for a GOG game, +that game will be removed from your account. + +### Direct to Account Distribution + +6.7 We have a direct to account distribution feature (we’ll call it ‘GOG +Direct to Account) where distribution platforms who partner with us would be +able to sell games or other content to you, where you could choose for that +game/content to be automatically activated within your GOG account, without +the need to redeem any codes. Just to be clear, the whole purchase process is +handled by the other platform, so in case of any issues with the purchase +process please speak with them directly. For this particular matter therefore, +we cannot offer you Our Voluntary Refund Policy (because GOG didn’t sell the +game/content). Of course, anything connected to our platform’s services is +still our responsibility. + +## 7\. REFUNDS AND RETURNS + +### Statutory refund rights + +7.1. If you are a resident of the European Union or other applicable +jurisdictions (excluding the USA), then you have the statutory right to +withdraw from a purchase of GOG content within 14 days of your purchase, +without giving a reason. To exercise the right of withdrawal, you should +inform us of your decision to withdraw from this contract by an unequivocal +statement (an email sent to support@GOG.COM, or a physical letter at an +address set out in Section 23 below). You may use the model withdrawal form +attached at the end of this Agreement, but you do not have to. To meet the +withdrawal deadline, it is sufficient for you to send your communication +concerning your exercise of the right of withdrawal before the withdrawal +period has expired. However, this does not apply where you have expressly +consented to the performance of the GOG content (which is digital content) +beginning immediately upon conclusion of the purchase process and have +acknowledged the loss of your withdrawal rights. + + + +7.2. Neither this nor any other part of this User Agreement affects your +statutory rights. In particular: + + + +a) For Australian Users: Our goods come with guarantees that cannot be +excluded under the Australian Consumer Law. You are entitled to a replacement +or refund for a major failure and compensation for any other reasonably +foreseeable loss or damage. You are also entitled to have the goods repaired +or replaced if the goods fail to be of acceptable quality and the failure does +not amount to a major failure. Details[here](https://support.gog.com/hc/en- +us/articles/360025857893?product=gog). + + + +b) For New Zealand Users: Neither this nor any other part of this User +Agreement excludes, restricts or modifies the application of any right or +remedy that cannot be so excluded, restricted or modified including those +conferred by the New Zealand Consumer Guarantees Act 1993. Under this Act are +guarantees which include that goods and services are of acceptable quality. If +this guarantee is not met there are entitlements to have the software remedied +(which may include repair, replacement or refund). If a remedy cannot be +provided or the failure is of a substantial character, the act provides for a +refund. + +### Our Voluntary Refund Policy + +7.3. We understand that sometimes a purchase doesn't turn out how you expected +and we want to be fair to GOG users. This is why on top of your statutory +refund rights (described in section 7.1.-7.2. above) we may offer you a +Voluntary Refund Policy described[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy). In some rare cases if we have +reasonable doubts regarding your refund request we may not apply the Voluntary +Refund Policy. In no case this will deprive you of any applicable statutory +refund rights. A sale is considered final once your refund rights expire +(unless we agree otherwise on a case by case basis). + +## 8\. VIRTUAL ITEMS AND VIRTUAL CURRENCY + + + +8.1 With certain GOG content you may be able to purchase or acquire virtual +items and/or virtual currency (we’ll call them “Virtual Goods†for short). +Virtual Goods are subject to this Agreement and in particular the following +default rules, unless there are specific rules for that GOG content (which +will prevail over these rules). + + + +8.2 Virtual Goods are digital items only with no cash-value or real world +existence and cannot be ‘bought’, ‘sold’, gifted, transferred or redeemed, +exchanged for other Virtual Goods, ‘real world’ money, goods, services or +items of monetary value. Trading Virtual Goods is prohibited (unless you are +specifically permitted to do so). Your right to use any Virtual Goods is +limited to a limited, nonexclusive, non-assignable, non-transferable, non- +sublicensable, revocable license to use them solely for your personal +entertainment and non-commercial use in the applicable GOG content. You have +no property interest or right or title in any Virtual Goods, which remains the +appropriate publisher’s property. Virtual Goods may be changed, amended or +reversed if necessary, including to enforce this Agreement. If necessary, +limits may be placed on the use of Virtual Goods (including transaction limits +and balance amounts). + + + +8.3 The existence of a particular offer for Virtual Goods is not a commitment +by us to maintain or continue to make the Virtual Goods or that offer +available in the future. The scope, variety and type of Virtual Goods that you +may obtain can change and we have the right to manage, modify and remove +Virtual Goods if we consider necessary for the ongoing operation of GOG or GOG +content or for other legitimate reasons, in which case we will have no +liability to you or anyone for the exercise of such rights. We will make +reasonable efforts to notify you of any such change and to explain the reason +for such change. + +## 9\. PATCHES, UPDATES AND CHANGES + + +9.1 Occasionally we may need to patch or update GOG services or GOG content +(for example to add or remove features or to resolve software bugs). We need +these rights in order to keep GOG running efficiently and safely. Not patching +or updating the GOG services or GOG content may result in inferior performance +of your version or incompatibility of your version with some of the GOG +services or GOG content features. Doing so, you are also risking not +installing important security updates. Our Partners may use GOG services to +roll out patches or updates for applicable GOG content. + +## 10\. OWNERSHIP OF GOG SERVICES AND INTELLECTUAL PROPERTY RIGHTS + +10.1 GOG services including (but not limited to) their graphics, computer +code, user interface, look and feel, audio, video, text, layout, databases, +data and all other content, and all legal and exploitation rights regarding +them are either owned by us or we license them from third parties. GOG content +is owned by its developers/publishers and licensed by us. All rights are +reserved except as we have explained in this Agreement. You may not use or +exploit any part of the GOG services or GOG content except as explained in +this Agreement. + + + +10.2. GOG respects the intellectual property rights of others. Please read +more[here](https://support.gog.com/hc/articles/16033687971613). + +## 11\. RULES FOR USING GOG SERVICES + +11.1 Please follow these rules regarding the GOG services and GOG content, and +any additional rules we link in 11.2 below. Please read these rules carefully +since failure to follow them (particularly those in relation to cheating) will +be considered a material breach of this Agreement, which could lead to +suspension or cancellation of your access to GOG services. Here are the rules: + + + +(a) Only use GOG services or GOG content for your personal enjoyment (for +example, don't use them to make money, for piracy or for political purposes). + + + +(b) Regarding GOG content, what you can do practically apart from playing the +games (like create derivative works of it) depends on what the GOG content +rights holder allows you to do (GOG can’t grant such rights). So please check +this with the rights holder directly (the first thing you should do though is +to check if they have a EULA and if so what it says). We also ask that you +make only genuine attempts to improve the GOG content. + + + +(c) Regarding GOG services (which includes GOG software), unless you have +prior GOG permission please don’t modify, merge, distribute, translate, +reverse engineer, decompile, disassemble, or create derivative works of them – +unless you’re allowed in this Agreement or by the law in your country. We’d +like to emphasize that you are free to contact us for permission to do these +things and we will review and respond to those requests in good faith. More +generally, at some point in the future we want to open client protocols to +make it easier for users to work with GOG data/software without any need for +reverse engineering or similar techniques. + + + +(d) Don't hack, harm, grief, interrupt or misuse GOG services or GOG content, +GOG users or GOG personnel or use them for any similar purpose. + + + +(e) Do not create, use, make available and/or distribute cheats, exploits, +automation software, robots, bots, mods, hacks, spiders, spyware, cheats, +scripts, trainers, extraction tools or other software that interact with or +affect GOG services or GOG content in any way (including, without limitation, +any unauthorized third party programs that intercept, emulate, or redirect any +communication between GOG or its partners and GOG services and/or any +unauthorized third party programs that collect information about GOG +services). + + + +(f) Don't interfere with the GOG or third party network software or other +software including via tunnelling, code injection, modifying or changing GOG +software, using any other similar software together with GOG services or GOG +content, through protocol emulation, or through creation or use of private +servers regarding GOG services or GOG content. Do not access or attempt to +access areas of GOG.COM, GOG GALAXY or GOG servers that have not been made +available to the public. + + + +(g) Don't do or say anything which is or may be considered racist, xenophobic, +sexist, defamatory or otherwise offensive or illegal (f.ex. exploiting minors, +encouraging violence, engaging in fraud). Be nice to each other please! + + + +(h) Don’t share, ‘buy’, ‘sell’, transfer, gift, lend, steal, misappropriate or +misuse GOG accounts. GOG keys/codes can only be gifted or transferred or used +in the ways permitted by GOG. If you have any questions or problems, contact +customer support. + + + +(i) We ask you to follow any applicable geographic or regional, language or +location-based restrictions, requirements or rules regarding GOG. + + + +(j) We ask you not to do anything in connection with GOG that infringes any +copyright, trademark, patent, trade secret, privacy, publicity, or other right +of others, such as images, photographs, sound files, text files, graphics +files, and any other material or information. + + + +11.2 In addition to the above, below is the list of additional terms that +apply to you when using GOG services. We do not want to repeat ourselves, but +it is important to remember that if you fail to follow them, it will be a +material breach of this Agreement, which could lead to a suspension or +cancellation of your access to GOG services. Here is the list: + + * GOG Code of Conduct ([link](https://support.gog.com/hc/articles/16033977811613)) + + * Infringing Content and Copyright Policy ([link](https://support.gog.com/hc/articles/16033687971613)). + + + +11.3 Every time we make a moderation decision resulting in restricting your +access to GOG services, whenever it is possible you should receive a statement +of reasons outlining why we have made this decision. If you do not agree with +the decision we have made, you have 6 months from the day that you have been +informed about the decision, to make a complaint. The details on how to make a +complaint should be available in your moderation decision. The description of +our complaint-handling system procedure is also available in the Infringing +Content & Copyright Policy +([here](https://support.gog.com/hc/articles/16033687971613)). + +## 12\. USER GENERATED CONTENT + +12.1 This section is about content (e.g. text, photos or links) which you make +available either to us or to other GOG users via GOG services (for example +through your profile picture or through messages to other GOG users). We'll +call this "User Generated Content". + + + +12.2 As far as we and you are concerned, you own any User Generated Content +but we need you to give us some limited rights over it so that we can actually +transmit it through GOG services. So, by posting User Generated Content you +give us a nonexclusive, irrevocable license to use, modify, reproduce, create +derivative works from, distribute, transmit, communicate and publicly +display/perform your User Generated Content in connection with GOG services. + + + +12.3 It is your responsibility to make sure that you have all necessary legal +rights before you use User Generated Content and for checking they are safe to +use – we can't know that ourselves, and we can't check it for you, so we have +to rely on you. + + + +12.4. However, we have the right (but not the obligation) to review and if +appropriate or legally necessary to remove any User Generated Content which is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. If +you find that any such content has been posted on GOG services, please let us +know. We ask you to read our Infringing Content and Copyright Policy +([link](https://support.gog.com/hc/articles/16033687971613)), where we explain +our procedure for reporting infringing content. If you still feel your case is +not fully resolved after our internal procedure, you have access to an out-of- +court dispute settlement - more on this in Section 20 below. + +## 13\. FEEDBACK OR SUGGESTIONS + +13.1 You’re welcome to give us feedback and suggestions to improve GOG +services and we really value them all. However, just so we’re clear, we don’t +have to use or accept them and we won’t owe you anything (financially or +otherwise) regarding them. + +## 14\. USING GOG CONTENT IN FAN WORK + +14.1 For fan work (e.g. works like fan mods, machinima, parodies, homages, +'Let's Play' or other videos or artwork), you need to check with the content +owner (e.g. the developer or publisher) if they are OK with it and if so you +should get permission from them. The reason is simple – the GOG content is the +property of the respective owner, not ours. + +## 15\. THIRD-PARTY CONTENT AND EXTERNAL SERVICES + +15.1 You might get links to third-party websites or content through GOG +services which aren’t connected to us. Using them is up to you – we’re not +responsible for them, we can't promise they will work, what they'll be like or +if they're free. + + + +15.2 You can also use your GOG account to get easy access to some external, +GOG approved partner services, e.g. The Witcher games and sites from our +sister company CD PROJEKT RED. They will have their own terms and conditions +which you will need to agree and follow. Just to be clear: using these +services is all optional and up to you. You have the power! + +## 16\. WARRANTIES AND LIMITATION OF LIABILITY REGARDING GOG SERVICES + +16.1 We warrant that: (i) we have the right to enter this Agreement and to +grant you the license to use GOG services in section 2.1; and (ii) we will +take reasonable care with the GOG services and your use of them; and (iii) we +will use reasonable endeavors to comply with applicable laws in performing our +obligations to you under this Agreement. + + + +16.2. Your representations and warranties. You represent and warrant that you +have the full power and ability to enter into this Agreement and will fully +follow its terms. You also represent and warrant that any User Generated +Content, which you transmit via GOG services does not infringe upon the +intellectual property rights of any third party. You further represent and +warrant that you will not use or contribute User Generated Content that is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. + + + +16.3. We work hard to try to make GOG content work on your systems but we only +have limited time to carry out tests and we don't always get everything right. +Therefore, we can't accept any liability or responsibility for GOG content +except where required by law (see 7.1.-7.2 above). We are also not responsible +for anything that happens to GOG.COM or GOG services which is outside of our +control and we do not guarantee GOG services will work 100% of the time. +However, don't forget you may be entitled to GOG content return and refund if +it has technical issues - see section 7.3. + +## 17\. TERMINATION + +17.1 Your right to terminate the Agreement. You may terminate this Agreement +at any time and without giving any reason by completely ceasing to use GOG +services. If you would like us to delete your account please contact our +Support Team [ here ](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog) or simply by sending an email +request to privacy@gog.com. Termination will not affect already existing +rights or obligations of us or you. + + + +17.2. Our right to terminate the Agreement. If you materially breach this +Agreement, we reserve the right to suspend or cancel your access to GOG +services and GOG content. By material breach of the Agreement we mean a +serious breach which could cause significant harm to GOG, GOG users, as well +as, in particular breach of the provisions of section 11 above or GOG Code of +Conduct. If we suspend or cancel your access to GOG services or GOG content +we'll take reasonable steps to contact you to explain why we have done this +and what (if anything) you can do as a result. + + + +17.3 It seems very unlikely, but if we have to stop providing access to GOG +services and GOG content permanently (not because of any breach by you), we +will try to give you at least sixty (60) days advance notice by posting a note +on www.GOG.COM and sending an email to every registered user – during that +time you should be able to download any GOG content you purchased. + +## 18\. FORCE MAJEURE + +18.1 Neither you nor us will be liable for any failure to perform any +obligation under this Agreement or to provide access to GOG services and GOG +content if that failure is caused by the happening of any unforeseen event +beyond your or our reasonable control including without limitation, Internet +outages, communications outages, fire, flood, war or act of God. + +## 19\. GOVERNING LAW + +### For users resident in the European Union and elsewhere in the world (but +not the USA): + +19.1 You and we agree that your use of GOG services and GOG content and this +Agreement will be governed by and interpreted according to the laws of the +Republic of Poland and that any dispute regarding this Agreement will be heard +non-exclusively by the courts of the Republic of Poland. In any legal claim +under this Agreement, the side which wins will be entitled to its legal fees +and expenses. + + + +19.2. The above choice of governing law and jurisdiction is subject to any +mandatorily applicable principles of consumer protection or other law in your +jurisdiction of residence which would not otherwise be available. + +### For users in the USA only: + +19.3 You and we agree that your use of GOG services and GOG content, and this +Agreement, will be deemed to be entered into in Los Angeles, California and +governed by and interpreted according to the laws of the State of California, +USA (and, if applicable, US federal law). Any legal claim by you against GOG +will be made exclusively in any state or federal court located in Los Angeles, +California, which will have subject matter jurisdiction regarding the dispute +between you and us and therefore we both consent to the exclusive jurisdiction +of those courts. In any legal claim under this Agreement, the side which wins +will be entitled to its legal fees and expenses. + +## 20\. CUSTOMER SUPPORT AND DISPUTE RESOLUTION + +20.1.If you have concerns, claims or issues with us, we hope we can resolve +them quickly and amicably. Please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). We will make reasonable and good +faith efforts to resolve any dispute between us informally. We undertake to +answer any claim within 14 days. + + + +20.2. If it is not resolved during this time, the next steps depend on where +you live. If you live within the EU you may submit your legal claims to the +online dispute resolution platform operated and provided by the European +Commission which can be accessed via http://ec.europa.eu/consumers/odr/ in +order to reach an out of court settlement or initiate a lawsuit. You may also +choose to resolve your dispute through any out-of-court dispute settlement +body certified by your country’s Digital Services Coordinator. + + + +20.3. If you live in the USA or the rest of the world (but not the EU) then +please contact us at legal@gog.com. + +## 21\. OTHER LEGAL STUFF + +21.1 If any part of this Agreement is found not to be legally enforceable, +this will not affect any other part of it. + + + +21.2 This Agreement (including any GOG additional terms referenced in it) +constitutes the entire agreement between you and us and supersedes any earlier +oral or written agreements. If you disagree with this, please contact us as +soon as possible after you start using GOG services at legal@gog.com since +otherwise this will be binding on you after a reasonable time period (usually +30 days). + + + +21.3 This Agreement governs our relationship with you (and vice versa). It +does not create any rights for anyone else. + + + +21.4 Please remember we are subject to various laws and we may be required to +comply with law enforcement or other legal requirements. + + + +21.5 If there is a reorganization, sale or merger of GOG then we may need to +work with relevant third parties to transfer or merge your GOG account. + + + +21.6. You and we agree that the UN Convention on Contracts for the +International Sale of Goods does not apply to this Agreement. + + + +21.7 We can assign, subcontract or transfer this Agreement to a third party or +another member of our group if necessary for the support of GOG, as part of +any reorganization or merger or for other business reasons. We will notify you +if this happens. + + + +21.8. If you are a European Union citizen, then please be aware that GOG has +enabled cross-border portability on free and paid content pursuant to +Regulation (EU) 2017/1128 of the European Parliament and of the Council of 14 +June 2017 on cross-border portability of online content services in the +internal market, but this is subject to any other legal requirements on GOG +including regarding IP protection and may also be subject to any requirements +of developer and publisher partners of GOG. + +## 22\. CHANGES TO THIS AGREEMENT + +22.1 We may change this Agreement if we think it's necessary, e.g. for legal +reasons or to reflect changes in GOG services or GOG content. If so, we will +make the changed Agreement available online at +https://support.gog.com/hc/articles/212632089 and (if you have a GOG account) +we will email you to let you know about any significant changes. + + + +22.2 Any changes to the Agreement will come into force within 30 days of their +announcement online. In the meantime, you're welcome to contact us at +legal@GOG.COM if you have specific questions about the changes. + + + +22.3 If you don't agree to those changes (regardless of whether you email us), +then unfortunately we must ask you to cease using GOG services and GOG +content. We're sorry we have to say that, but we hope you'll appreciate that +for GOG services to work properly we need to have everyone using it under the +same rules instead of different people having different rules. That's why we +encourage you to get in contact if you have queries or concerns. + + + +22.4 Just so you know, we'll never just make a bunch of changes to this +Agreement, not tell you what they are and force you to agree to changes you +don't understand before you can use GOG services! + +## 23\. OUR CONTACT DATA + +23.1. If you have any complaint concerning GOG account, GOG services, or +simply you would like to contact us, here are our contact details: + +Name: GOG sp. z o.o. +Registered Office: Ul. JagielloÅ„ska 74, 03-301 Warsaw, Poland +Registered at the District Court for Warsaw, 14th +Commercial Division of the National Court Register. +Registration Number 0000029514 +Tax number VAT ID (NIP) PL 113-21-77-807 +Share capital: PLN 135.750,00 PLN + +Single point of contact for authorities: +GOG Legal Team +legal@gog.com +Languages we communicate in: English, Polish +Single point of contact for recipients of GOG services: +GOG Support Team +support@gog.com +We mostly speak English and Polish, but will do our best to assist you in any +language that GOG is available in. +Last update (effective date): 17th February 2024 +See the previous version of the User +Agreement[here](https://support.gog.com/hc/articles/212632089). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/blackgate/tmp/EULA200.png b/info.exult.exult/data/blackgate/tmp/EULA200.png new file mode 100644 index 0000000..e39d170 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/EULA200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/EULAAccepted.png b/info.exult.exult/data/blackgate/tmp/EULAAccepted.png new file mode 100644 index 0000000..b02c69d Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/EULAAccepted.png differ diff --git a/info.exult.exult/data/blackgate/tmp/EULAAccepted200.png b/info.exult.exult/data/blackgate/tmp/EULAAccepted200.png new file mode 100644 index 0000000..87e60e9 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/EULAAccepted200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/EULAShow.png b/info.exult.exult/data/blackgate/tmp/EULAShow.png new file mode 100644 index 0000000..8cfa974 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/EULAShow.png differ diff --git a/info.exult.exult/data/blackgate/tmp/EULAShow200.png b/info.exult.exult/data/blackgate/tmp/EULAShow200.png new file mode 100644 index 0000000..5ebf91f Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/EULAShow200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/EULA_bkg.png b/info.exult.exult/data/blackgate/tmp/EULA_bkg.png new file mode 100644 index 0000000..1756e61 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/EULA_bkg.png differ diff --git a/info.exult.exult/data/blackgate/tmp/EULA_de-DE.txt b/info.exult.exult/data/blackgate/tmp/EULA_de-DE.txt new file mode 100644 index 0000000..52f3b51 --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/EULA_de-DE.txt @@ -0,0 +1,1702 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM Benutzervereinbarung + +## 1\. ÜBER DIESE VEREINBARUNG + +1.1 Diese Vereinbarung stellt einen Vertrag zwischen Dir (wir nennen Dich im +Folgenden einfach "Du") und GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Warschau, +Polen (wir nennen uns im Folgenden "GOG" oder einfach "uns") und gilt für +www.GOG.COM, Dein GOG-Nutzerkonto, die GOG GALAXY-Anwendung (einschließlich +GOG GALAXY Store), alle Spiele oder Videos oder andere Inhalte oder +Dienstleistungen, die Du über uns kaufen oder auf die Du zugreifen kannst, die +GOG-Webforen, den GOG-Kunden- und technischen Support und andere +Dienstleistungen, die wir Dir anbieten (wir nennen all dies kurz "GOG- +Dienste"). An dieser Stelle informieren wir Dich über Deine Rechte und +Pflichten als Nutzer von GOG-Diensten. + + + +1.2. Es können zusätzliche Bedingungen für GOG-Dienste gelten, die wir in +diesem Fall zu Deiner Annahme mitteilen werden. Wenn Du z.B. GOG GALAXY nutzen +möchtest, werden die entsprechenden Bedingungen zur Annahme bereitgestellt, +bevor Du mit der Nutzung dieser Dienste anfangen kannst. + +1.3 Wenn wir über Spiele, In-Game-Inhalte, virtuelle Gegenstände oder Währung, +GOG-Videos, bzw. andere Inhalte oder Dienstleistungen sprechen, die Du über +GOG-Dienste kaufen oder auf die Du durch die GOG-Dienste zugreifen kannst, +nennen wir sie einfach "GOG-Spiele", bzw. "GOG-Videos" und wenn wir über sie +insgesamt sprechen, heißen sie "GOG-Inhalte". + +1.4 Dieses Dokument sollte nicht all zu lang werden, aber denke daran, dass Du +mit der Annahme unserer Nutzungsbedingungen auch Dein Einverständnis zu +Folgendem erteilst: + + * unsere [ Datenschutzrichtlinie ](https://support.gog.com/hc/articles/212632109) \- in der erläutert wird, welche Daten wir von Dir erfassen und wie wir diese schützen, + + * unser[GOG-Verhaltenskodex](https://support.gog.com/hc/articles/16033977811613), der eine Reihe von Regeln enthält, die Du als Teil unserer Community befolgen musst, + + * die Regelungen über[Rechtsverletzende Inhalte und Urheberrechtsbestimmungen](https://support.gog.com/hc/articles/16033687971613), die beschreiben, wie Du rechtswidrige Inhalte auf GOG melden kannst und was passiert, wenn Du dies tust. + + + +1.5 GOG arbeitet mit vertrauenswürdigen Partnern zusammen, wie beispielsweise +mit unserem verbundenen Unternehmen CD PROJEKT S.A., mit Entwicklern und +Publishern, mit Zahlungsanbietern, Anbietern von Kundendienstsoftware und +sonstigen Partnern (zusammenfassend „Partner“). Mehr hierzu weiter unten in +dieser Vereinbarung. + + + +1.6 Wenn Du das 18. Lebensjahr vollendet hast, heißen wir Dich bei GOG +herzlich willkommen! Bist Du zwischen 16 und 18 Jahre alt, musst Du erst Deine +Eltern oder Deinen Vormund bitten, diese Vereinbarung durchzulesen und ihr in +Deinem Namen zuzustimmen (da in manchen Ländern Personen erst ab einem +bestimmten Alter Verträge wie diese Vereinbarung eingehen können). Falls Du +noch nicht 16 bist, kannst Du kein GOG-Konto erstellen oder GOG-Dienste +nutzen, weil wir rechtlich nicht dazu in der Lage sind, Daten von Kindern ohne +Zustimmung ihrer Eltern oder eines Vormundes zu verwalten (aber Deine Eltern +und Vormünde dürfen sich gerne selbst anmelden). + +## 2\. NUTZUNG VON GOG-DIENSTEN UND GOG-INHALTEN + +2.1 Wir gewähren Dir und anderen GOG-Nutzern das persönliche Recht (auch unter +dem juristischen Begriff „Lizenz“ bekannt), GOG-Dienste zu nutzen, um GOG- +Inhalte herunterzuladen, auf sie zuzugreifen und/oder zu streamen (je nach +Inhalt) und zu nutzen. Diese Lizenz gilt nur für Deinen persönlichen Gebrauch. +Unter bestimmten Umständen, die wir nachfolgend erläutern werden, können wir +Dir diese Lizenz entziehen oder sie vorübergehend außer Kraft setzen. + + + +2.2 Wenn Du GOG-Spiele kaufst, nutzt oder installierst, musst Du unter +Umständen zusätzlichen Vertragsbedingungen des Entwicklers oder Publishers des +Spiels zustimmen (z. B. der für ein bestimmtes Spiel geltenden +Endbenutzerlizenzvereinbarung). Sollte eine Unstimmigkeit zwischen diesen +sogenannten „EULAs“ und dieser Vereinbarung bestehen, hat diese Vereinbarung +Vorrang. + + + +2.3 Bei GOG-Videos kannst Du außerdem gekaufte Videoinhalte streamen oder +herunterladen, um sie auf die von Dir gewünschte Weise anzusehen. + + + +2.4 Die Verwendung bestimmter Skripte Dritter wird empfohlen, um GOG- +Funktionen in vollem Umfang nutzen zu können. Deren Verwendung ist zwar +optional, doch ohne diese Skripte können wir die volle Leistung unserer +Dienste nicht garantieren. + + + +2.5 Ein paar Worte zu GOG GALAXY, unserer (optionalen) Anwendung, die nicht +nur den Kauf von und den Zugriff auf GOG-Inhalte ermöglicht, sondern auch +coole Funktionen wie eine einheitliche Spielebibliothek und eine +plattformübergreifende Freundesliste, Online-Multiplayer, Achievements, +plattformübergreifenden Chat, Protokollierung der Spielzeit, Cloud-Saves und +Game-Overlay bietet. Mehr dazu erfährst Du[hier](https://www.gog.com/galaxy). + +2.6 Bei manchen Dienstleistungen von GOG verwenden wir Empfehlungen, um Dir +solche Inhalte zu präsentieren, die Dich am wahrscheinlichsten interessieren. +Wo wir die Empfehlungen einsetzen und wie sie funktionieren, erfährst +Du[hier](https://support.gog.com/hc/articles/16034228157213), einschließlich +der von uns verwendeten Hauptparameter und wie diese beeinflusst werden +können. + + + + + + + + +## 3\. GOG-KONTEN + +3.1 Um GOG-Inhalte bei GOG-Diensten zu kaufen, und manchmal um GOG-Inhalte zu +nutzen, bei denen der Partner ein GOG-Konto voraussetzt, benötigst Du ein GOG- +Konto. Dazu musst Du ein (verschlüsseltes und von uns nicht einsehbares) +Passwort und einen Benutzernamen anlegen; außerdem benötigen wir zu +Identifikationszwecken Deine E-Mail-Adresse. Sorge bitte dafür, dass Deine +Anmeldedaten gesichert sind und Dein Konto ordnungsgemäß verwendet wird. In +Deinen GOG-Kontoeinstellungen kannst Du Dein Wohnsitzland, Dein Geburtsdatum +und einen Avatar festlegen. In unserer Datenschutzrichtlinie findest Du +weitere Einzelheiten zu den von uns über Dich gesammelten Daten sowie unserer +Verwendung und der zu ihrer Sicherung ergriffenen Maßnahmen. Du findest +sie[hier](https://support.gog.com/hc/articles/212632109-Datenschutzrichtlinie). + + + +3.2 Du kannst Dein GOG-Konto benutzen, um ein öffentliches und für andere +zugängliches Profil zu erstellen oder Dich mit anderen GOG-Nutzern in +Verbindung zu setzen. Bitte gehe vernünftig vor und denke daran, dass Du für +Deine Handlungen allein verantwortlich bist. + +3.3 Dein GOG-Konto und Deine GOG-Inhalte sind personenbezogen und können nicht +an andere Personen weitergegeben, verkauft, verschenkt oder übertragen werden. +Der Zugriff auf diese und deren Nutzung unterliegen der [ +Datenschutzrichtlinie ](https://support.gog.com/hc/articles/212632109) und dem +[ Verhaltenskodex ](https://support.gog.com/hc/articles/16033977811613) von +GOG, die bei Bedarf aktualisiert oder geändert werden können. + +3.4. Der Zugriff auf und die Nutzung von Spielen, die auf anderen Plattformen +erworben wurden (d. h. mit dem so genannten "Keyless Access"), einschließlich +ihrer Mindestsystemanforderungen, unterliegt den jeweiligen Richtlinien der +Drittanbieterplattformen und (gegebenenfalls) zusätzlichen Vertragsbedingungen +mit dem Entwickler/Publisher des Spiels (z. B. kannst Du aufgefordert werden, +einem spielspezifischen Endbenutzer-Lizenzvertrag zuzustimmen). Dazu ist +möglicherweise ein Konto bei einer Drittanbieterplattform erforderlich. Diese +Plattformen können Patches oder Updates für Ihre gekauften Spiele +bereitstellen. + +## 4\. SYSTEMANFORDERUNGEN + +4.1 Da Du über GOG Zugriff auf viele verschiedene Dienste und Spiele hast, die +zu unterschiedlichen Zeiten und für verschiedene Plattformen produziert +wurden, können wir keine für alle GOG-Dienste oder GOG-Inhalte geltenden +Systemanforderungen nennen. Bitte stelle sicher, dass Dein Computer und Deine +Internetverbindung gut genug sind, um die GOG-Dienste zu nutzen und GOG-Spiele +und Videos zu spielen. + + + +4.2 Für die Nutzung eines GOG-Spiels benötigst Du einen Computer mit Maus und +Tastatur (Touchscreen wird nicht unterstützt), ein passendes Betriebssystem +(die Angabe dazu findest Du auf der entsprechenden GOG-Produktseite), auf dem +alle wichtigen Updates und Servicepakete installiert sind. Alle GOG-Spiele +sollten auf einem Computer installiert werden, der mindestens den auf der GOG- +Produktseite genannten Mindestanforderungen für Hard- und Software entspricht. +GOG-Spiele sind nicht für die Verwendung auf virtuellen Maschinen getestet, +und eine entsprechende Nutzung wird von uns auch nicht unterstützt. + + + +4.3 Sorge bei GOG-Videos dafür, dass Deine Videosoftware die auf der GOG- +Produktseite genannten Videoformate unterstützt. + + + +4.4 Wenn Du Fragen zu Systemanforderungen hast, schreib uns +bitte[hier](https://support.gog.com/hc/requests/new?category=info). Nur um es +klarzustellen: Du musst dafür sorgen, dass Du einen Internetanschluss besitzt, +mit dem Du die gekauften GOG-Spiele oder GOG-Videos herunterladen oder GOG- +Videos streamen kannst, und sicherstellen, dass Dein System dafür geeignet +ist, GOG-Spiele auszuführen und GOG-Videos anzusehen. + +## 5\. BETAS + +5.1 Im Zuge der Weiterentwicklung von GOG können wir Dir optionalen Zugang zu +"Beta"-Versionen von GOG-Software oder -Services (z.B. neue Versionen der GOG +GALAXY-Anwendung, die vor ihrer allgemeinen Veröffentlichung zur Verfügung +gestellt werden) oder GOG-Inhalten anbieten. + +Hierbei gelten folgende Regeln: + + + +(a) Wir (beziehungsweise der entsprechende Publisher/Partner) legen die +Bedingungen und Anforderungen für Deinen Betazugang fest. Wir entscheiden in +eigenem Ermessen, ob wir eine Beta anbieten und unterstützen, und wer diese +nutzen darf. + + + +(b) Du musst eventuell einen Registrierungsvorgang oder andere Anforderungen +durchlaufen, um Zugriff zur Beta zu erhalten. Dazu kann auch gehören, dass Du +bestimmte Kriterien erfüllen musst. + + + +(c) Betas werden zeitlich begrenzt sein und eventuell gelten zusätzliche +vertragliche Bedingungen. + + + +(d) Im Rahmen der Beta werden Server/Spielfortschritt/Inhalte möglicherweise +vorübergehend oder dauerhaft gelöscht, zurückgesetzt oder geändert. + + + +(e) Die Beta unterliegt unter Umständen der Geheimhaltung (in diesem Fall +wirst Du im Voraus darüber benachrichtigt). + + + +(f) Du wirst womöglich dazu eingeladen, an einem Feedbackvorgang bezüglich der +Beta teilzunehmen. Die Teilnahme steht Dir frei, aber wir wären Dir dafür sehr +dankbar. + +g) Die Betaversion ist für Deinen persönlichen Gebrauch bestimmt und darf +nicht verkauft, verliehen oder anderweitig an andere Personen weitergegeben +werden. + +(h) Der Sinn des Betazugangs liegt darin, dass Du etwas Neues ausprobieren +kannst. Wir weisen Dich aber darauf hin, dass die Inhalte noch nicht fertig +sind. Betas werden daher in ihrem aktuellen Zustand zur Verfügung gestellt, +ohne jegliche Zusicherungen oder Haftbarkeit unsererseits für den Fall, dass +die Beta unvollständig ist, nicht vollständig funktioniert oder Probleme +auftreten. Betas umfassen nicht unbedingt alle Spielinhalte. Spielfunktionen +können während der Beta geändert, bearbeitet oder entfernt werden. + +## 6\. BEZAHLUNG VON GOG-INHALTEN UND RÜCKERSTATTUNGEN + +### Bezahlung von GOG-Inhalten + +6.1 Wenn Du Dich für ein GOG-Spiel, ein GOG-Video oder einen anderen GOG- +Inhalt entschieden hast, musst Du normalerweise dafür bezahlen, bevor Du +darauf zugreifen kannst (obwohl wir auch einige kostenlose Inhalte anbieten!). +Du kannst verschiedene Zahlungsmöglichkeiten nutzen: (i) mit einer gültigen +EC- oder Kreditkarte; oder (ii) mit PayPal oder einem anderen autorisierten +Zahlungsanbieter bezahlen. Sorge dafür, dass Deine Zahlungsdaten sicher sind. + +6.2 Wenn Du eine Zahlungsmethode verwendest, um GOG-Inhalte zu kaufen, +verlassen wir uns auf Deine Zusage, dass Du diese Methode auch tatsächlich +einsetzen kannst. Du bist für alle Käufe verantwortlich, die über Dein GOG- +Konto oder Deine bevorzugte Zahlungsmethode getätigt werden, und erklärst Dich +mit den entsprechenden Preis-, Zahlungs- und Abrechnungsrichtlinien +einverstanden, die Dir zum Zeitpunkt des Kaufs mitgeteilt werden. Alle +Zahlungen sind nicht erstattungsfähig und nicht übertragbar, es sei denn, dies +ist in dieser Vereinbarung ausdrücklich vorgesehen. + +6.3 Du hast immer die Möglichkeit, für GOG-Inhalte in US- Dollar zu bezahlen. +Wenn Du jedoch in Ländern lebst, in denen Deine Landeswährung unterstützt wird +(weitere Informationen findest Du in unserem Support-Bereich), kannst Du in +Deiner Landeswährung bezahlen. Wenn Du zum Bezahlen nicht die Währung Deines +Wohnsitzlandes verwendest, fallen eventuell Gebühren für die +Währungsumrechnung an, außerdem können einige Banken noch weitere +Transaktionsgebühren berechnen. + +6.4. Alle Preise sind auf der Produktkatalogseite ersichtlich. Die Preise +verstehen sich inklusive Steuern wie z.B. Mehrwertsteuer, falls zutreffend. Du +solltest auch damit rechnen, dass einige Umsatzsteuern/VAT beim Checkout auf +den Preis aufgeschlagen werden, falls dies in Deinem Land gesetzlich +vorgeschrieben ist (z.B. in den USA oder Kanada). + + + +GOG-Geldbeutel + + + +6.5 GOG bietet seinen Nutzern eine digitale Guthabenverwaltung namens „GOG- +Geldbeutel“ in Verbindung mit dem Benutzerkonto an. Du kannst Guthaben aus dem +GOG-Geldbeutel verwenden, um GOG-Inhalte zu kaufen. Guthaben kann auf zwei +Arten hinzugefügt werden: (i) mit Deiner gewählten Bezahlmethode oder (ii) von +uns im Rahmen unserer freiwillige Rückerstattungsrichtlinie +([hier](https://support.gog.com/hc/articles/360006129837)). In diesem Fall +können wir Dir eine Rückerstattung in den GOG-Geldbeutel anbieten, die Du für +ein neues GOG-Spiel oder andere GOG-Inhalte verwenden kannst. Der GOG- +Geldbeutel unterliegt den Regeln, die [ hier +](https://support.gog.com/hc/articles/360001941953-FAQ-GOG-Wallet) auf unserer +Seite zum GOG-Geldbeutel aufgeführt sind. + + + +GOG-Bonus-Codes + +6.6. Wir können auch Bonus-Codes ausgeben, diese sind in der Regel zeitlich +begrenzt. Mit ihnen erhältst Du kostenlosen oder vergünstigten Zugang zu GOG- +Inhalten (wir nennen sie "Bonus-Codes"). Wenn Du beim Kauf von GOG-Inhalten +Bonus-Codes erhalten hast, Dich jedoch später dazu entschließt, diese GOG- +Inhalte zurückzugeben, dann halten wir es für fair, dass Du auch die Bonus- +Codes zurückgibst. Aus diesem Grund werden wir diese ungültig machen oder, +falls sie für ein GOG-Spiel eingelöst wurden, wird dieses Spiel von Deinem +Konto entfernt. + +Direct-to-Account-Verteilung + + + +6.7 Wir haben ein Direct-to-Account-Verteilungsfeature ("GOG-Direct-to- +Account" genannt), durch das Vertriebsplattformen, die mit uns +zusammenarbeiten, Spiele oder andere Inhalte an Dich verkaufen können, und Du +auswählen kannst, dass selbige automatisch und ohne das Einlösen von Codes in +Deinem GOG-Konto aktiviert werden. Die komplette Kaufabwicklung wird dabei von +Drittparteien übernommen – bei Problemen mit dem Kauf musst Du Dich also +direkt an diese wenden. In dieser Angelegenheit können wir Dir daher keine +freiwillige Rückerstattung anbieten (weil GOG das Spiel/die Inhalte nicht +verkauft hat). Für alles, was mit den Diensten unserer Plattform zu tun hat, +sind wir natürlich weiterhin verantwortlich. + +## 7\. RÜCKERSTATTUNGEN UND RÜCKGABE + +7.1. Falls Du Deinen Wohnsitz in der Europäischen Union oder einem anderen +anwendbaren Rechtsbereich (mit Ausnahme der USA) hast, bist Du gesetzlich +berechtigt, von einem Kauf von GOG-Inhalten innerhalb von 14 Tagen nach Deinem +Kauf ohne Angabe von Gründen zurückzutreten. Um das Recht auf Widerruf geltend +zu machen, musst Du uns über Deinen Entschluss, diesen Vertrag zu widerrufen, +mittels einer eindeutigen Erklärung (z. B. einer E-Mail an support@GOG.COM +oder einem persönlichen Schreiben an die in Abschnitt 23 angegebene Adresse) +informieren. Du kannst dazu das beigefügte Muster-Widerrufsformular verwenden, +bist aber nicht dazu verpflichtet. Um die Widerrufsfrist einzuhalten, reicht +es aus, dass Du Deine Mitteilung über die Ausübung des Widerrufsrechts vor +Ablauf der Widerrufsfrist absendest. Allerdings gilt dies nicht, wenn Du +ausdrücklich zugestimmt hast, dass die Leistung des GOG-Inhalts (bei dem es +sich um digitalen Inhalt handelt) unmittelbar nach Abschluss des Kaufvorgangs +beginnt und Du dem Verlust Deines Widerrufsrechts zugestimmt hast. + +7.2 Weder dies noch jedweder andere Teil der Nutzungsbedingungen beschränken +Deine gesetzlich festgelegten Rechte. Im Einzelnen: + + + +a) Für Nutzer aus Australien: Das australische Verbraucherrecht räumt Dir +weitreichende Rechte ein, die nicht einschränkbar sind. Du hast das Recht auf +Ersatz oder Erstattung im Falle eines größeren Mangel und auf Erstattung für +jeglichen vorhersehbaren Verlust oder Schaden. Du hast außerdem das Recht, die +Produkte repariert oder ersetzt zu bekommen, wenn sie keine akzeptable +Qualität aufweisen und der Mangel keinem größeren Mangel entspricht. +Details[hier](https://support.gog.com/hc/en- +us/articles/360025857893?product=gog); + + + +b) Für Nutzer aus Neuseeland: Weder dieser noch jeglicher anderer Teil der +Nutzungsbedingungen schließt aus, beschränkt oder verändert die Anwendung +eines Rechts oder Rechtsmittels, das nicht ausgeschlossen, beschränkt oder +verändert werden kann und dessen Ausschluss, Beschränkung oder Veränderung +durch den Neuseeland-Verbraucher-Garantie-Akt 1993 abgedeckt ist. Dieser Akt +garantiert, dass Produkte und Dienste eine akzeptable Qualität aufweisen. +Sollte diese Garantie nicht gewährleistet sein, hast Du ein Recht auf Abhilfe, +dieses Recht kann Reparatur, Austausch oder Erstattung beinhalten. Sollte +keine Abhilfe nicht angeboten werden oder der Mangel nicht behebbar sein, wird +Dir eine Erstattung garantiert. + + + +Unsere freiwillige Rückerstattungsrichtlinie + + + +7.3 Wir verstehen, dass ein Kauf manchmal nicht so abläuft, wie Du es erwartet +hast, und wir wollen gegenüber den GOG-Nutzern fair sein. Aus diesem Grund +bieten wir Dir zusätzlich zu den gesetzlichen Rückerstattungsrechten +(beschrieben in Abschnitt 7.1.- 7.2. oben) eine freiwillige +Rückerstattungsrichtlinie an, die [ hier +](https://support.gog.com/hc/articles/360006129837) beschrieben wird. In +einigen seltenen Fällen, wenn wir begründete Zweifel an Deinem +Rückerstattungsantrag haben, können wir die freiwillige Rückerstattungsanfrage +ablehnen. In keinem Fall werden dadurch die gesetzlichen +Rückerstattungsansprüche beeinträchtigt. Ein Verkauf gilt als endgültig, +sobald Deine Rückerstattungsrechte abgelaufen sind (es sei denn, wir +vereinbaren von Fall zu Fall etwas anderes). + +## 8\. Virtuelle Gegenstände und virtuelle Währungen + +8.1 Manche GOG-Inhalte ermöglichen Dir unter Umständen, virtuelle Gegenstände +und/oder virtuelle Währungen (zusammenfassend „virtuelle Güter“) zu kaufen +oder zu erhalten. Virtuelle Güter unterliegen dieser Vereinbarung und +insbesondere den folgenden Grundregeln, außer, wenn durch spezifische Regeln +für den jeweiligen GOG-Inhalt andere Bestimmungen vorgegeben werden (diese +haben Vorrang vor den vorliegenden Regeln). + + + +8.2 Virtuelle Güter sind digitale Güter, die über keinen Gegenwert in Bargeld +oder physischen Gegenständen verfügen. Diese Güter können nicht gekauft, +verkauft, verschenkt, übertragen oder eingelöst werden, weder gegen andere +virtuelle Güter, noch gegen echtes Geld, physische Güter, Dienste oder +sonstige Gegenstände mit Geldwert. Der Handel mit virtuellen Gütern ist +verboten (außer, er wurde Dir speziell erlaubt). Dein Recht zur Nutzung +jeglicher virtuellen Güter ist beschränkt auf eine begrenzte, nicht exklusive, +nicht übertragbare, nicht unterlizenzierbare, widerrufliche Lizenz für Deine +persönliche Unterhaltung und für nicht kommerzielle Zwecke im Rahmen des +betreffenden GOG-Inhalts. Du hast kein Eigentum, keine Rechte und keinen +Anspruch auf virtuelle Güter; sie verbleiben im Eigentum des jeweiligen +Publishers. Virtuelle Güter können bei Bedarf geändert, angepasst oder +aufgehoben werden, unter anderem auch zur Durchsetzung dieser Vereinbarung. +Wenn nötig, können der Nutzung von virtuellen Gütern auch Beschränkungen +auferlegt werden (einschließlich Einschränkungen von Transaktionen und +Guthaben). + + + +8.3 Die Existenz eines bestimmten Angebots von virtuellen Gütern stellt keine +Verpflichtung unsererseits dar, diese virtuellen Güter in Zukunft weiter +anzubieten. Umfang, Auswahl und Art der virtuellen Güter, die Du erhalten +kannst, können sich ändern und wir haben das Recht, diese zu verwalten, zu +bearbeiten und zu entfernen, wenn wir dies für den fortlaufenden Betrieb von +GOG oder GOG-Inhalten oder aus sonstigen rechtmäßigen Gründen für nötig +halten. In solchen Fällen entstehen keine Verpflichtungen unsererseits an Dich +oder Dritte, wenn wir von unserem Recht Gebrauch machen. Wir werden uns +angemessen bemühen, Dich über alle solchen Veränderungen zu informieren und +die Gründe für eine solche Änderung zu erklären. + + + + + + +## 9\. PATCHES, AKTUALISIERUNGEN UND ÄNDERUNGEN + +9.1 Gelegentlich müssen wir GOG-Dienste oder GOG-Inhalte mit Patches oder +Updates ergänzen (z.B. um Funktionen hinzuzufügen oder zu entfernen oder um +Softwarefehler zu beheben). Wir benötigen diese Rechte, um GOG effizient und +sicher betreiben zu können. Werden GOG-Dienste oder GOG-Inhalte nicht gepatcht +oder aktualisiert, kann dies zu einer schlechteren Leistung Deiner Version +oder zu einer Inkompatibilität Deiner Version mit einigen Funktionen der GOG- +Dienste oder GOG-Inhalte führen. Damit riskierst Du auch, dass wichtige +Sicherheitsupdates nicht installiert werden. Unsere Partner können die GOG- +Dienste nutzen, um Patches oder Updates für die entsprechenden GOG-Inhalte +bereitzustellen. + + + + + +## 10\. EIGENTUM VON GOG-DIENSTEN UND GEISTIGE EIGENTUMSRECHTE + +10.1 GOG-Dienste, insbesondere ihre Grafiken, Computercodes, +Benutzeroberfläche, Aussehen und ihre Funktion, Audio, Video, Text, Layout, +Datenbanken, Daten sowie alle sonstigen Inhalte und alle darauf bezogenen +gesetzlichen und hinsichtlich der Nutzung geltenden Rechte sind unser Eigentum +oder werden von Dritten an uns lizenziert. GOG-Inhalte sind Eigentum ihrer +jeweiligen Entwickler/Publisher und werden an uns lizenziert. Mit Ausnahme der +in dieser Vereinbarung erläuterten Fälle sind alle Rechte vorbehalten. Es ist +Dir nur auf die in dieser Vereinbarung erläuterte Art und Weise gestattet, +GOG-Dienste oder GOG-Inhalte zu nutzen oder zu verwerten. + + + +10.2. GOG respektiert die geistigen Eigentumsrechte anderer. Bitte lies [ hier +](https://support.gog.com/hc/articles/16034228157213) mehr darüber. + +## 11\. Regeln zur Nutzung von GOG-Diensten + +11.1 Bitte befolge diese Regeln in Bezug auf die GOG-Dienste und GOG-Inhalte +sowie alle zusätzlichen Regeln, die wir nachstehend unter Punkt 11.2 +verlinken. Bitte lies diese Regeln sorgfältig durch, da deren Missachtung +(insbesondere in Bezug auf Cheating) als wesentlicher Verstoß gegen diese +Vereinbarung angesehen wird, der zur Aussetzung oder Kündigung Deines Zugangs +zu den GOG-Diensten führen kann. Hier nochmal alle Regeln im Überblick: + +(a) Nutze GOG-Dienste oder GOG-Inhalte nur zu Deinem persönlichen Vergnügen +(z.B. nicht zum Geldverdienen, für Raubkopien oder für politische Zwecke). + + + +(b) In Bezug auf GOG-Inhalte sind die Möglichkeiten, die du, abgesehen vom +Spielen der Spiele (z. B. das Erstellen abgeleiteter Werke) praktisch hast, +davon abhängig, was der Inhaber der GOG-Inhaltsrechte Dir erlaubt (GOG kann +solche Rechte nicht gewähren). Wende Dich daher bitte direkt an den +Rechteinhaber (als Erstes solltest Du jedoch prüfen, ob es eine EULA gibt und +was darin steht). Wir bitten auch darum, dass jegliche Nutzung in diesem Sinne +ausschließlich darauf abzielt, den GOG-Inhalt zu verbessern. + + + +(c) Bezogen auf GOG-Dienste (die auch GOG-Software umfassen): Führe ohne +vorherige Zustimmung von GOG bitte keine Veränderungen, Zusammenfügungen, +Verbreitungen, Übersetzungen, Rückentwicklungen, Dekompilierungen oder +Disassemblierungen durch und erstelle keine davon abgeleiteten Werke – außer +in Fällen, in denen Du durch diese Vereinbarung oder aufgrund der Gesetze +Deines Landes die Erlaubnis dazu erhalten hast. Wir möchten betonen, dass Du +Dich gerne an uns wenden kannst, falls Du derartige Dinge vorhast, und wir uns +mit Deiner Anfrage nach Treu und Glauben befassen werden. Ganz allgemein +möchten wir irgendwann in der Zukunft vielleicht Client-Protokolle öffnen, um +den Benutzern die Arbeit mit GOG-Daten/Software zu erleichtern ohne +Rückentwicklungen oder ähnliche Techniken für die Nutzer zu vereinfachen. + + + +(d) Hacke, belästige, störe oder missbrauche keine Dienste, Inhalte, Nutzer +oder Angestellte von GOG, füge ihnen keinen Schaden zu und nutze sie nicht für +ähnliche Zwecke. + +(e) Du darfst keine Cheats, Exploits, Automatisierungssoftware, Roboter, Bots, +Mods, Hacks, Spiders, Spyware, Cheats, Skripte, Trainer, Extraktions-Tools +oder jegliche Software erstellen, verwenden, zur Verfügung stellen und/oder +verbreiten, die mit den GOG-Diensten oder GOG-Inhalten in irgendeiner Weise +interagieren oder diese beeinträchtigen könnten (einschließlich, aber nicht +beschränkt auf nicht autorisierte Programme von Dritten, die die Kommunikation +zwischen GOG oder seinen Partnern und den GOG-Dienste abfangen, emulieren oder +umleiten und/oder nicht autorisierte Programme von Dritten, die Informationen +über die GOG-Dienste sammeln). + +(f) Störe nicht die Netzwerksoftware oder andere Software von GOG oder Dritten +durch Tunnelling, Code-Einschleusung, Modifikation oder Änderung von GOG- +Software, Verwendung ähnlicher Software gemeinsam mit GOG-Diensten oder GOG- +Inhalten, Protokollemulation oder das Erstellen oder die Nutzung privater +Server in Hinblick auf GOG-Dienste oder GOG-Inhalte. Versuche nicht auf +Bereiche von GOG.COM, GOG GALAXY oder den GOG-Servern zuzugreifen, die nicht +der Öffentlichkeit zugänglich gemacht wurden. + +(g) Tue oder sage nichts, was rassistisch, fremdenfeindlich, sexistisch, +verleumderisch oder anderweitig anstößig oder illegal ist oder sein könnte +(z.B. Ausbeutung von Minderjährigen, Aufforderung zur Gewalt, Betrug). Seid +bitte nett zueinander! + +(h) GOG-Konten dürfen nicht geteilt, „gekauft“, „verkauft“, übertragen, +verschenkt, ausgeliehen, gestohlen, übernommen oder missbräuchlich genutzt +werden. GOG-Keys/GOG-Codes dürfen nur in der von GOG gestatteten Weise +verschenkt oder übertragen werden. Wende Dich bei Fragen oder Problemen an den +Kundendienst. + + + +(i) Wir bitten dich, Beschränkungen, Anforderungen oder Regeln abhängig von +geografischem Standort, Region oder Sprache im Zusammenhang mit GOG zu +befolgen. + + + +(j) Wir bitten dich, im Zusammenhang mit GOG alles zu unterlassen, was gegen +die Urheberrechte, Markenrechte, Patentrechte, Handelsgeheimnisse, +Persönlichkeitsrechte, Veröffentlichungsrechte oder sonstige Rechte Dritter +verstößt, beispielsweise mittels Bildern, Fotos, Sounddateien, Textdateien, +Grafiken oder jeglichen sonstigen Materialien und Informationen. + +11.2 Zusätzlich zu den oben genannten Bedingungen findest Du im Folgenden eine +Liste weiterer Bedingungen, die für Dich gelten, wenn Du GOG-Dienste nutzt. +Wir möchten uns nicht wiederholen, aber es ist uns wichtig, darauf +hinzuweisen, dass eine Missachtung eine wesentliche Verletzung dieser +Vereinbarung darstellt, und somit zu einer Suspendierung oder Kündigung Deines +Zugangs zu den GOG-Diensten führen kann. Hier ist die Liste: + + * [ GOG-Verhaltenskodex ](https://support.gog.com/hc/articles/16033977811613) + + * [ Rechtsverletzende Inhalte und Urheberrechtsbestimmungen ](https://support.gog.com/hc/articles/16033687971613) . + + + +11.3 Jedes Mal, wenn wir eine + +Moderationsentscheidung treffen, die dazu + +führt, dass Dein Zugang zu den GOG-Diensten eingeschränkt wird, solltest du, +wann immer es möglich ist, eine Begründung erhalten, in der wir die Gründe für +diese Entscheidung darlegen. Solltest Du mit der Entscheidung, die wir +getroffen haben, nicht einverstanden sein, kannst Du innerhalb von 6 Monaten +ab dem Tag, an dem Du über die Entscheidung informiert wurdest, Widerspruch +einlegen. + +Einzelheiten bezüglich des Widerspruchsverfahrens sollten in Deiner + +Moderationsentscheidung enthalten sein. + +Die Vorgehensweise bei der Bearbeitung + +von Kundenbeschwerden ist auch in der + +Richtlinie über verletzende Inhalte und + +Urheberrechte ([hier](https://support.gog.com/hc/articles/16033687971613)) +beschrieben. + +## 12\. NUTZERERSTELLTE INHALTE + +12.1 In diesem Abschnitt geht es um Inhalte (z. B. Texte, Videos, Fotos, +Bilder, Screenshots, Bildschirmhintergründe oder Links), die Du für uns oder +andere GOG-Nutzer über GOG-Dienste (z. B. durch Dein Profilbild oder +Nachrichten an andere GOG-Nutzer) verfügbar machst. Diese nennen wir +„Nutzererstellte Inhalte“. + +12.2 Was uns und Dich betrifft, so bist Du Eigentümer aller nutzergenerierten +Inhalte, jedoch musst Du uns einige eingeschränkte Rechte daran einräumen, +damit wir diese tatsächlich über die GOG-Dienste übertragen können. Indem Du +nutzergenerierte Inhalte einstellst, so erteilst Du uns eine nicht-exklusive, +unwiderrufliche Lizenz, Deine nutzergenerierten Inhalte in Verbindung mit den +GOG-Diensten zu nutzen, zu modifizieren, zu reproduzieren, davon abgeleitete +Werke zu erstellen, zu verteilen, zu übertragen, zu kommunizieren und +öffentlich darzustellen/aufzuführen. + +12.3 Es unterliegt Deiner Verantwortlichkeit, dafür zu sorgen, dass Du alle +notwendigen Rechte besitzt, bevor Du nutzererstellte Inhalte verwendest, und +zudem zu überprüfen, ob deren Verwendung sicher ist – wir können es nicht +wissen und prüfen, daher müssen wir uns auf Dich verlassen. + + + +12.4. Wir haben jedoch das Recht (aber nicht die Pflicht), nutzergenerierte +Inhalte, die rechtswidrig, unerlaubt, verleumderisch, obszön, die +Persönlichkeitsrechte anderer Personen verletzend, bedrohend, belästigend, +beleidigend, hasserfüllt, rassistisch oder pornografisch sind, zu überprüfen +und gegebenenfalls zu entfernen, wenn dies angemessen oder gesetzlich +erforderlich ist. Solltest Du feststellen, dass solche Inhalte auf GOG- +Diensten veröffentlicht wurden, teile uns dies bitte mit. Wir bitten dich, +unsere Regelungen zu [ Rechtsverletzenden Inhalten und +Urheberrechtsbestimmungen +](https://support.gog.com/hc/articles/16033687971613) zu lesen, in denen wir +unser Verfahren zur Meldung rechtsverletzender Inhalte erläutern. Sollte Dein +Fall nach unserem internen Verfahren immer noch nicht vollständig geklärt +sein, so hast Du die Möglichkeit einer außergerichtlichen Streitbeilegung - +mehr dazu weiter unten in Abschnitt 20. + +## 13\. FEEDBACK ODER VORSCHLÄGE + +13.1 Du kannst uns gerne Feedback und Vorschläge zur Verbesserung der GOG- +Dienste schicken - wir schätzen diese sehr. Allerdings möchten wir +klarstellen, dass wir nicht verpflichtet sind, sie zu nutzen oder anzunehmen, +außerdem schulden wir Dir nichts dafür (in finanzieller und sonstiger +Hinsicht). + +## 14\. VERWENDUNG VON GOG-INHALTEN IN FAN-WERKEN + +14.1 Vor dem Erstellen von Fan-Werken (z. B. Fan-Mods, Machinimas, Parodien, +Hommagen, „Let's Play“-Videos bzw. sonstige Videos oder Kunstwerke) musst Du +Dich beim Eigentümer der Inhalte (also z. B. beim Entwickler oder Publisher) +erkundigen, ob dies für ihn in Ordnung ist, und eine Erlaubnis einholen. Der +Grund dafür ist ganz einfach: GOG-Inhalte gehören den jeweiligen Eigentümern, +nicht GOG. + +## 15\. INHALTE DRITTER UND EXTERNE DIENSTE + +15.1 Über GOG-Dienste erhältst Du unter Umständen Links auf Webseiten oder +Inhalte Dritter. Ob Du sie nutzt, entscheidest Du – wir können nicht +versprechen, dass sie funktionieren, außerdem wissen wir nicht, wie sie +gestaltet sind oder ob sie etwas kosten. + + + +15.2 Du kannst Dein GOG-Konto auch nutzen, um einfachen Zugang zu externen, +von GOG autorisierten Partnerdiensten zu erhalten, darunter die „The Witcher“- +Spiele und Seiten unserer verbundenen Firma CD PROJEKT. Diese Dienste haben +eigene Geschäftsbedingungen, denen Du zustimmen und an die Du Dich halten +musst. Nur um es noch mal klarzustellen: Die Nutzung dieser Dienste ist +vollkommen optional. Du entscheidest und Du hast die Macht! + + + + + + +## 16\. GEWÄHRLEISTUNGEN UND HAFTUNGSBESCHRÄNKUNGEN HINSICHTLICH DER GOG- +DIENSTE + +16.1 Wir sichern zu: (i) dass wir das Recht haben, diese Vereinbarung +einzugehen und Dir die in Abschnitt 2.1 erwähnte Lizenz zum Nutzen von GOG- +Diensten zu erteilen; (ii) dass wir bei den GOG-Diensten und ihrer Nutzung +durch Dich angemessene Sorgfalt walten lassen; und (iii) dass wir angemessene +Anstrengungen unternehmen, gemäß des anwendbaren Rechts zu handeln und unsere +sich aus dieser Vereinbarung ergebenden Verpflichtungen Dir gegenüber zu +erfüllen. + + + +16.2 Deine Erklärungen und Zusicherungen. Du erklärst und sicherst zu, dass Du +vollständig bemächtigt und befähigt bist, diese Vereinbarung einzugehen und +dass Du ihren Bestimmungen vollständig folgen wirst. Du erklärst und sicherst +außerdem zu, dass alle nutzererstellten Inhalte, welche Du über GOG-Dienste +überträgst, keine intellektuellen Inhaberrechte einer dritten Partei +verletzen. Du erklärst und sicherst weiterhin zu, dass Du nutzererstellte +Inhalte weder verwenden noch erstellen oder weiterverbreiten wirst, welche +rechtswidrig, unerlaubt, defamierend, obszön, die Privatsphäre einer anderen +Person verletzend, drohend, belästigend, missbrauchend, hasserfüllt, +rassistisch oder pornographisch sind. + + + +16.3. Wir bemühen uns sehr, die GOG-Inhalte auf Deinen Systemen zum Laufen zu +bringen, aber wir haben nur begrenzte Zeit, um Tests durchzuführen, und es +gelingt uns nicht immer alles optimal. Daher können wir keine Haftung oder +Verantwortung für GOG-Inhalte übernehmen, es sei denn, dies ist gesetzlich +vorgeschrieben (siehe 7.1.-7.2). Außerdem sind wir nicht verantwortlich für +alles, was mit GOG.COM oder den GOG-Diensten geschieht und außerhalb unserer +Kontrolle liegt, und wir garantieren nicht, dass die GOG-Dienste zu 100% +funktionieren. Vergiss jedoch nicht, dass Du bei technischen Problemen +Anspruch auf Rückgabe und Erstattung von GOG-Inhalten hast- siehe Abschnitt +7.3. + +## 17\. AUSSERKRAFTTRETEN + +17.1 Dein Recht auf Kündigung des Vertrags. Du kannst diese Vereinbarung +jederzeit und ohne Angabe von Gründen kündigen, indem Du die Nutzung der GOG- +Dienste vollständig einstellst. Wenn Du möchtest, dass wir Dein Konto löschen, +wende Dich bitte [ hier +](https://support.gog.com/hc/requests/new?category=info&product=gog) an unser +Support-Team oder sende einfach eine E-Mail-Anfrage an privacy@gog.com. Die +Beendigung hat keine Auswirkungen auf bereits bestehende Rechte oder Pflichten +für uns oder dich. + +17.2 Unser Recht auf Kündigung des Vertrags. Wenn Du diese Vereinbarung +wesentlich verletzt, behalten wir uns das Recht vor, Deinen Zugang zu GOG- +Diensten und GOG-Inhalten auszusetzen oder zu sperren. Unter einem +wesentlichen Verstoß gegen die Vereinbarung verstehen wir einen +schwerwiegenden Verstoß, der GOG und/oder den GOG-Nutzern erheblichen Schaden +zufügen könnte, sowie insbesondere einen Verstoß gegen die Bestimmungen in +Abschnitt 11 oder den[GOG- +Verhaltenskodex](https://support.gog.com/hc/articles/16033977811613). Wenn wir +Deinen Zugang zu GOG-Diensten oder GOG-Inhalten aussetzen oder kündigen, +werden wir angemessene Schritte unternehmen, um Dich zu kontaktieren und Dir +zu erklären, warum wir dies getan haben und was Du infolgedessen tun kannst +(wenn überhaupt). + +17.3 Es erscheint sehr unwahrscheinlich, aber wenn wir permanent keinen +Zugriff auf GOG-Dienste und GOG-Inhalte mehr anbieten können (nicht durch eine +Verletzung Deinerseits), werden wir versuchen, Dir mindestens sechzig (60) +Tage Vorwarnung zu geben, indem wir einen Hinweis auf +[www.GOG.com](http://www.gog.com) veröffentlichen und eine E-mail an +registrierte Nutzer senden – während dieser Zeitspanne solltest Du in der Lage +sein, die von Dir gekauften GOG-Inhalte herunterzuladen. + +## 18\. HÖHERE GEWALT + +18.1 Weder Du noch wir können haftbar gemacht werden für das Versäumnis, einer +sich aus dieser Vereinbarung ergebenden Verpflichtung nachzukommen oder Zugang +zu GOG-Diensten und GOG-Inhalten zu bieten, wenn dies durch unvorhergesehene +Ereignisse, die jenseits Deiner oder unserer angemessenen Einflussnahme +liegen, verursacht wird, darunter (ohne Beschränkung darauf) Internet- oder +Datenübertragungsausfälle, Feuer, Flut, Krieg oder Naturereignisse. + +## 19\. GELTENDES RECHT + +Für Nutzer, die ihren Wohnsitz in der Europäischen Union oder anderswo auf der +Welt (jedoch nicht in den USA) haben: + + + +19.1 Du und wir stimmen überein, dass Deine Nutzung der GOG-Dienste und GOG- +Inhalte sowie diese Vereinbarung den Gesetzen der Republik Polen unterliegen +und dementsprechend ausgelegt werden und dass Rechtsstreitigkeiten +hinsichtlich dieser Vereinbarung nicht ausschließlich vor Gerichten der +Republik Polen ausgetragen werden. Bei einem sich aus dieser Vereinbarung +ergebenden Rechtsanspruch erhält die im Verfahren obsiegende Seite einen +Anspruch auf Erstattung ihrer Rechtskosten und Ausgaben. + + + +19.2 Die oben genannte Wahl für geltendes Recht und Rechtssprechung unterliegt +allen zwangsweise geltenden Prinzipien des Konsumentenschutzes oder anderen +Rechten im Gerichtsstand Deines Wohnsitzes, die sonst nicht verfügbar wären. + +### Nur für Nutzer in den USA: + +19.3 Du und wir stimmen überein, dass Deine Nutzung der GOG-Dienste und GOG- +Inhalte sowie diese Vereinbarung als in Los Angeles, Kalifornien, eingegangen +gilt und den Gesetzen des Staates Kalifornien, USA, (und, falls anwendbar, den +Bundesgesetzen der USA) unterliegen und dementsprechend ausgelegt werden. +Jeder Rechtsanspruch Deinerseits gegen GOG wird ausschließlich vor einem +Staats- oder Bundesgericht in Los Angeles, Kalifornien, verfolgt, das die +sachliche Zuständigkeit zum Rechtsstreit zwischen Dir und uns besitzt. Aus +diesem Grunde erkennen beide Parteien die ausschließliche Zuständigkeit dieser +Gerichte an. Bei einem sich aus dieser Vereinbarung ergebenden Rechtsanspruch +erhält die im Verfahren obsiegende Seite einen Anspruch auf Erstattung ihrer +Rechtskosten und Ausgaben. + +## 20\. Kundendienst und Disputlösung + +20.1 Wenn Du Bedenken, Forderungen oder Probleme mit uns hast, hoffen wir, +dass wir diese schnell und einvernehmlich lösen können, indem Du uns [ hier +](https://support.gog.com/hc/de/requests/new?category=info) kontaktierst. Wir +werden vernünftig und in gutem Glauben versuchen, alle Dispute informell +zwischen uns zu lösen. Wir versuchen, alle Forderungen innerhalb von 14 Tagen +zu beantworten. + +20.2. Wenn das Problem in dieser Zeit nicht gelöst wird, hängen die nächsten +Schritte davon ab, wo Du wohnhaft bist. Wenn Du in der EU wohnst, so kannst Du +Deine rechtlichen Ansprüche bei der von der Europäischen Kommission +betriebenen und bereitgestellten Online-Streitbeilegungsplattform einreichen, +auf die Du über http://ec.europa.eu/consumers/odr/ zugreifen kannst, um eine +außergerichtliche Einigung zu erzielen oder ein Gerichtsverfahren einzuleiten. +Du kannst Dich auch dafür entscheiden, Deine Streitigkeit durch eine +außergerichtliche Streitbeilegungsstelle zu lösen, die vom Koordinator für +digitale Dienste in Deinem Land zertifiziert ist. + +20.3 Wenn Du in den USA oder dem Rest der Welt lebst (aber nicht in der EU), +dann kontaktiere uns bitte unter legal@GOG.COM. + +## 21\. WEITERE RECHTLICHE HINWEISE + +21.1 Sollte sich ein Teil dieser Vereinbarung als nicht auf dem Rechtsweg +durchsetzbar herausstellen, hat dies keinen Einfluss auf die anderen Teile. + +21.2 Diese Vereinbarung (einschließlich aller zusätzlichen Regelungen von GOG, +auf die darin verwiesen wird) stellt die gesamte Vereinbarung zwischen Dir und +uns dar und ersetzt alle früheren mündlichen oder schriftlichen +Vereinbarungen. Wenn Du damit nicht einverstanden bist, kontaktiere uns bitte +so schnell wie möglich unter legal@gog.com, nachdem Du die GOG-Dienste in +Anspruch genommen hast, da diese Regelungen sonst nach einer angemessenen +Frist (in der Regel 30 Tage) für Dich bindend sind. + +21.3 Diese Vereinbarung regelt unsere Beziehung zu Dir (und umgekehrt). Sie +gewährt keinen anderen Personen Rechte. + + + +21.4 Vergiss bitte nicht, dass wir an verschiedene Gesetze gebunden sind und +unter Umständen der Strafverfolgung assistieren oder anderen gesetzlichen +Vorschriften folgen müssen. + + + +21.5 Sollte es zu einer Neuorganisation, einem Verkauf oder einer Fusion von +GOG kommen, müssen wir eventuell mit entsprechenden Dritten zusammenarbeiten, +um Dein GOG-Konto zu übertragen oder mit einem anderen Konto +zusammenzuschließen. + + + +21.6 Du und wir stimmen beide zu, dass diese Vereinbarung nicht dem +Übereinkommen der Vereinten Nationen über Verträge über den internationalen +Warenkauf unterliegt. + + + +21.7 Wir können diese Vereinbarung an andere Mitglieder unserer +Unternehmensgruppe oder an Dritte abtreten, vertraglich untervergeben oder +übertragen, wenn dies im Rahmen einer Umstrukturierung, einer Fusion oder aus +sonstigen geschäftlichen Gründen für die Unterstützung von GOG erforderlich +ist. Falls dies eintritt, wirst Du benachrichtigt. + + + +21.8 Falls Du ein EU-Bürger bist, beachte bitte, dass GOG grenzübergreifende +Portabilität auf kostenlose und kostenpflichtige Inhalte gemäß Verordnung (EU) +2017/1128 des Europäischen Parlaments und des Gremiums vom 14. Juni 2017 +hinsichtlich grenzübergreifender Portabiliät von Online-Inhalten und -Diensten +in inneren Märkten anbietet, wobei dies jeglichen anderen rechtlichen +Anforderungen an GOG einschließlich IP-Schutz und jeglichen Anforderungen der +Entwickler- und Publisher-Partner von GOG unterliegt. + +## 22\. ÄNDERUNGEN AN DIESER VEREINBARUNG + +22.1 Wir können diese Vereinbarung ändern, wenn wir dies für notwendig +erachten, z.B. aus rechtlichen Gründen oder um Änderungen der GOG-Dienste oder +GOG-Inhalte zu berücksichtigen. Wenn dies der Fall ist, werden wir die +geänderte Vereinbarung online unter +https://support.gog.com/hc/articles/212632089 zur Verfügung stellen und werden +Dich per E-Mail (wenn Du ein GOG-Konto hast) über alle wesentlichen Änderungen +informieren. + +22.2 Alle Änderungen zu dieser Vereinbarung werden 30 Tage nach der +Ankündigung der Änderung online in Kraft treten. In der Zwischenzeit kannst Du +Dich unter legal@GOG.COM mit Fragen zu den Änderungen gerne an uns wenden. + + + +22.3 Wenn Du Dich mit den Änderungen nicht einverstanden erklärst (und zwar +unabhängig davon, ob Du uns per E-Mail kontaktierst), müssen wir Dich leider +dazu auffordern, die GOG-Dienste und GOG-Inhalte nicht mehr zu nutzen. Wir +sagen das nur ungern, hoffen aber, Du erkennst an, dass GOG-Dienste für einen +ordnungsgemäßen Betrieb von allen Personen nach denselben Regeln und nicht von +unterschiedlichen Personen nach unterschiedlichen Regeln genutzt werden +müssen. Wende Dich daher also bei Fragen bitte an uns. + + + +22.4 Du solltest wissen, dass wir niemals einfach Änderungen an dieser +Vereinbarung vornehmen, ohne Dich davon in Kenntnis zu setzen. Außerdem werden +wir Dich nicht zwingen, vor der Nutzung von GOG-Änderungen zuzustimmen, die Du +nicht verstehst! + +## 23\. Unsere Kontaktinformationen + +23.1. Solltest Du eine Beschwerde bezüglich Deines GOG-Kontos oder der GOG- +Dienste einreichen oder uns einfach kontaktieren wollen, so findest Du die +entsprechenden Kontaktdaten hier: + +Name: GOG sp. z o.o. + + + +Eingetragener Geschäftssitz: ul. JagielloÅ„ska 74, 03-301 Warschau, Polen + +Eingetragen beim Bezirksgericht für Warschau, 14. Handelsabteilung des +Nationalen Gerichtsregisters. + + + +Registrierungsnummer 0000029514 + + + +Steuernummer Umsatzsteuer-ID (NIP) PL 113-21-77-807 + + + +Stammkapital: PLN 135.750,00 PLN + + + +Zentrale Anlaufstelle für Behörden: + +GOG Legal Team + +legal@gog.com + +Sprachen, in denen wir kommunizieren: Englisch, Polnisch + + + +Zentrale Anlaufstelle für Empfänger von GOG-Dienstleistungen: + +GOG-Support-Team + +support@gog.com + +Wir sprechen hauptsächlich Englisch und Polnisch, aber wir werden unser Bestes +tun, um Dir in jeder Sprache zu helfen, in der GOG verfügbar ist. + + + +Letzte Aktualisierung (Datum des Inkrafttretens): 17. Februar 2024 + + + +Die vorherige Version der Nutzungsbedingungen findest +Du[hier](https://support.gog.com/hc/en-us/articles/360010039713-User- +Agreement-effective-until-November-5-2020-?product=gog). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/blackgate/tmp/EULA_en-US.txt b/info.exult.exult/data/blackgate/tmp/EULA_en-US.txt new file mode 100644 index 0000000..e35fa4e --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/EULA_en-US.txt @@ -0,0 +1,1600 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM USER AGREEMENT + +## 1\. ABOUT THIS AGREEMENT + + + +1.1 This Agreement is a contract between you (we will further call you just +“youâ€) and GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Warsaw, Poland (we will +further call ourselves “GOG†or just “usâ€) and applies to www.GOG.COM, your +GOG user account, GOG GALAXY application (including GOG GALAXY store), any +games or videos or other content or services which you purchase or access via +us, the GOG web forums, GOG customer and technical support and other services +we provide to you (we'll just call all this “GOG services†for short). Here we +set out your rights and obligations as a recipient of GOG services. + + + +1.2. Additional terms may apply to GOG services and in such a case we will +post them for your acceptance. For example, if you would like to use the GOG +GALAXY application, the relevant terms will be posted for your acceptance +before you start using these services. + + + +1.3 Also, when we're talking about games, in-game content, virtual items or +currency or GOG videos or other content or services which you can purchase or +access via GOG services, we’ll just call them “GOG games†or “GOG videos†+respectively and when we talk about them all together they are “GOG contentâ€. + + + +1.4 We didn’t want to make this document too long, but keep in mind that by +accepting our User Agreement you also accept: + + * our [ Privacy Policy ](https://support.gog.com/hc/articles/212632109) \- which explains what data we collect from you and how we protect it, + + * [ GOG Code of Conduct ](https://support.gog.com/hc/articles/16033977811613) which is a set of rules you need to follow as part of our community, + + * [ Infringing Content and Copyright Policy ](https://support.gog.com/hc/articles/16033687971613) which explains how you can report unlawful content on GOG and what happens when you do. + + + +1.5 GOG works with trusted partners, including our related company CD PROJEKT +S.A., developers and publishers, payment providers, customer service software +providers and others (“Partnersâ€) – more on them later in this Agreement. + + + +1.6 If you're over 18, then welcome! If you're between 16 and 18, before we +extend an equally warm welcome, please ask your parent or guardian to review +and approve this Agreement on your behalf (because in some countries people +under a certain age cannot legally enter into contracts like this Agreement). +If you’re not 16 yet you cannot have a GOG account or use the GOG services +because legally we cannot handle personal data of children without a special +parental or guardian’s permission (but your parents/guardians are welcome to +sign up themselves). + +## 2\. USING GOG SERVICES AND GOG CONTENT + + + +2.1 We give you and other GOG users the personal right (known legally as a +'license') to use GOG services and to download, access and/or stream +(depending on the content) and use GOG content. This license is for your +personal use. We can stop or suspend this license in some situations, which +are explained later on. + + + +2.2 When you buy, access or install GOG games, you might have to agree to +additional contract terms with the developer/publisher of the game (e.g. they +might ask you to agree to a game specific End User License Agreement). If +there is any inconsistency or dispute between those ‘EULAs’ and this +Agreement, then this Agreement wins. + + + +2.3 With GOG videos, you can also stream purchased video content or download +it to watch the way you want. + + + +2.4 Using certain third-party scripts is recommended for your full use of GOG +functionality and, although that usage is optional, we cannot promise full +service performance without them. + + + +2.5 A quick word about GOG GALAXY, which is our (optional) application which +not only allows you to buy and access GOG content but also provides cool +features like unified game library, and one friends list across platforms, +online multiplayer, achievements, cross-platform chat, game-time tracking, +cloud-saves and game overlay. You can learn more about +it[here](https://www.gog.com/galaxy). + + + +2.6 In some parts of GOG services, we use recommendation systems to present +you the content that you are most likely to be interested in. You can learn +where we use them and how they work[here](https://support.gog.com/hc/en- +us/articles/16034228157213), including what main parameters we use and how to +influence them. + +## 3\. GOG ACCOUNT + + + +3.1 To buy GOG content from GOG services, and in some cases to play/use GOG +content where our partners require use of a GOG account, you will need to set +up a GOG account. This will involve creating a password (which is encrypted so +we can’t access it) and a username, plus giving us (for identification +purposes) your email address. Please make sure your login credentials are kept +secure and your account is used properly. In your GOG account settings you can +also optionally set your country of residence, birthday and avatar. Our +Privacy Policy gives more details about the information we collect from you +and how we use it and protect it. +It's[here](https://support.gog.com/hc/articles/212632109). + + + +3.2 You can use your GOG account to set up a public profile accessible by +other people. You can also use your GOG account to connect with other GOG +users. Please act sensibly and remember you are responsible for your own +actions. + + + +3.3 Your GOG account and GOG content are personal to you and cannot be shared +with, sold, gifted or transferred to anyone else. Your access to and use of +them is subject to GOG’s [ Privacy Policy +](https://support.gog.com/hc/articles/212632109) and [ Code of Conduct +](https://support.gog.com/hc/articles/16033977811613) which are updated or +amended when necessary. + + + +3.4. Access to and use of the games purchased from different platforms (i.e. +with what we call ‘Keyless Access’), including their minimum system +requirements is governed by respective third-party platform policies and (as +applicable) additional contract terms with the developer/publisher of the game +(e.g. they might ask you to agree to a game specific End User License +Agreement). It may require having a third-party platform account. These +platforms may roll out patches or updates for your purchased games. + +## 4\. SYSTEM REQUIREMENTS + + + +4.1 Because GOG gives you access to many different services and games created +at different times and via different platforms, we cannot give you one set of +system requirements for all GOG services or GOG content. Please make sure your +computer and Internet connection are good enough to use GOG services and play +GOG games and videos. + + + +4.2 What we can tell you is that using any GOG game will require a computer, +equipped with a mouse and keyboard (touchscreen controls are not supported), +with an appropriate operating system (please refer to the relevant GOG product +page) with all service packs and important updates installed on it. All GOG +games should be natively installed on a computer that meets or exceeds the +minimum hardware and software specifications shown on the GOG product page. +GOG games are not tested on virtual machine software and therefore we do not +support playing through them. + + + +4.3 For GOG videos, please make sure your video player supports the videos’ +format specified in the GOG product page. + + + +4.4 If you have questions about system requirements, please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). Just so we're clear, you are +responsible for making sure you have sufficient Internet access to download +purchased GOG games or GOG videos from us or to stream GOG videos and that +your system can play GOG games and watch GOG videos. + +## 5\. BETAS + + + +5.1 As GOG develops, we may offer you optional access to 'beta' versions of +GOG software or services (e.g. new versions of the GOG GALAXY application made +available prior to its general release) or GOG content. + + + +Here are the rules: + + + +a) We (or any applicable publisher/partner) will set the conditions and +requirements for your beta access. Providing and maintaining a beta, and who +can use a beta, is at our discretion. + + + +b) You may be required to go through a registration process or other +requirements to access the beta (and this may include you meeting eligibility +criteria). + + + +c) Betas will be time-limited and there may be extra contract requirements. + + + +d) The beta may involve temporary or permanent server/progress/content wipes, +resets or amendments. + + + +e) The beta may be subject to confidentiality restrictions (which will be +notified to you in advance if so). + + + +f) You may be invited to participate in a feedback process regarding the beta +– this is totally optional but would be really valued. + + + +g) The beta is for your personal use and enjoyment, so you must not sell, loan +or otherwise transfer it to anyone else. + + + +h) The point of you getting beta access is to allow you to try something new, +but we would expect you to recognise that it will not be complete yet. +Therefore betas will be provided 'as is' without any additional promises from +us or any liability on us if it is not complete or does not work fully or +causes issues. Betas may not be totally feature-complete and there may be +feature changes, modifications or removals during the beta. + +## 6\. PAYING FOR GOG CONTENT AND GETTING REFUNDS + +### Paying for GOG content + +6.1 After you decide that you like a GOG game, GOG video or other GOG content, +you usually will need to pay for it before you can access it (though we do +have some free content too!). You can pay in different ways: (i) using a valid +debit or credit card; or (ii) using PayPal or any other authorized payment +provider. Remember to keep your payment details secure. + + + +6.2 When you use a payment method to buy GOG content, we're relying on your +promise that you're able to use that method. You are responsible for any +purchases made using your GOG account or payment method and you agree to the +pricing, payment and billing policies applicable to them, as notified to you +at the time of purchase. All payments are non-refundable and non-transferable +except as expressly provided in this Agreement. + + + +6.3 You can always pay for GOG content in US Dollars. However if you happen to +live in countries where your local currency is supported (see our Support +section [ here ](https://support.gog.com/hc/en- +us/articles/360001947034?product=gog) for details), you will be able to pay in +your local currency. You might have to pay a currency conversion charge if you +are not paying in your home currency and some banks might also add other kinds +of transaction fees. + + + +6.4. All prices are visible in the product catalog page. They’re inclusive of +taxes like VAT, if applicable. You should also expect some sales taxes/VAT to +be added to your price at checkout, if required by your local laws (f.ex. in +US or Canada). + + + +### GOG Wallet + +6.5 GOG offers users a digital account balance called the “GOG Wallet†in +connection with your user account, which you can use to make purchases of GOG +content on dedicated GOG services. Funds can be added to it in two ways: (i) +using your chosen payment method; or (ii) by us as part of our ‘Voluntary +Refund Policy’ (see link[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy)) in which case we may offer refunds +to GOG Wallet that you can use to get a replacement GOG game or other GOG +content. The GOG Wallet is made available subject to rules which are set out +on our GOG Wallet page[here](https://support.gog.com/hc/en- +us/articles/360001941953-FAQ-GOG-Wallet?product=galaxy). + +### GOG Bonus Codes + +6.6. We may also issue usually time-limited bonus codes which give you free or +reduced price access to GOG content (we’ll call them “Bonus Codesâ€). If you +receive Bonus Codes when you buy GOG content but later decide to return that +GOG content, then we think it’s fair for you to return the Bonus Codes too. +Therefore, we will terminate it or, if it has been redeemed for a GOG game, +that game will be removed from your account. + +### Direct to Account Distribution + +6.7 We have a direct to account distribution feature (we’ll call it ‘GOG +Direct to Account) where distribution platforms who partner with us would be +able to sell games or other content to you, where you could choose for that +game/content to be automatically activated within your GOG account, without +the need to redeem any codes. Just to be clear, the whole purchase process is +handled by the other platform, so in case of any issues with the purchase +process please speak with them directly. For this particular matter therefore, +we cannot offer you Our Voluntary Refund Policy (because GOG didn’t sell the +game/content). Of course, anything connected to our platform’s services is +still our responsibility. + +## 7\. REFUNDS AND RETURNS + +### Statutory refund rights + +7.1. If you are a resident of the European Union or other applicable +jurisdictions (excluding the USA), then you have the statutory right to +withdraw from a purchase of GOG content within 14 days of your purchase, +without giving a reason. To exercise the right of withdrawal, you should +inform us of your decision to withdraw from this contract by an unequivocal +statement (an email sent to support@GOG.COM, or a physical letter at an +address set out in Section 23 below). You may use the model withdrawal form +attached at the end of this Agreement, but you do not have to. To meet the +withdrawal deadline, it is sufficient for you to send your communication +concerning your exercise of the right of withdrawal before the withdrawal +period has expired. However, this does not apply where you have expressly +consented to the performance of the GOG content (which is digital content) +beginning immediately upon conclusion of the purchase process and have +acknowledged the loss of your withdrawal rights. + + + +7.2. Neither this nor any other part of this User Agreement affects your +statutory rights. In particular: + + + +a) For Australian Users: Our goods come with guarantees that cannot be +excluded under the Australian Consumer Law. You are entitled to a replacement +or refund for a major failure and compensation for any other reasonably +foreseeable loss or damage. You are also entitled to have the goods repaired +or replaced if the goods fail to be of acceptable quality and the failure does +not amount to a major failure. Details[here](https://support.gog.com/hc/en- +us/articles/360025857893?product=gog). + + + +b) For New Zealand Users: Neither this nor any other part of this User +Agreement excludes, restricts or modifies the application of any right or +remedy that cannot be so excluded, restricted or modified including those +conferred by the New Zealand Consumer Guarantees Act 1993. Under this Act are +guarantees which include that goods and services are of acceptable quality. If +this guarantee is not met there are entitlements to have the software remedied +(which may include repair, replacement or refund). If a remedy cannot be +provided or the failure is of a substantial character, the act provides for a +refund. + +### Our Voluntary Refund Policy + +7.3. We understand that sometimes a purchase doesn't turn out how you expected +and we want to be fair to GOG users. This is why on top of your statutory +refund rights (described in section 7.1.-7.2. above) we may offer you a +Voluntary Refund Policy described[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy). In some rare cases if we have +reasonable doubts regarding your refund request we may not apply the Voluntary +Refund Policy. In no case this will deprive you of any applicable statutory +refund rights. A sale is considered final once your refund rights expire +(unless we agree otherwise on a case by case basis). + +## 8\. VIRTUAL ITEMS AND VIRTUAL CURRENCY + + + +8.1 With certain GOG content you may be able to purchase or acquire virtual +items and/or virtual currency (we’ll call them “Virtual Goods†for short). +Virtual Goods are subject to this Agreement and in particular the following +default rules, unless there are specific rules for that GOG content (which +will prevail over these rules). + + + +8.2 Virtual Goods are digital items only with no cash-value or real world +existence and cannot be ‘bought’, ‘sold’, gifted, transferred or redeemed, +exchanged for other Virtual Goods, ‘real world’ money, goods, services or +items of monetary value. Trading Virtual Goods is prohibited (unless you are +specifically permitted to do so). Your right to use any Virtual Goods is +limited to a limited, nonexclusive, non-assignable, non-transferable, non- +sublicensable, revocable license to use them solely for your personal +entertainment and non-commercial use in the applicable GOG content. You have +no property interest or right or title in any Virtual Goods, which remains the +appropriate publisher’s property. Virtual Goods may be changed, amended or +reversed if necessary, including to enforce this Agreement. If necessary, +limits may be placed on the use of Virtual Goods (including transaction limits +and balance amounts). + + + +8.3 The existence of a particular offer for Virtual Goods is not a commitment +by us to maintain or continue to make the Virtual Goods or that offer +available in the future. The scope, variety and type of Virtual Goods that you +may obtain can change and we have the right to manage, modify and remove +Virtual Goods if we consider necessary for the ongoing operation of GOG or GOG +content or for other legitimate reasons, in which case we will have no +liability to you or anyone for the exercise of such rights. We will make +reasonable efforts to notify you of any such change and to explain the reason +for such change. + +## 9\. PATCHES, UPDATES AND CHANGES + + +9.1 Occasionally we may need to patch or update GOG services or GOG content +(for example to add or remove features or to resolve software bugs). We need +these rights in order to keep GOG running efficiently and safely. Not patching +or updating the GOG services or GOG content may result in inferior performance +of your version or incompatibility of your version with some of the GOG +services or GOG content features. Doing so, you are also risking not +installing important security updates. Our Partners may use GOG services to +roll out patches or updates for applicable GOG content. + +## 10\. OWNERSHIP OF GOG SERVICES AND INTELLECTUAL PROPERTY RIGHTS + +10.1 GOG services including (but not limited to) their graphics, computer +code, user interface, look and feel, audio, video, text, layout, databases, +data and all other content, and all legal and exploitation rights regarding +them are either owned by us or we license them from third parties. GOG content +is owned by its developers/publishers and licensed by us. All rights are +reserved except as we have explained in this Agreement. You may not use or +exploit any part of the GOG services or GOG content except as explained in +this Agreement. + + + +10.2. GOG respects the intellectual property rights of others. Please read +more[here](https://support.gog.com/hc/articles/16033687971613). + +## 11\. RULES FOR USING GOG SERVICES + +11.1 Please follow these rules regarding the GOG services and GOG content, and +any additional rules we link in 11.2 below. Please read these rules carefully +since failure to follow them (particularly those in relation to cheating) will +be considered a material breach of this Agreement, which could lead to +suspension or cancellation of your access to GOG services. Here are the rules: + + + +(a) Only use GOG services or GOG content for your personal enjoyment (for +example, don't use them to make money, for piracy or for political purposes). + + + +(b) Regarding GOG content, what you can do practically apart from playing the +games (like create derivative works of it) depends on what the GOG content +rights holder allows you to do (GOG can’t grant such rights). So please check +this with the rights holder directly (the first thing you should do though is +to check if they have a EULA and if so what it says). We also ask that you +make only genuine attempts to improve the GOG content. + + + +(c) Regarding GOG services (which includes GOG software), unless you have +prior GOG permission please don’t modify, merge, distribute, translate, +reverse engineer, decompile, disassemble, or create derivative works of them – +unless you’re allowed in this Agreement or by the law in your country. We’d +like to emphasize that you are free to contact us for permission to do these +things and we will review and respond to those requests in good faith. More +generally, at some point in the future we want to open client protocols to +make it easier for users to work with GOG data/software without any need for +reverse engineering or similar techniques. + + + +(d) Don't hack, harm, grief, interrupt or misuse GOG services or GOG content, +GOG users or GOG personnel or use them for any similar purpose. + + + +(e) Do not create, use, make available and/or distribute cheats, exploits, +automation software, robots, bots, mods, hacks, spiders, spyware, cheats, +scripts, trainers, extraction tools or other software that interact with or +affect GOG services or GOG content in any way (including, without limitation, +any unauthorized third party programs that intercept, emulate, or redirect any +communication between GOG or its partners and GOG services and/or any +unauthorized third party programs that collect information about GOG +services). + + + +(f) Don't interfere with the GOG or third party network software or other +software including via tunnelling, code injection, modifying or changing GOG +software, using any other similar software together with GOG services or GOG +content, through protocol emulation, or through creation or use of private +servers regarding GOG services or GOG content. Do not access or attempt to +access areas of GOG.COM, GOG GALAXY or GOG servers that have not been made +available to the public. + + + +(g) Don't do or say anything which is or may be considered racist, xenophobic, +sexist, defamatory or otherwise offensive or illegal (f.ex. exploiting minors, +encouraging violence, engaging in fraud). Be nice to each other please! + + + +(h) Don’t share, ‘buy’, ‘sell’, transfer, gift, lend, steal, misappropriate or +misuse GOG accounts. GOG keys/codes can only be gifted or transferred or used +in the ways permitted by GOG. If you have any questions or problems, contact +customer support. + + + +(i) We ask you to follow any applicable geographic or regional, language or +location-based restrictions, requirements or rules regarding GOG. + + + +(j) We ask you not to do anything in connection with GOG that infringes any +copyright, trademark, patent, trade secret, privacy, publicity, or other right +of others, such as images, photographs, sound files, text files, graphics +files, and any other material or information. + + + +11.2 In addition to the above, below is the list of additional terms that +apply to you when using GOG services. We do not want to repeat ourselves, but +it is important to remember that if you fail to follow them, it will be a +material breach of this Agreement, which could lead to a suspension or +cancellation of your access to GOG services. Here is the list: + + * GOG Code of Conduct ([link](https://support.gog.com/hc/articles/16033977811613)) + + * Infringing Content and Copyright Policy ([link](https://support.gog.com/hc/articles/16033687971613)). + + + +11.3 Every time we make a moderation decision resulting in restricting your +access to GOG services, whenever it is possible you should receive a statement +of reasons outlining why we have made this decision. If you do not agree with +the decision we have made, you have 6 months from the day that you have been +informed about the decision, to make a complaint. The details on how to make a +complaint should be available in your moderation decision. The description of +our complaint-handling system procedure is also available in the Infringing +Content & Copyright Policy +([here](https://support.gog.com/hc/articles/16033687971613)). + +## 12\. USER GENERATED CONTENT + +12.1 This section is about content (e.g. text, photos or links) which you make +available either to us or to other GOG users via GOG services (for example +through your profile picture or through messages to other GOG users). We'll +call this "User Generated Content". + + + +12.2 As far as we and you are concerned, you own any User Generated Content +but we need you to give us some limited rights over it so that we can actually +transmit it through GOG services. So, by posting User Generated Content you +give us a nonexclusive, irrevocable license to use, modify, reproduce, create +derivative works from, distribute, transmit, communicate and publicly +display/perform your User Generated Content in connection with GOG services. + + + +12.3 It is your responsibility to make sure that you have all necessary legal +rights before you use User Generated Content and for checking they are safe to +use – we can't know that ourselves, and we can't check it for you, so we have +to rely on you. + + + +12.4. However, we have the right (but not the obligation) to review and if +appropriate or legally necessary to remove any User Generated Content which is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. If +you find that any such content has been posted on GOG services, please let us +know. We ask you to read our Infringing Content and Copyright Policy +([link](https://support.gog.com/hc/articles/16033687971613)), where we explain +our procedure for reporting infringing content. If you still feel your case is +not fully resolved after our internal procedure, you have access to an out-of- +court dispute settlement - more on this in Section 20 below. + +## 13\. FEEDBACK OR SUGGESTIONS + +13.1 You’re welcome to give us feedback and suggestions to improve GOG +services and we really value them all. However, just so we’re clear, we don’t +have to use or accept them and we won’t owe you anything (financially or +otherwise) regarding them. + +## 14\. USING GOG CONTENT IN FAN WORK + +14.1 For fan work (e.g. works like fan mods, machinima, parodies, homages, +'Let's Play' or other videos or artwork), you need to check with the content +owner (e.g. the developer or publisher) if they are OK with it and if so you +should get permission from them. The reason is simple – the GOG content is the +property of the respective owner, not ours. + +## 15\. THIRD-PARTY CONTENT AND EXTERNAL SERVICES + +15.1 You might get links to third-party websites or content through GOG +services which aren’t connected to us. Using them is up to you – we’re not +responsible for them, we can't promise they will work, what they'll be like or +if they're free. + + + +15.2 You can also use your GOG account to get easy access to some external, +GOG approved partner services, e.g. The Witcher games and sites from our +sister company CD PROJEKT RED. They will have their own terms and conditions +which you will need to agree and follow. Just to be clear: using these +services is all optional and up to you. You have the power! + +## 16\. WARRANTIES AND LIMITATION OF LIABILITY REGARDING GOG SERVICES + +16.1 We warrant that: (i) we have the right to enter this Agreement and to +grant you the license to use GOG services in section 2.1; and (ii) we will +take reasonable care with the GOG services and your use of them; and (iii) we +will use reasonable endeavors to comply with applicable laws in performing our +obligations to you under this Agreement. + + + +16.2. Your representations and warranties. You represent and warrant that you +have the full power and ability to enter into this Agreement and will fully +follow its terms. You also represent and warrant that any User Generated +Content, which you transmit via GOG services does not infringe upon the +intellectual property rights of any third party. You further represent and +warrant that you will not use or contribute User Generated Content that is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. + + + +16.3. We work hard to try to make GOG content work on your systems but we only +have limited time to carry out tests and we don't always get everything right. +Therefore, we can't accept any liability or responsibility for GOG content +except where required by law (see 7.1.-7.2 above). We are also not responsible +for anything that happens to GOG.COM or GOG services which is outside of our +control and we do not guarantee GOG services will work 100% of the time. +However, don't forget you may be entitled to GOG content return and refund if +it has technical issues - see section 7.3. + +## 17\. TERMINATION + +17.1 Your right to terminate the Agreement. You may terminate this Agreement +at any time and without giving any reason by completely ceasing to use GOG +services. If you would like us to delete your account please contact our +Support Team [ here ](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog) or simply by sending an email +request to privacy@gog.com. Termination will not affect already existing +rights or obligations of us or you. + + + +17.2. Our right to terminate the Agreement. If you materially breach this +Agreement, we reserve the right to suspend or cancel your access to GOG +services and GOG content. By material breach of the Agreement we mean a +serious breach which could cause significant harm to GOG, GOG users, as well +as, in particular breach of the provisions of section 11 above or GOG Code of +Conduct. If we suspend or cancel your access to GOG services or GOG content +we'll take reasonable steps to contact you to explain why we have done this +and what (if anything) you can do as a result. + + + +17.3 It seems very unlikely, but if we have to stop providing access to GOG +services and GOG content permanently (not because of any breach by you), we +will try to give you at least sixty (60) days advance notice by posting a note +on www.GOG.COM and sending an email to every registered user – during that +time you should be able to download any GOG content you purchased. + +## 18\. FORCE MAJEURE + +18.1 Neither you nor us will be liable for any failure to perform any +obligation under this Agreement or to provide access to GOG services and GOG +content if that failure is caused by the happening of any unforeseen event +beyond your or our reasonable control including without limitation, Internet +outages, communications outages, fire, flood, war or act of God. + +## 19\. GOVERNING LAW + +### For users resident in the European Union and elsewhere in the world (but +not the USA): + +19.1 You and we agree that your use of GOG services and GOG content and this +Agreement will be governed by and interpreted according to the laws of the +Republic of Poland and that any dispute regarding this Agreement will be heard +non-exclusively by the courts of the Republic of Poland. In any legal claim +under this Agreement, the side which wins will be entitled to its legal fees +and expenses. + + + +19.2. The above choice of governing law and jurisdiction is subject to any +mandatorily applicable principles of consumer protection or other law in your +jurisdiction of residence which would not otherwise be available. + +### For users in the USA only: + +19.3 You and we agree that your use of GOG services and GOG content, and this +Agreement, will be deemed to be entered into in Los Angeles, California and +governed by and interpreted according to the laws of the State of California, +USA (and, if applicable, US federal law). Any legal claim by you against GOG +will be made exclusively in any state or federal court located in Los Angeles, +California, which will have subject matter jurisdiction regarding the dispute +between you and us and therefore we both consent to the exclusive jurisdiction +of those courts. In any legal claim under this Agreement, the side which wins +will be entitled to its legal fees and expenses. + +## 20\. CUSTOMER SUPPORT AND DISPUTE RESOLUTION + +20.1.If you have concerns, claims or issues with us, we hope we can resolve +them quickly and amicably. Please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). We will make reasonable and good +faith efforts to resolve any dispute between us informally. We undertake to +answer any claim within 14 days. + + + +20.2. If it is not resolved during this time, the next steps depend on where +you live. If you live within the EU you may submit your legal claims to the +online dispute resolution platform operated and provided by the European +Commission which can be accessed via http://ec.europa.eu/consumers/odr/ in +order to reach an out of court settlement or initiate a lawsuit. You may also +choose to resolve your dispute through any out-of-court dispute settlement +body certified by your country’s Digital Services Coordinator. + + + +20.3. If you live in the USA or the rest of the world (but not the EU) then +please contact us at legal@gog.com. + +## 21\. OTHER LEGAL STUFF + +21.1 If any part of this Agreement is found not to be legally enforceable, +this will not affect any other part of it. + + + +21.2 This Agreement (including any GOG additional terms referenced in it) +constitutes the entire agreement between you and us and supersedes any earlier +oral or written agreements. If you disagree with this, please contact us as +soon as possible after you start using GOG services at legal@gog.com since +otherwise this will be binding on you after a reasonable time period (usually +30 days). + + + +21.3 This Agreement governs our relationship with you (and vice versa). It +does not create any rights for anyone else. + + + +21.4 Please remember we are subject to various laws and we may be required to +comply with law enforcement or other legal requirements. + + + +21.5 If there is a reorganization, sale or merger of GOG then we may need to +work with relevant third parties to transfer or merge your GOG account. + + + +21.6. You and we agree that the UN Convention on Contracts for the +International Sale of Goods does not apply to this Agreement. + + + +21.7 We can assign, subcontract or transfer this Agreement to a third party or +another member of our group if necessary for the support of GOG, as part of +any reorganization or merger or for other business reasons. We will notify you +if this happens. + + + +21.8. If you are a European Union citizen, then please be aware that GOG has +enabled cross-border portability on free and paid content pursuant to +Regulation (EU) 2017/1128 of the European Parliament and of the Council of 14 +June 2017 on cross-border portability of online content services in the +internal market, but this is subject to any other legal requirements on GOG +including regarding IP protection and may also be subject to any requirements +of developer and publisher partners of GOG. + +## 22\. CHANGES TO THIS AGREEMENT + +22.1 We may change this Agreement if we think it's necessary, e.g. for legal +reasons or to reflect changes in GOG services or GOG content. If so, we will +make the changed Agreement available online at +https://support.gog.com/hc/articles/212632089 and (if you have a GOG account) +we will email you to let you know about any significant changes. + + + +22.2 Any changes to the Agreement will come into force within 30 days of their +announcement online. In the meantime, you're welcome to contact us at +legal@GOG.COM if you have specific questions about the changes. + + + +22.3 If you don't agree to those changes (regardless of whether you email us), +then unfortunately we must ask you to cease using GOG services and GOG +content. We're sorry we have to say that, but we hope you'll appreciate that +for GOG services to work properly we need to have everyone using it under the +same rules instead of different people having different rules. That's why we +encourage you to get in contact if you have queries or concerns. + + + +22.4 Just so you know, we'll never just make a bunch of changes to this +Agreement, not tell you what they are and force you to agree to changes you +don't understand before you can use GOG services! + +## 23\. OUR CONTACT DATA + +23.1. If you have any complaint concerning GOG account, GOG services, or +simply you would like to contact us, here are our contact details: + +Name: GOG sp. z o.o. +Registered Office: Ul. JagielloÅ„ska 74, 03-301 Warsaw, Poland +Registered at the District Court for Warsaw, 14th +Commercial Division of the National Court Register. +Registration Number 0000029514 +Tax number VAT ID (NIP) PL 113-21-77-807 +Share capital: PLN 135.750,00 PLN + +Single point of contact for authorities: +GOG Legal Team +legal@gog.com +Languages we communicate in: English, Polish +Single point of contact for recipients of GOG services: +GOG Support Team +support@gog.com +We mostly speak English and Polish, but will do our best to assist you in any +language that GOG is available in. +Last update (effective date): 17th February 2024 +See the previous version of the User +Agreement[here](https://support.gog.com/hc/articles/212632089). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/blackgate/tmp/EULA_fr-FR.txt b/info.exult.exult/data/blackgate/tmp/EULA_fr-FR.txt new file mode 100644 index 0000000..1d14990 --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/EULA_fr-FR.txt @@ -0,0 +1,1729 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM ACCORD UTILISATEUR + +## 1\. A PROPOS DE CET ACCORD + +1.1 Le présent accord est un contrat entre vous (nous vous dénommerons « vous +») et GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Varsovie, Pologne (nous nous +dénommerons « GOG » ou simplement « nous ») et s'applique à www.GOG.COM, à +votre compte utilisateur GOG, à l'application GOG GALAXY (y compris la +boutique GOG GALAXY), à tout jeu ou vidéo ou autre contenu ou service que vous +achetez ou auquel vous accédez par notre intermédiaire, aux forums web GOG, au +support client et technique GOG et aux autres services que nous vous +fournissons (nous dénommons tout cela «services de GOG» pour faire court). +Nous présentons ici vos droits et obligations en tant que bénéficiaire des +services de GOG. + +1.2. Des conditions supplémentaires pourraient s'appliquer aux services de GOG +et, si tel est le cas, nous les publierons pour que vous les acceptiez. Par +exemple, si vous souhaitez utiliser l'application GOG GALAXY, les conditions +correspondantes seront publiées pour acceptation avant que vous ne commenciez +à utiliser ces services. + +1.3 En outre, lorsque nous parlons de jeux, de contenu in-game, d'objets +virtuels, de monnaie ou de vidéos GOG ou d'autres contenus ou services que +vous pouvez acheter ou auxquels vous pouvez accéder via les services GOG, nous +les appelons respectivement "jeux GOG" ou "vidéos GOG" et lorsque nous parlons +de l'ensemble de ces éléments, il s'agit du "contenu GOG". + + + +1.4. Bien que nous n'ayons pas voulu rendre ce document trop long, il convient +de souligner qu'en acceptant notre accord d'utilisation, vous acceptez +également : + +â— notre[Politique de +confidentialité](https://support.gog.com/hc/articles/212632109), qui précise +les données que nous recueillons auprès de vous et les mesures que nous +adoptons pour les protéger, + +â— le [ Code de conduite de GOG +](https://support.gog.com/hc/articles/16033977811613) est un ensemble de +règles que vous devez suivre en tant que membre de notre communauté, + +â— notre [ Politique en matière de contenu illicite et de droits d'auteur +](https://support.gog.com/hc/articles/16033687971613) qui explique la +procédure de signalement d'un contenu illicite publié sur la plateforme GOG et +les résultats que vous obtiendrez en le faisant. + +1.5 GOG travaille avec des partenaires de confiance dont notre compagnie +affiliée, CD PROJEKT S.A., des développeurs, éditeurs, fournisseurs de +solution de paiement et d'assistance clientèle et d'autres sociétés +("Partenaires") – plus de détails sur les dits partenaires plus loin dans cet +Accord. + + + +1.6 Si vous avez plus de 18 ans, bienvenue sur GOG ! Si vous avez entre 16 et +18 ans, avant de vous souhaiter également la bienvenue, nous aimerions que +vous demandiez à un de vos parents ou à votre tuteur légal de lire et +d'accepter cet Accord en votre nom (car dans certains pays, les mineurs en +dessous d'un certain âge ne peuvent pas légalement accepter d'Accord de ce +type). Si vous n'avez pas encore 16 ans, vous ne pouvez pas posséder de compte +ni utiliser les services GOG car il nous est interdit légalement de détenir +des informations relatives à un enfant sans l'accord d'un parent ou tuteur +(que nous encourageons de leur côté). + +## 2\. UTILISATION DES SERVICES GOG ET DU CONTENU GOG + +2.1 Nous vous concédons, à vous et aux autres utilisateurs de GOG, le droit +(désigné sous le nom de "licence") d'utiliser les services GOG et de +télécharger, accéder et/ou regarder en streaming (selon le contenu) et +d'utiliser le contenu GOG. La présente licence est destinée à votre usage +strictement personnel. Nous pouvons interrompre ou suspendre la présente +licence dans certaines situations expliquées plus bas. + + + +2.2 Lorsque vous achetez, accédez ou installez des jeux GOG, vous devrez +parfois accepter les conditions d'utilisation supplémentaires du développeur +ou de l'éditeur du jeu (comme le Contrat de licence utilisateur final). En cas +d'incohérences ou de contradictions entre le CLUF tiers et cet Accord, cet +Accord prévaut. + + + +2.3 En ce qui concerne les vidéos GOG, vous pouvez regarder en streaming les +contenus vidéo que vous avez acheté ou les télécharger pour les regarder à +votre convenance. + + + +2.4 L'utilisation de certains scripts réalisés par des tiers est recommandée +pour un usage complet des fonctionnalités de GOG et, bien que cet usage reste +optionnel, il nous est impossible de promettre une performance optimale du +service sans ces scripts. + + + +2.5 Un mot rapide a propos de GOG GALAXY, notre application (optionnel) qui +vous permet non seulement d'acquérir et d'accéder à du contenu GOG mais qui +offre également des services cool comme une bibliothèque de jeux unifiée et +une liste d'amis sur toutes les plateformes, de jeu multijoueur en ligne, des +succès, du chat cross-plateforme, le suivi de votre temps de jeu, des +sauvegardes dans le cloud et un overlay en jeu. Vous pouvez en apprendre plus +à ce sujet[ici](https://www.gog.com/galaxy). + + + +2.6 Dans certaines parties des services GOG, nous utilisons des systèmes de +recommandation pour vous présenter le contenu qui est le plus susceptible de +vous intéresser. Vous pouvez découvrir où nous les utilisons et comment ils +fonctionnent[ici](https://support.gog.com/hc/articles/16034228157213), y +compris les principaux paramètres que nous utilisons et comment les +influencer. + +## 3\. COMPTES GOG + +3.1 Pour acheter du contenu GOG via les services GOG, et dans certains cas +pour jouer/utiliser le contenu GOG lorsque nos partenaires requièrent +l'utilisation d’un compte GOG, vous allez devoir créer un compte GOG. Cela +nécessite la création d'un mot de passe (codé de façon à nous en restreindre +l’accès) et d'un nom d'utilisateur, et de nous communiquer votre adresse +e-mail (à des fins d'identification). Assurez-vous de conserver vos +identifiants de connexion en sécurité et de surveiller l'utilisation de votre +compte. Dans les paramètres de votre compte GOG, vous pouvez si vous le +souhaitez indiquer votre pays de résidence, votre date de naissance et votre +avatar. Notre Politique de confidentialité vous expliquera plus en détail le +type d'informations que nous collectons et la façon dont nous les utilisons et +dont nous les protégeons. Vous pouvez la +trouver[ici](https://support.gog.com/hc/articles/212632109). + + + +3.2 Vous pouvez utiliser votre compte GOG pour créer un profil public +accessible aux autres utilisateurs. Vous pouvez également utiliser votre +compte GOG pour vous connecter avec d'autres utilisateurs GOG. Nous vous +prions de vous comporter raisonnablement et de garder à l'esprit que vous êtes +responsable de vos actes. + + + +3.3 Votre compte GOG et votre contenu GOG est strictement personnel et ne peut +être partagé, vendu, offert ou transféré à quiconque. Votre utilisation et +votre accès à ce contenu sont soumis aux conditions d'utilisation de GOG qui +sont soumis à la [ Politique de confidentialité +](https://support.gog.com/hc/articles/212632109) et au [ Code de conduite +](https://support.gog.com/hc/articles/16033977811613) de GOG, qui sont mis à +jour ou modifiés en cas de nécessité. + + + +3.4 L'accès et l'utilisation des jeux achetés sur différentes plateformes +(c'est-à-dire avec ce que nous dénommons un « Accès sans Clé »), y compris la +configuration minimale requise, sont régis par les politiques respectives des +plateformes tierces et (le cas échéant) par des conditions contractuelles +supplémentaires fixées par le développeur ou l'éditeur du jeu (par exemple, il +peut vous demander d'accepter un accord de licence d'utilisateur final +spécifique au jeu). Il peut être nécessaire de disposer d'un compte sur une +plateforme tierce. Ces plateformes peuvent proposer des modifications ou des +mises à jour des jeux que vous avez achetés. + +## 4\. CONFIGURATION SYSTÈME REQUISE + +4.1 GOG vous donne accès à de nombreux jeux et services, qui n'ont pas tous +été développés au même moment, ni pour les mêmes plateformes, c'est pourquoi +nous ne pouvons pas vous donner la configuration requise pour l'ensemble des +services GOG ou du contenu GOG. + + + +4.2 Ce que nous pouvons vous dire, c'est que l'utilisation des jeux GOG +nécessite un ordinateur ainsi qu’une souris et un clavier (les contrôles +tactiles ne sont pas supportés) et le système d'exploitation approprié (merci +de vous référer à la page du produit GOG concerné) ainsi que l’installation +des packs de services et des mises à jour importantes. Tous les jeux GOG +doivent être installés en natif sur un ordinateur qui remplit les +spécifications matérielles ou logicielles indiquées (ou supérieures) sur la +page produit GOG. Les jeux GOG ne sont pas testés sur une machine virtuelle et +nous ne pouvons donc vous fournir l'infrastructure nécessaire pour y jouer +depuis le site. + + + +4.3 Pour les vidéos GOG, assurez-vous que votre lecteur vidéo lit les formats +spécifiés sur la page produit GOG. + + + +4.4 Si vous avez des questions sur la configuration requise, n'hésitez pas à +nous contacter ici. Nous tenons à préciser que vous êtes seul responsable de +votre connexion Internet, qui doit être suffisante pour télécharger les jeux +GOG achetés ou les vidéos GOG à regarder en streaming et de l'adéquation de +votre système d'exploitation aux jeux et aux vidéos GOG. + +## 5\. BETAS + +5.1 Au fur et à mesure que GOG se développe, nous pouvons vous offrir un accès +facultatif à des versions « bêta » de logiciels ou de services de GOG (par +exemple, de nouvelles versions de l'application GOG GALAXY mises à disposition +avant sa sortie générale) ou à du contenu GOG. + + + +Voici les règles: + + + +a) Nous (ou le cas échéant, tout autre éditeur/partenaire) définissons les +conditions et les prérequis pour votre accès beta. La proposition d'une beta +et sa maintenance, ainsi que le choix des joueurs qui peuvent l'utiliser +restent à notre seule discrétion. + + + +b) Il pourra vous être demandé de suivre un processus d'enregistrement ou de +remplir d'autres conditions pour accéder à la beta (et cela peut inclure et +nécessiter que vous remplissiez les conditions d'éligibilité). + + + +c) Les betas seront imitées dans le temps et peuvent donner lieu à des +prérequis et contrats supplémentaires. + + + +d) La beta peut impliquer des disparitions, réinitialisations ou corrections +temporaires ou permanentes de serveur/progression/contenu. + + + +e) La beta peut être soumise à des restrictions de confidentialité (qui seront +notifiées à l'avance le cas échéant). + + + +f) Vous pourrez parfois être invité à participer à un processus pour partager +vos impressions sur la beta. Ce processus est totalement optionnel mais votre +participation sera grandement appréciée. + + + +g) La version bêta est destinée à votre usage personnel et à votre plaisir, +vous ne devez donc pas le vendre, le prêter ou le transférer de quelque +manière que ce soit à une tierce personne. + + + +h) L'objectif de vous donner un accès beta est de vous permettre d'essayer +quelque chose de nouveau, mais nous vous demandons de reconnaître qu'elle +n'est pas encore complète. Par conséquent, les beta seront fournies "en +l'état" et ne font l'objet d'aucunes promesses additionnelles, ni d'engagement +de responsabilité de notre part si le logiciel s’avère incomplet, ou ne +fonctionne pas entièrement ou encore crée des problèmes potentiels. Les betas +peuvent ne pas contenir l'intégralité des fonctionnalités et des +fonctionnalités peuvent être changées, modifiées ou supprimées au cours de la +beta. + +## 6\. PAIEMENT ET REMBOURSEMENT DES CONTENUS GOG + +Paiement des contenus GOG + + + +6.1 Si vous décidez d'acquérir un jeu, une vidéo ou autre contenu GOG, vous +devez en général payer votre achat avant de pouvoir y accéder (bien que nous +proposions également des contenus gratuits !). Vous pouvez payer par plusieurs +méthodes de paiement : (i) en utilisant une carte de débit ou de crédit +valide; ou (ii) en utilisant PayPal ou tout autre fournisseur de paiement +autorisé. Gardez vos informations de paiement en lieu sûr. + + + +6.2 Quand vous utilisez une méthode de paiement pour acheter du contenu GOG, +nous nous appuyons sur votre promesse selon laquelle vous êtes en mesure +d'utiliser cette méthode. Vous êtes responsable de tout achat effectué en +utilisant votre compte GOG ou votre méthode de paiement et vous acceptez les +politiques relatives aux prix, au paiement et à la facturation qui leur sont +applicables, telles qu'elles vous sont communiquées au moment de l'achat. Tous +les paiements ne sont ni remboursables ni transférables, sauf dans les cas +expressément prévus par le présent accord. + + + +6.3 Vous pouvez régler vos achats de contenu GOG en dollars américains. +Cependant, si vous habitez dans un pays dont nous supportons la monnaie locale +(voir notre section Support pour plus de détails), vous pourrez payer dans +votre monnaie locale. Si vous réglez vos achats dans une monnaie différente de +celle en cours dans votre pays, vous devrez payer des frais de change auxquels +votre banque peut ajouter une commission. + + + +6.4. Tous les prix sont visibles sur la page du catalogue des produits. Ils +comprennent les taxes telles que la TVA, le cas échéant. Vous devez également +vous attendre à ce que certaines taxes sur la valeur ajoutée soient ajoutées à +votre prix lors du paiement, si la législation locale l'exige (par exemple, +aux États-Unis ou au Canada). + + + +Porte-monnaie GOG + + + +6.5 GOG offre à ses utilisateurs un solde numérique appelé le "Porte-monnaie +GOG" en relation avec votre compte d'utilisateur, que vous pouvez utiliser +pour réaliser des achats de contenu GOG sur les services GOG dédiés. Des fonds +peuvent être ajoutés de deux façons : (i) en utilisant votre méthode de +paiement choisie ; ou (ii) de notre part dans le cadre de notre "Politique de +remboursement volontaire" auquel cas nous pouvons offrir des remboursements +sur le Portefeuille GOG que vous pouvez utiliser pour obtenir un jeu GOG de +remplacement ou tout autre contenu GOG. La disponibilité du Porte-monnaie GOG +est sujette aux règles qui sont énumérées sur notre page Porte-monnaie +GOG,[ici](https://support.gog.com/hc/articles/360001941953-FAQ-GOG-Wallet). + + + +Codes bonus GOG + + + +6.6 Nous pouvons aussi vous proposer des codes bonus limités dans le temps qui +vous permettront d'accéder à des contenus GOG gratuitement ou à prix réduit +(désignés comme "Codes bonus"). Si vous recevez des codes bonus lorsque vous +achetez du contenu GOG, mais que vous décidez par la suite de retourner ce +contenu GOG, nous pensons qu'il est juste que vous retourniez également les +codes bonus. Par conséquent, nous la résilierons ou, si elle a été échangée +contre un jeu GOG, ce jeu sera supprimé de votre compte. + + + +Distribution automatique sur le compte + + + +6.7 Nous disposons d'une fonctionnalité de distribution automatique sur le +compte (désignée comme "Distribution automatique sur le compte GOG") où des +plateformes de distribution, avec qui nous sommes partenaires, pourront vous +vendre des jeux et d'autres contenus que vous pourrez choisir d'activer +automatiquement avec votre compte GOG, sans avoir besoin d'utiliser un code. +Cela signifie que l'intégralité du processus d'achat sera gérée par l'autre +plateforme. Par conséquent, en cas de problème avec le processus d’achat, +veuillez les contacter directement. Dans ce cas là, nous ne pourrons donc pas +vous offrir notre politique de remboursement volontaire (parce que GOG n'a pas +vendu le jeu/contenu). Bien entendu, tout ce qui concerne les services sur +notre plateforme reste notre responsabilité. + + + +6.8 Merci d'utiliser ce système de façon raisonnable et de ne pas en abuser +(par exemple en utilisant des VPN (Réseau privé gratuit) ou toute autre +méthode modifiant votre pays de résidence), ce ne serait pas correct. + +## 7\. REMBOURSEMENTS ET RETOURS + +## Droits de remboursement légaux + + + +7.1. Si vous êtes résident d'un pays de l'Union européenne ou d'autres pays +dont la juridiction est applicable (à l'exclusion des États-Unis), vous avez +le droit légal de vous retirer d'un achat de contenu GOG dans les 14 jours +suivant votre achat, sans donner de motif. Pour exercer le droit de +rétractation, vous devez nous informer de votre décision de rétractation du +présent contrat par une déclaration non équivoque (un courriel envoyé à +support@GOG.COM, ou une lettre physique à l'adresse indiquée à l'article 23 +ci-dessous). Vous pouvez utiliser le modèle de formulaire de rétractation +joint à la fin du présent accord, mais vous n'êtes pas obligé de le faire. +Pour que le délai de rétractation soit respecté, il suffit que vous +transmettiez votre communication relative à l‘exercice du droit de +rétractation avant l‘expiration du délai de rétractation. Toutefois, cela ne +s'applique pas lorsque vous avez expressément consenti à l'exécution du +contenu GOG (qui est un contenu numérique) dès la conclusion du processus +d'achat et que vous avez reconnu la perte de vos droits de rétractation. + + + +7.2. Ni cette section ni aucune autre de cet Accord utilisateur n'ont d'effets +sur vos droits légaux. En particulier : + +a) Pour les utilisateurs australiens : nos produits sont accompagnés de +garanties qui ne peuvent pas être exclues en vertu de la loi australienne sur +la consommation (Australian Consumer Law). Vous avez droit à un remplacement +ou à un remboursement pour une défaillance majeure et à une indemnisation pour +toute autre perte ou dommage raisonnablement prévisible. Vous avez également +le droit de faire réparer ou remplacer les marchandises si les marchandises ne +sont pas de qualité acceptable et que la défaillance ne constitue pas une +défaillance majeure; + + +b) Pour les utilisateurs néo-zélandais : ni cette clause, ni aucune autre de +cet Accord Utilisateur, ne peut exclure, limiter ou modifier l’application des +droits ne pouvant être exclus, limités ou modifiés, y compris ceux conférés +par la loi de 1993 sur les garanties à la consommation en Nouvelle-Zélande +(New Zealand Consumer Guarantees Act 1993). En vertu de cette loi, il existe +des garanties stipulant que les biens et services doivent être de qualité +acceptable. Si cette garantie n'est pas respectée, vous êtes en droit de +demander une rectification du logiciel (ce qui peut inclure sa réparation, son +remplacement ou son remboursement). Si une rectification ne peut être fournie +ou si la défaillance présente un caractère substantiel, la loi prévoit un +remboursement. + + + +Notre Politique de remboursement volontaire + + + +7.3 Nous savons que parfois un achat peut ne pas être à la hauteur de vos +espérances et nous souhaitons être justes avec nos utilisateurs. C'est +pourquoi, en plus de vos droits de remboursement légaux (décrits dans les +sections 7.1.- 7.2. ci-dessus), nous pourrions vous offrir une Politique de +remboursement volontaire +décrite[ici](https://support.gog.com/hc/articles/360006129837). Dans de rares +cas, si nous avons des doutes raisonnables concernant votre demande de +remboursement nous ne pourrions pas appliquer la politique de remboursement +volontaire. En aucun cas, cela ne vous privera des droits de remboursement +légaux applicables. Une vente est considérée comme définitive lorsque vos +droits de remboursement expirent (sauf si nous en convenons autrement au cas +par cas). + +## 8\. MONNAIE ET OBJETS VIRTUELS + +8.1 Avec certains contenus GOG, vous aurez la possibilité d’acheter ou +d’obtenir des objets virtuels et/ou de la monnaie virtuelle (nous les appelons +“Biens Virtuelsâ€). Les biens virtuels sont soumis à cet accord et en +particuliers aux règles qui vont suivre, sauf s' il existe des règles +spécifiques pour ce contenu GOG (ce qui prévaut sur ces règles). + + + +8.2 Les Biens virtuels sont des objets exclusivement numériques qui ne +disposent d'aucune valeur monétaire ou d'existence dans le monde réel. Ils ne +peuvent pas être "achetés", "vendus", donnés, transférés ou échangés, que ce +soit ou non contre d'autres Biens virtuels, de l'argent "réel", des biens, des +services ou des objets d'une valeur monétaire. Échanger des Biens virtuels est +strictement interdit (à moins que vous ne disposiez d'une permission expresse +et spécifique de le faire). Votre droit à utiliser tout type de Biens virtuels +se limite à une licence non exclusive, non assignable, non transférable, qui +ne peut être ni cédée sous une forme de sous-licence, ni révoquée, limitée +dans le cadre d'un usage strictement réservé à votre divertissement personnel +et non commercial du contenu GOG en question. Vous ne possédez aucun intérêt, +titre ou droit de propriété sur aucun des Biens virtuels, lesquels restent la +propriété de l'éditeur concerné. Les Biens virtuels sont susceptibles d’être +changés, amendés ou retournés si nécessaire, y compris pour faire appliquer +cet Accord. Si cela se révèle nécessaire, des limites peuvent être appliquées +sur l'utilisation des Biens virtuels (y compris des limites de transaction, de +solde et de quantité). + + + +8.3 L'existence d'une offre particulière de Biens virtuels ne représente pas +un engagement de notre part de maintenir ou de continuer à fournir des Biens +virtuels ni ne garantit que cette offre restera disponible dans le futur. La +quantité, la variété et le type de Biens virtuels que vous pouvez obtenir +peuvent varier et nous disposons d'un droit de gestion, de modification et de +suppression pour tous les Biens virtuels si nous considérons cela nécessaire +pour la bonne continuation des opérations sur GOG ou des contenus GOG, ou pour +toute autre raison légitime. Dans ce cas, nous ne pourrons pas être tenus +responsables envers vous ou toute autre personne pour notre exercice de ces +dits droit. Nous tâcherons dans la limite du raisonnable de vous notifier de +tout changement et d'expliquer la raison de ces changements. + +## 9\. CORRECTIONS, MISES A JOUR ET MODIFICATIONS + +9.1 Il peut arriver de façon occasionnelle que nous ayons besoin d'implémenter +des corrections ou de mettre à jour les services de GOG ou les contenus GOG +(par exemple pour ajouter ou supprimer des fonctionnalités ou résoudre des +bugs logiciels). Nous avons besoin de ces droits pour que GOG fonctionne +efficacement et en toute sécurité. Le fait de ne pas corriger ou mettre à jour +les services GOG ou le contenu GOG peut entraîner une performance inférieure +de votre version ou une incompatibilité de votre version avec certaines +fonctionnalités des services GOG ou du contenu GOG. Dans ce cas, vous risquez +également de ne pas installer des mises à jour de sécurité importantes. Nos +partenaires peuvent utiliser les services GOG pour déployer des correctifs ou +des mises à jour relatifs au contenu GOG applicable. + +## 10\. PROPRIÉTÉ DES SERVICES GOG ET DROITS DE PROPRIÉTÉ INTELLECTUELLE + +10.1 Les services GOG, y compris mais non limités à leurs graphismes, code, +interface utilisateur, aspect, son et musique, vidéos, texte, mise en page, +base de données, données et tout autre contenu, et tous les droits et droits +d'exploitation qui leur sont liés, sont notre propriété ou celle de nos +licenciés. Les contenus GOG sont la propriété de leurs développeurs/éditeurs +respectifs et distribués par GOG sous licence. Tous droits réservés sauf +précisé dans cet Accord. Vous ne pouvez utiliser ou exploiter aucun élément +des services GOG ou des contenus GOG autres que ceux précisés dans cet Accord. + + + +10.2 GOG respecte les droits de propriété intellectuelle d'autrui. Pour en +savoir plus, +cliquez[ici](https://support.gog.com/hc/articles/213224285?product=gog). + +## 11\. RÈGLES D’UTILISATION DES SERVICES GOG + +11.1 Merci de respecter les présentes règles relatives aux services et au +contenu de GOG, ainsi que toutes les règles supplémentaires que nous indiquons +dans le paragraphe 11.2 ci-dessous. Veuillez lire attentivement ces règles, +car le non-respect de celles-ci (en particulier celles relatives à la +tricherie) sera considéré comme une violation substantielle du présent accord, +ce qui pourrait entraîner la suspension ou l'annulation de votre accès aux +services de GOG. Il s'agit des règles suivantes : + +a) N'utilisez les services ou le contenu de GOG que pour vos loisirs +personnels (par exemple, ne les utilisez pas pour gagner de l'argent, pour le +piratage ou à des fins politiques). + +(b) En ce qui concerne le contenu de GOG, ce que vous pouvez faire +pratiquement en plus de jouer aux jeux (comme créer des Å“uvres dérivées) +dépend de ce que le détenteur des droits sur le contenu de GOG vous autorise à +faire (GOG ne peut pas accorder de tels droits). Veuillez donc vous adresser +directement au détenteur des droits (la première chose à faire est de vérifier +s'il existe un CLUF et, le cas échéant, ce qu'il prévoit). Nous vous +recommandons également de ne faire que des tentatives légitimes pour améliorer +le contenu de GOG. + + + +(c) En ce qui concerne les services GOG (ce qui inclue le logiciel GOG), a +moins que vous n'ayez obtenu l'autorisation préalable de GOG, merci de ne pas +les modifier, fusionner, distribuer, traduire, rétro-concevoir, décompiler, +désassembler ou en créer des oeuvres dérivées ¬ à moins que vous n'y soyez +autorisés par cet Accord ou par les lois de votre pays. Nous voudrions +insister sur le fait que vous êtes libres de nous contacter pour obtenir la +permission d'effectuer ces actions et nous nous pencherons sur ces requêtes en +toute bonne foi. Plus généralement, nous avons pour projet d'ouvrir des +protocoles clients pour faciliter l'utilisation des données et des logiciels +GOG et éviter le recours à la rétro-conception ou des techniques similaires. + + + +(d) Ne commettez pas d'action de piratage, nuisance, interruption ou +d'utilisation abusive contre les services GOG, les contenus GOG, les +utilisateurs de GOG ou le personnel de GOG, et n'utilisez pas lesdits services +avec des objectifs similaires. + + + +(e) Ne pas créer, utiliser, mettre à disposition ou distribuer des fraudes, +des exploits, des logiciels d'automatisation, des robots, des bots, des mods, +des hacks, des spiders, des spywares, des cheats, des scripts, des trainers, +des outils d'extraction ou d'autres logiciels qui interagissent avec ou +affectent les services de GOG ou le contenu GOG de quelque manière que ce soit +(y compris, sans limitation, tout programme tiers non autorisé qui intercepte, +émule ou redirige toute communication entre GOG ou ses partenaires et les +services de GOG ou tout programme tiers non autorisé qui recueille des +informations sur les services de GOG). + + + +(f) Ne pas interférer avec le logiciel du réseau de GOG ou de tiers ou avec +d'autres logiciels, notamment par l'intermédiaire d'un tunnel, d'une injection +de code, d'une modification ou d'un changement du logiciel de GOG, de +l'utilisation de tout autre logiciel similaire avec les services de GOG ou le +contenu de GOG, par l'intermédiaire d'une émulation de protocole ou par la +création ou l'utilisation de serveurs privés en ce qui concerne les services +de GOG ou le contenu de GOG. N'accédez pas ou ne tentez pas d'accéder à des +zones de GOG.COM, GOG GALAXY ou des serveurs GOG qui n'ont pas été mises à la +disposition du public. + + + +(g) Ne pas adopter un comportement ou tenir un propos qui soit ou puisse être +considéré comme raciste, xénophobe, sexiste, diffamatoire ou autrement +offensant ou illégal (par exemple, exploiter des mineurs, encourager la +violence, se livrer à la fraude). Soyez gentils les uns envers les autres, +s'il vous plaît! + + + +(h) Ne partagez pas, n'"achetez" pas, ne "vendez" pas, ne transférez pas, ne +donnez pas, ne prêtez pas, ne volez pas, ne vous appropriez pas, n'utilisez +pas de comptes GOG de manière malhonnête. Les clefs/codes GOG ne peuvent être +donnés ou transférés ou utilisés que dans le cadre limité des usages autorisés +par GOG. Si vous avez des questions ou rencontrez des problèmes, veuillez +contacter l'assistance clientèle. + + + +(i) Nous vous demandons de bien vouloir suivre et respecter toutes les +restrictions de langage, les pré-requis ou règles géographiques ou régionales, +basées sur la géolocalisation, concernant GOG. + + + +(j) Nous vous demandons de ne pas réaliser d'actions en relation avec GOG qui +transgressent tout type de droits d'auteurs, marques déposées, brevets, +secrets commerciaux, droits à la vie privée et de publicité ou tous les autres +droits appartenant à autrui, tels que des images, des photographies, des +fichiers sonores, textuels, graphiques et tout autre type de matériel ou +d'informations. + +11.2 En plus de ce qui précède, vous trouverez ci-dessous la liste des +conditions supplémentaires qui s'appliquent à vous lorsque vous utilisez les +services de GOG. Sans vouloir nous répéter, il convient de se rappeler que si +vous ne les suivez pas, il s'agira d'une violation substantielle du présent +accord, qui pourrait entraîner la suspension ou l'annulation de votre accès +aux services de GOG. Il s'agit des éléments suivants : + +â— le Code de conduite de GOG +([lien](https://support.gog.com/hc/articles/16033977811613)) + +â— la Politique en matière de contenus illicites et de droits d'auteur +([lien](https://support.gog.com/hc/articles/16033687971613)). + +11.3 Chaque fois que nous prenons une décision de modération entraînant une +restriction de votre accès aux services de GOG, vous devez recevoir, dans la +mesure du possible, un exposé des motifs expliquant pourquoi nous avons pris +cette décision. Si vous n'êtes pas d'accord avec la décision que nous avons +prise, vous disposez d'un délai de six mois à compter de la date à laquelle +vous avez été informé de la décision pour déposer une plainte. Les +informations sur la manière de déposer une plainte doivent figurer dans votre +décision de modération. La description de notre procédure de traitement des +plaintes est également disponible dans la Politique en matière de contenus +illicites et de droits +d'auteur[(ici)](https://support.gog.com/hc/articles/16033687971613). + +## 12\. CONTENU GÉNÉRÉ PAR LES UTILISATEURS + +12.1 Cette section concerne les contenus (textes, vidéos, images, captures +d’écran, fonds d’écran, photos, liens...) que vous mettez à notre disposition +ou à celle des autres utilisateurs GOG (par exemple votre photo de profil ou +les messages que vous envoyez aux autres utilisateurs GOG). Nous appelons ça +le "Contenu généré par les utilisateurs" + + + +12.2 Nous considérons que vous êtes propriétaire des contenus que vous générez +mais nous avons besoin que vous nous octroyez des droits limités à leur +encontre, pour que nous puissions les transmettre via les services GOG. Par +conséquent, en publiant du contenu généré par l'utilisateur, vous nous donnez +une licence non exclusive et irrévocable pour utiliser, modifier, reproduire, +créer des Å“uvres dérivées, distribuer, transmettre, communiquer et afficher ou +exécuter publiquement votre contenu généré par l'utilisateur en relation avec +les services de GOG. + + + +12.3 Il est de votre responsabilité de vous assurer que vous détenez tous les +droits nécessaires à l'utilisation des contenus que vous générez et que vous +pouvez légalement les utiliser. Nous ne sommes pas en mesure de le savoir et +nous n'avons aucun moyen de le vérifier, nous devons donc nous en remettre à +vous. + + + +12.4. Nous avons cependant le droit (mais pas l'obligation) de vérifier et, si +nécessaire ou légalement requis, de supprimer tout Contenu généré par les +utilisateurs qui serait à caractère illégal, délictuel, diffamatoire, obscène, +attentatoire à la vie privée d'une autre personne, menaçant, harcelant, +abusif, haineux, raciste ou pornographique, qui porterait atteinte à la vie +privée des personnes, ou qui serait de nature à menacer ou harceler des tiers. +Si vous pensez que du contenu répondant à ces critères a été posté sur les +services GOG, merci de nous le faire savoir. Nous vous invitons à lire notre +Politique en matière de contenus illicites et de droits d'auteur +([ici](https://support.gog.com/hc/articles/16033687971613)), où nous +expliquons notre procédure de signalement des contenus illicites. Si vous +estimez que votre cas n'est pas entièrement résolu après notre procédure +interne , vous avez la possibilité de recourir à un règlement extrajudiciaire +du litige. Pour en savoir plus, voir la section 20 ci-dessous . + +## 13\. COMMENTAIRES ET SUGGESTIONS + +13.1 Nous vous invitons à nous faire part de vos commentaires et suggestions +concernant les services GOG. Ils nous sont précieux. Cependant, nous tenons à +ce qu'il soit clairement établi que nous n'avons aucune obligation d'en tenir +compte ou de les accepter et qu'ils ne donnent lieu à aucune compensation +(financière ou autre) de notre part. + +## 14\. UTILISATION DU CONTENU GOG ET FAN WORK + +14.1 Pour la réalisation de fan work (c'est¬-a¬-dire de fan mods, machinima, +parodies, hommages, vidéos "Let's Play" et autres ou illustrations), vous +devez obtenir au préalable l'accord du propriétaire du contenu (le développeur +ou l'éditeur). La raison est simple : les contenus GOG appartiennent à leurs +propriétaires respectifs et non à GOG. + +## 15\. CONTENU ET SERVICES EXTERNES TIERS + +15.1 Vous pourrez trouver des liens vers des sites ou des contenus tiers au +sein des services GOG. Vous êtes libres de les utiliser ou non mais nous ne +pouvons pas vous assurer qu'ils fonctionneront, vous dire vers quoi ils +pointent ou s'ils seront gratuits. + + + +15.2 Vous pouvez également utiliser votre compte GOG pour un accès rapide a +des services de partenaires externes approuvés par GOG, par exemple, les jeux +et les sites The Witcher de notre société apparentée CD PROJEKT. Ils possèdent +leurs propres conditions d'utilisation, que vous devrez accepter et respecter. +Juste pour être clair : l'utilisation de ses services est optionnelle et +dépend de vous. Vous avez le pouvoir ! + +## 16\. GARANTIES ET LIMITATION DE LA RESPONSABILITÉ DES SERVICES GOG + +16.1 Nous garantissons que : (i) nous avons le droit de conclure cet Accord et +de vous accorder une licence d'utilisation des services GOG telle que décrite +dans la section 2.1 ; et (ii) nous apporterons un soin raisonnable aux +services GOG et à votre utilisation de ces services ; et (iii) nous ferons des +efforts raisonnables pour être en conformité avec les lois applicables dans +l'exercice de nos obligations envers vous en vertu de cet Accord. + + + +16.2. Représentation et garanties. Vous êtes en capacité de vous représenter +et garantissez que vous êtes habilité à conclure cet Accord, et que vous le +suivrez dans son intégralité. Vous garantissez également que tout Contenu +généré par les utilisateurs que vous hébergez sur les services GOG n'enfreint +pas les droits de propriété intellectuelle d'un tiers quelconque. Enfin, vous +garantissez que vous ne ferez pas usage ni contribuerez à du Contenu généré +par les utilisateurs qui serait à caractère illégal, délictuel, diffamatoire, +obscène, abusif, haineux, raciste ou pornographique, qui porterait atteinte à +la vie privée des personnes, ou qui serait de nature à menacer ou harceler des +tiers. + + + +16.3 Nous faisons de notre mieux pour que les contenus GOG fonctionnent +correctement sur vos systèmes d'exploitation mais nous avons un temps limité +pour procéder aux tests et il est possible que certaines choses nous +échappent. Par conséquent, nous ne pouvons être tenus responsables des +contenus GOG, sauf lorsque expressément stipulé par la loi (voir 71 et 7.2 ci- +dessus). Nous ne pouvons être tenus responsables d'événements relatifs aux +services ou au contenu GOG.COM en dehors de notre contrôle et nous ne +garantissons pas que les services de GOG fonctionnent à 100 % du temps. +Cependant, n'oubliez pas que vous pouvez nous retourner le contenu GOG et +obtenir un remboursement si vous rencontrez des problèmes techniques (voir +section 7.3). + +## 17\. RÉSILIATION + +17.1 Votre droit de mettre fin à l’accord. Vous pouvez annuler ou mettre fin à +cet Accord à tout moment et sans avoir à donner de raisons en cessant +définitivement d'utiliser les services GOG. Si vous souhaitez que nous +supprimions votre compte, veuillez contacter notre équipe d'assistance [ ici +](https://support.gog.com/hc/requests/new?category=info&product=gog) ou +simplement en envoyant une demande par courrier électronique à +privacy@gog.com. La résiliation n'affectera pas les droits ou obligations déjà +existants à notre égard ou au vôtre. + + + +17.2 Notre droit de mettre fin à l'accord. Si vous enfreignez +substantiellement le présent accord, nous nous réservons le droit de suspendre +ou d'annuler votre accès aux services de GOG et au contenu GOG. Par violation +substantielle de l'accord, nous entendons une violation grave qui pourrait +causer un préjudice important à GOG, aux utilisateurs de GOG, ainsi que, en +particulier, une violation des dispositions de la section 11 ci-dessus ou du +Code de conduite de GOG. Si nous suspendons ou annulons votre accès aux +services de GOG ou au contenu GOG, nous prendrons des mesures raisonnables +pour vous contacter afin de vous donner les raisons pour lesquelles nous avons +pris cette décision et la mesure que vous pouvez suivre (le cas échéant) en +conséquence. + + + +17.3 Même si cela semble peu probable, dans le cas ou nous serions dans +l'obligation de suspendre l’accès aux services et aux contenus GOG de façon +définitive (et non à cause d'une violation de votre part), nous essaierons de +vous avertir au moins soixante (60) jours à l'avance en publiant un billet sur +www.GOG.COM et en envoyant un email à tous les utilisateurs enregistrés. +Durant toute cette période, vous pourrez télécharger tous les contenus GOG que +vous avez achetés. + +## 18\. FORCE MAJEURE + +18.1 Aucune des parties ne pourra être tenue responsable en cas de manquement +aux obligations du présent Accord ou en cas d'impossibilité de fournir un +accès aux services et aux contenus GOG si cette impossibilité est causée par +un événement imprévisible indépendant de notre ou de votre volonté, y compris +mais de façon non limitative, les coupures Internet, pannes de communications, +incendies, inondations, guerre et catastrophes naturelles. + +## 19\. LOI APPLICABLE + +Pour les utilisateurs résidant dans un pays de l'Union Européenne et ailleurs +dans le monde (en dehors des États-Unis): + + + +19.1 Par la présente, nous acceptons mutuellement que l'utilisation des +services et contenus GOG et cet Accord seront régis par les lois de la Pologne +et que tout différend relatif au présent Accord relèvera de la compétence +nonexclusive des tribunaux Polonais. Pour toute action en justice relevant du +présent Accord, la partie perdante sera condamnée aux dépens. + + + +19.2. Le choix de juridiction et de loi applicable ci-dessus est sujet aux +principes de protection des consommateurs obligatoirement applicables ou à +toute autre loi de votre juridiction de résidence qui ne seraient pas +disponibles autrement. + + + +Pour les utilisateurs résidant aux États-Unis uniquement: + + + +19.3 Par la présente, nous acceptons mutuellement que l'utilisation des +services et contenus GOG et cet Accord seront régis par les lois applicables à +Los Angeles, en Californie, et que tout différend relatif au présent Accord +sera régi et interprété selon les lois de l'État de Californie, aux +États-¬Unis (et, si applicable, selon les lois fédérales américaines). Toute +action en justice entamée par vous contre GOG le sera exclusivement devant un +tribunal d'État ou fédéral de Los Angeles, en Californie, réputé compétent +pour juger notre litige et en conséquence, par la présente, nous reconnaissons +mutuellement la compétence exclusive de ces tribunaux. Pour toute action en +justice relevant du présent Accord, la partie perdante sera condamnée aux +dépens. + +## 20\. ASSISTANCE CLIENTELE ET RÉSOLUTION DES CONFLITS + +20.1 Si vous deviez rencontrer le moindre souci, ou si vous deviez avoir des +réclamations ou des plaintes, nous espérons pouvoir les résoudre rapidement et +à l'amiable, contactez- +nous[ici](https://support.gog.com/hc/requests/new?category=info). Nous +tâcherons de résoudre tout litige de manière informelle, raisonnablement et de +bonne foi. Nous nous efforçons de répondre à la moindre requête sous 14 jours. + + + +20.2 0.2. Si le problème n'est pas résolu pendant cette période, les étapes +suivantes dépendent de votre lieu de résidence. Si vous résidez dans un pays +de l'UE, vous pouvez soumettre vos réclamations juridiques à la plateforme de +résolution des litiges en ligne gérée et fournie par la Commission européenne, +accessible via http://ec.europa.eu/consumers/odr/, afin de parvenir à un +règlement à l'amiable ou d'engager une action en justice. Vous pouvez +également choisir de résoudre votre litige par l'intermédiaire d'un organisme +de règlement extrajudiciaire des litiges certifié par le coordinateur des +services numériques de votre pays. + + + +20.3. Si vous vivez aux États-Unis d'Amérique ou dans le reste du monde (hors +UE), veuillez nous contacter a legal@GOG.COM. + +## 21\. AUTRES CLAUSES LÉGALES + +21.1 Dans l'éventualité ou l'une des dispositions du présent Accord serait +invalidée ou non exécutoire, cela n'aura aucun effet sur la validité ou le +caractère exécutoire des autres dispositions. + + + +21.2 Le présent accord (y compris les conditions supplémentaires de GOG +auxquelles il fait référence) constitue l'intégralité de l'accord entre vous +et nous et remplace tout accord oral ou écrit antérieur. En cas de désaccord, +veuillez nous contacter dès que possible après avoir commencé à utiliser les +services de GOG à l'adresse legal@gog.com, faute de quoi vous serez lié par +cette disposition après un délai raisonnable (généralement de 30 jours).. + + + +21.3 Cet Accord gouverne nos relations mutuelles. Il ne donne de droits à +personne d'autre. + + + +21.4 Veuillez noter que nous sommes soumis à diverses lois et que nous sommes +contraints de nous conformer aux demandes des autorités judiciaires et autres +processus judiciaires. + + + +21.5 Si nous devions procéder à une réorganisation, une vente ou une fusion de +GOG, alors nous pourrions être amenés à travailler avec des tiers pour +transférer ou fusionner votre compte GOG. + + + +21.6 Par la présente, nous acceptons mutuellement que la Convention des +Nations Unies sur les contrats de vente ne s'applique pas sur cet Accord. + + + +21.7 Nous pouvons assigner, sous-traiter ou transférer cet Accord a une partie +tierce ou à un autre membre de notre groupe si nécessaire, pour le support de +GOG ; dans l'éventualité d'une réorganisation ou d'une fusion, ou pour toute +autre raison commerciale. Vous en serez notifié le cas échéant. + + + +21.8 Si vous êtes un citoyen de l'Union européenne, veuillez noter que GOG a +permis la portabilité transfrontalière du contenu gratuit et payant +conformément au règlement (UE) 2017/1128 du Parlement européen et du Conseil +du 14 juin 2017 relatif à la portabilité transfrontalière des services de +contenu en ligne dans le marché intérieur, mais cela est soumis à toute autre +exigence légale concernant GOG, y compris la protection de la propriété +intellectuelle, et peut également être soumis aux exigences des développeurs +et des éditeurs partenaires de GOG. + +## 22\. MODIFICATIONS DU PRÉSENT ACCORD + +22.1 Nous nous réservons le droit de modifier cet Accord si nécessaire, +notamment pour des raisons légales ou d'adéquation avec les modifications +survenues dans les services GOG. Dans cette éventualité, la version modifiée +du présent Accord sera disponible en ligne à l'adresse +https://support.gog.com/hc/articles/212632089 et (si vous avez un compte GOG) +ces changements vous seront notifiés par e-mail. + + + +22.2 Tout changement à cet Accord entrera en vigueur 30 jours après sa mise en +ligne. Entre-temps, vous êtes invité à nous contacter à l'adresse +legal@GOG.COM pour toute question propre à ces modifications. + + + +22.3 Si vous refusez d'accepter ces modifications (en le signalant par e-mail +ou non), nous serons dans l'obligation de vous demander de cesser d'utiliser +les services GOG. Nous en sommes navrés, mais nous espérons que vous +comprendrez que pour le bon fonctionnement des services GOG, il est nécessaire +que les utilisateurs soient tous soumis aux mêmes règles. C'est pourquoi nous +vous encourageons à nous contacter pour toute question ou préoccupation. + + + +22.4 Rassurez-vous, il n'est pas question de modifier drastiquement cet Accord +sans vous informer de la teneur des modifications ou de vous forcer à accepter +des modifications que vous ne comprenez pas avant de pouvoir utiliser GOG! + +## 23\. NOS INFORMATIONS DE CONTACT + +23.1. Si vous avez une plainte concernant le compte GOG, les services GOG, ou +si vous souhaitez simplement nous contacter, utilisez les coordonnées +suivantes : + +Nom : GOG sp. z o.o. + +Siège social : Ul. JagielloÅ„ska 74, 03-301 Varsovie, Pologne + +Enregistré au tribunal de district de Varsovie, 14e division commerciale du +registre national des tribunaux. + +Numéro d'enregistrement 0000029514 + +Numéro d'identification fiscale ID TVA (NIP) PL 113-21-77-807 + +Capital social : 135 750 PLN + +Point de contact unique pour les autorités : + +Équipe juridique de GOG + +legal@gog.com + +Langues dans lesquelles nous communiquons : anglais, polonais + +Point de contact unique pour les bénéficiaires des services de GOG : + +Équipe d'assistance de GOG + +support@gog.com + +Nous parlons principalement l'anglais et le polonais, mais nous ferons de +notre mieux pour vous assister dans toutes les langues dans lesquelles GOG est +disponible. + +Date de la dernière mise à jour : 17 février 2024 + +La version précédente de l'accord sur les conditions d'utilisation est +disponible[ici](https://support.gog.com/hc/articles/360010039713). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/blackgate/tmp/EULA_pl-PL.txt b/info.exult.exult/data/blackgate/tmp/EULA_pl-PL.txt new file mode 100644 index 0000000..55ee2cd --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/EULA_pl-PL.txt @@ -0,0 +1,1646 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM Umowa Użytkownika + +## 1\. O NINIEJSZEJ UMOWIE + +1.1. Niniejszy dokument stanowi umowÄ™ pomiÄ™dzy TobÄ… (dalej: “Tyâ€, “Ciebieâ€, +“Tobie†itp.) a GOG sp. z o.o., ul. JagielloÅ„ska 74, 03-301 Warszawa (dalej: +„GOGâ€) i dotyczy portalu www.GOG.COM, konta użytkownika GOG, Aplikacji GOG +GALAXY (w tym sklepu GOG GALAXY), wszystkich gier, filmów i innych treÅ›ci oraz +usÅ‚ug, jakie możesz zakupić lub wykorzystywać za poÅ›rednictwem GOG.COM, forów +GOG, wsparcia klienta i wsparcia technicznego GOG oraz innych usÅ‚ug, które +Å›wiadczymy naszym użytkownikom (łącznie zwanych w skrócie „UsÅ‚ugami GOGâ€). +Tutaj wskazujemy Twoje prawa i obowiÄ…zki jako odbiorcy UsÅ‚ug GOG. + + + +1.2 Ponadto, do UsÅ‚ug GOG mogÄ… mieć zastosowanie dodatkowe warunki, które mogÄ… +zostać przedstawione do twojej akceptacji. JeÅ›li na przykÅ‚ad bÄ™dziesz chciaÅ‚ +korzystać z Aplikacji GOG GALAXY, przedstawimy Ci odpowiednie warunki do +akceptacji, zanim zaczniesz korzystać z aplikacji lub grać w GWINTA. + + + +1.3. Skoro już mówimy o grach, wszystkie treÅ›ci w grach, przedmioty i waluty +wirtualne, filmy GOG i inne treÅ›ci oraz usÅ‚ugi, jakie możesz zakupić lub +wykorzystywać w ramach UsÅ‚ug GOG, bÄ™dziemy dalej nazywać odpowiednio „grami +GOGâ€, „filmami GOG†lub też wszystkie łącznie „treÅ›ciami GOGâ€. + + + +1.4 Nie chcieliÅ›my, żeby ten dokument byÅ‚ zbyt dÅ‚ugi, ale pamiÄ™taj, że +akceptujÄ…c tÄ™ UmowÄ™, akceptujesz również: + + * naszÄ… [ PolitykÄ™ PrywatnoÅ›ci ](https://support.gog.com/hc/articles/212632109) \- która wyjaÅ›nia jakie dane zbieramy od Ciebie i w jaki sposób je chronimy, + + * [ Zasady PostÄ™powania na GOG ](https://support.gog.com/hc/articles/16033977811613) które zawierajÄ… zbiór zasad, które musisz przestrzegać jako czÅ‚onek naszej spoÅ‚ecznoÅ›ci, oraz tÅ‚umaczÄ…ce, co jest (nie)dozwolone na GOG i jak moderujemy treÅ›ci opublikowane na GOG, + + * [ PolitykÄ™ treÅ›ci naruszajÄ…cych i dot. praw autorskich ](https://support.gog.com/hc/articles/16033687971613) która tÅ‚umaczy jak możesz zgÅ‚aszać treÅ›ci naruszajÄ…ce prawo i zasady GOG i co siÄ™ wydarzy po Twoim zgÅ‚oszeniu. + + + +1.5. GOG współpracuje z zaufanymi partnerami, w tym spółkÄ… powiÄ…zanÄ… CD +PROJEKT S.A., deweloperami i wydawcami, dostawcami metod pÅ‚atnoÅ›ci, +oprogramowania do obsÅ‚ugi klienta i innymi podmiotami („Partnerzyâ€). WiÄ™cej +informacji na ich temat znajdziesz siÄ™ w dalszej części tej Umowy. + + + +1.6. Jeżeli masz ukoÅ„czone 18 lat, zapraszamy! Jeżeli jesteÅ› pomiÄ™dzy 16 a 18 +rokiem życia, poproÅ› swojego rodzica lub opiekuna o przeczytanie i +zaakceptowanie tej Umowy w Twoim imieniu, zanim bÄ™dziemy mogli równie ciepÅ‚o +CiÄ™ przywitać (w niektórych krajach osoby poniżej okreÅ›lonego wieku nie mogÄ… +zawierać wiążących prawnie umów takich jak nasza). JeÅ›li nie masz 16 lat, nie +możesz posiadać konta GOG i korzystać z usÅ‚ug GOG ze wzglÄ™du na fakt, że +zgodnie z obowiÄ…zujÄ…cym prawem nie możemy przetwarzać danych osobowych dzieci +bez szczególnego pozwolenia ich rodzica lub opiekuna (oczywiÅ›cie nie ma +przeszkód, by sami rodzice/opiekunowie stworzyli konto GOG). + +2\. KORZYSTANIE Z USÅUG GOG I TREÅšCI GOG + +2.1. Udzielamy Ci osobistego prawa (zwanego „licencjÄ…â€) do korzystania z usÅ‚ug +GOG oraz pobierania, dostÄ™pu lub streamowania oraz korzystania z treÅ›ci GOG. +Licencja ta przeznaczona jest do Twojego użytku osobistego. LicencjÄ™ tÄ™ możemy +zawiesić lub anulować w okreÅ›lonych sytuacjach, wyjaÅ›nionych poniżej. + + + +2.2. Gdy kupujesz, otrzymujesz dostÄ™p lub instalujesz gry GOG możesz zostać +poproszony o akceptacjÄ™ dodatkowych warunków umowy z deweloperem/wydawcÄ… gry +(np. akceptacji umowy EULA dotyczÄ…cej konkretnej gry). W przypadku +rozbieżnoÅ›ci pomiÄ™dzy takÄ… umowÄ… EULA a niniejszÄ… UmowÄ…, niniejsza Umowa jest +nadrzÄ™dna. + + + +2.3 W przypadku filmów GOG, możesz streamować zakupione treÅ›ci wideo lub +pobrać je i oglÄ…dać w wybrany przez siebie sposób. + + + +2.4 Aby zapewnić peÅ‚nÄ… funkcjonalność GOG.COM, zalecamy korzystanie ze +skryptów zewnÄ™trznych. Ich wykorzystanie jest opcjonalne, ale bez nich nie +możemy obiecać peÅ‚nej funkcjonalnoÅ›ci. + + + +2.5 Kilka słów o Aplikacji GOG GALAXY, która jest naszÄ… opcjonalnÄ… usÅ‚ugÄ… +sieciowÄ…, która umożliwia kupowanie i korzystanie z treÅ›ci GOG, a także +oferuje dodatkowe funkcjonalnoÅ›ci jak połączenie list gier z różnych platform +w jednej bibliotece oraz list znajomych z różnych platform w jednej Aplikacji. +GOG GALAXY to także wsparcie dla różnego rodzaju sieciowych elementów gier, +takich jak multiplayer, Å›ledzenie osiÄ…gnięć dla różnych platform, czat, +Å›ledzenie czasu gry, zapisy w chmurze oraz overlay. WiÄ™cej informacji na ten +temat znajdziesz[tutaj](https://www.gog.com/galaxy). + + + +2.6. W niektórych częściach usÅ‚ug GOG, korzystamy z systemów rekomendacji aby +pokazać Ci treÅ›ci, które najprawdopodobniej CiÄ™ zainteresujÄ…. Możesz +dowiedzieć siÄ™ gdzie z nich korzystamy i jak +dziaÅ‚ajÄ…[tutaj](https://support.gog.com/hc/articles/16034228157213), w tym z +jakich głównych parametrów korzystamy i jak możesz na nie wpÅ‚ywać. + + + + + +## 3\. KONTO GOG + +3.1. Aby kupować treÅ›ci w ramach UsÅ‚ug GOG, musisz posiadać konto GOG. W +niektórych przypadkach, nasi partnerzy również wymagajÄ… tego konta do +grania/korzystania z treÅ›ci GOG. Stworzenie konta GOG wymaga utworzenia hasÅ‚a +(które jest zaszyfrowane, wiÄ™c nie mamy do niego dostÄ™pu) oraz nazwy +użytkownika, a także podania nam adresu e-mail (do celów identyfikacyjnych). +Upewnij siÄ™, że dane do logowania przechowujesz w bezpiecznym miejscu i +prawidÅ‚owo korzystasz ze swojego konta GOG. W ustawieniach konta GOG możesz +również opcjonalnie dodać swój kraj zamieszkania, datÄ™ urodzenia i avatar. +Nasza Polityka prywatnoÅ›ci zawiera wiÄ™cej szczegółów na temat informacji, +które gromadzimy, sposobu w jaki je wykorzystujemy oraz chronimy. Możesz +znaleźć jÄ… tu: [ Polityka PrywatnoÅ›ci. +](https://support.gog.com/hc/pl/articles/212632109-Privacy-Policy?product=gog) + + + +3.2 Na swoim koncie GOG możesz ustawić profil publiczny dostÄ™pny dla innych +osób, a także połączyć siÄ™ z innymi użytkownikami GOG. PostÄ™puj rozsÄ…dnie i +pamiÄ™taj, że odpowiadasz za swoje dziaÅ‚ania. + + + +3.3 Twoje konto GOG oraz treÅ›ci GOG sÄ… przypisane do Ciebie i nie możesz +dzielić siÄ™, sprzedać, przekazać ani podarować ich innej osobie. DostÄ™p i +korzystanie z nich podlega naszej [ Polityce PrywatnoÅ›ci +](https://support.gog.com/hc/articles/212632109?product=gog) i[Zasadom +PostÄ™powania na GOG](https://support.gog.com/hc/articles/16033977811613), wraz +z ewentualnymi zmianami gdy to konieczne. + + + +3.4. DostÄ™p i korzystanie z gier kupionych z innych platform (tj. Bezkluczowo, +okreÅ›lanych jako Keyless Access), włączajÄ…c w to minimalne wymagania +systemowe, podlega politykom odpowiadajÄ…cych platform i (jeÅ›li ma +zastosowanie) dodatkowym warunkom umowy z twórcÄ…/wydawcÄ… gry, którzy mogÄ… CiÄ™ +poprosić o podpisanie dodatkowej umowy licencyjnej użytkownika. By mieć dostÄ™p +do zakupionych w ten sposób treÅ›ci, może być wymagane posiadanie konta na +danej platformie. Również od danej platformy mogÄ… w takim przypadku zależeć +aktualizacje i Å‚atki do poszczególnych gier. + +## 4\. WYMAGANIA SYSTEMOWE + +4.1. GOG.COM umożliwia Ci dostÄ™p do wielu różnych treÅ›ci, usÅ‚ug gier +tworzonych w różnych okresach i na różne platformy sprzÄ™towe, dlatego nie +możemy podać Ci jednego zestawu wymagaÅ„ systemowych dla wszystkich usÅ‚ug GOG +lub treÅ›ci GOG. + + + +4.2. Możemy Ci jednak powiedzieć, że korzystanie z jakichkolwiek gier GOG +bÄ™dzie wymagaÅ‚o posiadania komputera wyposażonego w myszkÄ™ i klawiaturÄ™ (brak +wsparcia dla ekranów dotykowych) oraz odpowiedniego systemu operacyjnego +(zajrzyj na odpowiedniÄ… stronÄ™ produktu GOG) wraz z zainstalowanymi service +packami i ważnymi aktualizacjami. Wszystkie gry GOG powinny być natywnie +zainstalowane na komputerze speÅ‚niajÄ…cym co najmniej minimalne wymagania +dotyczÄ…ce sprzÄ™tu i oprogramowania podane na stronie produktu GOG. Gry GOG nie +sÄ… testowane na oprogramowaniu urzÄ…dzeÅ„ wirtualnych, dlatego nie wspieramy tej +formy rozgrywki. + + + +4.3 W przypadku filmów GOG, upewnij siÄ™, że Twój odtwarzacz plików wideo +obsÅ‚uguje format podany na stronie produktu GOG. + + + +4.4 W przypadku pytaÅ„ dotyczÄ…cych wymagaÅ„ systemowych, skontaktuj siÄ™ z nami +pod tym[adresem](https://support.gog.com/hc/requests/new?category=info). W +ramach wyjaÅ›nienia, po Twojej stronie jest zapewnienie, że posiadasz +odpowiedni dostÄ™p do Internetu, aby pobrać zakupione gry GOG lub filmy GOG lub +też streamować filmy GOG, a także, że Twój system umożliwia grÄ™ w gry GOG i +oglÄ…danie filmów GOG. + +## 5\. WERSJE BETA + +5.1 W ramach rozwoju GOG możemy oferować opcjonalny dostÄ™p do wersji beta +oprogramowania lub usÅ‚ug GOG (np. nowe wersje Aplikacji GOG GALAXY dostÄ™pne +przed ich oficjalnym wydaniem) lub treÅ›ci GOG. + + + +Poniżej przedstawiamy zasady: + + + +a) GOG (lub odpowiedni wydawca/partner) okreÅ›la wymagania i warunki dostÄ™pu do +wersji beta. Zapewnienie dostÄ™pu i utrzymanie takiej wersji oraz decyzja o +tym, kto może z niej korzystać należy wyłącznie do nas. + +b) Możesz podlegać dodatkowej rejestracji lub speÅ‚nić dodatkowe wymagania, aby +uzyskać dostÄ™p do wersji beta (co może obejmować kryteria kwalifikacji). + +c) Wersje beta sÄ… ograniczone czasowo i mogÄ… obejmować dodatkowe wymagania +umowne. + +d) Wersje beta mogÄ… wiÄ…zać siÄ™ z czasowym lub trwaÅ‚ym usuniÄ™ciem, resetem lub +zmianÄ… postÄ™pów, treÅ›ci czy zawartoÅ›ci serwerów. + +e) Wersja beta może podlegać zobowiÄ…zaniu do zachowania poufnoÅ›ci (w takim +przypadku zostaniesz o tym wczeÅ›niej powiadomiony). + +f) Możesz zostać poproszony o wyrażenie opinii na temat wersji beta - +odpowiedź nie jest obowiÄ…zkowa, ale bÄ™dzie dla nas bardzo cenna. + +g) Wersja beta przeznaczona jest do Twojego osobistego użytku i zabawy, +dlatego nie możesz jej sprzedać, pożyczyć ani przenieść na innÄ… osobÄ™. + +h) IstotÄ… dostÄ™pu do wersji beta jest możliwość spróbowania czegoÅ› nowego, +lecz musisz pamiÄ™tać, że taka wersja nie jest jeszcze kompletna. Dlatego też, +wersje beta dostarczane sÄ… w stanie, w jakim sÄ… („as isâ€), bez dodatkowych +gwarancji ani odpowiedzialnoÅ›ci po naszej stronie za nieprawidÅ‚owe +funkcjonowanie lub błędy. Wersje beta mogÄ… być niepeÅ‚ne i podlegać zmianom, +modyfikacjom lub korektom. + + + +Możemy oferować dostÄ™p do treÅ›ci GOG w wersji beta/przedpremierowej. Na +przykÅ‚ad, wydawca/partner może wydać grÄ™ lub jej część w formie wersji beta +lub może dołączyć do naszego programu „Early Access†(patrz punkt 8.6 - 8.8 +poniżej). Takie treÅ›ci GOG podlegajÄ… niniejszym zasadom, chyba że odpowiedni +wydawca przedstawi swoje wÅ‚asne zasady (które bÄ™dÄ… wówczas nadrzÄ™dne dla +niniejszej Umowy). + +## 6\. PÅATNOÅšCI ZA TREÅšCI GOG I OTRZYMANIE ZWROTU + +PÅ‚atnoÅ›ci za treÅ›ci GOG + + + +6.1 Jeżeli spodoba Ci siÄ™ gra GOG, film GOG lub inne treÅ›ci GOG, zazwyczaj +musisz zapÅ‚acić za nie przed uzyskaniem dostÄ™pu (ale oferujemy również treÅ›ci +darmowe!). Możesz zapÅ‚acić na różne sposoby: (i) przy użyciu ważnej karty +debetowej lub kredytowej, (ii) przy użyciu PayPal lub innego autoryzowanego +operatora pÅ‚atnoÅ›ci. Dane dotyczÄ…ce pÅ‚atnoÅ›ci przechowuj zawsze w bezpieczny +sposób. + + + +6.2 Kiedy wykorzystujesz okreÅ›lonÄ… formÄ™ pÅ‚atnoÅ›ci do zakupu treÅ›ci GOG, +polegamy na Twoim oÅ›wiadczeniu, że możesz używać takiej metody. Odpowiadasz za +wszystkie zakupy wykonane przy użyciu Twojego konta GOG lub metody pÅ‚atnoÅ›ci, +a także zgadzasz siÄ™ na politykÄ™ cenowÄ…, pÅ‚atnoÅ›ci i rozliczeniowÄ… podanÄ… w +momencie zakupu. Wszystkie pÅ‚atnoÅ›ci sÄ… bezzwrotne i nieprzenoszalne, chyba że +niniejsza Umowa mówi inaczej. + + + +6.3 Za treÅ›ci GOG możesz zawsze zapÅ‚acić w dolarach amerykaÅ„skich. Jeżeli +mieszkasz w kraju, którego waluta lokalna jest przez nas obsÅ‚ugiwana +(szczegóły na ten temat +znajdziesz[tutaj](https://support.gog.com/hc/articles/360001947034)), możesz +zapÅ‚acić również w swojej walucie lokalnej. Jeżeli nie pÅ‚acisz w swojej +walucie lokalnej, możesz ponieść koszty wymiany walut, a także opÅ‚atÄ™ +transakcyjnÄ… stosowanÄ… przez niektóre banki. + + + +6.4 Wszystkie ceny podane sÄ… na stronie katalogu produktów. Ceny zawierajÄ… +podatek od towarów i usÅ‚ug/VAT, jeÅ›li majÄ… zastosowanie. Możesz także +spodziewać siÄ™, że do ceny w koszyku zostanÄ… doliczone podatki od +sprzedaży/VAT, jeÅ›li wymagajÄ… tego lokalne przepisy (np. w USA lub Kanadzie). + + + +Portfel GOG + + + +6.5 GOG oferuje użytkownikom wirtualne konto zwane „Portfelem GOGâ€, powiÄ…zane +z kontem GOG, którego można używać do kupowania treÅ›ci GOG w dedykowanych +usÅ‚ugach GOG. Åšrodki do Portfela GOG można dodawać na dwa sposoby: (i) przy +użyciu wybranej metody pÅ‚atnoÅ›ci lub (ii) przez nas w ramach „Dobrowolnej +Polityki Zwrotów†+(wiÄ™cej[tutaj](https://support.gog.com/hc/articles/360006129837)) \- uzyskane +w ten sposób Å›rodki Portfela GOG możesz wykorzystać, by kupić innÄ… grÄ™ lub +treÅ›ci dostÄ™pne w sklepie GOG. DostÄ™p do Portfela GOG podlega zasadom +dostÄ™pnym[tutaj](https://support.gog.com/hc/pl/articles/360001941953-FAQ- +Portfel-GOG?product=galaxy). + + + +Kody Promocyjne GOG + + + +6.6. Możemy również wydawać zwykle czasowe kody promocyjne, które zapewniajÄ… +darmowy dostÄ™p lub niższÄ… cenÄ™ za treÅ›ci GOG (nazywamy je „Kodami +Promocyjnymiâ€). Jeżeli otrzymasz Kody Promocyjne podczas kupowania treÅ›ci GOG, +a później zdecydujesz siÄ™ zwrócić taki zakup, uważamy, że najuczciwiej bÄ™dzie, +gdy zwrócisz również otrzymane Kody Promocyjne. Dlatego też Kody Promocyjne, +zostanÄ… wygaszone, a jeżeli zostaÅ‚y wydane na grÄ™ GOG, zostanie ona usuniÄ™ta z +Twojego konta. + + + +BezpoÅ›rednio na konto + + + +6.7. Posiadamy funkcjonalność bezpoÅ›redniej dystrybucji na konto użytkownika +(jej nazwa to „GOG Direct to Accountâ€), która pozwala naszym partnerskim +platformom dystrybucyjnym na sprzedaż gier oraz innych treÅ›ci w taki sposób, +że przy zakupie możesz wybrać, by gra lub inna treść zostaÅ‚y automatycznie +aktywowane na Twoim koncie GOG bez potrzeby wykorzystywania kodów. Dla +jasnoÅ›ci – caÅ‚y proces sprzedaży prowadzony jest przez zewnÄ™trznÄ… platformÄ™, +wiÄ™c w przypadku jakichkolwiek problemów z zakupem zgÅ‚oÅ› siÄ™ bezpoÅ›rednio do +dziaÅ‚u odpowiedzialnego za obsÅ‚ugÄ™ klientów tej platformy. W sekcji niżej pt. +„Zwroty†znajdziesz wiÄ™cej informacji na ten temat. W tej konkretnej sytuacji +nie możemy zaproponować Ci zwrotu w ramach naszej Dobrowolnej Polityki +Zwrotów, ponieważ w tym przypadku to nie GOG jest sprzedawcÄ… treÅ›ci). +OczywiÅ›cie nadal jesteÅ›my odpowiedzialni za wszystko,co dotyczy bezpoÅ›rednio +usÅ‚ug naszej platformy. + +## 7\. ZWROTY + +Ustawowe prawo odstÄ…pienia od umowy + + + +7.1 Jeżeli jesteÅ› obywatelem Unii Europejskiej, przysÅ‚uguje Ci ustawowe prawo +odstÄ…pienia od umowy zakupu treÅ›ci GOG (treÅ›ci cyfrowe) w ciÄ…gu 14 dni od daty +zakupu, bez podawania przyczyny. Aby skorzystać z prawa do odstÄ…pienia od +umowy, powinieneÅ› poinformować nas o swojej decyzji o odstÄ…pieniu od +niniejszej umowy w drodze jednoznacznego oÅ›wiadczenia (wiadomość e-mail +wysÅ‚ana na adres support@GOG.COM lub fizyczne pismo wysÅ‚ane na adres wskazany +w punkcie 23 poniżej). Możesz skorzystać ze wzoru formularza odstÄ…pienia od +umowy załączonego na koÅ„cu niniejszej Umowy, ale nie musisz tego robić. Aby +dotrzymać terminu odstÄ…pienia od umowy, wystarczy wysÅ‚ać wiadomość dotyczÄ…cÄ… +wykonania prawa do odstÄ…pienia od umowy przed upÅ‚ywem terminu do odstÄ…pienia +od umowy.To uprawnienie nie przysÅ‚uguje Ci jednak jeÅ›li rozpoczÄ…Å‚eÅ› już +wykonanie umowy oraz wyraźnie zgodziÅ‚eÅ› siÄ™ na rozpoczÄ™cie Å›wiadczenia czyli +udostÄ™pnienie Ci treÅ›ci GOG natychmiast po zakoÅ„czeniu procesu zakupu i +zostaÅ‚eÅ› poinformowany przez nas o utracie prawa odstÄ…pienia od umowy. + + + +7.2 Mamy obowiÄ…zek poinformować CiÄ™ również o sposobie korzystania z prawa +odstÄ…pienia, co wÅ‚aÅ›nie czynimy. Aby skorzystać z ustawowego prawa zwrotu, +musisz powiadomić nas o swojej decyzji za pomocÄ… e-maila lub listu wysÅ‚anego +na adres GOG podany poniżej w punkcie 23.1. W przypadku skutecznego +odstÄ…pienia, zwrócimy Ci caÅ‚ość kwoty otrzymanej za zakupione treÅ›ci bez +nieuzasadnionego opóźnienia i nie później niż w ciÄ…gu 14 dni od daty +otrzymania powiadomienia o odstÄ…pieniu. Do zwrotu wykorzystujemy metodÄ™ +pÅ‚atnoÅ›ci, która zostaÅ‚a przez Ciebie wykorzystana do zrealizowania +transakcji, chyba że wyrazisz zgodÄ™ na innÄ… metodÄ™ zwrotu. Nie ponosisz +żadnych opÅ‚at zwiÄ…zanych z takim zwrotem. Wszystkie treÅ›ci podlegajÄ…ce +zwrotowi przestanÄ… być dostÄ™pne na Twoim koncie GOG. + + + +Å»adne z postanowieÅ„ tej Umowy (w tym powyższe) nie naruszajÄ… Twoich ustawowych +praw. W szczególnoÅ›ci: + + + +a) Dla użytkowników z Australii: treÅ›ci GOG objÄ™te sÄ… gwarancjÄ…, która nie +może zostać wyłączona zgodnie z prawem konsumenckim Australii. Masz prawo +żądać wymiany lub zwrotu pieniÄ™dzy za poważnÄ… wadÄ™ oraz rekompensaty za +wszelkie inne możliwe do przewidzenia straty lub szkody. Masz również prawo do +naprawy lub wymiany treÅ›ci, jeÅ›li ich jakość nie jest zadowalajÄ…ca a wady nie +sÄ… poważnymi wadami; + +b) Dla użytkowników Nowej Zelandii: ani ta, ani jakakolwiek inna część +niniejszej Umowy nie wyklucza, nie ogranicza ani nie modyfikuje stosowania +jakichkolwiek praw lub Å›rodków zaradczych, które nie mogÄ… być wykluczone +ograniczone lub zmodyfikowane w szczególnoÅ›ci tych zawartych w ustawie o +gwarancjach konsumenckich w Nowej Zelandii z 1993 roku. Na podstawie tej +ustawy towary i usÅ‚ugi objÄ™te sÄ… gwarancjÄ… zgodnie z którÄ… majÄ… mieć +akceptowalnÄ… jakość. JeÅ›li ta gwarancja nie zostanie speÅ‚niona, bÄ™dziesz miaÅ‚ +prawo uzyskania Å›rodków zaradczych takich, jak naprawa oprogramowania, wymiana +lub zwrot pieniÄ™dzy. Jeżeli nie można zapewnić Å›rodka zaradczego lub istnieje +poważna wada ustawa ta zapewnia Ci możliwość uzyskania zwrotu pieniÄ™dzy. + + + +Nasza Dobrowolna Polityka Zwrotów + + + +7.3. Rozumiemy, że czasem dokonany zakup nie speÅ‚nia oczekiwaÅ„ i chcemy być +fair w stosunku do użytkowników GOG, dlatego niezależnie od prawa do zwrotów +(opisanego w ustÄ™pach 7.1-7.2 powyżej), możemy zaoferować Ci naszÄ… DobrowolnÄ… +PolitykÄ™ Zwrotów, opisanÄ… +szczegółowo[tutaj](https://support.gog.com/hc/pl/articles/360006129837). W +niektórych przypadkach, jeÅ›li mamy uzasadnione wÄ…tpliwoÅ›ci dotyczÄ…ce Twojego +wniosku o zwrot zakupionego produktu, Dobrowolna Polityka Zwrotów może nie +zostać wziÄ™ta od uwagÄ™. W żadnym wypadku nie pozbawi ciÄ™ to jednak żadnych +obowiÄ…zujÄ…cych ustawowo praw do zwrotu pieniÄ™dzy. Zakup zostaje uznany za +sfinalizowany w momencie wygaÅ›niÄ™cia Twojego prawa do zwrotu (chyba że podlega +innym, odrÄ™bnym ustaleniom, w zależnoÅ›ci od przypadku). + +## 8\. WALUTA WIRTUALNA I PRZEDMIOTY WIRTUALNE + +8.1 Wraz z niektórymi treÅ›ciami GOG można kupić lub uzyskać wirtualne +przedmioty i/lub wirtualnÄ… walutÄ™ (razem zwane „Towarami Wirtualnymiâ€). Towary +Wirtualne podlegajÄ… postanowieniom niniejszej Umowy, w szczególnoÅ›ci poniższym +ogólnym zasadom, chyba że dla takich treÅ›ci GOG obowiÄ…zujÄ… osobne szczególne +zasady (które sÄ… w takim przypadku nadrzÄ™dne). + + + +8.2 Wirtualne Towary sÄ… treÅ›ciami cyfrowymi nieposiadajÄ…cymi wartoÅ›ci +pieniężnej i nieistniejÄ…ce w rzeczywistym Å›wiecie. Nie można ich kupić, +sprzedać, podarować, przekazać, zamienić na inne Towary Wirtualne, ani też na +prawdziwe pieniÄ…dze, towary, usÅ‚ugi lub przedmioty posiadajÄ…ce wartość +pieniężnÄ…. Handel Towarami Wirtualnymi jest zabroniony (chyba, że uzyskaÅ‚eÅ› +wyraźnÄ… zgodÄ™ na takie dziaÅ‚anie). Twoje prawo do korzystania z Towarów +Wirtualnych jest ograniczone do ograniczonej, niewyłącznej, nieprzenoszalnej, +odwoÅ‚alnej licencji bez prawa do udzielania sublicencji na użytkowanie treÅ›ci +GOG wyłącznie dla celów prywatnych i dla wÅ‚asnej rozrywki. Nie posiadasz +udziaÅ‚u, prawa ani tytuÅ‚u do Towarów Wirtualnych, które pozostajÄ… wÅ‚asnoÅ›ciÄ… +odpowiedniego wydawcy. Towary Wirtualne mogÄ… być zmieniane, poprawiane i +usuwane w razie potrzeby, w tym w celu realizacji niniejszej Umowy. W razie +potrzeby możliwe jest również naÅ‚ożenie ograniczeÅ„ na wykorzystanie Towarów +Wirtualnych (w tym limitów transakcji i salda). + + + +8.3 Istnienie specjalnej oferty na Towary Wirtualne nie zobowiÄ…zuje nas do +kontynuowania oferowania Towarów Wirtualnych w ten sam sposób w przyszÅ‚oÅ›ci. +Zakres, rodzaje i typy Towarów Wirtualnych, jakie możesz otrzymać mogÄ… siÄ™ +zmieniać, a GOG może zarzÄ…dzać, modyfikować i usuwać Towary Wirtualne, jeżeli +uznamy to za konieczne do prawidÅ‚owego funkcjonowania GOG.COM, treÅ›ci GOG lub +z innych uzasadnionych powodów. W takim przypadku GOG nie ponosi żadnej +odpowiedzialnoÅ›ci za skorzystanie z tego prawa. DoÅ‚ożymy uzasadnionych staraÅ„, +aby powiadomić CiÄ™ o takich zmianach i uzasadnić ich powody. + +## 9\. ÅATKI, AKTUALIZACJE I ZMIANY + +9.1 Od czasu do czasu może wystÄ…pić konieczność aktualizacji usÅ‚ug GOG lub +treÅ›ci GOG (np. aby dodać lub usunąć elementy lub też usunąć problemy z +oprogramowaniem). Jest to konieczne dla prawidÅ‚owego funkcjonowania usÅ‚ug +GOG.COM. Brak aktualizowania usÅ‚ug GOG lub treÅ›ci GOG przez użytkownika może +doprowadzić do niezgodnoÅ›ci Twojej wersji z niektórymi funkcjami usÅ‚ug GOG lub +treÅ›ci GOG. Nie instalujÄ…c aktualizacji ryzykujesz również niezainstalowanie +ważnych aktualizacji bezpieczeÅ„stwa. Nasi Partnerzy również mogÄ… wykorzystywać +usÅ‚ugi GOG do wprowadzania Å‚atek i aktualizacji odpowiednich treÅ›ci GOG. + + + + +## 10\. TYTUÅ WÅASNOÅšCI DO USÅUG GOG I PRAWA WÅASNOÅšCI INTELEKTUALNEJ + +10.1 UsÅ‚ugi GOG, w tym (miÄ™dzy innymi) grafika, kod, interfejs użytkownika, +wyglÄ…d, dźwiÄ™ki, filmy, tekst, ukÅ‚ad, bazy danych, dane i wszystkie inne +treÅ›ci, a także prawa do ich eksploatacji należą do nas lub otrzymujemy na nie +licencje od podmiotów zewnÄ™trznych. TreÅ›ci GOG stanowiÄ…ce wÅ‚asność +deweloperów/wydawców również podlegajÄ… licencji udzielonej GOG. Wszystkie +prawa sÄ… zastrzeżone, chyba że stwierdziliÅ›my inaczej w niniejszej Umowie. Nie +możesz wykorzystywać usÅ‚ug GOG i treÅ›ci GOG w inny sposób niż okreÅ›lono w +niniejszej Umowie. + + + +10.2 GOG respektuje prawa innych podmiotów do ochrony wÅ‚asnoÅ›ci +intelektualnej. WiÄ™cej informacji można znaleźć[pod tym +adresem](https://support.gog.com/hc/articles/16033687971613). + +## 11\. ZASADY KORZYSTANIA Z USÅUG GOG + +11.1 Prosimy, przestrzegaj poniższych zasad dotyczÄ…cych usÅ‚ug i treÅ›ci GOG, i +wszystkich innych zasad, do których odsyÅ‚amy w punkcie 11.2 poniżej. +Przeczytaj je dokÅ‚adnie, gdyż ich nieprzestrzeganie (zwÅ‚aszcza w przypadku +oszukiwania) bÄ™dzie traktowane jako istotne naruszenie niniejszej Umowy, co +może prowadzić do zawieszenia lub zablokowania dostÄ™pu do usÅ‚ug GOG. A oto +zasady: + + + +(a) Możesz korzystać z usÅ‚ug lub treÅ›ci GOG wyłącznie do wÅ‚asnej rozrywki (nie +możesz wykorzystywać ich w celach zarobkowych, do piractwa lub w celach +politycznych). + + + +(b) W zakresie treÅ›ci GOG, to co możesz robić (w tym modyfikować, łączyć, +dystrybuować, tÅ‚umaczyć, rozkÅ‚adać na części, dekompilować, przeksztaÅ‚cać i +tworzyć prace pochodne) uzależnione jest od pozwolenia wÅ‚aÅ›ciciela praw do +danych treÅ›ci GOG (GOG nie może przyznać takich praw), dlatego sprawdź te +kwestie bezpoÅ›rednio z wÅ‚aÅ›cicielem tych praw (pierwszÄ… rzeczÄ… jakÄ… powinieneÅ› +zrobić jest sprawdzenie, czy istnieje EULA i co ona zawiera). Prosimy również +o podejmowanie tylko autentycznych prób ulepszania treÅ›ci GOG. + + + +(c) W zakresie usÅ‚ug GOG (obejmujÄ…cych oprogramowanie GOG), jeżeli nie masz +wczeÅ›niejszej zgody GOG, nie możesz ich modyfikować, łączyć, dystrybuować, +tÅ‚umaczyć, przeksztaÅ‚cać, dekompilować, rozkÅ‚adać na części ani tworzyć z nich +prac pochodnych - chyba, że dopuszcza to niniejsza Umowa lub prawo +obowiÄ…zujÄ…ce w Twoim kraju. PodkreÅ›lamy, że możesz zgÅ‚osić siÄ™ do nas po zgodÄ™ +na powyższe dziaÅ‚ania i bÄ™dziemy odpowiadać na takie zgÅ‚oszenia w dobrej +wierze. W przyszÅ‚oÅ›ci planujemy używać otwartych protokołów klienta, aby +użytkownicy mogli pracować z danymi/oprogramowaniem GOG bez potrzeby +programowania zwrotnego i podobnych dziaÅ‚aÅ„. + + + +(d) Nie możesz hakować, uszkadzać, zakłócać ani nadużywać usÅ‚ug i treÅ›ci GOG, +nie możesz podejmować podobnych dziaÅ‚aÅ„ wzglÄ™dem użytkowników i personelu GOG, +ani też wykorzystywać ich do takich dziaÅ‚aÅ„. + + + +(e) Nie możesz tworzyć, udostÄ™pniać i/lub dystrybuować cheatów, hacków, +exploitów, automatycznego oprogramowania, robotów, botów, modów, pajÄ…ków, +oprogramowania szpiegujÄ…cego, skryptów, narzÄ™dzi do uzyskiwania danych i +innego oprogramowania, które w dowolny sposób wpÅ‚ywa na usÅ‚ugi GOG lub treÅ›ci +dostÄ™pne na GOG (w tym, miÄ™dzy innymi, nieautoryzowanych programów osób +trzecich, które przejmujÄ…, emulujÄ… lub przekierowujÄ… wiadomoÅ›ci pomiÄ™dzy GOG i +partnerami GOG a usÅ‚ugami GOG, a także nieautoryzowanych programów osób +trzecich, które zbierajÄ… dane o usÅ‚ugach GOG). + + + +(f) Nie ingeruj w oprogramowanie sieciowe GOG i osób trzecich, ani inne +oprogramowanie, w tym poprzez tunelowanie, osadzanie kodu, modyfikacjÄ™ lub +zmianÄ™ oprogramowania GOG, używajÄ…c jakiegokolwiek innego oprogramowania wraz +z usÅ‚ugami lub treÅ›ciami GOG, poprzez emulacjÄ™ protokoÅ‚u, tworzenie lub +korzystanie z serwerów prywatnych w zakresie usÅ‚ug lub treÅ›ci GOG. Nie możesz +próbować uzyskać dostÄ™pu do obszarów GOG.COM Aplikacji GOG GALAXY i serwerów +GOG, które nie sÄ… dostÄ™pne publicznie. + + + +(g) Nie mów, ani nie rób niczego co jest lub może być uznane za rasistowskie, +ksenofobiczne, seksistowskie, zniesÅ‚awiajÄ…ce lub w inny sposób obraźliwe lub +niezgodne z prawem (np. wykorzystywanie nieletnich, zachÄ™canie do przemocy, +uczestniczenie we fraudach). BÄ…dźmy dla siebie mili! + + + +(h) Nie możesz dzielić siÄ™, kupować, sprzedawać, przekazywać, oddawać, +pożyczać, kraść ani sprzeniewierzać kont GOG. Klucze/kody GOG mogÄ… być +przekazywane innym tylko w sposób dozwolony przez GOG.COM. W przypadku pytaÅ„ +lub problemów skontaktuj siÄ™ z obsÅ‚ugÄ… klienta. + + + +(i) Prosimy o przestrzeganie ograniczeÅ„, wymogów i zasad dotyczÄ…cych +lokalizacji geograficznej lub regionu oraz jÄ™zyka w ramach GOG.COM. + + + +(j) Prosimy abyÅ› nie podejmowaÅ‚ żadnych dziaÅ‚aÅ„ w zwiÄ…zku z GOG, które +naruszajÄ… prawa autorskie, znaki towarowe, patenty, tajemnice handlowe, +prywatność i inne prawa osób trzecich, np. odnoÅ›nie do zdjęć, wizerunku, +plików dźwiÄ™kowych, tekstowych i graficznych oraz innych materiałów i +informacji. + + + +11.2 Oprócz powyższych, poniżej znajduje siÄ™ lista dodatkowych warunków, które +majÄ… zastosowanie do Ciebie podczas korzystania z usÅ‚ug GOG. Nie chcemy siÄ™ +powtarzać, ale należy pamiÄ™tać, że ich nieprzestrzeganie bÄ™dzie stanowić +istotne naruszenie niniejszej Umowy, co może prowadzić do zawieszenia lub +zablokowania dostÄ™pu do usÅ‚ug GOG. Oto lista: + + * Zasady PostÄ™powania na GOG ([link](https://support.gog.com/hc/articles/16033977811613)) + + * Polityka dotyczÄ…ca treÅ›ci naruszajÄ…cych i dot. praw autorskich ([link](https://support.gog.com/hc/articles/16033687971613)). + + + +11.3 Za każdym razem, gdy podejmujemy decyzjÄ™ moderacyjnÄ… skutkujÄ…cÄ… +ograniczeniem Twojego dostÄ™pu do usÅ‚ug GOG, kiedykolwiek to możliwe powinieneÅ› +otrzymać uzasadnienie wskazujÄ…ce, dlaczego podjÄ™liÅ›my tÄ™ decyzjÄ™. JeÅ›li nie +zgadzasz siÄ™ z decyzjÄ…, którÄ… podjÄ™liÅ›my, masz 6 miesiÄ™cy na zÅ‚ożenie +odwoÅ‚ania, liczonych od dnia, w którym poinformowaliÅ›my CiÄ™ o tej decyzji. +Szczegóły dotyczÄ…ce skÅ‚adania skarg powinny być dostÄ™pne w decyzji +moderacyjnej. Opis naszej procedury systemu rozpatrywania skarg jest również +dostÄ™pny w Polityce dotyczÄ…cej treÅ›ci naruszajÄ…cych i dot. praw autorskich +([tutaj](https://support.gog.com/hc/articles/16033687971613)). Tam możesz +również znaleźć informacje dot. dziaÅ‚aÅ„, które podejmujemy w przypadku +nadużywania naszych systemów rozpatrywania skarg poprzez czÄ™ste wnoszenie +oczywiÅ›cie bezzasadnych skarg. + +## 12\. TREÅšCI GENEROWANE PRZEZ UÅ»YTKOWNIKA + +12.1. Niniejszy ustÄ™p dotyczy treÅ›ci (np. tekstów, materiałów wideo, +fotografii, zrzutów z ekranu, tapet lub linków), które udostÄ™pniasz nam lub +innym użytkownikom GOG w ramach usÅ‚ug GOG (np. poprzez swoje zdjÄ™cie profilowe +lub wiadomoÅ›ci do innych użytkowników GOG). Nazywamy je dalej „TreÅ›ciami +Generowanymi przez Użytkownikaâ€. + + + +12.2 ZakÅ‚adamy, że zawsze jesteÅ› wÅ‚aÅ›cicielem utworzonych przez siebie treÅ›ci +(TreÅ›ci Wygenerowanych przez Użytkownika), lecz potrzebujemy ograniczonych +praw do nich w celu transmitowania ich w ramach usÅ‚ug GOG. Dlatego też poprzez +opublikowanie TreÅ›ci Wygenerowanych przez Użytkownika, udzielasz nam +niewyłącznej, nieodwoÅ‚alnej licencji na korzystanie, modyfikacjÄ™, odtwarzanie, +tworzenie utworów zależnych, dystrybucjÄ™, przekazywanie i +prezentowanie/wykonywanie publiczne Twoich TreÅ›ci Generowanych przez +Użytkownika w zwiÄ…zku z usÅ‚ugami GOG. + + + +12.3 Przed użyciem TreÅ›ci Generowanych przez Użytkownika musisz upewnić siÄ™, +że posiadasz wszelkie niezbÄ™dne do tego prawa, jak również sprawdzić, czy mogÄ… +one być bezpiecznie wykorzystywane - nie dysponujemy takÄ… wiedzÄ… i nie możemy +tego sprawdzić, dlatego w tym przypadku ufamy Tobie. + + + +12.4 Posiadamy jednakże prawo (lecz nie obowiÄ…zek) do przeglÄ…du oraz, w razie +potrzeby lub koniecznoÅ›ci prawnej, usuniÄ™cia TreÅ›ci Generowanych przez +Użytkownika, które sÄ… niezgodne z prawem, zniesÅ‚awiajÄ…ce, obsceniczne, +nienawistne, rasistowskie, pornograficzne, naruszajÄ…ce prywatność innych, +stanowiÄ…ce groźbÄ™ lub nÄ™kanie. Jeżeli zauważysz takie treÅ›ci w ramach usÅ‚ug +GOG, powiadom nas o tym. Przeczytaj naszÄ… PolitykÄ™ treÅ›ci naruszajÄ…cych i dot. +praw autorskich ([tutaj](https://support.gog.com/hc/articles/16033687971613)), +gdzie wyjaÅ›niamy naszÄ… procedurÄ™ zgÅ‚aszania treÅ›ci naruszajÄ…cych. JeÅ›li po +naszej wewnÄ™trznej procedurze wciąż uważasz, że Twoja sprawa nie zostaÅ‚a w +peÅ‚ni rozwiÄ…zana, masz możliwość skorzystania z pozasÄ…dowego rozwiÄ…zywania +sporów - wiÄ™cej na ten temat w punkcie 20 poniżej. + +## 13\. INFORMACJE ZWROTNE I SUGESTIE + +13.1 Bardzo chÄ™tnie przyjmujemy opinie i sugestie dotyczÄ…ce ulepszania usÅ‚ug +GOG i wszystkie bardzo cenimy. W ramach wyjaÅ›nienia zastrzegamy jednak, że nie +mamy obowiÄ…zku ich wykorzystać czy akceptować, ani też nie jesteÅ›my Ci nic +winni (finansowo lub w inny sposób) w zamian za ich otrzymanie. + +## 14\. WYKORZYSTANIE TREÅšCI GOG W TWÓRCZOÅšCI FANOWSKIEJ + +14.1 W zakresie twórczoÅ›ci fanowskiej (np. prac takich jak fanowskie +modyfikacje gier, machinima, parodie, 'Let's Play', inne materiaÅ‚y wideo i +ilustracje), musisz upewnić siÄ™, że wÅ‚aÅ›ciciel takich treÅ›ci (np. deweloper +lub wydawca) wyraża zgodÄ™ i uzyskać jego pozwolenie. Powód jest prosty - +treÅ›ci GOG stanowiÄ… wÅ‚asność odpowiedniego wÅ‚aÅ›ciciela, a nie GOG. + +## 15\. TREÅšCI OSÓB TRZECICH I USÅUGI ZEWNĘTRZNE + +15.1 UsÅ‚ugi GOG mogÄ… zawierać linki do stron internetowych lub treÅ›ci osób +trzecich. Decyzja o skorzystaniu z tych linków należy wyłącznie do Ciebie – +nie możemy obiecać, że bÄ™dÄ… dziaÅ‚aÅ‚y, jaki bÄ™dzie ich wyglÄ…d, ani że bÄ™dÄ… +darmowe. + + + +15.2 Za poÅ›rednictwem konta GOG możesz uzyskać dostÄ™p do zewnÄ™trznych usÅ‚ug +Zaufanych Partnerów GOG, np. gier z serii Wiedźmin i stron naszej spółki +powiÄ…zanej, CD PROJEKT. PodlegajÄ… one osobnym zasadom i regulaminom, których +musisz przestrzegać. Korzystanie z takich usÅ‚ug jest opcjonalne - wybór należy +wyłącznie do Ciebie. + +## 16\. GWARANCJE I OGRANICZENIE ODPOWIEDZIALNOÅšCI W ZAKRESIE USÅUG GOG + +16.1 Gwarantujemy, że (i) jesteÅ›my uprawnieni do zawarcia niniejszej Umowy +oraz do udzielenia licencji na korzystanie z usÅ‚ug GOG, o których mowa w ust. +2.1, (ii) doÅ‚ożymy uzasadnionej starannoÅ›ci w zakresie jakoÅ›ci usÅ‚ug GOG i +korzystania z nich, (iii) wykonujÄ…c zobowiÄ…zania wynikajÄ…ce z niniejszej Umowy +doÅ‚ożymy uzasadnionych staraÅ„ w celu przestrzegania obowiÄ…zujÄ…cego prawa. + + + +16.2 Twoje oÅ›wiadczenia i gwarancje. OÅ›wiadczasz i gwarantujesz, że jesteÅ› +uprawniony do zawarcia niniejszej Umowy i postÄ™powania zgodnie z jej +postanowieniami. OÅ›wiadczasz także, że wszystkie TreÅ›ci Generowane przez +Użytkownika przekazywane przez Ciebie za poÅ›rednictwem usÅ‚ug GOG nie naruszajÄ… +praw wÅ‚asnoÅ›ci intelektualnej osób trzecich. ZobowiÄ…zujesz siÄ™, że nie +bÄ™dziesz wykorzystywaÅ‚ ani publikowaÅ‚ TreÅ›ci Generowanych przez Użytkownika, +które sÄ… niezgodne z prawem, zniesÅ‚awiajÄ…ce, obsceniczne, nienawistne, +rasistowskie, pornograficzne, naruszajÄ…ce prywatność innych, stanowiÄ…ce groźbÄ™ +lub nÄ™kanie. + + + +16.3 WkÅ‚adamy dużo pracy w to, żeby treÅ›ci GOG dziaÅ‚aÅ‚y w systemach naszych +użytkowników, ale mamy ograniczony czas na testy i czasem zdarza siÄ™, że coÅ› +nie dziaÅ‚a. Dlatego nie możemy przyjąć odpowiedzialnoÅ›ci za treÅ›ci GOG w +wiÄ™kszym zakresie niż wymagajÄ… tego przepisy prawa. Nie odpowiadamy także za +wszelkie zdarzenia dotyczÄ…ce GOG.COM i treÅ›ci GOG, które sÄ… poza naszÄ… +kontrolÄ… oraz nie gwarantujemy, że usÅ‚ugi GOG bÄ™dÄ… dziaÅ‚ać przez 100% czasu. +PamiÄ™taj jednak, że możesz mieć prawo do zwrotu treÅ›ci GOG i odzyskania +wpÅ‚aconej kwoty w przypadku problemów technicznych - patrz ust. 7.3. + +## 17\. ROZWIÄ„ZANIE UMOWY + +17.1. Twoje prawo do rozwiÄ…zania Umowy. Masz prawo rozwiÄ…zać niniejszÄ… UmowÄ™ w +dowolnym momencie, bez podawania przyczyny, poprzez zaprzestanie korzystania z +usÅ‚ug GOG. Jeżeli mamy również usunąć Twoje konto, skontaktuj siÄ™ z zespoÅ‚em +wsparcia [ pod tym adresem +](https://support.gog.com/hc/requests/new?category=info&product=gog) albo po +prostu wysyÅ‚ajÄ…c email na privacy@GOG.COM. RozwiÄ…zanie Umowy nie wpÅ‚ywa na +istniejÄ…ce już zobowiÄ…zania z naszej strony i Twojej strony. + + + +17.2 Prawo GOG do rozwiÄ…zania Umowy. W przypadku istotnego naruszenia +niniejszej Umowy przez Ciebie zastrzegamy sobie prawo do zawieszenia lub +zablokowania Twojego dostÄ™pu do usÅ‚ug i treÅ›ci GOG. Istotne naruszenie +niniejszej Umowy oznacza poważne naruszenie, które może mieć istotny negatywny +wpÅ‚yw na GOG, użytkowników GOG, w szczególnoÅ›ci naruszenie postanowieÅ„ ust. 11 +powyżej lub Zasad PostÄ™powania na GOG. W przypadku zawieszenia lub +zablokowania dostÄ™pu do usÅ‚ug lub treÅ›ci GOG, podejmiemy uzasadnione +dziaÅ‚ania, aby skontaktować siÄ™ z TobÄ…, wyjaÅ›nić Ci dlaczego podjÄ™liÅ›my takÄ… +decyzjÄ™ i (ewentualnie) co musisz zrobić żeby odzyskać dostÄ™p. + + + +17.3 Taka sytuacja wydaje siÄ™ bardzo nieprawdopodobna, ale jeżeli na staÅ‚e +przestaniemy udzielać dostÄ™pu do usÅ‚ug i treÅ›ci GOG (z innych przyczyn niż +naruszenie z Twojej strony), postaramy siÄ™ ogÅ‚osić to z wyprzedzeniem co +najmniej sześćdziesiÄ™ciu (60) dni na www.gog.com i przeÅ›lemy e-mail do +wszystkich zarejestrowanych użytkowników - w tym czasie bÄ™dziesz mógÅ‚ pobrać +wszystkie zakupione treÅ›ci GOG. + +## 18\. SIÅA WYÅ»SZA + +18.1 Ani my, ani Ty nie odpowiadamy za niewykonanie swoich zobowiÄ…zaÅ„ na mocy +niniejszej Umowy oraz brak dostÄ™pu do usÅ‚ug i treÅ›ci GOG, jeżeli takie +niewykonanie zostaÅ‚o spowodowane wydarzeniami niezależnymi od danej strony, w +tym, miÄ™dzy innymi, brakiem dostÄ™pu do Internetu, brakiem połączenia, pożarem, +powodziÄ…, wojnÄ… lub katastrofÄ… naturalnÄ…. + +## 19\. WÅAÅšCIWE PRAWO + +19.1. Ty i my uzgadniamy, że korzystanie z usÅ‚ug i treÅ›ci GOG oraz niniejsza +Umowa podlegajÄ… przepisom prawa polskiego, a wszelkie spory dotyczÄ…ce +niniejszej Umowy bÄ™dÄ… rozpatrywane przez sÄ…dy polskie. W przypadku +postÄ™powania sÄ…dowego dotyczÄ…cego niniejszej Umowy ,strona wygrywajÄ…ca +uprawniona jest do zwrotu swoich kosztów prawnych. + + + +19.2 Powyższy wybór wÅ‚aÅ›ciwego prawa i sÄ…du nie ogranicza obowiÄ…zkowych zasad +ochrony konsumenta i innych przepisów obowiÄ…zujÄ…cych w kraju Twojego +zamieszkania, które nie byÅ‚yby dostÄ™pne w innym wypadku. + +## 20\. WSPARCIE KLIENTA I ROZSTRZYGANIE SPORÓW + +20.1 W przypadku wÄ…tpliwoÅ›ci, zarzutów czy problemów bÄ™dziemy chcieli +rozstrzygnąć je szybko i polubownie tutaj +https://support.gog.com/hc/requests/new?category=info. DoÅ‚ożymy uzasadnionych +staraÅ„ w dobrej wierze, aby nieformalnie rozstrzygnąć wszelkie spory pomiÄ™dzy +nami. ZobowiÄ…zujemy siÄ™ odpowiedzieć na każde zapytanie w ciÄ…gu 14 dni. + + + +20.2 W przypadku braku rozwiÄ…zania sporu w tym terminie, kolejne kroki zależą +od miejsca Twojego zamieszkania. Jeżeli jesteÅ› mieszkaÅ„cem Unii Europejskiej, +możesz przekazać spór do rozpatrzenia na platformie online prowadzonej przez +KomisjÄ™ EuropejskÄ…, dostÄ™pnej na[tej +stronie](http://ec.europa.eu/consumers/odr/), aby rozwiÄ…zać spór pozasÄ…dowo +lub wszcząć postÄ™powanie. Możesz również wybrać rozwiÄ…zanie swojego sporu +poprzez organ pozasÄ…dowego rozstrzygania sporów certyfikowany przez +koordynatora do spraw usÅ‚ug cyfrowych Twojego paÅ„stwa. + +## 21\. INNE INFORMACJE PRAWNE + +21.1 Jeżeli jakakolwiek część niniejszej Umowy zostanie uznana za bezskutecznÄ… +lub nieważnÄ…, nie wpÅ‚ywa to na pozostaÅ‚e części Umowy. + + + +21.2 Niniejsza Umowa (w tym wszystkie regulacje GOG w niej wspomniane) +reguluje relacje pomiÄ™dzy GOG a TobÄ… (i odwrotnie), lecz nie powoduje +powstania żadnych praw dla innych osób. + + + +21.3 PamiÄ™taj, że podlegamy różnym przepisom prawa i możemy mieć obowiÄ…zek +zastosowania siÄ™ do wymagaÅ„ uprawnionych organów paÅ„stwowych lub innych +przepisów prawa. + + + +21.4 Ty i my uzgadniamy, że Konwencja Narodów Zjednoczonych o MiÄ™dzynarodowej +Sprzedaży Towarów nie ma zastosowania do niniejszej Umowy. + + + +21.5. Jeżeli jesteÅ› obywatelem Unii Europejskiej, wiedz, że umożliwiamy +transgraniczne przenoszenie darmowych i pÅ‚atnych treÅ›ci zgodnie z +rozporzÄ…dzeniem (UE) 2017/1128 Parlamentu Europejskiego i Rady z dnia 14 +czerwca 2017 r. w sprawie transgranicznego przenoszenia na rynku wewnÄ™trznym +usÅ‚ug online w zakresie treÅ›ci, jednak może ono podlegać innym wymogom +prawnym, w tym w odniesieniu do ochrony wÅ‚asnoÅ›ci intelektualnej oraz +wymaganiom deweloperów oraz wydawców gier z którymi współpracuje GOG. + +## 22\. ZMIANY NINIEJSZEJ UMOWY + +22.1 Niniejsza Umowa może podlegać zmianom z przyczyn zwiÄ…zanych z przepisami +prawa lub zmianami usÅ‚ug lub treÅ›ci GOG. Postanowienia niniejszej Umowy mogÄ… +być zmieniane tylko w sposób, który nie ogranicza Twoich praw. W przypadku +takiej zmiany, udostÄ™pnimy zmienionÄ… UmowÄ™ online pod adresem [ +https://support.gog.com/hc/articles/212632089 +](https://support.gog.com/hc/articles/212632089) i (jeÅ›li posiadasz konto GOG) +powiadomimy CiÄ™ e-mailowo o wszelkich istotnych zmianach. + + + +22.2 Wszelkie zmiany niniejszej Umowy wchodzÄ… w życie 30 dni po ich ogÅ‚oszeniu +online. W miÄ™dzyczasie możesz kontaktować siÄ™ z nami na adres legal@gog.com +jeÅ›li masz konkretne pytania dotyczÄ…ce wprowadzanych zmian. + + + +22.3. Jeżeli nie wyrażasz zgody na takie zmiany (niezależnie od tego czy +powiadomisz nas o tym e-mailem) bÄ™dziemy zmuszeni poprosić CiÄ™ o zaprzestanie +korzystania z usÅ‚ug i treÅ›ci GOG. Jest nam przykro z tego powodu, lecz mamy +nadziejÄ™, że docenisz stosowanie jednolitych zasad dla wszystkich +użytkowników, co jest konieczne, aby usÅ‚ugi GOG dziaÅ‚aÅ‚y prawidÅ‚owo. Dlatego +też w przypadku jakichkolwiek pytaÅ„ zachÄ™camy do kontaktu. + + + +22.4 Obiecujemy, że nigdy nie wprowadzimy zmian do niniejszej Umowy bez +ostrzeżenia, nie informujÄ…c CiÄ™ o tym i zmuszajÄ…c do akceptacji zmian, których +nie rozumiesz jako warunek korzystania z usÅ‚ug GOG.COM! + +## 23\. NASZE DANE KONTAKTOWE + +23.1 Jeżeli chcesz siÄ™ z nami skontaktować w sprawie zakupu lub w innych +kwestiach, poniżej podajemy nasze dane kontaktowe: + + + +Nazwa: GOG sp. z o.o. + + + +Siedziba: ul. JagielloÅ„ska 74, 03-301 Warszawa, Polska + + + +Spółka zarejestrowana przez SÄ…d Rejonowy w Warszawie, XIV WydziaÅ‚ Gospodarczy +Krajowego Rejestru SÄ…dowego + + + +Numer KRS: 0000029514 + + + +NIP PL 113-21-77-807 + + + +KapitaÅ‚ zakÅ‚adowy: PLN 135 750,00 + + + +E-mail: legal@GOG.COM lub support@GOG.COM + + + +Pojedynczy punkt kontaktowy dla organów: + +GOG Legal Team + +legal@GOG.COM + +JÄ™zyki, w jakich siÄ™ komunikujemy: angielski, polski + + + +Pojedynczy punkt kontaktowy dla odbiorców usÅ‚ug GOG: + +GOG Support Team + +support@GOG.COM + +Mówimy głównie po polsku i angielsku, ale dokonamy staraÅ„, aby wesprzeć CiÄ™ w +każdy jÄ™zyku, w którym GOG jest dostÄ™pny. + +Ostatnia aktualizacja (data wejÅ›cia w życie): 17 lutego 2024 + + + +Aby zobaczyć wczeÅ›niejszÄ… wersjÄ™ Umowy Użytkownika GOG, +kliknij[tutaj](https://support.gog.com/hc/articles/212632089). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/blackgate/tmp/EULA_pt-BR.txt b/info.exult.exult/data/blackgate/tmp/EULA_pt-BR.txt new file mode 100644 index 0000000..e35fa4e --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/EULA_pt-BR.txt @@ -0,0 +1,1600 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM USER AGREEMENT + +## 1\. ABOUT THIS AGREEMENT + + + +1.1 This Agreement is a contract between you (we will further call you just +“youâ€) and GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Warsaw, Poland (we will +further call ourselves “GOG†or just “usâ€) and applies to www.GOG.COM, your +GOG user account, GOG GALAXY application (including GOG GALAXY store), any +games or videos or other content or services which you purchase or access via +us, the GOG web forums, GOG customer and technical support and other services +we provide to you (we'll just call all this “GOG services†for short). Here we +set out your rights and obligations as a recipient of GOG services. + + + +1.2. Additional terms may apply to GOG services and in such a case we will +post them for your acceptance. For example, if you would like to use the GOG +GALAXY application, the relevant terms will be posted for your acceptance +before you start using these services. + + + +1.3 Also, when we're talking about games, in-game content, virtual items or +currency or GOG videos or other content or services which you can purchase or +access via GOG services, we’ll just call them “GOG games†or “GOG videos†+respectively and when we talk about them all together they are “GOG contentâ€. + + + +1.4 We didn’t want to make this document too long, but keep in mind that by +accepting our User Agreement you also accept: + + * our [ Privacy Policy ](https://support.gog.com/hc/articles/212632109) \- which explains what data we collect from you and how we protect it, + + * [ GOG Code of Conduct ](https://support.gog.com/hc/articles/16033977811613) which is a set of rules you need to follow as part of our community, + + * [ Infringing Content and Copyright Policy ](https://support.gog.com/hc/articles/16033687971613) which explains how you can report unlawful content on GOG and what happens when you do. + + + +1.5 GOG works with trusted partners, including our related company CD PROJEKT +S.A., developers and publishers, payment providers, customer service software +providers and others (“Partnersâ€) – more on them later in this Agreement. + + + +1.6 If you're over 18, then welcome! If you're between 16 and 18, before we +extend an equally warm welcome, please ask your parent or guardian to review +and approve this Agreement on your behalf (because in some countries people +under a certain age cannot legally enter into contracts like this Agreement). +If you’re not 16 yet you cannot have a GOG account or use the GOG services +because legally we cannot handle personal data of children without a special +parental or guardian’s permission (but your parents/guardians are welcome to +sign up themselves). + +## 2\. USING GOG SERVICES AND GOG CONTENT + + + +2.1 We give you and other GOG users the personal right (known legally as a +'license') to use GOG services and to download, access and/or stream +(depending on the content) and use GOG content. This license is for your +personal use. We can stop or suspend this license in some situations, which +are explained later on. + + + +2.2 When you buy, access or install GOG games, you might have to agree to +additional contract terms with the developer/publisher of the game (e.g. they +might ask you to agree to a game specific End User License Agreement). If +there is any inconsistency or dispute between those ‘EULAs’ and this +Agreement, then this Agreement wins. + + + +2.3 With GOG videos, you can also stream purchased video content or download +it to watch the way you want. + + + +2.4 Using certain third-party scripts is recommended for your full use of GOG +functionality and, although that usage is optional, we cannot promise full +service performance without them. + + + +2.5 A quick word about GOG GALAXY, which is our (optional) application which +not only allows you to buy and access GOG content but also provides cool +features like unified game library, and one friends list across platforms, +online multiplayer, achievements, cross-platform chat, game-time tracking, +cloud-saves and game overlay. You can learn more about +it[here](https://www.gog.com/galaxy). + + + +2.6 In some parts of GOG services, we use recommendation systems to present +you the content that you are most likely to be interested in. You can learn +where we use them and how they work[here](https://support.gog.com/hc/en- +us/articles/16034228157213), including what main parameters we use and how to +influence them. + +## 3\. GOG ACCOUNT + + + +3.1 To buy GOG content from GOG services, and in some cases to play/use GOG +content where our partners require use of a GOG account, you will need to set +up a GOG account. This will involve creating a password (which is encrypted so +we can’t access it) and a username, plus giving us (for identification +purposes) your email address. Please make sure your login credentials are kept +secure and your account is used properly. In your GOG account settings you can +also optionally set your country of residence, birthday and avatar. Our +Privacy Policy gives more details about the information we collect from you +and how we use it and protect it. +It's[here](https://support.gog.com/hc/articles/212632109). + + + +3.2 You can use your GOG account to set up a public profile accessible by +other people. You can also use your GOG account to connect with other GOG +users. Please act sensibly and remember you are responsible for your own +actions. + + + +3.3 Your GOG account and GOG content are personal to you and cannot be shared +with, sold, gifted or transferred to anyone else. Your access to and use of +them is subject to GOG’s [ Privacy Policy +](https://support.gog.com/hc/articles/212632109) and [ Code of Conduct +](https://support.gog.com/hc/articles/16033977811613) which are updated or +amended when necessary. + + + +3.4. Access to and use of the games purchased from different platforms (i.e. +with what we call ‘Keyless Access’), including their minimum system +requirements is governed by respective third-party platform policies and (as +applicable) additional contract terms with the developer/publisher of the game +(e.g. they might ask you to agree to a game specific End User License +Agreement). It may require having a third-party platform account. These +platforms may roll out patches or updates for your purchased games. + +## 4\. SYSTEM REQUIREMENTS + + + +4.1 Because GOG gives you access to many different services and games created +at different times and via different platforms, we cannot give you one set of +system requirements for all GOG services or GOG content. Please make sure your +computer and Internet connection are good enough to use GOG services and play +GOG games and videos. + + + +4.2 What we can tell you is that using any GOG game will require a computer, +equipped with a mouse and keyboard (touchscreen controls are not supported), +with an appropriate operating system (please refer to the relevant GOG product +page) with all service packs and important updates installed on it. All GOG +games should be natively installed on a computer that meets or exceeds the +minimum hardware and software specifications shown on the GOG product page. +GOG games are not tested on virtual machine software and therefore we do not +support playing through them. + + + +4.3 For GOG videos, please make sure your video player supports the videos’ +format specified in the GOG product page. + + + +4.4 If you have questions about system requirements, please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). Just so we're clear, you are +responsible for making sure you have sufficient Internet access to download +purchased GOG games or GOG videos from us or to stream GOG videos and that +your system can play GOG games and watch GOG videos. + +## 5\. BETAS + + + +5.1 As GOG develops, we may offer you optional access to 'beta' versions of +GOG software or services (e.g. new versions of the GOG GALAXY application made +available prior to its general release) or GOG content. + + + +Here are the rules: + + + +a) We (or any applicable publisher/partner) will set the conditions and +requirements for your beta access. Providing and maintaining a beta, and who +can use a beta, is at our discretion. + + + +b) You may be required to go through a registration process or other +requirements to access the beta (and this may include you meeting eligibility +criteria). + + + +c) Betas will be time-limited and there may be extra contract requirements. + + + +d) The beta may involve temporary or permanent server/progress/content wipes, +resets or amendments. + + + +e) The beta may be subject to confidentiality restrictions (which will be +notified to you in advance if so). + + + +f) You may be invited to participate in a feedback process regarding the beta +– this is totally optional but would be really valued. + + + +g) The beta is for your personal use and enjoyment, so you must not sell, loan +or otherwise transfer it to anyone else. + + + +h) The point of you getting beta access is to allow you to try something new, +but we would expect you to recognise that it will not be complete yet. +Therefore betas will be provided 'as is' without any additional promises from +us or any liability on us if it is not complete or does not work fully or +causes issues. Betas may not be totally feature-complete and there may be +feature changes, modifications or removals during the beta. + +## 6\. PAYING FOR GOG CONTENT AND GETTING REFUNDS + +### Paying for GOG content + +6.1 After you decide that you like a GOG game, GOG video or other GOG content, +you usually will need to pay for it before you can access it (though we do +have some free content too!). You can pay in different ways: (i) using a valid +debit or credit card; or (ii) using PayPal or any other authorized payment +provider. Remember to keep your payment details secure. + + + +6.2 When you use a payment method to buy GOG content, we're relying on your +promise that you're able to use that method. You are responsible for any +purchases made using your GOG account or payment method and you agree to the +pricing, payment and billing policies applicable to them, as notified to you +at the time of purchase. All payments are non-refundable and non-transferable +except as expressly provided in this Agreement. + + + +6.3 You can always pay for GOG content in US Dollars. However if you happen to +live in countries where your local currency is supported (see our Support +section [ here ](https://support.gog.com/hc/en- +us/articles/360001947034?product=gog) for details), you will be able to pay in +your local currency. You might have to pay a currency conversion charge if you +are not paying in your home currency and some banks might also add other kinds +of transaction fees. + + + +6.4. All prices are visible in the product catalog page. They’re inclusive of +taxes like VAT, if applicable. You should also expect some sales taxes/VAT to +be added to your price at checkout, if required by your local laws (f.ex. in +US or Canada). + + + +### GOG Wallet + +6.5 GOG offers users a digital account balance called the “GOG Wallet†in +connection with your user account, which you can use to make purchases of GOG +content on dedicated GOG services. Funds can be added to it in two ways: (i) +using your chosen payment method; or (ii) by us as part of our ‘Voluntary +Refund Policy’ (see link[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy)) in which case we may offer refunds +to GOG Wallet that you can use to get a replacement GOG game or other GOG +content. The GOG Wallet is made available subject to rules which are set out +on our GOG Wallet page[here](https://support.gog.com/hc/en- +us/articles/360001941953-FAQ-GOG-Wallet?product=galaxy). + +### GOG Bonus Codes + +6.6. We may also issue usually time-limited bonus codes which give you free or +reduced price access to GOG content (we’ll call them “Bonus Codesâ€). If you +receive Bonus Codes when you buy GOG content but later decide to return that +GOG content, then we think it’s fair for you to return the Bonus Codes too. +Therefore, we will terminate it or, if it has been redeemed for a GOG game, +that game will be removed from your account. + +### Direct to Account Distribution + +6.7 We have a direct to account distribution feature (we’ll call it ‘GOG +Direct to Account) where distribution platforms who partner with us would be +able to sell games or other content to you, where you could choose for that +game/content to be automatically activated within your GOG account, without +the need to redeem any codes. Just to be clear, the whole purchase process is +handled by the other platform, so in case of any issues with the purchase +process please speak with them directly. For this particular matter therefore, +we cannot offer you Our Voluntary Refund Policy (because GOG didn’t sell the +game/content). Of course, anything connected to our platform’s services is +still our responsibility. + +## 7\. REFUNDS AND RETURNS + +### Statutory refund rights + +7.1. If you are a resident of the European Union or other applicable +jurisdictions (excluding the USA), then you have the statutory right to +withdraw from a purchase of GOG content within 14 days of your purchase, +without giving a reason. To exercise the right of withdrawal, you should +inform us of your decision to withdraw from this contract by an unequivocal +statement (an email sent to support@GOG.COM, or a physical letter at an +address set out in Section 23 below). You may use the model withdrawal form +attached at the end of this Agreement, but you do not have to. To meet the +withdrawal deadline, it is sufficient for you to send your communication +concerning your exercise of the right of withdrawal before the withdrawal +period has expired. However, this does not apply where you have expressly +consented to the performance of the GOG content (which is digital content) +beginning immediately upon conclusion of the purchase process and have +acknowledged the loss of your withdrawal rights. + + + +7.2. Neither this nor any other part of this User Agreement affects your +statutory rights. In particular: + + + +a) For Australian Users: Our goods come with guarantees that cannot be +excluded under the Australian Consumer Law. You are entitled to a replacement +or refund for a major failure and compensation for any other reasonably +foreseeable loss or damage. You are also entitled to have the goods repaired +or replaced if the goods fail to be of acceptable quality and the failure does +not amount to a major failure. Details[here](https://support.gog.com/hc/en- +us/articles/360025857893?product=gog). + + + +b) For New Zealand Users: Neither this nor any other part of this User +Agreement excludes, restricts or modifies the application of any right or +remedy that cannot be so excluded, restricted or modified including those +conferred by the New Zealand Consumer Guarantees Act 1993. Under this Act are +guarantees which include that goods and services are of acceptable quality. If +this guarantee is not met there are entitlements to have the software remedied +(which may include repair, replacement or refund). If a remedy cannot be +provided or the failure is of a substantial character, the act provides for a +refund. + +### Our Voluntary Refund Policy + +7.3. We understand that sometimes a purchase doesn't turn out how you expected +and we want to be fair to GOG users. This is why on top of your statutory +refund rights (described in section 7.1.-7.2. above) we may offer you a +Voluntary Refund Policy described[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy). In some rare cases if we have +reasonable doubts regarding your refund request we may not apply the Voluntary +Refund Policy. In no case this will deprive you of any applicable statutory +refund rights. A sale is considered final once your refund rights expire +(unless we agree otherwise on a case by case basis). + +## 8\. VIRTUAL ITEMS AND VIRTUAL CURRENCY + + + +8.1 With certain GOG content you may be able to purchase or acquire virtual +items and/or virtual currency (we’ll call them “Virtual Goods†for short). +Virtual Goods are subject to this Agreement and in particular the following +default rules, unless there are specific rules for that GOG content (which +will prevail over these rules). + + + +8.2 Virtual Goods are digital items only with no cash-value or real world +existence and cannot be ‘bought’, ‘sold’, gifted, transferred or redeemed, +exchanged for other Virtual Goods, ‘real world’ money, goods, services or +items of monetary value. Trading Virtual Goods is prohibited (unless you are +specifically permitted to do so). Your right to use any Virtual Goods is +limited to a limited, nonexclusive, non-assignable, non-transferable, non- +sublicensable, revocable license to use them solely for your personal +entertainment and non-commercial use in the applicable GOG content. You have +no property interest or right or title in any Virtual Goods, which remains the +appropriate publisher’s property. Virtual Goods may be changed, amended or +reversed if necessary, including to enforce this Agreement. If necessary, +limits may be placed on the use of Virtual Goods (including transaction limits +and balance amounts). + + + +8.3 The existence of a particular offer for Virtual Goods is not a commitment +by us to maintain or continue to make the Virtual Goods or that offer +available in the future. The scope, variety and type of Virtual Goods that you +may obtain can change and we have the right to manage, modify and remove +Virtual Goods if we consider necessary for the ongoing operation of GOG or GOG +content or for other legitimate reasons, in which case we will have no +liability to you or anyone for the exercise of such rights. We will make +reasonable efforts to notify you of any such change and to explain the reason +for such change. + +## 9\. PATCHES, UPDATES AND CHANGES + + +9.1 Occasionally we may need to patch or update GOG services or GOG content +(for example to add or remove features or to resolve software bugs). We need +these rights in order to keep GOG running efficiently and safely. Not patching +or updating the GOG services or GOG content may result in inferior performance +of your version or incompatibility of your version with some of the GOG +services or GOG content features. Doing so, you are also risking not +installing important security updates. Our Partners may use GOG services to +roll out patches or updates for applicable GOG content. + +## 10\. OWNERSHIP OF GOG SERVICES AND INTELLECTUAL PROPERTY RIGHTS + +10.1 GOG services including (but not limited to) their graphics, computer +code, user interface, look and feel, audio, video, text, layout, databases, +data and all other content, and all legal and exploitation rights regarding +them are either owned by us or we license them from third parties. GOG content +is owned by its developers/publishers and licensed by us. All rights are +reserved except as we have explained in this Agreement. You may not use or +exploit any part of the GOG services or GOG content except as explained in +this Agreement. + + + +10.2. GOG respects the intellectual property rights of others. Please read +more[here](https://support.gog.com/hc/articles/16033687971613). + +## 11\. RULES FOR USING GOG SERVICES + +11.1 Please follow these rules regarding the GOG services and GOG content, and +any additional rules we link in 11.2 below. Please read these rules carefully +since failure to follow them (particularly those in relation to cheating) will +be considered a material breach of this Agreement, which could lead to +suspension or cancellation of your access to GOG services. Here are the rules: + + + +(a) Only use GOG services or GOG content for your personal enjoyment (for +example, don't use them to make money, for piracy or for political purposes). + + + +(b) Regarding GOG content, what you can do practically apart from playing the +games (like create derivative works of it) depends on what the GOG content +rights holder allows you to do (GOG can’t grant such rights). So please check +this with the rights holder directly (the first thing you should do though is +to check if they have a EULA and if so what it says). We also ask that you +make only genuine attempts to improve the GOG content. + + + +(c) Regarding GOG services (which includes GOG software), unless you have +prior GOG permission please don’t modify, merge, distribute, translate, +reverse engineer, decompile, disassemble, or create derivative works of them – +unless you’re allowed in this Agreement or by the law in your country. We’d +like to emphasize that you are free to contact us for permission to do these +things and we will review and respond to those requests in good faith. More +generally, at some point in the future we want to open client protocols to +make it easier for users to work with GOG data/software without any need for +reverse engineering or similar techniques. + + + +(d) Don't hack, harm, grief, interrupt or misuse GOG services or GOG content, +GOG users or GOG personnel or use them for any similar purpose. + + + +(e) Do not create, use, make available and/or distribute cheats, exploits, +automation software, robots, bots, mods, hacks, spiders, spyware, cheats, +scripts, trainers, extraction tools or other software that interact with or +affect GOG services or GOG content in any way (including, without limitation, +any unauthorized third party programs that intercept, emulate, or redirect any +communication between GOG or its partners and GOG services and/or any +unauthorized third party programs that collect information about GOG +services). + + + +(f) Don't interfere with the GOG or third party network software or other +software including via tunnelling, code injection, modifying or changing GOG +software, using any other similar software together with GOG services or GOG +content, through protocol emulation, or through creation or use of private +servers regarding GOG services or GOG content. Do not access or attempt to +access areas of GOG.COM, GOG GALAXY or GOG servers that have not been made +available to the public. + + + +(g) Don't do or say anything which is or may be considered racist, xenophobic, +sexist, defamatory or otherwise offensive or illegal (f.ex. exploiting minors, +encouraging violence, engaging in fraud). Be nice to each other please! + + + +(h) Don’t share, ‘buy’, ‘sell’, transfer, gift, lend, steal, misappropriate or +misuse GOG accounts. GOG keys/codes can only be gifted or transferred or used +in the ways permitted by GOG. If you have any questions or problems, contact +customer support. + + + +(i) We ask you to follow any applicable geographic or regional, language or +location-based restrictions, requirements or rules regarding GOG. + + + +(j) We ask you not to do anything in connection with GOG that infringes any +copyright, trademark, patent, trade secret, privacy, publicity, or other right +of others, such as images, photographs, sound files, text files, graphics +files, and any other material or information. + + + +11.2 In addition to the above, below is the list of additional terms that +apply to you when using GOG services. We do not want to repeat ourselves, but +it is important to remember that if you fail to follow them, it will be a +material breach of this Agreement, which could lead to a suspension or +cancellation of your access to GOG services. Here is the list: + + * GOG Code of Conduct ([link](https://support.gog.com/hc/articles/16033977811613)) + + * Infringing Content and Copyright Policy ([link](https://support.gog.com/hc/articles/16033687971613)). + + + +11.3 Every time we make a moderation decision resulting in restricting your +access to GOG services, whenever it is possible you should receive a statement +of reasons outlining why we have made this decision. If you do not agree with +the decision we have made, you have 6 months from the day that you have been +informed about the decision, to make a complaint. The details on how to make a +complaint should be available in your moderation decision. The description of +our complaint-handling system procedure is also available in the Infringing +Content & Copyright Policy +([here](https://support.gog.com/hc/articles/16033687971613)). + +## 12\. USER GENERATED CONTENT + +12.1 This section is about content (e.g. text, photos or links) which you make +available either to us or to other GOG users via GOG services (for example +through your profile picture or through messages to other GOG users). We'll +call this "User Generated Content". + + + +12.2 As far as we and you are concerned, you own any User Generated Content +but we need you to give us some limited rights over it so that we can actually +transmit it through GOG services. So, by posting User Generated Content you +give us a nonexclusive, irrevocable license to use, modify, reproduce, create +derivative works from, distribute, transmit, communicate and publicly +display/perform your User Generated Content in connection with GOG services. + + + +12.3 It is your responsibility to make sure that you have all necessary legal +rights before you use User Generated Content and for checking they are safe to +use – we can't know that ourselves, and we can't check it for you, so we have +to rely on you. + + + +12.4. However, we have the right (but not the obligation) to review and if +appropriate or legally necessary to remove any User Generated Content which is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. If +you find that any such content has been posted on GOG services, please let us +know. We ask you to read our Infringing Content and Copyright Policy +([link](https://support.gog.com/hc/articles/16033687971613)), where we explain +our procedure for reporting infringing content. If you still feel your case is +not fully resolved after our internal procedure, you have access to an out-of- +court dispute settlement - more on this in Section 20 below. + +## 13\. FEEDBACK OR SUGGESTIONS + +13.1 You’re welcome to give us feedback and suggestions to improve GOG +services and we really value them all. However, just so we’re clear, we don’t +have to use or accept them and we won’t owe you anything (financially or +otherwise) regarding them. + +## 14\. USING GOG CONTENT IN FAN WORK + +14.1 For fan work (e.g. works like fan mods, machinima, parodies, homages, +'Let's Play' or other videos or artwork), you need to check with the content +owner (e.g. the developer or publisher) if they are OK with it and if so you +should get permission from them. The reason is simple – the GOG content is the +property of the respective owner, not ours. + +## 15\. THIRD-PARTY CONTENT AND EXTERNAL SERVICES + +15.1 You might get links to third-party websites or content through GOG +services which aren’t connected to us. Using them is up to you – we’re not +responsible for them, we can't promise they will work, what they'll be like or +if they're free. + + + +15.2 You can also use your GOG account to get easy access to some external, +GOG approved partner services, e.g. The Witcher games and sites from our +sister company CD PROJEKT RED. They will have their own terms and conditions +which you will need to agree and follow. Just to be clear: using these +services is all optional and up to you. You have the power! + +## 16\. WARRANTIES AND LIMITATION OF LIABILITY REGARDING GOG SERVICES + +16.1 We warrant that: (i) we have the right to enter this Agreement and to +grant you the license to use GOG services in section 2.1; and (ii) we will +take reasonable care with the GOG services and your use of them; and (iii) we +will use reasonable endeavors to comply with applicable laws in performing our +obligations to you under this Agreement. + + + +16.2. Your representations and warranties. You represent and warrant that you +have the full power and ability to enter into this Agreement and will fully +follow its terms. You also represent and warrant that any User Generated +Content, which you transmit via GOG services does not infringe upon the +intellectual property rights of any third party. You further represent and +warrant that you will not use or contribute User Generated Content that is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. + + + +16.3. We work hard to try to make GOG content work on your systems but we only +have limited time to carry out tests and we don't always get everything right. +Therefore, we can't accept any liability or responsibility for GOG content +except where required by law (see 7.1.-7.2 above). We are also not responsible +for anything that happens to GOG.COM or GOG services which is outside of our +control and we do not guarantee GOG services will work 100% of the time. +However, don't forget you may be entitled to GOG content return and refund if +it has technical issues - see section 7.3. + +## 17\. TERMINATION + +17.1 Your right to terminate the Agreement. You may terminate this Agreement +at any time and without giving any reason by completely ceasing to use GOG +services. If you would like us to delete your account please contact our +Support Team [ here ](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog) or simply by sending an email +request to privacy@gog.com. Termination will not affect already existing +rights or obligations of us or you. + + + +17.2. Our right to terminate the Agreement. If you materially breach this +Agreement, we reserve the right to suspend or cancel your access to GOG +services and GOG content. By material breach of the Agreement we mean a +serious breach which could cause significant harm to GOG, GOG users, as well +as, in particular breach of the provisions of section 11 above or GOG Code of +Conduct. If we suspend or cancel your access to GOG services or GOG content +we'll take reasonable steps to contact you to explain why we have done this +and what (if anything) you can do as a result. + + + +17.3 It seems very unlikely, but if we have to stop providing access to GOG +services and GOG content permanently (not because of any breach by you), we +will try to give you at least sixty (60) days advance notice by posting a note +on www.GOG.COM and sending an email to every registered user – during that +time you should be able to download any GOG content you purchased. + +## 18\. FORCE MAJEURE + +18.1 Neither you nor us will be liable for any failure to perform any +obligation under this Agreement or to provide access to GOG services and GOG +content if that failure is caused by the happening of any unforeseen event +beyond your or our reasonable control including without limitation, Internet +outages, communications outages, fire, flood, war or act of God. + +## 19\. GOVERNING LAW + +### For users resident in the European Union and elsewhere in the world (but +not the USA): + +19.1 You and we agree that your use of GOG services and GOG content and this +Agreement will be governed by and interpreted according to the laws of the +Republic of Poland and that any dispute regarding this Agreement will be heard +non-exclusively by the courts of the Republic of Poland. In any legal claim +under this Agreement, the side which wins will be entitled to its legal fees +and expenses. + + + +19.2. The above choice of governing law and jurisdiction is subject to any +mandatorily applicable principles of consumer protection or other law in your +jurisdiction of residence which would not otherwise be available. + +### For users in the USA only: + +19.3 You and we agree that your use of GOG services and GOG content, and this +Agreement, will be deemed to be entered into in Los Angeles, California and +governed by and interpreted according to the laws of the State of California, +USA (and, if applicable, US federal law). Any legal claim by you against GOG +will be made exclusively in any state or federal court located in Los Angeles, +California, which will have subject matter jurisdiction regarding the dispute +between you and us and therefore we both consent to the exclusive jurisdiction +of those courts. In any legal claim under this Agreement, the side which wins +will be entitled to its legal fees and expenses. + +## 20\. CUSTOMER SUPPORT AND DISPUTE RESOLUTION + +20.1.If you have concerns, claims or issues with us, we hope we can resolve +them quickly and amicably. Please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). We will make reasonable and good +faith efforts to resolve any dispute between us informally. We undertake to +answer any claim within 14 days. + + + +20.2. If it is not resolved during this time, the next steps depend on where +you live. If you live within the EU you may submit your legal claims to the +online dispute resolution platform operated and provided by the European +Commission which can be accessed via http://ec.europa.eu/consumers/odr/ in +order to reach an out of court settlement or initiate a lawsuit. You may also +choose to resolve your dispute through any out-of-court dispute settlement +body certified by your country’s Digital Services Coordinator. + + + +20.3. If you live in the USA or the rest of the world (but not the EU) then +please contact us at legal@gog.com. + +## 21\. OTHER LEGAL STUFF + +21.1 If any part of this Agreement is found not to be legally enforceable, +this will not affect any other part of it. + + + +21.2 This Agreement (including any GOG additional terms referenced in it) +constitutes the entire agreement between you and us and supersedes any earlier +oral or written agreements. If you disagree with this, please contact us as +soon as possible after you start using GOG services at legal@gog.com since +otherwise this will be binding on you after a reasonable time period (usually +30 days). + + + +21.3 This Agreement governs our relationship with you (and vice versa). It +does not create any rights for anyone else. + + + +21.4 Please remember we are subject to various laws and we may be required to +comply with law enforcement or other legal requirements. + + + +21.5 If there is a reorganization, sale or merger of GOG then we may need to +work with relevant third parties to transfer or merge your GOG account. + + + +21.6. You and we agree that the UN Convention on Contracts for the +International Sale of Goods does not apply to this Agreement. + + + +21.7 We can assign, subcontract or transfer this Agreement to a third party or +another member of our group if necessary for the support of GOG, as part of +any reorganization or merger or for other business reasons. We will notify you +if this happens. + + + +21.8. If you are a European Union citizen, then please be aware that GOG has +enabled cross-border portability on free and paid content pursuant to +Regulation (EU) 2017/1128 of the European Parliament and of the Council of 14 +June 2017 on cross-border portability of online content services in the +internal market, but this is subject to any other legal requirements on GOG +including regarding IP protection and may also be subject to any requirements +of developer and publisher partners of GOG. + +## 22\. CHANGES TO THIS AGREEMENT + +22.1 We may change this Agreement if we think it's necessary, e.g. for legal +reasons or to reflect changes in GOG services or GOG content. If so, we will +make the changed Agreement available online at +https://support.gog.com/hc/articles/212632089 and (if you have a GOG account) +we will email you to let you know about any significant changes. + + + +22.2 Any changes to the Agreement will come into force within 30 days of their +announcement online. In the meantime, you're welcome to contact us at +legal@GOG.COM if you have specific questions about the changes. + + + +22.3 If you don't agree to those changes (regardless of whether you email us), +then unfortunately we must ask you to cease using GOG services and GOG +content. We're sorry we have to say that, but we hope you'll appreciate that +for GOG services to work properly we need to have everyone using it under the +same rules instead of different people having different rules. That's why we +encourage you to get in contact if you have queries or concerns. + + + +22.4 Just so you know, we'll never just make a bunch of changes to this +Agreement, not tell you what they are and force you to agree to changes you +don't understand before you can use GOG services! + +## 23\. OUR CONTACT DATA + +23.1. If you have any complaint concerning GOG account, GOG services, or +simply you would like to contact us, here are our contact details: + +Name: GOG sp. z o.o. +Registered Office: Ul. JagielloÅ„ska 74, 03-301 Warsaw, Poland +Registered at the District Court for Warsaw, 14th +Commercial Division of the National Court Register. +Registration Number 0000029514 +Tax number VAT ID (NIP) PL 113-21-77-807 +Share capital: PLN 135.750,00 PLN + +Single point of contact for authorities: +GOG Legal Team +legal@gog.com +Languages we communicate in: English, Polish +Single point of contact for recipients of GOG services: +GOG Support Team +support@gog.com +We mostly speak English and Polish, but will do our best to assist you in any +language that GOG is available in. +Last update (effective date): 17th February 2024 +See the previous version of the User +Agreement[here](https://support.gog.com/hc/articles/212632089). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/blackgate/tmp/EULA_ru-RU.txt b/info.exult.exult/data/blackgate/tmp/EULA_ru-RU.txt new file mode 100644 index 0000000..e3d95c8 --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/EULA_ru-RU.txt @@ -0,0 +1,1714 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM ПользовательÑкое Соглашение + +## 1\. ОБ ЭТОМ СОГЛÐШЕÐИИ + +1.1 ÐаÑтоÑщее Соглашение предÑтавлÑет Ñобой договор между вами (далее мы будем +называть Ð²Ð°Ñ Ð¿Ñ€Ð¾Ñто "вы") и компанией GOG sp. z o.o., JagielloÅ„ska 74, 03-301 +Варшава, Польша (далее мы будем называть ÑÐµÐ±Ñ "GOG" или проÑто "мы") и +раÑпроÑтранÑетÑÑ Ð½Ð° Ñайт www.GOG.COM, вашу учетную запиÑÑŒ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ GOG, +приложение GOG GALAXY (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¼Ð°Ð³Ð°Ð·Ð¸Ð½ GOG GALAXY), любые игры или видео, или +другой контент или уÑлуги, которые вы приобретаете или получаете доÑтуп через +наÑ, веб-форумы GOG, клиентÑкую и техничеÑкую поддержку GOG и другие уÑлуги, +которые мы вам предоÑтавлÑем (далее мы будем называть вÑе Ñто проÑто "уÑлуги +GOG" Ð´Ð»Ñ ÐºÑ€Ð°Ñ‚ÐºÐ¾Ñти). ЗдеÑÑŒ мы излагаем ваши права и обÑзанноÑти как Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ +уÑлуг GOG. + + + +1.2. К уÑлугам GOG могут применÑтьÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ уÑловиÑ, и в Ñтом Ñлучае +мы опубликуем их Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ принÑтиÑ. Ðапример, еÑли вы хотите воÑпользоватьÑÑ +приложением GOG GALAXY, ÑоответÑтвующие уÑÐ»Ð¾Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ опубликованы Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ +ÑоглаÑÐ¸Ñ Ð´Ð¾ того, как вы начнете пользоватьÑÑ Ñтими уÑлугами. + + + +1.3. Кроме того, когда мы говорим об играх, внутриигровом контенте, +виртуальных предметах или валюте, видео GOG или другом контенте или уÑлугах, +которые вы можете приобреÑти или получить доÑтуп через ÑервиÑÑ‹ GOG, мы будем +называть их "игры GOG" или "видео GOG" ÑоответÑтвенно, а когда мы говорим о +них вмеÑте, то Ñто "контент GOG". + + + +1.4 Мы не хотели делать Ñтот документ Ñлишком длинным, но имейте в виду, что, +Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°Ñ Ð½Ð°ÑˆÐµ ПользовательÑкое Ñоглашение, вы также ÑоглашаетеÑÑŒ Ñ: + + * нашей [ Политикой конфиденциальноÑти ](https://support.gog.com/hc/articles/212632109) \- в ней объÑÑнÑетÑÑ, какие данные мы Ñобираем у Ð²Ð°Ñ Ð¸ как мы их защищаем, + + * [ КодекÑом Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ GOG ](https://support.gog.com/hc/articles/16033977811613) \- Ñто Ñвод правил, которым вы должны Ñледовать как чаÑть нашего ÑообщеÑтва, + + * [ Политикой в отношении противоправного контента и авторÑких прав ](https://support.gog.com/hc/articles/16033687971613) , в которой объÑÑнÑетÑÑ, как вы можете Ñообщить о противоправном контенте на GOG и что произойдет, еÑли вы Ñто Ñделаете. + + + + + +1.5. GOG Ñотрудничает только Ñ Ð½Ð°Ð´ÐµÐ¶Ð½Ñ‹Ð¼Ð¸ и проверенными партнерами, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ +нашу родÑтвенную компанию CD PROJEKT S.A., разработчиков и издателей, ÑиÑтемы +Ñлектронных платежей, компании, предоÑтавлÑющие ПО Ð´Ð»Ñ Ð¾Ð±ÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð², +и многие другие, (далее "Партнеры") - мы еще вернемÑÑ Ðº ним в Ñтом Соглашении. + + + +1.6. ЕÑли вам больше 18 лет, то добро пожаловать на GOG.COM! ЕÑли вам от 16 до +18 лет, прежде чем мы поприветÑтвуем Ð²Ð°Ñ Ð½Ð° нашем Ñайте, вы должны попроÑить +Ñвоего Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ опекуна прочитать Ñто Соглашение и одобрить его от вашего +имени (потому что в некоторых Ñтранах люди младше определенного возраÑта по +закону не могут заключать такие договора, как наÑтоÑщее Соглашение). Лица +младше 16 лет не могут Ñоздать учётную запиÑÑŒ и пользоватьÑÑ ÑƒÑлугами GOG (но +Ñто могут Ñделать их родители или опекуны), поÑкольку, ÑоглаÑно закону, мы не +имеем права обрабатывать их перÑональные данные без Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÐµÐ¹. + +## 2\. КÐК ПОЛЬЗОВÐТЬСЯ УСЛУГÐМИ И МÐТЕРИÐЛÐМИ GOG + +2.1. Мы предоÑтавлÑем вам и другим пользователÑм GOG личное право (юридичеÑки +оно называетÑÑ Â«Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ») на иÑпользование уÑлуг GOG.COM, на загрузку, доÑтуп +и/или на Ñтриминг (в завиÑимоÑти от Ñитуации) материалов GOG и других УÑлуг +GOG. Эта Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð° иÑключительно Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ личного пользованиÑ. +Мы можем приоÑтановить дейÑтвие Ñтой лицензии или отменить её в некоторых +ÑлучаÑÑ…, которые разъÑÑнены ниже. + + + +2.2. Когда вы покупаете, получаете доÑтуп или уÑтанавливаете игры GOG, вам +иногда придетÑÑ ÑоглашатьÑÑ Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ уÑловиÑми разработчиков или +издателей игры (например, они могут попроÑить Ð²Ð°Ñ ÑоглаÑитьÑÑ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ +Ñоглашением Ð´Ð»Ñ ÐºÐ¾Ð½ÐµÑ‡Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð¹ игры). ЕÑли между такими +лицензионными ÑоглашениÑми и нашим Соглашением наблюдаютÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð¾Ñ€ÐµÑ‡Ð¸Ñ, то +важнее оказываетÑÑ Ð½Ð°ÑˆÐµ Соглашение. + + + +2.3. Купленное видео GOG вы также можете загружать к Ñебе на компьютер или +проÑматривать онлайн — как вам удобнее. + + + +2.4. ИÑпользование определенных Ñторонних программ рекомендуетÑÑ, чтобы +полноÑтью иÑпользовать веÑÑŒ функционал GOG.COM, и Ñ…Ð¾Ñ‚Ñ Ð¸Ñ… иÑпользование не +ÑвлÑетÑÑ Ð¾Ð±Ñзательным, мы не можем гарантировать полноценную работу вÑех +ÑервиÑов без них. + + + +2.5. ÐеÑколько Ñлов о GOG GALAXY - нашем (дополнительном) приложении, которое +не только позволÑет покупать и получать доÑтуп к контенту GOG, но и +предоÑтавлÑет такие возможноÑти, как ÐµÐ´Ð¸Ð½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° игр, единый ÑпиÑок +друзей на вÑех платформах, онлайн-мультиплеер, доÑтижениÑ, кроÑÑплатформенный +чат, отÑлеживание игрового времени, облачные ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸ наложение игры. +Подробнее о нем вы можете узнать[здеÑÑŒ](https://www.gog.com/galaxy). + + + +2.6 Ð’ некоторых чаÑÑ‚ÑÑ… ÑервиÑов GOG мы иÑпользуем рекомендательные ÑиÑтемы, +чтобы предÑтавить вам контент, который, Ñкорее вÑего, Ð²Ð°Ñ Ð·Ð°Ð¸Ð½Ñ‚ÐµÑ€ÐµÑует. Ð’Ñ‹ +можете узнать, где мы их иÑпользуем и как они +работают[здеÑÑŒ](https://support.gog.com/hc/articles/16034228157213), Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ +то, какие оÑновные параметры мы иÑпользуем и как на них влиÑть. + +## 3\. УЧÐТÐÐЯ ЗÐПИСЬ GOG + +3.1. Чтобы купить любые материалы GOG через ÑервиÑÑ‹ GOG, а иногда и чтобы +играть или пользоватьÑÑ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð¾Ð¼ GOG, в ÑлучаÑÑ…, когда наши партнеры требуют +иÑпользовать GOG-аккаунт, вам потребуетÑÑ Ñоздать учётную запиÑÑŒ GOG. При Ñтом +необходимо будет придумать пароль (который будет зашифрован, чтобы мы не +получили к нему доÑтуп) и Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, а также указать ваш Ð°Ð´Ñ€ÐµÑ +Ñлектронной почты (чтобы мы Ñмогли удоÑтоверитьÑÑ Ð² том, что Ñто именно вы). +Сохраните Ñти данные вашей учётной запиÑи и никому их не Ñообщайте. Ð’ +наÑтройках Ñвоей учётной запиÑи GOG вы также можете дополнительно указать Ñвою +Ñтрану проживаниÑ, дату Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸ выбрать аватар. Ð’ нашей Политике +конфиденциальноÑти более подробно напиÑано о том, какие данные о Ð²Ð°Ñ Ð¼Ñ‹ +Ñобираем, как их иÑпользуем и как защищаем. Прочитать её +можно[здеÑÑŒ](https://support.gog.com/hc/articles/212632109). + + + +3.2. Ð’Ñ‹ можете иÑпользовать Ñвою учётную запиÑÑŒ GOG Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ +профилÑ, доÑтупного Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… людей. Ð’Ñ‹ также можете иÑпользовать Ñвою +учётную запиÑÑŒ GOG Ð´Ð»Ñ Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ пользователÑми GOG. Ðе забывайте об +оÑторожноÑти и помните, что вы неÑёте ответÑтвенноÑть за Ñвои дейÑтвиÑ! + + + +3.3 Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ GOG и Ñодержимое GOG ÑвлÑÑŽÑ‚ÑÑ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ личными данными и +не могут быть переданы, проданы, подарены или переданы кому-либо еще. Ваш +доÑтуп к ним и их иÑпользование регулируютÑÑ [ Политикой конфиденциальноÑти +](https://support.gog.com/hc/articles/212632109) и [ КодекÑом Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ +](https://support.gog.com/hc/articles/16033977811613) GOG, которые обновлÑÑŽÑ‚ÑÑ +или изменÑÑŽÑ‚ÑÑ Ð¿Ð¾ мере необходимоÑти. + + + +3.4. ДоÑтуп и иÑпользование игр, приобретенных на различных платформах (Ñ‚. е. +Ñ Ñ‚Ð°Ðº называемым "беÑключевым доÑтупом"), Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¸Ñ… минимальные ÑиÑтемные +требованиÑ, регулируютÑÑ ÑоответÑтвующими политиками Ñторонних платформ и +(еÑли применимо) дополнительными уÑловиÑми договора Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð¼/издателем +игры (например, они могут попроÑить Ð²Ð°Ñ ÑоглаÑитьÑÑ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ Ñоглашением +Ñ ÐºÐ¾Ð½ÐµÑ‡Ð½Ñ‹Ð¼ пользователем конкретной игры). Ð”Ð»Ñ Ñтого может потребоватьÑÑ +ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ на Ñторонней платформе. Эти платформы могут выпуÑкать патчи или +Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ñ‹Ñ… вами игр. + +## 4\. СИСТЕМÐЫЕ ТРЕБОВÐÐИЯ + +4.1. GOG.COM предоÑтавлÑет вам доÑтуп к различным уÑлугам и играм, Ñозданным в +разное Ð²Ñ€ÐµÐ¼Ñ Ð¸ на разных платформах, поÑтому мы не можем Ñообщить вам +ÑиÑтемные требованиÑ, подходÑщие Ð´Ð»Ñ Ð²Ñех УÑлуг GOG или вÑех материалов GOG. + + + +4.2. Мы можем только Ñказать, что Ð´Ð»Ñ Ð¸Ð³Ñ€Ñ‹ в конкретную игру GOG вам +потребуетÑÑ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ в комплекте Ñ Ð¼Ñ‹ÑˆÐºÐ¾Ð¹ и клавиатурой (управление на +ÑенÑорном Ñкране не поддерживаетÑÑ), ÑоответÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÑиÑтема +(пожалуйÑта, проверьте Ñто на Ñтранице нужного вам продукта GOG) вмеÑте +уÑтановленными патчами и важными обновлениÑми. ПредполагаетÑÑ, что ВСЕ игры +GOG должны уÑтанавливатьÑÑ Ð½Ð° компьютеры, удовлетворÑющие минимальным +требованиÑм к аппаратному и программному обеÑпечению, указанным на Ñтранице +продукта GOG. Игры GOG не теÑтируютÑÑ Ð½Ð° виртуальных машинах, и, +Ñледовательно, мы не поддерживаем игру на них. + + + +4.3. Что каÑаетÑÑ Ð²Ð¸Ð´ÐµÐ¾ GOG, то убедитеÑÑŒ, что ваш видеоплейер поддерживает +формат видео, указанный на Ñтранице продукта GOG. + + + +4.4. ЕÑли у Ð²Ð°Ñ ÐµÑть вопроÑÑ‹ о ÑиÑтемных требованиÑÑ…, ÑвÑжитеÑÑŒ Ñ +нами[здеÑÑŒ](https://support.gog.com/hc/requests/new). Чтобы не было Ñомнений: +вы Ñами должны убедитьÑÑ Ð² том, что ваш доÑтуп к интернету позволÑет вам +загрузить купленные игры или видео GOG или проÑматривать видео GOG онлайн, и +что ваш компьютер позволÑет вам играть в игры GOG и проÑматривать видео GOG. + +## 5\. БЕТÐ-ДОСТУП К GOG + +5.1 По мере Ñ€Ð°Ð·Ð²Ð¸Ñ‚Ð¸Ñ GOG мы можем предложить вам дополнительный доÑтуп к +"бета-верÑиÑм" программного обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ уÑлуг GOG (например, к новым +верÑиÑм Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ GOG GALAXY, доÑтупным до его общего выпуÑка) или к контенту +GOG. + + + +Вот правила: + + + +a) Мы (или любой издатель/партнер, которого Ñтого может каÑатьÑÑ) +уÑтанавливаем уÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ доÑтупа к бета-верÑии. +ПредоÑтавление доÑтупа к бета-верÑии (а также решение о том, кому предоÑтавить +доÑтуп) и поддержание работоÑпоÑобноÑти такой верÑии выполнÑÑŽÑ‚ÑÑ Ð¿Ð¾ нашему +уÑмотрению. + + + +b) Возможно, вам придетÑÑ Ð¿Ñ€Ð¾Ð¹Ñ‚Ð¸ процеÑÑ Ñ€ÐµÐ³Ð¸Ñтрации или выполнить другие +обÑзательные дейÑтвиÑ, чтобы получить доÑтуп к бета-верÑии (от Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ +потребоватьÑÑ ÑоответÑтвие определенным критериÑм). + + + +c) Бета-верÑии будут иметь Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ времени и могут вноÑить в Ñоглашение +дополнительные требованиÑ. + + + +d) Во Ð²Ñ€ÐµÐ¼Ñ Ð±ÐµÑ‚Ð°-теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹ временные или поÑтоÑнные чиÑтки +Ñерверов/данных, обнуление прохождениÑ/контента, а также перезапуÑки или +иÑправлениÑ. + + + +e) Бета-верÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ подпадать под уÑÐ»Ð¾Ð²Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð´ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð¾Ñти (о чем вы будете +оÑведомлены заранее). + + + +f) Ð’Ð°Ñ Ð¼Ð¾Ð³ÑƒÑ‚ попроÑить поделитьÑÑ Ñвоим отзывом о бета-верÑии - вы Ñами +решаете, делать Ñто или нет, но ваша помощь будет выÑоко оценена. + + + +g) Бета-верÑÐ¸Ñ Ð¿Ñ€ÐµÐ´Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð° Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ личного иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ наÑлаждениÑ, +поÑтому вы не должны продавать, одалживать или иным образом передавать ее +кому-либо еще. + + + +h) ДоÑтуп к бета-верÑии предоÑтавлÑетÑÑ Ð²Ð°Ð¼ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы вы могли оценить +игру и получить новый опыт, однако важно помнить, что перед вами не конечный +продукт. ПоÑтому бета-верÑии игр раÑпроÑтранÑÑŽÑ‚ÑÑ Â«ÐºÐ°Ðº еÑть»: мы не даем +никаких гарантий и не принимаем никакой ответÑтвенноÑти в Ñлучае, еÑли игра не +ÑвлÑетÑÑ Ð·Ð°ÐºÐ¾Ð½Ñ‡ÐµÐ½Ð½Ð¾Ð¹, не работает так, как должна, или приводит к +возникновению проблем. Бета-верÑии могут не обладать полным набором функций, и +во Ð²Ñ€ÐµÐ¼Ñ Ð±ÐµÑ‚Ð°-теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ игры могут быть изменены, модифицированы +или полноÑтью удалены. + + + +Мы можем предоÑтавить доÑтуп к контенту GOG, находÑщемуÑÑ Ð² форме бета-верÑии +или верÑии до официального выхода. Ðапример, издатель/партнер может решить +опубликовать игру или ее чаÑть в качеÑтве бета-верÑии или приÑоединитьÑÑ Ðº +нашей программе «Early Access» (Ñм. раздел 7.6-7.8). Любой подобный контент +GOG также будет регулироватьÑÑ Ñтими правилами, еÑли только издатель не введет +ÑобÑтвенные правила (которые будут иметь преимущеÑтвенную Ñилу). + +## 6\. ОПЛÐТРМÐТЕРИÐЛОВ GOG И ВОЗВРÐТ ДЕÐЕГ + +Оплата материалов GOG + + + +6.1 ПоÑле того как вы решите, что вам понравилаÑÑŒ игра GOG, видео GOG или +другой контент GOG, вам, как правило, придетÑÑ Ð·Ð°Ð¿Ð»Ð°Ñ‚Ð¸Ñ‚ÑŒ за него, прежде чем +вы Ñможете получить к нему доÑтуп (Ñ…Ð¾Ñ‚Ñ Ñƒ Ð½Ð°Ñ ÐµÑть и беÑплатный контент!). Ð’Ñ‹ +можете оплатить покупку различными ÑпоÑобами: (i) Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ дейÑтвующей +дебетовой или кредитной карты; или (ii) Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ PayPal или любого другого +авторизованного платежного провайдера. Ðе забывайте о безопаÑноÑти Ñвоих +платежных реквизитов. + + + +6.2 Когда вы иÑпользуете ÑпоÑоб оплаты Ð´Ð»Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ контента GOG, мы полагаемÑÑ +на ваше обещание, что вы можете иÑпользовать Ñтот ÑпоÑоб. Ð’Ñ‹ неÑете +ответÑтвенноÑть за любые покупки, Ñовершенные Ñ Ð¸Ñпользованием вашей учетной +запиÑи GOG или ÑпоÑоба оплаты, и ÑоглашаетеÑÑŒ Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ð¸Ð¼Ñ‹Ð¼Ð¸ к ним правилами +ценообразованиÑ, оплаты и выÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñчетов, о которых вам ÑообщаетÑÑ Ð² +момент покупки. Ð’Ñе платежи не подлежат возврату и передаче, за иÑключением +Ñлучаев, прÑмо предуÑмотренных в наÑтоÑщем Соглашении. + + + +6.3. Ð’Ñ‹ вÑегда можете оплатить материалы GOG долларами СШÐ. Тем не менее, еÑли +вы проживаете в Ñтранах, где поддерживаетÑÑ Ð²Ð°ÑˆÐ° меÑÑ‚Ð½Ð°Ñ Ð²Ð°Ð»ÑŽÑ‚Ð° (Ñмотрите +полный ÑпиÑок в нашей[Секции +поддержки](https://support.gog.com/hc/sections/202834625-FAQ-Payments-pricing- +and-promos)), вы можете раÑплатитьÑÑ Ñвоей меÑтной валютой. ЕÑли вы +раÑплачиваетеÑÑŒ не Ñвоей меÑтной валютой, то вам, возможно, придётÑÑ Ð¾Ð¿Ð»Ð°Ñ‚Ð¸Ñ‚ÑŒ +и комиÑÑию за конвертацию валюты; некоторые банки также могут взимать плату за +транзакцию. + + + +6.4. Ð’Ñе цены видны на Ñтранице каталога товаров. Они включают в ÑÐµÐ±Ñ Ð½Ð°Ð»Ð¾Ð³Ð¸, +такие как ÐДС, еÑли применимо. Ð’Ñ‹ также должны ожидать, что некоторые налоги Ñ +продаж/ÐДС будут добавлены к цене при оформлении заказа, еÑли Ñто +предуÑмотрено меÑтным законодательÑтвом (например, в СШРили Канаде). + + + +GOG-кошелек + + + +6.5 GOG предлагаем Ñвоим пользователÑм цифровой Ð±Ð°Ð»Ð°Ð½Ñ Ð½Ð° аккаунте, который +называетÑÑ GOG-кошелек и привÑзан к вашей учетной запиÑи. Его можно +иÑпользовать Ð´Ð»Ñ Ð¾Ð¿Ð»Ð°Ñ‚Ñ‹ покупок на контента GOG на площадках GOG. СредÑтва в +кошелек можно начиÑлить Ð´Ð²ÑƒÐ¼Ñ ÑпоÑобами: (i) иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð»ÑŽÐ±Ð¾Ð¹ платежный метод; +или (ii) через «[Политику добровольного возврата +ÑредÑтв](https://support.gog.com/hc/articles/360006129837)», в Ñтом Ñлучае мы +можем предложить возврат ÑредÑтв за приобретенный контент на GOG-кошелек. GOG- +кошелек дейÑтвует в ÑоответÑтвии Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸, которые можно найти на +Ñпециальной Ñтранице[здеÑÑŒ](https://support.gog.com/hc/articles/360001941953). + + + +БонуÑные коды GOG + + + +6.6. Мы также можем выдавать ограниченные по времени бонуÑные коды, которые +предоÑтавлÑÑŽÑ‚ вам беÑплатный или льготный доÑтуп к Ñодержимому GOG (мы будем +называть их "БонуÑные коды"). ЕÑли вы получили бонуÑные коды при покупке +контента GOG, но позже решили вернуть Ñтот контент GOG, мы Ñчитаем, что будет +Ñправедливо, еÑли вы также вернете бонуÑные коды. ПоÑтому мы прекратим их +дейÑтвие или, еÑли они были выкуплены за игру GOG, Ñта игра будет удалена Ñ +вашего аккаунта. + + + +СиÑтема раÑпроÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Direct to Account + + + +6.7 У Ð½Ð°Ñ ÐµÑть ÑиÑтема раÑпроÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Direct to Account (назовем ее GOG +Direct to Account). Эта ÑиÑтема позволÑет партнерÑким платформам диÑтрибуции +продавать игры или другой контент, который можно автоматичеÑки активировать в +учетной запиÑи GOG без каких-либо кодов. Уточним, что веÑÑŒ процеÑÑ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ +обрабатываетÑÑ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ платформой, поÑтому в Ñлучае Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ при +покупке, вам Ñтоит обратитьÑÑ Ð½ÐµÐ¿Ð¾ÑредÑтвенно к ее предÑтавителÑм. Более +подробную информацию об Ñтой ÑиÑтеме можно найти в разделе «Возврат ÑредÑтв и +продукта» ниже. РазумеетÑÑ, мы неÑем полную ответÑтвенноÑть за вÑе, что так +или иначе ÑвÑзано Ñ ÑервиÑами нашей платформы. + +## 7\. ВОЗВРÐТ ДЕÐЕГ И ПРОДУКТР+ +Право на отказ от товара. + + + +7.1. ЕÑли вы ÑвлÑетеÑÑŒ резидентом ЕвропейÑкого Союза или других применимых +юриÑдикций (за иÑключением СШÐ), то у Ð²Ð°Ñ ÐµÑть законное право отказатьÑÑ Ð¾Ñ‚ +покупки контента GOG в течение 14 дней поÑле покупки без объÑÑÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½. +Чтобы воÑпользоватьÑÑ Ð¿Ñ€Ð°Ð²Ð¾Ð¼ на раÑторжение договора, вы должны Ñообщить нам о +Ñвоем решении раÑторгнуть договор путем недвуÑмыÑленного заÑÐ²Ð»ÐµÐ½Ð¸Ñ +(Ñлектронное пиÑьмо, отправленное по адреÑу support@GOG.COM, или физичеÑкое +пиÑьмо по адреÑу, указанному в разделе 23 ниже). Ð’Ñ‹ можете иÑпользовать +типовую форму отзыва, приложенную в конце данного СоглашениÑ, но Ñто не +обÑзательно. Чтобы вложитьÑÑ Ð² указанный Ñрок, доÑтаточно Ñообщить нам об +оÑущеÑтвлении права на аннулирование договора прежде чем Ñрок отзыва иÑтечет. +Однако Ñто не отноÑитÑÑ Ðº ÑлучаÑм, когда вы дали Ñвное ÑоглаÑие на +иÑпользование контента GOG (который ÑвлÑетÑÑ Ñ†Ð¸Ñ„Ñ€Ð¾Ð²Ñ‹Ð¼ контентом) Ñразу поÑле +Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа покупки и признали потерю права на отзыв. + + + +7.2. Ðи Ñта, ни Ð»ÑŽÐ±Ð°Ñ Ð´Ñ€ÑƒÐ³Ð°Ñ Ñ‡Ð°Ñть Ñтого ПользовательÑкого ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ +влиÑет на ваши законные права. Ð’ чаÑтноÑти: + + + +a) Ð”Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ ÐвÑтралии: наши товары предоÑтавлÑÑŽÑ‚ÑÑ Ñ Ð³Ð°Ñ€Ð°Ð½Ñ‚Ð¸Ñми, +которые не могут быть иÑключены в ÑоответÑтвии Ñ Ð°Ð²ÑтралийÑким законом О +защите прав потребителей. Ð’Ñ‹ имеете право на замену или возврат денег в Ñлучае +Ñерьезной неиÑправноÑти и компенÑацию за любые другие обоÑнованно +прогнозируемые убытки или ущерб. Ð’Ñ‹ также имеете право на ремонт или замену +товара, еÑли товар не имеет приемлемого качеÑтва и неиÑправноÑть не ÑвлÑетÑÑ +значительной; + + + +b) Ð”Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ðовой Зеландии: ни Ñто, ни какаÑ-либо Ð´Ñ€ÑƒÐ³Ð°Ñ Ñ‡Ð°Ñть +наÑтоÑщего ПользовательÑкого ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ иÑключает, не ограничивает и не +изменÑет применение каких-либо прав или ÑредÑтв правовой защиты, которые таким +образом не могут быть иÑключены, ограничены или изменены, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ñ€Ð°Ð²Ð°, +предоÑтавленные законом О гарантиÑÑ… потребителей Ðовой Зеландии 1993 года. Ð’ +ÑоответÑтвии Ñ Ñтим законом предоÑтавлÑÑŽÑ‚ÑÑ Ð³Ð°Ñ€Ð°Ð½Ñ‚Ð¸Ð¸ оÑущеÑÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð»ÐµÐ¼Ð¾Ð³Ð¾ +качеÑтва товаров и уÑлуг. ЕÑли Ñта Ð³Ð°Ñ€Ð°Ð½Ñ‚Ð¸Ñ Ð½Ðµ Ñоблюдена, еÑть право на +иÑправление программного обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ (которое может подразумевать ремонт, +замену или возврат). ЕÑли помощь по уÑтранению проблемы не может быть +предоÑтавлена или Ñбой в работе – ÑущеÑтвенный, закон предуÑматривает +возмещение ÑредÑтв. + + + +Ðаша Политика добровольного возврата + + + +7.3. Мы понимаем, что иногда покупка не оправдывает ожиданий, а мы хотим быть +чеÑтными Ñ Ð½Ð°ÑˆÐ¸Ð¼Ð¸ пользователÑми GOG. Именно поÑтому в дополнение к вашим +законным правам на возврат денежных ÑредÑтв (опиÑанным в разделе 7.1.-7.2. +выше) мы можем преложить вам Политику добровольного возврата, +опиÑанную[здеÑÑŒ](https://support.gog.com/hc/articles/36000612983). Продажа +ÑчитаетÑÑ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ поÑле иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐ¸Ñ… прав на возврат +денежных ÑредÑтв (еÑли только мы не договорилиÑÑŒ об ином в каждом конкретном +Ñлучае) + +## 8\. ВИРТУÐЛЬÐЫЕ ПРЕДМЕТЫ И ИГРОВÐЯ Ð’ÐЛЮТР+ +8.1. Ð’ Ñлучае Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ контентом GOG у Ð²Ð°Ñ ÐµÑть возможноÑть купить или +приобреÑти виртуальные предметы и/или виртуальную валюту (Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñтоты мы +будем назвать их «Виртуальные Товары»). Виртуальные Товары подпадают под +правила Ñтого СоглашениÑ, еÑли только у контента GOG, к которому они +отноÑÑÑ‚ÑÑ, нет ÑобÑтвенных правил (которые будут иметь преимущеÑтвенную Ñилу). + + + +8.2. Виртуальные Товары - Ñто цифровые предметы, которые не ÑущеÑтвуют в +реальном мире и не имеют денежной ÑтоимоÑти, их не возможно купить, продать, +подарить, передать, погаÑить, будь то обмен на другие Виртуальные Товары, +«наÑтоÑщие» деньги, товары, уÑлуги или материальные ценноÑти. Обмен +Виртуальных Товаров Ñтрого запрещен (еÑли только у Ð²Ð°Ñ Ð½ÐµÑ‚ на него +Ñпециального разрешениÑ). Ваше право иÑпользовать любые Виртуальные Товары +ограничено ограниченной, неиÑключительной, непередаваемой, не подлежащей +передаче, не имеющей права ÑублицензированиÑ, отзываемой лицензией, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ +позволÑет вам иÑпользовать Виртуальные Товары только Ð´Ð»Ñ Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ Ñ€Ð°Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸ +некоммерчеÑкого иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑоответÑтвующем контенте GOG. У Ð²Ð°Ñ Ð½ÐµÑ‚ +никаких имущеÑтвенных прав на Виртуальные Товары, которые оÑтаютÑÑ Ð² полной +ÑобÑтвенноÑти ÑоответÑтвующего издателÑ. При необходимоÑти Виртуальные Товары +могут быть изменены, иÑправлены или аннулированы. Ð’ том чиÑле и Ñ Ñ†ÐµÐ»ÑŒÑŽ +обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ ÑÐ¾Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ ÑƒÑловий данного СоглашениÑ. Ð’ Ñлучае необходимоÑти на +иÑпользование виртуальных товаров могут быть наложены Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ (в том +чиÑле, ограничение размеров транзакции и количеÑтва ÑредÑтв на Ñчете). + + + +8.3. СущеÑтвование того или иного Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð’Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ… Товаров не +означает, что мы обÑзуемÑÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ‚ÑŒ Ñти товары или продолжать их выпуÑк в +будущем. МаÑштабы, аÑÑортимент и типы Виртуальных Товаров, которые вы можете +приобреÑти, могут изменитьÑÑ, и мы оÑтавлÑем за Ñобой право управлÑть +Виртуальными Товарами, изменÑть их или полноÑтью удалÑть, еÑли мы Ñочтем Ñто +необходимым Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ ÑервиÑа GOG, контента GOG или по любой +другой законной причине. Ð’ Ñтом Ñлучае мы не неÑем никакой ответÑтвенноÑти +перед вами или другими лицами за оÑущеÑтвление Ñтих прав. Мы приложим разумные +уÑилиÑ, чтобы уведомить Ð²Ð°Ñ Ð¾ любых таких изменениÑÑ… и объÑÑнить причину таких +изменений. + +## 9\. ПÐТЧИ, ОБÐОВЛЕÐИЯ И ИЗМЕÐЕÐИЯ + +9.1 Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ времени нам может потребоватьÑÑ Ð¸Ñправление или обновление уÑлуг +GOG или контента GOG (например, Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ или +уÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº в программном обеÑпечении). Эти права нужны нам Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, +чтобы поддерживать Ñффективную и безопаÑную работу GOG. ОтÑутÑтвие иÑправлений +или обновлений Ñлужб GOG или Ñодержимого GOG может привеÑти к Ñнижению +производительноÑти вашей верÑии или неÑовмеÑтимоÑти вашей верÑии Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ +функциÑми Ñлужб GOG или Ñодержимого GOG. При Ñтом вы также риÑкуете не +уÑтановить важные Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти. Ðаши партнеры могут иÑпользовать +Ñлужбы GOG Ð´Ð»Ñ Ð²Ñ‹Ð¿ÑƒÑка иÑправлений или обновлений Ð´Ð»Ñ ÑоответÑтвующего +контента GOG. + +## 10\. ПРÐВО СОБСТВЕÐÐОСТИ ÐРСЕРВИСЫ GOG И ПРÐÐ’Ð ÐРИÐТЕЛЛЕКТУÐЛЬÐУЮ +СОБСТВЕÐÐОСТЬ + +10.1. УÑлуги GOG включают в ÑÐµÐ±Ñ (и Ñто не полный ÑпиÑок) изображениÑ, +компьютерный код, Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, внешний вид и «атмоÑферу», +звукозапиÑи, видеозапиÑи, текÑÑ‚, раÑположение Ñлементов, базы данных, данные и +многое другое, вÑе юридичеÑкие права на которые либо принадлежат нам, либо +переданы нам по лицензии третьими Ñторонами. Материалы GOG принадлежат их +разработчикам/издателÑм и лицензированы нами. Ð’Ñе права Ñохранены, за +иÑключением тех Ñлучаев, которые указаны в Ñтом Соглашении. Вам Ð½ÐµÐ»ÑŒÐ·Ñ +иÑпользовать любую чаÑть УÑлуг GOG или материалов GOG иначе, чем указано в +Ñтом Соглашении. + + + +10.2. GOG уважает права интеллектуальной ÑобÑтвенноÑти других лиц. Подробнее +читайте[здеÑÑŒ](https://support.gog.com/hc/articles/16033687971613). + +## 11\. ПРÐВИЛРПОЛЬЗОВÐÐИЯ УСЛУГÐМИ GOG + +11.1 ПожалуйÑта, Ñоблюдайте Ñти правила, каÑающиеÑÑ ÑƒÑлуг GOG и Ñодержимого +GOG, а также вÑе дополнительные правила, ÑÑылки на которые приведены ниже в +разделе 11.2. ПожалуйÑта, внимательно ознакомьтеÑÑŒ Ñ Ñтими правилами, +поÑкольку их неÑоблюдение (оÑобенно тех, которые каÑаютÑÑ Ð¼Ð¾ÑˆÐµÐ½Ð½Ð¸Ñ‡ÐµÑтва) будет +ÑчитатьÑÑ ÑущеÑтвенным нарушением данного СоглашениÑ, что может привеÑти к +приоÑтановке или аннулированию вашего доÑтупа к уÑлугам GOG. Вот правила: + + + +(a) ИÑпользуйте ÑервиÑÑ‹ GOG или контент GOG только Ð´Ð»Ñ Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ удовольÑÑ‚Ð²Ð¸Ñ +(например, не иÑпользуйте их Ð´Ð»Ñ Ð·Ð°Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ°, пиратÑтва или в политичеÑких +целÑÑ…). + + + +(b) Что каÑаетÑÑ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° GOG, то то, что вы можете делать практичеÑки помимо +игры (например, Ñоздавать производные произведениÑ) , завиÑит от того, что вам +разрешает правообладатель контента GOG (GOG не может предоÑтавлÑть такие +права). ПоÑтому уточните Ñтот Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð½ÐµÐ¿Ð¾ÑредÑтвенно у Ð¿Ñ€Ð°Ð²Ð¾Ð¾Ð±Ð»Ð°Ð´Ð°Ñ‚ÐµÐ»Ñ (в +первую очередь проверьте, еÑть ли у него EULA и еÑли еÑть, то что в нем +напиÑано). Мы также проÑим Ð²Ð°Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°Ñ‚ÑŒ только иÑкренние попытки улучшить +Ñодержание GOG. + + + +(c) Что каÑаетÑÑ Ð£Ñлуг GOG (к которым отноÑитÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð¾Ðµ обеÑпечение GOG), +то без предварительного Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñо Ñтороны GOG их Ð½ÐµÐ»ÑŒÐ·Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸Ñ†Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ, +объединÑть, раÑпроÑтранÑть, переводить, декомпилировать, деаÑÑемблировать, как +и Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать на их оÑнове производные продукты, еÑли только Ñто не +позволено данным Соглашением или законами вашей Ñтраны. Мы бы хотели обратить +ваше внимание на то, что вы вÑегда можете ÑвÑзатьÑÑ Ñ Ð½Ð°Ð¼Ð¸ и попроÑить +Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° такие дейÑтвиÑ; мы раÑÑмотрим вашу проÑьбу и вынеÑем +Ñправедливое решение. Ð’ будущем мы планируем открыть клиентÑкие протоколы, +чтобы облегчить пользователÑм работу Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ и программным обеÑпечением GOG +без необходимоÑти прибегать к декомпилÑции или другим подобным ÑредÑтвам. + + + +(d) Ðе взламывайте, не наноÑите вред, не мешайте работе и не нарушайте правила +ÑкÑплуатации ÑервиÑов GOG и контента GOG, а также не применÑйте аналогичные +дейÑÑ‚Ð²Ð¸Ñ Ðº другим пользователÑм GOG или Ñотрудникам GOG. + + + +(e) Ðе Ñоздавать, не иÑпользовать, не предоÑтавлÑть и/или не раÑпроÑтранÑть +читы, ÑкÑплойты, программы автоматизации, роботы, боты, моды, взломы, пауки, +шпионÑкие программы, читы, Ñкрипты, трейнеры, инÑтрументы Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ +другое программное обеÑпечение, которое взаимодейÑтвует или влиÑет на ÑервиÑÑ‹ +GOG или контент GOG любым ÑпоÑобом (включаÑ, без ограничений, любые +неавторизованные программы третьих лиц, которые перехватывают, Ñмулируют или +перенаправлÑÑŽÑ‚ любые коммуникации между GOG или его партнерами и ÑервиÑами GOG +и/или любые неавторизованные программы третьих лиц, которые Ñобирают +информацию о ÑервиÑах GOG). + + + +(f) Ðе вмешивайтеÑÑŒ в работу Ñетевого программного обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ GOG или третьих +Ñторон, в том чиÑле поÑредÑтвом туннелированиÑ, Ð²Ð½ÐµÐ´Ñ€ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°, модификации +программного обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ GOG, Ñ Ð¸Ñпользованием подобных программ вмеÑте Ñ +УÑлугами или материалами GOG, поÑредÑтвом ÑмулÑции протоколов или путём +ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñтных Ñерверов, дублирующих УÑлуги или материалы GOG. Ðе пытайтеÑÑŒ +получить доÑтуп к уÑлугам GOG.COM, ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ GOG GALAXY или Ñерверам GOG, +которые закрыты от публичного доÑтупа. + + + +(g) Ðе делайте и не говорите ничего, что ÑчитаетÑÑ Ð¸Ð»Ð¸ может ÑчитатьÑÑ +раÑиÑÑ‚Ñким, кÑенофобÑким, ÑекÑиÑÑ‚Ñким, клеветничеÑким или иным оÑкорбительным +или незаконным (например, ÑкÑÐ¿Ð»ÑƒÐ°Ñ‚Ð°Ñ†Ð¸Ñ Ð½ÐµÑовершеннолетних, поощрение наÑилиÑ, +мошенничеÑтво). Будьте добры друг к другу, пожалуйÑта! + + + +(h) Ðе раÑпроÑтранÑйте, не покупайте, на продавайте, не передавайте, не +дарите, не Ñдавайте в аренду, не крадите и не приÑваивайте учетные запиÑи GOG. +Ключи/Коды GOG можно дарить, передавать или иÑпользовать только в ÑоответÑтвии +Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸ GOG. ЕÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ проблемы или вопроÑÑ‹, обратитеÑÑŒ в нашу +Ñлужбу поддержки. + + + +(i) Мы проÑим Ð²Ð°Ñ Ñоблюдать любые возникающие географичеÑкие, региональные, +Ñзыковые или территориальные ограничениÑ, уÑÐ»Ð¾Ð²Ð¸Ñ Ð¸Ð»Ð¸ правила в отношении GOG. + + + +(j) Мы также проÑим Ð²Ð°Ñ Ð½Ðµ Ñовершать в отношении GOG какие-либо дейÑтвиÑ, +которые нарушали бы авторÑкие права, товарный знак, патент, коммерчеÑкую +тайну, неприкоÑновенноÑть чаÑтной жизни, публичноÑть или оÑтальные права +других лиц, такие как: изображениÑ, фотографии, звуковые файлы, текÑтовые +файлы, графичеÑкие файлы и любые другие материалы или информацию. + + + +11.2 Ð’ дополнение к вышеизложенному ниже приведен ÑпиÑок дополнительных +уÑловий, которые применÑÑŽÑ‚ÑÑ Ðº вам при иÑпользовании уÑлуг GOG. Мы не хотим +повторÑтьÑÑ, но важно помнить, что еÑли вы не будете Ñледовать им, Ñто будет +ÑущеÑтвенным нарушением данного СоглашениÑ, что может привеÑти к приоÑтановке +или аннулированию вашего доÑтупа к уÑлугам GOG. СÑылки: + + * ÐšÐ¾Ð´ÐµÐºÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ GOG([ÑÑылка](https://support.gog.com/hc/articles/16033977811613)) + + * Политика в отношении нарушающего права контента и авторÑких прав([ÑÑылка](https://support.gog.com/hc/articles/16033687971613)). + + + +11.3 Каждый раз, когда мы принимаем решение о модерации, приводÑщее к +ограничению вашего доÑтупа к Ñлужбам GOG, вы должны получать изложение причин, +по которым мы принÑли такое решение. ЕÑли вы не ÑоглаÑны Ñ Ð¿Ñ€Ð¸Ð½Ñтым нами +решением, у Ð²Ð°Ñ ÐµÑть 6 меÑÑцев Ñ Ñ‚Ð¾Ð³Ð¾ днÑ, когда вы были проинформированы о +нем, чтобы подать жалобу. ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ том, как подать жалобу, +должна ÑодержатьÑÑ Ð² решении о модерации. ОпиÑание процедуры нашей ÑиÑтемы +обработки жалоб также доÑтупно в Политике в отношении нарушающего контента и +авторÑких прав([здеÑÑŒ](https://support.gog.com/hc/articles/213224285)). + +## 12\. ПОЛЬЗОВÐТЕЛЬСКИЕ МÐТЕРИÐЛЫ + +12.1. Этот раздел поÑвÑщён материалам (например, различным текÑтам, видео, +фотографиÑм, изображениÑм, Ñкриншотам, обоÑм Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ Ñтола или ÑÑылкам), +которые вы передаёте либо нам, либо другим пользователÑм GOG во Ð²Ñ€ÐµÐ¼Ñ +иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð£Ñлуг GOG (например, когда размещаете изображение в Ñвоём +профиле или отÑылаете текÑтовое Ñообщение другим пользователÑм GOG). Будем +называть Ñто «пользовательÑкими материалами». + + + +12.2. Что каÑаетÑÑ Ð½Ð°Ñ Ð¸ ваÑ, то вы ÑвлÑетеÑÑŒ владельцем любого +ПользовательÑкого контента, но нам необходимо, чтобы вы предоÑтавили нам +некоторые ограниченные права на него, чтобы мы могли фактичеÑки передавать его +через Ñлужбы GOG. Таким образом, Ñ€Ð°Ð·Ð¼ÐµÑ‰Ð°Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкий контент, вы +предоÑтавлÑете нам неиÑключительную, безотзывную лицензию на иÑпользование, +изменение, воÑпроизведение, Ñоздание производных работ, раÑпроÑтранение, +передачу, Ñообщение и публичный показ/иÑполнение вашего ПользовательÑкого +контента в ÑвÑзи Ñ ÑƒÑлугами GOG. + + + +12.3. Ð’Ñ‹ должны Ñами убедитьÑÑ Ð² том, что обладаете вÑеми необходимыми правами +на Ñвои пользовательÑкие материалы, прежде чем им пользоватьÑÑ, и проверить, +что никто не помешает его иÑпользовать — Ñами мы не можем знать Ñтого +навернÑка, поÑтому нам приходитÑÑ Ð¿Ð¾Ð»Ð°Ð³Ð°Ñ‚ÑŒÑÑ Ð½Ð° ваÑ. + + + +12.4. Тем не менее, мы имеем право (но не обÑзаны) проверÑть и, еÑли Ñто +умеÑтно или юридичеÑки необходимо, удалÑть любой ПользовательÑкий контент, +который ÑвлÑетÑÑ Ð½ÐµÐ·Ð°ÐºÐ¾Ð½Ð½Ñ‹Ð¼, деликтным, клеветничеÑким, неприÑтойным, +вторгающимÑÑ Ð² чаÑтную жизнь другого лица, угрожающим, преÑледующим, +оÑкорбительным, ненавиÑтничеÑким, раÑиÑÑ‚Ñким или порнографичеÑким. ЕÑли вы +обнаружите, что на ÑервиÑах GOG был размещен подобный контент, пожалуйÑта, +Ñообщите нам об Ñтом. Мы проÑим Ð²Ð°Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸Ñ‚ÑŒÑÑ Ñ Ð½Ð°ÑˆÐµÐ¹ Политикой в отношении +нарушающего права контента +([здеÑÑŒ](https://support.gog.com/hc/articles/16033687971613)), где мы +объÑÑнÑем нашу процедуру ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ нарушающем права контенте. ЕÑли вы вÑе +еще Ñчитаете, что ваше дело не до конца урегулировано поÑле нашей внутренней +процедуры , у Ð²Ð°Ñ ÐµÑть возможноÑть внеÑудебного ÑƒÑ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñпора - +подробнее об Ñтом в разделе 20 ниже . + +## 13\. ОБРÐТÐÐЯ СВЯЗЬ И ПРЕДЛОЖЕÐИЯ + +13.1. Ð’Ñ‹ имеете полное право выÑказывать Ñвоё мнение об УÑлугах GOG и давать +нам Ñоветы по их поводу. Мы дейÑтвительно ценим ваше мнение. Ðо при Ñтом +имейте в виду, что мы не обÑзаны Ñледовать вашим Ñоветам, и что мы вам ничего +не должны за них (в финанÑовом и в любом другом отношении). + +## 14\. ИСПОЛЬЗОВÐÐИЕ МÐТЕРИÐЛОВ GOG Ð’ ПОЛЬЗОВÐТЕЛЬСКИХ ПРОДУКТÐÐ¥ + +14.1. Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие продукты, (например, такие как «моды», +«машинимы», пародии, «летÑплеи» или другие видеоролики или изображениÑ), вы +должны убедитьÑÑ Ð² том, что владельцы материала (например, разработчики или +издатели) не возражают против Ñтого, и еÑли Ð´Ð»Ñ Ñтого необходимо разрешение, +то вы должны получить такое разрешение. Причина проÑта — материал GOG ÑвлÑетÑÑ +ÑобÑтвенноÑтью его ÑоответÑтвующего владельца, а не GOGа. + +## 15\. МÐТЕРИÐЛЫ ТРЕТЬИХ СТОРОРИ Ð’ÐЕШÐИЕ УСЛУГИ + +15.1. ПользуÑÑÑŒ УÑлугами GOG, вы можете получить ÑÑылки на Ñайты и материалы. +Ð’Ñ‹ можете пользоватьÑÑ Ð¸Ð¼Ð¸ по Ñвоему уÑмотрению — мы не обещаем, что они будут +работать, и не знаем, что они Ñобой предÑтавлÑÑŽÑ‚ и беÑплатны ли они Ð´Ð»Ñ +иÑпользованиÑ. + + + +15.2. Ð’Ñ‹ можете также воÑпользоватьÑÑ Ñвоей учётной запиÑью GOG Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ +доÑтупа к внешним уÑлугам, одобренным GOG, например, к играм Ñерии «Ведьмак» и +к Ñайтам нашей родÑтвенной компании CD PROJEKT. У них имеютÑÑ Ñвои уÑÐ»Ð¾Ð²Ð¸Ñ +иÑпользованиÑ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ вы должны будете ознакомитьÑÑ Ð¸ ÑоглаÑитьÑÑ. ПроÑто, +чтобы вы знали: пользоватьÑÑ Ð¸Ð»Ð¸ нет Ñтими уÑлугами — решать иÑключительно +вам. Это ваш выбор! + +## 16\. ГÐРÐÐТИИ И ОГРÐÐИЧЕÐИЯ ОТВЕТСТВЕÐÐОСТИ Ð’ ОТÐОШЕÐИИ УСЛУГ GOG + +16.1. Мы гарантируем Ñледующее: (i) мы имеем право заключать Ñто Соглашение и +предоÑтавлÑть вам лицензию на иÑпользование УÑлуг GOG ÑоглаÑно пункту 2.1; +(ii) мы в разумной Ñтепени ÑтараемÑÑ Ð¾Ð±ÐµÑпечить вам беÑперебойную работу УÑлуг +GOG; и (iii) мы в разумной Ñтепени будем Ñоблюдать применимое +законодательÑтво, ÑÐ»ÐµÐ´ÑƒÑ Ð½Ð°ÑˆÐ¸Ð¼ обÑзательÑтвам ÑоглаÑно Ñтому Соглашению. + + + +16.2. Гарантии Ñ Ð’Ð°ÑˆÐµÐ¹ Ñтороны. Ð’Ñ‹ заÑвлÑете и гарантируете, что у Ð²Ð°Ñ ÐµÑть +право и возможноÑть заключить наÑтоÑщее Соглашение, уÑÐ»Ð¾Ð²Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ вы +обÑзуетеÑÑŒ Ñоблюдать. Ð’Ñ‹ также заÑвлÑете и гарантируете, что любой +ПользовательÑкий материал, который вы передаете через Ñлужбы GOG, не нарушает +права интеллектуальной ÑобÑтвенноÑти какой-либо третьей Ñтороны. Кроме того, +Ð’Ñ‹ заÑвлÑете и гарантируете, что вы не будете иÑпользовать или ÑпоÑобÑтвовать +поÑвлению пользовательÑкого материала, который ÑвлÑетÑÑ Ð½ÐµÐ·Ð°ÐºÐ¾Ð½Ð½Ñ‹Ð¼, +вредоноÑными, клеветничеÑкими, неприÑтойными, поÑÑгающими на +неприкоÑновенноÑть чаÑтной жизни другого лица, угрожающим, оÑкорбительным, +ненавиÑтным, раÑиÑÑ‚Ñким или имеющим порнографичеÑкий характер. + + + +16.3. Мы прилагаем вÑе уÑÐ¸Ð»Ð¸Ñ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы контент GOG работал на ваших +ÑиÑтемах, но у Ð½Ð°Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ð¾Ðµ Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° проведение теÑтов, и мы не вÑегда вÑе +делаем правильно. ПоÑтому мы не неÑем никакой ответÑтвенноÑти за Ñодержимое +GOG, за иÑключением Ñлучаев, предуÑмотренных законом (Ñм. 7.1.-7,2 выше). Мы +также не неÑем ответÑтвенноÑти за то, что проиÑходит Ñ GOG.COM или ÑервиÑами +GOG, которые находÑÑ‚ÑÑ Ð²Ð½Ðµ нашего контролÑ, и мы не гарантируем, что ÑервиÑÑ‹ +GOG будут работать в 100% Ñлучаев. Однако не забывайте, что вы имеете право на +возврат и возмещение ÑтоимоÑти контента GOG, еÑли у него возникли техничеÑкие +проблемы - Ñм. раздел 7.3. + +## 17\. ПРЕКРÐЩЕÐИЕ ДЕЙСТВИЯ СОГЛÐШЕÐИЯ + +17.1 Ваше право раÑторгнуть Соглашение. Ð’Ñ‹ можете раÑторгнуть наÑтоÑщее +Соглашение в любое Ð²Ñ€ÐµÐ¼Ñ Ð¸ без объÑÑÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½, полноÑтью прекратив +пользоватьÑÑ ÑƒÑлугами GOG. ЕÑли вы хотите, чтобы мы удалили вашу учетную +запиÑÑŒ, ÑвÑжитеÑÑŒ Ñ Ð½Ð°ÑˆÐµÐ¹ Ñлужбой поддержки [ здеÑÑŒ +](https://support.gog.com/hc/requests/new) или проÑто отправьте Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾ +Ñлектронной почте на Ð°Ð´Ñ€ÐµÑ privacy@gog.com. Прекращение дейÑÑ‚Ð²Ð¸Ñ Ð½Ðµ повлиÑет +на уже ÑущеÑтвующие права или обÑзательÑтва Ð´Ð»Ñ Ð½Ð°Ñ Ð¸Ð»Ð¸ ваÑ. + + + + +17.2. Ðаше право раÑторгнуть Соглашение. ЕÑли вы ÑущеÑтвенно нарушаете данное +Соглашение, мы оÑтавлÑем за Ñобой право приоÑтановить или отменить ваш доÑтуп +к уÑлугам GOG и контенту GOG. Под ÑущеÑтвенным нарушением Ð¡Ð¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð¼Ñ‹ +понимаем Ñерьезное нарушение, которое может нанеÑти значительный ущерб GOG, +пользователÑм GOG, а также, в чаÑтноÑти, нарушение положений раздела 11 выше +или КодекÑа Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ GOG. ЕÑли мы приоÑтановим или отменим ваш доÑтуп к +Ñлужбам GOG или контенту GOG, мы предпримем разумные меры, чтобы ÑвÑзатьÑÑ Ñ +вами и объÑÑнить, почему мы так поÑтупили и что вы можете Ñделать в результате +Ñтого (еÑли вообще можете). + + + + +17.3. Это выглÑдит маловероÑтным, но еÑли мы примем решение о прекращении +обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ (не в ÑвÑзи Ñ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ нарушениÑми Ñтого договора), мы поÑтараемÑÑ +извеÑтить Ð²Ð°Ñ Ð¾Ð± Ñтом как минимум за 60 дней путем публикации ÑоответÑтвующей +информации на Ñайте GOG.COM и путем отправки ÑоответÑтвующего Ñлектронного +пиÑьма вÑем зарегиÑтрированным пользователÑм. ПоÑле Ñтого у Ð²Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ 60 дней +на то, чтобы Ñкачать веÑÑŒ приобретенный ранее контент. + +## 18\. ФОРС-МÐЖОРÐЫЕ ОБСТОЯТЕЛЬСТВР+ + + +18.1. Ðикто из Ð½Ð°Ñ Ð¸Ð»Ð¸ Ð²Ð°Ñ Ð½Ðµ будет неÑти ответÑтвенноÑть за неиÑполнение +обÑзательÑтв по Ñтому Соглашению, или за непредоÑтавление доÑтупа к УÑлугам и +материалам GOG, еÑли Ñто вызвано непредвиденными обÑтоÑтельÑтвами, +находÑщимиÑÑ Ð²Ð½Ðµ нашего разумного контролÑ, включаÑ, помимо прочего, +прекращение доÑтупа к интернету, Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ ÑвÑзи, пожары, наводнениÑ, военные +дейÑÑ‚Ð²Ð¸Ñ Ð¸ другие форÑ-мажорные обÑтоÑтельÑтва. + +## 19\. ПРИМЕÐИМОЕ ЗÐКОÐОДÐТЕЛЬСТВО + +Ð”Ð»Ñ Ñ€ÐµÐ·Ð¸Ð´ÐµÐ½Ñ‚Ð¾Ð² Ñтран ЕС и других Ñтран мира (за иÑключением СШÐ): + + + +19.1. Мы Ñ Ð²Ð°Ð¼Ð¸ ÑоглашаемÑÑ Ð² том, что ваше иÑпользование УÑлуг и материалов +GOG в рамках Ñтого Ð¡Ð¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ³ÑƒÐ»Ð¸Ñ€ÑƒÐµÑ‚ÑÑ Ð·Ð°ÐºÐ¾Ð½Ð¾Ð´Ð°Ñ‚ÐµÐ»ÑŒÑтвом РеÑпублики +Польши, и что любые Ñпоры, вытекающие из Ñтого СоглашениÑ, решаютÑÑ +иÑключительно в Ñудах РеÑпублики Польши. Ð’ любых Ñудебных иÑках по Ñтому +Соглашению Ð²Ñ‹Ð¸Ð³Ñ€Ð°Ð²ÑˆÐ°Ñ Ñторона получает право на возмещение Ñудебных раÑходов. + + + +19.2. Вышеприведенный выбор регулирующего законодательÑтва и юриÑдикции +подлежит любым мандатно применимым принципам защиты интереÑов потребителей или +другого закона в вашей юриÑдикции по меÑту жительÑтва, который в противном +Ñлучае не был бы доÑтупен. + + + +Только Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ из СШÐ: + + + +19.3. Мы Ñ Ð²Ð°Ð¼Ð¸ ÑоглашаемÑÑ Ð² том, что ваше иÑпользование УÑлуг и материалов +GOG в рамках Ñтого Ð¡Ð¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ ÑчитаетÑÑ Ð²Ñтупившим в Ñилу в Ð›Ð¾Ñ ÐнджелеÑе, +штат КалифорниÑ, и регулируетÑÑ Ð·Ð°ÐºÐ¾Ð½Ð¾Ð´Ð°Ñ‚ÐµÐ»ÑŒÑтво штата ÐšÐ°Ð»Ð¸Ñ„Ð¾Ñ€Ð½Ð¸Ñ Ð¡Ð¾ÐµÐ´Ð¸Ð½Ñ‘Ð½Ð½Ñ‹Ñ… +Штатов Ðмерики (и, наÑколько Ñто применимо, федеральным законодательÑтвом +СШÐ). Любые ваши иÑки против GOG раÑÑматриваютÑÑ Ð¸Ñключительно в федеральных +Ñудах или Ñудах штата в Ð›Ð¾Ñ ÐнджелеÑе, штат КалифорниÑ, имеющих иÑключительную +юриÑдикцию в отношении разноглаÑий между вами и нами, и, Ñледовательно, мы и +вы ÑоглашаемÑÑ Ð½Ð° иÑключительную юриÑдикцию Ñтих Ñудов. Ð’ любых Ñудебных иÑках +по Ñтому Соглашению Ð²Ñ‹Ð¸Ð³Ñ€Ð°Ð²ÑˆÐ°Ñ Ñторона получает право на возмещение Ñудебных +раÑходов. + +## 20.ПОДДЕРЖКРПОЛЬЗОВÐТЕЛЕЙ И РÐЗРЕШЕÐИЕ СПОРОВ + +20.1 ЕÑли у Ð²Ð°Ñ ÐµÑть проблемы, претензии или вопроÑÑ‹ к нам, мы надеемÑÑ, что +мы Ñможем их быÑтро и дружно разрешить +на[Ñтранице](https://support.gog.com/hc/requests/new). Мы предпримем разумные +и доброÑовеÑтные уÑÐ¸Ð»Ð¸Ñ Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ Ñпора между нами вне юридичеÑкой +Ñреды. Мы обÑзуемÑÑ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ на любые претензии в течение 14 дней. + + + +20.2. ЕÑли за Ñто Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð° не будет решена, дальнейшие дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°Ð²Ð¸ÑÑÑ‚ +от того, где вы живете. ЕÑли вы проживаете на территории ЕС, вы можете +направить Ñвои юридичеÑкие претензии в онлайн-платформу Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñпоров, +управлÑемую и предоÑтавлÑемую ЕвропейÑкой комиÑÑией, доÑтуп к которой можно +получить по адреÑу, чтобы доÑтичь +внеÑудебного ÑƒÑ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ инициировать Ñудебный процеÑÑ. Ð’Ñ‹ также можете +разрешить Ñвой Ñпор через любой орган внеÑудебного ÑƒÑ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñпоров, +Ñертифицированный координатором цифровых уÑлуг вашей Ñтраны. + + + +20.3. ЕÑли вы живете в СШРили оÑтальном мире (но не в ЕС), пожалуйÑта, +ÑвÑжитеÑÑŒ Ñ Ð½Ð°Ð¼Ð¸ по Ñлектронной почте legal@GOG.COM. + +## 21\. ДРУГИЕ ЮРИДИЧЕСКИЕ ВОПРОСЫ + +21.1. ЕÑли какаÑ-либо чаÑть Ñтого Ð¡Ð¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ признана юридичеÑки +недейÑтвительной, то Ñто не повлиÑет на вÑе оÑтальные его чаÑти. + + + +21.2 ÐаÑтоÑщее Соглашение (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð»ÑŽÐ±Ñ‹Ðµ дополнительные уÑÐ»Ð¾Ð²Ð¸Ñ GOG, +упомÑнутые в нем) предÑтавлÑет Ñобой полное Ñоглашение между вами и нами и +заменÑет Ñобой любые предыдущие уÑтные или пиÑьменные ÑоглашениÑ. ЕÑли вы не +ÑоглаÑны Ñ Ñтим, пожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð½Ð°Ð¼Ð¸ как можно Ñкорее поÑле начала +иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÑлуг GOG по адреÑу legal@gog.com, поÑкольку в противном Ñлучае +Ñто будет обÑзательным Ð´Ð»Ñ Ð²Ð°Ñ Ð¿Ð¾ иÑтечении обуÑловленного периода времени +(обычно 30 дней). + + + +21.3. Это Соглашение регулирует Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ вами и нами. Оно не Ñоздаёт +никаких прав ни Ð´Ð»Ñ ÐºÐ¾Ð³Ð¾ другого. + + + +21.4. Имейте в виду, что мы подчинÑемÑÑ Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñм различных законов, и что +от Ð½Ð°Ñ Ð¼Ð¾Ð³ÑƒÑ‚ потребовать иÑполнить закон, решение Ñуда или другое юридичеÑкое +раÑпорÑжение. + + + +21.5. Ð’ Ñлучае реорганизации, продажи или ÑлиÑÐ½Ð¸Ñ GOG.COM нам, возможно, +потребуетÑÑ Ñотрудничать Ñ ÑоответÑтвующими третьими Ñторонами Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ +или Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи GOG. + + + +21.6. Мы ÑоглашаемÑÑ Ñ Ñ‚ÐµÐ¼, что ÐšÐ¾Ð½Ð²ÐµÐ½Ñ†Ð¸Ñ ÐžÐžÐ Ð¾ договорах международной купли- +продажи товаров не применима к данному Соглашению. + + + +21.7. Мы вправе передать или передоверить Ñто Соглашение третьей Ñтороне или +любому другому члену нашей группы, еÑли Ñто окажетÑÑ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ð¼ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ +GOG, а также в ходе реорганизации, ÑлиÑÐ½Ð¸Ñ Ð¸Ð»Ð¸ по любым другим деловым +причинам. ЕÑли подобное ÑлучитÑÑ, мы Ð²Ð°Ñ Ð¾Ð¿Ð¾Ð²ÐµÑтим. + + + +21.8 ЕÑли вы ÑвлÑетеÑÑŒ гражданином ЕвропейÑкого Союза, то имейте в виду, что +GOG позволÑет портировать между границами беÑплатный и платный контент в +ÑоответÑтвии Ñ Ð ÐµÐ³Ð»Ð°Ð¼ÐµÐ½Ñ‚Ð¾Ð¼ (ЕС) 2017/1128 ЕвропейÑкого парламента и Совета от +14 Ð¸ÑŽÐ½Ñ 2017 года на транÑграничную мобильноÑть ÑервиÑов Ñ Ð¾Ð½Ð»Ð°Ð¹Ð½ материалами +на внутреннем рынке. Ðо Ñто отноÑитÑÑ Ðº любым иным требованиÑм +законодательÑтва на GOG, в том чиÑле каÑающихÑÑ Ð¾Ñ…Ñ€Ð°Ð½Ñ‹ IP, а также может быть +предметом каких-либо требований Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð² и издателей-партнеров GOG. + +## 22\. ИЗМЕÐЕÐИЯ Ð’ ЭТОМ СОГЛÐШЕÐИИ + +22.1 Мы можем изменить наÑтоÑщее Соглашение, еÑли Ñочтем Ñто необходимым, +например, по юридичеÑким причинам или Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в уÑлугах GOG +или контенте GOG. Ð’ Ñтом Ñлучае мы размеÑтим измененное Соглашение в Интернете +по адреÑу [ https://support.gog.com/hc/articles/212632089 +](https://support.gog.com/hc/articles/212632089) и (еÑли у Ð²Ð°Ñ ÐµÑть ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ +запиÑÑŒ GOG) Ñообщим вам по Ñлектронной почте о любых ÑущеÑтвенных изменениÑÑ…. + + + + +22.2. ПоÑле того как мы внеÑём Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Соглашение, оно Ñтанет Ð´Ð»Ñ Ð²Ð°Ñ +юридичеÑки обÑзательным через 30 дней поÑле публикации. Ð’ течение Ñтого +периода вы можете ÑвÑзатьÑÑ Ñ Ð½Ð°Ð¼Ð¸ по адреÑу legal@GOG.COM еÑли у Ð²Ð°Ñ ÐµÑть +конкретные вопроÑÑ‹ по поводу изменений. + + + +22.3. ЕÑли вы не ÑоглаÑны Ñ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ изменениÑми (вне завиÑимоÑти от того, +напиÑали ли вы нам или нет), то, к Ñожалению, мы должны попроÑить Ð²Ð°Ñ +прекратить пользоватьÑÑ Ð£Ñлугами и материалами GOG. Конечно, нам жаль Ñто +признавать, но, надеемÑÑ, вы поймёте, что Ð´Ð»Ñ Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ‰ÐµÐ¹ работы ÑервиÑов GOG +необходимо, чтобы вÑе пользователи придерживалиÑÑŒ одних и тех же, а не разных +правил. Вот почему мы Ñоветуем вам обращатьÑÑ Ðº нам, еÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑƒÑ‚ +вопроÑÑ‹. + + + +22.4. К вашему Ñведению, мы никогда не внеÑём в Ñто Соглашение кучу изменений, +предварительно не Ñказав вам, в чём они заключаютÑÑ, и не будем заÑтавлÑть Ð²Ð°Ñ +ÑоглашатьÑÑ Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñми, еÑли вы не понимаете их, до того как вы Ñможете +пользоватьÑÑ ÑервиÑами GOG! + +23.1. ЕÑли у Ð²Ð°Ñ ÐµÑть какие-либо жалобы, каÑающиеÑÑ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð° GOG, уÑлуг GOG +или проÑто вы хотите ÑвÑзатьÑÑ Ñ Ð½Ð°Ð¼Ð¸, вот наши контактные данные: + + + +Ðазвание: GOG sp. z o.o. + + + +ЮридичеÑкий адреÑ: Ул. ЯгеллонÑÐºÐ°Ñ 74, 03-301 Варшава, Польша + +ЗарегиÑтрировано в Окружном Ñуде Варшавы, 14-й коммерчеÑкий отдел +Ðационального Ñудебного рееÑтра. + + + +РегиÑтрационный номер 0000029514 + + + +Ðалоговый номер Идентификатор ÐДС (ÐИП) ПЛ 113-21-77-807 + + + +УÑтавный капитал: 135.750,00 PLN + + + +Ð•Ð´Ð¸Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° контакта Ð´Ð»Ñ Ð²Ð»Ð°Ñтей: + +ЮридичеÑÐºÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° GOG + +legal@gog.com + +Языки, на которых мы общаемÑÑ: ÐнглийÑкий, польÑкий + + + +Ð•Ð´Ð¸Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° контакта Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»ÐµÐ¹ уÑлуг GOG: + +Служба поддержки GOG + +support@gog.com + +Ð’ оÑновном мы говорим на английÑком и польÑком, но поÑтараемÑÑ Ð¿Ð¾Ð¼Ð¾Ñ‡ÑŒ вам на +любом Ñзыке, на котором доÑтупен GOG. + + + +ПоÑледнее обновление (дата вÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð² Ñилу): 17 Ñ„ÐµÐ²Ñ€Ð°Ð»Ñ 2024 года + + + +ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ +находитÑÑ[здеÑÑŒ](https://support.gog.com/hc/articles/212632089). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/blackgate/tmp/EULA_zh-Hans.txt b/info.exult.exult/data/blackgate/tmp/EULA_zh-Hans.txt new file mode 100644 index 0000000..f6ee049 --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/EULA_zh-Hans.txt @@ -0,0 +1,1340 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM用户åè®® + +## 1\. 本åè®® + +1.1 本å议是您(我们将进一步称您为“您†)与GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Warsaw, +Poland (我们将进一步称自己为“GOGâ€æˆ–“我们†)之间的åˆåŒï¼Œé€‚用于www.GOG.COMã€æ‚¨çš„GOGç”¨æˆ·å¸æˆ·ã€GOG +GALAXY应用程åºï¼ˆåŒ…括GOG +GALAXYå•†åº—ï¼‰ã€æ‚¨é€šè¿‡æˆ‘ä»¬è´­ä¹°æˆ–è®¿é—®çš„ä»»ä½•æ¸¸æˆæˆ–视频或其他内容或æœåŠ¡ã€GOG网络论å›ã€GOG客户和技术支æŒä»¥åŠæˆ‘们呿‚¨æä¾›çš„å…¶ä»–æœåŠ¡ï¼ˆæˆ‘ä»¬ç®€ç§°ä¸ºâ€œGOGæœåŠ¡â€ +)。在这里,我们列出了您作为GOGæœåŠ¡æŽ¥å—者的æƒåˆ©å’Œä¹‰åŠ¡ã€‚ + + + +1.2. GOGæœåŠ¡å¯èƒ½é€‚ç”¨å…¶ä»–æ¡æ¬¾ï¼Œåœ¨è¿™ç§æƒ…况下,我们将å‘å¸ƒè¿™äº›æ¡æ¬¾ä»¥ä¾›æ‚¨æŽ¥å—。例如,如果您想使用GOG +GALAXY应用程åºï¼Œç›¸å…³æ¡æ¬¾å°†åœ¨æ‚¨å¼€å§‹ä½¿ç”¨è¿™äº›æœåС之å‰å‘布以供您接å—。 + + + +1.3 +此外,当我们谈论您å¯ä»¥é€šè¿‡GOGæœåŠ¡è´­ä¹°æˆ–è®¿é—®çš„æ¸¸æˆã€æ¸¸æˆå†…内容ã€è™šæ‹Ÿç‰©å“æˆ–è´§å¸æˆ–GOG视频或其他内容或æœåŠ¡æ—¶ï¼Œæˆ‘ä»¬åªä¼šå°†å…¶åˆ†åˆ«ç§°ä¸ºâ€œGOG游æˆâ€æˆ–“GOG视频†+,当我们谈论它们时,它们都是“GOG内容â€ã€‚ + + + +1.4 æˆ‘ä»¬ä¸æƒ³è®©è¿™ä»½æ–‡ä»¶å¤ªé•¿ï¼Œä½†è¯·è®°ä½ï¼ŒæŽ¥å—我们的用户å议,您也接å—: + + * 我们的[éšç§æ”¿ç­–](https://support.gog.com/hc/articles/212632109-Privacy-Policy?product=gog)-解释我们从您那里收集的数æ®ä»¥åŠæˆ‘ä»¬å¦‚ä½•ä¿æŠ¤è¿™äº›æ•°æ®ï¼Œ + + * [ GOG行为准则 ](https://support.gog.com/hc/articles/16033977811613) 是您作为我们社区的一部分需è¦éµå®ˆçš„一套规则, + + * [ 《侵æƒå†…å®¹å’Œç‰ˆæƒæ”¿ç­–》 ](https://support.gog.com/hc/articles/16033687971613) ,其中解释了您如何举报GOGä¸Šçš„éžæ³•内容以åŠä¸¾æŠ¥åŽä¼šå‘生什么情况。 + + + +1.5 GOG与å—信任的伙伴åˆä½œï¼ŒåŒ…括我们的关è”å…¬å¸CD PROJEKT S.A.ã€å¼€å‘商和å‘è¡Œå•†ã€æ”¯ä»˜ä¾›åº”商ã€å®¢æˆ·æœåŠ¡ 软件供应商等等( “ åˆä½œä¼™ä¼´â€ +)。在本å议的ç¨åŽéƒ¨åˆ† 详细介ç»ã€‚ + + + +1.6 如果您在18å²ä»¥ä¸Šï¼Œæ¬¢è¿Žåˆ°æ¥ï¼å¦‚果您的年龄在16å²åˆ°18å²ä¹‹é—´ï¼Œåœ¨æˆ‘们呿‚¨è‡´ä»¥åŒæ ·çƒ­çƒˆçš„æ¬¢è¿Žä¹‹å‰ï¼Œè¯·æ‚¨è®©æ‚¨çš„çˆ¶æ¯æˆ–ç›‘æŠ¤äººæŸ¥çœ‹å¹¶ä»£è¡¨æ‚¨åŒæ„本å议(因 +为在有的国家,在特定年龄下的人ä¸èƒ½ç­¾ç½²æœ¬å议这类åˆåŒï¼‰ã€‚如果您未满16å²ï¼Œæ‚¨ä¸èƒ½å–å¾—GOGè´¦å·å¹¶ä½¿ç”¨GOG +æœåŠ¡ï¼Œå› ä¸ºæˆ‘ä»¬åœ¨æ³•å¾‹ä¸Šæœªç»çˆ¶æ¯æˆ–ç›‘æŠ¤äººçš„ç‰¹åˆ«åŒæ„,ä¸å¾—处ç†å„¿ç«¥çš„个人数æ®ï¼ˆä½†æ¬¢è¿Žæ‚¨çš„父æ¯/ç›‘æŠ¤äººæ¥æ³¨å†Œï¼‰ã€‚ + +## 2\. 使用GOGæœåŠ¡å’ŒGOG内容 + +2.1 我们给与您和其他的GOG用户使用GOGæœåŠ¡ã€ä¸‹è½½è®¿é—®å’Œ/或 æµæ’­æ”¾ï¼ˆä¾å†…容而定)和使用GOG内容的个人æƒåˆ©ï¼ˆæ³•律上 称为“ 授æƒâ€ +)。此授æƒä»…陿‚¨ä¸ªäººä½¿ç”¨ã€‚我们å¯ä»¥å†æŸ äº›æƒ…å†µä¸‹åœæ­¢æˆ–æš‚åœæ­¤æŽˆæƒï¼Œè¯¦æƒ…ç¨åŽä»‹ç»ã€‚ + + + +2.2 当您购买, 访问或安装GOGæ¸¸æˆæ—¶ï¼Œæ‚¨å¯èƒ½éœ€è¦åŒæ„由游æˆå¼€ å‘商/å‘行商æå‡ºçš„å…¶ä»–å¥‘çº¦æ¡æ¬¾ï¼ˆä¾‹å¦‚,他们å¯èƒ½ä¼šè¦æ±‚ +æ‚¨åŒæ„一款游æˆä¸“属的最终用户å议)。如果这些最终用 户å议与本åè®®å‘生任何ä¸ä¸€è‡´æˆ–争议,那么以本å议为 准。 + + + +2.3 您å¯ä»¥ä½¿ç”¨GOG视频æœåŠ¡æµæ’­æ”¾å·²è´­ä¹°çš„视频内容,或 将其下载并以您希望的方å¼è§‚看。 + + + +2.4 我们鼓励您使用第三方脚本æ¥å‘挥GOG的全部功能 性,是å¦ä½¿ç”¨ç”±æ‚¨è‡ªè¡Œæ–Ÿé…Œï¼Œè€Œä¸”我们无法ä¿è¯è¿™äº›é¢å¤– 脚本的æœåŠ¡ç‰¹æ€§ã€‚ + + + +2.5 简è¦ä»‹ç»ä¸€ä¸‹GOG GALAXY +,这是我们的(å¯é€‰ï¼‰åº”用程åºï¼Œä¸ä»…å…许您购买和访问GOG内容,还æä¾›ç»Ÿä¸€æ¸¸æˆåº“ã€è·¨å¹³å°çš„æœ‹å‹åˆ—表ã€åœ¨çº¿å¤šäººæ¸¸æˆã€æˆå°±ã€è·¨å¹³å°èŠå¤©ã€æ¸¸æˆæ—¶é—´è·Ÿè¸ªã€äº‘ä¿å­˜å’Œæ¸¸æˆå åŠ ç­‰é…·ç‚«åŠŸèƒ½ã€‚æ‚¨å¯ä»¥åœ¨[此处](https://www.gog.com/galaxy)了解更多信æ¯ã€‚ + + + +2.6 +在GOGæœåŠ¡çš„æŸäº›éƒ¨åˆ†ï¼Œæˆ‘们使用推èç³»ç»Ÿå‘æ‚¨å±•示您最有å¯èƒ½æ„Ÿå…´è¶£çš„内容。您å¯ä»¥åœ¨[这里](https://support.gog.com/hc/articles/16034228157213)了解我们在哪里使用它们以åŠå®ƒä»¬çš„工作原ç†ï¼ŒåŒ…括我们使用的主è¦å‚数以åŠå¦‚何影å“它们。 + +## 3\. GOG账户 + +3.1 è‹¥è¦ä»ŽGOGæœåŠ¡è´­ä¹°GOG内容,或在æŸäº›æƒ…况下游玩/使 用我们的åˆä½œä¼™ä¼´è¦æ±‚使用GOG账户的GOGå†…å®¹æ—¶ï¼Œæ‚¨éœ€è¦ +首先创建一个GOG账户。其中包å«å¯†ç ï¼ˆå¯†ç æ˜¯åŠ å¯†çš„ï¼Œæˆ‘ 们无法得知)和用户å的创建,以åŠå‘我们æä¾›æ‚¨çš„ç”µå­ +邮件地å€ï¼ˆä¸ºäº†éªŒè¯èº«ä»½ç”¨ï¼‰ã€‚è¯·ç¡®ä¿æ‚¨çš„登录信æ¯å¾—以 妥善ä¿ç®¡ï¼Œä¸”您的账户得以åˆç†ä½¿ç”¨ã€‚在您的GOG账户设置 +里,您å¯ä»¥è‡ªè¡Œé€‰æ‹©è®¾ç½®æ‚¨çš„å±…ä½å›½å®¶ã€ç”Ÿæ—¥ã€ä»¥åŠå¤´åƒ 。我们的éšç§æ”¿ç­–详细的介ç»äº†æˆ‘ä»¬ä¼šä»Žæ‚¨å¤„æ”¶é›†çš„ä¿¡æ¯ +ï¼Œä»¥åŠæˆ‘ä»¬ä¼šå¦‚ä½•ä½¿ç”¨å¹¶ä¿æŠ¤è¿™äº›ä¿¡æ¯ã€‚您å¯ä»¥åœ¨[这里](https://support.gog.com/hc/articles/212632109-%20Privacy- +Policy%20)查看。 + + + +3.2 您å¯ä»¥ä½¿ç”¨æ‚¨çš„GOG账户建立一份å¯ç”±ä»–人查看的公开 档案。您还å¯ä»¥ä½¿ç”¨æ‚¨çš„GOG账户与其他的GOG用户进行交 +æµã€‚è¯·ç†æ™ºè¡Œäº‹ã€å¹¶ç‰¢è®°æ‚¨è¦å¯¹è‡ªå·±çš„行为负责。 + + + +3.3 +您的GOG叿ˆ·å’ŒGOG内容仅供您个人使用,ä¸å¾—与其他人共享ã€å‡ºå”®ã€èµ é€æˆ–转让。您对它们的访问和使用å—GOG[éšç§æ”¿ç­–](https://support.gog.com/hc/articles/212632109?product=gog)和行[为准则的约æŸï¼Œå¿…è¦æ—¶ä¼šå¯¹å…¶è¿›è¡Œ](https://support.gog.com/hc/articles/16033977811613)更新或修订。 + + + +3.4. 访问和使用从ä¸åŒå¹³å°è´­ä¹°çš„æ¸¸æˆï¼ˆå³æˆ‘们称之为“无钥匙访问†) +ï¼ŒåŒ…æ‹¬å…¶æœ€ä½Žç³»ç»Ÿè¦æ±‚,å—å„è‡ªçš„ç¬¬ä¸‰æ–¹å¹³å°æ”¿ç­–和(如适用)与游æˆå¼€å‘商/å‘行商的附加åˆåŒæ¡æ¬¾çš„约æŸï¼ˆä¾‹å¦‚,他们å¯èƒ½ä¼šè¦æ±‚æ‚¨åŒæ„特定游æˆçš„æœ€ç»ˆç”¨æˆ·è®¸å¯å议)。您å¯èƒ½éœ€è¦æ‹¥æœ‰ç¬¬ä¸‰æ–¹å¹³å°è´¦å·ã€‚这些平å°å¯èƒ½ä¼šä¸ºæ‚¨è´­ä¹°çš„æ¸¸æˆæŽ¨å‡ºè¡¥ä¸æˆ–更新。 + +## 4\. 系统需求 + +4.1 因为GOG会æä¾›ç»™æ‚¨åœ¨ä¸åŒæ—¶é—´é€šè¿‡ä¸åŒçš„å¹³å°å¼€å‘的许多ä¸åŒæœåŠ¡å’Œæ¸¸ æˆï¼Œæˆ‘们无法为所有的GOGæœåŠ¡æˆ–GOG内容给出一套统一的 系统需求。 + + + +4.2 我们能够告知您的是,使用任何的GOG游æˆéƒ½éœ€è¦å¸¦æœ‰é¼ æ ‡å’Œé”®ç›˜çš„ç”µè„‘ï¼ˆä¸æ”¯æŒè§¦å±ï¼‰ï¼Œå¹¶å®‰è£…了一套 +åˆé€‚çš„æ“作系统(请å‚阅相关的GOG产å“页é¢ï¼‰ï¼Œå¹¶å®‰è£…有 全部补ä¸åŒ…å’Œé‡è¦æ›´æ–°ã€‚所有的GOG游æˆéƒ½åº”该本地安装在 +æ»¡è¶³æˆ–è¶…è¿‡æœ€ä½Žç¡¬ä»¶å’Œè½¯ä»¶è§„æ ¼çš„ç”µè„‘ä¸Šã€‚è¿™äº›è§„æ ¼å‡æ˜¾ 示在相关的GOG产å“页é¢ä¸Šã€‚ GOG游æˆå¹¶æœªåœ¨è™šæ‹Ÿæœºè½¯ä»¶ä¸Š +è¿›è¡Œæµ‹è¯•ï¼Œå› æ­¤æˆ‘ä»¬å¹¶ä¸æ”¯æŒé€šè¿‡è™šæ‹Ÿæœºè½¯ä»¶è¿›è¡Œæ¸¸æˆã€‚ + + + +4.3 对于GOG视频æ¥è¯´ï¼Œè¯·ç¡®ä¿æ‚¨çš„视频播放器支æŒGOG产 å“页é¢ä¸Šé¢æŒ‡å‡ºçš„视频格å¼ã€‚ + + + +4.4 +如果您对系统需求有任何问题,请通过[这里](https://support.gog.com/hc/requests/new?category=info)è”系我们。还需说明,您需è¦è‡ªè¡Œç¡®ä¿æ‚¨çš„互è”网 +接入方å¼è¶³ä»¥ä¸‹è½½ä»Žæˆ‘们处购买的GOGæ¸¸æˆæˆ–GOGè§†é¢‘ã€æˆ– æµæ’­æ”¾GOGè§†é¢‘ï¼Œå¹¶ç¡®ä¿æ‚¨çš„系统å¯ä»¥è¿è¡ŒGOG游æˆåŠè§‚看 GOG视频。 + +## 5\. 测试版本 + +5.1 éšç€GOG的开å‘,我们å¯èƒ½ä¼šä¸ºæ‚¨æä¾›å¯¹GOG软件或æœåŠ¡çš„â€œæµ‹è¯•ç‰ˆâ€ ï¼ˆä¾‹å¦‚ï¼Œåœ¨ä¸€èˆ¬å‘å¸ƒä¹‹å‰æä¾›çš„æ–°ç‰ˆæœ¬çš„GOG +GALAXY应用程åºï¼‰æˆ–GOG内容的å¯é€‰è®¿é—®æƒé™ã€‚ + + + +规则如下: + + + +a) 我们(或任何适用的å‘行商/åˆä½œä¼™ä¼´ï¼‰ä¼šåˆ¶å®šæ‚¨çš„æµ‹è¯•æƒé™çš„æ¡ä»¶å’Œè¦æ±‚。æä¾›å’Œç»´æŠ¤æµ‹è¯•版本,以 åŠè°å¯ä»¥èŽ·å¾—æµ‹è¯•æƒé™ï¼Œå°†ç”±æˆ‘们自行决定。 + + + +b) 您å¯èƒ½éœ€è¦å…ˆå®Œæˆä¸€ç³»åˆ—æ³¨å†Œæ‰‹ç»­æˆ–å…¶ä»–è¦æ±‚æ‰èƒ½èŽ·å¾—æµ‹è¯•æƒé™ï¼ˆåŒ…æ‹¬æ‚¨ä¹Ÿèƒ½éœ€è¦æ»¡è¶³æŸäº›åˆæ ¼æ ‡å‡† )。 + + + +c) 测试æƒé™ä¼šæœ‰æ—¶é—´é™åˆ¶ï¼Œä¹Ÿå¯èƒ½ä¼šæ¶‰åŠå…¶ä»– çš„å¥‘çº¦è¦æ±‚。 + + + +d) 测试过程å¯èƒ½ä¼šåŒ…å«æš‚æ—¶çš„æˆ–永久的æœåС噍/ 进度/内容的清除ã€é‡ç½®ã€æˆ–修改。 + + + +e) 测试过程å¯èƒ½ä¼šå—到ä¿å¯†é™åˆ¶çš„约æŸï¼ˆè‹¥æœ‰ ,会æå‰å‘ŠçŸ¥æ‚¨ï¼‰ã€‚ + + + +f) 您å¯èƒ½ä¼šè¢«é‚€è¯·å°±æµ‹è¯•过程å‚与一个å馈的手续,这当然是éžå¼ºåˆ¶çš„,ä¸è¿‡æˆ‘们会éžå¸¸æ„Ÿè°¢æ‚¨ã€‚ + + + +g) 测试版仅供您个人使用和享å—,因此您ä¸å¾—将其出售ã€å‡ºå€Ÿæˆ–以其他方å¼è½¬è®©ç»™ä»»ä½•人。 + + + +h) 为您æä¾›æµ‹è¯•æƒé™çš„目的是为了让您å“鉴新内容,ä¸è¿‡æˆ‘ä»¬å¸Œæœ›æ‚¨èƒ½äº†è§£ï¼Œæµ‹è¯•ç‰ˆæœ¬å¹¶ä¸æ˜¯æœ€ç»ˆå®Œæˆ 的作å“。因此,测试版本将会以“ ä¸åŠ æ”¹å˜â€ çš„å½¢å¼æä¾› +给你,若其处于未完æˆçжæ€ã€æˆ–无法完整è¿è¡Œã€æˆ–导致任 何问题,我们ä¸ä½œå‡ºä»»ä½•ä¿è¯ï¼Œä¹Ÿä¸æ‰¿æ‹…任何责任。测试 +版本的功能å¯èƒ½ä¹Ÿä¸æ˜¯æœ€ç»ˆç‰ˆæœ¬ï¼Œåœ¨æµ‹è¯•期间å¯èƒ½ä¼šè¿›è¡ŒåŠŸèƒ½çš„æ›´æ”¹ã€è°ƒæ•´ã€æˆ–移除。 + + + +我们å¯èƒ½ä¼šä»¥æµ‹è¯•版/预å‘å¸ƒç‰ˆçš„å½¢å¼æä¾›å¯¹GOG内容的访问æƒé™ã€‚ +例如,å‘布者/åˆä½œä¼™ä¼´å¯èƒ½å†³å®šåœ¨æµ‹è¯•版中å‘å¸ƒæ¸¸æˆæˆ–部分游æˆï¼Œæˆ–者å¯ä»¥åŠ å…¥æˆ‘ä»¬çš„â€œå¼€å‘中游æˆâ€è®¡åˆ’(请å‚阅下é¢çš„第7.6-7.8节)。 +除éžç›¸å…³å‡ºç‰ˆå•†åˆ¶å®šå…¶è‡ªå·±çš„规则(优先于这些规则),å¦åˆ™ä»»ä½•此类GOG内容也将å—这些规则的约æŸã€‚ + +## 6\. 为GOG内容付费并获得退款 + +为GOG内容付费 + + + +6.1 在您决定喜欢GOG游æˆã€GOG视频或其他GOG内容åŽï¼Œæ‚¨é€šå¸¸éœ€è¦å…ˆä»˜è´¹æ‰èƒ½è®¿é—®å®ƒï¼ˆå°½ç®¡æˆ‘们也有一些å…è´¹å†…å®¹ï¼ ï¼‰ã€‚æ‚¨å¯ä»¥é€šè¿‡ä»¥ä¸‹ä¸åŒæ–¹å¼ä»˜æ¬¾ï¼š +(i)ä½¿ç”¨æœ‰æ•ˆçš„å€Ÿè®°å¡æˆ–信用å¡ï¼›æˆ–(ii)使用PayPalæˆ–ä»»ä½•å…¶ä»–æŽˆæƒæ”¯ä»˜æä¾›å•†ã€‚è¯·åŠ¡å¿…ç¡®ä¿æ‚¨çš„付款信æ¯å®‰å…¨ã€‚ + + + +6.2 +当您使用付款方å¼è´­ä¹°GOGå†…å®¹æ—¶ï¼Œæˆ‘ä»¬ä¿¡èµ–æ‚¨çš„æ‰¿è¯ºï¼Œå³æ‚¨å¯ä»¥ä½¿ç”¨è¯¥ä»˜æ¬¾æ–¹å¼ã€‚您对使用您的GOG叿ˆ·æˆ–付款方å¼è¿›è¡Œçš„ä»»ä½•è´­ä¹°è´Ÿè´£ï¼Œå¹¶åŒæ„在购买时通知您的适用定价ã€ä»˜æ¬¾å’Œè´¦å•æ”¿ç­–ã€‚é™¤éžæœ¬åè®®å¦æœ‰æ˜Žç¡®è§„定,å¦åˆ™æ‰€æœ‰ä»˜æ¬¾å‡ä¸å¯é€€è¿˜ä¸”ä¸å¯è½¬è®©ã€‚ + + + +6.3 +您å¯ä»¥ä½¿ç”¨ç¾Žå…ƒéšæ—¶ä¸ºGOG内容付费。ä¸è¿‡å¦‚果我们æ°å¥½æ”¯æŒæ‚¨å±…ä½å›½å®¶çš„当地货å¸ï¼Œï¼ˆè¯·å‚阅我们[这里](https://support.gog.com/hc/articles/212184449)了解详情),您也å¯ä»¥ä½¿ç”¨æ‚¨çš„当地货å¸è¿›è¡Œæ”¯ä»˜ +ã€‚å¦‚æžœæ‚¨ä¸æ˜¯ä½¿ç”¨æ‚¨çš„当地货å¸è¿›è¡Œæ”¯ä»˜ï¼Œæ‚¨å¯èƒ½ä¼šéœ€è¦é¢å¤–支付一笔货å¸å…‘æ¢è´¹ç”¨ï¼Œè€Œä¸”æŸäº›é“¶è¡Œä¹Ÿå¯èƒ½ä¼šé¢å¤–æ”¶å–其他的交易费用。 + + + +6.4. +æ‰€æœ‰ä»·æ ¼å‡æ˜¾ç¤ºåœ¨äº§å“目录页é¢ä¸­ã€‚它们包å«å¢žå€¼ç¨Žç­‰ç¨Žè´¹ï¼ˆå¦‚é€‚ç”¨ï¼‰ã€‚å¦‚æžœå½“åœ°æ³•å¾‹ï¼ˆä¾‹å¦‚ç¾Žå›½æˆ–åŠ æ‹¿å¤§çš„æ³•å¾‹ï¼‰è¦æ±‚,您还应该在结算时将一些销售税/增值税添加到您的价格中。 + + + +GOG钱包 + + + +6.5 GOGå‘用户æä¾›ä¸€ç§æ•°å­—账户余é¢åŠŸèƒ½ï¼Œç§°ä¸ºâ€œGOG钱包†+。该功能与您的用户账户相关è”,您å¯ä»¥ä½¿ç”¨è¯¥åŠŸèƒ½æ¥è´­ä¹°GOG内容。您å¯ä»¥é€šè¿‡ä¸¤ç§æ–¹å¼æ¥å‘其中充值: (i) 使用您所选择的支付方å¼ï¼›æˆ– (ii) +资金退款ä¿éšœï¼ˆè¯¦æƒ…è§ä¸‹æ–¹é€€æ¬¾åˆ°GOG钱包)。 GOG钱包的使用 å—到一些规则的管辖,这些规则在我们的GOG钱包页é¢ä¸­åˆ— +出(è§[这里](https://support.gog.com/hc/articles/360001941953))。 + + + +GOG奖励代ç å¥–åŠ±ä»£ç  + + + +6.6 +我们还会å‘è¡Œé™æ—¶å¥–励代ç ï¼Œè®©æ‚¨å…费或低价访问GOG内容(我们称之为“奖励代ç â€ï¼‰ã€‚如果你在购买GOG内容时收到了补å¿ç ï¼Œä¸è¿‡åœ¨ä¹‹åŽå†³å®šé€€å›žæ­¤GOGå†…å®¹ï¼Œé‚£ä¹ˆæˆ‘ä»¬è®¤ä¸ºå‘æ‚¨ç´¢å›žè¿™äº›è¡¥å¿ç æ˜¯å¾ˆåˆæƒ…åˆç†çš„。因此,我们会:终止其有效性,或者如果该补å¿ç å·²ç»ç”¨äºŽå…‘æ¢GOG游æˆï¼Œè¯¥æ¸¸æˆå°†ä¼šä»Žæ‚¨çš„账户中被删除。 + + + +直连账户分销 + + + +6.7 +我们的直连账户å‘布特色(我们将其称之为‘GOG直连账户’)在于,与我们有åˆä½œå…³ç³»çš„分销平å°å°†å¯ä»¥å‘æ‚¨å‡ºå”®æ¸¸æˆæˆ–其他内容,您在其平å°ä¸Šé€‰æ‹©çš„æ¸¸æˆ/内容将会自动在GOG账户中激活,ä¸éœ€è¦ä»»ä½•激活ç ã€‚需è¦è¯´æ˜Žçš„æ˜¯ï¼Œæ•´ä¸ªè´­ä¹°æµç¨‹ç”±å¹³å°å¤„ç†ï¼Œå› æ­¤å¦‚果购买æµç¨‹å‡ºçŽ°ä»»ä½•é—®é¢˜ï¼Œè¯·ç›´æŽ¥ä¸Žå¹³å°è”系。我们在下é¢çš„“退款与退货â€éƒ¨åˆ†è¯¦ç»†è§£é‡Šäº†è¿™ä¸€ç‚¹ã€‚当然,我们ä»å¯¹ä¸Žæˆ‘们平尿œåŠ¡æœ‰å…³çš„æ‰€æœ‰äº‹ç‰©è´Ÿè´£ã€‚ + +## 7.退款和退货 + +法定退款æƒåˆ© + + + +7.1. +å¦‚æžœæ‚¨æ˜¯æ¬§ç›Ÿæˆ–å…¶ä»–é€‚ç”¨å¸æ³•管辖区(ä¸åŒ…括美国)的居民,则您有法定æƒåˆ©åœ¨è´­ä¹°åŽ14天内退出购买GOG内容,而无需æä¾›ä»»ä½•ç†ç”±ã€‚è¦è¡Œä½¿æ’¤å›žæƒï¼Œæ‚¨åº”通过明确的声明(å‘é€è‡³support@GOG.COM的电å­é‚®ä»¶æˆ–以下第23节规定的地å€çš„实际信件)告知我们您撤回本åˆåŒçš„决定。您å¯ä»¥ä½¿ç”¨æœ¬åè®®ç»“æŸæ—¶éšé™„的模型撤回表格,但您ä¸å¿…这样åšã€‚为了满足撤回期é™ï¼Œæ‚¨åªéœ€åœ¨æ’¤å›žæœŸé™å±Šæ»¡ä¹‹å‰å‘逿œ‰å…³æ‚¨è¡Œä½¿æ’¤å›žæƒçš„é€šä¿¡ã€‚ä½†æ˜¯ï¼Œå¦‚æžœæ‚¨å·²æ˜Žç¡®åŒæ„在购买过程结æŸåŽç«‹å³å¼€å§‹æ‰§è¡ŒGOGå†…å®¹ï¼ˆå³æ•°å­—内容) +,并已承认失去您的撤回æƒï¼Œåˆ™æ­¤è§„定ä¸é€‚用。 + + + +7.2 æœ¬æ¡æ¬¾åŠæœ¬ç”¨æˆ·å议中的任何其他部分å‡ä¸å½±å“您的法定æƒåˆ©ã€‚特别是: + + + +a)对于澳大利亚用户:我们的商å“附带æƒç›Šä¿æŠ¤æ‹…ä¿ï¼Œæ­¤æ‹…ä¿ä¸å¯ä¾æ®æ¾³å¤§åˆ©äºšæ¶ˆè´¹è€…法排除。您有æƒå°±é‡å¤§æ•…障进行æ¢è´§æˆ–退款,或就任何åˆç†å¯é¢„è§çš„æŸå¤±æˆ–æŸå®³å–å¾—èµ”å¿ã€‚如果商å“è´¨é‡ä¸åˆæ ¼ï¼Œæˆ–故障尚未达到é‡å¤§æ•…éšœçš„ç¨‹åº¦ï¼Œæ‚¨åŒæ ·æœ‰æƒè¦æ±‚商å“å¾—åˆ°ä¿®ç†æˆ–æ›´æ¢ã€‚ + + + +b)对于新西兰的用户:对于1993年新西兰消费者æƒç›Šä¿æŠ¤æ³•中所æåˆ°çš„ä¸å¯æŽ’除ã€é™åˆ¶æˆ–修正的任何æƒåˆ©æˆ–补救措施的适用,本用户å议的此部分或任何其他部分ä¸è¿›è¡Œä»»ä½•排除ã€é™åˆ¶æˆ–修正。根æ®è¯¥æ³•案,æƒç›Šä¿æŠ¤æ‹…ä¿çš„范围包括质é‡åˆæ ¼çš„商å“å’ŒæœåŠ¡ã€‚å¦‚æžœæ­¤æ‹…ä¿æœªèƒ½è¾¾æˆï¼Œåˆ™æ‚¨æœ‰æƒå°±è½¯ä»¶èŽ·å¾—è¡¥æ•‘æŽªæ–½ï¼ˆåŒ…æ‹¬ä¿®ç†ã€æ¢è´§æˆ–退款)。如果ä¸èƒ½æä¾›è¡¥æ•‘措施,或故障性质é‡å¤§ï¼Œè¯¥æ³•案规定应予退款。 + + + +我们的退货政策 + + + +7.3 我们明白,有的时候您进行的购买行为å¯èƒ½å¹¶ä¸æ˜¯æ‚¨æƒ³ è¦çš„,我们希望能够公平对待我们的GOGç”¨æˆ·ã€‚æ‰€ä»¥æˆ‘ä»¬å‘ +您æä¾›ä»¥ä¸‹æœåŠ¡ï¼Œåœ¨æžå°‘æ•°æƒ…å†µä¸‹ï¼Œå¦‚æžœæˆ‘ä»¬å¯¹æ‚¨çš„é€€æ¬¾è¦æ±‚有åˆç†çš„疑问,我们å¯èƒ½ä¸é€‚用自愿退款政策。 在任何情况下,这都ä¸ä¼šå‰¥å¤ºæ‚¨ä»»ä½•适用的法定退款æƒåˆ©ã€‚ + +## 8.虚拟物å“å’Œè™šæ‹Ÿè´§å¸ + +8.1 对于æŸäº›GOG内容æ¥è¯´ï¼Œæ‚¨å¯èƒ½å¯ä»¥è´­ä¹°æˆ–获得虚拟物 å“å’Œ/或虚拟货å¸ï¼ˆæˆ‘们将其简称为“ è™šæ‹Ÿè´§å“ â€ ï¼‰ã€‚ +虚拟货å“å—到本åè®®ã€ç‰¹åˆ«æ˜¯ä»¥ä¸‹çš„默认规则所管辖,除 éžè¯¥GOG内容拥有相关的特殊规则(则以这些特殊规则为准 )。 + + + +8.2 虚拟货å“仅是数字物å“,没有现金价值或现实世界的 实物,也无法进行“ 购买†〠“ 出售†ã€èµ é€ã€è½¬äº¤ã€æˆ– +å…‘æ¢ï¼Œæ— è®ºç›®çš„æ˜¯å¦ä¸ºèŽ·å¾—å…¶ä»–æœ‰é‡‘é’±ä»·å€¼çš„è™šæ‹Ÿè´§å“〠“ 真实世界†的钱物ã€ç‰©å“ã€æœåŠ¡ã€æˆ–物å“。虚拟货å“çš„ +äº¤æ˜“æ˜¯ç¦æ­¢çš„(除éžä½ å¾—到了专门的å…许)。你对虚拟货å“的使用æƒå—到一个有é™çš„ã€éžæŽ’ä»–çš„ã€ä¸å¯è½¬è®©çš„ã€ä¸ å¯è½¬æŽˆçš„ã€å¯æ’¤é”€çš„æŽˆæƒæ‰€ç®¡è¾–,规定您仅å¯åœ¨é€‚用的GOG +内容中为了个人的娱ä¹å’Œéžå•†ä¸šç›®çš„使用这些虚拟货å“。 您对任何的虚拟物å“éƒ½ä¸æ‹¥æœ‰è´¢äº§åˆ©ç›Šã€æˆ–æƒåˆ©ã€æˆ–å¥‘æ® ï¼Œè€Œè¿™äº›è™šæ‹Ÿç‰©å“çš„å‘行商ä¿ç•™å…¶æ‰€æœ‰æƒã€‚虚拟物å“å¯èƒ½ +ä¼šåœ¨æœ‰å¿…è¦æ—¶è¢«æ›´æ¢ã€ä¿®æ”¹ã€æˆ–æ’¤é”€ï¼Œå…¶ç›®çš„åŒ…æ‹¬ä¸ºç¬¦åˆæœ¬å议。如果有必è¦ï¼Œè¿™äº›è™šæ‹Ÿè´§å“的使用å¯èƒ½ä¼šå—åˆ°é™ åˆ¶ï¼ˆåŒ…æ‹¬äº¤æ˜“é™åˆ¶å’Œä½™é‡é¢åº¦ï¼‰ã€‚ + + + +8.3 +æˆ‘ä»¬å‘æ‚¨æä¾›æŸä¸€ä»¶è™šæ‹Ÿè´§å“并䏿„å‘³ç€æˆ‘们承诺在未æ¥ä¼šç»´æŒæˆ–ç»§ç»­æä¾›è¯¥è™šæ‹Ÿè´§å“ã€æˆ–ä¿æŒè¯¥è™šæ‹Ÿè´§å“å¯ç”¨ã€‚您å¯ä»¥èŽ·å¾—çš„è™šæ‹Ÿè´§å“的范围ã€ç§ç±»ã€å’Œç±»åž‹å¯èƒ½ä¼šå‘生改å˜ï¼Œè€Œä¸”我们ä¿ç•™åœ¨æˆ‘们认为因GOG.COM或GOG内容的æŒç»­è¿è¥ã€æˆ–å…¶ä»–åˆæ³•ç†ç”±è€Œæœ‰å¿…è¦çš„æƒ…况下管ç†ã€ +调整ã€ä»¥åŠç§»é™¤è™šæ‹Ÿè´§å“çš„æƒåˆ©ï¼Œåœ¨è¿™ç§æƒ…况下,我们在履行这些æƒåˆ©æ—¶å¯¹ä½ æˆ–其他任何人ä¸è´Ÿä»»ä½•责任。我们会在åˆç†çš„æƒ…况䏋呿‚¨é€šçŸ¥ä»»ä½•更改并解释更改的原因。 + +## 9\. è¡¥ä¸ã€æ›´æ–°ã€å’Œæ”¹åЍ + +9.1 +å¶å°”我们å¯èƒ½éœ€è¦ä¿®è¡¥æˆ–æ›´æ–°GOGæœåŠ¡æˆ–GOG内容(例如添加或删除功能或解决软件错误)。为了让GOG高效ã€å®‰å…¨åœ°è¿è¡Œï¼Œæˆ‘们需è¦è¿™äº›æƒåˆ©ã€‚ä¸ä¿®è¡¥æˆ–æ›´æ–°GOGæœåŠ¡æˆ–GOG内容å¯èƒ½ä¼šå¯¼è‡´æ‚¨çš„版本性能较差,或者您的版本与æŸäº›GOGæœåŠ¡æˆ–GOG内容功能ä¸å…¼å®¹ã€‚这样åšï¼Œæ‚¨è¿˜ä¼šé¢ä¸´ä¸å®‰è£…é‡è¦å®‰å…¨æ›´æ–°çš„风险。我们的åˆä½œä¼™ä¼´å¯èƒ½ä¼šä½¿ç”¨GOGæœåŠ¡ä¸ºé€‚ç”¨çš„GOGå†…å®¹æŽ¨å‡ºè¡¥ä¸æˆ–更新。 + +## 10\. GOGæœåŠ¡çš„æ‰€æœ‰æƒå’ŒçŸ¥è¯†äº§æƒ + +10.1 GOGæœåŠ¡åŒ…æ‹¬ï¼ˆå¹¶ä¸é™äºŽï¼‰å…¶å›¾åƒã€ç”µè„‘代ç ã€ç”¨æˆ·ç•Œé¢ã€å¤–观和风格ã€éŸ³é¢‘ã€è§†é¢‘ã€æ–‡å­—ã€å¸ƒå±€ã€æ•°æ®åº“〠+和所有其他内容,所有相关的法定或使用æƒå‡å±žäºŽæˆ‘们或 我们从第三方处获得授æƒã€‚ +GOG内容由其å„自的开å‘商/å‘行商所有ã€å¹¶ç”±æˆ‘们授æƒä½¿ç”¨ã€‚除我们在本å议中特别说 明的情况外,我们ä¿ç•™ä¸€åˆ‡æƒåˆ©ã€‚除了本å议中说明的方 +å¼ä¹‹å¤–,您ä¸èƒ½ä»¥ä»»ä½•å…¶ä»–æ–¹å¼ä½¿ç”¨æˆ–利用GOGæœåŠ¡æˆ–GOG 内容的任何部分。 + + + +10.2. +GOGå°Šé‡ä»–人的知识产æƒã€‚请[在此处](https://support.gog.com/hc/articles/213224285)阅读更多信æ¯ã€‚ + +## 11\. GOGæœåŠ¡ä½¿ç”¨è§„å®š + +11.1 +请éµå®ˆæœ‰å…³GOGæœåŠ¡å’ŒGOGå†…å®¹çš„è¿™äº›è§„åˆ™ï¼Œä»¥åŠæˆ‘们在下文11.2中链接的任何其他规则。请仔细阅读这些规则,因为ä¸éµå®ˆè¿™äº›è§„则(特别是与作弊有关的规则)将被视为严é‡è¿å本å议,这å¯èƒ½å¯¼è‡´æ‚¨æš‚åœæˆ–å–æ¶ˆå¯¹GOGæœåŠ¡çš„è®¿é—®ã€‚ä»¥ä¸‹æ˜¯è§„åˆ™ï¼š + + + +(a)ä»…å°†GOGæœåŠ¡æˆ–GOG内容用于个人娱ä¹ï¼ˆä¾‹å¦‚,请勿将其用于赚钱ã€ç›—版或政治目的)。 + + + +(b)关于GOG内容,除了玩游æˆï¼ˆå¦‚创建è¡ç”Ÿä½œå“)之外,您实际上还å¯ä»¥åšä»€ä¹ˆï¼Œè¿™å–决于GOG内容æƒåˆ©äººå…许您åšä»€ä¹ˆï¼ˆ +GOGä¸èƒ½æŽˆäºˆæ­¤ç±»æƒåˆ©ï¼‰ã€‚因此,请直接与æƒåˆ©æŒæœ‰äººæ ¸å®žï¼ˆä¸è¿‡ï¼Œæ‚¨åº”该åšçš„ç¬¬ä¸€ä»¶äº‹æ˜¯æ£€æŸ¥ä»–ä»¬æ˜¯å¦æœ‰æœ€ç»ˆç”¨æˆ·è®¸å¯å议,如果有的è¯ï¼Œè¯¥åè®®çš„å†…å®¹æ˜¯ä»€ä¹ˆï¼‰ã€‚æˆ‘ä»¬è¿˜è¦æ±‚您仅真诚地å°è¯•改进GOG内容。 + + + +(c) 对于GOGæœåŠ¡æ¥è¯´ï¼ˆåŒ…括GOGè½¯ä»¶ï¼‰ï¼Œé™¤éžæ‚¨äº‹å…ˆèŽ·å¾—äº†GOGçš„å…许,å¦åˆ™è¯·ä¸è¦ä¿®æ”¹ã€åˆå¹¶ã€åˆ†å‘ã€ç¿» +译ã€é€†å‘工程ã€å编译ã€åæ±‡ç¼–ã€æˆ–制作è¡ç”Ÿä½œå“ï¼Œé™¤éž æ‚¨å¾—åˆ°è¿™ä»½å议或是您国家法律的å…许。我们想è¦å¼ºè°ƒï¼Œ 我们欢迎您è”络我们,申请获得以上行为的许å¯ï¼Œè€Œæˆ‘们 +ä¼šä»¥çœŸè¯šçš„å¿ƒå®¡æ ¸å¹¶å›žå¤æ‚¨çš„申请。进一步说,我们希望 能够在未æ¥çš„æŸä¸ªæ—¶é—´å¼€æ”¾ä¸€äº›å®¢æˆ·ç«¯åè®®ï¼Œè®©ç”¨æˆ·ä»¬å¯ +以更方便的使用GOGæ•°æ®/软件,而无需使用逆å‘工程或类 似的技术。 + + +(d) 请ä¸è¦ç ´è§£ã€ç ´åã€éªšæ‰°ã€å¹²æ‰°ã€æˆ–滥用GOGæœåŠ¡æˆ–GOG内容〠GOG用户或GOGå·¥ä½œäººå‘˜ã€æˆ–将其用于 类似的目的。 + + + +(e) +ä¸å¾—以任何方å¼åˆ›å»ºã€ä½¿ç”¨ã€æä¾›å’Œ/或分å‘ä½œå¼Šã€æ¼æ´žåˆ©ç”¨ã€è‡ªåŠ¨åŒ–è½¯ä»¶ã€æœºå™¨äººã€æœºå™¨äººã€modã€é»‘客ã€èœ˜è››ã€é—´è°è½¯ä»¶ã€ä½œå¼Šã€è„šæœ¬ã€åŸ¹è®­å¸ˆã€æå–工具或其他与GOGæœåŠ¡æˆ–GOG内容交互或影å“GOG内容的软件(包括但ä¸é™äºŽæ‹¦æˆªã€æ¨¡æ‹Ÿæˆ–é‡å®šå‘GOG或其åˆä½œä¼™ä¼´ä¸ŽGOGæœåŠ¡ä¹‹é—´çš„ä»»ä½•é€šä¿¡çš„ä»»ä½•æœªç»æŽˆæƒçš„第三方程åºå’Œ/或收集有关GOGæœåŠ¡ä¿¡æ¯çš„ä»»ä½•æœªç»æŽˆæƒçš„第三方程åºï¼‰ã€‚ + + + +(f) ä¸è¦å¹²æ‰°GOGã€æˆ–ç¬¬ä¸‰æ–¹ç½‘ç»œè½¯ä»¶ã€æˆ–å…¶ä»–è½¯ä»¶ï¼ŒåŒ…æ‹¬é€šè¿‡éš§é“æŠ€æœ¯ã€ä»£ç æ³¨å…¥ã€ä¿®æ”¹æˆ–æ›´æ¢GOG软件 +ã€ä¸ŽGOGæœåŠ¡æˆ–GOG内容共åŒä½¿ç”¨ä»»ä½•其他类似的软件ã€é€š 过åè®®æ¨¡æ‹Ÿã€æˆ–通过制作或使用与GOGæœåŠ¡æˆ–GOG内容有关 +çš„ç§æœ‰æœåŠ¡å™¨ã€‚ä¸è¦è®¿é—®æˆ–å°è¯•访问GOG.COM或GOG GALAXYæœåС噍 中未å‘公众开放的区域。 + + +(g) ä¸è¦åšæˆ–è¯´ä»»ä½•è¢«è§†ä¸ºæˆ–å¯èƒ½è¢«è§†ä¸ºç§æ—主义ã€ä»‡å¤–心ç†ã€æ€§åˆ«æ­§è§†ã€è¯½è°¤æˆ–å…¶ä»–å†’çŠ¯æ€§æˆ–éžæ³•的事情(例如剥削未æˆå¹´äººã€é¼“励暴力ã€ä»Žäº‹æ¬ºè¯ˆï¼‰ã€‚è¯·å–„å¾…å½¼æ­¤ï¼ + + + +(h) ä¸è¦åˆ†äº«ã€ “ 购买†〠“ 出售†ã€è½¬äº¤ã€èµ é€ã€ç§Ÿå€Ÿã€ç›—å–ã€ä¾µå æˆ–ä¸å½“使用GOG账户。 GOG密钥/密ç ä»…能以 +GOGå…许的方å¼è¿›è¡Œèµ é€ã€è½¬äº¤æˆ–使用。如果您有任何 疑问或问题,请è”系我们的客户支æŒã€‚ + + +(i) æˆ‘ä»¬è¦æ±‚您éµå®ˆä¸€åˆ‡ä¸ŽGOG有关的ã€é€‚用的 åœ°ç†æˆ–地区ã€è¯­è¨€æˆ–基于ä½ç½®çš„é™åˆ¶ã€è¦æ±‚ã€æˆ–规定。 + + +(j) æˆ‘ä»¬è¦æ±‚您ä¸è¦ä»Žäº‹ä»»ä½•与GOG相关的ã€ä¼š 对他人的版æƒã€å•†æ ‡ã€ä¸“利ã€å•†ä¸šæœºå¯†ã€éšç§æƒã€å…¬å¼€æ€§ ã€æˆ–å…¶ä»–æƒåˆ©é€ æˆä¾µçŠ¯çš„è¡Œä¸ºï¼ŒåŒ…æ‹¬å¹¶ä¸é™äºŽå›¾åƒã€ç…§ç‰‡ +ã€éŸ³é¢‘æ–‡ä»¶ã€æ–‡æœ¬æ–‡ä»¶ã€å›¾åƒæ–‡ä»¶ã€ä»¥åŠä»»ä½•å…¶ä»–çš„ææ–™ 或信æ¯ã€‚ + + + +11.2 +除此之外,以下是使用GOGæœåŠ¡æ—¶é€‚ç”¨äºŽæ‚¨çš„é™„åŠ æ¡æ¬¾åˆ—è¡¨ã€‚æˆ‘ä»¬ä¸æƒ³é‡å¤ï¼Œä½†é‡è¦çš„æ˜¯è¦è®°ä½ï¼Œå¦‚果您ä¸éµå®ˆè¿™äº›è§„定,这将严é‡è¿å本å议,这å¯èƒ½å¯¼è‡´æ‚¨æš‚åœæˆ–å–æ¶ˆå¯¹GOGæœåŠ¡çš„è®¿é—®ã€‚ä»¥ä¸‹æ˜¯åˆ—è¡¨ï¼š + + * GOG行为准则([链接](https://support.gog.com/hc/articles/115001814049-Forum-Code-of-Conduct?product=gog)) + + * ä¾µæƒå†…å®¹å’Œç‰ˆæƒæ”¿ç­–([链接](https://support.gog.com/hc/articles/213224285-Copyright-Policy?product=gog))。 + + + +11.3 +æ¯å½“我们åšå‡ºå®¡æ ¸å†³å®šï¼Œå¯¼è‡´æ‚¨å¯¹GOGæœåŠ¡çš„è®¿é—®å—到é™åˆ¶æ—¶ï¼Œåªè¦æœ‰å¯èƒ½ï¼Œæ‚¨éƒ½åº”该收到一份ç†ç”±è¯´æ˜Žï¼Œæ¦‚述我们åšå‡ºè¿™ä¸€å†³å®šçš„原因。如果您ä¸åŒæ„我们的决定,您有6个月的时间进行投诉。有关如何æå‡ºæŠ•诉的详细信æ¯ï¼Œè¯·å‚阅您的审核决定。我们的投诉处ç†ç³»ç»Ÿç¨‹åºçš„æè¿°ä¹Ÿå¯ä»¥åœ¨ä¾µæƒå†…å®¹å’Œç‰ˆæƒæ”¿ç­–([此处](https://support.gog.com/hc/articles/213224285))中找到。 + +## 12\. 用户生æˆå†…容 + +12.1 本节介ç»çš„ä¸»è¦æ˜¯æ‚¨ä¸ºæˆ‘们或为其他GOG用户ã€é€šè¿‡ GOGæœåŠ¡ï¼ˆä¾‹å¦‚é€šè¿‡æ‚¨çš„æ¡£æ¡ˆå›¾ç‰‡ã€æˆ–通过å‘给其他GOG用 +户的消æ¯ï¼‰æ‰€åˆ›å»ºçš„内容(例如文字ã€è§†é¢‘ã€ç…§ç‰‡ã€å›¾ç‰‡ã€æˆªå›¾ã€å£çº¸æˆ–链接)。 我们将这ç§å†…容称为“ 用户生æˆå†…容†。 + + + +12.2 +就我们和您而言,您拥有任何用户生æˆçš„å†…å®¹ï¼Œä½†æˆ‘ä»¬éœ€è¦æ‚¨æŽˆäºˆæˆ‘ä»¬å¯¹å…¶çš„ä¸€äº›æœ‰é™æƒåˆ©ï¼Œä»¥ä¾¿æˆ‘们能够通过GOGæœåŠ¡è¿›è¡Œå®žé™…ä¼ è¾“ã€‚å› æ­¤ï¼Œé€šè¿‡å‘布用户生æˆå†…å®¹ï¼Œæ‚¨å‘æˆ‘们授予éžç‹¬å®¶ã€ä¸å¯æ’¤é”€çš„许å¯ï¼Œå…许我们使用ã€ä¿®æ”¹ã€å¤åˆ¶ã€åˆ›å»ºè¡ç”Ÿä½œå“ã€åˆ†å‘ã€ä¼ è¾“ã€æ²Ÿé€šä»¥åŠå…¬å¼€å±•示/执行与GOGæœåŠ¡ç›¸å…³çš„ç”¨æˆ·ç”Ÿæˆå†…容。 + + + +12.3 您需è¦è´Ÿè´£ä¿è¯æ‚¨å¯¹ç”¨æˆ·ç”Ÿæˆå†…å®¹çš„ä½¿ç”¨æ‹¥æœ‰æ‰€æœ‰åˆ æ³•çš„æ³•å®šæƒåˆ©ï¼Œå¹¶è´Ÿè´£ç¡®ä¿å…¶å¯ä»¥å®‰å…¨ä½¿ç”¨ã€‚我们无法得 +知这些情况,而且我们无法为您进行检查,所以我们åªèƒ½ 信任您。 + + + +12.4. +但是,我们有æƒï¼ˆä½†æ²¡æœ‰ä¹‰åŠ¡ï¼‰å®¡æŸ¥å¹¶åœ¨é€‚å½“æˆ–æ³•å¾‹ä¸Šå¿…è¦æ—¶åˆ é™¤ä»»ä½•éžæ³•ã€ä¾µæƒã€è¯½è°¤ã€æ·«ç§½ã€ä¾µçŠ¯ä»–äººéšç§ã€å¨èƒã€éªšæ‰°ã€è¾±éª‚ã€ä»‡æ¨ã€ç§æ—主义或色情的用户生æˆå†…容。如果您å‘现任何此类内容已在GOGæœåŠ¡ä¸Šå‘å¸ƒï¼Œè¯·å‘ŠçŸ¥æˆ‘ä»¬ã€‚æˆ‘ä»¬è¦æ±‚您阅读我们的《侵æƒå†…容政策》(此处) +,其中介ç»äº†ä¸¾æŠ¥ä¾µæƒå†…容的程åºã€‚如果您ä»ç„¶è®¤ä¸ºåœ¨æˆ‘们的内部程åºä¹‹åŽï¼Œæ‚¨çš„ä¸ªæ¡ˆä»æœªå¾—到完全解决,您å¯ä»¥å¯»æ±‚庭外纠纷解决办法。详情请å‚阅下文第20节。 + +## 13\. å馈或建议 + +13.1 +我们éžå¸¸æ¬¢è¿Žæ‚¨ç»™æˆ‘们呿¥æœ‰å…³GOGæœåŠ¡çš„å馈和建议。我们éžå¸¸é‡è§†ã€‚ä¸è¿‡æˆ‘们一定è¦è¯´æ˜Žï¼Œæˆ‘们ä¸ä¸€å®šä¼šé‡‡ç”¨æˆ–接纳这些åé¦ˆæˆ–å»ºè®®ï¼Œè€Œä¸”æˆ‘ä»¬ä¸æ‰¿è¯ºä¼šå¯¹æ‚¨è¿›è¡Œ +任何相关的奖励(金钱或其他形å¼ï¼‰ã€‚ + +## 14\. 在网å‹åˆ›ä½œä¸­ä½¿ç”¨GOG内容 + +14.1 对于任何的网å‹ä½œå“æ¥è¯´ï¼ˆä¾‹å¦‚ç½‘å‹æ¨¡ç»„ã€å¼•擎电影 ã€æ¨¡ä»¿ã€è‡´æ•¬ã€æ¸¸æˆè§†é¢‘ã€å’Œå…¶ä»–的视频或美术作å“), +您需è¦è‡ªè¡ŒæŸ¥æ ¸è¯¥å†…容的拥有者(如开å‘商或å‘行商)是 å¦å…许该行为,如果他们å…è®¸ï¼Œé‚£ä¹ˆæ‚¨åº”è¯¥ä»Žä»–ä»¬å¤„èŽ·å– +相应的许å¯ã€‚原因很简å•,所有的GOG内容都是它们å„è‡ªæ‰€æœ‰æƒæŒæœ‰è€…的财产ã€è€Œä¸æ˜¯GOG的。 + +## 15\. 第三方内容和外部æœåŠ¡ + +15.1 您å¯èƒ½ä¼šé€šè¿‡GOGæœåŠ¡èŽ·å–到指å‘第三方网站或内容的链接。您å¯ä»¥è‡ªè¡Œåˆ¤æ–­æ˜¯å¦ä½¿ç”¨è¿™äº›é“¾æŽ¥ï¼Œæˆ‘们无法ä¿è¯è¿™äº›é“¾æŽ¥æœ‰æ•ˆã€å®ƒä»¬æŒ‡å‘ä½•å¤„ã€æˆ–è€…æ˜¯å¦æ”¶è´¹ã€‚ + + + +15.2 您还å¯ä»¥ä½¿ç”¨æ‚¨çš„GOGè´¦æˆ·æ¥æ–¹ä¾¿çš„使用外部的〠GOG 认è¯çš„åˆä½œä¼™ä¼´çš„æœåŠ¡ã€‚ä¾‹å¦‚æˆ‘ä»¬çš„å…³è”å…¬å¸CD PROJEKT +推出的游æˆã€Šå·«å¸ˆã€‹åŠå…¶ç½‘站。它们都有其å„è‡ªçš„æ¡æ¬¾å’Œ æ¡ä»¶ï¼Œæ‚¨éœ€è¦åŒæ„å¹¶éµå®ˆæ–¹å¯ä½¿ç”¨ã€‚一定è¦è¯´æ˜Žï¼šæ˜¯å¦ä½¿ç”¨è¿™äº›æœåŠ¡ï¼Œæ‚¨å¯ä»¥è‡ªè¡Œåˆ¤æ–­ï¼Œè€Œä¸”是éžå¼ºåˆ¶çš„ã€‚è¿™ä¸ªæƒ +åˆ©å±žäºŽæ‚¨ï¼ + +## 16\. 有关GOGæœåŠ¡çš„ä¿è¯å’Œè´£ä»»èŒƒå›´ + +16.1 我们ä¿è¯ï¼š (i) 我们有æƒåˆ©è®¢ç«‹æ­¤åè®®ï¼Œå¹¶æŽˆæƒæ‚¨ä½¿ç”¨ç¬¬2.1节中介ç»çš„GOGæœåŠ¡ï¼›è€Œä¸” (ii) 我们会对GOGæœåŠ¡ +和您的使用体验实施åˆç†çš„关注;而且 (iii) 我们在履行此å议中规定的我们对您的义务时会采å–åˆç†çš„努力æ¥éµ 守适用的法律。 + + + +16.2 您的声明与ä¿è¯ã€‚您在此声明并ä¿è¯æ‚¨æœ‰å®Œæ•´çš„æƒåŠ› 和能力签署本å议并éµå®ˆå…¨éƒ¨æ¡æ¬¾ã€‚您将声明并ä¿è¯æ‚¨é€š +过GOGæœåŠ¡ä¼ è¾“çš„ä»»ä½•ç”¨æˆ·ç”Ÿæˆå†…容å‡ä¸ä¾µçŠ¯ä»»ä½•ç¬¬ä¸‰æ–¹çš„ +知识产æƒã€‚您将进一步声明并ä¿è¯æ‚¨ä¸ä¼šä½¿ç”¨æˆ–为包å«éžæ³•ã€ä¾µæƒã€è¯½è°¤ã€æ·«ç§½ã€ä¾µçŠ¯ä»–äººéšç§ã€å¨èƒã€éªšæ‰°ã€è¾±éª‚ã€æ†Žæ¨ã€ç§æ—歧视或色情内容的用户生æˆå†…容æä¾›å¸®åŠ© 。 + + + +16.3. +我们努力使GOG内容在您的系统上è¿è¡Œï¼Œä½†æˆ‘们进行测试的时间有é™ï¼Œè€Œä¸”æˆ‘ä»¬å¹¶ä¸æ€»æ˜¯æŠŠä¸€åˆ‡éƒ½åšå¥½ã€‚å› æ­¤ï¼Œé™¤éžæ³•å¾‹è¦æ±‚,å¦åˆ™æˆ‘们ä¸å¯¹GOG内容承担任何责任(è§7.1.-7.2以上)。我们也ä¸å¯¹GOG.COM或GOGæœåŠ¡å‘生的任何超出我们控制范围的事情负责,我们也ä¸ä¿è¯GOGæœåŠ¡100%正常工作。但是,ä¸è¦å¿˜è®°ï¼Œå¦‚æžœGOG内容存在技术问题,您å¯èƒ½æœ‰æƒèŽ·å¾—é€€è´§å’Œé€€æ¬¾- +请å‚阅第7.3节。 + +## 17\. 终止 + +17.1 +您终止本å议的æƒåˆ©ã€‚您å¯ä»¥éšæ—¶ç»ˆæ­¢æœ¬å议,无需æä¾›ä»»ä½•ç†ç”±ï¼Œå®Œå…¨åœæ­¢ä½¿ç”¨GOGæœåŠ¡ã€‚å¦‚æžœæ‚¨å¸Œæœ›æˆ‘ä»¬åˆ é™¤æ‚¨çš„å¸æˆ·ï¼Œè¯·[在此处](https://support.gog.com/hc/requests/new)è”系我们的支æŒå›¢é˜Ÿï¼Œæˆ–å‘é€ç”µå­é‚®ä»¶è‡³privacy@gog.com。终止ä¸ä¼šå½±å“我们或您已ç»å­˜åœ¨çš„æƒåˆ©æˆ–ä¹‰åŠ¡ã€‚ + + + +17.2. +我们终止本å议的æƒåˆ©ã€‚如果您严é‡è¿å本å议,我们ä¿ç•™æš‚åœæˆ–å–æ¶ˆæ‚¨å¯¹GOGæœåŠ¡å’ŒGOG内容的访问æƒé™çš„æƒåˆ©ã€‚ä¸¥é‡è¿å本å议是指å¯èƒ½å¯¹GOGã€GOG用户造æˆé‡å¤§æŸå®³çš„严é‡è¿è§„行为,特别是è¿å上述第11节或GOGè¡Œä¸ºå‡†åˆ™çš„è§„å®šã€‚å¦‚æžœæˆ‘ä»¬æš‚åœæˆ–å–æ¶ˆæ‚¨å¯¹GOGæœåŠ¡æˆ–GOG内容的访问æƒé™ï¼Œæˆ‘们将采å–åˆç†æŽªæ–½ä¸Žæ‚¨è”系,解释我们这样åšçš„åŽŸå› ä»¥åŠæ‚¨å¯ä»¥é‡‡å–的措施(如有)。 + + + +17.3虽然概率很å°ï¼Œä½†æ˜¯å¦‚果我们ä¸å¾—䏿°¸ä¹…çš„åœæ­¢å‘您 æä¾›GOGæœåŠ¡å’ŒGOGå†…å®¹ï¼ˆåŽŸå› å¹¶ä¸æ˜¯æ‚¨è¿å本å议),我们会尽全力æå‰è‡³å°‘å…­å( +60)天在www.gog.com上å‘布通知ã€å¹¶å‘所有注册用户å‘é€é‚®ä»¶è¿›è¡Œé€šçŸ¥ï¼Œåœ¨æ­¤æœŸé—´æ‚¨å°†å¯ä»¥ä¸‹è½½æ‚¨è´­ä¹°çš„æ‰€æœ‰GOG内容。 + +## 18\. ä¸å¯æŠ—力 + +18.1 如果因为å‘ç”Ÿäº†æ‚¨æˆ–æˆ‘ä»¬æ— æ³•æŽ§åˆ¶çš„ã€æ— æ³•预知的事件,包括并ä¸é™äºŽç½‘络中断ã€è”络中断ã€ç«ç¾ã€æ´ªæ°´ã€æˆ˜äº‰ã€æˆ–天ç¾ç­‰ï¼Œè€Œå¯¼è‡´æ‚¨æˆ–我们无法履行本å议规定的任 +ä½•ä¹‰åŠ¡æˆ–æ— æ³•å‘æ‚¨æä¾›GOGæœåŠ¡å’ŒGOG内容,您和我方都对此ä¸è´Ÿä»»ä½•责任。 + +## 19\. 适用法律 + +对于居ä½åœ¨æ¬§ç›Ÿå’Œä¸–界其他地区(ä¸åŒ…æ‹¬ç¾Žå›½ï¼‰çš„ç”¨æˆ·æ¥ è¯´ï¼š + + + +19.1 æ‚¨å’Œæˆ‘ä»¬åŒæ–¹å‡åŒæ„您对GOGæœåŠ¡å’ŒGOG内容的使用以 åŠæœ¬å议都å—到波兰共和国的法律所管辖ã€å¹¶ä¾ç…§å…¶è¿›è¡Œ +解释,而且有关此å议的一切纠纷都会由波兰共和国的法 庭éžç‹¬å®¶å®¡ç†ã€‚在此å议下的任何诉讼中,胜诉方需承担 自己的法务费用和支出。 + + + +19.2 上述适用法律和管辖æƒçš„选择应以您居ä½çš„叿³•ç®¡è¾–åŒºé€‚ç”¨çš„å¼ºåˆ¶æ€§æ¶ˆè´¹è€…ä¿æŠ¤è§„å®šæˆ–å…¶ä»–æ³•å¾‹ï¼ˆå¦‚æ— æ¶ˆè´¹è€…ä¿æŠ¤è§„å®šï¼‰ä¸ºå‡†ã€‚ + + + +对于生活在美国的用户æ¥è¯´ï¼š + + + +19.3 æ‚¨å’Œæˆ‘ä»¬åŒæ–¹å‡åŒæ„您对GOGæœåŠ¡å’ŒGOG内容的使用〠+ä»¥åŠæœ¬åè®®ã€å‡ä¼šè¢«è§†ä¸ºæ˜¯åœ¨åŠ åˆ©ç¦å°¼äºšå·žæ´›æ‰çŸ¶å¸‚所订立,且å—到美国加利ç¦å°¼äºšå·žæ³•律所管辖以åŠè§£é‡Šï¼ˆä¸”在 +适用的情况下也å—到美国è”邦法律的管辖和解释)。一切您对GOGåšå‡ºçš„主张å‡ä¼šåœ¨åŠ åˆ©ç¦å°¼äºšå·žæ´›æ‰çŸ¶å¸‚的任 何州立或è”邦法庭中独家进行,并对你我之间的任何争议 +拥有诉讼标的管辖æƒï¼Œå› æ­¤æˆ‘ä»¬åŒæ–¹å‡åŒæ„åŒæ„上述法庭 的独家管辖æƒã€‚在此å议下的任何诉讼中,胜诉方需承担自己的法务费用和支出。 + +## 20\. 客户支æŒåŠäº‰è®®è§£å†³ + +20.1 +如果您对我们有任何疑虑ã€ç”³è¯‰æˆ–问题,我们希望能通过[这里](https://support.gog.com/hc/requests/new)å‹å¥½ã€å¿«é€Ÿåœ°å°†å…¶è§£å†³ã€‚æˆ‘ä»¬å°†é‡‡å– +åˆç†çš„ã€è¯šæ„çš„åŠªåŠ›ä»¥éžæ­£å¼çš„æ–¹å¼ä¸Žæ‚¨è§£å†³ä»»ä½•争议。我们承诺在14日内对任何申诉åšå‡ºå›žå¤ã€‚ + + + +20.2. +如果在此期间没有解决,接下æ¥çš„æ­¥éª¤å–决于您居ä½çš„地方。如果您居ä½åœ¨æ¬§ç›Ÿå¢ƒå†…,您å¯ä»¥å‘欧盟委员会è¿è¥å’Œæä¾›çš„åœ¨çº¿äº‰è®®è§£å†³å¹³å°æäº¤æ³•å¾‹ç´¢èµ”ï¼Œè¯¥å¹³å°å¯é€šè¿‡http://ec.europa.eu/consumers/odr/访问,以达æˆåº­å¤–和解或æèµ·è¯‰è®¼ã€‚您也å¯ä»¥é€‰æ‹©é€šè¿‡æ‚¨æ‰€åœ¨å›½å®¶/地区的数字æœåŠ¡å调员认è¯çš„任何庭外争议解决机构解决您的争议。 + + + +20.3 如果您居ä½åœ¨ç¾Žå›½æˆ–是世界其他地区(ä¸åŒ…括欧盟) ,请通过 legal@GOG.COM è”络我们。 + +## 21\. 其他法务事项 + +21.1 如果本å议的任何一部分被å‘çŽ°æ— æ³•åˆæ³•实施,这对本å议的任何一部分ä¸é€ æˆä»»ä½•å½±å“。 + + + +21.2本å议(包括其中æåŠçš„任何GOGé™„åŠ æ¡æ¬¾ï¼‰æž„æˆæ‚¨ä¸Žæˆ‘们之间的完整å议,并å–代之å‰çš„任何å£å¤´æˆ–书é¢å议。如果您ä¸åŒæ„这一点,请在开始使用GOGæœåŠ¡åŽå°½å¿«é€šè¿‡legal@gog.com与我们è”系,å¦åˆ™è¿™å°†åœ¨åˆç†çš„æ—¶é—´æ®µï¼ˆé€šå¸¸ä¸º30天)åŽå¯¹æ‚¨å…·æœ‰çº¦æŸåŠ›ã€‚ + + + +21.3 本å议管辖我们和您的一切关系(å之亦然)。它并ä¸ä¼šä¸ºå…¶ä»–任何人授予任何æƒåˆ©ã€‚ + + + +21.4 请记ä½ï¼Œæˆ‘们还å—到å„ç§æ³•律的管辖,而且我们å¯èƒ½ä¼šéœ€è¦æœä»Žæ‰§æ³•æœºæž„æˆ–å…¶ä»–åˆæ³•è¦æ±‚。 + + + +21.5 如果GOGå‘生é‡ç»„ã€å‡ºå”®ã€æˆ–åˆå¹¶ï¼Œé‚£ä¹ˆæˆ‘们需 è¦ä¸Žç›¸å…³çš„第三方åˆä½œæ¥è½¬ç§»æˆ–是åˆå¹¶æ‚¨çš„GOG账户。 + + + +21.6 æ‚¨å’Œæˆ‘ä»¬éƒ½åŒæ„è”åˆå›½å›½é™…货物销售åˆåŒå…¬çº¦å¹¶ä¸é€‚用于此å议。 + + + +21.7 如果对GOGçš„æ”¯æŒæœ‰å¿…è¦ã€ä½œä¸ºä»»ä½•é‡ç»„或åˆå¹¶çš„一 éƒ¨åˆ†ã€æˆ–为其他业务原因,我们å¯ä»¥å°†æ­¤å议分é…ã€åˆ†åŒ… +ã€æˆ–转移给第三方或我们集团内的其他æˆå‘˜ã€‚如果å‘生此 类事件,我们将æå‰é€šçŸ¥æ‚¨ã€‚ + + + +21.8 +如果您是欧盟公民,请注æ„ï¼Œæ ¹æ®æ¬§æ´²è®®ä¼šå’Œç†äº‹ä¼šäºŽ2017å¹´6月14日通过的关于国际市场在线内容æœåŠ¡è·¨å¢ƒä¾¿æºæ€§çš„第2017/1128å·æ³•规(EU),GOGå·²ç»èµ‹äºˆå…è´¹å’Œä»˜è´¹å†…å®¹è·¨å¢ƒä¾¿æºæ€§ï¼Œä½†æ­¤è·¨å¢ƒä¾¿æºæ€§éœ€å—其他任何对GOGçš„æ³•å¾‹è¦æ±‚的约æŸï¼ŒåŒ…括知识产æƒçš„ä¿æŠ¤ï¼Œä¸”éœ€å—到GOG的开å‘商和出版商åˆä½œä¼™ä¼´çš„ä»»ä½•è¦æ±‚的约æŸã€‚ + +## 22\. æ­¤å议的更改 + +22.1 +如果我们认为有必è¦ï¼Œä¾‹å¦‚å‡ºäºŽæ³•å¾‹åŽŸå› æˆ–ä¸ºäº†åæ˜ GOGæœåŠ¡æˆ–GOG内容的å˜åŒ–,我们å¯èƒ½ä¼šæ›´æ”¹æœ¬å议。如果是这样,我们将在https://support.gog.com/hc/articles/212632089上在线æä¾›å·²æ›´æ”¹çš„å议,并且(如果您有GOG叿ˆ·ï¼‰æˆ‘们会通过电å­é‚®ä»¶é€šçŸ¥æ‚¨ä»»ä½•é‡å¤§æ›´æ”¹ã€‚ + + + +22.2 本å议的任何更改将在公告上线åŽçš„30天内生效。如果您对更改有疑问的,å¯ä»¥åœ¨æ­¤æœŸé—´é€šè¿‡legal@GOG.COM è”络我们。 + + + +22.3 如果您ä¸åŒæ„这些更改(无论您是å¦è”ç»œæˆ‘ä»¬ï¼‰ï¼Œé‚£ä¹ˆå¾ˆé—æ†¾ï¼Œæˆ‘ä»¬å¿…é¡»è¦æ±‚æ‚¨åœæ­¢ä½¿ç”¨GOGæœåŠ¡å’ŒGOG内容。 +很抱歉我们ä¸å¾—ä¸è¿™æ ·è¯´ï¼Œä¸è¿‡æˆ‘们希望您能ç†è§£ï¼Œä¸ºäº† 让GOGæœåŠ¡èƒ½å¤Ÿæ­£å¸¸è¿è¥ï¼Œæˆ‘们需è¦è®©æ¯ä¸€ä¸ªç”¨æˆ·éƒ½æŒ‰ç…§åŒ +样的规则æ¥ä½¿ç”¨ï¼Œè€Œä¸æ˜¯ç»™ä¸åŒçš„人制定ä¸åŒçš„规则。因此,如果您有任何疑问或咨询,我们鼓励您è”络我们。 + + + +22.4 有必è¦å‘您说明,我们ç»ä¸ä¼šå¯¹æœ¬åè®®åšå‡ºä¸€å¤§å †æ›´æ”¹ï¼Œç„¶åŽä¸å‘Šè¯‰æ‚¨ï¼Œå¹¶è¦æ±‚您在使用GOG.COM之å‰åŒæ„è¿™äº›æ‚¨å¹¶ä¸æ˜Žäº†çš„æ›´æ”¹ï¼ + +## 23 我们的è”ç³»ä¿¡æ¯ + +23.1. 如果您对GOG叿ˆ·ã€GOGæœåŠ¡æœ‰ä»»ä½•æŠ•è¯‰ï¼Œæˆ–è€…åªæ˜¯æƒ³è”系我们,请查看我们的è”系方å¼ï¼š + + + +å…¬å¸åç§°: GOG sp. z o.o. + + + +注册办事处:JagielloÅ„ska 74, 03-301 Warsaw, Poland + +在国家法院登记处第14å•†ä¸šåº­åŽæ²™åœ°åŒºæ³•院登记。 + + + +登记å·ç 0000029514 + + + +税å·å¢žå€¼ç¨Žå·ï¼ˆ NIP ) PL 113-21-77-807 + + + +股本: 135,750.00兹罗æ + + + +当局的å•一è”络点: + +法务团队 + +legal@gog.com + +æˆ‘ä»¬æ²Ÿé€šçš„è¯­è¨€ï¼šè‹±è¯­ã€æ³¢å…°è¯­ + + + +GOGæœåŠ¡æŽ¥æ”¶è€…çš„å•一è”系点: + +支æŒå›¢é˜Ÿ + +support@gog.com + +我们主è¦è®²è‹±è¯­å’Œæ³¢å…°è¯­ï¼Œä½†ä¼šå°½æœ€å¤§åŠªåŠ›ä»¥GOGæä¾›çš„任何语言为您æä¾›å¸®åŠ©ã€‚ + + + +æœ€åŽæ›´æ–°ï¼ˆç”Ÿæ•ˆæ—¥æœŸï¼‰ : 2024å¹´2月17æ—¥ + + + +请[在此](https://support.gog.com/hc/articles/212632089)处查看用户å议的早期版本。 + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/blackgate/tmp/GOG.png b/info.exult.exult/data/blackgate/tmp/GOG.png new file mode 100644 index 0000000..3aeda5e Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/GOG.png differ diff --git a/info.exult.exult/data/blackgate/tmp/GOG200.png b/info.exult.exult/data/blackgate/tmp/GOG200.png new file mode 100644 index 0000000..3aeda5e Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/GOG200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/GOG200_new.png b/info.exult.exult/data/blackgate/tmp/GOG200_new.png new file mode 100644 index 0000000..fb32bc7 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/GOG200_new.png differ diff --git a/info.exult.exult/data/blackgate/tmp/InnoCallback.dll b/info.exult.exult/data/blackgate/tmp/InnoCallback.dll new file mode 100644 index 0000000..2b33aad Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/InnoCallback.dll differ diff --git a/info.exult.exult/data/blackgate/tmp/OpenSans-Regular.ttf b/info.exult.exult/data/blackgate/tmp/OpenSans-Regular.ttf new file mode 100644 index 0000000..db43334 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/OpenSans-Regular.ttf differ diff --git a/info.exult.exult/data/blackgate/tmp/OpenSans-Semibold.ttf b/info.exult.exult/data/blackgate/tmp/OpenSans-Semibold.ttf new file mode 100644 index 0000000..1a7679e Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/OpenSans-Semibold.ttf differ diff --git a/info.exult.exult/data/blackgate/tmp/Support.ico b/info.exult.exult/data/blackgate/tmp/Support.ico new file mode 100644 index 0000000..e1d26f4 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/Support.ico differ diff --git a/info.exult.exult/data/blackgate/tmp/background.jpg b/info.exult.exult/data/blackgate/tmp/background.jpg new file mode 100644 index 0000000..7834953 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/background.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/background.png b/info.exult.exult/data/blackgate/tmp/background.png new file mode 100644 index 0000000..25e76f0 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/background.png differ diff --git a/info.exult.exult/data/blackgate/tmp/bg-bot@2x.jpg b/info.exult.exult/data/blackgate/tmp/bg-bot@2x.jpg new file mode 100644 index 0000000..50c95a9 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/bg-bot@2x.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/bottombar.png b/info.exult.exult/data/blackgate/tmp/bottombar.png new file mode 100644 index 0000000..9c71a35 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/bottombar.png differ diff --git a/info.exult.exult/data/blackgate/tmp/bottombar200.png b/info.exult.exult/data/blackgate/tmp/bottombar200.png new file mode 100644 index 0000000..fa972b8 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/bottombar200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/botva2.dll b/info.exult.exult/data/blackgate/tmp/botva2.dll new file mode 100644 index 0000000..59cf6b5 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/botva2.dll differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_browse.png b/info.exult.exult/data/blackgate/tmp/btn_browse.png new file mode 100644 index 0000000..afe5064 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_browse.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_browse200.png b/info.exult.exult/data/blackgate/tmp/btn_browse200.png new file mode 100644 index 0000000..7b3d472 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_browse200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_close.png b/info.exult.exult/data/blackgate/tmp/btn_close.png new file mode 100644 index 0000000..dbdffc6 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_close.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_close200.png b/info.exult.exult/data/blackgate/tmp/btn_close200.png new file mode 100644 index 0000000..6520ede Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_close200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_continue.png b/info.exult.exult/data/blackgate/tmp/btn_continue.png new file mode 100644 index 0000000..097db4d Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_continue.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_continue200.png b/info.exult.exult/data/blackgate/tmp/btn_continue200.png new file mode 100644 index 0000000..956017c Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_continue200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_exit.png b/info.exult.exult/data/blackgate/tmp/btn_exit.png new file mode 100644 index 0000000..6038791 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_exit.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_exit200.png b/info.exult.exult/data/blackgate/tmp/btn_exit200.png new file mode 100644 index 0000000..3ab5b99 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_exit200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_launch.png b/info.exult.exult/data/blackgate/tmp/btn_launch.png new file mode 100644 index 0000000..969cb4e Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_launch.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_launch200.png b/info.exult.exult/data/blackgate/tmp/btn_launch200.png new file mode 100644 index 0000000..c745cb7 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_launch200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_md5.png b/info.exult.exult/data/blackgate/tmp/btn_md5.png new file mode 100644 index 0000000..6a69f73 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_md5.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_md5200.png b/info.exult.exult/data/blackgate/tmp/btn_md5200.png new file mode 100644 index 0000000..a0a55d5 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_md5200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_options.png b/info.exult.exult/data/blackgate/tmp/btn_options.png new file mode 100644 index 0000000..ad330dd Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_options.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_options200.png b/info.exult.exult/data/blackgate/tmp/btn_options200.png new file mode 100644 index 0000000..a0a55d5 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_options200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_save_as.png b/info.exult.exult/data/blackgate/tmp/btn_save_as.png new file mode 100644 index 0000000..318db3b Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_save_as.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_save_as200.png b/info.exult.exult/data/blackgate/tmp/btn_save_as200.png new file mode 100644 index 0000000..41e0139 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_save_as200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_skip.png b/info.exult.exult/data/blackgate/tmp/btn_skip.png new file mode 100644 index 0000000..4531aa5 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_skip.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_skip200.png b/info.exult.exult/data/blackgate/tmp/btn_skip200.png new file mode 100644 index 0000000..5a459c7 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_skip200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_start.png b/info.exult.exult/data/blackgate/tmp/btn_start.png new file mode 100644 index 0000000..77d1a64 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_start.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_start200.png b/info.exult.exult/data/blackgate/tmp/btn_start200.png new file mode 100644 index 0000000..44d7de8 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_start200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_tryagain.png b/info.exult.exult/data/blackgate/tmp/btn_tryagain.png new file mode 100644 index 0000000..ea4b099 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_tryagain.png differ diff --git a/info.exult.exult/data/blackgate/tmp/btn_tryagain200.png b/info.exult.exult/data/blackgate/tmp/btn_tryagain200.png new file mode 100644 index 0000000..c29cbe7 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/btn_tryagain200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/crcdll.dll b/info.exult.exult/data/blackgate/tmp/crcdll.dll new file mode 100644 index 0000000..d825542 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/crcdll.dll differ diff --git a/info.exult.exult/data/blackgate/tmp/empty b/info.exult.exult/data/blackgate/tmp/empty new file mode 100644 index 0000000..e69de29 diff --git a/info.exult.exult/data/blackgate/tmp/error.png b/info.exult.exult/data/blackgate/tmp/error.png new file mode 100644 index 0000000..71d2ff8 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/error.png differ diff --git a/info.exult.exult/data/blackgate/tmp/error200.png b/info.exult.exult/data/blackgate/tmp/error200.png new file mode 100644 index 0000000..09e4972 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/error200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/error_icon.png b/info.exult.exult/data/blackgate/tmp/error_icon.png new file mode 100644 index 0000000..55d2fa7 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/error_icon.png differ diff --git a/info.exult.exult/data/blackgate/tmp/error_icon200.png b/info.exult.exult/data/blackgate/tmp/error_icon200.png new file mode 100644 index 0000000..52488a5 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/error_icon200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/gog.ico b/info.exult.exult/data/blackgate/tmp/gog.ico new file mode 100644 index 0000000..5a9ec11 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/gog.ico differ diff --git a/info.exult.exult/data/blackgate/tmp/gog_installer_background.jpg b/info.exult.exult/data/blackgate/tmp/gog_installer_background.jpg new file mode 100644 index 0000000..7834953 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/gog_installer_background.jpg differ diff --git a/info.exult.exult/data/blackgate/tmp/gog_new.png b/info.exult.exult/data/blackgate/tmp/gog_new.png new file mode 100644 index 0000000..2b463b3 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/gog_new.png differ diff --git a/info.exult.exult/data/blackgate/tmp/innoSetupEula.txt b/info.exult.exult/data/blackgate/tmp/innoSetupEula.txt new file mode 100644 index 0000000..2ded45a --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/innoSetupEula.txt @@ -0,0 +1,38 @@ +======================================== +======= Inno Setup License Terms ======= +======================================== + +Except where otherwise noted, all of the documentation and software included +in the Inno Setup package is copyrighted by Jordan Russell. + +Copyright (C) 1997-2008 Jordan Russell. All rights reserved. + +This software is provided "as-is," without any express or implied warranty. +In no event shall the author be held liable for any damages arising from the +use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter and redistribute it, +provided that the following conditions are met: + +1. All redistributions of source code files must retain all copyright + notices that are currently in place, and this list of conditions without + modification. + +2. All redistributions in binary form must retain all occurrences of the + above copyright notice and web site addresses that are currently in + place (for example, in the About boxes). + +3. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software to + distribute a product, an acknowledgment in the product documentation + would be appreciated but is not required. + +4. Modified versions in source or binary form must be plainly marked as + such, and must not be misrepresented as being the original software. + + +Jordan Russell +jr-2008 AT jrsoftware.org +http://www.jrsoftware.org/ + diff --git a/info.exult.exult/data/blackgate/tmp/md5log.ini b/info.exult.exult/data/blackgate/tmp/md5log.ini new file mode 100644 index 0000000..63be282 --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/md5log.ini @@ -0,0 +1 @@ +[Setup] \ No newline at end of file diff --git a/info.exult.exult/data/blackgate/tmp/ok.png b/info.exult.exult/data/blackgate/tmp/ok.png new file mode 100644 index 0000000..8bcb1c0 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/ok.png differ diff --git a/info.exult.exult/data/blackgate/tmp/ok200.png b/info.exult.exult/data/blackgate/tmp/ok200.png new file mode 100644 index 0000000..df673dd Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/ok200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/progress_center.png b/info.exult.exult/data/blackgate/tmp/progress_center.png new file mode 100644 index 0000000..95f67b5 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/progress_center.png differ diff --git a/info.exult.exult/data/blackgate/tmp/progress_center200.png b/info.exult.exult/data/blackgate/tmp/progress_center200.png new file mode 100644 index 0000000..13e303c Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/progress_center200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/progress_left.png b/info.exult.exult/data/blackgate/tmp/progress_left.png new file mode 100644 index 0000000..0fcf26d Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/progress_left.png differ diff --git a/info.exult.exult/data/blackgate/tmp/progress_left200.png b/info.exult.exult/data/blackgate/tmp/progress_left200.png new file mode 100644 index 0000000..5ae9ab5 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/progress_left200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/progress_right.png b/info.exult.exult/data/blackgate/tmp/progress_right.png new file mode 100644 index 0000000..2a17ca0 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/progress_right.png differ diff --git a/info.exult.exult/data/blackgate/tmp/progress_right200.png b/info.exult.exult/data/blackgate/tmp/progress_right200.png new file mode 100644 index 0000000..4cba6eb Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/progress_right200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/scroll-handle-bot.png b/info.exult.exult/data/blackgate/tmp/scroll-handle-bot.png new file mode 100644 index 0000000..e02fecd Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/scroll-handle-bot.png differ diff --git a/info.exult.exult/data/blackgate/tmp/scroll-handle-top.png b/info.exult.exult/data/blackgate/tmp/scroll-handle-top.png new file mode 100644 index 0000000..3908d00 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/scroll-handle-top.png differ diff --git a/info.exult.exult/data/blackgate/tmp/slideshow.ini b/info.exult.exult/data/blackgate/tmp/slideshow.ini new file mode 100644 index 0000000..775e3cc --- /dev/null +++ b/info.exult.exult/data/blackgate/tmp/slideshow.ini @@ -0,0 +1,15 @@ +[Header] +count = 2 + +[Billboard 0] +url = https://www.gog.com/en/game/dungeons_2_a_chance_of_dragons +filename = 1441355933.jpg +timeout = 10000 +skippable = 0 + +[Billboard 1] +url = https://www.gog.com/en/game/star_wars_xwing_alliance +filename = 1421404763.jpg +timeout = 10000 +skippable = 0 + diff --git a/info.exult.exult/data/blackgate/tmp/track_center.png b/info.exult.exult/data/blackgate/tmp/track_center.png new file mode 100644 index 0000000..e505572 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/track_center.png differ diff --git a/info.exult.exult/data/blackgate/tmp/track_center200.png b/info.exult.exult/data/blackgate/tmp/track_center200.png new file mode 100644 index 0000000..b179ab7 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/track_center200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/track_left.png b/info.exult.exult/data/blackgate/tmp/track_left.png new file mode 100644 index 0000000..c9d4f3d Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/track_left.png differ diff --git a/info.exult.exult/data/blackgate/tmp/track_left200.png b/info.exult.exult/data/blackgate/tmp/track_left200.png new file mode 100644 index 0000000..8b1de8c Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/track_left200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/track_right.png b/info.exult.exult/data/blackgate/tmp/track_right.png new file mode 100644 index 0000000..54fb78c Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/track_right.png differ diff --git a/info.exult.exult/data/blackgate/tmp/track_right200.png b/info.exult.exult/data/blackgate/tmp/track_right200.png new file mode 100644 index 0000000..9772d75 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/track_right200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/trackbar_back.png b/info.exult.exult/data/blackgate/tmp/trackbar_back.png new file mode 100644 index 0000000..39f6668 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/trackbar_back.png differ diff --git a/info.exult.exult/data/blackgate/tmp/trackbar_back200.png b/info.exult.exult/data/blackgate/tmp/trackbar_back200.png new file mode 100644 index 0000000..399d482 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/trackbar_back200.png differ diff --git a/info.exult.exult/data/blackgate/tmp/trackbar_btn.png b/info.exult.exult/data/blackgate/tmp/trackbar_btn.png new file mode 100644 index 0000000..062c979 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/trackbar_btn.png differ diff --git a/info.exult.exult/data/blackgate/tmp/trackbar_btn200.png b/info.exult.exult/data/blackgate/tmp/trackbar_btn200.png new file mode 100644 index 0000000..b7b13f0 Binary files /dev/null and b/info.exult.exult/data/blackgate/tmp/trackbar_btn200.png differ diff --git a/info.exult.exult/data/jmsfx.flx b/info.exult.exult/data/jmsfx.flx new file mode 100755 index 0000000..2dc25a0 Binary files /dev/null and b/info.exult.exult/data/jmsfx.flx differ diff --git a/info.exult.exult/data/jmsisfx.flx b/info.exult.exult/data/jmsisfx.flx new file mode 100755 index 0000000..30ae699 Binary files /dev/null and b/info.exult.exult/data/jmsisfx.flx differ diff --git a/info.exult.exult/data/music/00bg.ogg b/info.exult.exult/data/music/00bg.ogg new file mode 100644 index 0000000..14b69e6 Binary files /dev/null and b/info.exult.exult/data/music/00bg.ogg differ diff --git a/info.exult.exult/data/music/01bg.ogg b/info.exult.exult/data/music/01bg.ogg new file mode 100644 index 0000000..7926ee8 Binary files /dev/null and b/info.exult.exult/data/music/01bg.ogg differ diff --git a/info.exult.exult/data/music/02bg.ogg b/info.exult.exult/data/music/02bg.ogg new file mode 100644 index 0000000..32b513c Binary files /dev/null and b/info.exult.exult/data/music/02bg.ogg differ diff --git a/info.exult.exult/data/music/03bg.ogg b/info.exult.exult/data/music/03bg.ogg new file mode 100644 index 0000000..c6dd344 Binary files /dev/null and b/info.exult.exult/data/music/03bg.ogg differ diff --git a/info.exult.exult/data/music/04bg.ogg b/info.exult.exult/data/music/04bg.ogg new file mode 100644 index 0000000..47e3335 Binary files /dev/null and b/info.exult.exult/data/music/04bg.ogg differ diff --git a/info.exult.exult/data/music/05bg.ogg b/info.exult.exult/data/music/05bg.ogg new file mode 100644 index 0000000..bcb7793 Binary files /dev/null and b/info.exult.exult/data/music/05bg.ogg differ diff --git a/info.exult.exult/data/music/06bg.ogg b/info.exult.exult/data/music/06bg.ogg new file mode 100644 index 0000000..ffdc294 Binary files /dev/null and b/info.exult.exult/data/music/06bg.ogg differ diff --git a/info.exult.exult/data/music/07bg.ogg b/info.exult.exult/data/music/07bg.ogg new file mode 100644 index 0000000..9335606 Binary files /dev/null and b/info.exult.exult/data/music/07bg.ogg differ diff --git a/info.exult.exult/data/music/08bg.ogg b/info.exult.exult/data/music/08bg.ogg new file mode 100644 index 0000000..b522de3 Binary files /dev/null and b/info.exult.exult/data/music/08bg.ogg differ diff --git a/info.exult.exult/data/music/09bg.ogg b/info.exult.exult/data/music/09bg.ogg new file mode 100644 index 0000000..2c2988b Binary files /dev/null and b/info.exult.exult/data/music/09bg.ogg differ diff --git a/info.exult.exult/data/music/10bg.ogg b/info.exult.exult/data/music/10bg.ogg new file mode 100644 index 0000000..79a83a3 Binary files /dev/null and b/info.exult.exult/data/music/10bg.ogg differ diff --git a/info.exult.exult/data/music/11bg.ogg b/info.exult.exult/data/music/11bg.ogg new file mode 100644 index 0000000..706ac3a Binary files /dev/null and b/info.exult.exult/data/music/11bg.ogg differ diff --git a/info.exult.exult/data/music/12bg.ogg b/info.exult.exult/data/music/12bg.ogg new file mode 100644 index 0000000..c2c3f0f Binary files /dev/null and b/info.exult.exult/data/music/12bg.ogg differ diff --git a/info.exult.exult/data/music/13bg.ogg b/info.exult.exult/data/music/13bg.ogg new file mode 100644 index 0000000..d78676f Binary files /dev/null and b/info.exult.exult/data/music/13bg.ogg differ diff --git a/info.exult.exult/data/music/14bg.ogg b/info.exult.exult/data/music/14bg.ogg new file mode 100644 index 0000000..88ec01a Binary files /dev/null and b/info.exult.exult/data/music/14bg.ogg differ diff --git a/info.exult.exult/data/music/15bg.ogg b/info.exult.exult/data/music/15bg.ogg new file mode 100644 index 0000000..3c648d7 Binary files /dev/null and b/info.exult.exult/data/music/15bg.ogg differ diff --git a/info.exult.exult/data/music/16bg.ogg b/info.exult.exult/data/music/16bg.ogg new file mode 100644 index 0000000..c1d420e Binary files /dev/null and b/info.exult.exult/data/music/16bg.ogg differ diff --git a/info.exult.exult/data/music/17bg.ogg b/info.exult.exult/data/music/17bg.ogg new file mode 100644 index 0000000..065ac5c Binary files /dev/null and b/info.exult.exult/data/music/17bg.ogg differ diff --git a/info.exult.exult/data/music/18bg.ogg b/info.exult.exult/data/music/18bg.ogg new file mode 100644 index 0000000..16707f5 Binary files /dev/null and b/info.exult.exult/data/music/18bg.ogg differ diff --git a/info.exult.exult/data/music/19bg.ogg b/info.exult.exult/data/music/19bg.ogg new file mode 100644 index 0000000..d3a80e1 Binary files /dev/null and b/info.exult.exult/data/music/19bg.ogg differ diff --git a/info.exult.exult/data/music/20bg.ogg b/info.exult.exult/data/music/20bg.ogg new file mode 100644 index 0000000..dee97a0 Binary files /dev/null and b/info.exult.exult/data/music/20bg.ogg differ diff --git a/info.exult.exult/data/music/21bg.ogg b/info.exult.exult/data/music/21bg.ogg new file mode 100644 index 0000000..ee35256 Binary files /dev/null and b/info.exult.exult/data/music/21bg.ogg differ diff --git a/info.exult.exult/data/music/22bg.ogg b/info.exult.exult/data/music/22bg.ogg new file mode 100644 index 0000000..c5aef45 Binary files /dev/null and b/info.exult.exult/data/music/22bg.ogg differ diff --git a/info.exult.exult/data/music/23bg.ogg b/info.exult.exult/data/music/23bg.ogg new file mode 100644 index 0000000..9faabce Binary files /dev/null and b/info.exult.exult/data/music/23bg.ogg differ diff --git a/info.exult.exult/data/music/24bg.ogg b/info.exult.exult/data/music/24bg.ogg new file mode 100644 index 0000000..4890ec8 Binary files /dev/null and b/info.exult.exult/data/music/24bg.ogg differ diff --git a/info.exult.exult/data/music/25bg.ogg b/info.exult.exult/data/music/25bg.ogg new file mode 100644 index 0000000..cc95a35 Binary files /dev/null and b/info.exult.exult/data/music/25bg.ogg differ diff --git a/info.exult.exult/data/music/26bg.ogg b/info.exult.exult/data/music/26bg.ogg new file mode 100644 index 0000000..ee13baa Binary files /dev/null and b/info.exult.exult/data/music/26bg.ogg differ diff --git a/info.exult.exult/data/music/27bg.ogg b/info.exult.exult/data/music/27bg.ogg new file mode 100644 index 0000000..0df0a00 Binary files /dev/null and b/info.exult.exult/data/music/27bg.ogg differ diff --git a/info.exult.exult/data/music/28bg.ogg b/info.exult.exult/data/music/28bg.ogg new file mode 100644 index 0000000..1f6b3fd Binary files /dev/null and b/info.exult.exult/data/music/28bg.ogg differ diff --git a/info.exult.exult/data/music/29bg.ogg b/info.exult.exult/data/music/29bg.ogg new file mode 100644 index 0000000..f4b832c Binary files /dev/null and b/info.exult.exult/data/music/29bg.ogg differ diff --git a/info.exult.exult/data/music/30bg.ogg b/info.exult.exult/data/music/30bg.ogg new file mode 100644 index 0000000..473b524 Binary files /dev/null and b/info.exult.exult/data/music/30bg.ogg differ diff --git a/info.exult.exult/data/music/31bg.ogg b/info.exult.exult/data/music/31bg.ogg new file mode 100644 index 0000000..8893438 Binary files /dev/null and b/info.exult.exult/data/music/31bg.ogg differ diff --git a/info.exult.exult/data/music/32bg.ogg b/info.exult.exult/data/music/32bg.ogg new file mode 100644 index 0000000..aab8d41 Binary files /dev/null and b/info.exult.exult/data/music/32bg.ogg differ diff --git a/info.exult.exult/data/music/33bg.ogg b/info.exult.exult/data/music/33bg.ogg new file mode 100644 index 0000000..77fae9a Binary files /dev/null and b/info.exult.exult/data/music/33bg.ogg differ diff --git a/info.exult.exult/data/music/34bg.ogg b/info.exult.exult/data/music/34bg.ogg new file mode 100644 index 0000000..a5d42ae Binary files /dev/null and b/info.exult.exult/data/music/34bg.ogg differ diff --git a/info.exult.exult/data/music/35bg.ogg b/info.exult.exult/data/music/35bg.ogg new file mode 100644 index 0000000..18249a7 Binary files /dev/null and b/info.exult.exult/data/music/35bg.ogg differ diff --git a/info.exult.exult/data/music/36bg.ogg b/info.exult.exult/data/music/36bg.ogg new file mode 100644 index 0000000..5c75305 Binary files /dev/null and b/info.exult.exult/data/music/36bg.ogg differ diff --git a/info.exult.exult/data/music/37bg.ogg b/info.exult.exult/data/music/37bg.ogg new file mode 100644 index 0000000..706f92f Binary files /dev/null and b/info.exult.exult/data/music/37bg.ogg differ diff --git a/info.exult.exult/data/music/38bg.ogg b/info.exult.exult/data/music/38bg.ogg new file mode 100644 index 0000000..160b8ad Binary files /dev/null and b/info.exult.exult/data/music/38bg.ogg differ diff --git a/info.exult.exult/data/music/39bg.ogg b/info.exult.exult/data/music/39bg.ogg new file mode 100644 index 0000000..f692d78 Binary files /dev/null and b/info.exult.exult/data/music/39bg.ogg differ diff --git a/info.exult.exult/data/music/40bg.ogg b/info.exult.exult/data/music/40bg.ogg new file mode 100644 index 0000000..d47f7ec Binary files /dev/null and b/info.exult.exult/data/music/40bg.ogg differ diff --git a/info.exult.exult/data/music/41bg.ogg b/info.exult.exult/data/music/41bg.ogg new file mode 100644 index 0000000..45ba589 Binary files /dev/null and b/info.exult.exult/data/music/41bg.ogg differ diff --git a/info.exult.exult/data/music/42bg.ogg b/info.exult.exult/data/music/42bg.ogg new file mode 100644 index 0000000..7e6c15f Binary files /dev/null and b/info.exult.exult/data/music/42bg.ogg differ diff --git a/info.exult.exult/data/music/43bg.ogg b/info.exult.exult/data/music/43bg.ogg new file mode 100644 index 0000000..f3e13a1 Binary files /dev/null and b/info.exult.exult/data/music/43bg.ogg differ diff --git a/info.exult.exult/data/music/44bg.ogg b/info.exult.exult/data/music/44bg.ogg new file mode 100644 index 0000000..8490b34 Binary files /dev/null and b/info.exult.exult/data/music/44bg.ogg differ diff --git a/info.exult.exult/data/music/45bg.ogg b/info.exult.exult/data/music/45bg.ogg new file mode 100644 index 0000000..6dd0aa2 Binary files /dev/null and b/info.exult.exult/data/music/45bg.ogg differ diff --git a/info.exult.exult/data/music/46bg.ogg b/info.exult.exult/data/music/46bg.ogg new file mode 100644 index 0000000..8959047 Binary files /dev/null and b/info.exult.exult/data/music/46bg.ogg differ diff --git a/info.exult.exult/data/music/47bg.ogg b/info.exult.exult/data/music/47bg.ogg new file mode 100644 index 0000000..1a61530 Binary files /dev/null and b/info.exult.exult/data/music/47bg.ogg differ diff --git a/info.exult.exult/data/music/48bg.ogg b/info.exult.exult/data/music/48bg.ogg new file mode 100644 index 0000000..95c7acd Binary files /dev/null and b/info.exult.exult/data/music/48bg.ogg differ diff --git a/info.exult.exult/data/music/52bg.ogg b/info.exult.exult/data/music/52bg.ogg new file mode 100644 index 0000000..4d773b2 Binary files /dev/null and b/info.exult.exult/data/music/52bg.ogg differ diff --git a/info.exult.exult/data/music/53bg.ogg b/info.exult.exult/data/music/53bg.ogg new file mode 100644 index 0000000..c81d4f2 Binary files /dev/null and b/info.exult.exult/data/music/53bg.ogg differ diff --git a/info.exult.exult/data/music/54bg.ogg b/info.exult.exult/data/music/54bg.ogg new file mode 100644 index 0000000..9a423f7 Binary files /dev/null and b/info.exult.exult/data/music/54bg.ogg differ diff --git a/info.exult.exult/data/music/55bg.ogg b/info.exult.exult/data/music/55bg.ogg new file mode 100644 index 0000000..f8f7e7a Binary files /dev/null and b/info.exult.exult/data/music/55bg.ogg differ diff --git a/info.exult.exult/data/music/56bg.ogg b/info.exult.exult/data/music/56bg.ogg new file mode 100644 index 0000000..03e1169 Binary files /dev/null and b/info.exult.exult/data/music/56bg.ogg differ diff --git a/info.exult.exult/data/music/57bg.ogg b/info.exult.exult/data/music/57bg.ogg new file mode 100644 index 0000000..ac3a445 Binary files /dev/null and b/info.exult.exult/data/music/57bg.ogg differ diff --git a/info.exult.exult/data/music/58bg.ogg b/info.exult.exult/data/music/58bg.ogg new file mode 100644 index 0000000..1061dae Binary files /dev/null and b/info.exult.exult/data/music/58bg.ogg differ diff --git a/info.exult.exult/data/music/59bg.ogg b/info.exult.exult/data/music/59bg.ogg new file mode 100644 index 0000000..1ba4573 Binary files /dev/null and b/info.exult.exult/data/music/59bg.ogg differ diff --git a/info.exult.exult/data/music/end01bg.ogg b/info.exult.exult/data/music/end01bg.ogg new file mode 100644 index 0000000..28efccb Binary files /dev/null and b/info.exult.exult/data/music/end01bg.ogg differ diff --git a/info.exult.exult/data/music/end02bg.ogg b/info.exult.exult/data/music/end02bg.ogg new file mode 100644 index 0000000..8e8c4e8 Binary files /dev/null and b/info.exult.exult/data/music/end02bg.ogg differ diff --git a/info.exult.exult/data/music/endcr01.ogg b/info.exult.exult/data/music/endcr01.ogg new file mode 100644 index 0000000..523e5bd Binary files /dev/null and b/info.exult.exult/data/music/endcr01.ogg differ diff --git a/info.exult.exult/data/music/endcr02.ogg b/info.exult.exult/data/music/endcr02.ogg new file mode 100644 index 0000000..696dd5d Binary files /dev/null and b/info.exult.exult/data/music/endcr02.ogg differ diff --git a/info.exult.exult/data/music/exult.ogg b/info.exult.exult/data/music/exult.ogg new file mode 100644 index 0000000..b3d39fe Binary files /dev/null and b/info.exult.exult/data/music/exult.ogg differ diff --git a/info.exult.exult/data/music/readme.txt b/info.exult.exult/data/music/readme.txt new file mode 100644 index 0000000..04a6436 --- /dev/null +++ b/info.exult.exult/data/music/readme.txt @@ -0,0 +1,52 @@ +Exult Digital Music (OGG) pack for Ultima7 Black Gate and Serpent Isle. +----------------------------------------------------------------------- +Music Pack version 1.0 + +IMPORTANT!! These files are only supported AFTER v1.0 of Exult. + +Here are the Digital Music tracks (encoded using OGG) for Exult. This music was recorded +directly from the Roland MT-32 synthesizer. The complete tracks are present for Black Gate +and Serpent Isle, these tracks being shared between the two games. + +With this pack you can enjoy the original Ultima7 music as it would have sounded on the +Roland MT-32 and as the composers originally intended. This is my tribute to the composers +of this music which I think was some of the best music composed for any computer game. + + +INSTALLATION +------------ +Create a music directory in exult/data (i.e. exult/data/music/) and extract the two ZIP +files U7MusicOGG_1of2.zip and U7MusicOGG_2of2.zip into this directory. +Start the game and select "DigitalMusic" from the "SETUP/Midi Convert" option and restart +the game. + + +Enjoy +Simon Quinn + + + +TECHNICAL DETAILS +----------------- +OGG is similar to MP3, but was chosen due it being a totally open and free implementation +and having better support in SDL_mixer. The music was recorded in OGG using 22KHz and the +lowest possible bit rate but are of high quality and in most cases you won't be able to +tell the difference in sound quality compared to listening directly with the original MT-32. +The 22Khz sampling rate limit doesn't really matter as the MT-32 voices rarely go above 11Khz. + +The recording was completed using MIDI tracks extracted from the two games' FLX files. The +SYSEX information was extracted from the MT-32 after running from the original Ultima7 - +which programmed the synth. Then a laborious process of loading the SYSEX file, playing +the relevant tunes and recording the music produced each of the music tracks. No processing +or volume dynamics compression was used, i.e. the loudest volume for the whole music reaches +a peak of around 0db so although many of the tracks appear quiet this is what the original +composers intended and matches how the game would have sounded with the original Ultima7. + +Once recording was finished the tracks were sorted into the correct order and mappings created +for Serpent Isle so that it could share the same tracks as used in Black Gate - track numbers are +different between the two and SI has a number of additional tracks. + +There are a number of SFX only "music" tracks (numbers 4 to 8 and 52) that you will not have +heard before in Exult because the sounds could not be mapped to General MIDI voices. These have +background SFX such as wind, birds chirping, frogs and various SFX inside dungeons. Subtle +sounds, but they add to the realism of the Ultima7 world. \ No newline at end of file diff --git a/info.exult.exult/data/music/si01.ogg b/info.exult.exult/data/music/si01.ogg new file mode 100644 index 0000000..fdc9b33 Binary files /dev/null and b/info.exult.exult/data/music/si01.ogg differ diff --git a/info.exult.exult/data/music/si02.ogg b/info.exult.exult/data/music/si02.ogg new file mode 100644 index 0000000..53abe7b Binary files /dev/null and b/info.exult.exult/data/music/si02.ogg differ diff --git a/info.exult.exult/data/music/si03.ogg b/info.exult.exult/data/music/si03.ogg new file mode 100644 index 0000000..98a7ca9 Binary files /dev/null and b/info.exult.exult/data/music/si03.ogg differ diff --git a/info.exult.exult/data/music/si04.ogg b/info.exult.exult/data/music/si04.ogg new file mode 100644 index 0000000..75f5fe1 Binary files /dev/null and b/info.exult.exult/data/music/si04.ogg differ diff --git a/info.exult.exult/data/music/si05.ogg b/info.exult.exult/data/music/si05.ogg new file mode 100644 index 0000000..89feec4 Binary files /dev/null and b/info.exult.exult/data/music/si05.ogg differ diff --git a/info.exult.exult/data/music/si06.ogg b/info.exult.exult/data/music/si06.ogg new file mode 100644 index 0000000..0dde4a0 Binary files /dev/null and b/info.exult.exult/data/music/si06.ogg differ diff --git a/info.exult.exult/data/music/si07.ogg b/info.exult.exult/data/music/si07.ogg new file mode 100644 index 0000000..ecf0966 Binary files /dev/null and b/info.exult.exult/data/music/si07.ogg differ diff --git a/info.exult.exult/data/music/si08.ogg b/info.exult.exult/data/music/si08.ogg new file mode 100644 index 0000000..c6f43c5 Binary files /dev/null and b/info.exult.exult/data/music/si08.ogg differ diff --git a/info.exult.exult/data/music/si09.ogg b/info.exult.exult/data/music/si09.ogg new file mode 100644 index 0000000..2504c3e Binary files /dev/null and b/info.exult.exult/data/music/si09.ogg differ diff --git a/info.exult.exult/data/music/si10.ogg b/info.exult.exult/data/music/si10.ogg new file mode 100644 index 0000000..a3834d1 Binary files /dev/null and b/info.exult.exult/data/music/si10.ogg differ diff --git a/info.exult.exult/data/music/si11.ogg b/info.exult.exult/data/music/si11.ogg new file mode 100644 index 0000000..f324bff Binary files /dev/null and b/info.exult.exult/data/music/si11.ogg differ diff --git a/info.exult.exult/data/music/si12.ogg b/info.exult.exult/data/music/si12.ogg new file mode 100644 index 0000000..6bd292d Binary files /dev/null and b/info.exult.exult/data/music/si12.ogg differ diff --git a/info.exult.exult/data/music/si13.ogg b/info.exult.exult/data/music/si13.ogg new file mode 100644 index 0000000..bd3353b Binary files /dev/null and b/info.exult.exult/data/music/si13.ogg differ diff --git a/info.exult.exult/data/music/si14.ogg b/info.exult.exult/data/music/si14.ogg new file mode 100644 index 0000000..4b84859 Binary files /dev/null and b/info.exult.exult/data/music/si14.ogg differ diff --git a/info.exult.exult/data/readme_jmsfx.txt b/info.exult.exult/data/readme_jmsfx.txt new file mode 100644 index 0000000..0f26ab0 --- /dev/null +++ b/info.exult.exult/data/readme_jmsfx.txt @@ -0,0 +1,4 @@ +These sound effects were contributed by Joseph Morris + Joseph Morris + http://www.it-he.org + diff --git a/info.exult.exult/data/readme_jmsisfx.txt b/info.exult.exult/data/readme_jmsisfx.txt new file mode 100644 index 0000000..0f26ab0 --- /dev/null +++ b/info.exult.exult/data/readme_jmsisfx.txt @@ -0,0 +1,4 @@ +These sound effects were contributed by Joseph Morris + Joseph Morris + http://www.it-he.org + diff --git a/info.exult.exult/data/readme_sqsfxbg.txt b/info.exult.exult/data/readme_sqsfxbg.txt new file mode 100644 index 0000000..3e72aed --- /dev/null +++ b/info.exult.exult/data/readme_sqsfxbg.txt @@ -0,0 +1,14 @@ +Ultima7 Black Gate for Exult SFX pack. + +version 1.1 + +Here are the SFX (Sound Effects) for use with Exult Ultima7 Black Gate. +These have been recorded directly from a Roland MT-32. This pack has +been designed to replace the jmsfx.flx pack and goes in the DATA +subdirectory. Just rename the entry under + in the exult.cfg file to sqsfxbg.flx. + +Changes since 1.0: Moved sound for Grandfather clock. + +Enjoy +Simon Quinn \ No newline at end of file diff --git a/info.exult.exult/data/readme_sqsfxsi.txt b/info.exult.exult/data/readme_sqsfxsi.txt new file mode 100644 index 0000000..b2e3a3b --- /dev/null +++ b/info.exult.exult/data/readme_sqsfxsi.txt @@ -0,0 +1,14 @@ +Ultima7 Serpent Isle for Exult SFX pack. + +version 1.1 + +Here are the SFX (Sound Effects) for use with Exult Ultima7 Serpent Isle. +These have been recorded directly from a Roland MT-32. This pack has been +designed to replace the jmsfxsi.flx (FM sounds) pack and goes in the DATA +subdirectory. Just rename the entry under + in the exult.cfg file to sqsfxsi.flx. + +Changes since 1.0: Moved sound for Grandfather clock. + +Enjoy +Simon Quinn \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/386STEP.EXE b/info.exult.exult/data/serpentisle/386STEP.EXE new file mode 100644 index 0000000..9d25d05 Binary files /dev/null and b/info.exult.exult/data/serpentisle/386STEP.EXE differ diff --git a/info.exult.exult/data/serpentisle/DOSBOX/DOSBox.exe b/info.exult.exult/data/serpentisle/DOSBOX/DOSBox.exe new file mode 100644 index 0000000..557396c Binary files /dev/null and b/info.exult.exult/data/serpentisle/DOSBOX/DOSBox.exe differ diff --git a/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_AUTHORS.txt b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_AUTHORS.txt new file mode 100644 index 0000000..eb365e5 --- /dev/null +++ b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_AUTHORS.txt @@ -0,0 +1,12 @@ +The DOSBox Team +--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frössman +Dean Beeler +Sebastian Strohhäcker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net diff --git a/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_COPYING.txt b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_COPYING.txt new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_COPYING.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_INSTALL.txt b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_INSTALL.txt new file mode 100644 index 0000000..cc48f8e --- /dev/null +++ b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_INSTALL.txt @@ -0,0 +1,104 @@ +Things needed for compilation. + +SDL + The Simple DirectMedia Library available at http://www.libsdl.org + The dll distributed with the windows version of DOSBox is slightly + modified. You can find the changes in the sourcepackage of DOSBox + (src/platform/sdl-win32.diff). If you want the patched sourcetree + send us an email. (see README) + Licensed under LGPL + Note that only version 1.2 and its subversions (1.2.8, 1.2.13 etc.) + are currently supported. + +Curses (optional) + If you want to enable the debugger you need a curses library. + ncurses should be installed on just about every unix distro. + For win32 get pdcurses at http://pdcurses.sourceforge.net + License: Open source + +Libpng (optional) + Needed for the screenshots. + For win32 get libpng from http://gnuwin32.sourceforge.net/packages.html + See http://www.libpng.org/pub/png/ for more details. + License: Open Source + +Zlib (optional) + Needed by libpng. + For win32 get libz (rename to zlib) from http://gnuwin32.sourceforge.net/packages.html + See http://www.zlib.net for more details. + License: Open Source + +SDL_Net (optional) + For modem/ipx support. Get it from http://www.libsdl.org/projects/SDL_net/ + Licensed under LGPL + +SDL_Sound + For compressed audio on diskimages. (optional) + This is for cue/bin cdrom images with compressed (mp3/ogg) audio tracks. + Get it from http://icculus.org/SDL_sound + Licenced under LGPL + +ALSA_Headers + (optional) + for Alsa support under linux. Part of the linux kernel sources + Licensed under LGPL + +If you want compile from the CVS under a unix system, you'll also need +automake (>=1.6), autoconf(>=2.50). Should be available at http://www.gnu.org + +For building on unix systems. +If you are building from the cvs run ./autogen.sh first before doing the following. + +1. ./configure +2. make + +In step 1 you could add the following switches: +--enable-debug + enables the internal debugger. --enable-debug=heavy enables even more + debug options. DOSBox should then be run from a xterm and when the sdl- + window is active press alt-pause to enter the debugger. + +--enable-core-inline + enables some memory increasing inlines. This greatly increases + compiletime for maybe a increase in speed. + +--disable-fpu + disables the emulated fpu. Although the fpu emulation code isn't + finished and isn't entirely accurate it's advised to leave it on. + +--disable-fpu-x86 + disables the assembly fpu core. Although relatively new the x86 fpu + core has more accuracy then the regular fpu core. + +--disable-dynamic-x86 + disables the dynamic x86 specific cpu core. Although it might be + be a bit unstable, it can greatly improve the speed of dosbox on x86 + hosts. + Please note that this option on x86 will result in a different + dynamic/recompiling cpu core being compiled then the default. + For more information see the option --disable-dynrec + +--disable-dynrec + disables the recompiling cpu core. Currently x86 and x86_64 only. + You can activate this core on x86 by disabling the dynamic-x86 core. + +--disable-dynamic-core + disables all dynamic cores. (same effect as + --disable-dynamic-x86 --disable-dynrec) + +--disable-opengl + disables OpenGL-support (output mode that can be selected in the + DOSBox configuration file). + +--disable-unaligned-memory + disables unaligned memory access. + +Check the src subdir for the binary. + +NOTE: If capslock and numlock appear to be broken. open +src/ints/bios_keyboard.cpp and go to line 30 and read there how to fix it. + + +Build instructions for VC++6 +Don't use VC++ 6: it creates faulty code in core_normal.cpp +Later Visual Studio versions work fine (vs2003/.net, vs2005, vs2008) diff --git a/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_NEWS.txt b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_NEWS.txt new file mode 100644 index 0000000..adc6875 --- /dev/null +++ b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_NEWS.txt @@ -0,0 +1,673 @@ +0.74 + - Several small game specific fixes/hacks/support. (Offensive, + Roadhog, GTA installer, Kingdom O' Magic soundcard detection, + Pirate booter, Armored Fist installer) + - Add the S3-specific 640x480 256 color mode. (fixes regression in "Wooden + Ships and Iron Men" and "I Have No Mouth And I Must Scream") + - Fix a stack overflow that could crash DOSBox. + - Add fake microphone input. (fixes Talking Parrot) + - Modify adlib turn off code, so that it doesn't turn off in + cases where the same sound is repeated over and over again. + - Several small fixes to the CDROM audio code. (HOMM2, Redneck + Rampage and others) + - Several improvements to the CDROM emulation code. (fixes Alpha + Storm and GT Racing 97) + - Some small CPU fixes that might fix something. + - Handle opcode 0xff subcode 7 as invalid instruction. (fixes dif-2 & others) + - Some hercules fixes. (Testdrive) + - Improve support for blanked parts that wrap around to the start of + the screen. (fixes Magic Circle demo and Sid&Al) + - Remove old OPL cores as the new ones seem to work very nicely. + - Modify movie recording code so that the movies aren't corrupt when + you exit dosbox without stopping the movie. + - Change RGB3x scaler to look more pretty. + - Improve initial register values compatility of the GUS. + - Added autodetection for Gameblaster. (games can find it now) + - Change render preferences a bit to be more compatible with Windows 7. + - Add DOS fixes to terminate program. (fixes Fortune Teller) + - Add FFREEP. (fixes Trucks) + - Improve FPU ST80 in C mode when writing zero. (fixes Antigok) + - Add special int10 scanline function. (fixes mz700 and probably lots + of games that mess with them) + - Fix scrolling in rarely used video modes. (fixes Orphee) + - Modify game specific hacks a bit so that Kick off 3 works again. + - Lots of fixes to the INT10 video parameter table. (Seven spirits + of ra and others) + - Add VGA blanking in machine=vgaonly. (used by Alien Carnage) + - CGA, PCJr, Tandy: Add video blanking, change display start latch + timing, sync pulse width correction. + - PCJr, Tandy: implement vertical retrace interrupt. + - PCJr, CGA: line-by-line video emulation. + - PCJr: support on-screen change of color modes 4medium to 16low. (used + by Ghostbusters booter) + - Hercules: Add green and amber monochrome support. + - All machines: only update the video timing when needed. (Jungle Hunt, + others that synchronize to the video screen might profit) + - Several small DOS fixes. + - Some UMB related fixes. (The Legacy without UMB) + - Fix version number of DSP for SB 1.5. (fixes a few games) + - Several VGA emulation improvements. (Allertone football manager) + - Some Tandy fixes. (Mech Warrior) + - Small improvements and fixes to the OPL emulation. + - Add low level Tandy DAC emulation. + - Some EMS fixes. (fixes Mortal Kombat and others) + - Change SoundBlaster DSP reset mechanism, add sb irq acknowledge logic. + (fixes stmik-based applications) + - Some interrupt pointer location modifications. (fixes Tinker Tales) + - Some fixes to the BOOT code. (fixes Last Mission) + - Respect write-only file information. (fixes Champions of Zulala) + - Some RTC fix. (fixes Tully Bodine and others) + - Improve mouse emulation to work better with Water World. + - Hopefully fix the translation of the configuration file. + - Speed up and fixes for the recompiler core. (pitfall2 pcjr) + - Change memory start location. (fixes 7th Guest installer) + - Several fixes to the batch file handling. (Shift and + use the typed first %0 instead of the parsed %0) + - Improve file redirection and redirected line ends. (fixes + Phantasmagoria 2 DOS installer) + - Fix compilation with new MAC os X version. + - Add 16C550A FIFO support to the serial port emulation. + - Improve modem emulation to get higher speeds. + - Change default samplerates to 44100, blocksize to 1024 and prebuffer to 20, + so that hopefully certain soundcards produce more fluent sound playback. + - Add some rarely used, but for some games critical flags to + the internal commands. + - Add -userconf flag, so that the userspecific configuration can + easily be used together with -conf configfile. + - Improve internal timing with repeating timers (especially with + the dynamic core). + +0.73 + - Add two new opl2+opl3 emulators. (better speed, different implementation + approach) + - Improved DRO recording/better file structure. + - Add EGA emulation. + - Add special vga machine mode. Supports more of the exotic tricks like + changing the palette during screen updates, 9x16 fonts etc. + - Added special machine modes for the following svga cards: + - S3 + - Paradise + - Tseng + - Fix problems with the vga split line feature. + - Improve vesa emulation. + - Add optional selection of old vesa mode for games that don't work + with certain vesa features. + - Improve video BIOS emulation to behave more like a real bios. + - Fixes for emulated 4bpp graphics modes. + - Fixes to paging system. + - Various fixes and improvements for the recompiling core. + - Add arm backend for the recompiling core. + - Add some mscdex quirks when dealing with files that are exactly 8.3 long. + - Small fixes to batch file handling. + - Small fixes to the XMS memory handling. + - Various fixes for aligned memory on hosts that want it. + - Various improvements to the mouse. + - Fixes and small speed ups to the debugger. + - Fix and improve lot's of compilation problems. (curses detection, + GCC 3.4 and GCC 4.X fixes) + - Added some basic auto keyboard layout handling. (windows only currently) + - Add basic support for evdev keyboard driver. + - Various fixes to the timer. (improve mode 2 timer changes, + implement mode 1, improve gate2 handling) + - Add audio extraction and mci audio support. Should enable CDROM audio + for Vista and adds volume control. + - Improve the directory cache speed a lot, especially with mounting slow + media like network paths. + - Various fixes to the create temporary file call. + - Don't keep batchfiles open during execution. Allows rewriting of the + active batchfile. (menu programs use this trick sometimes) + - Fix problems with filenames with 2 extensions. + - Add some more lowlevel dos tables. + - Fixes to hercules emulation. + - Fix flag handling for special case of ROR. + - Make the batchfile handling in regard to IF more flexible. + - Fixes to scrolling/panning feature. + - Add prefetch queue emulation. + - Make the emulated cpu type selectable. This is mainly the + identification commands and the way paging works. + - Some special EMS functionality added. (OS handles, zero-page handling) + - Improve support for EMS when booting a different OS. + - Improve cdrom speed detection by games. + - Improve stability of cycle guessing code, when there is background + activity. + - Fix various mscdex and cdrom detection schemes. + - Added Coremidi support on Mac OS X. + - Improve support for DOS devices when used to detect the existance + of directories in various ways. + - Add IRQ 2 emulation on VRET. (ega only) + - Added video parameter table and video state functionality. + - Increase default freespace to 250 MB. + - Some fixes to the fat filesystem handling for disk images. + - Some soundblaster fixes and command additions. + - Fix mixer 16bit direct transfers on bigendian hosts. + +0.72 + - Fixed unitialized variable in joystick. (Fixes crashes on Vista and + Mac OS X) + - Some bugfixes and speedups to the 64 bit recompiling core. + - Fixed sign flag on soundblaster dma transfers (Space Quest 6 intro) + - Fixed a bug in keyboard layout processing code and fixed certain + layouts. + - Fixed Dreamweb. + - Improved speed unlocking when running cycles=max. + - Fixed a crash related to the tab completion in the shell. + - Improved aspect correction code. Should now be like how a real monitor + handles it. + - Fixed a bug in the xms status report code. (Blake Stone 1.0 shareware) + - Added a lot more keyboard layouts. + - Fix crash related to changing the scaler before a screen was created. + - Hopefully fixed compilation on *bsd. + - Enabled auto cpu core selection for recompiling core as well. + - Made the used joystick selectable when 4axis is specified. + - Added some hints for inexperienced DOS users to the shell. + +0.71 + - Add a new recompiling cpu core, which should be easier to port. + - Add 64 bit version of the recompiling core. + - Add mipsel 32 bit version of the recompiling core. + - Fix a few small problems with FCBs. (fixes Jewels of darkness and + cyrus chess) + - Raise some more exceptions. (fixes vbdos) + - Fix a few problems with the dynamic core. (fixes Inner Words, + Archmimedean Dynasty and others) + - Improve/Fix fallback code for certain graphics cards. + - Fix a few cd audio related bugs. + - Add an undocumented MSCDEX feature. (Fixes Ultimate Domain) + - Fix some pcspeaker mode. (fixes Test Drive and similar games) + - Improve dos keyinput handling. (fixes Wing Commander 3 exit dialog) + - Remove Exit condition on fully nested mode. (fixes some demo) + - Add image file size detection. + - Add/Fix some ansi codes. (fixes PC Larn and certain versions of + infocom games) + - Several general DOS fixes. (fixes nba95, hexit and various other games) + - Add some valid input checks. (fixes 3d body adventure and similar + games) + - Fix digital joystick centering problem. + - Reenable textmode 54 and 55. + - Fix a pelmask problem with univbe 5.0 lite. (fixes Panzer General) + - Fix minor mixer underflow. + - Some general image and bios disk emulation fixes. + - Hopefully fix compilation on BSD and darwin. + - Try using ioctl cdrom access by default if possible. + - Fix some svga detection routine. (fixes Grandest Fleet 2 and Bobby Fischer + Teaches Chess) + - You can now close DOSBox using the status window in win32. + - Add support for NX enabled systems. + - Fix a casting error which only showed with certain compilers. (fixes + various games under mac os x and 64 bit linux) + - Improve timer and add gate 2 support. (fixes various games and + joystick problems) + - Improve mouse. Add undocumented backdoor. (fixes Last half of Darkness, + PC-BLOX and others) + - Add/improve support for ~ and ~username in all commands. + - Fix a font problem with the pcjr/tandy. (fixes personal deskmate 2) + - Change dma routine a bit. (fixes ticks in sound in various games) + - Allow read-only diskimages to be booted. (fixes various booter + games) + - Add basic hidden file support on cdrom images. (fixes Player + Manager 2) + - Add some rarely used functionality to the int10 mode setup. (fixes + WW2 Battles of the South pacific) + - Add ability to force scaler usage. + - Speed up flag generation and make it more 386-like. + - Some colourful feedback in the mapper. + - General code cleanup. + +0.70 + - Improve register handling and support with XMS. + - Fix some issues with deleting open files.(windows only issue) + - Add dummy LPT1 class. (windows only issue) + - Improve some of the internal dos commands. (choice, copy and shift) + - Improve ROM area. (for games that use it for random numbers or + overwrite it as some sort of detection thing) + - Improve compatibility of dynamic core by making it handle certain + pagefaults earlier. + - Move internal dos tables around so we have more umb memory. + - Add some dos tables. + - Dynamic core supports io exceptions. + - Move some interrupt handlers to XT Bios locations. + - Add a dynamic fpu on x86. + - Improve fpu on non-x86. + - Trapflag gets strict priority over hardware IRQs. + - Trapflag support for the dynamic core. + - Add dummy TRx handling. + - Fix a few rarely used character functions. + - Improve auto cycle guessing code. + - Improve and extend the joystick support. + - Add autofire support. + - Improve the mapper so you can map keys to the joystick and vice versa. + - A few game specific video card fixes. + - Fix some 64 bit cpu bugs. + - Add support for certain cdrom detection schemes. + - Improve HSG/Red Book support. + - Improve MSCDEX. + - Improve dynamic core support under intel macs. + - Add basic support for clipper programs. + - Add support for different keyboard layouts. + - Add auto core guessing. + - Fix a few flags bugs. + - Fix a few small cpu bugs. + - Improve soundblaster detection rate by various programs. + - Improve EMS emulation. (allow mapping of non standard regions) + - Improve keyboard input codes on various OS-es. + - Fix problems with filenames having stackdata in them. + - Changed a few basic operations in DOSBox so they take emulated time. + - Improve dos ioctl functions. + - Extend cpu core so they are capable of detecting and raising a few + more exception types. + - Improve DOS functions when dealing with virtual drive. + - Improve FAT drives. + - Better handling of volume-labels in file functions. + - Image disk cycling capability. (prompt) + - Try to reduce the impact of using an analog joystick. + - Several measures to avoid code invalidation on certain types + of self modification in the dynamic core. + - Add dynamic core memory function inlining. + - A few small mouse improvements. (some games are using things they + shouldn't) + - Add nullmodem emulation.(h-a-l-9000) + - Some small cga and hercules fixes. + - Add more scalers (hq2x/hq3x/sai). (Kronuz) + - Change configuration file loading support. It now supports + multiple configuration files. + - Make dynamic core capable of running some win32s programs. + - Fix and add some rare soundblaster modes. (Srecko) + - Better soundblaster mixer controls. (Srecko) + - Make soundblaster installation under windows much easier. + - Add device control channel handling. + - GEMMIS support (ems under windows). + - Support more colours in win 3. (vasyl) + - Don't show unmounted drives in windows filemanager. + - Fix some bugs in the int13 handler. + - Simulate some side-effects of bios interrupt handlers on flags. + - Add IPX functions needed by netbios. + - Make ports take emulated time. + - Tabcompletion is now aware of the CD command. + - Add suppport for the dac pel mask. + - Fixes to hercules emulation, better detection and bank switching. + - Fixes to tandy emulation, 640x200x16 mode and different sizes bank. + - EGA/VGA memory changes detection for faster rendering. + - Gus 16 bit fixes. + - Many timer improvements. + - Some pcjr fixes. + - Some booter fixes. + - Many small fixes. + +0.65 + - Fixed FAT writing. + - Added some more missing DOS functions. + - Improved PIC so that it actually honours irq 2/9. + - Improved intelligent MPU-401 mode so that more games work with it. + - Some mouse fixes. + - Changed DMA transfers a bit so they bypass the paging tables. + - Added S3 XGA functionality. + - Improved paging so that read and write faults are handled differently. + - Rewrote exception handling a bit (no exception 0x0B with dos4gw anymore). + - Added IO exceptions in all but the dynamic core. + - Some ems improvements. + - Added midi-device selection code for the windows hosts. + - Fix crashes/segfaults related to the disabling of the pcspeaker. + - Added some more FILES=XX detection tricks. + - Fixed some vga detection schemes. + - Fixed screenshot corruption when using -noconsole in a read-only directory. + - Fix wrong scaled screenshots. + - Added some hidden file functions when using diskimages. (helps with cdrom + detection schemes) + - Fixed a bug in the mixer code, that muted the music in certain games. + - Added an assembly fpu core. + - Made the shell more flexible for batch files. + - Check for unaligned memory acces fixes hangups on ARM processors. + - Some 64 bit fixes. + - Added code to change configuration at runtime. + - Improved ADPCM emulation. + - Fixed a few cpu instructions. + - Always report vesa 2.0 and fix some colour issues with vesa games. + - Fix video mode 0x06 and 0x0a. + - Improvements to the joystick emulation. 4 buttons are supported as well. + - Add VCPI emulation for Origin games. + - Fixed a lot of things in the boot code. Most booters work now. + - Lots of improvements to the IPX emulation. + - Rewritten modem emulation. Should work with more games. + - Improvements to the dos memory managment routines. + - Add UMB (upper memory blocks) support. + - Emulate the pause key. + - Improve Composite CGA mode emulation. + - Lots of vga compatibility changes. + - Improved support for chained video modes. + - Improved mode and palette handling in cga modes. + - Mount accepts ~ now. + - Added a few of the EGA RIL functions. + - Added TandyDAC emulation. + - OS/2 support. + - Improved and speed up the dynamic cpu core. + - Fix some errors in the CD-ROM emulation layer. + - Added an automatic work-around for some graphics chipsets. + - Add PCjr support. + - Allow mousedriver to be replaced. Fixes a few games that come with their + own (internal) driver. + - Improved dynamic cpu core so it can handle pagefaults and some obscure + types of self-modifying code. + - Added -noautoexec switch to skip the contents of [autoexec] in the + configuration file. + - Improved v86 mode emulation (mainly for Strike Commander). + - Improved timer behavior. + - Improved extended keyboard support. + - Enhanced and added several DOS tables. + - Made core_full endian safe. + - Made pagefaults endian safe. + - Add support for moviecapturing + - Add support for 15/16/32 bit videomodes. + - Add some more VESA modi (4 bit). + - Add 1024x768 output. + - Changed screenrendering so it only draws changes to the screen. + - Allow remapping of the EMS page when the dma transfer was started from + the page frame + - Made EMS and DMA work together when playing from a mapped memory page. + - Renamed several configuration options, so that they are unique. + - Merged mpu and intelligent into one option. + - Merged fullfixed and fullresolution. + - Extended keys should be handled better. + - F11 and F12 work. + - Compilation fixes for various platforms. + - Fix a few crashes when giving bad input. + - Removed interp2x and added few new scalers. + - Reintroduce the lockfree mouse. (autolock=false) + - Add a larger cache for the dynamic cpu core. + - Improved soundblaster DSP, so it gets detected by creative tools. + - Lots of bugfixes. + - Even more bugfixes. + +0.63 + - Fixed crash with keymapper (ctrl-f1) and output=surface. + - Added unmounting. + - Fixed multiple issues with drive labels. + - Fixed most if not all FILES=XX problems. + - Added redirection in the shell. + - Fixed crashes with subst. + - Fixed multiple crashes with the drive images support. + - Added a missing fpu instruction. + - Fixed some cpu and fpu instructions. + - Fixed a small bug related to font loading. + - Rewrote the devices support. + - Added capslock/numlock checks on startup. + - Fixed wave writing. + - A few internal DOS fixes. + - Timer fixes for the hybrid loader. + - Some small soundblaster fixes. + - The drive cache can now be cleared by a keycombo. (CTRL-F4) + - A few keyboard fixes. + - Compilation fixes on various platforms. + - Quite some debugger improvements. + - Fixed dir only showing files after the first run on cdrom drives. + - Added some cdrom detection checks. + - Enabled insert in the shell. (Easier editing of commands) + - Changed order in which executables appear with tab-completion. + - Fixed some issues with raw opl recording and using a slightly different + format + +0.62 + - Added blinking support in the shell and some color fixes. + - Fixed commandline parsing when .bat files involved (fixes -exit) + - Fixed issues with tabs in commandline not being processed correctly. + - Cleaned/improved shutdown sequence. + - Added some more bios functions (wait and delay functions). + - Made our XMS driver conform the specs better. (c2woody) + - Added support for some more ems functions. + - Added intelligent mpu401 emulation. (Srecko) + - Added soundblaster 16 emulation. + - Rewrote GUS emulation to sound more authentic. + - Improved pc speaker emulation. + - Added an internal (programmable) mixer. + - Added support a few soundblaster/adlib detection routines. + - Fixed lot's of bugs related to DMA transfers. + - Added interpolating prebuffering mixer routines. + - Added recording of OPL commands and raw midi. + - Fixed some bugs with the wave recording. + - Changed sensitivity settings of the mouse. + - Added ps2 mouse-emulation in bios interrupts (c2woody). + - Fixed some bugs with mouse emulation limits. + - Fixed a bug with an unterminated string in the drivelabel. + - Changed file search routines a bit to be more compatible. + - Added support for attribute-searching with fcb's. + - Added basic SDA. + - Added TPA and DIB. + - Added Lot's of missing dos tables (c2woody). + - Changed psp and dta functions to use dta. + - Returned filename in ds:dx in create-random-file (c2woody). + - Fixed a bug with date and time used on open files. + - Some mscdex fixes. + - Added the -version switch, which makes dosbox report its version. + - Added a keymapper. + - Added basic IPX emulation. + - Added cdrom iso support and floppy images support. + - Added the possibity to boot another dos version. + - Added Serial passthrough support (win32 only). + - Added the possibility to pause dosbox. + - Changed OpenGL so that it is initialized only when used. + - Make dosbox run at higher priority when active and lower when inactive. + - Added direct draw output support (win32 only). + - Added current running program to title bar. + - Rewrote video emulation to support new scalers. + - Added new graphics scalers like advmame3x,tv2x. + - Added a support for a few anti-debugger tricks. + - Improved the handling of the tab-key. + - Improved support for the numeric keyboard. + - Fixed a few cpu opcodes. + - Added cpu core simple (for lowerend machines) + - Fixed some nasty bugs in the dynamic cpu core. + - Added a few (rarely used) fpu opcodes. + - Fixed various issues with GCC 3.4. + - Many internal timer improvements (PIT and PIC). + - Added some more PIC commands (c2woody). + - Added BCD counting to the timers. + - Fix some vesa functions. + - Add some basic support for 132x25 and 132x45 textmodes. + - Improved Tandy emulation a lot. + - Lowered cpu usage when dosbox is idle. + - Allow virtualisation of some basic IO-ports (c2woody). + +0.61 + - Added a beta dynamic cpu for x86 hosts (very unstable) + - Added opengl and hardware overlay display output + - Rewrote the vga screen updates to go in lines + - Added paging and v86 support to cpu emulation + - Added a config option to simulate a certain type of machine + - Added hercules graphics emulation + - Made CGA/TANDY modes more compatible + - Updated textmode drawing routines to support blinking colors + - Fixed VESA set page function that was documented wrong + - Fixed some wrongly emulated cpu opcodes. + - improved exception handling + - debugger: fixes; logging of gdt,lgt,idt, new commands(Fizzban) + - fixed some mscdex issues (drive letter header error, added get directory entry) + - added/fixed some bios funcs + - added some rarely used xms functions (thanks c2woody!) + - implemented GUS emulation + - Added 16-bit DMA support (for GUS and eventually SB16) + - Fixed many small bugs in filehandling routines + - Many small FPU fixes (c2woody/Fizzban) + - Some keyboard improvements (pharlab games) + - Some Timer and cmos/rtc fixes (Mirek/Srecko/Others) + - Lot's of mouse fixes (Help from various people) + - Enabled internal modem + - Made the DOS parsing routines a bit more flexible + - Added Subst (Srecko) + - Added cdrom ioctl support for linux (prompt) + - Many internal DOS fixes: memory/files/datastructures. + - Got some help from c2woody in allowing more than 1 irq being served + - Disabled DPMI (not needed anymore. DOSBox handles almost every extender) + - Search configfile in $HOME directory if none present in current directory + - Added another way to switch to protected mode. (Thanks Morten Eriksen!) + - Fixed some odd badly documented behaviour with PSP/DTA + - Added some warnings on opening of readonly files in writemode(DOS default). + - Many shell enhanchements + - Fixed a win32 specific bug dealing with filenames starting with a "." + - Fixed some bugs with the directory structure: not found/can't save errors + +0.60 + - rewrote memory system for future paging support + - fixed several EMS and XMS bugs and rewrite for new memory system + - added some support for tandy video modes + - added MAME Tandy 3 voice emulation + - added MAME CMS/GameBlaster emulation + - added serial port emulation with virtual tcp/ip modem (somewhat buggy) + - sound blaster emulation is now sb pro 2.0 compatible + - added basic support for 32-bit protected mode + - VGA now tries to emulate an S3 Trio 64 card with 2 MB + - VESA 2.0 support for some 256 color modes + - rewrote large piece of video bios code for better compatibility + - added support for the not inheritance flags. + - created functions for creating child psp. + - updated errorcodes of findfirst (thanks Mirek!) + - rewrote loggingsystem to generate less warnings + - added dos protected mode interface (dpmi) + - added cdrom label support + - improved cdrom audio playing + - fixed and improved directory cache + - debugger shows selector- and cpu mode info + - added SELINFO (selector information) command to debugger + - added reference counting for dos files + - added tab-completion + - added basic fpu support. + - fixed several bugs with case sensitive filesystems. + - added more shell commands and improved their behaviour. + - mouse improvements. + - real time clock improvements. + - DMA fixes. + - Improved .BAT file support. + +0.58 + - fixed date and time issues with fcbs + - added more commands to the internal Shell + - corrected config system when a old configfile was used + - fixed cga put and get pixel + - fixed some vga register getting reset to wrong values + - improved support for foreign keyboards + - improved joystick support + - made dosbox multithreaded again + - lot's of soundblaster fixes + - dma fixes + - cdrom support + - midi support + - added scale2x + - reenabled screenshot support + - joystick support fixes + - mouse improvements + - support for writing wavefiles + - added directory cache and longfilename support (longfilenames will be mangled) + - mouse fixes + + +0.57 + - added support for command /C + - fixed all fcb-write functions + - fixed fcb-parseline + - added debugger under linux/freebsd + - added debugger memory breakpoints and autolog function (heavy debug) + - added loadfix.com program that eats up memory (default 64kb) + Usage : loadfix [-option] [programname] [parameters]... + Example: loadfix mm2 (Allocates 64kb and starts executable mm2) + loadfix -32 mm2 (Allocates 32kb and starts executable mm2) + loadfix -128 (Allocates 128kb) + loadfix -f (frees all previous allocated memory) + - added echoing of characters for input function + - added support for backspace for input function + - added partial support for int10:01 set cursortype + - fixed most of the problems/bugs with character input. + - fixed allocationinfo call.(darksun series) + - improved dos support for non-existant functions + - Split screen support + - prefix 66 67 support + - rewrote timingscheme so 1000 hz timers don't cause problems anymore + - update adlib emulation + - fixed some isues with the mouse (double clicks and visible when it shouldn't be) + - improved mouse behaviour (mickey/pixel rate) and detection routines. + - basic ansi.sys support + - Disney sound system emulation + - rewrote upcase/lowcase functions so they work fine with gcc3.2 + - SHELL: added rename and delete + - added support for command /C. Fixed crashes in the shell + - fixed various bugs when exiting dosbox + - fixed a bug in XMS + - fixed a bug with the joystick when pressing a button + - create nicer configfiles. + - bios_disk function improved. + - trapflag support + - improved vertical retrace timing. + - PIT Timer improvements and many bug fixes + - Many many bug fixes to the DOS subsystem + - Support for memory allocation strategy + - rewrote cpu mainloop to act more like a real cpu + +0.56 + - added support for a configclass/configfile + - added support for writing out the configclass into a configfile + - removed the language file and made it internal + - added support for writing the language file (will override the internal one) + - improved mousesupport + - updated readme + - support for screenshots + - some cpu-bug fixes + - dma changes + - Real Sound support + - EMM fixes and new functions. + - VGA fixes + - new wildcompare + - support for size and disktype at mount. + - added new debugger functionalities: start/trace into INTs, write processor status log, + step over rep and loop instructions, breakpoint support without using INT 03 (heavy debugging switch) + - Added more cpu instructions and changed the string operations. + - Added classes for most of the internal dos structures. + - Rewrote most of the fcb calls to use normal dos calls. + +0.55 + - fixed the errors/warnings in prefix_66.h and prefix_66_of.h (decimal too large becomming unsigned). + - fixed compilation error on FreeBSD when #disable_joystick was defined + - int10_writechar has been updated to move the cursor position. + - changed the basedir routines to use the current working dir instead of argv[0]. This will fix and brake things :) + - illegal command, now displays the command + - wildcmp updated to be case insensitive + - added fcb:open,close,findfirst, findnext. + - fixed rename in drive_local + - added new features to the debugger: breakpoint support / data view / command line + - partial support of list of lists (dos info block) + - full emm 3.2 support + - partial emm 4.0 support + - fixes to graphics core fonts (text in sierra games is now correct) + - improved support for user mousehandlers + - fixed EGA graphics + - fixed VGA graphics + - fixed write with size 0 + - changed memory management. + - fixed and cleaned up the cpu flags. + - changed interrupt handler. + - speeded up the graphics. + - speeded up the cpu-core + - changed dma + - improved dma streams from emm memory + - added some cga videomodes + - added more funtions to the keyboard handler + +0.50: + -added F3 to repeat the last typed command. + -made it possible to change the shellmessages(dosshell). so + you can costumize it.(dosbox.lang) + -changed cpu core. + -Fixed a lot of errors with the keyboard: shift-f1 and + alt-f1 now works. + -Fixed some division errors. + -made a plugin system. + -added a lot of real 386 mode instructions. + -made it possible to resize the screen. + -Mayor source cleanup/reorganisation. + -Complete rewrite of the graphics routines. Should make it + possible to implement more fancy things like 2xsai,interpolation. + -changed the sound playback. + -Changed the vga drawing to only draw on memory changes, instead + of drawing an entire frame. + -fixes to the soundblaster/dma code should be able to play 4-bit + adpcm compressed sounds. + -added the correct time to dir. + -bugfixes to batch-file handling. + -Lot's of small bugfixes.(Dune1&2,wolf3d, many more). + -Released the source. diff --git a/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_README.txt b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_README.txt new file mode 100644 index 0000000..e66a72a --- /dev/null +++ b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_README.txt @@ -0,0 +1,1469 @@ +DOSBox v0.74 Manual (always use the latest version from www.dosbox.com) + + + +===== +NOTE: +===== + +While we are hoping that one day DOSBox will run all programs ever made for +the PC, we are not there yet. +At present, DOSBox running on a high-end machine will roughly be the equivalent +of a Pentium I PC. DOSBox can be configured to run a wide range of DOS games, +from CGA/Tandy/PCjr classics up to games from the Quake era. + + + +====== +INDEX: +====== + +1. Quickstart +2. Start (FAQ) +3. Command Line Parameters +4. Internal Programs +5. Special Keys +6. Joystick/Gamepad +7. KeyMapper +8. Keyboard Layout +9. Serial Multiplayer feature +10. How to speed up/slow down DOSBox +11. Troubleshooting +12. DOSBox Status Window +13. The configuration (options) file +14. The language file +15. Building your own version of DOSBox +16. Special thanks +17. Contact + + + +============== +1. Quickstart: +============== + +Type INTRO in DOSBox for a quick tour. +It is essential that you get familiar with the idea of mounting, DOSBox does not +automatically make any drive (or a part of it) accessible to the emulation. See +the FAQ entry "How to start?" as well as the description of the MOUNT command +(section 4: "Internal Programs"). If you have your game on a cdrom you may try +this guide: http://vogons.zetafleet.com/viewtopic.php?t=8933 + + + +=============== +2. Start (FAQ): +=============== + +START: How to start? +AUTOMATION: Do I always have to type these "mount" commands? +FULLSCREEN: How do I change to fullscreen? +CD-ROM: My CD-ROM doesn't work. +CD-ROM: The game/application can't find its CD-ROM. +MOUSE: The mouse doesn't work. +SOUND: There is no sound. +SOUND: What sound hardware does DOSBox presently emulate? +SOUND: The sound stutters or sounds stretched/weird. +KEYBOARD: I can't type \ or : in DOSBox. +KEYBOARD: Right Shift and "\" doesn't work in DOSBox. (Windows only) +KEYBOARD: The keyboard lags. +CONTROL: The character/cursor/mouse pointer always moves into one direction! +SPEED: The game/application runs much too slow/too fast! +CRASH: The game/application does not run at all/crashes! +CRASH: DOSBox crashes on startup! +GAME: My Build game(Duke3D/Blood/Shadow Warrior) has problems. +SAFETY: Can DOSBox harm my computer? +OPTIONS: I would like to change DOSBox's options. +HELP: Great Manual, but I still don't get it. + + + +START: How to start? + At the beginning you've got a Z:\> instead of a C:\> at the prompt. + You have to make your directories available as drives in DOSBox by using + the "mount" command. For example, in Windows "mount C D:\GAMES" will give + you a C drive in DOSBox which points to your Windows D:\GAMES directory + (that was created before). In Linux, "mount c /home/username" will give you + a C drive in DOSBox which points to /home/username in Linux. + To change to the drive mounted like above, type "C:". If everything went + fine, DOSBox will display the prompt "C:\>". + + +AUTOMATION: Do I always have to type these commands? + In the DOSBox configuration file is an [autoexec] section. The commands + present there are run when DOSBox starts, so you can use this section + for the mounting. Look at Section 13: The configuration (options) file + + +FULLSCREEN: How do I change to fullscreen? + Press alt-enter. Alternatively: Edit the configuration file of DOSBox and + change the option fullscreen=false to fullscreen=true. If fullscreen looks + wrong in your opinion: Play with the options: fullresolution, output and + aspect in the configuration file of DOSBox. To get back from fullscreen + mode: Press alt-enter again. + + +CD-ROM: My CD-ROM doesn't work. + To mount your CD-ROM in DOSBox you have to specify some additional options + when mounting the CD-ROM. + To enable CD-ROM support (includes MSCDEX) in Windows: + - mount d f:\ -t cdrom + in Linux: + - mount d /media/cdrom -t cdrom + + In some cases you might want to use a different CD-ROM interface, + for example if CD audio does not work: + To enable SDL-support (does not include low-level CD access!): + - mount d f:\ -t cdrom -usecd 0 -noioctl + To enable ioctl access using digital audio extraction for CD audio + (windows-only, useful for Vista): + - mount d f:\ -t cdrom -ioctl_dx + To enable ioctl access using MCI for CD audio (windows-only): + - mount d f:\ -t cdrom -ioctl_mci + To force ioctl-only access (windows-only): + - mount d f:\ -t cdrom -ioctl_dio + To enable low-level aspi-support (win98 with aspi-layer installed): + - mount d f:\ -t cdrom -aspi + + explanation: - d driveletter you will get in DOSBox (d is the best, + don't change it!) + - f:\ location of CD-ROM on your PC. In most cases it will + be d:\ or e:\ + - 0 The number of the CD-ROM drive, reported by "mount -cd" + (note that this value is only needed when using SDL + for CD audio, otherwise it is ignored) + See also the next question: The game/application can't find its CD-ROM. + + +CD-ROM: The game/application can't find its CD-ROM. + Be sure to mount the CD-ROM with -t cdrom switch, this will enable the + MSCDEX interface required by DOS games to interface with CD-ROMs. + Also try adding the correct label (-label LABEL) to the mount command, + where LABEL is the CD-label (volume ID) of the CD-ROM. + Under Windows you can specify -ioctl, -aspi or -noioctl. Look at the + description of the mount command in Section 4: "Internal programs" + for their meaning and the + additional audio-CD related options -ioctl_dx, ioctl_mci, ioctl_dio. + + Try creating a CD-ROM image (preferably CUE/BIN pair) and use the + DOSBox's internal IMGMOUNT tool to mount the image (the CUE sheet). + This enables very good low-level CD-ROM support on any operating system. + + +MOUSE: The mouse doesn't work. + Usually, DOSBox detects when a game uses mouse control. When you click on + the screen it should get locked (confined to the DOSBox window) and work. + With certain games, the DOSBox mouse detection doesn't work. In that case + you will have to lock the mouse manually by pressing CTRL-F10. + + +SOUND: There is no sound. + Be sure that the sound is correctly configured in the game. This might be + done during the installation or with a setup/setsound utility that + accompanies the game. First see if an autodetection option is provided. If + there is none try selecting Soundblaster or Soundblaster 16 with the default + settings being "address=220 irq=7 dma=1" (sometimes highdma=5). You might + also want to select Sound Canvas/SCC/MPU-401/General MIDI/Wave Blaster + at "address=330 IRQ=2" as music device. + The parameters of the emulated sound cards can be changed in the DOSBox + configuration file. + If you still don't get any sound set the core to normal in DOSBox + configuration and use some lower fixed cycles value (like cycles=2000). Also + assure that your host operating sound does provide sound. + In certain cases it might be useful to use a different emulated sound device + like a soundblaster pro (sbtype=sbpro1 in the DOSBox configuration file) or + the gravis ultrasound (gus=true). + + +SOUND: What sound hardware does DOSBox presently emulate? + DOSBox emulates several legacy sound devices: + - Internal PC speaker/Buzzer + This emulation includes both the tone generator and several forms of + digital sound output through the internal speaker. + - Creative CMS/Gameblaster + The is the first card released by Creative Labs(R). The default + configuration places it on address 220. It is disabled as default. + - Tandy 3 voice + The emulation of this sound hardware is complete with the exception of + the noise channel. The noise channel is not very well documented and as + such is only a best guess as to the sound's accuracy. It is disabled as + default. + - Tandy DAC + Some games may require turning off sound blaster emulation (sbtype=none) + for better tandy DAC sound support. Don't forget to set the sbtype back to + sb16 if you don't use tandy sound. + - Adlib + This emulation is almost perfect and includes the Adlib's ability to + almost play digitized sound. Placed at address 220 (also on 388). + - SoundBlaster 16 / SoundBlaster Pro I & II / SoundBlaster I & II + By default DOSBox provides Soundblaster 16 level 16-bit stereo sound. + You can select a different SoundBlaster version in the configuration of + DOSBox. AWE32 music is not emulated as you can use MPU-401 instead + (see below). + - Disney Sound Source and Covox Speech Thing + Using the printer port, this sound device outputs digital sound only. + Placed at LPT1 + - Gravis Ultrasound + The emulation of this hardware is nearly complete, though the MIDI + capabilities have been left out, since an MPU-401 has been emulated + in other code. For Gravis music you also have to install Gravis drivers + inside DOSBox. It is disabled as default. + - MPU-401 + A MIDI passthrough interface is also emulated. This method of sound + output will only work when used with external device/emulator. + Every Windows XP/Vista/7 and MAC OS has got a default emulator compatible + with: Sound Canvas/SCC/General Standard/General MIDI/Wave Blaster. + A different device/emulator is needed for Roland LAPC/CM-32L/MT-32 + compatibility. + + +SOUND: The sound stutters or sounds stretched/weird. + You may be using too much CPU power to keep DOSBox running at the current + speed. You can lower the cycles, skip frames, reduce the sampling rate of + the respective sound device, increase the prebuffer. See section 13: "The + configuration (options) file" + If you are using cycles=max or =auto, then make sure that there is no + background processes interfering! (especially if they access the harddisk) + Also look at Section 10. "How to speed up/slow down DOSBox" + + +KEYBOARD: I can't type \ or : in DOSBox. + This can happen in various cases, like your host keyboard layout does not + have a matching DOS layout representation (or it was not correctly + detected), or the key mapping is wrong. + Some possible fixes: + 1. Use / instead, or ALT-58 for : and ALT-92 for \. + 2. Change the DOS keyboard layout (see Section 8: Keyboard Layout). + 3. Add the commands you want to execute to the [autoexec] section + of the DOSBox configuration file. + 4. Open the DOSBox configuration file and change the usescancodes entry. + 5. Switch the keyboard layout of your operating system. + + Note that if the host layout can not be identified, or keyboardlayout is + set to none in the DOSBox configuration file, the standard US layout is + used. In this configuration try the keys around "enter" for the key \ + (backslash), and for the key : (colon) use shift and the keys between + "enter" and "L". + + +KEYBOARD: Right Shift and "\" doesn't work in DOSBox. (Windows only) + This may happen if Windows thinks that you have more than one keyboard + connected to your PC when you use some remote control devices. + To verity this problem run cmd.exe, navigate to DOSBox program folder + and type: + set sdl_videodriver=windib + dosbox.exe + check whether keyboard started to work properly. As windib is slower it is + best to use one of the two solutions provided here: + http://vogons.zetafleet.com/viewtopic.php?t=24072 + + +KEYBOARD: The keyboard lags. + Lower the priority setting in the DOSBox configuration file, for example + set "priority=normal,normal". You might also want to try lowering the + cycles (use a fixed cycle amount to start with, like cycles=10000). + + +CONTROL: The character/cursor/mouse pointer always moves into one direction! + See if it still happens if you disable the joystick emulation, + set joysticktype=none in the [joystick] section of your DOSBox + configuration file. Maybe also try unplugging any joystick/gamepad. + If you want to use the joystick in the game, try setting timed=false + and be sure to calibrate the joystick (both in your OS as well as + in the game or the game's setup program). + + +SPEED: The game/application runs much too slow/too fast! + Look at the section 10: "How to speed up/slow down DOSBox" for more + information. + + +CRASH: The game/application does not run at all/crashes! + Look at Section 11: Troubleshooting + + +CRASH: DOSBox crashes on startup!. + Look at Section 11: Troubleshooting + + +GAME: My Build game(Duke3D/Blood/Shadow Warrior) has problems. + First of all, try to find a port of the game. Those will offer a better + experience. To fix the graphics problem that occurs in DOSBox on higher + resolutions: Open the configuration file of DOSBox and search for + machine=svga_s3. Change svga_s3 to vesa_nolfb + Change memsize=16 to memsize=63 + + +SAFETY: Can DOSBox harm my computer? + DOSBox can not harm your computer more than any other resource demanding + program. Increasing the cycles does not overclock your real CPU. + Setting the cycles too high has a negative performance effect on the + software running inside DOSBox. + + +OPTIONS: I would like to change DOSBox's options. + Look at Section 13. "The configuration (options) file" + + +HELP: Great Manual, but I still don't get it. + For more questions read the rest of this Manual. You may also look at: + guides located at http://vogons.zetafleet.com/viewforum.php?f=39 + the wiki of DOSBox http://www.dosbox.com/wiki/ + the site/forum: http://www.dosbox.com + + + +=========================== +3. Command Line Parameters: +=========================== + +An overview of the command line options you can give to DOSBox. Although +in most cases it is easier to use DOSBox's configuration file instead. +See: Section 13. "The configuration (options) file" + +To be able to use Command Line Parameters: +(Windows) open cmd.exe or command.com or edit the shortcut to dosbox.exe +(Linux) use console +(MAC OS X) start terminal.app and navigate to: + /applications/dosbox.app/contents/macos/dosbox + +The options are valid for all operating systems unless noted in the option +description: + +dosbox [name] [-exit] [-c command] [-fullscreen] [-userconf] + [-conf congfigfilelocation] [-lang languagefilelocation] + [-machine machine type] [-noconsole] [-startmapper] [-noautoexec] + [-securemode] [-scaler scaler | -forcescaler scaler] [-version] + [-socket socket] + +dosbox -version +dosbox -editconf program +dosbox -opencaptures program +dosbox -printconf +dosbox -eraseconf +dosbox -erasemapper + + name + If "name" is a directory it will mount that as the C: drive. + If "name" is an executable it will mount the directory of "name" + as the C: drive and execute "name". + + -exit + DOSBox will close itself when the DOS application "name" ends. + + -c command + Runs the specified command before running "name". Multiple commands + can be specified. Each command should start with "-c" though. + A command can be: an Internal Program, a DOS command or an executable + on a mounted drive. + + -fullscreen + Starts DOSBox in fullscreen mode. + + -userconf + Start DOSBox with the users specific configuration file. Can be used + together with multiple -conf parameters, but -userconf will always be + loaded before them. + + -conf configfilelocation + Start DOSBox with the options specified in "configfilelocation". + Multiple -conf options may be present. + See Section 13 for more details. + + -lang languagefilelocation + Start DOSBox using the language specified in "languagefilelocation". + See Section 14 for more details. + + -machine machinetype + Setup DOSBox to emulate a specific type of machine. Valid choices are: + hercules, cga, ega, pcjr, tandy, svga_s3 (default) as well as + the additional svga chipsets listed in the DOSBox configuration file. + svga_s3 enables vesa emulation as well. + For some special vga effects the machinetype vgaonly can be used, + note that this disables svga capabilities and might be slower due to the + higher emulation precision. + The machinetype affects the video card and the available sound cards. + + -noconsole (Windows Only) + Start DOSBox without showing DOSBox Status Window (console). + Output will be redirected to stdout.txt and stderr.txt + + -startmapper + Enter the keymapper directly on startup. Useful for people with + keyboard problems. + + -noautoexec + Skips the [autoexec] section of the loaded configuration file. + + -securemode + Same as -noautoexec, but adds config.com -securemode at the + bottom of AUTOEXEC.BAT (which in turn disables any changes to how + the drives are mounted inside DOSBox). + + -scaler scaler + Uses the scaler specified by "scaler". See the DOSBox configuration file + for the available scalers. + + -forcescaler scaler + Similar to the -scaler parameter, but tries to force usage of + the specified scaler even if it might not fit. + + -version + output version information and exit. Useful for frontends. + + -editconf program + calls program with as first parameter the configuration file. + You can specify this command more than once. In this case it will + move to second program if the first one fails to start. + + -opencaptures program + calls program with as first parameter the location of the captures + folder. + + -printconf + prints the location of the default configuration file. + + -resetconf + removes the default configuration file. + + -resetmapper + removes the mapperfile used by the default clean configuration file. + + -socket + passes the socket number to the nullmodem emulation. See Section 9: + "Serial Multiplayer feature." + +Note: If a name/command/configfilelocation/languagefilelocation contains + a space, put the whole name/command/configfilelocation/languagefilelocation + between quotes ("command or file name"). If you need to use quotes within + quotes (most likely with -c and mount): + Windows and OS/2 users can use single quotes inside the double quotes. + Other people should be able to use escaped double quotes inside the + double quotes. + Windows: -c "mount c 'c:\My folder with DOS games\'" + Linux: -c "mount c \"/tmp/name with space\"" + +A rather unusual example, just to demonstrate what you can do (Windows): +dosbox D:\folder\file.exe -c "MOUNT Y H:\MyFolder" + This mounts D:\folder as C:\ and runs file.exe. + Before it does that, it will first mount H:\MyFolder as the Y drive. + +In Windows, you can also drag directories/files onto the DOSBox executable. + + + +===================== +4. Internal Programs: +===================== + +DOSBox supports most of the DOS commands found in command.com. +To get a list of the internal commands type "HELP" at the prompt. + +In addition, the following commands are available: + +MOUNT "Emulated Drive letter" "Real Drive or Directory" + [-t type] [-aspi] [-ioctl] [-noioctl] [-usecd number] [-size drivesize] + [-label drivelabel] [-freesize size_in_mb] + [-freesize size_in_kb (floppies)] +MOUNT -cd +MOUNT -u "Emulated Drive letter" + + Program to mount local directories as drives inside DOSBox. + + "Emulated Drive letter" + The driveletter inside DOSBox (for example C). + + "Real Drive letter (usually for CD-ROMs in Windows) or Directory" + The local directory you want accessible inside DOSBox. + + -t type + Type of the mounted directory. + Supported are: dir (default), floppy, cdrom. + + -size drivesize + (experts only) + Sets the size of the drive, where drivesize is of the form + "bps,spc,tcl,fcl": + bps: bytes per sector, by default 512 for regular drives and + 2048 for CD-ROM drives + spc: sectors per cluster, usually between 1 and 127 + tcl: total clusters, between 1 and 65534 + fcl: total free clusters, between 1 and tcl + + -freesize size_in_mb | size_in_kb + Sets the amount of free space available on a drive + in megabytes (regular drives) or kilobytes (floppy drives). + This is a simpler version of -size. + + -label drivelabel + Sets the name of the drive to "drivelabel". Needed on some systems + if the CD-ROM label isn't read correctly (useful when a program + can't find its CD-ROM). If you don't specify a label + and no lowlevel support is selected (that is omitting the -usecd # + and/or -aspi parameters, or specifying -noioctl): + For Windows: label is extracted from "Real Drive". + For Linux: label is set to NO_LABEL. + + If you do specify a label, this label will be kept as long as the drive + is mounted. It will not be updated !! + + -aspi + Forces use of the aspi layer. Only valid if mounting a CD-ROM under + Windows systems with an ASPI-Layer. + + -ioctl (automatic selection of the CD audio interface) + -ioctl_dx (digital audio extraction used for CD audio) + -ioctl_dio (ioctl calls used for CD audio) + -ioctl_mci (MCI used for CD audio) + Forces use of ioctl commands. Only valid if mounting a CD-ROM under + a Windows OS which support them (Win2000/XP/NT). + The various choices only differ in the way CD audio is handled, + preferably -ioctl_dio is used (lowest workload), but this might not + work on all systems, so -ioctl_dx (or -ioctl_mci) can be used. + + -noioctl + Forces use of the SDL CD-ROM layer. Valid on all systems. + + -usecd number + Valid on all systems, under windows the -noioctl switch has to be + present to make use of the -usecd switch. + Enables to select the drive that should be used by SDL. Use this if + the wrong or no CD-ROM drive is mounted while using the SDL CD-ROM + interface. "number" can be found by "MOUNT -cd". + + -cd + Displays all CD-ROM drives detected by SDL, and their numbers. + See the information at the -usecd entry above. + + -u + Removes the mount. Doesn't work for Z:\. + + Note: It's possible to mount a local directory as CD-ROM drive, + but hardware support is then missing. + + Basically MOUNT allows you to connect real hardware to DOSBox's emulated PC. + So MOUNT C C:\GAMES tells DOSBox to use your C:\GAMES directory as drive C: + in DOSBox. MOUNT C E:\SomeFolder tells DOSBox to use your E:\SomeFolder + directory as drive C: in DOSBox. + + Mounting your entire C drive with MOUNT C C:\ is NOT recommended! The same + is true for mounting the root of any other drive, except for CD-ROMs (due to + their read-only nature). + Otherwise if you or DOSBox make a mistake you may lose all your files. + Also never mount a "Windows" or "Program Files" folders or their subfolders + in Windows Vista/7 as DOSBox may not work correctly, or will stop working + correctly later. It is recommended to keep all your dos applications/games + in a simple folder (for example c:\dosgames) and mount that. + + You should always install your game inside DOSBox. + So if you have the game on CD you always (even after installation!) + have to mount both: folder as a harddisk drive and a CD-ROM. + HardDisk should always be mounted as c + CD-ROM should always be mounted as d + Floppy should always be mounted as a (or b) + + Basic MOUNT Examples for normal usage (Windows): + + 1. To mount a folder as a harddisk drive: + mount c d:\dosgames + + 3. To mount your CD-ROM drive E as CD-ROM drive D in DOSBox: + mount d e:\ -t cdrom + + 2. To mount your drive a: as a floppy: + mount a a:\ -t floppy + + Advanced MOUNT examples (Windows): + + 4. To mount a hard disk drive with ~870 mb free diskspace (simple version): + mount c d:\dosgames -freesize 870 + + 5. To mount a drive with ~870 mb free diskspace (experts only, full control): + mount c d:\dosgames -size 512,127,16513,13500 + + 1. To mount c:\dosgames\floppy as a floppy: + mount a c:\dosgames\floppy -t floppy + + + Other MOUNT examples: + + 3. To mount system CD-ROM drive at mountpoint /media/cdrom as CD-ROM drive D + in DOSBox: + mount d /media/cdrom -t cdrom -usecd 0 + + 6. To mount /home/user/dosgames as drive C in DOSBox: + mount c /home/user/dosgames + + 7. To mount the directory where DOSBox was started as C in DOSBox: + mount c . + (note the . which represents the directory where DOSBox was started, + on Windows Vista/7 don't use this if you installed DOSBox + to your "Program Files" folder) + + If you want to mount a CD image or floppy image, check IMGMOUNT. + MOUNT also works with images but only if you use external program, + for example (both are free): + - Daemon Tools Lite (for CD images), + - Virtual Floppy Drive (for floppy images). + Although IMGMOUNT can give better compatibility. + + +MEM + Program to display the amount and type of free memory. + + +VER +VER set major_version [minor_version] + Display the current DOSBox version and reported DOS version + (parameterless usage). + Change the reported DOS version with the "set" parameter, + for example: "VER set 6 22" to have DOSBox report DOS 6.22 as version number. + + +CONFIG -writeconf filelocation +CONFIG -writelang filelocation +CONFIG -securemode +CONFIG -set "section property=value" +CONFIG -get "section property" + + CONFIG can be used to change or query various settings of DOSBox + during runtime. It can save the current settings and language strings to + disk. Information about all possible sections and properties can + be found in Section 13: "The configuration (options) file". + + -writeconf filelocation + Write the current configuration settings to a file in a specified location. + "filelocation" is located on the local drive, not a mounted drive in DOSBox. + The configuration file controls various settings of DOSBox: + the amount of emulated memory, the emulated sound cards and many more + things. It allows access to AUTOEXEC.BAT as well. + See Section 13: "The configuration (options) file" for more information. + + -writelang filelocation + Write the current language settings to a file in a specified location. + "filelocation" is located on the local drive, not a mounted drive + in DOSBox. The language file controls all visible output of the internal + commands and the internal DOS. + See Section 14: "The Language File" for more information. + + -securemode + Switches DOSBox to a more secure mode. In this mode the internal + commands MOUNT, IMGMOUNT and BOOT won't work. It's not possible either + to create a new configfile or languagefile in this mode. + (Warning: you can only undo this mode by restarting DOSBox.) + + -set "section property=value" + CONFIG will attempt to set the property to new value. + Currently CONFIG can not report whether the command succeeded or not. + + -get "section property" + The current value of the property is reported and stored in the + environment variable %CONFIG%. This can be used to store the value + when using batch files. + + Both "-set" and "-get" work from batch files and can be used to set up your + own preferences for each game. Although it may be easier to use separate + DOSBox's configuration files for each game instead. + + Examples: + 1. To create a configuration file in your c:\dosgames directory: + config -writeconf c:\dosgames\dosbox.conf + 2. To set the cpu cycles to 10000: + config -set "cpu cycles=10000" + 3. To turn ems memory emulation off: + config -set "dos ems=off" + 4. To check which cpu core is being used. + config -get "cpu core" + + +LOADFIX [-size] [program] [program-parameters] +LOADFIX -f + Program to reduce the amount of available conventional memory. + Useful for old programs which don't expect much memory to be free. + + -size + number of kilobytes to "eat up", default = 64kb + + -f + frees all previously allocated memory + + Examples: + 1. To start mm2.exe and allocate 64kb memory + (mm2 will have 64 kb less available): + loadfix mm2 + 2. To start mm2.exe and allocate 32kb memory: + loadfix -32 mm2 + 3. To free previous allocated memory: + loadfix -f + + +RESCAN + Make DOSBox reread the directory structure. Useful if you changed something + on a mounted drive outside of DOSBox. (CTRL - F4 does this as well!) + + +MIXER + Makes DOSBox display its current volume settings. + Here's how you can change them: + + mixer channel left:right [/NOSHOW] [/LISTMIDI] + + channel + Can be one of the following: MASTER, DISNEY, SPKR, GUS, SB, FM [, CDAUDIO]. + CDAUDIO is only available if a CD-ROM interface with volume control is + enabled (CD image, ioctl_dx). + + left:right + The volume levels in percentages. If you put a D in front it will be + in decibel (Example: mixer gus d-10). + + /NOSHOW + Prevents DOSBox from showing the result if you set one + of the volume levels. + + /LISTMIDI + In Windows lists the available midi devices on your PC. To select a device + other than the Windows default midi-mapper, change the line 'midiconfig=' + in the [midi] section of the configuration file to 'midiconfig=id', where + 'id' is the number for the device as listed by LISTMIDI. eg. midiconfig=2 + + In Linux this option doesn't work, but you get similar results by using + 'pmidi -l' in console. Then change the line 'midiconfig=' to + 'midiconfig=port', where 'port' is the port for the device as listed by + 'pmidi -l'. eg. midiconfig=128:0 + + +IMGMOUNT + A utility to mount disk images and CD-ROM images in DOSBox. + + IMGMOUNT DRIVE [imagefile] -t [image_type] -fs [image_format] + -size [sectorsbytesize, sectorsperhead, heads, cylinders] + IMGMOUNT DRIVE [imagefile1 imagefile2 .. imagefileN] -t cdrom -fs iso + + imagefile + Location of the image file to mount in DOSBox. The location can be + on a mounted drive inside DOSBox, or on your real disk. It is possible + to mount CD-ROM images (ISOs or CUE/BIN or CUE/IMG) too. + If you need CD swapping capabilities, specify all images in succession + (see the next entry). + CUE/BIN pairs and cue/img are the preferred CD-ROM image types as they can + store audio tracks compared to ISOs (which are data-only). For + the CUE/BIN mounting always specify the CUE sheet. + + imagefile1 imagefile2 .. imagefileN + Location of the image files to mount in DOSBox. Specifying a number + of image files is only allowed for CD-ROM images. + The CD's can be swapped with CTRL-F4 at any time. + This is required for games which use multiple CD-ROMs and require the CD + to be switched during the gameplay at some point. + + -t + The following are valid image types: + floppy: Specifies a floppy image. DOSBox will automatically identify + the disk geometry (360K, 1.2MB, 720K, 1.44MB, etc). + cdrom: Specifies a CD-ROM image. The geometry is automatic and + set for this size. This can be an iso or a cue/bin pair or + a cue/img pair. + hdd: Specifies a harddrive image. The proper CHS geometry must be set + for this to work. + + -fs + The following are valid file system formats: + iso: Specifies the ISO 9660 CD-ROM format. + fat: Specifies that the image uses the FAT file system. DOSBox will + attempt to mount this image as a drive in DOSBox and make + the files available from inside DOSBox. + none: DOSBox will make no attempt to read the file system on the disk. + This is useful if you need to format it or if you want to boot + the disk using the BOOT command. When using the "none" + filesystem, you must specify the drive number (2 or 3, + where 2 = master, 3 = slave) rather than a drive letter. + For example, to mount a 70MB image as the slave drive device, + you would type (without the quotes): + "imgmount 3 d:\test.img -size 512,63,16,142 -fs none" + Compare this with a mount to be able to access the drive + within DOSBox, which would read as: + "imgmount e: d:\test.img -size 512,63,16,142" + + -size + The Cylinders, Heads and Sectors of the drive. + Required to mount hard drive images. + + An example how to mount CD-ROM images (in Linux): + 1. imgmount d /tmp/cdimage1.cue /tmp/cdimage2.cue -t cdrom + or (which also works): + 2a. mount c /tmp + 2b. imgmount d c:\cdimage1.cue c:\cdimage2.cue -t cdrom + (in Windows): + imgmount d f:\img\CD1.cue f:\img\CD2.cue f:\img\CD3.cue -t cdrom + imgmount d "g:\img\7th Guest CD1.cue" "g:\img\7th Guest CD2.cue" -t cdrom + Don't forget that you can also use MOUNT with images, but only if you use + external program, for example (both are free): + - Daemon Tools Lite (for CD images), + - Virtual Floppy Drive (for floppy images). + Although IMGMOUNT can give better compatibility. + + +BOOT + Boot will start floppy images or hard disk images independent of + the operating system emulation offered by DOSBox. This will allow you to + play booter floppies or boot other operating systems inside DOSBox. + If the target emulated system is PCjr (machine=pcjr) the boot command + can be used to load PCjr cartridges (.jrc). + + BOOT [diskimg1.img diskimg2.img .. diskimgN.img] [-l driveletter] + BOOT [cart.jrc] (PCjr only) + + diskimg1.img diskimg2.img .. diskimgN.img + This can be any number of floppy disk images one wants mounted after + DOSBox boots the specified drive letter. + To swap between images, hit CTRL-F4 to change from the current disk + to the next disk in the list. The list will loop back from the last + disk image to the beginning. + + [-l driveletter] + This parameter allows you to specify the drive to boot from. + The default is the A drive, the floppy drive. You can also boot + a hard drive image mounted as master by specifying "-l C" + without the quotes, or the drive as slave by specifying "-l D" + + cart.jrc (PCjr only) + When emulation of a PCjr is enabled, cartridges can be loaded with + the BOOT command. Support is still limited. + + +IPX + + You need to enable IPX networking in the configuration file of DOSBox. + + All of the IPX networking is managed through the internal DOSBox program + IPXNET. For help on the IPX networking from inside DOSBox, type + "IPXNET HELP" (without quotes) and the program will list the commands + and relevant documentation. + + With regard to actually setting up a network, one system needs to be + the server. To set this up, type "IPXNET STARTSERVER" (without the quotes) + in a DOSBox session. The server DOSBox session will automatically add + itself to the virtual IPX network. For every additional computer that + should be part of the virtual IPX network, you'll need to type + "IPXNET CONNECT ". + For example, if your server is at bob.dosbox.com, you would type + "IPXNET CONNECT bob.dosbox.com" on every non-server system. + + To play games that need Netbios a file named NETBIOS.EXE from Novell is + needed. Establish the IPX connection as explained above, then run + "netbios.exe". + + The following is an IPXNET command reference: + + IPXNET CONNECT + + IPXNET CONNECT opens a connection to an IPX tunneling server + running on another DOSBox session. The "address" parameter specifies + the IP address or host name of the server computer. You can also + specify the UDP port to use. By default IPXNET uses port 213 - the + assigned IANA port for IPX tunneling - for its connection. + + The syntax for IPXNET CONNECT is: + IPXNET CONNECT address + + IPXNET DISCONNECT + + IPXNET DISCONNECT closes the connection to the IPX tunneling server. + + The syntax for IPXNET DISCONNECT is: + IPXNET DISCONNECT + + IPXNET STARTSERVER + + IPXNET STARTSERVER starts an IPX tunneling server on this DOSBox + session. By default, the server will accept connections on UDP port + 213, though this can be changed. Once the server is started, DOSBox + will automatically start a client connection to the IPX tunneling server. + + The syntax for IPXNET STARTSERVER is: + IPXNET STARTSERVER + + If the server is behind a router, UDP port needs to be forwarded + to that computer. + + On Linux/Unix-based systems port numbers smaller than 1023 can only be + used with root privileges. Use ports greater than 1023 on those systems. + + IPXNET STOPSERVER + + IPXNET STOPSERVER stops the IPX tunneling server running on this DOSBox + session. Care should be taken to ensure that all other connections have + terminated as well, since stopping the server may cause lockups on other + machines that are still using the IPX tunneling server. + + The syntax for IPXNET STOPSERVER is: + IPXNET STOPSERVER + + IPXNET PING + + IPXNET PING broadcasts a ping request through the IPX tunneled network. + In response, all other connected computers will respond to the ping + and report the time it took to receive and send the ping message. + + The syntax for IPXNET PING is: + IPXNET PING + + IPXNET STATUS + + IPXNET STATUS reports the current state of this DOSBox session's + IPX tunneling network. For a list of all computers connected to the + network use the IPXNET PING command. + + The syntax for IPXNET STATUS is: + IPXNET STATUS + + +KEYB [keyboardlayoutcode [codepage [codepagefile]]] + + Change the keyboard layout. For detailed information about keyboard layouts + please see Section 8: "Keyboard Layout" + + [keyboardlayoutcode] is a string consisting of five or less characters, + examples are PL214 (Polish typists) or PL457 (Polish programmers). + It specifies the keyboard layout to be used. + The list of all layouts built into DOSBox is here: + http://vogons.zetafleet.com/viewtopic.php?t=21824 + + [codepage] is the number of the codepage to be used. The keyboard layout + has to provide support for the specified codepage, otherwise the layout + loading will fail. + If no codepage is specified, an appropriate codepage for the requested + layout is chosen automatically. + + [codepagefile] can be used to load codepages that are yet not compiled + into DOSBox. This is only needed when DOSBox does not find the codepage. + If no codepagefile is specified, but you place all ten ega.cpx files + (from FreeDOS) in the DOSBox program folder, an appropriate codepagefile + for the requested layout/codepage is chosen automatically. + + Examples: + 1. To load the polish typist keys layout (automatically uses codepage 852): + keyb pl214 + 2. To load one of russian keyboard layouts with codepage 866: + keyb ru441 866 + In order to type russian characters press ALT+RIGHT-SHIFT. + 3. To load one of french keyboard layouts with codepage 850 (where the + codepage is defined in EGACPI.DAT): + keyb fr189 850 EGACPI.DAT + 4. To load codepage 858 (without a keyboard layout): + keyb none 858 + This can be used to change the codepage for the FreeDOS keyb2 utility. + 5. To display the current codepage and, if loaded, the keyboard layout: + keyb + + + +For more information use the /? command line switch with the programs. + + + +================ +5. Special Keys: +================ + +ALT-ENTER Switch to full screen and back. +ALT-PAUSE Pause emulation (hit ALT-PAUSE again to continue). +CTRL-F1 Start the keymapper. +CTRL-F4 Change between mounted floppy/CD images. Update directory cache + for all drives. +CTRL-ALT-F5 Start/Stop creating a movie of the screen. (avi video capturing) +CTRL-F5 Save a screenshot. (PNG format) +CTRL-F6 Start/Stop recording sound output to a wave file. +CTRL-ALT-F7 Start/Stop recording of OPL commands. (DRO format) +CTRL-ALT-F8 Start/Stop the recording of raw MIDI commands. +CTRL-F7 Decrease frameskip. +CTRL-F8 Increase frameskip. +CTRL-F9 Kill DOSBox. +CTRL-F10 Capture/Release the mouse. +CTRL-F11 Slow down emulation (Decrease DOSBox Cycles). +CTRL-F12 Speed up emulation (Increase DOSBox Cycles)*. +ALT-F12 Unlock speed (turbo button/fast forward)**. +F11, ALT-F11 (machine=cga) change tint in NTSC output modes*** +F11 (machine=hercules) cycle through amber, green, white colouring*** + +*NOTE: Once you increase your DOSBox cycles beyond your computer CPU resources, + it will produce the same effect as slowing down the emulation. + This maximum will vary from computer to computer. + +**NOTE: You need free CPU resources for this (the more you have, the faster + it goes), so it won't work at all with cycles=max or a too high amount + of fixed cycles. You have to keep the keys pressed for it to work! + +***NOTE: These keys won't work if you saved a mapper file earlier with + a different machine type. So either reassign them or reset the mapper. + +These are the default keybindings. They can be changed in the keymapper +(see Section 7: KeyMapper). + +In MAC OS you can try using cmd(applekey) together with Ctrl if the key doesn't +work eg. cmd-ctrl-F1, but some keys may still need remapping (in Linux too). + +Saved/recorded files can be found in: + (Windows) "Start/WinLogo Menu"->"All Programs"->DOSBox-0.74->Extras + (Linux) ~/.dosbox/capture + (MAC OS X) "~/Library/Preferences/capture" +This can be changed in the DOSBox configuration file. + + + +==================== +6. Joystick/Gamepad: +==================== + +The standard joystick port in DOS supports a maximum of 4 axes and 4 buttons. +For more, different modifications of that configuration were used. + +To force DOSBox to use a different type of emulated joystick/gamepad, the entry +"joysticktype" in the [joystick] section of the DOSBox configuration file can +be used. + +none - disables controller support. +auto - (default) autodetects whether you have one or two controllers connected: + if you have one - '4axis' setting is used, + if you have two - '2axis' setting is used. +2axis - If you have two controllers connected, each will emulate a joystick + with 2 axes and 2 buttons. If you have only one controller connected, + it will emulate a joystick with only 2 axis and 2 buttons. +4axis - supports only first controller, emulates a joystick + with 4 axis and 4 buttons or a gamepad with 2axis and 6 buttons. +4axis_2 - supports only second controller. +fcs - supports only first controller, emulates ThrustMaster + Flight Control System, with 3-axes, 4 buttons and 1 hat. +ch - supports only first controller, emulates CH Flightstick, + with 4-axes, 6 buttons and 1 hat, but you cannot press more + than one button at the same time. + +You also have to configure controller properly inside the game. + +It is important to remember that if you saved the mapperfile without joystick + +connected, or with a different joystick setting, your new setting will +not work +properly, +or not work at all, until you reset DOSBox's mapperfile. + + +If controller is working properly outside DOSBox, but doesn't calibrate properly +inside DOSBox, try different 'timed' setting in DOSBox's configuration file. + + + +============= +7. KeyMapper: +============= + +You start the DOSBox mapper either with CTRL-F1 (see section 5. Special Keys) +or -startmapper (see Section 3. Command Line Parameters). +You are presented with a virtual keyboard and a virtual joystick. + +These virtual devices correspond to the keys and events DOSBox will +report to the DOS applications. If you click on a button with your mouse, +you can see in the lower left corner with which event it is associated +(EVENT) and to what events it is currently bound. + +Event: EVENT +BIND: BIND (the real key/button/axis you push with your finger/hand) + + Add Del +mod1 hold Next +mod2 +mod3 + + +EVENT + The key or joystick axis/button/hat DOSBox will report to DOS applications. + (the event that will happen during the game, (eg. shooting/jumping/walking) +BIND + The key on your real keyboard or the axis/button/hat on your real + joystick(s) (as reported by SDL), which is connected to the EVENT. +mod1,2,3 + Modifiers. These are keys you need to have to be pressed while pressing + BIND. mod1 = CTRL and mod2 = ALT. These are generally only used when you + want to change the special keys of DOSBox. +Add + Add a new BIND to this EVENT. Basically add a key from your keyboard or an + event from the joystick (button press, axis/hat movement) which will + produce the EVENT in DOSBox. +Del + Delete the BIND to this EVENT. If an EVENT has no BINDS, then it is not + possible to trigger this event in DOSBox (that is there's no way to type + the key or use the respective action of the joystick). +Next + Go through the list of bindings which map to this EVENT. + + +Example: +Q1. You want to have the X on your keyboard to type a Z in DOSBox. + A. Click on the Z on the keyboard mapper. Click "Add". + Now press the X key on your keyboard. + +Q2. If you click "Next" a couple of times, you will notice that the Z on your + keyboard also produces an Z in DOSBox. + A. Therefore select the Z again, and click "Next" until you have the Z on + your keyboard. Now click "Del". + +Q3. If you try it out in DOSBox, you will notice that pressing X makes ZX + appear. + A. The X on your keyboard is still mapped to the X as well! Click on + the X in the keyboard mapper and search with "Next" until you find the + mapped key X. Click "Del". + + +Examples about remapping the joystick: + You have a joystick attached, it is working fine under DOSBox and you + want to play some keyboard-only game with the joystick (it is assumed + that the game is controlled by the arrows on the keyboard): + 1. Start the mapper, then click on one of the left keyboard arrow. + EVENT should be key_left. Now click on Add and move your joystick + in the respective direction, this should add an event to the BIND. + 2. Repeat the above for the missing three directions, additionally + the buttons of the joystick can be remapped as well (fire/jump). + 3. Click on Save, then on Exit and test it with some game. + + You want to swap the y-axis of the joystick because some flightsim uses + the up/down joystick movement in a way you don't like, and it is not + configurable in the game itself: + 1. Start the mapper and click on Y- in the first joystick field. + EVENT should be jaxis_0_1-. + 2. Click on Del to remove the current binding, then click Add and move + your joystick downwards. A new bind should be created. + 3. Repeat this for Y+, save the layout and finally test it with some game. + + If you want to remap anything to your d-pad/hat you will have to change + 'joysticktype=auto' to 'joysticktype=fcs' in configuration file. Maybe this + will be improved in the next dosbox version. + + +If you change the default mapping, you can save your changes by clicking on +"Save". DOSBox will save the mapping to a location specified in +the configuration file (the mapperfile= entry). At startup, DOSBox will load +your mapperfile, if it is present in the DOSBox configuration file. + + + +=================== +8. Keyboard Layout: +=================== + +To switch to a different keyboard layout, either the entry "keyboardlayout" +in the [dos] section of the DOSBox configuration file can be used, or the +internal DOSBox program keyb.com (Section 4: Internal Programs) +Both accept DOS conforming language codes (see below), +but only by using keyb.com a custom codepage can be specified. + +The default keyboardlayout=auto currently works under windows only. The language +is chosen according to the OS language, but the keyboard layout is not detected. + +Layout switching + DOSBox supports a number of keyboard layouts and codepages by default, + in this case just the layout identifier needs to be specified (like + keyboardlayout=PL214 in the DOSBox configuration file, or using "keyb PL214" + at the DOSBox command prompt). The list of all layouts built into DOSBox is + here: http://vogons.zetafleet.com/viewtopic.php?t=21824 + + Some keyboard layouts (for example layout GK319 codepage 869 and layout RU441 + codepage 808) have support for dual layouts that can be accessed by pressing + LeftALT+RrightSHIFT for one layout and LeftALT+LeftSHIFT for the other. + Some keyboard layouts (for example layout LT456 codepage 771) have support + for three layouts, third can be accessed by pressing LeftALT+LeftCTRL + +Supported external files + The FreeDOS .kl files are supported (FreeDOS keyb2 keyboard layoutfiles) as + well as the FreeDOS keyboard.sys/keybrd2.sys/keybrd3.sys libraries which + consist of all available .kl files. + See http://www.freedos.org/ for precompiled keyboard layouts if + the DOSBox-integrated layouts don't work for some reason, or if updated or + new layouts become available. + + Both .CPI (MS-DOS and compatible codepage files) and .CPX (FreeDOS + UPX-compressed codepage files) can be used. Some codepages are compiled + into DOSBox, so it is mostly not needed to care about external codepage + files. If you need a different (or custom) codepage file, copy it into + the directory of the DOSBox so it is accessible for DOSBox. + If you place all ten ega.cpx files (from FreeDOS) in DOSBox folder, + an appropriate codepagefile for the requested layout/codepage is + chosen automatically. + + Additional layouts can be added by copying the corresponding .kl file into + the directory of the DOSBox configuration file and using the first part of + the filename as language code. + Example: For the file UZ.KL (keyboard layout for Uzbekistan) specify + "keyboardlayout=uz" in the DOSBox configuration file. + The integration of keyboard layout packages (like keybrd2.sys) works similar. + +Note that the keyboard layout allows foreign characters to be entered, but +there is NO support for them in filenames. Try to avoid them both inside +DOSBox as well as in files on your host operating system that are accessible +by DOSBox. + + + +============================== +9. Serial Multiplayer feature: +============================== + +DOSBox can emulate a serial nullmodem cable over network and internet. +It can be configured through the [serialports] section in the DOSBox +configuration file. + +To create a nullmodem connection, one side needs to act as the server and +one as the client. + +The server needs to be set up in the DOSBox configuration file like this: + serial1=nullmodem + +The client: + serial1=nullmodem server: + +Now start your game and choose nullmodem / serial cable / already connected +as multiplayer method on COM1. Set the same baudrate on both computers. + +Furthermore, additional parameters can be specified to control the behavior +of the nullmodem connection. These are all parameters: + + * port: - TCP port number. Default: 23 + * rxdelay: - how long (milliseconds) to delay received data if the + interface is not ready. Increase this value if you encounter + overrun errors in the DOSBox Status Window. Default: 100 + * txdelay: - how long to gather data before sending a packet. Default: 12 + (reduces Network overhead) + * server: - This nullmodem will be a client connecting to the specified + server. (No server argument: be a server.) + * transparent:1 - Only send the serial data, no RTS/DTR handshake. Use this + when connecting to anything other than a nullmodem. + * telnet:1 - Interpret Telnet data from the remote site. Automatically + sets transparent. + * usedtr:1 - The connection will not be established until DTR is switched + on by the DOS program. Useful for modem terminals. + Automatically sets transparent. + * inhsocket:1 - Use a socket passed to DOSBox by command line. Automatically + sets transparent. (Socket Inheritance: It is used for + playing old DOS door games on new BBS software.) + +Example: Be a server listening on TCP port 5000. + serial1=nullmodem server: port:5000 rxdelay:1000 + + + +===================================== +10. How to speed up/slow down DOSBox: +===================================== + +DOSBox emulates the CPU, the sound and graphic cards, and other peripherals +of a PC, all at the same time. The speed of an emulated DOS application +depends on how many instructions can be emulated, which is adjustable +(number of cycles). + +CPU Cycles (speed up/slow down) + By default (cycles=auto) DOSBox tries to detect whether a game needs to + be run with as many instructions emulated per time interval as possible + (cycles=max, sometimes this results in game working too fast or unstable), + or whether to use fixed amount of cycles (cycles=3000, sometimes this results + in game working too slow or too fast). But you can always manually force + a different setting in the DOSBox's configuration file. + + You can force the slow or fast behavior by setting a fixed amount of cycles + in the DOSBox's configuration file. If you for example set cycles=10000, then + DOSBox window will display a line "Cpu Speed: fixed 10000 cycles" at the top. + In this mode you can reduce the amount of cycles even more by hitting CTRL-F11 + (you can go as low as you want) or raise it by hitting CTRL-F12 as much as you + want, but you will be limited by the power of one core of your computer's CPU. + You can see how much free time your real CPU's cores have by looking at + the Task Manager in Windows 2000/XP/Vista/7 and the System Monitor + in Windows 95/98/ME. Once 100% of the power of your computer's real CPU's one + core is used, there is no further way to speed up DOSBox (it will actually + start to slow down), unless you reduce the load generated by the non-CPU parts + of DOSBox. DOSBox can use only one core of your CPU, so If you have + for example a CPU with 4 cores, DOSBox will not be able to use the power + of three other cores. + + You can also force the fast behavior by setting cycles=max in the DOSBox + configuration file. The DOSBox window will display a line + "Cpu Speed: max 100% cycles" at the top then. This time you won't have to care + how much free time your real CPU's cores have, because DOSBox will always use + 100% of your real CPU's one core. In this mode you can reduce the amount + of your real CPU's core usage by CTRL-F11 or raise it with CTRL-F12. + +CPU Core (speed up) + On x86 architectures you can try to force the usage of a dynamically + recompiling core (set core=dynamic in the DOSBox configuration file). + This usually gives better results if the auto detection (core=auto) fails. + It is best accompanied by cycles=max. But you may also try using it with + high amounts of cycles (for example 20000 or more). Note that there might be + games that work worse/crash with the dynamic core (so save your game often), + or do not work at all! + +Graphics emulation (speed up) + VGA emulation is a demanding part of DOSBox in terms of actual CPU usage. + Increase the number of frames skipped (in increments of one) by pressing + CTRL-F8. Your CPU usage should decrease when using a fixed cycle setting, + and you will be able to increase cycles with CTRL-F12. + You can repeat this until the game runs fast enough for you. + Please note that this is a trade-off: you lose in fluidity of video what + you gain in speed. + +Sound emulation (speed up) + You can also try to disable the sound through the setup utility of the game + to reduce load on your CPU further. Setting nosound=true in DOSBox's + configuration does NOT disable the emulation of sound devices, just + the output of sound will be disabled. + +Also try to close every program but DOSBox to reserve as much resources +as possible for DOSBox. + + +Advanced cycles configuration: +The cycles=auto and cycles=max settings can be parameterized to have +different startup defaults. The syntax is + cycles=auto ["realmode default"] ["protected mode default"%] + [limit "cycle limit"] + cycles=max ["protected mode default"%] [limit "cycle limit"] +Example: + cycles=auto 5000 80% limit 20000 + will use cycles=5000 for real mode games, 80% CPU throttling for + protected mode games along with a hard cycle limit of 20000 + + + +==================== +11. Troubleshooting: +==================== + +General tip: + Check messages in DOSBox Status Window. See section 12. "DOSBox Status Window" + +DOSBox crashes right after starting it: + - use different values for the output= entry in your DOSBox + configuration file + - try to update your graphics card driver and DirectX + - (Linux) set the environment variable SDL_AUDIODRIVER to alsa or oss. + +Running a certain game closes DOSBox, crashes with some message or hangs: + - see if it works with a default DOSBox installation + (unmodified configuration file) + - try it with sound disabled (use the sound configuration + program that comes with the game, additionally you can + set sbtype=none and gus=false in the DOSBox configuration file) + - change some entries of the DOSBox configuration file, especially try: + core=normal + fixed cycles (for example cycles=10000) + ems=false + xms=false + or combinations of the above settings, + similar the machine settings that control the emulated chipset and + functionality: + machine=vesa_nolfb + or + machine=vgaonly + - use loadfix before starting the game + +The game exits to the DOSBox prompt with some error message: + - read the error message closely and try to locate the error + - try the hints at the above sections + - mount differently as some games are picky about the locations, + for example if you used "mount d d:\oldgames\game" try + "mount c d:\oldgames\game" and "mount c d:\oldgames" + - if the game requires a CD-ROM be sure you used "-t cdrom" when + mounting and try different additional parameters (the ioctl, + usecd and label switches, see the appropriate section) + - check the file permissions of the game files (remove read-only + attributes, add write permissions etc.) + - try reinstalling the game within DOSBox + + + +========================= +12. DOSBox Status Window: +========================= + +DOSBox's Staus window contains many useful information about your currant +configuration, your actions in DOSBox, errors that happened and more. +Whenever you have any problem with DOSBox check these messages. + +To start DOSBox Status Window: + (Windows) Status Window is being started together with main DOSBox window. + (Linux) You may have to start DOSBox from a console to see Status Window. + (MAC OS X) Right click on DOSBox.app, choose "Show Package Contents"-> + ->enter "Contents"->enter "MacOS"->run "DOSBox" + + + +===================================== +13. The configuration (options) file: +===================================== + +The configuration file is automatically created the first time you run DOSBox. +The file can be found in: + (Windows) "Start/WinLogo Menu"->"All Programs"->DOSBox-0.74->Options + (Linux) ~/.dosbox/dosbox-0.74.conf + (MAC OS X) "~/Library/Preferences/DOSBox 0.74 Preferences" +The file is divided into several sections. Each section starts with a +[section name] line. The settings are the property=value lines where value can +be altered to customize DOSBox. +# and % indicate comment-lines. + + +An extra configuration file can be generated by CONFIG.COM, which can be found +on the internal DOSBox Z: drive when you start up DOSBox. Look in the Section 4: +"Internal programs" for usage of CONFIG.COM. You can start DOSBox with +the -conf switch to load the generated file and use its settings. + +DOSBox will load configuration files that are specified with -conf. If none were +specified, it will try to load "dosbox.conf" from the local directory. +If there is none, DOSBox will load the user configuration file. +This file will be created if it doesn't exist. + +Important!: In Windows Vista/7 the configuration file won't work correctly +if it is located in "Windows" or "Program Files" folder or their subfolders, +or directly on c:\, so the best place for storing extra configuration files is +for example: C:\oldgames + + + +====================== +14. The Language File: +====================== + +A language file can be generated by CONFIG.COM, which can be found on the +internal DOSBox Z: drive when you start up DOSBox. Look in the Section 4: +"Internal programs" for usage of CONFIG.COM. +Read the language file, and you will hopefully understand how to change it. +Start DOSBox with the -lang switch to use your new language file. +Alternatively, you can setup the filename in the configuration file +in the [dosbox] section. There's a language= entry that can be changed with +the filelocation. + + + +======================================== +15. Building your own version of DOSBox: +======================================== + +Download the source. +Check the INSTALL in the source distribution. + + + +=================== +16. Special thanks: +=================== + +See the THANKS file. + + + +============ +17. Contact: +============ + +See the site: +http://www.dosbox.com +for an email address (The Crew-page). + + diff --git a/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_THANKS.txt b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_THANKS.txt new file mode 100644 index 0000000..8b0e5d9 --- /dev/null +++ b/info.exult.exult/data/serpentisle/DOSBOX/Documentation/dosbox_THANKS.txt @@ -0,0 +1,29 @@ +We would like to thank: + + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gérardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + diff --git a/info.exult.exult/data/serpentisle/DOSBOX/GOGDOSConfig.exe b/info.exult.exult/data/serpentisle/DOSBOX/GOGDOSConfig.exe new file mode 100644 index 0000000..6310a3f Binary files /dev/null and b/info.exult.exult/data/serpentisle/DOSBOX/GOGDOSConfig.exe differ diff --git a/info.exult.exult/data/serpentisle/DOSBOX/SDL.dll b/info.exult.exult/data/serpentisle/DOSBOX/SDL.dll new file mode 100644 index 0000000..37d3151 Binary files /dev/null and b/info.exult.exult/data/serpentisle/DOSBOX/SDL.dll differ diff --git a/info.exult.exult/data/serpentisle/DOSBOX/SDL_net.dll b/info.exult.exult/data/serpentisle/DOSBOX/SDL_net.dll new file mode 100644 index 0000000..924e654 Binary files /dev/null and b/info.exult.exult/data/serpentisle/DOSBOX/SDL_net.dll differ diff --git a/info.exult.exult/data/serpentisle/DOSBOX/Video Codec/Video Instructions.txt b/info.exult.exult/data/serpentisle/DOSBOX/Video Codec/Video Instructions.txt new file mode 100644 index 0000000..1d15b4f --- /dev/null +++ b/info.exult.exult/data/serpentisle/DOSBOX/Video Codec/Video Instructions.txt @@ -0,0 +1,35 @@ +Starting with version 0.65, DOSBox allows you to create movies out of screen +output. + +To record a movie, you have to press CTRL-ALT-F5. +To stop/end the recording, you have to press CTRL-ALT-F5 again. + +To play the recorded movie, you need a movie player which can handle the +ZMBV codec. MS Windows users can find this codec in the start menu entry of +DOSBox. Users of Linux and other OSes should look for a movie player that +uses the ffmpeg libary (you may need to update or ask your distribution to +upgrade). + +FAQ: +Q: During the display of the movies the sound is lagging. +A: Check your display properties to see whether your refresh rate is set to +at least 70 hz. Try playing the movie in virtualdub (http://virtualdub.sf.net) + +Q: Why does the resulting movie consist of multiple files? +A: Each time the game changes resolution, DOSBox creates a new movie file, +because a movie file can only contain one resolution. + +Q: Can I set the cycles higher than my PC can handle during recording? +A: Yes. During recording, the game might play slowly and stuttering, but the +resulting movie should play at the intended speed and have no stuttering. + +Q: CTRL-ALT-F5 switches to the console under linux. +A: 1. Start DOSBox like this: dosbox -startmapper + 2. Click on Video, click on Add + 3. Press the key you want (for example scroll lock or printscreen) + 4. Click exit. + 5. You can make movies by pressing scroll lock or whichever key you + selected. + +Q: The colours are wrong and I'm using 64 bit windows +A: Look here: http://vogons.zetafleet.com/viewtopic.php?t=12133 diff --git a/info.exult.exult/data/serpentisle/DOSBOX/Video Codec/zmbv.dll b/info.exult.exult/data/serpentisle/DOSBOX/Video Codec/zmbv.dll new file mode 100644 index 0000000..c6c0eb6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/DOSBOX/Video Codec/zmbv.dll differ diff --git a/info.exult.exult/data/serpentisle/DOSBOX/Video Codec/zmbv.inf b/info.exult.exult/data/serpentisle/DOSBOX/Video Codec/zmbv.inf new file mode 100644 index 0000000..a98ea01 --- /dev/null +++ b/info.exult.exult/data/serpentisle/DOSBOX/Video Codec/zmbv.inf @@ -0,0 +1,105 @@ +[Version] +Signature="$CHICAGO$" +Provider=%ZMBV_PUBLISHER% +Class=MEDIA + + +[DefaultInstall] +CopyFiles=ZMBV.Files.Inf,ZMBV.Files.Dll +AddReg=ZMBV.Reg9x +UpdateInis=ZMBV.INIs + +[DefaultInstall.ntx86] +CopyFiles=ZMBV.Files.Inf,ZMBV.Files.Dll +AddReg=ZMBV.RegNTx86 +UpdateInis=ZMBV.INIs + +[DefaultInstall.ntamd64] +CopyFiles=ZMBV.Files.Inf,ZMBV.Files.Dll.NTamd64 +AddReg=ZMBV.RegNTamd64 +UpdateInis=ZMBV.INIs + +[DefaultUnInstall] +DelFiles=ZMBV.Files.Dll,ZMBV.Files.Inf,ZMBV.Files.Ini +DelReg=ZMBV.Reg9x +UpdateInis=ZMBV.INIs.Del + +[DefaultUnInstall.ntx86] +DelFiles=ZMBV.Files.Dll,ZMBV.Files.Inf,ZMBV.Files.Ini +DelReg=ZMBV.RegNTx86 +UpdateInis=ZMBV.INIs.Del + +[DefaultUnInstall.ntamd64] +DelFiles=ZMBV.Files.Dll.NTamd64,ZMBV.Files.Inf,ZMBV.Files.Ini +DelReg=ZMBV.RegNTamd64 +UpdateInis=ZMBV.INIs.Del + +[SourceDisksNames] +1="Zip Motion Block Video codec","",1 + +[SourceDisksFiles] +ZMBV.INF=1 + +[DestinationDirs] +ZMBV.Files.Inf=17 +ZMBV.Files.Dll=11 +ZMBV.Files.Dll.NTamd64=10,SysWOW64 +ZMBV.Files.Ini=25 + +[ZMBV.Files.Inf] +zmbv.inf + +[ZMBV.Files.Dll] +zmbv.dll + +[ZMBV.Files.Dll.NTamd64] +zmbv.dll + +[ZMBV.Files.Ini] +zmbv.ini + +[ZMBV.Reg9x] +HKLM,SYSTEM\CurrentControlSet\Control\MediaResources\icm\VIDC.ZMBV,Description,,"%ZMBV_DISPLAY_NAME%" +HKLM,SYSTEM\CurrentControlSet\Control\MediaResources\icm\VIDC.ZMBV,Driver,,"zmbv.dll" +HKLM,SYSTEM\CurrentControlSet\Control\MediaResources\icm\VIDC.ZMBV,FriendlyName,,"%ZMBV_DISPLAY_NAME%" + +HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV +HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,DisplayName,,"%ZMBV_UNINST_DISPLAY_NAME%" +HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,UninstallString,,"rundll.exe setupx.dll,InstallHinfSection DefaultUninstall 132 %17%\ZMBV.INF" + +[ZMBV.RegNTx86] +HKLM,SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers.desc,zmbv.dll,,"%ZMBV_DISPLAY_NAME%" +HKLM,SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers32,vidc.zmbv,,zmbv.dll + +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,DisplayName,,"%ZMBV_UNINST_DISPLAY_NAME%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,Publisher,,"%ZMBV_PUBLISHER%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,URLInfoAbout,,"%ZMBV_URL_HOMEPAGE%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,NoRepair,0x10001,01,00,00,00 +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,NoModify,0x10001,01,00,00,00 +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,UninstallString,,"rundll32.exe setupapi,InstallHinfSection DefaultUninstall 132 %17%\ZMBV.INF" + +[ZMBV.RegNTamd64] +HKLM,SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\drivers.desc,zmbv.dll,,"%ZMBV_DISPLAY_NAME%" +HKLM,SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\drivers32,vidc.zmbv,,zmbv.dll + +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,DisplayName,,"%ZMBV_UNINST_DISPLAY_NAME%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,Publisher,,"%ZMBV_PUBLISHER%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,URLInfoAbout,,"%ZMBV_URL_HOMEPAGE%" +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,NoRepair,0x10001,01,00,00,00 +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,NoModify,0x10001,01,00,00,00 +HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ZMBV,UninstallString,,"rundll32.exe setupapi.dll,InstallHinfSection DefaultUninstall 132 %17%\ZMBV.INF" + +[ZMBV.INIs] +system.ini, drivers32,, "VIDC.ZMBV=zmbv.dll" + +[ZMBV.INIs.Del] +system.ini, drivers32, "VIDC.ZMBV=zmbv.dll" + +[Strings] +ZMBV_PUBLISHER = "DOSBox Team" +ZMBV_DISPLAY_NAME = "Zip Motion Block Video [ZMBV]" +ZMBV_UNINST_DISPLAY_NAME = "Zip Motion Block Video codec (Remove Only)" +ZMBV_URL_HOMEPAGE = "http://www.dosbox.com/" +CODEC_INSTALLATION_FINISHED = "Zip Motion Block Video codec installation is complete." diff --git a/info.exult.exult/data/serpentisle/DOSBOX/dosbox-0.74.tar.gz b/info.exult.exult/data/serpentisle/DOSBOX/dosbox-0.74.tar.gz new file mode 100644 index 0000000..cf8c323 Binary files /dev/null and b/info.exult.exult/data/serpentisle/DOSBOX/dosbox-0.74.tar.gz differ diff --git a/info.exult.exult/data/serpentisle/ENDGAME.EXE b/info.exult.exult/data/serpentisle/ENDGAME.EXE new file mode 100644 index 0000000..79d31d2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/ENDGAME.EXE differ diff --git a/info.exult.exult/data/serpentisle/INSTALL.EXE b/info.exult.exult/data/serpentisle/INSTALL.EXE new file mode 100644 index 0000000..94564bc Binary files /dev/null and b/info.exult.exult/data/serpentisle/INSTALL.EXE differ diff --git a/info.exult.exult/data/serpentisle/INSTALL.PRM b/info.exult.exult/data/serpentisle/INSTALL.PRM new file mode 100644 index 0000000..c6c4a5d Binary files /dev/null and b/info.exult.exult/data/serpentisle/INSTALL.PRM differ diff --git a/info.exult.exult/data/serpentisle/INTRO.EXE b/info.exult.exult/data/serpentisle/INTRO.EXE new file mode 100644 index 0000000..183947c Binary files /dev/null and b/info.exult.exult/data/serpentisle/INTRO.EXE differ diff --git a/info.exult.exult/data/serpentisle/MAINMENU.EXE b/info.exult.exult/data/serpentisle/MAINMENU.EXE new file mode 100644 index 0000000..308e638 Binary files /dev/null and b/info.exult.exult/data/serpentisle/MAINMENU.EXE differ diff --git a/info.exult.exult/data/serpentisle/READTHIS.TXT b/info.exult.exult/data/serpentisle/READTHIS.TXT new file mode 100644 index 0000000..ba58b4b --- /dev/null +++ b/info.exult.exult/data/serpentisle/READTHIS.TXT @@ -0,0 +1,37 @@ +Serpent Isle Screen Saver Information: + + +An OriginFX Screen Saver module is included with your Serpent Isle game. This +module will display the cinematic sequences from Serpent Isle while running +the OriginFX Screen Saver. To view the module, you must first have the +OriginFX Screen Saver installed under Windows 3.x. From Windows, run +"setup.exe" which is in the Serpent Isle directory to install the module. + +If you finish Serpent Isle and wish to remove it from your hard drive but +still wish to view the cinematics with the screen saver, you can delete +every file in your Serpent Isle installation directory except the following: + + serpent\static\intro.dat. + +Please note: Microsoft Windows 3.x is capable of running in many different +screen resolutions and color depths. The best mode to view the OriginFX +Screen Saver is 640 by 480 with 256 colors. Windows does not default to this +mode, so you must consult your video card manual to learn how to switch +into 640x480x256. + +Advanced video card owners: OriginFX has been tested on a wide range of +video cards and has been found to be compatible with the vast majority of +them. If you experience problems running the OriginFX modules on your +system, make sure you have the latest Windows drivers for your card. If +your card is capable of caching bitmaps in video RAM, make sure this feature +is turned OFF. + +Pro Audio Spectrum owners: We have found that the OriginFX Screen Saver will +play music on the PAS as long as "MVSOUND.SYS" is loaded in your config.sys. +This file should be included on your PAS disks. Simply select "Sound Blaster" +from the OriginFX preferences screen. + + + + + \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/SERP.BAT b/info.exult.exult/data/serpentisle/SERP.BAT new file mode 100644 index 0000000..c2aefc2 --- /dev/null +++ b/info.exult.exult/data/serpentisle/SERP.BAT @@ -0,0 +1,20 @@ +@echo off +rem Serpent Isle batch file +rem Created by Myque Ouellette +rem 11/24/97 + +@echo off +if not exist test.cfg goto sound +goto main + +:sound +install +copy serpent.cfg test.cfg +goto main + +:main +serpent.com +goto end + + +:end diff --git a/info.exult.exult/data/serpentisle/SERPENT.COM b/info.exult.exult/data/serpentisle/SERPENT.COM new file mode 100644 index 0000000..4d96955 Binary files /dev/null and b/info.exult.exult/data/serpentisle/SERPENT.COM differ diff --git a/info.exult.exult/data/serpentisle/SETUP.EXE b/info.exult.exult/data/serpentisle/SETUP.EXE new file mode 100644 index 0000000..6166eb5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/SETUP.EXE differ diff --git a/info.exult.exult/data/serpentisle/SI.BAT b/info.exult.exult/data/serpentisle/SI.BAT new file mode 100644 index 0000000..7c1bc33 --- /dev/null +++ b/info.exult.exult/data/serpentisle/SI.BAT @@ -0,0 +1,22 @@ +@echo off +rem Serpent Isle batch file +rem Created by Myque Ouellette +rem 11/24/97 + +cd serpent + +@echo off +if not exist test.cfg goto sound +goto main + +:sound +install +copy serpent.cfg test.cfg +goto main + +:main +serpent.com +goto end + + +:end diff --git a/info.exult.exult/data/serpentisle/SI.EXE b/info.exult.exult/data/serpentisle/SI.EXE new file mode 100644 index 0000000..b7b4f97 Binary files /dev/null and b/info.exult.exult/data/serpentisle/SI.EXE differ diff --git a/info.exult.exult/data/serpentisle/STATIC/ADLIB.ADV b/info.exult.exult/data/serpentisle/STATIC/ADLIB.ADV new file mode 100644 index 0000000..775e799 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/ADLIB.ADV differ diff --git a/info.exult.exult/data/serpentisle/STATIC/ADLIBMUS.DAT b/info.exult.exult/data/serpentisle/STATIC/ADLIBMUS.DAT new file mode 100644 index 0000000..4d123d9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/ADLIBMUS.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/ADLIBSFX.DAT b/info.exult.exult/data/serpentisle/STATIC/ADLIBSFX.DAT new file mode 100644 index 0000000..24487c0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/ADLIBSFX.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/AMMO.DAT b/info.exult.exult/data/serpentisle/STATIC/AMMO.DAT new file mode 100644 index 0000000..26cbc59 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/AMMO.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/ARMOR.DAT b/info.exult.exult/data/serpentisle/STATIC/ARMOR.DAT new file mode 100644 index 0000000..ae52003 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/ARMOR.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/AVFAR.PAL b/info.exult.exult/data/serpentisle/STATIC/AVFAR.PAL new file mode 100644 index 0000000..13a8485 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/AVFAR.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/AVFLOAT.PAL b/info.exult.exult/data/serpentisle/STATIC/AVFLOAT.PAL new file mode 100644 index 0000000..6861655 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/AVFLOAT.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/AVGRAB.PAL b/info.exult.exult/data/serpentisle/STATIC/AVGRAB.PAL new file mode 100644 index 0000000..9e0517b Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/AVGRAB.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/A_SEND.XMI b/info.exult.exult/data/serpentisle/STATIC/A_SEND.XMI new file mode 100644 index 0000000..1929a4d Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/A_SEND.XMI differ diff --git a/info.exult.exult/data/serpentisle/STATIC/A_SINTRO.XMI b/info.exult.exult/data/serpentisle/STATIC/A_SINTRO.XMI new file mode 100644 index 0000000..beac60f Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/A_SINTRO.XMI differ diff --git a/info.exult.exult/data/serpentisle/STATIC/A_VALOR.XMI b/info.exult.exult/data/serpentisle/STATIC/A_VALOR.XMI new file mode 100644 index 0000000..51c1050 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/A_VALOR.XMI differ diff --git a/info.exult.exult/data/serpentisle/STATIC/CASTLE.PAL b/info.exult.exult/data/serpentisle/STATIC/CASTLE.PAL new file mode 100644 index 0000000..a1ffc31 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/CASTLE.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/EQUIP.DAT b/info.exult.exult/data/serpentisle/STATIC/EQUIP.DAT new file mode 100644 index 0000000..a56617a Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/EQUIP.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/FACES.VGA b/info.exult.exult/data/serpentisle/STATIC/FACES.VGA new file mode 100644 index 0000000..25250ad Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/FACES.VGA differ diff --git a/info.exult.exult/data/serpentisle/STATIC/FONT0000.VGA b/info.exult.exult/data/serpentisle/STATIC/FONT0000.VGA new file mode 100644 index 0000000..ce714bf Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/FONT0000.VGA differ diff --git a/info.exult.exult/data/serpentisle/STATIC/FONTS.VGA b/info.exult.exult/data/serpentisle/STATIC/FONTS.VGA new file mode 100644 index 0000000..935b68c Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/FONTS.VGA differ diff --git a/info.exult.exult/data/serpentisle/STATIC/FUTURE.PAL b/info.exult.exult/data/serpentisle/STATIC/FUTURE.PAL new file mode 100644 index 0000000..5d76c91 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/FUTURE.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/GUMPS.VGA b/info.exult.exult/data/serpentisle/STATIC/GUMPS.VGA new file mode 100644 index 0000000..f175615 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/GUMPS.VGA differ diff --git a/info.exult.exult/data/serpentisle/STATIC/ICE2_155.PAL b/info.exult.exult/data/serpentisle/STATIC/ICE2_155.PAL new file mode 100644 index 0000000..99289ff Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/ICE2_155.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/ICE3_155.PAL b/info.exult.exult/data/serpentisle/STATIC/ICE3_155.PAL new file mode 100644 index 0000000..1a1782a Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/ICE3_155.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/ICE4B155.PAL b/info.exult.exult/data/serpentisle/STATIC/ICE4B155.PAL new file mode 100644 index 0000000..92f013c Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/ICE4B155.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/INITGAME.DAT b/info.exult.exult/data/serpentisle/STATIC/INITGAME.DAT new file mode 100644 index 0000000..7ef6f66 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/INITGAME.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/INTRO.DAT b/info.exult.exult/data/serpentisle/STATIC/INTRO.DAT new file mode 100644 index 0000000..5a8c4a7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/INTRO.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/LBLOGO.PAL b/info.exult.exult/data/serpentisle/STATIC/LBLOGO.PAL new file mode 100644 index 0000000..1260634 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/LBLOGO.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/LINKDEP1 b/info.exult.exult/data/serpentisle/STATIC/LINKDEP1 new file mode 100644 index 0000000..3d9d943 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/LINKDEP1 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/LINKDEP2 b/info.exult.exult/data/serpentisle/STATIC/LINKDEP2 new file mode 100644 index 0000000..d16c8f0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/LINKDEP2 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/MAINMENU.DRV b/info.exult.exult/data/serpentisle/STATIC/MAINMENU.DRV new file mode 100644 index 0000000..fd2d0a4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/MAINMENU.DRV differ diff --git a/info.exult.exult/data/serpentisle/STATIC/MAINMENU.TIM b/info.exult.exult/data/serpentisle/STATIC/MAINMENU.TIM new file mode 100644 index 0000000..d244381 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/MAINMENU.TIM differ diff --git a/info.exult.exult/data/serpentisle/STATIC/MAINSHP.FLX b/info.exult.exult/data/serpentisle/STATIC/MAINSHP.FLX new file mode 100644 index 0000000..6b1c86d Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/MAINSHP.FLX differ diff --git a/info.exult.exult/data/serpentisle/STATIC/MODERN.PAL b/info.exult.exult/data/serpentisle/STATIC/MODERN.PAL new file mode 100644 index 0000000..fa4e9b6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/MODERN.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/MONSTERS.DAT b/info.exult.exult/data/serpentisle/STATIC/MONSTERS.DAT new file mode 100644 index 0000000..38aa2b6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/MONSTERS.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/MT32MPU.ADV b/info.exult.exult/data/serpentisle/STATIC/MT32MPU.ADV new file mode 100644 index 0000000..c315c93 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/MT32MPU.ADV differ diff --git a/info.exult.exult/data/serpentisle/STATIC/MT32MUS.DAT b/info.exult.exult/data/serpentisle/STATIC/MT32MUS.DAT new file mode 100644 index 0000000..663372a Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/MT32MUS.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/MT32SFX.DAT b/info.exult.exult/data/serpentisle/STATIC/MT32SFX.DAT new file mode 100644 index 0000000..33b421c Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/MT32SFX.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/OCCLUDE.DAT b/info.exult.exult/data/serpentisle/STATIC/OCCLUDE.DAT new file mode 100644 index 0000000..fcaf325 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/OCCLUDE.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/PALETTES.FLX b/info.exult.exult/data/serpentisle/STATIC/PALETTES.FLX new file mode 100644 index 0000000..3aa2e31 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/PALETTES.FLX differ diff --git a/info.exult.exult/data/serpentisle/STATIC/PAPERDOL.VGA b/info.exult.exult/data/serpentisle/STATIC/PAPERDOL.VGA new file mode 100644 index 0000000..b6202f2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/PAPERDOL.VGA differ diff --git a/info.exult.exult/data/serpentisle/STATIC/PERCUSSY.XMI b/info.exult.exult/data/serpentisle/STATIC/PERCUSSY.XMI new file mode 100644 index 0000000..c8a0599 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/PERCUSSY.XMI differ diff --git a/info.exult.exult/data/serpentisle/STATIC/POINTERS.SHP b/info.exult.exult/data/serpentisle/STATIC/POINTERS.SHP new file mode 100644 index 0000000..1197345 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/POINTERS.SHP differ diff --git a/info.exult.exult/data/serpentisle/STATIC/READY.DAT b/info.exult.exult/data/serpentisle/STATIC/READY.DAT new file mode 100644 index 0000000..5f42903 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/READY.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/R_SEND.XMI b/info.exult.exult/data/serpentisle/STATIC/R_SEND.XMI new file mode 100644 index 0000000..f6506d8 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/R_SEND.XMI differ diff --git a/info.exult.exult/data/serpentisle/STATIC/R_SINTRO.XMI b/info.exult.exult/data/serpentisle/STATIC/R_SINTRO.XMI new file mode 100644 index 0000000..4dc7830 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/R_SINTRO.XMI differ diff --git a/info.exult.exult/data/serpentisle/STATIC/R_VALOR.XMI b/info.exult.exult/data/serpentisle/STATIC/R_VALOR.XMI new file mode 100644 index 0000000..7ba360f Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/R_VALOR.XMI differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SANCTUM1.PAL b/info.exult.exult/data/serpentisle/STATIC/SANCTUM1.PAL new file mode 100644 index 0000000..95dc991 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SANCTUM1.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SANCTUM2.PAL b/info.exult.exult/data/serpentisle/STATIC/SANCTUM2.PAL new file mode 100644 index 0000000..3aacc7f Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SANCTUM2.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SANCTUM3.PAL b/info.exult.exult/data/serpentisle/STATIC/SANCTUM3.PAL new file mode 100644 index 0000000..78f4de3 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SANCTUM3.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SBDIG.ADV b/info.exult.exult/data/serpentisle/STATIC/SBDIG.ADV new file mode 100644 index 0000000..d1daed9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SBDIG.ADV differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SBPDIG.ADV b/info.exult.exult/data/serpentisle/STATIC/SBPDIG.ADV new file mode 100644 index 0000000..9a9b043 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SBPDIG.ADV differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SCHEDULE.DAT b/info.exult.exult/data/serpentisle/STATIC/SCHEDULE.DAT new file mode 100644 index 0000000..04273f7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SCHEDULE.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SERPDRAW.DLL b/info.exult.exult/data/serpentisle/STATIC/SERPDRAW.DLL new file mode 100644 index 0000000..5fc16b3 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SERPDRAW.DLL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SERPENT.OFX b/info.exult.exult/data/serpentisle/STATIC/SERPENT.OFX new file mode 100644 index 0000000..06af312 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SERPENT.OFX differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SHAPES.VGA b/info.exult.exult/data/serpentisle/STATIC/SHAPES.VGA new file mode 100644 index 0000000..14ee28f Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SHAPES.VGA differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SHPDIMS.DAT b/info.exult.exult/data/serpentisle/STATIC/SHPDIMS.DAT new file mode 100644 index 0000000..4c6b404 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SHPDIMS.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SISPEECH.SPC b/info.exult.exult/data/serpentisle/STATIC/SISPEECH.SPC new file mode 100644 index 0000000..8e30987 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SISPEECH.SPC differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SNAKE1.PAL b/info.exult.exult/data/serpentisle/STATIC/SNAKE1.PAL new file mode 100644 index 0000000..1656ca0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SNAKE1.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SNAKE2.PAL b/info.exult.exult/data/serpentisle/STATIC/SNAKE2.PAL new file mode 100644 index 0000000..d745d0d Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SNAKE2.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SNDDRVRS.DAT b/info.exult.exult/data/serpentisle/STATIC/SNDDRVRS.DAT new file mode 100644 index 0000000..5aa8ffa Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SNDDRVRS.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/SPRITES.VGA b/info.exult.exult/data/serpentisle/STATIC/SPRITES.VGA new file mode 100644 index 0000000..c5023c1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/SPRITES.VGA differ diff --git a/info.exult.exult/data/serpentisle/STATIC/TEXT.FLX b/info.exult.exult/data/serpentisle/STATIC/TEXT.FLX new file mode 100644 index 0000000..3064c7c Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/TEXT.FLX differ diff --git a/info.exult.exult/data/serpentisle/STATIC/TFA.DAT b/info.exult.exult/data/serpentisle/STATIC/TFA.DAT new file mode 100644 index 0000000..02f6098 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/TFA.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U72_LOGO.PAL b/info.exult.exult/data/serpentisle/STATIC/U72_LOGO.PAL new file mode 100644 index 0000000..527b804 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U72_LOGO.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7CHUNKS b/info.exult.exult/data/serpentisle/STATIC/U7CHUNKS new file mode 100644 index 0000000..0950842 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7CHUNKS differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX00 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX00 new file mode 100644 index 0000000..22dc09a Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX00 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX01 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX01 new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX01 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX02 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX02 new file mode 100644 index 0000000..c2b156e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX02 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX03 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX03 new file mode 100644 index 0000000..0fca0f4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX03 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX04 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX04 new file mode 100644 index 0000000..62c94b8 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX04 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX05 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX05 new file mode 100644 index 0000000..6df94f7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX05 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX06 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX06 new file mode 100644 index 0000000..947c32d Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX06 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX07 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX07 new file mode 100644 index 0000000..224c0d4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX07 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX08 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX08 new file mode 100644 index 0000000..49717e5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX08 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX09 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX09 new file mode 100644 index 0000000..9fae782 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX09 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX0A b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0A new file mode 100644 index 0000000..b91f6ac Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0A differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX0B b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0B new file mode 100644 index 0000000..ce1fa4f Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0B differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX0C b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0C new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0C differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX0D b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0D new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0D differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX0E b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0E new file mode 100644 index 0000000..3dfbaf4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0E differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX0F b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0F new file mode 100644 index 0000000..c9a9fe8 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX0F differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX10 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX10 new file mode 100644 index 0000000..020f4f0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX10 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX11 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX11 new file mode 100644 index 0000000..f5cab24 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX11 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX12 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX12 new file mode 100644 index 0000000..4044c81 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX12 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX13 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX13 new file mode 100644 index 0000000..12083a5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX13 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX14 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX14 new file mode 100644 index 0000000..1e4366f Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX14 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX15 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX15 new file mode 100644 index 0000000..f22017b Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX15 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX16 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX16 new file mode 100644 index 0000000..333a911 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX16 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX17 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX17 new file mode 100644 index 0000000..5cbb99d Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX17 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX18 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX18 new file mode 100644 index 0000000..886e8e6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX18 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX19 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX19 new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX19 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX1A b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1A new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1A differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX1B b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1B new file mode 100644 index 0000000..c4677fe Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1B differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX1C b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1C new file mode 100644 index 0000000..acdbb2e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1C differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX1D b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1D new file mode 100644 index 0000000..508be63 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1D differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX1E b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1E new file mode 100644 index 0000000..9f507b3 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1E differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX1F b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1F new file mode 100644 index 0000000..c95d1a5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX1F differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX20 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX20 new file mode 100644 index 0000000..541eff7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX20 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX21 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX21 new file mode 100644 index 0000000..11a742f Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX21 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX22 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX22 new file mode 100644 index 0000000..048e3fc Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX22 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX23 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX23 new file mode 100644 index 0000000..8728aa7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX23 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX24 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX24 new file mode 100644 index 0000000..50400ba Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX24 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX25 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX25 new file mode 100644 index 0000000..275d1df Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX25 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX26 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX26 new file mode 100644 index 0000000..002d5e5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX26 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX27 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX27 new file mode 100644 index 0000000..a16c410 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX27 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX28 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX28 new file mode 100644 index 0000000..2c52910 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX28 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX29 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX29 new file mode 100644 index 0000000..2cd0b11 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX29 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX2A b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2A new file mode 100644 index 0000000..2a1efc2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2A differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX2B b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2B new file mode 100644 index 0000000..64afc98 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2B differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX2C b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2C new file mode 100644 index 0000000..ea8f4df Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2C differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX2D b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2D new file mode 100644 index 0000000..fcc708c Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2D differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX2E b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2E new file mode 100644 index 0000000..06c39bb Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2E differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX2F b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2F new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX2F differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX30 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX30 new file mode 100644 index 0000000..b838a04 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX30 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX31 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX31 new file mode 100644 index 0000000..14b48c2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX31 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX32 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX32 new file mode 100644 index 0000000..af5f45a Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX32 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX33 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX33 new file mode 100644 index 0000000..607cfb5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX33 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX34 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX34 new file mode 100644 index 0000000..8271777 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX34 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX35 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX35 new file mode 100644 index 0000000..5ec1e7d Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX35 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX36 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX36 new file mode 100644 index 0000000..7088c8b Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX36 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX37 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX37 new file mode 100644 index 0000000..1eb781e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX37 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX38 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX38 new file mode 100644 index 0000000..3802f8e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX38 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX39 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX39 new file mode 100644 index 0000000..b99dd97 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX39 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX3A b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3A new file mode 100644 index 0000000..1b7ae2d Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3A differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX3B b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3B new file mode 100644 index 0000000..8e5118e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3B differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX3C b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3C new file mode 100644 index 0000000..2a7e47e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3C differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX3D b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3D new file mode 100644 index 0000000..3749a76 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3D differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX3E b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3E new file mode 100644 index 0000000..1e25963 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3E differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX3F b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3F new file mode 100644 index 0000000..1705842 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX3F differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX40 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX40 new file mode 100644 index 0000000..1328cba Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX40 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX41 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX41 new file mode 100644 index 0000000..53f4420 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX41 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX42 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX42 new file mode 100644 index 0000000..e194690 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX42 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX43 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX43 new file mode 100644 index 0000000..c8e1e64 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX43 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX44 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX44 new file mode 100644 index 0000000..4d39d0a Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX44 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX45 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX45 new file mode 100644 index 0000000..6ab34a1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX45 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX46 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX46 new file mode 100644 index 0000000..da89449 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX46 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX47 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX47 new file mode 100644 index 0000000..d982718 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX47 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX48 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX48 new file mode 100644 index 0000000..8538eea Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX48 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX49 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX49 new file mode 100644 index 0000000..ff1fbe9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX49 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX4A b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4A new file mode 100644 index 0000000..9ae9afc Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4A differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX4B b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4B new file mode 100644 index 0000000..7f1fdd2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4B differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX4C b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4C new file mode 100644 index 0000000..9d1d356 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4C differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX4D b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4D new file mode 100644 index 0000000..bd51ea7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4D differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX4E b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4E new file mode 100644 index 0000000..3cec3ac Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4E differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX4F b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4F new file mode 100644 index 0000000..7414684 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX4F differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX50 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX50 new file mode 100644 index 0000000..d7d946f Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX50 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX51 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX51 new file mode 100644 index 0000000..dd11357 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX51 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX52 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX52 new file mode 100644 index 0000000..4dc2d2b Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX52 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX53 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX53 new file mode 100644 index 0000000..44c11a5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX53 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX54 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX54 new file mode 100644 index 0000000..ca25096 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX54 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX55 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX55 new file mode 100644 index 0000000..41afff9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX55 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX56 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX56 new file mode 100644 index 0000000..3d8e033 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX56 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX57 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX57 new file mode 100644 index 0000000..f289357 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX57 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX58 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX58 new file mode 100644 index 0000000..cd21caf Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX58 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX59 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX59 new file mode 100644 index 0000000..3ca397d Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX59 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX5A b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5A new file mode 100644 index 0000000..948d291 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5A differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX5B b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5B new file mode 100644 index 0000000..b8050ca Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5B differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX5C b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5C new file mode 100644 index 0000000..b8b4e48 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5C differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX5D b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5D new file mode 100644 index 0000000..b07ead5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5D differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX5E b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5E new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5E differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX5F b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5F new file mode 100644 index 0000000..e0d58a9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX5F differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX60 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX60 new file mode 100644 index 0000000..b854551 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX60 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX61 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX61 new file mode 100644 index 0000000..06f42f3 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX61 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX62 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX62 new file mode 100644 index 0000000..772ac6e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX62 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX63 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX63 new file mode 100644 index 0000000..5340ed0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX63 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX64 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX64 new file mode 100644 index 0000000..07a6d32 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX64 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX65 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX65 new file mode 100644 index 0000000..09acfee Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX65 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX66 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX66 new file mode 100644 index 0000000..1dd8b41 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX66 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX67 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX67 new file mode 100644 index 0000000..32c35b7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX67 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX68 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX68 new file mode 100644 index 0000000..39311e3 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX68 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX69 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX69 new file mode 100644 index 0000000..642bdef Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX69 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX6A b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6A new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6A differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX6B b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6B new file mode 100644 index 0000000..0aace66 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6B differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX6C b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6C new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6C differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX6D b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6D new file mode 100644 index 0000000..71d59a4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6D differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX6E b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6E new file mode 100644 index 0000000..2567a78 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6E differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX6F b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6F new file mode 100644 index 0000000..be98aa0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX6F differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX70 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX70 new file mode 100644 index 0000000..6d5c6e9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX70 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX71 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX71 new file mode 100644 index 0000000..1c0c5e1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX71 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX72 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX72 new file mode 100644 index 0000000..6126874 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX72 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX73 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX73 new file mode 100644 index 0000000..ce5ef65 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX73 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX74 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX74 new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX74 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX75 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX75 new file mode 100644 index 0000000..e98f4a6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX75 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX76 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX76 new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX76 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX77 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX77 new file mode 100644 index 0000000..bb10b16 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX77 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX78 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX78 new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX78 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX79 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX79 new file mode 100644 index 0000000..f024984 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX79 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX7A b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7A new file mode 100644 index 0000000..d72f9e5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7A differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX7B b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7B new file mode 100644 index 0000000..d05ce67 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7B differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX7C b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7C new file mode 100644 index 0000000..dfc75d2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7C differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX7D b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7D new file mode 100644 index 0000000..cf5e855 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7D differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX7E b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7E new file mode 100644 index 0000000..2dcd789 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7E differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX7F b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7F new file mode 100644 index 0000000..9ec3758 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX7F differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX80 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX80 new file mode 100644 index 0000000..539c3e2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX80 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX81 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX81 new file mode 100644 index 0000000..e10f369 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX81 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX82 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX82 new file mode 100644 index 0000000..245aab1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX82 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX83 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX83 new file mode 100644 index 0000000..bd14f45 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX83 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX84 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX84 new file mode 100644 index 0000000..22c09f7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX84 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX85 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX85 new file mode 100644 index 0000000..f36366d Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX85 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX86 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX86 new file mode 100644 index 0000000..f5dbede Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX86 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX87 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX87 new file mode 100644 index 0000000..d03b967 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX87 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX88 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX88 new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX88 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX89 b/info.exult.exult/data/serpentisle/STATIC/U7IFIX89 new file mode 100644 index 0000000..e0b07e6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX89 differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX8A b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8A new file mode 100644 index 0000000..fd79dd9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8A differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX8B b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8B new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8B differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX8C b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8C new file mode 100644 index 0000000..8dac61e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8C differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX8D b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8D new file mode 100644 index 0000000..f58e5c1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8D differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX8E b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8E new file mode 100644 index 0000000..d561a2d Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8E differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7IFIX8F b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8F new file mode 100644 index 0000000..d0278ac Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7IFIX8F differ diff --git a/info.exult.exult/data/serpentisle/STATIC/U7MAP b/info.exult.exult/data/serpentisle/STATIC/U7MAP new file mode 100644 index 0000000..9771e1e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/U7MAP differ diff --git a/info.exult.exult/data/serpentisle/STATIC/ULTIMA.PAL b/info.exult.exult/data/serpentisle/STATIC/ULTIMA.PAL new file mode 100644 index 0000000..8ba4ecb Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/ULTIMA.PAL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/USECODE b/info.exult.exult/data/serpentisle/STATIC/USECODE new file mode 100644 index 0000000..2cdf49b Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/USECODE differ diff --git a/info.exult.exult/data/serpentisle/STATIC/WEAPONS.DAT b/info.exult.exult/data/serpentisle/STATIC/WEAPONS.DAT new file mode 100644 index 0000000..16a6a6e Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/WEAPONS.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/WGTVOL.DAT b/info.exult.exult/data/serpentisle/STATIC/WGTVOL.DAT new file mode 100644 index 0000000..696fb73 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/WGTVOL.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/WIHH.DAT b/info.exult.exult/data/serpentisle/STATIC/WIHH.DAT new file mode 100644 index 0000000..2d21f42 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/WIHH.DAT differ diff --git a/info.exult.exult/data/serpentisle/STATIC/XFORM.TBL b/info.exult.exult/data/serpentisle/STATIC/XFORM.TBL new file mode 100644 index 0000000..0107b71 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/XFORM.TBL differ diff --git a/info.exult.exult/data/serpentisle/STATIC/XMIDI.AD b/info.exult.exult/data/serpentisle/STATIC/XMIDI.AD new file mode 100644 index 0000000..bfdeec4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/XMIDI.AD differ diff --git a/info.exult.exult/data/serpentisle/STATIC/XMIDI.MT b/info.exult.exult/data/serpentisle/STATIC/XMIDI.MT new file mode 100644 index 0000000..5983af2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/STATIC/XMIDI.MT differ diff --git a/info.exult.exult/data/serpentisle/TEMP0003.$$$ b/info.exult.exult/data/serpentisle/TEMP0003.$$$ new file mode 100644 index 0000000..4af6620 Binary files /dev/null and b/info.exult.exult/data/serpentisle/TEMP0003.$$$ differ diff --git a/info.exult.exult/data/serpentisle/__redist/ISI/scriptinterpreter.exe b/info.exult.exult/data/serpentisle/__redist/ISI/scriptinterpreter.exe new file mode 100644 index 0000000..c211ff1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/__redist/ISI/scriptinterpreter.exe differ diff --git a/info.exult.exult/data/serpentisle/__support/app/SERPENT.CFG b/info.exult.exult/data/serpentisle/__support/app/SERPENT.CFG new file mode 100644 index 0000000..902bc15 --- /dev/null +++ b/info.exult.exult/data/serpentisle/__support/app/SERPENT.CFG @@ -0,0 +1,2 @@ +s 388 +220 7 1 o diff --git a/info.exult.exult/data/serpentisle/__support/app/TEST.CFG b/info.exult.exult/data/serpentisle/__support/app/TEST.CFG new file mode 100644 index 0000000..902bc15 --- /dev/null +++ b/info.exult.exult/data/serpentisle/__support/app/TEST.CFG @@ -0,0 +1,2 @@ +s 388 +220 7 1 o diff --git a/info.exult.exult/data/serpentisle/__support/app/dosboxSERPENT.conf b/info.exult.exult/data/serpentisle/__support/app/dosboxSERPENT.conf new file mode 100644 index 0000000..ce840fb --- /dev/null +++ b/info.exult.exult/data/serpentisle/__support/app/dosboxSERPENT.conf @@ -0,0 +1,230 @@ +# This is the configurationfile for DOSBox 0.74. (Please use the latest version of DOSBox) +# Lines starting with a # are commentlines and are ignored by DOSBox. +# They are used to (briefly) document the effect of each option. + +[sdl] +# fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back) +# fulldouble: Use double buffering in fullscreen. It can reduce screen flickering, but it can also result in a slow DOSBox. +# fullresolution: What resolution to use for fullscreen: original or fixed size (e.g. 1024x768). +# Using your monitor's native resolution with aspect=true might give the best results. +# If you end up with small window on a large screen, try an output different from surface. +# windowresolution: Scale the window to this size IF the output device supports hardware scaling. +# (output=surface does not!) +# output: What video system to use for output. +# Possible values: surface, overlay, opengl, openglnb, ddraw. +# autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock) +# sensitivity: Mouse sensitivity. +# waitonerror: Wait before closing the console if dosbox has an error. +# priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. +# pause is only valid for the second entry. +# Possible values: lowest, lower, normal, higher, highest, pause. +# mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the defaul value. +# usescancodes: Avoid usage of symkeys, might not work on all operating systems. + +fullscreen=true +fulldouble=false +fullresolution=desktop +windowresolution=original +output=overlay +autolock=true +sensitivity=100 +waitonerror=true +priority=higher,normal +mapperfile=mapper-0.74.map +usescancodes=true + +[dosbox] +# language: Select another language file. +# machine: The type of machine tries to emulate. +# Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe. +# captures: Directory where things like wave, midi, screenshot get captured. +# memsize: Amount of memory DOSBox has in megabytes. +# This value is best left at its default to avoid problems with some games, +# though few games might require a higher value. +# There is generally no speed advantage when raising this value. + +language= +machine=svga_s3 +captures=capture +memsize=16 + +[render] +# frameskip: How many frames DOSBox skips before drawing one. +# aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!. +# scaler: Scaler used to enlarge/enhance low resolution modes. +# If 'forced' is appended, then the scaler will be used even if the result might not be desired. +# Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x. + +frameskip=0 +aspect=false +scaler=normal2x + +[cpu] +# core: CPU Core used in emulation. auto will switch to dynamic if available and appropriate. +# Possible values: auto, dynamic, normal, simple. +# cputype: CPU Type used in emulation. auto is the fastest choice. +# Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch. +# cycles: Amount of instructions DOSBox tries to emulate each millisecond. +# Setting this value too high results in sound dropouts and lags. +# Cycles can be set in 3 ways: +# 'auto' tries to guess what a game needs. +# It usually works, but can fail for certain games. +# 'fixed #number' will set a fixed amount of cycles. This is what you usually need if 'auto' fails. +# (Example: fixed 4000). +# 'max' will allocate as much cycles as your computer is able to handle. +# +# Possible values: auto, fixed, max. +# cycleup: Amount of cycles to decrease/increase with keycombo.(CTRL-F11/CTRL-F12) +# cycledown: Setting it lower than 100 will be a percentage. + +core=auto +cputype=auto +cycles=fixed 14000 +cycleup=1000 +cycledown=1000 + +[mixer] +# nosound: Enable silent mode, sound is still emulated though. +# rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality. +# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716. +# blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged. +# Possible values: 1024, 2048, 4096, 8192, 512, 256. +# prebuffer: How many milliseconds of data to keep on top of the blocksize. + +nosound=false +rate=44100 +blocksize=1024 +prebuffer=80 + +[midi] +# mpu401: Type of MPU-401 to emulate. +# Possible values: intelligent, uart, none. +# mididevice: Device that will receive the MIDI data from MPU-401. +# Possible values: default, win32, alsa, oss, coreaudio, coremidi, none. +# midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use. See README for details. + +mpu401=intelligent +mididevice=default +midiconfig= + +[sblaster] +# sbtype: Type of sblaster to emulate. +# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, none. +# sbbase: The IO address of the soundblaster. +# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300. +# irq: The IRQ number of the soundblaster. +# Possible values: 7, 5, 3, 9, 10, 11, 12. +# dma: The DMA number of the soundblaster. +# Possible values: 1, 5, 0, 3, 6, 7. +# hdma: The High DMA number of the soundblaster. +# Possible values: 1, 5, 0, 3, 6, 7. +# sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer. +# oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'. +# Possible values: auto, cms, opl2, dualopl2, opl3, none. +# oplemu: Provider for the OPL emulation. compat or old might provide better quality (see oplrate as well). +# Possible values: default, compat, fast, old. +# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly). +# Possible values: 22050, 49716, 44100, 48000, 32000, 16000, 11025, 8000. + +sbtype=sb16 +sbbase=220 +irq=7 +dma=1 +hdma=5 +sbmixer=true +oplmode=auto +oplemu=default +oplrate=44100 + +[gus] +# gus: Enable the Gravis Ultrasound emulation. +# gusrate: Sample rate of Ultrasound emulation. +# Possible values: 22050, 44100, 48000, 32000, 16000, 11025, 8000, 49716. +# gusbase: The IO base address of the Gravis Ultrasound. +# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300. +# gusirq: The IRQ number of the Gravis Ultrasound. +# Possible values: 5, 3, 7, 9, 10, 11, 12. +# gusdma: The DMA channel of the Gravis Ultrasound. +# Possible values: 3, 0, 1, 5, 6, 7. +# ultradir: Path to Ultrasound directory. In this directory +# there should be a MIDI directory that contains +# the patch files for GUS playback. Patch sets used +# with Timidity should work fine. + +gus=true +gusrate=22050 +gusbase=240 +gusirq=5 +gusdma=3 +ultradir=C:\ULTRASND + +[speaker] +# pcspeaker: Enable PC-Speaker emulation. +# pcrate: Sample rate of the PC-Speaker sound generation. +# Possible values: 22050, 44100, 48000, 32000, 16000, 11025, 8000, 49716. +# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'. +# Possible values: auto, on, off. +# tandyrate: Sample rate of the Tandy 3-Voice generation. +# Possible values: 22050, 44100, 48000, 32000, 16000, 11025, 8000, 49716. +# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible). + +pcspeaker=true +pcrate=22050 +tandy=auto +tandyrate=22050 +disney=true + +[joystick] +# joysticktype: Type of joystick to emulate: auto (default), none, +# 2axis (supports two joysticks), +# 4axis (supports one joystick, first joystick used), +# 4axis_2 (supports one joystick, second joystick used), +# fcs (Thrustmaster), ch (CH Flightstick). +# none disables joystick emulation. +# auto chooses emulation depending on real joystick(s). +# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none. +# timed: enable timed intervals for axis. (false is old style behaviour). +# autofire: continuously fires as long as you keep the button pressed. +# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks. +# buttonwrap: enable button wrapping at the number of emulated buttons. + +joysticktype=auto +timed=true +autofire=false +swap34=false +buttonwrap=true + +[serial] +# serial1: set type of device connected to com port. +# Can be disabled, dummy, modem, nullmodem, directserial. +# Additional parameters must be in the same line in the form of +# parameter:value. Parameter for all types is irq. +# for directserial: realport (required), rxdelay (optional). +# (realport:COM1 realport:ttyS0). +# for modem: listenport (optional). +# for nullmodem: server, rxdelay, txdelay, telnet, usedtr, +# transparent, port, inhsocket (all optional). +# Example: serial1=modem listenport:5000 +# Possible values: dummy, disabled, modem, nullmodem, directserial. +# serial2: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, directserial. +# serial3: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, directserial. +# serial4: see serial1 +# Possible values: dummy, disabled, modem, nullmodem, directserial. + +serial1=dummy +serial2=dummy +serial3=disabled +serial4=disabled + +[dos] +# xms: Enable XMS support. +# ems: Enable EMS support. +# umb: Enable UMB support. +# keyboardlayout: Language code of the keyboard layout (or none). + +xms=true +ems=false +umb=true +keyboardlayout=auto \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/__support/app/dosboxSERPENT_settings.conf b/info.exult.exult/data/serpentisle/__support/app/dosboxSERPENT_settings.conf new file mode 100644 index 0000000..502fee9 --- /dev/null +++ b/info.exult.exult/data/serpentisle/__support/app/dosboxSERPENT_settings.conf @@ -0,0 +1,12 @@ +[ipx] +# ipx: Enable ipx over UDP/IP emulation. + +ipx=false + +[autoexec] +@echo off +mount C ".." +cls +c: +install.exe +exit \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/__support/app/dosboxSERPENT_single.conf b/info.exult.exult/data/serpentisle/__support/app/dosboxSERPENT_single.conf new file mode 100644 index 0000000..9d58993 --- /dev/null +++ b/info.exult.exult/data/serpentisle/__support/app/dosboxSERPENT_single.conf @@ -0,0 +1,12 @@ +[ipx] +# ipx: Enable ipx over UDP/IP emulation. + +ipx=false + +[autoexec] +@echo off +mount C ".." +cls +c: +serpent.com +exit \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/answers.pdf b/info.exult.exult/data/serpentisle/answers.pdf new file mode 100644 index 0000000..d0390aa Binary files /dev/null and b/info.exult.exult/data/serpentisle/answers.pdf differ diff --git a/info.exult.exult/data/serpentisle/app/goggame-1207662633.ico b/info.exult.exult/data/serpentisle/app/goggame-1207662633.ico new file mode 100644 index 0000000..32ecf28 Binary files /dev/null and b/info.exult.exult/data/serpentisle/app/goggame-1207662633.ico differ diff --git a/info.exult.exult/data/serpentisle/app/webcache.zip b/info.exult.exult/data/serpentisle/app/webcache.zip new file mode 100644 index 0000000..b05d251 Binary files /dev/null and b/info.exult.exult/data/serpentisle/app/webcache.zip differ diff --git a/info.exult.exult/data/serpentisle/commonappdata/GOG.com/supportInstaller/uninstall.dll b/info.exult.exult/data/serpentisle/commonappdata/GOG.com/supportInstaller/uninstall.dll new file mode 100644 index 0000000..89b17e6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/commonappdata/GOG.com/supportInstaller/uninstall.dll differ diff --git a/info.exult.exult/data/serpentisle/gamedat/ACTION.DAT b/info.exult.exult/data/serpentisle/gamedat/ACTION.DAT new file mode 100644 index 0000000..ba31c83 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/ACTION.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/AV_FLAGS.DAT b/info.exult.exult/data/serpentisle/gamedat/AV_FLAGS.DAT new file mode 100644 index 0000000..a46f12c Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/AV_FLAGS.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/FLAGINIT b/info.exult.exult/data/serpentisle/gamedat/FLAGINIT new file mode 100644 index 0000000..e92cb5b Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/FLAGINIT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/FRAMES.FLG b/info.exult.exult/data/serpentisle/gamedat/FRAMES.FLG new file mode 100644 index 0000000..65b4796 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/FRAMES.FLG differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMA.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMA.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMA.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMB.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMB.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMB.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMC.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMC.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMC.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMD.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMD.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMD.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIME.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIME.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIME.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMF.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMF.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMF.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMG.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMG.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMG.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMH.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMH.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMH.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMI.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMI.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMI.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMJ.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMJ.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMJ.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMK.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMK.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMK.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIML.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIML.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIML.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMM.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMM.DAT new file mode 100644 index 0000000..13e58a2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMM.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GAMETIMN.DAT b/info.exult.exult/data/serpentisle/gamedat/GAMETIMN.DAT new file mode 100644 index 0000000..1b59f33 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GAMETIMN.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/GUMPMGR.DAT b/info.exult.exult/data/serpentisle/gamedat/GUMPMGR.DAT new file mode 100644 index 0000000..74b8d86 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/GUMPMGR.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/IDENTITY b/info.exult.exult/data/serpentisle/gamedat/IDENTITY new file mode 100644 index 0000000..16e4e07 --- /dev/null +++ b/info.exult.exult/data/serpentisle/gamedat/IDENTITY @@ -0,0 +1 @@ +SILVER SEED \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/gamedat/ITEMNODE.DAT b/info.exult.exult/data/serpentisle/gamedat/ITEMNODE.DAT new file mode 100644 index 0000000..b617d37 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/ITEMNODE.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/MAPCOORD.DAT b/info.exult.exult/data/serpentisle/gamedat/MAPCOORD.DAT new file mode 100644 index 0000000..c34198d Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/MAPCOORD.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/MISSTRAC.DAT b/info.exult.exult/data/serpentisle/gamedat/MISSTRAC.DAT new file mode 100644 index 0000000..0486914 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/MISSTRAC.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/OPTIONS.CFG b/info.exult.exult/data/serpentisle/gamedat/OPTIONS.CFG new file mode 100644 index 0000000..4ca90be --- /dev/null +++ b/info.exult.exult/data/serpentisle/gamedat/OPTIONS.CFG @@ -0,0 +1,4 @@ +MUSIC ON + SPEECH ON + SFX ON + \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/gamedat/PARTY b/info.exult.exult/data/serpentisle/gamedat/PARTY new file mode 100644 index 0000000..43886f8 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/PARTY differ diff --git a/info.exult.exult/data/serpentisle/gamedat/PATH.DAT b/info.exult.exult/data/serpentisle/gamedat/PATH.DAT new file mode 100644 index 0000000..a7b3804 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/PATH.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/PHILBERT.DAT b/info.exult.exult/data/serpentisle/gamedat/PHILBERT.DAT new file mode 100644 index 0000000..350204a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/PHILBERT.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/RANDSEED.DAT b/info.exult.exult/data/serpentisle/gamedat/RANDSEED.DAT new file mode 100644 index 0000000..4b694f9 --- /dev/null +++ b/info.exult.exult/data/serpentisle/gamedat/RANDSEED.DAT @@ -0,0 +1 @@ +4-í \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/gamedat/SCHEDULE.DAT b/info.exult.exult/data/serpentisle/gamedat/SCHEDULE.DAT new file mode 100644 index 0000000..4dddcb6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/SCHEDULE.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IBUF.DAT b/info.exult.exult/data/serpentisle/gamedat/U7IBUF.DAT new file mode 100644 index 0000000..c5d610b Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IBUF.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG00 b/info.exult.exult/data/serpentisle/gamedat/U7IREG00 new file mode 100644 index 0000000..0c318ad Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG00 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG01 b/info.exult.exult/data/serpentisle/gamedat/U7IREG01 new file mode 100644 index 0000000..c106293 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG01 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG02 b/info.exult.exult/data/serpentisle/gamedat/U7IREG02 new file mode 100644 index 0000000..61e4507 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG02 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG03 b/info.exult.exult/data/serpentisle/gamedat/U7IREG03 new file mode 100644 index 0000000..ec09932 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG03 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG04 b/info.exult.exult/data/serpentisle/gamedat/U7IREG04 new file mode 100644 index 0000000..c3491f1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG04 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG05 b/info.exult.exult/data/serpentisle/gamedat/U7IREG05 new file mode 100644 index 0000000..6f0bedb Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG05 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG06 b/info.exult.exult/data/serpentisle/gamedat/U7IREG06 new file mode 100644 index 0000000..88c3308 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG06 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG07 b/info.exult.exult/data/serpentisle/gamedat/U7IREG07 new file mode 100644 index 0000000..fb69c86 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG07 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG08 b/info.exult.exult/data/serpentisle/gamedat/U7IREG08 new file mode 100644 index 0000000..f26262b Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG08 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG09 b/info.exult.exult/data/serpentisle/gamedat/U7IREG09 new file mode 100644 index 0000000..89cfd5c Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG09 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG0A b/info.exult.exult/data/serpentisle/gamedat/U7IREG0A new file mode 100644 index 0000000..eabe735 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG0A differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG0B b/info.exult.exult/data/serpentisle/gamedat/U7IREG0B new file mode 100644 index 0000000..5c14045 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG0B differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG0C b/info.exult.exult/data/serpentisle/gamedat/U7IREG0C new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG0C differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG0D b/info.exult.exult/data/serpentisle/gamedat/U7IREG0D new file mode 100644 index 0000000..2330698 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG0D differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG0E b/info.exult.exult/data/serpentisle/gamedat/U7IREG0E new file mode 100644 index 0000000..3e557ee Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG0E differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG0F b/info.exult.exult/data/serpentisle/gamedat/U7IREG0F new file mode 100644 index 0000000..c917d80 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG0F differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG10 b/info.exult.exult/data/serpentisle/gamedat/U7IREG10 new file mode 100644 index 0000000..b8ed028 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG10 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG11 b/info.exult.exult/data/serpentisle/gamedat/U7IREG11 new file mode 100644 index 0000000..03384f1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG11 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG12 b/info.exult.exult/data/serpentisle/gamedat/U7IREG12 new file mode 100644 index 0000000..92c61d3 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG12 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG13 b/info.exult.exult/data/serpentisle/gamedat/U7IREG13 new file mode 100644 index 0000000..11e735e Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG13 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG14 b/info.exult.exult/data/serpentisle/gamedat/U7IREG14 new file mode 100644 index 0000000..a4ed91f Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG14 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG15 b/info.exult.exult/data/serpentisle/gamedat/U7IREG15 new file mode 100644 index 0000000..ebf442a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG15 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG16 b/info.exult.exult/data/serpentisle/gamedat/U7IREG16 new file mode 100644 index 0000000..ac6e63d Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG16 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG17 b/info.exult.exult/data/serpentisle/gamedat/U7IREG17 new file mode 100644 index 0000000..0cd478a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG17 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG18 b/info.exult.exult/data/serpentisle/gamedat/U7IREG18 new file mode 100644 index 0000000..d5ce120 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG18 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG19 b/info.exult.exult/data/serpentisle/gamedat/U7IREG19 new file mode 100644 index 0000000..72288ef Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG19 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG1A b/info.exult.exult/data/serpentisle/gamedat/U7IREG1A new file mode 100644 index 0000000..c381902 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG1A differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG1B b/info.exult.exult/data/serpentisle/gamedat/U7IREG1B new file mode 100644 index 0000000..1e99a98 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG1B differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG1C b/info.exult.exult/data/serpentisle/gamedat/U7IREG1C new file mode 100644 index 0000000..4287f2f Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG1C differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG1D b/info.exult.exult/data/serpentisle/gamedat/U7IREG1D new file mode 100644 index 0000000..fc649ba Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG1D differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG1E b/info.exult.exult/data/serpentisle/gamedat/U7IREG1E new file mode 100644 index 0000000..7764832 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG1E differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG1F b/info.exult.exult/data/serpentisle/gamedat/U7IREG1F new file mode 100644 index 0000000..3394a11 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG1F differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG20 b/info.exult.exult/data/serpentisle/gamedat/U7IREG20 new file mode 100644 index 0000000..8c57599 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG20 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG21 b/info.exult.exult/data/serpentisle/gamedat/U7IREG21 new file mode 100644 index 0000000..fcb6eef Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG21 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG22 b/info.exult.exult/data/serpentisle/gamedat/U7IREG22 new file mode 100644 index 0000000..a5ca997 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG22 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG23 b/info.exult.exult/data/serpentisle/gamedat/U7IREG23 new file mode 100644 index 0000000..43b14a9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG23 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG24 b/info.exult.exult/data/serpentisle/gamedat/U7IREG24 new file mode 100644 index 0000000..a7795e1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG24 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG25 b/info.exult.exult/data/serpentisle/gamedat/U7IREG25 new file mode 100644 index 0000000..b499b14 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG25 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG26 b/info.exult.exult/data/serpentisle/gamedat/U7IREG26 new file mode 100644 index 0000000..b693d0a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG26 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG27 b/info.exult.exult/data/serpentisle/gamedat/U7IREG27 new file mode 100644 index 0000000..c71dd7d Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG27 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG28 b/info.exult.exult/data/serpentisle/gamedat/U7IREG28 new file mode 100644 index 0000000..aa80c25 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG28 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG29 b/info.exult.exult/data/serpentisle/gamedat/U7IREG29 new file mode 100644 index 0000000..451d47f Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG29 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG2A b/info.exult.exult/data/serpentisle/gamedat/U7IREG2A new file mode 100644 index 0000000..cc3ce47 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG2A differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG2B b/info.exult.exult/data/serpentisle/gamedat/U7IREG2B new file mode 100644 index 0000000..7fef943 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG2B differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG2C b/info.exult.exult/data/serpentisle/gamedat/U7IREG2C new file mode 100644 index 0000000..2cb8448 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG2C differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG2D b/info.exult.exult/data/serpentisle/gamedat/U7IREG2D new file mode 100644 index 0000000..08e7765 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG2D differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG2E b/info.exult.exult/data/serpentisle/gamedat/U7IREG2E new file mode 100644 index 0000000..6a2ba17 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG2E differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG2F b/info.exult.exult/data/serpentisle/gamedat/U7IREG2F new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG2F differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG30 b/info.exult.exult/data/serpentisle/gamedat/U7IREG30 new file mode 100644 index 0000000..6063dad Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG30 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG31 b/info.exult.exult/data/serpentisle/gamedat/U7IREG31 new file mode 100644 index 0000000..bd8b1b1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG31 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG32 b/info.exult.exult/data/serpentisle/gamedat/U7IREG32 new file mode 100644 index 0000000..4c27665 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG32 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG33 b/info.exult.exult/data/serpentisle/gamedat/U7IREG33 new file mode 100644 index 0000000..f0d9fa7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG33 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG34 b/info.exult.exult/data/serpentisle/gamedat/U7IREG34 new file mode 100644 index 0000000..027fd18 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG34 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG35 b/info.exult.exult/data/serpentisle/gamedat/U7IREG35 new file mode 100644 index 0000000..a55a339 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG35 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG36 b/info.exult.exult/data/serpentisle/gamedat/U7IREG36 new file mode 100644 index 0000000..c0bae74 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG36 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG37 b/info.exult.exult/data/serpentisle/gamedat/U7IREG37 new file mode 100644 index 0000000..1093cbb Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG37 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG38 b/info.exult.exult/data/serpentisle/gamedat/U7IREG38 new file mode 100644 index 0000000..b8ff885 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG38 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG39 b/info.exult.exult/data/serpentisle/gamedat/U7IREG39 new file mode 100644 index 0000000..4a268b9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG39 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG3A b/info.exult.exult/data/serpentisle/gamedat/U7IREG3A new file mode 100644 index 0000000..51d0742 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG3A differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG3B b/info.exult.exult/data/serpentisle/gamedat/U7IREG3B new file mode 100644 index 0000000..3e7e228 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG3B differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG3C b/info.exult.exult/data/serpentisle/gamedat/U7IREG3C new file mode 100644 index 0000000..a319b2a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG3C differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG3D b/info.exult.exult/data/serpentisle/gamedat/U7IREG3D new file mode 100644 index 0000000..75516a4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG3D differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG3E b/info.exult.exult/data/serpentisle/gamedat/U7IREG3E new file mode 100644 index 0000000..1f7cbb6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG3E differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG3F b/info.exult.exult/data/serpentisle/gamedat/U7IREG3F new file mode 100644 index 0000000..3147191 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG3F differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG40 b/info.exult.exult/data/serpentisle/gamedat/U7IREG40 new file mode 100644 index 0000000..9e51916 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG40 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG41 b/info.exult.exult/data/serpentisle/gamedat/U7IREG41 new file mode 100644 index 0000000..204ab74 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG41 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG42 b/info.exult.exult/data/serpentisle/gamedat/U7IREG42 new file mode 100644 index 0000000..493e101 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG42 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG43 b/info.exult.exult/data/serpentisle/gamedat/U7IREG43 new file mode 100644 index 0000000..e038f5f Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG43 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG44 b/info.exult.exult/data/serpentisle/gamedat/U7IREG44 new file mode 100644 index 0000000..f091703 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG44 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG45 b/info.exult.exult/data/serpentisle/gamedat/U7IREG45 new file mode 100644 index 0000000..e41c917 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG45 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG46 b/info.exult.exult/data/serpentisle/gamedat/U7IREG46 new file mode 100644 index 0000000..fe21b78 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG46 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG47 b/info.exult.exult/data/serpentisle/gamedat/U7IREG47 new file mode 100644 index 0000000..499cd31 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG47 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG48 b/info.exult.exult/data/serpentisle/gamedat/U7IREG48 new file mode 100644 index 0000000..1234638 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG48 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG49 b/info.exult.exult/data/serpentisle/gamedat/U7IREG49 new file mode 100644 index 0000000..0d78acf Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG49 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG4A b/info.exult.exult/data/serpentisle/gamedat/U7IREG4A new file mode 100644 index 0000000..f8b24b6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG4A differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG4B b/info.exult.exult/data/serpentisle/gamedat/U7IREG4B new file mode 100644 index 0000000..0a2943e Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG4B differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG4C b/info.exult.exult/data/serpentisle/gamedat/U7IREG4C new file mode 100644 index 0000000..7690612 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG4C differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG4D b/info.exult.exult/data/serpentisle/gamedat/U7IREG4D new file mode 100644 index 0000000..baac888 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG4D differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG4E b/info.exult.exult/data/serpentisle/gamedat/U7IREG4E new file mode 100644 index 0000000..ec743e5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG4E differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG4F b/info.exult.exult/data/serpentisle/gamedat/U7IREG4F new file mode 100644 index 0000000..c552dfa Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG4F differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG50 b/info.exult.exult/data/serpentisle/gamedat/U7IREG50 new file mode 100644 index 0000000..72fe710 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG50 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG51 b/info.exult.exult/data/serpentisle/gamedat/U7IREG51 new file mode 100644 index 0000000..87a58ff Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG51 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG52 b/info.exult.exult/data/serpentisle/gamedat/U7IREG52 new file mode 100644 index 0000000..c38657d Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG52 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG53 b/info.exult.exult/data/serpentisle/gamedat/U7IREG53 new file mode 100644 index 0000000..c1cc05f Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG53 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG54 b/info.exult.exult/data/serpentisle/gamedat/U7IREG54 new file mode 100644 index 0000000..1b9a3fd Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG54 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG55 b/info.exult.exult/data/serpentisle/gamedat/U7IREG55 new file mode 100644 index 0000000..fd81da4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG55 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG56 b/info.exult.exult/data/serpentisle/gamedat/U7IREG56 new file mode 100644 index 0000000..ea747ed Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG56 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG57 b/info.exult.exult/data/serpentisle/gamedat/U7IREG57 new file mode 100644 index 0000000..bf1cf60 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG57 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG58 b/info.exult.exult/data/serpentisle/gamedat/U7IREG58 new file mode 100644 index 0000000..a5bff90 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG58 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG59 b/info.exult.exult/data/serpentisle/gamedat/U7IREG59 new file mode 100644 index 0000000..b7ee142 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG59 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG5A b/info.exult.exult/data/serpentisle/gamedat/U7IREG5A new file mode 100644 index 0000000..cc6a7f9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG5A differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG5B b/info.exult.exult/data/serpentisle/gamedat/U7IREG5B new file mode 100644 index 0000000..7593676 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG5B differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG5C b/info.exult.exult/data/serpentisle/gamedat/U7IREG5C new file mode 100644 index 0000000..1eaf41f Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG5C differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG5D b/info.exult.exult/data/serpentisle/gamedat/U7IREG5D new file mode 100644 index 0000000..2cc05ff Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG5D differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG5E b/info.exult.exult/data/serpentisle/gamedat/U7IREG5E new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG5E differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG5F b/info.exult.exult/data/serpentisle/gamedat/U7IREG5F new file mode 100644 index 0000000..2c98672 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG5F differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG60 b/info.exult.exult/data/serpentisle/gamedat/U7IREG60 new file mode 100644 index 0000000..be2cc40 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG60 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG61 b/info.exult.exult/data/serpentisle/gamedat/U7IREG61 new file mode 100644 index 0000000..5dc844a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG61 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG62 b/info.exult.exult/data/serpentisle/gamedat/U7IREG62 new file mode 100644 index 0000000..d538ba5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG62 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG63 b/info.exult.exult/data/serpentisle/gamedat/U7IREG63 new file mode 100644 index 0000000..2e1c92d Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG63 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG64 b/info.exult.exult/data/serpentisle/gamedat/U7IREG64 new file mode 100644 index 0000000..9de459a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG64 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG65 b/info.exult.exult/data/serpentisle/gamedat/U7IREG65 new file mode 100644 index 0000000..160c051 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG65 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG66 b/info.exult.exult/data/serpentisle/gamedat/U7IREG66 new file mode 100644 index 0000000..3681425 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG66 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG67 b/info.exult.exult/data/serpentisle/gamedat/U7IREG67 new file mode 100644 index 0000000..76ef9a1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG67 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG68 b/info.exult.exult/data/serpentisle/gamedat/U7IREG68 new file mode 100644 index 0000000..d14080c Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG68 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG69 b/info.exult.exult/data/serpentisle/gamedat/U7IREG69 new file mode 100644 index 0000000..90b5140 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG69 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG6A b/info.exult.exult/data/serpentisle/gamedat/U7IREG6A new file mode 100644 index 0000000..656ea40 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG6A differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG6B b/info.exult.exult/data/serpentisle/gamedat/U7IREG6B new file mode 100644 index 0000000..b2fb0dd Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG6B differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG6C b/info.exult.exult/data/serpentisle/gamedat/U7IREG6C new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG6C differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG6D b/info.exult.exult/data/serpentisle/gamedat/U7IREG6D new file mode 100644 index 0000000..56e708a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG6D differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG6E b/info.exult.exult/data/serpentisle/gamedat/U7IREG6E new file mode 100644 index 0000000..40cbc55 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG6E differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG6F b/info.exult.exult/data/serpentisle/gamedat/U7IREG6F new file mode 100644 index 0000000..1def8fa Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG6F differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG70 b/info.exult.exult/data/serpentisle/gamedat/U7IREG70 new file mode 100644 index 0000000..d1bdf6e Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG70 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG71 b/info.exult.exult/data/serpentisle/gamedat/U7IREG71 new file mode 100644 index 0000000..20a5f42 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG71 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG72 b/info.exult.exult/data/serpentisle/gamedat/U7IREG72 new file mode 100644 index 0000000..ae40fae Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG72 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG73 b/info.exult.exult/data/serpentisle/gamedat/U7IREG73 new file mode 100644 index 0000000..4eb09ac Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG73 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG74 b/info.exult.exult/data/serpentisle/gamedat/U7IREG74 new file mode 100644 index 0000000..ea0df0b Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG74 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG75 b/info.exult.exult/data/serpentisle/gamedat/U7IREG75 new file mode 100644 index 0000000..4ea0f9c Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG75 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG76 b/info.exult.exult/data/serpentisle/gamedat/U7IREG76 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG76 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG77 b/info.exult.exult/data/serpentisle/gamedat/U7IREG77 new file mode 100644 index 0000000..3b0505e Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG77 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG78 b/info.exult.exult/data/serpentisle/gamedat/U7IREG78 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG78 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG79 b/info.exult.exult/data/serpentisle/gamedat/U7IREG79 new file mode 100644 index 0000000..391167c Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG79 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG7A b/info.exult.exult/data/serpentisle/gamedat/U7IREG7A new file mode 100644 index 0000000..e70ed37 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG7A differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG7B b/info.exult.exult/data/serpentisle/gamedat/U7IREG7B new file mode 100644 index 0000000..6d9cf83 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG7B differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG7C b/info.exult.exult/data/serpentisle/gamedat/U7IREG7C new file mode 100644 index 0000000..79df0b5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG7C differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG7D b/info.exult.exult/data/serpentisle/gamedat/U7IREG7D new file mode 100644 index 0000000..961333a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG7D differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG7E b/info.exult.exult/data/serpentisle/gamedat/U7IREG7E new file mode 100644 index 0000000..4d4c734 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG7E differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG7F b/info.exult.exult/data/serpentisle/gamedat/U7IREG7F new file mode 100644 index 0000000..536c087 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG7F differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG80 b/info.exult.exult/data/serpentisle/gamedat/U7IREG80 new file mode 100644 index 0000000..f0a5ee1 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG80 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG81 b/info.exult.exult/data/serpentisle/gamedat/U7IREG81 new file mode 100644 index 0000000..c2f7a75 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG81 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG82 b/info.exult.exult/data/serpentisle/gamedat/U7IREG82 new file mode 100644 index 0000000..b51c49a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG82 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG83 b/info.exult.exult/data/serpentisle/gamedat/U7IREG83 new file mode 100644 index 0000000..3bd2bb7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG83 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG84 b/info.exult.exult/data/serpentisle/gamedat/U7IREG84 new file mode 100644 index 0000000..ff43599 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG84 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG85 b/info.exult.exult/data/serpentisle/gamedat/U7IREG85 new file mode 100644 index 0000000..01244e8 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG85 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG86 b/info.exult.exult/data/serpentisle/gamedat/U7IREG86 new file mode 100644 index 0000000..be37f74 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG86 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG87 b/info.exult.exult/data/serpentisle/gamedat/U7IREG87 new file mode 100644 index 0000000..4c65f84 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG87 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG88 b/info.exult.exult/data/serpentisle/gamedat/U7IREG88 new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG88 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG89 b/info.exult.exult/data/serpentisle/gamedat/U7IREG89 new file mode 100644 index 0000000..c6fff57 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG89 differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG8A b/info.exult.exult/data/serpentisle/gamedat/U7IREG8A new file mode 100644 index 0000000..825fa5a Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG8A differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG8B b/info.exult.exult/data/serpentisle/gamedat/U7IREG8B new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG8B differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG8C b/info.exult.exult/data/serpentisle/gamedat/U7IREG8C new file mode 100644 index 0000000..65f57c2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG8C differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG8D b/info.exult.exult/data/serpentisle/gamedat/U7IREG8D new file mode 100644 index 0000000..f33ec96 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG8D differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG8E b/info.exult.exult/data/serpentisle/gamedat/U7IREG8E new file mode 100644 index 0000000..10a8891 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG8E differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7IREG8F b/info.exult.exult/data/serpentisle/gamedat/U7IREG8F new file mode 100644 index 0000000..e7359cb Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7IREG8F differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7NBUF.DAT b/info.exult.exult/data/serpentisle/gamedat/U7NBUF.DAT new file mode 100644 index 0000000..1fcb160 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7NBUF.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/U7_OSTIA.DAT b/info.exult.exult/data/serpentisle/gamedat/U7_OSTIA.DAT new file mode 100644 index 0000000..c5eec25 Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/U7_OSTIA.DAT differ diff --git a/info.exult.exult/data/serpentisle/gamedat/WEATHER.DAT b/info.exult.exult/data/serpentisle/gamedat/WEATHER.DAT new file mode 100644 index 0000000..d42853c Binary files /dev/null and b/info.exult.exult/data/serpentisle/gamedat/WEATHER.DAT differ diff --git a/info.exult.exult/data/serpentisle/goggame-1207662633.hashdb b/info.exult.exult/data/serpentisle/goggame-1207662633.hashdb new file mode 100644 index 0000000..5f818db Binary files /dev/null and b/info.exult.exult/data/serpentisle/goggame-1207662633.hashdb differ diff --git a/info.exult.exult/data/serpentisle/goggame-1207662633.info b/info.exult.exult/data/serpentisle/goggame-1207662633.info new file mode 100644 index 0000000..dd1dd55 --- /dev/null +++ b/info.exult.exult/data/serpentisle/goggame-1207662633.info @@ -0,0 +1,76 @@ +{ + "buildId": "51402764769371785", + "clientId": "49552649834863310", + "gameId": "1207662633", + "language": "English", + "languages": [ + "en-US" + ], + "name": "Ultima VII - Serpent Isle", + "playTasks": [ + { + "arguments": "-conf \"..\\dosboxSERPENT.conf\" -conf \"..\\dosboxSERPENT_single.conf\" -noconsole -c \"exit\"", + "category": "game", + "isPrimary": true, + "languages": [ + "*" + ], + "name": "Ultima VII - Serpent Isle", + "path": "DOSBOX\\dosbox.exe", + "type": "FileTask", + "workingDir": "DOSBOX" + }, + { + "arguments": "1207662633", + "category": "tool", + "languages": [ + "*" + ], + "name": "Graphic Mode Setup", + "path": "DOSBOX\\GOGDOSConfig.exe", + "type": "FileTask", + "workingDir": "DOSBOX" + }, + { + "arguments": "-conf \"..\\dosboxSERPENT.conf\" -conf \"..\\dosboxSERPENT_settings.conf\" -noconsole -c \"exit\"", + "category": "tool", + "icon": "DOSBOX\\dosbox.exe", + "languages": [ + "*" + ], + "name": "Settings", + "path": "DOSBOX\\dosbox.exe", + "type": "FileTask", + "workingDir": "DOSBOX" + }, + { + "category": "document", + "languages": [ + "*" + ], + "link": "http://www.gog.com/support/ultima_7_complete", + "name": "Support", + "type": "URLTask" + }, + { + "category": "document", + "languages": [ + "*" + ], + "name": "Manual", + "path": "Manual.pdf", + "type": "FileTask" + }, + { + "category": "document", + "languages": [ + "*" + ], + "name": "The Answers", + "path": "answers.pdf", + "type": "FileTask" + } + ], + "rootGameId": "1207662633", + "version": 1 +} \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/goggame-1207662633.script b/info.exult.exult/data/serpentisle/goggame-1207662633.script new file mode 100644 index 0000000..97deee4 --- /dev/null +++ b/info.exult.exult/data/serpentisle/goggame-1207662633.script @@ -0,0 +1,37 @@ +{ + "actions": [ + { + "install": { + "action": "setRegistry", + "arguments": { + "root": "HKEY_LOCAL_MACHINE", + "subkey": "Software\\GOG.com\\Games\\{productID}", + "valueData": "{app}\\DOSBox", + "valueName": "DOSBOXFOLDER", + "valueType": "String" + } + }, + "languages": [ + "*" + ], + "name": "DOSBoxConfigLegacy1" + }, + { + "install": { + "action": "setRegistry", + "arguments": { + "root": "HKEY_LOCAL_MACHINE", + "subkey": "Software\\GOG.com\\Games\\{productID}", + "valueData": "dosboxSERPENT", + "valueName": "DOSBOXCONF", + "valueType": "String" + } + }, + "languages": [ + "*" + ], + "name": "DOSBoxConfigLegacy2" + } + ], + "productId": "1207662633" +} \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/manual.pdf b/info.exult.exult/data/serpentisle/manual.pdf new file mode 100644 index 0000000..40bfcad Binary files /dev/null and b/info.exult.exult/data/serpentisle/manual.pdf differ diff --git a/info.exult.exult/data/serpentisle/setup_ultima_vii_-_serpent_isle_1.0_(22308).exe b/info.exult.exult/data/serpentisle/setup_ultima_vii_-_serpent_isle_1.0_(22308).exe new file mode 100644 index 0000000..76b8c4e Binary files /dev/null and b/info.exult.exult/data/serpentisle/setup_ultima_vii_-_serpent_isle_1.0_(22308).exe differ diff --git a/info.exult.exult/data/serpentisle/tmp/1207667113_brazilian.jpg b/info.exult.exult/data/serpentisle/tmp/1207667113_brazilian.jpg new file mode 100644 index 0000000..dd5a357 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1207667113_brazilian.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1207667113_chinese.jpg b/info.exult.exult/data/serpentisle/tmp/1207667113_chinese.jpg new file mode 100644 index 0000000..b374047 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1207667113_chinese.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1207667113_english.jpg b/info.exult.exult/data/serpentisle/tmp/1207667113_english.jpg new file mode 100644 index 0000000..9bcfdb9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1207667113_english.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1207667113_french.jpg b/info.exult.exult/data/serpentisle/tmp/1207667113_french.jpg new file mode 100644 index 0000000..9156b2d Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1207667113_french.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1207667113_german.jpg b/info.exult.exult/data/serpentisle/tmp/1207667113_german.jpg new file mode 100644 index 0000000..3711001 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1207667113_german.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1207667113_polish.jpg b/info.exult.exult/data/serpentisle/tmp/1207667113_polish.jpg new file mode 100644 index 0000000..9d27857 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1207667113_polish.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1207667113_russian.jpg b/info.exult.exult/data/serpentisle/tmp/1207667113_russian.jpg new file mode 100644 index 0000000..7a50dd0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1207667113_russian.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1432039876_brazilian.jpg b/info.exult.exult/data/serpentisle/tmp/1432039876_brazilian.jpg new file mode 100644 index 0000000..49c668e Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1432039876_brazilian.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1432039876_chinese.jpg b/info.exult.exult/data/serpentisle/tmp/1432039876_chinese.jpg new file mode 100644 index 0000000..7809818 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1432039876_chinese.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1432039876_english.jpg b/info.exult.exult/data/serpentisle/tmp/1432039876_english.jpg new file mode 100644 index 0000000..fa75ec4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1432039876_english.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1432039876_french.jpg b/info.exult.exult/data/serpentisle/tmp/1432039876_french.jpg new file mode 100644 index 0000000..b7fcf15 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1432039876_french.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1432039876_german.jpg b/info.exult.exult/data/serpentisle/tmp/1432039876_german.jpg new file mode 100644 index 0000000..9e860f2 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1432039876_german.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1432039876_polish.jpg b/info.exult.exult/data/serpentisle/tmp/1432039876_polish.jpg new file mode 100644 index 0000000..630b72a Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1432039876_polish.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/1432039876_russian.jpg b/info.exult.exult/data/serpentisle/tmp/1432039876_russian.jpg new file mode 100644 index 0000000..8d937f3 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/1432039876_russian.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/BigFail.png b/info.exult.exult/data/serpentisle/tmp/BigFail.png new file mode 100644 index 0000000..fef35c3 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/BigFail.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/BigFail200.png b/info.exult.exult/data/serpentisle/tmp/BigFail200.png new file mode 100644 index 0000000..7b16f33 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/BigFail200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/BigOK.png b/info.exult.exult/data/serpentisle/tmp/BigOK.png new file mode 100644 index 0000000..33f4414 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/BigOK.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/BigOK200.png b/info.exult.exult/data/serpentisle/tmp/BigOK200.png new file mode 100644 index 0000000..9ea28f9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/BigOK200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/BigWarn.png b/info.exult.exult/data/serpentisle/tmp/BigWarn.png new file mode 100644 index 0000000..5ff7f5d Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/BigWarn.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/BigWarn200.png b/info.exult.exult/data/serpentisle/tmp/BigWarn200.png new file mode 100644 index 0000000..b016082 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/BigWarn200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/EULA.png b/info.exult.exult/data/serpentisle/tmp/EULA.png new file mode 100644 index 0000000..1017fb4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/EULA.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/EULA.txt b/info.exult.exult/data/serpentisle/tmp/EULA.txt new file mode 100644 index 0000000..e35fa4e --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/EULA.txt @@ -0,0 +1,1600 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM USER AGREEMENT + +## 1\. ABOUT THIS AGREEMENT + + + +1.1 This Agreement is a contract between you (we will further call you just +“youâ€) and GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Warsaw, Poland (we will +further call ourselves “GOG†or just “usâ€) and applies to www.GOG.COM, your +GOG user account, GOG GALAXY application (including GOG GALAXY store), any +games or videos or other content or services which you purchase or access via +us, the GOG web forums, GOG customer and technical support and other services +we provide to you (we'll just call all this “GOG services†for short). Here we +set out your rights and obligations as a recipient of GOG services. + + + +1.2. Additional terms may apply to GOG services and in such a case we will +post them for your acceptance. For example, if you would like to use the GOG +GALAXY application, the relevant terms will be posted for your acceptance +before you start using these services. + + + +1.3 Also, when we're talking about games, in-game content, virtual items or +currency or GOG videos or other content or services which you can purchase or +access via GOG services, we’ll just call them “GOG games†or “GOG videos†+respectively and when we talk about them all together they are “GOG contentâ€. + + + +1.4 We didn’t want to make this document too long, but keep in mind that by +accepting our User Agreement you also accept: + + * our [ Privacy Policy ](https://support.gog.com/hc/articles/212632109) \- which explains what data we collect from you and how we protect it, + + * [ GOG Code of Conduct ](https://support.gog.com/hc/articles/16033977811613) which is a set of rules you need to follow as part of our community, + + * [ Infringing Content and Copyright Policy ](https://support.gog.com/hc/articles/16033687971613) which explains how you can report unlawful content on GOG and what happens when you do. + + + +1.5 GOG works with trusted partners, including our related company CD PROJEKT +S.A., developers and publishers, payment providers, customer service software +providers and others (“Partnersâ€) – more on them later in this Agreement. + + + +1.6 If you're over 18, then welcome! If you're between 16 and 18, before we +extend an equally warm welcome, please ask your parent or guardian to review +and approve this Agreement on your behalf (because in some countries people +under a certain age cannot legally enter into contracts like this Agreement). +If you’re not 16 yet you cannot have a GOG account or use the GOG services +because legally we cannot handle personal data of children without a special +parental or guardian’s permission (but your parents/guardians are welcome to +sign up themselves). + +## 2\. USING GOG SERVICES AND GOG CONTENT + + + +2.1 We give you and other GOG users the personal right (known legally as a +'license') to use GOG services and to download, access and/or stream +(depending on the content) and use GOG content. This license is for your +personal use. We can stop or suspend this license in some situations, which +are explained later on. + + + +2.2 When you buy, access or install GOG games, you might have to agree to +additional contract terms with the developer/publisher of the game (e.g. they +might ask you to agree to a game specific End User License Agreement). If +there is any inconsistency or dispute between those ‘EULAs’ and this +Agreement, then this Agreement wins. + + + +2.3 With GOG videos, you can also stream purchased video content or download +it to watch the way you want. + + + +2.4 Using certain third-party scripts is recommended for your full use of GOG +functionality and, although that usage is optional, we cannot promise full +service performance without them. + + + +2.5 A quick word about GOG GALAXY, which is our (optional) application which +not only allows you to buy and access GOG content but also provides cool +features like unified game library, and one friends list across platforms, +online multiplayer, achievements, cross-platform chat, game-time tracking, +cloud-saves and game overlay. You can learn more about +it[here](https://www.gog.com/galaxy). + + + +2.6 In some parts of GOG services, we use recommendation systems to present +you the content that you are most likely to be interested in. You can learn +where we use them and how they work[here](https://support.gog.com/hc/en- +us/articles/16034228157213), including what main parameters we use and how to +influence them. + +## 3\. GOG ACCOUNT + + + +3.1 To buy GOG content from GOG services, and in some cases to play/use GOG +content where our partners require use of a GOG account, you will need to set +up a GOG account. This will involve creating a password (which is encrypted so +we can’t access it) and a username, plus giving us (for identification +purposes) your email address. Please make sure your login credentials are kept +secure and your account is used properly. In your GOG account settings you can +also optionally set your country of residence, birthday and avatar. Our +Privacy Policy gives more details about the information we collect from you +and how we use it and protect it. +It's[here](https://support.gog.com/hc/articles/212632109). + + + +3.2 You can use your GOG account to set up a public profile accessible by +other people. You can also use your GOG account to connect with other GOG +users. Please act sensibly and remember you are responsible for your own +actions. + + + +3.3 Your GOG account and GOG content are personal to you and cannot be shared +with, sold, gifted or transferred to anyone else. Your access to and use of +them is subject to GOG’s [ Privacy Policy +](https://support.gog.com/hc/articles/212632109) and [ Code of Conduct +](https://support.gog.com/hc/articles/16033977811613) which are updated or +amended when necessary. + + + +3.4. Access to and use of the games purchased from different platforms (i.e. +with what we call ‘Keyless Access’), including their minimum system +requirements is governed by respective third-party platform policies and (as +applicable) additional contract terms with the developer/publisher of the game +(e.g. they might ask you to agree to a game specific End User License +Agreement). It may require having a third-party platform account. These +platforms may roll out patches or updates for your purchased games. + +## 4\. SYSTEM REQUIREMENTS + + + +4.1 Because GOG gives you access to many different services and games created +at different times and via different platforms, we cannot give you one set of +system requirements for all GOG services or GOG content. Please make sure your +computer and Internet connection are good enough to use GOG services and play +GOG games and videos. + + + +4.2 What we can tell you is that using any GOG game will require a computer, +equipped with a mouse and keyboard (touchscreen controls are not supported), +with an appropriate operating system (please refer to the relevant GOG product +page) with all service packs and important updates installed on it. All GOG +games should be natively installed on a computer that meets or exceeds the +minimum hardware and software specifications shown on the GOG product page. +GOG games are not tested on virtual machine software and therefore we do not +support playing through them. + + + +4.3 For GOG videos, please make sure your video player supports the videos’ +format specified in the GOG product page. + + + +4.4 If you have questions about system requirements, please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). Just so we're clear, you are +responsible for making sure you have sufficient Internet access to download +purchased GOG games or GOG videos from us or to stream GOG videos and that +your system can play GOG games and watch GOG videos. + +## 5\. BETAS + + + +5.1 As GOG develops, we may offer you optional access to 'beta' versions of +GOG software or services (e.g. new versions of the GOG GALAXY application made +available prior to its general release) or GOG content. + + + +Here are the rules: + + + +a) We (or any applicable publisher/partner) will set the conditions and +requirements for your beta access. Providing and maintaining a beta, and who +can use a beta, is at our discretion. + + + +b) You may be required to go through a registration process or other +requirements to access the beta (and this may include you meeting eligibility +criteria). + + + +c) Betas will be time-limited and there may be extra contract requirements. + + + +d) The beta may involve temporary or permanent server/progress/content wipes, +resets or amendments. + + + +e) The beta may be subject to confidentiality restrictions (which will be +notified to you in advance if so). + + + +f) You may be invited to participate in a feedback process regarding the beta +– this is totally optional but would be really valued. + + + +g) The beta is for your personal use and enjoyment, so you must not sell, loan +or otherwise transfer it to anyone else. + + + +h) The point of you getting beta access is to allow you to try something new, +but we would expect you to recognise that it will not be complete yet. +Therefore betas will be provided 'as is' without any additional promises from +us or any liability on us if it is not complete or does not work fully or +causes issues. Betas may not be totally feature-complete and there may be +feature changes, modifications or removals during the beta. + +## 6\. PAYING FOR GOG CONTENT AND GETTING REFUNDS + +### Paying for GOG content + +6.1 After you decide that you like a GOG game, GOG video or other GOG content, +you usually will need to pay for it before you can access it (though we do +have some free content too!). You can pay in different ways: (i) using a valid +debit or credit card; or (ii) using PayPal or any other authorized payment +provider. Remember to keep your payment details secure. + + + +6.2 When you use a payment method to buy GOG content, we're relying on your +promise that you're able to use that method. You are responsible for any +purchases made using your GOG account or payment method and you agree to the +pricing, payment and billing policies applicable to them, as notified to you +at the time of purchase. All payments are non-refundable and non-transferable +except as expressly provided in this Agreement. + + + +6.3 You can always pay for GOG content in US Dollars. However if you happen to +live in countries where your local currency is supported (see our Support +section [ here ](https://support.gog.com/hc/en- +us/articles/360001947034?product=gog) for details), you will be able to pay in +your local currency. You might have to pay a currency conversion charge if you +are not paying in your home currency and some banks might also add other kinds +of transaction fees. + + + +6.4. All prices are visible in the product catalog page. They’re inclusive of +taxes like VAT, if applicable. You should also expect some sales taxes/VAT to +be added to your price at checkout, if required by your local laws (f.ex. in +US or Canada). + + + +### GOG Wallet + +6.5 GOG offers users a digital account balance called the “GOG Wallet†in +connection with your user account, which you can use to make purchases of GOG +content on dedicated GOG services. Funds can be added to it in two ways: (i) +using your chosen payment method; or (ii) by us as part of our ‘Voluntary +Refund Policy’ (see link[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy)) in which case we may offer refunds +to GOG Wallet that you can use to get a replacement GOG game or other GOG +content. The GOG Wallet is made available subject to rules which are set out +on our GOG Wallet page[here](https://support.gog.com/hc/en- +us/articles/360001941953-FAQ-GOG-Wallet?product=galaxy). + +### GOG Bonus Codes + +6.6. We may also issue usually time-limited bonus codes which give you free or +reduced price access to GOG content (we’ll call them “Bonus Codesâ€). If you +receive Bonus Codes when you buy GOG content but later decide to return that +GOG content, then we think it’s fair for you to return the Bonus Codes too. +Therefore, we will terminate it or, if it has been redeemed for a GOG game, +that game will be removed from your account. + +### Direct to Account Distribution + +6.7 We have a direct to account distribution feature (we’ll call it ‘GOG +Direct to Account) where distribution platforms who partner with us would be +able to sell games or other content to you, where you could choose for that +game/content to be automatically activated within your GOG account, without +the need to redeem any codes. Just to be clear, the whole purchase process is +handled by the other platform, so in case of any issues with the purchase +process please speak with them directly. For this particular matter therefore, +we cannot offer you Our Voluntary Refund Policy (because GOG didn’t sell the +game/content). Of course, anything connected to our platform’s services is +still our responsibility. + +## 7\. REFUNDS AND RETURNS + +### Statutory refund rights + +7.1. If you are a resident of the European Union or other applicable +jurisdictions (excluding the USA), then you have the statutory right to +withdraw from a purchase of GOG content within 14 days of your purchase, +without giving a reason. To exercise the right of withdrawal, you should +inform us of your decision to withdraw from this contract by an unequivocal +statement (an email sent to support@GOG.COM, or a physical letter at an +address set out in Section 23 below). You may use the model withdrawal form +attached at the end of this Agreement, but you do not have to. To meet the +withdrawal deadline, it is sufficient for you to send your communication +concerning your exercise of the right of withdrawal before the withdrawal +period has expired. However, this does not apply where you have expressly +consented to the performance of the GOG content (which is digital content) +beginning immediately upon conclusion of the purchase process and have +acknowledged the loss of your withdrawal rights. + + + +7.2. Neither this nor any other part of this User Agreement affects your +statutory rights. In particular: + + + +a) For Australian Users: Our goods come with guarantees that cannot be +excluded under the Australian Consumer Law. You are entitled to a replacement +or refund for a major failure and compensation for any other reasonably +foreseeable loss or damage. You are also entitled to have the goods repaired +or replaced if the goods fail to be of acceptable quality and the failure does +not amount to a major failure. Details[here](https://support.gog.com/hc/en- +us/articles/360025857893?product=gog). + + + +b) For New Zealand Users: Neither this nor any other part of this User +Agreement excludes, restricts or modifies the application of any right or +remedy that cannot be so excluded, restricted or modified including those +conferred by the New Zealand Consumer Guarantees Act 1993. Under this Act are +guarantees which include that goods and services are of acceptable quality. If +this guarantee is not met there are entitlements to have the software remedied +(which may include repair, replacement or refund). If a remedy cannot be +provided or the failure is of a substantial character, the act provides for a +refund. + +### Our Voluntary Refund Policy + +7.3. We understand that sometimes a purchase doesn't turn out how you expected +and we want to be fair to GOG users. This is why on top of your statutory +refund rights (described in section 7.1.-7.2. above) we may offer you a +Voluntary Refund Policy described[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy). In some rare cases if we have +reasonable doubts regarding your refund request we may not apply the Voluntary +Refund Policy. In no case this will deprive you of any applicable statutory +refund rights. A sale is considered final once your refund rights expire +(unless we agree otherwise on a case by case basis). + +## 8\. VIRTUAL ITEMS AND VIRTUAL CURRENCY + + + +8.1 With certain GOG content you may be able to purchase or acquire virtual +items and/or virtual currency (we’ll call them “Virtual Goods†for short). +Virtual Goods are subject to this Agreement and in particular the following +default rules, unless there are specific rules for that GOG content (which +will prevail over these rules). + + + +8.2 Virtual Goods are digital items only with no cash-value or real world +existence and cannot be ‘bought’, ‘sold’, gifted, transferred or redeemed, +exchanged for other Virtual Goods, ‘real world’ money, goods, services or +items of monetary value. Trading Virtual Goods is prohibited (unless you are +specifically permitted to do so). Your right to use any Virtual Goods is +limited to a limited, nonexclusive, non-assignable, non-transferable, non- +sublicensable, revocable license to use them solely for your personal +entertainment and non-commercial use in the applicable GOG content. You have +no property interest or right or title in any Virtual Goods, which remains the +appropriate publisher’s property. Virtual Goods may be changed, amended or +reversed if necessary, including to enforce this Agreement. If necessary, +limits may be placed on the use of Virtual Goods (including transaction limits +and balance amounts). + + + +8.3 The existence of a particular offer for Virtual Goods is not a commitment +by us to maintain or continue to make the Virtual Goods or that offer +available in the future. The scope, variety and type of Virtual Goods that you +may obtain can change and we have the right to manage, modify and remove +Virtual Goods if we consider necessary for the ongoing operation of GOG or GOG +content or for other legitimate reasons, in which case we will have no +liability to you or anyone for the exercise of such rights. We will make +reasonable efforts to notify you of any such change and to explain the reason +for such change. + +## 9\. PATCHES, UPDATES AND CHANGES + + +9.1 Occasionally we may need to patch or update GOG services or GOG content +(for example to add or remove features or to resolve software bugs). We need +these rights in order to keep GOG running efficiently and safely. Not patching +or updating the GOG services or GOG content may result in inferior performance +of your version or incompatibility of your version with some of the GOG +services or GOG content features. Doing so, you are also risking not +installing important security updates. Our Partners may use GOG services to +roll out patches or updates for applicable GOG content. + +## 10\. OWNERSHIP OF GOG SERVICES AND INTELLECTUAL PROPERTY RIGHTS + +10.1 GOG services including (but not limited to) their graphics, computer +code, user interface, look and feel, audio, video, text, layout, databases, +data and all other content, and all legal and exploitation rights regarding +them are either owned by us or we license them from third parties. GOG content +is owned by its developers/publishers and licensed by us. All rights are +reserved except as we have explained in this Agreement. You may not use or +exploit any part of the GOG services or GOG content except as explained in +this Agreement. + + + +10.2. GOG respects the intellectual property rights of others. Please read +more[here](https://support.gog.com/hc/articles/16033687971613). + +## 11\. RULES FOR USING GOG SERVICES + +11.1 Please follow these rules regarding the GOG services and GOG content, and +any additional rules we link in 11.2 below. Please read these rules carefully +since failure to follow them (particularly those in relation to cheating) will +be considered a material breach of this Agreement, which could lead to +suspension or cancellation of your access to GOG services. Here are the rules: + + + +(a) Only use GOG services or GOG content for your personal enjoyment (for +example, don't use them to make money, for piracy or for political purposes). + + + +(b) Regarding GOG content, what you can do practically apart from playing the +games (like create derivative works of it) depends on what the GOG content +rights holder allows you to do (GOG can’t grant such rights). So please check +this with the rights holder directly (the first thing you should do though is +to check if they have a EULA and if so what it says). We also ask that you +make only genuine attempts to improve the GOG content. + + + +(c) Regarding GOG services (which includes GOG software), unless you have +prior GOG permission please don’t modify, merge, distribute, translate, +reverse engineer, decompile, disassemble, or create derivative works of them – +unless you’re allowed in this Agreement or by the law in your country. We’d +like to emphasize that you are free to contact us for permission to do these +things and we will review and respond to those requests in good faith. More +generally, at some point in the future we want to open client protocols to +make it easier for users to work with GOG data/software without any need for +reverse engineering or similar techniques. + + + +(d) Don't hack, harm, grief, interrupt or misuse GOG services or GOG content, +GOG users or GOG personnel or use them for any similar purpose. + + + +(e) Do not create, use, make available and/or distribute cheats, exploits, +automation software, robots, bots, mods, hacks, spiders, spyware, cheats, +scripts, trainers, extraction tools or other software that interact with or +affect GOG services or GOG content in any way (including, without limitation, +any unauthorized third party programs that intercept, emulate, or redirect any +communication between GOG or its partners and GOG services and/or any +unauthorized third party programs that collect information about GOG +services). + + + +(f) Don't interfere with the GOG or third party network software or other +software including via tunnelling, code injection, modifying or changing GOG +software, using any other similar software together with GOG services or GOG +content, through protocol emulation, or through creation or use of private +servers regarding GOG services or GOG content. Do not access or attempt to +access areas of GOG.COM, GOG GALAXY or GOG servers that have not been made +available to the public. + + + +(g) Don't do or say anything which is or may be considered racist, xenophobic, +sexist, defamatory or otherwise offensive or illegal (f.ex. exploiting minors, +encouraging violence, engaging in fraud). Be nice to each other please! + + + +(h) Don’t share, ‘buy’, ‘sell’, transfer, gift, lend, steal, misappropriate or +misuse GOG accounts. GOG keys/codes can only be gifted or transferred or used +in the ways permitted by GOG. If you have any questions or problems, contact +customer support. + + + +(i) We ask you to follow any applicable geographic or regional, language or +location-based restrictions, requirements or rules regarding GOG. + + + +(j) We ask you not to do anything in connection with GOG that infringes any +copyright, trademark, patent, trade secret, privacy, publicity, or other right +of others, such as images, photographs, sound files, text files, graphics +files, and any other material or information. + + + +11.2 In addition to the above, below is the list of additional terms that +apply to you when using GOG services. We do not want to repeat ourselves, but +it is important to remember that if you fail to follow them, it will be a +material breach of this Agreement, which could lead to a suspension or +cancellation of your access to GOG services. Here is the list: + + * GOG Code of Conduct ([link](https://support.gog.com/hc/articles/16033977811613)) + + * Infringing Content and Copyright Policy ([link](https://support.gog.com/hc/articles/16033687971613)). + + + +11.3 Every time we make a moderation decision resulting in restricting your +access to GOG services, whenever it is possible you should receive a statement +of reasons outlining why we have made this decision. If you do not agree with +the decision we have made, you have 6 months from the day that you have been +informed about the decision, to make a complaint. The details on how to make a +complaint should be available in your moderation decision. The description of +our complaint-handling system procedure is also available in the Infringing +Content & Copyright Policy +([here](https://support.gog.com/hc/articles/16033687971613)). + +## 12\. USER GENERATED CONTENT + +12.1 This section is about content (e.g. text, photos or links) which you make +available either to us or to other GOG users via GOG services (for example +through your profile picture or through messages to other GOG users). We'll +call this "User Generated Content". + + + +12.2 As far as we and you are concerned, you own any User Generated Content +but we need you to give us some limited rights over it so that we can actually +transmit it through GOG services. So, by posting User Generated Content you +give us a nonexclusive, irrevocable license to use, modify, reproduce, create +derivative works from, distribute, transmit, communicate and publicly +display/perform your User Generated Content in connection with GOG services. + + + +12.3 It is your responsibility to make sure that you have all necessary legal +rights before you use User Generated Content and for checking they are safe to +use – we can't know that ourselves, and we can't check it for you, so we have +to rely on you. + + + +12.4. However, we have the right (but not the obligation) to review and if +appropriate or legally necessary to remove any User Generated Content which is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. If +you find that any such content has been posted on GOG services, please let us +know. We ask you to read our Infringing Content and Copyright Policy +([link](https://support.gog.com/hc/articles/16033687971613)), where we explain +our procedure for reporting infringing content. If you still feel your case is +not fully resolved after our internal procedure, you have access to an out-of- +court dispute settlement - more on this in Section 20 below. + +## 13\. FEEDBACK OR SUGGESTIONS + +13.1 You’re welcome to give us feedback and suggestions to improve GOG +services and we really value them all. However, just so we’re clear, we don’t +have to use or accept them and we won’t owe you anything (financially or +otherwise) regarding them. + +## 14\. USING GOG CONTENT IN FAN WORK + +14.1 For fan work (e.g. works like fan mods, machinima, parodies, homages, +'Let's Play' or other videos or artwork), you need to check with the content +owner (e.g. the developer or publisher) if they are OK with it and if so you +should get permission from them. The reason is simple – the GOG content is the +property of the respective owner, not ours. + +## 15\. THIRD-PARTY CONTENT AND EXTERNAL SERVICES + +15.1 You might get links to third-party websites or content through GOG +services which aren’t connected to us. Using them is up to you – we’re not +responsible for them, we can't promise they will work, what they'll be like or +if they're free. + + + +15.2 You can also use your GOG account to get easy access to some external, +GOG approved partner services, e.g. The Witcher games and sites from our +sister company CD PROJEKT RED. They will have their own terms and conditions +which you will need to agree and follow. Just to be clear: using these +services is all optional and up to you. You have the power! + +## 16\. WARRANTIES AND LIMITATION OF LIABILITY REGARDING GOG SERVICES + +16.1 We warrant that: (i) we have the right to enter this Agreement and to +grant you the license to use GOG services in section 2.1; and (ii) we will +take reasonable care with the GOG services and your use of them; and (iii) we +will use reasonable endeavors to comply with applicable laws in performing our +obligations to you under this Agreement. + + + +16.2. Your representations and warranties. You represent and warrant that you +have the full power and ability to enter into this Agreement and will fully +follow its terms. You also represent and warrant that any User Generated +Content, which you transmit via GOG services does not infringe upon the +intellectual property rights of any third party. You further represent and +warrant that you will not use or contribute User Generated Content that is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. + + + +16.3. We work hard to try to make GOG content work on your systems but we only +have limited time to carry out tests and we don't always get everything right. +Therefore, we can't accept any liability or responsibility for GOG content +except where required by law (see 7.1.-7.2 above). We are also not responsible +for anything that happens to GOG.COM or GOG services which is outside of our +control and we do not guarantee GOG services will work 100% of the time. +However, don't forget you may be entitled to GOG content return and refund if +it has technical issues - see section 7.3. + +## 17\. TERMINATION + +17.1 Your right to terminate the Agreement. You may terminate this Agreement +at any time and without giving any reason by completely ceasing to use GOG +services. If you would like us to delete your account please contact our +Support Team [ here ](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog) or simply by sending an email +request to privacy@gog.com. Termination will not affect already existing +rights or obligations of us or you. + + + +17.2. Our right to terminate the Agreement. If you materially breach this +Agreement, we reserve the right to suspend or cancel your access to GOG +services and GOG content. By material breach of the Agreement we mean a +serious breach which could cause significant harm to GOG, GOG users, as well +as, in particular breach of the provisions of section 11 above or GOG Code of +Conduct. If we suspend or cancel your access to GOG services or GOG content +we'll take reasonable steps to contact you to explain why we have done this +and what (if anything) you can do as a result. + + + +17.3 It seems very unlikely, but if we have to stop providing access to GOG +services and GOG content permanently (not because of any breach by you), we +will try to give you at least sixty (60) days advance notice by posting a note +on www.GOG.COM and sending an email to every registered user – during that +time you should be able to download any GOG content you purchased. + +## 18\. FORCE MAJEURE + +18.1 Neither you nor us will be liable for any failure to perform any +obligation under this Agreement or to provide access to GOG services and GOG +content if that failure is caused by the happening of any unforeseen event +beyond your or our reasonable control including without limitation, Internet +outages, communications outages, fire, flood, war or act of God. + +## 19\. GOVERNING LAW + +### For users resident in the European Union and elsewhere in the world (but +not the USA): + +19.1 You and we agree that your use of GOG services and GOG content and this +Agreement will be governed by and interpreted according to the laws of the +Republic of Poland and that any dispute regarding this Agreement will be heard +non-exclusively by the courts of the Republic of Poland. In any legal claim +under this Agreement, the side which wins will be entitled to its legal fees +and expenses. + + + +19.2. The above choice of governing law and jurisdiction is subject to any +mandatorily applicable principles of consumer protection or other law in your +jurisdiction of residence which would not otherwise be available. + +### For users in the USA only: + +19.3 You and we agree that your use of GOG services and GOG content, and this +Agreement, will be deemed to be entered into in Los Angeles, California and +governed by and interpreted according to the laws of the State of California, +USA (and, if applicable, US federal law). Any legal claim by you against GOG +will be made exclusively in any state or federal court located in Los Angeles, +California, which will have subject matter jurisdiction regarding the dispute +between you and us and therefore we both consent to the exclusive jurisdiction +of those courts. In any legal claim under this Agreement, the side which wins +will be entitled to its legal fees and expenses. + +## 20\. CUSTOMER SUPPORT AND DISPUTE RESOLUTION + +20.1.If you have concerns, claims or issues with us, we hope we can resolve +them quickly and amicably. Please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). We will make reasonable and good +faith efforts to resolve any dispute between us informally. We undertake to +answer any claim within 14 days. + + + +20.2. If it is not resolved during this time, the next steps depend on where +you live. If you live within the EU you may submit your legal claims to the +online dispute resolution platform operated and provided by the European +Commission which can be accessed via http://ec.europa.eu/consumers/odr/ in +order to reach an out of court settlement or initiate a lawsuit. You may also +choose to resolve your dispute through any out-of-court dispute settlement +body certified by your country’s Digital Services Coordinator. + + + +20.3. If you live in the USA or the rest of the world (but not the EU) then +please contact us at legal@gog.com. + +## 21\. OTHER LEGAL STUFF + +21.1 If any part of this Agreement is found not to be legally enforceable, +this will not affect any other part of it. + + + +21.2 This Agreement (including any GOG additional terms referenced in it) +constitutes the entire agreement between you and us and supersedes any earlier +oral or written agreements. If you disagree with this, please contact us as +soon as possible after you start using GOG services at legal@gog.com since +otherwise this will be binding on you after a reasonable time period (usually +30 days). + + + +21.3 This Agreement governs our relationship with you (and vice versa). It +does not create any rights for anyone else. + + + +21.4 Please remember we are subject to various laws and we may be required to +comply with law enforcement or other legal requirements. + + + +21.5 If there is a reorganization, sale or merger of GOG then we may need to +work with relevant third parties to transfer or merge your GOG account. + + + +21.6. You and we agree that the UN Convention on Contracts for the +International Sale of Goods does not apply to this Agreement. + + + +21.7 We can assign, subcontract or transfer this Agreement to a third party or +another member of our group if necessary for the support of GOG, as part of +any reorganization or merger or for other business reasons. We will notify you +if this happens. + + + +21.8. If you are a European Union citizen, then please be aware that GOG has +enabled cross-border portability on free and paid content pursuant to +Regulation (EU) 2017/1128 of the European Parliament and of the Council of 14 +June 2017 on cross-border portability of online content services in the +internal market, but this is subject to any other legal requirements on GOG +including regarding IP protection and may also be subject to any requirements +of developer and publisher partners of GOG. + +## 22\. CHANGES TO THIS AGREEMENT + +22.1 We may change this Agreement if we think it's necessary, e.g. for legal +reasons or to reflect changes in GOG services or GOG content. If so, we will +make the changed Agreement available online at +https://support.gog.com/hc/articles/212632089 and (if you have a GOG account) +we will email you to let you know about any significant changes. + + + +22.2 Any changes to the Agreement will come into force within 30 days of their +announcement online. In the meantime, you're welcome to contact us at +legal@GOG.COM if you have specific questions about the changes. + + + +22.3 If you don't agree to those changes (regardless of whether you email us), +then unfortunately we must ask you to cease using GOG services and GOG +content. We're sorry we have to say that, but we hope you'll appreciate that +for GOG services to work properly we need to have everyone using it under the +same rules instead of different people having different rules. That's why we +encourage you to get in contact if you have queries or concerns. + + + +22.4 Just so you know, we'll never just make a bunch of changes to this +Agreement, not tell you what they are and force you to agree to changes you +don't understand before you can use GOG services! + +## 23\. OUR CONTACT DATA + +23.1. If you have any complaint concerning GOG account, GOG services, or +simply you would like to contact us, here are our contact details: + +Name: GOG sp. z o.o. +Registered Office: Ul. JagielloÅ„ska 74, 03-301 Warsaw, Poland +Registered at the District Court for Warsaw, 14th +Commercial Division of the National Court Register. +Registration Number 0000029514 +Tax number VAT ID (NIP) PL 113-21-77-807 +Share capital: PLN 135.750,00 PLN + +Single point of contact for authorities: +GOG Legal Team +legal@gog.com +Languages we communicate in: English, Polish +Single point of contact for recipients of GOG services: +GOG Support Team +support@gog.com +We mostly speak English and Polish, but will do our best to assist you in any +language that GOG is available in. +Last update (effective date): 17th February 2024 +See the previous version of the User +Agreement[here](https://support.gog.com/hc/articles/212632089). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/serpentisle/tmp/EULA200.png b/info.exult.exult/data/serpentisle/tmp/EULA200.png new file mode 100644 index 0000000..e39d170 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/EULA200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/EULAAccepted.png b/info.exult.exult/data/serpentisle/tmp/EULAAccepted.png new file mode 100644 index 0000000..b02c69d Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/EULAAccepted.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/EULAAccepted200.png b/info.exult.exult/data/serpentisle/tmp/EULAAccepted200.png new file mode 100644 index 0000000..87e60e9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/EULAAccepted200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/EULAShow.png b/info.exult.exult/data/serpentisle/tmp/EULAShow.png new file mode 100644 index 0000000..8cfa974 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/EULAShow.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/EULAShow200.png b/info.exult.exult/data/serpentisle/tmp/EULAShow200.png new file mode 100644 index 0000000..5ebf91f Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/EULAShow200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/EULA_bkg.png b/info.exult.exult/data/serpentisle/tmp/EULA_bkg.png new file mode 100644 index 0000000..1756e61 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/EULA_bkg.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/EULA_de-DE.txt b/info.exult.exult/data/serpentisle/tmp/EULA_de-DE.txt new file mode 100644 index 0000000..52f3b51 --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/EULA_de-DE.txt @@ -0,0 +1,1702 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM Benutzervereinbarung + +## 1\. ÜBER DIESE VEREINBARUNG + +1.1 Diese Vereinbarung stellt einen Vertrag zwischen Dir (wir nennen Dich im +Folgenden einfach "Du") und GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Warschau, +Polen (wir nennen uns im Folgenden "GOG" oder einfach "uns") und gilt für +www.GOG.COM, Dein GOG-Nutzerkonto, die GOG GALAXY-Anwendung (einschließlich +GOG GALAXY Store), alle Spiele oder Videos oder andere Inhalte oder +Dienstleistungen, die Du über uns kaufen oder auf die Du zugreifen kannst, die +GOG-Webforen, den GOG-Kunden- und technischen Support und andere +Dienstleistungen, die wir Dir anbieten (wir nennen all dies kurz "GOG- +Dienste"). An dieser Stelle informieren wir Dich über Deine Rechte und +Pflichten als Nutzer von GOG-Diensten. + + + +1.2. Es können zusätzliche Bedingungen für GOG-Dienste gelten, die wir in +diesem Fall zu Deiner Annahme mitteilen werden. Wenn Du z.B. GOG GALAXY nutzen +möchtest, werden die entsprechenden Bedingungen zur Annahme bereitgestellt, +bevor Du mit der Nutzung dieser Dienste anfangen kannst. + +1.3 Wenn wir über Spiele, In-Game-Inhalte, virtuelle Gegenstände oder Währung, +GOG-Videos, bzw. andere Inhalte oder Dienstleistungen sprechen, die Du über +GOG-Dienste kaufen oder auf die Du durch die GOG-Dienste zugreifen kannst, +nennen wir sie einfach "GOG-Spiele", bzw. "GOG-Videos" und wenn wir über sie +insgesamt sprechen, heißen sie "GOG-Inhalte". + +1.4 Dieses Dokument sollte nicht all zu lang werden, aber denke daran, dass Du +mit der Annahme unserer Nutzungsbedingungen auch Dein Einverständnis zu +Folgendem erteilst: + + * unsere [ Datenschutzrichtlinie ](https://support.gog.com/hc/articles/212632109) \- in der erläutert wird, welche Daten wir von Dir erfassen und wie wir diese schützen, + + * unser[GOG-Verhaltenskodex](https://support.gog.com/hc/articles/16033977811613), der eine Reihe von Regeln enthält, die Du als Teil unserer Community befolgen musst, + + * die Regelungen über[Rechtsverletzende Inhalte und Urheberrechtsbestimmungen](https://support.gog.com/hc/articles/16033687971613), die beschreiben, wie Du rechtswidrige Inhalte auf GOG melden kannst und was passiert, wenn Du dies tust. + + + +1.5 GOG arbeitet mit vertrauenswürdigen Partnern zusammen, wie beispielsweise +mit unserem verbundenen Unternehmen CD PROJEKT S.A., mit Entwicklern und +Publishern, mit Zahlungsanbietern, Anbietern von Kundendienstsoftware und +sonstigen Partnern (zusammenfassend „Partner“). Mehr hierzu weiter unten in +dieser Vereinbarung. + + + +1.6 Wenn Du das 18. Lebensjahr vollendet hast, heißen wir Dich bei GOG +herzlich willkommen! Bist Du zwischen 16 und 18 Jahre alt, musst Du erst Deine +Eltern oder Deinen Vormund bitten, diese Vereinbarung durchzulesen und ihr in +Deinem Namen zuzustimmen (da in manchen Ländern Personen erst ab einem +bestimmten Alter Verträge wie diese Vereinbarung eingehen können). Falls Du +noch nicht 16 bist, kannst Du kein GOG-Konto erstellen oder GOG-Dienste +nutzen, weil wir rechtlich nicht dazu in der Lage sind, Daten von Kindern ohne +Zustimmung ihrer Eltern oder eines Vormundes zu verwalten (aber Deine Eltern +und Vormünde dürfen sich gerne selbst anmelden). + +## 2\. NUTZUNG VON GOG-DIENSTEN UND GOG-INHALTEN + +2.1 Wir gewähren Dir und anderen GOG-Nutzern das persönliche Recht (auch unter +dem juristischen Begriff „Lizenz“ bekannt), GOG-Dienste zu nutzen, um GOG- +Inhalte herunterzuladen, auf sie zuzugreifen und/oder zu streamen (je nach +Inhalt) und zu nutzen. Diese Lizenz gilt nur für Deinen persönlichen Gebrauch. +Unter bestimmten Umständen, die wir nachfolgend erläutern werden, können wir +Dir diese Lizenz entziehen oder sie vorübergehend außer Kraft setzen. + + + +2.2 Wenn Du GOG-Spiele kaufst, nutzt oder installierst, musst Du unter +Umständen zusätzlichen Vertragsbedingungen des Entwicklers oder Publishers des +Spiels zustimmen (z. B. der für ein bestimmtes Spiel geltenden +Endbenutzerlizenzvereinbarung). Sollte eine Unstimmigkeit zwischen diesen +sogenannten „EULAs“ und dieser Vereinbarung bestehen, hat diese Vereinbarung +Vorrang. + + + +2.3 Bei GOG-Videos kannst Du außerdem gekaufte Videoinhalte streamen oder +herunterladen, um sie auf die von Dir gewünschte Weise anzusehen. + + + +2.4 Die Verwendung bestimmter Skripte Dritter wird empfohlen, um GOG- +Funktionen in vollem Umfang nutzen zu können. Deren Verwendung ist zwar +optional, doch ohne diese Skripte können wir die volle Leistung unserer +Dienste nicht garantieren. + + + +2.5 Ein paar Worte zu GOG GALAXY, unserer (optionalen) Anwendung, die nicht +nur den Kauf von und den Zugriff auf GOG-Inhalte ermöglicht, sondern auch +coole Funktionen wie eine einheitliche Spielebibliothek und eine +plattformübergreifende Freundesliste, Online-Multiplayer, Achievements, +plattformübergreifenden Chat, Protokollierung der Spielzeit, Cloud-Saves und +Game-Overlay bietet. Mehr dazu erfährst Du[hier](https://www.gog.com/galaxy). + +2.6 Bei manchen Dienstleistungen von GOG verwenden wir Empfehlungen, um Dir +solche Inhalte zu präsentieren, die Dich am wahrscheinlichsten interessieren. +Wo wir die Empfehlungen einsetzen und wie sie funktionieren, erfährst +Du[hier](https://support.gog.com/hc/articles/16034228157213), einschließlich +der von uns verwendeten Hauptparameter und wie diese beeinflusst werden +können. + + + + + + + + +## 3\. GOG-KONTEN + +3.1 Um GOG-Inhalte bei GOG-Diensten zu kaufen, und manchmal um GOG-Inhalte zu +nutzen, bei denen der Partner ein GOG-Konto voraussetzt, benötigst Du ein GOG- +Konto. Dazu musst Du ein (verschlüsseltes und von uns nicht einsehbares) +Passwort und einen Benutzernamen anlegen; außerdem benötigen wir zu +Identifikationszwecken Deine E-Mail-Adresse. Sorge bitte dafür, dass Deine +Anmeldedaten gesichert sind und Dein Konto ordnungsgemäß verwendet wird. In +Deinen GOG-Kontoeinstellungen kannst Du Dein Wohnsitzland, Dein Geburtsdatum +und einen Avatar festlegen. In unserer Datenschutzrichtlinie findest Du +weitere Einzelheiten zu den von uns über Dich gesammelten Daten sowie unserer +Verwendung und der zu ihrer Sicherung ergriffenen Maßnahmen. Du findest +sie[hier](https://support.gog.com/hc/articles/212632109-Datenschutzrichtlinie). + + + +3.2 Du kannst Dein GOG-Konto benutzen, um ein öffentliches und für andere +zugängliches Profil zu erstellen oder Dich mit anderen GOG-Nutzern in +Verbindung zu setzen. Bitte gehe vernünftig vor und denke daran, dass Du für +Deine Handlungen allein verantwortlich bist. + +3.3 Dein GOG-Konto und Deine GOG-Inhalte sind personenbezogen und können nicht +an andere Personen weitergegeben, verkauft, verschenkt oder übertragen werden. +Der Zugriff auf diese und deren Nutzung unterliegen der [ +Datenschutzrichtlinie ](https://support.gog.com/hc/articles/212632109) und dem +[ Verhaltenskodex ](https://support.gog.com/hc/articles/16033977811613) von +GOG, die bei Bedarf aktualisiert oder geändert werden können. + +3.4. Der Zugriff auf und die Nutzung von Spielen, die auf anderen Plattformen +erworben wurden (d. h. mit dem so genannten "Keyless Access"), einschließlich +ihrer Mindestsystemanforderungen, unterliegt den jeweiligen Richtlinien der +Drittanbieterplattformen und (gegebenenfalls) zusätzlichen Vertragsbedingungen +mit dem Entwickler/Publisher des Spiels (z. B. kannst Du aufgefordert werden, +einem spielspezifischen Endbenutzer-Lizenzvertrag zuzustimmen). Dazu ist +möglicherweise ein Konto bei einer Drittanbieterplattform erforderlich. Diese +Plattformen können Patches oder Updates für Ihre gekauften Spiele +bereitstellen. + +## 4\. SYSTEMANFORDERUNGEN + +4.1 Da Du über GOG Zugriff auf viele verschiedene Dienste und Spiele hast, die +zu unterschiedlichen Zeiten und für verschiedene Plattformen produziert +wurden, können wir keine für alle GOG-Dienste oder GOG-Inhalte geltenden +Systemanforderungen nennen. Bitte stelle sicher, dass Dein Computer und Deine +Internetverbindung gut genug sind, um die GOG-Dienste zu nutzen und GOG-Spiele +und Videos zu spielen. + + + +4.2 Für die Nutzung eines GOG-Spiels benötigst Du einen Computer mit Maus und +Tastatur (Touchscreen wird nicht unterstützt), ein passendes Betriebssystem +(die Angabe dazu findest Du auf der entsprechenden GOG-Produktseite), auf dem +alle wichtigen Updates und Servicepakete installiert sind. Alle GOG-Spiele +sollten auf einem Computer installiert werden, der mindestens den auf der GOG- +Produktseite genannten Mindestanforderungen für Hard- und Software entspricht. +GOG-Spiele sind nicht für die Verwendung auf virtuellen Maschinen getestet, +und eine entsprechende Nutzung wird von uns auch nicht unterstützt. + + + +4.3 Sorge bei GOG-Videos dafür, dass Deine Videosoftware die auf der GOG- +Produktseite genannten Videoformate unterstützt. + + + +4.4 Wenn Du Fragen zu Systemanforderungen hast, schreib uns +bitte[hier](https://support.gog.com/hc/requests/new?category=info). Nur um es +klarzustellen: Du musst dafür sorgen, dass Du einen Internetanschluss besitzt, +mit dem Du die gekauften GOG-Spiele oder GOG-Videos herunterladen oder GOG- +Videos streamen kannst, und sicherstellen, dass Dein System dafür geeignet +ist, GOG-Spiele auszuführen und GOG-Videos anzusehen. + +## 5\. BETAS + +5.1 Im Zuge der Weiterentwicklung von GOG können wir Dir optionalen Zugang zu +"Beta"-Versionen von GOG-Software oder -Services (z.B. neue Versionen der GOG +GALAXY-Anwendung, die vor ihrer allgemeinen Veröffentlichung zur Verfügung +gestellt werden) oder GOG-Inhalten anbieten. + +Hierbei gelten folgende Regeln: + + + +(a) Wir (beziehungsweise der entsprechende Publisher/Partner) legen die +Bedingungen und Anforderungen für Deinen Betazugang fest. Wir entscheiden in +eigenem Ermessen, ob wir eine Beta anbieten und unterstützen, und wer diese +nutzen darf. + + + +(b) Du musst eventuell einen Registrierungsvorgang oder andere Anforderungen +durchlaufen, um Zugriff zur Beta zu erhalten. Dazu kann auch gehören, dass Du +bestimmte Kriterien erfüllen musst. + + + +(c) Betas werden zeitlich begrenzt sein und eventuell gelten zusätzliche +vertragliche Bedingungen. + + + +(d) Im Rahmen der Beta werden Server/Spielfortschritt/Inhalte möglicherweise +vorübergehend oder dauerhaft gelöscht, zurückgesetzt oder geändert. + + + +(e) Die Beta unterliegt unter Umständen der Geheimhaltung (in diesem Fall +wirst Du im Voraus darüber benachrichtigt). + + + +(f) Du wirst womöglich dazu eingeladen, an einem Feedbackvorgang bezüglich der +Beta teilzunehmen. Die Teilnahme steht Dir frei, aber wir wären Dir dafür sehr +dankbar. + +g) Die Betaversion ist für Deinen persönlichen Gebrauch bestimmt und darf +nicht verkauft, verliehen oder anderweitig an andere Personen weitergegeben +werden. + +(h) Der Sinn des Betazugangs liegt darin, dass Du etwas Neues ausprobieren +kannst. Wir weisen Dich aber darauf hin, dass die Inhalte noch nicht fertig +sind. Betas werden daher in ihrem aktuellen Zustand zur Verfügung gestellt, +ohne jegliche Zusicherungen oder Haftbarkeit unsererseits für den Fall, dass +die Beta unvollständig ist, nicht vollständig funktioniert oder Probleme +auftreten. Betas umfassen nicht unbedingt alle Spielinhalte. Spielfunktionen +können während der Beta geändert, bearbeitet oder entfernt werden. + +## 6\. BEZAHLUNG VON GOG-INHALTEN UND RÜCKERSTATTUNGEN + +### Bezahlung von GOG-Inhalten + +6.1 Wenn Du Dich für ein GOG-Spiel, ein GOG-Video oder einen anderen GOG- +Inhalt entschieden hast, musst Du normalerweise dafür bezahlen, bevor Du +darauf zugreifen kannst (obwohl wir auch einige kostenlose Inhalte anbieten!). +Du kannst verschiedene Zahlungsmöglichkeiten nutzen: (i) mit einer gültigen +EC- oder Kreditkarte; oder (ii) mit PayPal oder einem anderen autorisierten +Zahlungsanbieter bezahlen. Sorge dafür, dass Deine Zahlungsdaten sicher sind. + +6.2 Wenn Du eine Zahlungsmethode verwendest, um GOG-Inhalte zu kaufen, +verlassen wir uns auf Deine Zusage, dass Du diese Methode auch tatsächlich +einsetzen kannst. Du bist für alle Käufe verantwortlich, die über Dein GOG- +Konto oder Deine bevorzugte Zahlungsmethode getätigt werden, und erklärst Dich +mit den entsprechenden Preis-, Zahlungs- und Abrechnungsrichtlinien +einverstanden, die Dir zum Zeitpunkt des Kaufs mitgeteilt werden. Alle +Zahlungen sind nicht erstattungsfähig und nicht übertragbar, es sei denn, dies +ist in dieser Vereinbarung ausdrücklich vorgesehen. + +6.3 Du hast immer die Möglichkeit, für GOG-Inhalte in US- Dollar zu bezahlen. +Wenn Du jedoch in Ländern lebst, in denen Deine Landeswährung unterstützt wird +(weitere Informationen findest Du in unserem Support-Bereich), kannst Du in +Deiner Landeswährung bezahlen. Wenn Du zum Bezahlen nicht die Währung Deines +Wohnsitzlandes verwendest, fallen eventuell Gebühren für die +Währungsumrechnung an, außerdem können einige Banken noch weitere +Transaktionsgebühren berechnen. + +6.4. Alle Preise sind auf der Produktkatalogseite ersichtlich. Die Preise +verstehen sich inklusive Steuern wie z.B. Mehrwertsteuer, falls zutreffend. Du +solltest auch damit rechnen, dass einige Umsatzsteuern/VAT beim Checkout auf +den Preis aufgeschlagen werden, falls dies in Deinem Land gesetzlich +vorgeschrieben ist (z.B. in den USA oder Kanada). + + + +GOG-Geldbeutel + + + +6.5 GOG bietet seinen Nutzern eine digitale Guthabenverwaltung namens „GOG- +Geldbeutel“ in Verbindung mit dem Benutzerkonto an. Du kannst Guthaben aus dem +GOG-Geldbeutel verwenden, um GOG-Inhalte zu kaufen. Guthaben kann auf zwei +Arten hinzugefügt werden: (i) mit Deiner gewählten Bezahlmethode oder (ii) von +uns im Rahmen unserer freiwillige Rückerstattungsrichtlinie +([hier](https://support.gog.com/hc/articles/360006129837)). In diesem Fall +können wir Dir eine Rückerstattung in den GOG-Geldbeutel anbieten, die Du für +ein neues GOG-Spiel oder andere GOG-Inhalte verwenden kannst. Der GOG- +Geldbeutel unterliegt den Regeln, die [ hier +](https://support.gog.com/hc/articles/360001941953-FAQ-GOG-Wallet) auf unserer +Seite zum GOG-Geldbeutel aufgeführt sind. + + + +GOG-Bonus-Codes + +6.6. Wir können auch Bonus-Codes ausgeben, diese sind in der Regel zeitlich +begrenzt. Mit ihnen erhältst Du kostenlosen oder vergünstigten Zugang zu GOG- +Inhalten (wir nennen sie "Bonus-Codes"). Wenn Du beim Kauf von GOG-Inhalten +Bonus-Codes erhalten hast, Dich jedoch später dazu entschließt, diese GOG- +Inhalte zurückzugeben, dann halten wir es für fair, dass Du auch die Bonus- +Codes zurückgibst. Aus diesem Grund werden wir diese ungültig machen oder, +falls sie für ein GOG-Spiel eingelöst wurden, wird dieses Spiel von Deinem +Konto entfernt. + +Direct-to-Account-Verteilung + + + +6.7 Wir haben ein Direct-to-Account-Verteilungsfeature ("GOG-Direct-to- +Account" genannt), durch das Vertriebsplattformen, die mit uns +zusammenarbeiten, Spiele oder andere Inhalte an Dich verkaufen können, und Du +auswählen kannst, dass selbige automatisch und ohne das Einlösen von Codes in +Deinem GOG-Konto aktiviert werden. Die komplette Kaufabwicklung wird dabei von +Drittparteien übernommen – bei Problemen mit dem Kauf musst Du Dich also +direkt an diese wenden. In dieser Angelegenheit können wir Dir daher keine +freiwillige Rückerstattung anbieten (weil GOG das Spiel/die Inhalte nicht +verkauft hat). Für alles, was mit den Diensten unserer Plattform zu tun hat, +sind wir natürlich weiterhin verantwortlich. + +## 7\. RÜCKERSTATTUNGEN UND RÜCKGABE + +7.1. Falls Du Deinen Wohnsitz in der Europäischen Union oder einem anderen +anwendbaren Rechtsbereich (mit Ausnahme der USA) hast, bist Du gesetzlich +berechtigt, von einem Kauf von GOG-Inhalten innerhalb von 14 Tagen nach Deinem +Kauf ohne Angabe von Gründen zurückzutreten. Um das Recht auf Widerruf geltend +zu machen, musst Du uns über Deinen Entschluss, diesen Vertrag zu widerrufen, +mittels einer eindeutigen Erklärung (z. B. einer E-Mail an support@GOG.COM +oder einem persönlichen Schreiben an die in Abschnitt 23 angegebene Adresse) +informieren. Du kannst dazu das beigefügte Muster-Widerrufsformular verwenden, +bist aber nicht dazu verpflichtet. Um die Widerrufsfrist einzuhalten, reicht +es aus, dass Du Deine Mitteilung über die Ausübung des Widerrufsrechts vor +Ablauf der Widerrufsfrist absendest. Allerdings gilt dies nicht, wenn Du +ausdrücklich zugestimmt hast, dass die Leistung des GOG-Inhalts (bei dem es +sich um digitalen Inhalt handelt) unmittelbar nach Abschluss des Kaufvorgangs +beginnt und Du dem Verlust Deines Widerrufsrechts zugestimmt hast. + +7.2 Weder dies noch jedweder andere Teil der Nutzungsbedingungen beschränken +Deine gesetzlich festgelegten Rechte. Im Einzelnen: + + + +a) Für Nutzer aus Australien: Das australische Verbraucherrecht räumt Dir +weitreichende Rechte ein, die nicht einschränkbar sind. Du hast das Recht auf +Ersatz oder Erstattung im Falle eines größeren Mangel und auf Erstattung für +jeglichen vorhersehbaren Verlust oder Schaden. Du hast außerdem das Recht, die +Produkte repariert oder ersetzt zu bekommen, wenn sie keine akzeptable +Qualität aufweisen und der Mangel keinem größeren Mangel entspricht. +Details[hier](https://support.gog.com/hc/en- +us/articles/360025857893?product=gog); + + + +b) Für Nutzer aus Neuseeland: Weder dieser noch jeglicher anderer Teil der +Nutzungsbedingungen schließt aus, beschränkt oder verändert die Anwendung +eines Rechts oder Rechtsmittels, das nicht ausgeschlossen, beschränkt oder +verändert werden kann und dessen Ausschluss, Beschränkung oder Veränderung +durch den Neuseeland-Verbraucher-Garantie-Akt 1993 abgedeckt ist. Dieser Akt +garantiert, dass Produkte und Dienste eine akzeptable Qualität aufweisen. +Sollte diese Garantie nicht gewährleistet sein, hast Du ein Recht auf Abhilfe, +dieses Recht kann Reparatur, Austausch oder Erstattung beinhalten. Sollte +keine Abhilfe nicht angeboten werden oder der Mangel nicht behebbar sein, wird +Dir eine Erstattung garantiert. + + + +Unsere freiwillige Rückerstattungsrichtlinie + + + +7.3 Wir verstehen, dass ein Kauf manchmal nicht so abläuft, wie Du es erwartet +hast, und wir wollen gegenüber den GOG-Nutzern fair sein. Aus diesem Grund +bieten wir Dir zusätzlich zu den gesetzlichen Rückerstattungsrechten +(beschrieben in Abschnitt 7.1.- 7.2. oben) eine freiwillige +Rückerstattungsrichtlinie an, die [ hier +](https://support.gog.com/hc/articles/360006129837) beschrieben wird. In +einigen seltenen Fällen, wenn wir begründete Zweifel an Deinem +Rückerstattungsantrag haben, können wir die freiwillige Rückerstattungsanfrage +ablehnen. In keinem Fall werden dadurch die gesetzlichen +Rückerstattungsansprüche beeinträchtigt. Ein Verkauf gilt als endgültig, +sobald Deine Rückerstattungsrechte abgelaufen sind (es sei denn, wir +vereinbaren von Fall zu Fall etwas anderes). + +## 8\. Virtuelle Gegenstände und virtuelle Währungen + +8.1 Manche GOG-Inhalte ermöglichen Dir unter Umständen, virtuelle Gegenstände +und/oder virtuelle Währungen (zusammenfassend „virtuelle Güter“) zu kaufen +oder zu erhalten. Virtuelle Güter unterliegen dieser Vereinbarung und +insbesondere den folgenden Grundregeln, außer, wenn durch spezifische Regeln +für den jeweiligen GOG-Inhalt andere Bestimmungen vorgegeben werden (diese +haben Vorrang vor den vorliegenden Regeln). + + + +8.2 Virtuelle Güter sind digitale Güter, die über keinen Gegenwert in Bargeld +oder physischen Gegenständen verfügen. Diese Güter können nicht gekauft, +verkauft, verschenkt, übertragen oder eingelöst werden, weder gegen andere +virtuelle Güter, noch gegen echtes Geld, physische Güter, Dienste oder +sonstige Gegenstände mit Geldwert. Der Handel mit virtuellen Gütern ist +verboten (außer, er wurde Dir speziell erlaubt). Dein Recht zur Nutzung +jeglicher virtuellen Güter ist beschränkt auf eine begrenzte, nicht exklusive, +nicht übertragbare, nicht unterlizenzierbare, widerrufliche Lizenz für Deine +persönliche Unterhaltung und für nicht kommerzielle Zwecke im Rahmen des +betreffenden GOG-Inhalts. Du hast kein Eigentum, keine Rechte und keinen +Anspruch auf virtuelle Güter; sie verbleiben im Eigentum des jeweiligen +Publishers. Virtuelle Güter können bei Bedarf geändert, angepasst oder +aufgehoben werden, unter anderem auch zur Durchsetzung dieser Vereinbarung. +Wenn nötig, können der Nutzung von virtuellen Gütern auch Beschränkungen +auferlegt werden (einschließlich Einschränkungen von Transaktionen und +Guthaben). + + + +8.3 Die Existenz eines bestimmten Angebots von virtuellen Gütern stellt keine +Verpflichtung unsererseits dar, diese virtuellen Güter in Zukunft weiter +anzubieten. Umfang, Auswahl und Art der virtuellen Güter, die Du erhalten +kannst, können sich ändern und wir haben das Recht, diese zu verwalten, zu +bearbeiten und zu entfernen, wenn wir dies für den fortlaufenden Betrieb von +GOG oder GOG-Inhalten oder aus sonstigen rechtmäßigen Gründen für nötig +halten. In solchen Fällen entstehen keine Verpflichtungen unsererseits an Dich +oder Dritte, wenn wir von unserem Recht Gebrauch machen. Wir werden uns +angemessen bemühen, Dich über alle solchen Veränderungen zu informieren und +die Gründe für eine solche Änderung zu erklären. + + + + + + +## 9\. PATCHES, AKTUALISIERUNGEN UND ÄNDERUNGEN + +9.1 Gelegentlich müssen wir GOG-Dienste oder GOG-Inhalte mit Patches oder +Updates ergänzen (z.B. um Funktionen hinzuzufügen oder zu entfernen oder um +Softwarefehler zu beheben). Wir benötigen diese Rechte, um GOG effizient und +sicher betreiben zu können. Werden GOG-Dienste oder GOG-Inhalte nicht gepatcht +oder aktualisiert, kann dies zu einer schlechteren Leistung Deiner Version +oder zu einer Inkompatibilität Deiner Version mit einigen Funktionen der GOG- +Dienste oder GOG-Inhalte führen. Damit riskierst Du auch, dass wichtige +Sicherheitsupdates nicht installiert werden. Unsere Partner können die GOG- +Dienste nutzen, um Patches oder Updates für die entsprechenden GOG-Inhalte +bereitzustellen. + + + + + +## 10\. EIGENTUM VON GOG-DIENSTEN UND GEISTIGE EIGENTUMSRECHTE + +10.1 GOG-Dienste, insbesondere ihre Grafiken, Computercodes, +Benutzeroberfläche, Aussehen und ihre Funktion, Audio, Video, Text, Layout, +Datenbanken, Daten sowie alle sonstigen Inhalte und alle darauf bezogenen +gesetzlichen und hinsichtlich der Nutzung geltenden Rechte sind unser Eigentum +oder werden von Dritten an uns lizenziert. GOG-Inhalte sind Eigentum ihrer +jeweiligen Entwickler/Publisher und werden an uns lizenziert. Mit Ausnahme der +in dieser Vereinbarung erläuterten Fälle sind alle Rechte vorbehalten. Es ist +Dir nur auf die in dieser Vereinbarung erläuterte Art und Weise gestattet, +GOG-Dienste oder GOG-Inhalte zu nutzen oder zu verwerten. + + + +10.2. GOG respektiert die geistigen Eigentumsrechte anderer. Bitte lies [ hier +](https://support.gog.com/hc/articles/16034228157213) mehr darüber. + +## 11\. Regeln zur Nutzung von GOG-Diensten + +11.1 Bitte befolge diese Regeln in Bezug auf die GOG-Dienste und GOG-Inhalte +sowie alle zusätzlichen Regeln, die wir nachstehend unter Punkt 11.2 +verlinken. Bitte lies diese Regeln sorgfältig durch, da deren Missachtung +(insbesondere in Bezug auf Cheating) als wesentlicher Verstoß gegen diese +Vereinbarung angesehen wird, der zur Aussetzung oder Kündigung Deines Zugangs +zu den GOG-Diensten führen kann. Hier nochmal alle Regeln im Überblick: + +(a) Nutze GOG-Dienste oder GOG-Inhalte nur zu Deinem persönlichen Vergnügen +(z.B. nicht zum Geldverdienen, für Raubkopien oder für politische Zwecke). + + + +(b) In Bezug auf GOG-Inhalte sind die Möglichkeiten, die du, abgesehen vom +Spielen der Spiele (z. B. das Erstellen abgeleiteter Werke) praktisch hast, +davon abhängig, was der Inhaber der GOG-Inhaltsrechte Dir erlaubt (GOG kann +solche Rechte nicht gewähren). Wende Dich daher bitte direkt an den +Rechteinhaber (als Erstes solltest Du jedoch prüfen, ob es eine EULA gibt und +was darin steht). Wir bitten auch darum, dass jegliche Nutzung in diesem Sinne +ausschließlich darauf abzielt, den GOG-Inhalt zu verbessern. + + + +(c) Bezogen auf GOG-Dienste (die auch GOG-Software umfassen): Führe ohne +vorherige Zustimmung von GOG bitte keine Veränderungen, Zusammenfügungen, +Verbreitungen, Übersetzungen, Rückentwicklungen, Dekompilierungen oder +Disassemblierungen durch und erstelle keine davon abgeleiteten Werke – außer +in Fällen, in denen Du durch diese Vereinbarung oder aufgrund der Gesetze +Deines Landes die Erlaubnis dazu erhalten hast. Wir möchten betonen, dass Du +Dich gerne an uns wenden kannst, falls Du derartige Dinge vorhast, und wir uns +mit Deiner Anfrage nach Treu und Glauben befassen werden. Ganz allgemein +möchten wir irgendwann in der Zukunft vielleicht Client-Protokolle öffnen, um +den Benutzern die Arbeit mit GOG-Daten/Software zu erleichtern ohne +Rückentwicklungen oder ähnliche Techniken für die Nutzer zu vereinfachen. + + + +(d) Hacke, belästige, störe oder missbrauche keine Dienste, Inhalte, Nutzer +oder Angestellte von GOG, füge ihnen keinen Schaden zu und nutze sie nicht für +ähnliche Zwecke. + +(e) Du darfst keine Cheats, Exploits, Automatisierungssoftware, Roboter, Bots, +Mods, Hacks, Spiders, Spyware, Cheats, Skripte, Trainer, Extraktions-Tools +oder jegliche Software erstellen, verwenden, zur Verfügung stellen und/oder +verbreiten, die mit den GOG-Diensten oder GOG-Inhalten in irgendeiner Weise +interagieren oder diese beeinträchtigen könnten (einschließlich, aber nicht +beschränkt auf nicht autorisierte Programme von Dritten, die die Kommunikation +zwischen GOG oder seinen Partnern und den GOG-Dienste abfangen, emulieren oder +umleiten und/oder nicht autorisierte Programme von Dritten, die Informationen +über die GOG-Dienste sammeln). + +(f) Störe nicht die Netzwerksoftware oder andere Software von GOG oder Dritten +durch Tunnelling, Code-Einschleusung, Modifikation oder Änderung von GOG- +Software, Verwendung ähnlicher Software gemeinsam mit GOG-Diensten oder GOG- +Inhalten, Protokollemulation oder das Erstellen oder die Nutzung privater +Server in Hinblick auf GOG-Dienste oder GOG-Inhalte. Versuche nicht auf +Bereiche von GOG.COM, GOG GALAXY oder den GOG-Servern zuzugreifen, die nicht +der Öffentlichkeit zugänglich gemacht wurden. + +(g) Tue oder sage nichts, was rassistisch, fremdenfeindlich, sexistisch, +verleumderisch oder anderweitig anstößig oder illegal ist oder sein könnte +(z.B. Ausbeutung von Minderjährigen, Aufforderung zur Gewalt, Betrug). Seid +bitte nett zueinander! + +(h) GOG-Konten dürfen nicht geteilt, „gekauft“, „verkauft“, übertragen, +verschenkt, ausgeliehen, gestohlen, übernommen oder missbräuchlich genutzt +werden. GOG-Keys/GOG-Codes dürfen nur in der von GOG gestatteten Weise +verschenkt oder übertragen werden. Wende Dich bei Fragen oder Problemen an den +Kundendienst. + + + +(i) Wir bitten dich, Beschränkungen, Anforderungen oder Regeln abhängig von +geografischem Standort, Region oder Sprache im Zusammenhang mit GOG zu +befolgen. + + + +(j) Wir bitten dich, im Zusammenhang mit GOG alles zu unterlassen, was gegen +die Urheberrechte, Markenrechte, Patentrechte, Handelsgeheimnisse, +Persönlichkeitsrechte, Veröffentlichungsrechte oder sonstige Rechte Dritter +verstößt, beispielsweise mittels Bildern, Fotos, Sounddateien, Textdateien, +Grafiken oder jeglichen sonstigen Materialien und Informationen. + +11.2 Zusätzlich zu den oben genannten Bedingungen findest Du im Folgenden eine +Liste weiterer Bedingungen, die für Dich gelten, wenn Du GOG-Dienste nutzt. +Wir möchten uns nicht wiederholen, aber es ist uns wichtig, darauf +hinzuweisen, dass eine Missachtung eine wesentliche Verletzung dieser +Vereinbarung darstellt, und somit zu einer Suspendierung oder Kündigung Deines +Zugangs zu den GOG-Diensten führen kann. Hier ist die Liste: + + * [ GOG-Verhaltenskodex ](https://support.gog.com/hc/articles/16033977811613) + + * [ Rechtsverletzende Inhalte und Urheberrechtsbestimmungen ](https://support.gog.com/hc/articles/16033687971613) . + + + +11.3 Jedes Mal, wenn wir eine + +Moderationsentscheidung treffen, die dazu + +führt, dass Dein Zugang zu den GOG-Diensten eingeschränkt wird, solltest du, +wann immer es möglich ist, eine Begründung erhalten, in der wir die Gründe für +diese Entscheidung darlegen. Solltest Du mit der Entscheidung, die wir +getroffen haben, nicht einverstanden sein, kannst Du innerhalb von 6 Monaten +ab dem Tag, an dem Du über die Entscheidung informiert wurdest, Widerspruch +einlegen. + +Einzelheiten bezüglich des Widerspruchsverfahrens sollten in Deiner + +Moderationsentscheidung enthalten sein. + +Die Vorgehensweise bei der Bearbeitung + +von Kundenbeschwerden ist auch in der + +Richtlinie über verletzende Inhalte und + +Urheberrechte ([hier](https://support.gog.com/hc/articles/16033687971613)) +beschrieben. + +## 12\. NUTZERERSTELLTE INHALTE + +12.1 In diesem Abschnitt geht es um Inhalte (z. B. Texte, Videos, Fotos, +Bilder, Screenshots, Bildschirmhintergründe oder Links), die Du für uns oder +andere GOG-Nutzer über GOG-Dienste (z. B. durch Dein Profilbild oder +Nachrichten an andere GOG-Nutzer) verfügbar machst. Diese nennen wir +„Nutzererstellte Inhalte“. + +12.2 Was uns und Dich betrifft, so bist Du Eigentümer aller nutzergenerierten +Inhalte, jedoch musst Du uns einige eingeschränkte Rechte daran einräumen, +damit wir diese tatsächlich über die GOG-Dienste übertragen können. Indem Du +nutzergenerierte Inhalte einstellst, so erteilst Du uns eine nicht-exklusive, +unwiderrufliche Lizenz, Deine nutzergenerierten Inhalte in Verbindung mit den +GOG-Diensten zu nutzen, zu modifizieren, zu reproduzieren, davon abgeleitete +Werke zu erstellen, zu verteilen, zu übertragen, zu kommunizieren und +öffentlich darzustellen/aufzuführen. + +12.3 Es unterliegt Deiner Verantwortlichkeit, dafür zu sorgen, dass Du alle +notwendigen Rechte besitzt, bevor Du nutzererstellte Inhalte verwendest, und +zudem zu überprüfen, ob deren Verwendung sicher ist – wir können es nicht +wissen und prüfen, daher müssen wir uns auf Dich verlassen. + + + +12.4. Wir haben jedoch das Recht (aber nicht die Pflicht), nutzergenerierte +Inhalte, die rechtswidrig, unerlaubt, verleumderisch, obszön, die +Persönlichkeitsrechte anderer Personen verletzend, bedrohend, belästigend, +beleidigend, hasserfüllt, rassistisch oder pornografisch sind, zu überprüfen +und gegebenenfalls zu entfernen, wenn dies angemessen oder gesetzlich +erforderlich ist. Solltest Du feststellen, dass solche Inhalte auf GOG- +Diensten veröffentlicht wurden, teile uns dies bitte mit. Wir bitten dich, +unsere Regelungen zu [ Rechtsverletzenden Inhalten und +Urheberrechtsbestimmungen +](https://support.gog.com/hc/articles/16033687971613) zu lesen, in denen wir +unser Verfahren zur Meldung rechtsverletzender Inhalte erläutern. Sollte Dein +Fall nach unserem internen Verfahren immer noch nicht vollständig geklärt +sein, so hast Du die Möglichkeit einer außergerichtlichen Streitbeilegung - +mehr dazu weiter unten in Abschnitt 20. + +## 13\. FEEDBACK ODER VORSCHLÄGE + +13.1 Du kannst uns gerne Feedback und Vorschläge zur Verbesserung der GOG- +Dienste schicken - wir schätzen diese sehr. Allerdings möchten wir +klarstellen, dass wir nicht verpflichtet sind, sie zu nutzen oder anzunehmen, +außerdem schulden wir Dir nichts dafür (in finanzieller und sonstiger +Hinsicht). + +## 14\. VERWENDUNG VON GOG-INHALTEN IN FAN-WERKEN + +14.1 Vor dem Erstellen von Fan-Werken (z. B. Fan-Mods, Machinimas, Parodien, +Hommagen, „Let's Play“-Videos bzw. sonstige Videos oder Kunstwerke) musst Du +Dich beim Eigentümer der Inhalte (also z. B. beim Entwickler oder Publisher) +erkundigen, ob dies für ihn in Ordnung ist, und eine Erlaubnis einholen. Der +Grund dafür ist ganz einfach: GOG-Inhalte gehören den jeweiligen Eigentümern, +nicht GOG. + +## 15\. INHALTE DRITTER UND EXTERNE DIENSTE + +15.1 Über GOG-Dienste erhältst Du unter Umständen Links auf Webseiten oder +Inhalte Dritter. Ob Du sie nutzt, entscheidest Du – wir können nicht +versprechen, dass sie funktionieren, außerdem wissen wir nicht, wie sie +gestaltet sind oder ob sie etwas kosten. + + + +15.2 Du kannst Dein GOG-Konto auch nutzen, um einfachen Zugang zu externen, +von GOG autorisierten Partnerdiensten zu erhalten, darunter die „The Witcher“- +Spiele und Seiten unserer verbundenen Firma CD PROJEKT. Diese Dienste haben +eigene Geschäftsbedingungen, denen Du zustimmen und an die Du Dich halten +musst. Nur um es noch mal klarzustellen: Die Nutzung dieser Dienste ist +vollkommen optional. Du entscheidest und Du hast die Macht! + + + + + + +## 16\. GEWÄHRLEISTUNGEN UND HAFTUNGSBESCHRÄNKUNGEN HINSICHTLICH DER GOG- +DIENSTE + +16.1 Wir sichern zu: (i) dass wir das Recht haben, diese Vereinbarung +einzugehen und Dir die in Abschnitt 2.1 erwähnte Lizenz zum Nutzen von GOG- +Diensten zu erteilen; (ii) dass wir bei den GOG-Diensten und ihrer Nutzung +durch Dich angemessene Sorgfalt walten lassen; und (iii) dass wir angemessene +Anstrengungen unternehmen, gemäß des anwendbaren Rechts zu handeln und unsere +sich aus dieser Vereinbarung ergebenden Verpflichtungen Dir gegenüber zu +erfüllen. + + + +16.2 Deine Erklärungen und Zusicherungen. Du erklärst und sicherst zu, dass Du +vollständig bemächtigt und befähigt bist, diese Vereinbarung einzugehen und +dass Du ihren Bestimmungen vollständig folgen wirst. Du erklärst und sicherst +außerdem zu, dass alle nutzererstellten Inhalte, welche Du über GOG-Dienste +überträgst, keine intellektuellen Inhaberrechte einer dritten Partei +verletzen. Du erklärst und sicherst weiterhin zu, dass Du nutzererstellte +Inhalte weder verwenden noch erstellen oder weiterverbreiten wirst, welche +rechtswidrig, unerlaubt, defamierend, obszön, die Privatsphäre einer anderen +Person verletzend, drohend, belästigend, missbrauchend, hasserfüllt, +rassistisch oder pornographisch sind. + + + +16.3. Wir bemühen uns sehr, die GOG-Inhalte auf Deinen Systemen zum Laufen zu +bringen, aber wir haben nur begrenzte Zeit, um Tests durchzuführen, und es +gelingt uns nicht immer alles optimal. Daher können wir keine Haftung oder +Verantwortung für GOG-Inhalte übernehmen, es sei denn, dies ist gesetzlich +vorgeschrieben (siehe 7.1.-7.2). Außerdem sind wir nicht verantwortlich für +alles, was mit GOG.COM oder den GOG-Diensten geschieht und außerhalb unserer +Kontrolle liegt, und wir garantieren nicht, dass die GOG-Dienste zu 100% +funktionieren. Vergiss jedoch nicht, dass Du bei technischen Problemen +Anspruch auf Rückgabe und Erstattung von GOG-Inhalten hast- siehe Abschnitt +7.3. + +## 17\. AUSSERKRAFTTRETEN + +17.1 Dein Recht auf Kündigung des Vertrags. Du kannst diese Vereinbarung +jederzeit und ohne Angabe von Gründen kündigen, indem Du die Nutzung der GOG- +Dienste vollständig einstellst. Wenn Du möchtest, dass wir Dein Konto löschen, +wende Dich bitte [ hier +](https://support.gog.com/hc/requests/new?category=info&product=gog) an unser +Support-Team oder sende einfach eine E-Mail-Anfrage an privacy@gog.com. Die +Beendigung hat keine Auswirkungen auf bereits bestehende Rechte oder Pflichten +für uns oder dich. + +17.2 Unser Recht auf Kündigung des Vertrags. Wenn Du diese Vereinbarung +wesentlich verletzt, behalten wir uns das Recht vor, Deinen Zugang zu GOG- +Diensten und GOG-Inhalten auszusetzen oder zu sperren. Unter einem +wesentlichen Verstoß gegen die Vereinbarung verstehen wir einen +schwerwiegenden Verstoß, der GOG und/oder den GOG-Nutzern erheblichen Schaden +zufügen könnte, sowie insbesondere einen Verstoß gegen die Bestimmungen in +Abschnitt 11 oder den[GOG- +Verhaltenskodex](https://support.gog.com/hc/articles/16033977811613). Wenn wir +Deinen Zugang zu GOG-Diensten oder GOG-Inhalten aussetzen oder kündigen, +werden wir angemessene Schritte unternehmen, um Dich zu kontaktieren und Dir +zu erklären, warum wir dies getan haben und was Du infolgedessen tun kannst +(wenn überhaupt). + +17.3 Es erscheint sehr unwahrscheinlich, aber wenn wir permanent keinen +Zugriff auf GOG-Dienste und GOG-Inhalte mehr anbieten können (nicht durch eine +Verletzung Deinerseits), werden wir versuchen, Dir mindestens sechzig (60) +Tage Vorwarnung zu geben, indem wir einen Hinweis auf +[www.GOG.com](http://www.gog.com) veröffentlichen und eine E-mail an +registrierte Nutzer senden – während dieser Zeitspanne solltest Du in der Lage +sein, die von Dir gekauften GOG-Inhalte herunterzuladen. + +## 18\. HÖHERE GEWALT + +18.1 Weder Du noch wir können haftbar gemacht werden für das Versäumnis, einer +sich aus dieser Vereinbarung ergebenden Verpflichtung nachzukommen oder Zugang +zu GOG-Diensten und GOG-Inhalten zu bieten, wenn dies durch unvorhergesehene +Ereignisse, die jenseits Deiner oder unserer angemessenen Einflussnahme +liegen, verursacht wird, darunter (ohne Beschränkung darauf) Internet- oder +Datenübertragungsausfälle, Feuer, Flut, Krieg oder Naturereignisse. + +## 19\. GELTENDES RECHT + +Für Nutzer, die ihren Wohnsitz in der Europäischen Union oder anderswo auf der +Welt (jedoch nicht in den USA) haben: + + + +19.1 Du und wir stimmen überein, dass Deine Nutzung der GOG-Dienste und GOG- +Inhalte sowie diese Vereinbarung den Gesetzen der Republik Polen unterliegen +und dementsprechend ausgelegt werden und dass Rechtsstreitigkeiten +hinsichtlich dieser Vereinbarung nicht ausschließlich vor Gerichten der +Republik Polen ausgetragen werden. Bei einem sich aus dieser Vereinbarung +ergebenden Rechtsanspruch erhält die im Verfahren obsiegende Seite einen +Anspruch auf Erstattung ihrer Rechtskosten und Ausgaben. + + + +19.2 Die oben genannte Wahl für geltendes Recht und Rechtssprechung unterliegt +allen zwangsweise geltenden Prinzipien des Konsumentenschutzes oder anderen +Rechten im Gerichtsstand Deines Wohnsitzes, die sonst nicht verfügbar wären. + +### Nur für Nutzer in den USA: + +19.3 Du und wir stimmen überein, dass Deine Nutzung der GOG-Dienste und GOG- +Inhalte sowie diese Vereinbarung als in Los Angeles, Kalifornien, eingegangen +gilt und den Gesetzen des Staates Kalifornien, USA, (und, falls anwendbar, den +Bundesgesetzen der USA) unterliegen und dementsprechend ausgelegt werden. +Jeder Rechtsanspruch Deinerseits gegen GOG wird ausschließlich vor einem +Staats- oder Bundesgericht in Los Angeles, Kalifornien, verfolgt, das die +sachliche Zuständigkeit zum Rechtsstreit zwischen Dir und uns besitzt. Aus +diesem Grunde erkennen beide Parteien die ausschließliche Zuständigkeit dieser +Gerichte an. Bei einem sich aus dieser Vereinbarung ergebenden Rechtsanspruch +erhält die im Verfahren obsiegende Seite einen Anspruch auf Erstattung ihrer +Rechtskosten und Ausgaben. + +## 20\. Kundendienst und Disputlösung + +20.1 Wenn Du Bedenken, Forderungen oder Probleme mit uns hast, hoffen wir, +dass wir diese schnell und einvernehmlich lösen können, indem Du uns [ hier +](https://support.gog.com/hc/de/requests/new?category=info) kontaktierst. Wir +werden vernünftig und in gutem Glauben versuchen, alle Dispute informell +zwischen uns zu lösen. Wir versuchen, alle Forderungen innerhalb von 14 Tagen +zu beantworten. + +20.2. Wenn das Problem in dieser Zeit nicht gelöst wird, hängen die nächsten +Schritte davon ab, wo Du wohnhaft bist. Wenn Du in der EU wohnst, so kannst Du +Deine rechtlichen Ansprüche bei der von der Europäischen Kommission +betriebenen und bereitgestellten Online-Streitbeilegungsplattform einreichen, +auf die Du über http://ec.europa.eu/consumers/odr/ zugreifen kannst, um eine +außergerichtliche Einigung zu erzielen oder ein Gerichtsverfahren einzuleiten. +Du kannst Dich auch dafür entscheiden, Deine Streitigkeit durch eine +außergerichtliche Streitbeilegungsstelle zu lösen, die vom Koordinator für +digitale Dienste in Deinem Land zertifiziert ist. + +20.3 Wenn Du in den USA oder dem Rest der Welt lebst (aber nicht in der EU), +dann kontaktiere uns bitte unter legal@GOG.COM. + +## 21\. WEITERE RECHTLICHE HINWEISE + +21.1 Sollte sich ein Teil dieser Vereinbarung als nicht auf dem Rechtsweg +durchsetzbar herausstellen, hat dies keinen Einfluss auf die anderen Teile. + +21.2 Diese Vereinbarung (einschließlich aller zusätzlichen Regelungen von GOG, +auf die darin verwiesen wird) stellt die gesamte Vereinbarung zwischen Dir und +uns dar und ersetzt alle früheren mündlichen oder schriftlichen +Vereinbarungen. Wenn Du damit nicht einverstanden bist, kontaktiere uns bitte +so schnell wie möglich unter legal@gog.com, nachdem Du die GOG-Dienste in +Anspruch genommen hast, da diese Regelungen sonst nach einer angemessenen +Frist (in der Regel 30 Tage) für Dich bindend sind. + +21.3 Diese Vereinbarung regelt unsere Beziehung zu Dir (und umgekehrt). Sie +gewährt keinen anderen Personen Rechte. + + + +21.4 Vergiss bitte nicht, dass wir an verschiedene Gesetze gebunden sind und +unter Umständen der Strafverfolgung assistieren oder anderen gesetzlichen +Vorschriften folgen müssen. + + + +21.5 Sollte es zu einer Neuorganisation, einem Verkauf oder einer Fusion von +GOG kommen, müssen wir eventuell mit entsprechenden Dritten zusammenarbeiten, +um Dein GOG-Konto zu übertragen oder mit einem anderen Konto +zusammenzuschließen. + + + +21.6 Du und wir stimmen beide zu, dass diese Vereinbarung nicht dem +Übereinkommen der Vereinten Nationen über Verträge über den internationalen +Warenkauf unterliegt. + + + +21.7 Wir können diese Vereinbarung an andere Mitglieder unserer +Unternehmensgruppe oder an Dritte abtreten, vertraglich untervergeben oder +übertragen, wenn dies im Rahmen einer Umstrukturierung, einer Fusion oder aus +sonstigen geschäftlichen Gründen für die Unterstützung von GOG erforderlich +ist. Falls dies eintritt, wirst Du benachrichtigt. + + + +21.8 Falls Du ein EU-Bürger bist, beachte bitte, dass GOG grenzübergreifende +Portabilität auf kostenlose und kostenpflichtige Inhalte gemäß Verordnung (EU) +2017/1128 des Europäischen Parlaments und des Gremiums vom 14. Juni 2017 +hinsichtlich grenzübergreifender Portabiliät von Online-Inhalten und -Diensten +in inneren Märkten anbietet, wobei dies jeglichen anderen rechtlichen +Anforderungen an GOG einschließlich IP-Schutz und jeglichen Anforderungen der +Entwickler- und Publisher-Partner von GOG unterliegt. + +## 22\. ÄNDERUNGEN AN DIESER VEREINBARUNG + +22.1 Wir können diese Vereinbarung ändern, wenn wir dies für notwendig +erachten, z.B. aus rechtlichen Gründen oder um Änderungen der GOG-Dienste oder +GOG-Inhalte zu berücksichtigen. Wenn dies der Fall ist, werden wir die +geänderte Vereinbarung online unter +https://support.gog.com/hc/articles/212632089 zur Verfügung stellen und werden +Dich per E-Mail (wenn Du ein GOG-Konto hast) über alle wesentlichen Änderungen +informieren. + +22.2 Alle Änderungen zu dieser Vereinbarung werden 30 Tage nach der +Ankündigung der Änderung online in Kraft treten. In der Zwischenzeit kannst Du +Dich unter legal@GOG.COM mit Fragen zu den Änderungen gerne an uns wenden. + + + +22.3 Wenn Du Dich mit den Änderungen nicht einverstanden erklärst (und zwar +unabhängig davon, ob Du uns per E-Mail kontaktierst), müssen wir Dich leider +dazu auffordern, die GOG-Dienste und GOG-Inhalte nicht mehr zu nutzen. Wir +sagen das nur ungern, hoffen aber, Du erkennst an, dass GOG-Dienste für einen +ordnungsgemäßen Betrieb von allen Personen nach denselben Regeln und nicht von +unterschiedlichen Personen nach unterschiedlichen Regeln genutzt werden +müssen. Wende Dich daher also bei Fragen bitte an uns. + + + +22.4 Du solltest wissen, dass wir niemals einfach Änderungen an dieser +Vereinbarung vornehmen, ohne Dich davon in Kenntnis zu setzen. Außerdem werden +wir Dich nicht zwingen, vor der Nutzung von GOG-Änderungen zuzustimmen, die Du +nicht verstehst! + +## 23\. Unsere Kontaktinformationen + +23.1. Solltest Du eine Beschwerde bezüglich Deines GOG-Kontos oder der GOG- +Dienste einreichen oder uns einfach kontaktieren wollen, so findest Du die +entsprechenden Kontaktdaten hier: + +Name: GOG sp. z o.o. + + + +Eingetragener Geschäftssitz: ul. JagielloÅ„ska 74, 03-301 Warschau, Polen + +Eingetragen beim Bezirksgericht für Warschau, 14. Handelsabteilung des +Nationalen Gerichtsregisters. + + + +Registrierungsnummer 0000029514 + + + +Steuernummer Umsatzsteuer-ID (NIP) PL 113-21-77-807 + + + +Stammkapital: PLN 135.750,00 PLN + + + +Zentrale Anlaufstelle für Behörden: + +GOG Legal Team + +legal@gog.com + +Sprachen, in denen wir kommunizieren: Englisch, Polnisch + + + +Zentrale Anlaufstelle für Empfänger von GOG-Dienstleistungen: + +GOG-Support-Team + +support@gog.com + +Wir sprechen hauptsächlich Englisch und Polnisch, aber wir werden unser Bestes +tun, um Dir in jeder Sprache zu helfen, in der GOG verfügbar ist. + + + +Letzte Aktualisierung (Datum des Inkrafttretens): 17. Februar 2024 + + + +Die vorherige Version der Nutzungsbedingungen findest +Du[hier](https://support.gog.com/hc/en-us/articles/360010039713-User- +Agreement-effective-until-November-5-2020-?product=gog). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/serpentisle/tmp/EULA_en-US.txt b/info.exult.exult/data/serpentisle/tmp/EULA_en-US.txt new file mode 100644 index 0000000..e35fa4e --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/EULA_en-US.txt @@ -0,0 +1,1600 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM USER AGREEMENT + +## 1\. ABOUT THIS AGREEMENT + + + +1.1 This Agreement is a contract between you (we will further call you just +“youâ€) and GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Warsaw, Poland (we will +further call ourselves “GOG†or just “usâ€) and applies to www.GOG.COM, your +GOG user account, GOG GALAXY application (including GOG GALAXY store), any +games or videos or other content or services which you purchase or access via +us, the GOG web forums, GOG customer and technical support and other services +we provide to you (we'll just call all this “GOG services†for short). Here we +set out your rights and obligations as a recipient of GOG services. + + + +1.2. Additional terms may apply to GOG services and in such a case we will +post them for your acceptance. For example, if you would like to use the GOG +GALAXY application, the relevant terms will be posted for your acceptance +before you start using these services. + + + +1.3 Also, when we're talking about games, in-game content, virtual items or +currency or GOG videos or other content or services which you can purchase or +access via GOG services, we’ll just call them “GOG games†or “GOG videos†+respectively and when we talk about them all together they are “GOG contentâ€. + + + +1.4 We didn’t want to make this document too long, but keep in mind that by +accepting our User Agreement you also accept: + + * our [ Privacy Policy ](https://support.gog.com/hc/articles/212632109) \- which explains what data we collect from you and how we protect it, + + * [ GOG Code of Conduct ](https://support.gog.com/hc/articles/16033977811613) which is a set of rules you need to follow as part of our community, + + * [ Infringing Content and Copyright Policy ](https://support.gog.com/hc/articles/16033687971613) which explains how you can report unlawful content on GOG and what happens when you do. + + + +1.5 GOG works with trusted partners, including our related company CD PROJEKT +S.A., developers and publishers, payment providers, customer service software +providers and others (“Partnersâ€) – more on them later in this Agreement. + + + +1.6 If you're over 18, then welcome! If you're between 16 and 18, before we +extend an equally warm welcome, please ask your parent or guardian to review +and approve this Agreement on your behalf (because in some countries people +under a certain age cannot legally enter into contracts like this Agreement). +If you’re not 16 yet you cannot have a GOG account or use the GOG services +because legally we cannot handle personal data of children without a special +parental or guardian’s permission (but your parents/guardians are welcome to +sign up themselves). + +## 2\. USING GOG SERVICES AND GOG CONTENT + + + +2.1 We give you and other GOG users the personal right (known legally as a +'license') to use GOG services and to download, access and/or stream +(depending on the content) and use GOG content. This license is for your +personal use. We can stop or suspend this license in some situations, which +are explained later on. + + + +2.2 When you buy, access or install GOG games, you might have to agree to +additional contract terms with the developer/publisher of the game (e.g. they +might ask you to agree to a game specific End User License Agreement). If +there is any inconsistency or dispute between those ‘EULAs’ and this +Agreement, then this Agreement wins. + + + +2.3 With GOG videos, you can also stream purchased video content or download +it to watch the way you want. + + + +2.4 Using certain third-party scripts is recommended for your full use of GOG +functionality and, although that usage is optional, we cannot promise full +service performance without them. + + + +2.5 A quick word about GOG GALAXY, which is our (optional) application which +not only allows you to buy and access GOG content but also provides cool +features like unified game library, and one friends list across platforms, +online multiplayer, achievements, cross-platform chat, game-time tracking, +cloud-saves and game overlay. You can learn more about +it[here](https://www.gog.com/galaxy). + + + +2.6 In some parts of GOG services, we use recommendation systems to present +you the content that you are most likely to be interested in. You can learn +where we use them and how they work[here](https://support.gog.com/hc/en- +us/articles/16034228157213), including what main parameters we use and how to +influence them. + +## 3\. GOG ACCOUNT + + + +3.1 To buy GOG content from GOG services, and in some cases to play/use GOG +content where our partners require use of a GOG account, you will need to set +up a GOG account. This will involve creating a password (which is encrypted so +we can’t access it) and a username, plus giving us (for identification +purposes) your email address. Please make sure your login credentials are kept +secure and your account is used properly. In your GOG account settings you can +also optionally set your country of residence, birthday and avatar. Our +Privacy Policy gives more details about the information we collect from you +and how we use it and protect it. +It's[here](https://support.gog.com/hc/articles/212632109). + + + +3.2 You can use your GOG account to set up a public profile accessible by +other people. You can also use your GOG account to connect with other GOG +users. Please act sensibly and remember you are responsible for your own +actions. + + + +3.3 Your GOG account and GOG content are personal to you and cannot be shared +with, sold, gifted or transferred to anyone else. Your access to and use of +them is subject to GOG’s [ Privacy Policy +](https://support.gog.com/hc/articles/212632109) and [ Code of Conduct +](https://support.gog.com/hc/articles/16033977811613) which are updated or +amended when necessary. + + + +3.4. Access to and use of the games purchased from different platforms (i.e. +with what we call ‘Keyless Access’), including their minimum system +requirements is governed by respective third-party platform policies and (as +applicable) additional contract terms with the developer/publisher of the game +(e.g. they might ask you to agree to a game specific End User License +Agreement). It may require having a third-party platform account. These +platforms may roll out patches or updates for your purchased games. + +## 4\. SYSTEM REQUIREMENTS + + + +4.1 Because GOG gives you access to many different services and games created +at different times and via different platforms, we cannot give you one set of +system requirements for all GOG services or GOG content. Please make sure your +computer and Internet connection are good enough to use GOG services and play +GOG games and videos. + + + +4.2 What we can tell you is that using any GOG game will require a computer, +equipped with a mouse and keyboard (touchscreen controls are not supported), +with an appropriate operating system (please refer to the relevant GOG product +page) with all service packs and important updates installed on it. All GOG +games should be natively installed on a computer that meets or exceeds the +minimum hardware and software specifications shown on the GOG product page. +GOG games are not tested on virtual machine software and therefore we do not +support playing through them. + + + +4.3 For GOG videos, please make sure your video player supports the videos’ +format specified in the GOG product page. + + + +4.4 If you have questions about system requirements, please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). Just so we're clear, you are +responsible for making sure you have sufficient Internet access to download +purchased GOG games or GOG videos from us or to stream GOG videos and that +your system can play GOG games and watch GOG videos. + +## 5\. BETAS + + + +5.1 As GOG develops, we may offer you optional access to 'beta' versions of +GOG software or services (e.g. new versions of the GOG GALAXY application made +available prior to its general release) or GOG content. + + + +Here are the rules: + + + +a) We (or any applicable publisher/partner) will set the conditions and +requirements for your beta access. Providing and maintaining a beta, and who +can use a beta, is at our discretion. + + + +b) You may be required to go through a registration process or other +requirements to access the beta (and this may include you meeting eligibility +criteria). + + + +c) Betas will be time-limited and there may be extra contract requirements. + + + +d) The beta may involve temporary or permanent server/progress/content wipes, +resets or amendments. + + + +e) The beta may be subject to confidentiality restrictions (which will be +notified to you in advance if so). + + + +f) You may be invited to participate in a feedback process regarding the beta +– this is totally optional but would be really valued. + + + +g) The beta is for your personal use and enjoyment, so you must not sell, loan +or otherwise transfer it to anyone else. + + + +h) The point of you getting beta access is to allow you to try something new, +but we would expect you to recognise that it will not be complete yet. +Therefore betas will be provided 'as is' without any additional promises from +us or any liability on us if it is not complete or does not work fully or +causes issues. Betas may not be totally feature-complete and there may be +feature changes, modifications or removals during the beta. + +## 6\. PAYING FOR GOG CONTENT AND GETTING REFUNDS + +### Paying for GOG content + +6.1 After you decide that you like a GOG game, GOG video or other GOG content, +you usually will need to pay for it before you can access it (though we do +have some free content too!). You can pay in different ways: (i) using a valid +debit or credit card; or (ii) using PayPal or any other authorized payment +provider. Remember to keep your payment details secure. + + + +6.2 When you use a payment method to buy GOG content, we're relying on your +promise that you're able to use that method. You are responsible for any +purchases made using your GOG account or payment method and you agree to the +pricing, payment and billing policies applicable to them, as notified to you +at the time of purchase. All payments are non-refundable and non-transferable +except as expressly provided in this Agreement. + + + +6.3 You can always pay for GOG content in US Dollars. However if you happen to +live in countries where your local currency is supported (see our Support +section [ here ](https://support.gog.com/hc/en- +us/articles/360001947034?product=gog) for details), you will be able to pay in +your local currency. You might have to pay a currency conversion charge if you +are not paying in your home currency and some banks might also add other kinds +of transaction fees. + + + +6.4. All prices are visible in the product catalog page. They’re inclusive of +taxes like VAT, if applicable. You should also expect some sales taxes/VAT to +be added to your price at checkout, if required by your local laws (f.ex. in +US or Canada). + + + +### GOG Wallet + +6.5 GOG offers users a digital account balance called the “GOG Wallet†in +connection with your user account, which you can use to make purchases of GOG +content on dedicated GOG services. Funds can be added to it in two ways: (i) +using your chosen payment method; or (ii) by us as part of our ‘Voluntary +Refund Policy’ (see link[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy)) in which case we may offer refunds +to GOG Wallet that you can use to get a replacement GOG game or other GOG +content. The GOG Wallet is made available subject to rules which are set out +on our GOG Wallet page[here](https://support.gog.com/hc/en- +us/articles/360001941953-FAQ-GOG-Wallet?product=galaxy). + +### GOG Bonus Codes + +6.6. We may also issue usually time-limited bonus codes which give you free or +reduced price access to GOG content (we’ll call them “Bonus Codesâ€). If you +receive Bonus Codes when you buy GOG content but later decide to return that +GOG content, then we think it’s fair for you to return the Bonus Codes too. +Therefore, we will terminate it or, if it has been redeemed for a GOG game, +that game will be removed from your account. + +### Direct to Account Distribution + +6.7 We have a direct to account distribution feature (we’ll call it ‘GOG +Direct to Account) where distribution platforms who partner with us would be +able to sell games or other content to you, where you could choose for that +game/content to be automatically activated within your GOG account, without +the need to redeem any codes. Just to be clear, the whole purchase process is +handled by the other platform, so in case of any issues with the purchase +process please speak with them directly. For this particular matter therefore, +we cannot offer you Our Voluntary Refund Policy (because GOG didn’t sell the +game/content). Of course, anything connected to our platform’s services is +still our responsibility. + +## 7\. REFUNDS AND RETURNS + +### Statutory refund rights + +7.1. If you are a resident of the European Union or other applicable +jurisdictions (excluding the USA), then you have the statutory right to +withdraw from a purchase of GOG content within 14 days of your purchase, +without giving a reason. To exercise the right of withdrawal, you should +inform us of your decision to withdraw from this contract by an unequivocal +statement (an email sent to support@GOG.COM, or a physical letter at an +address set out in Section 23 below). You may use the model withdrawal form +attached at the end of this Agreement, but you do not have to. To meet the +withdrawal deadline, it is sufficient for you to send your communication +concerning your exercise of the right of withdrawal before the withdrawal +period has expired. However, this does not apply where you have expressly +consented to the performance of the GOG content (which is digital content) +beginning immediately upon conclusion of the purchase process and have +acknowledged the loss of your withdrawal rights. + + + +7.2. Neither this nor any other part of this User Agreement affects your +statutory rights. In particular: + + + +a) For Australian Users: Our goods come with guarantees that cannot be +excluded under the Australian Consumer Law. You are entitled to a replacement +or refund for a major failure and compensation for any other reasonably +foreseeable loss or damage. You are also entitled to have the goods repaired +or replaced if the goods fail to be of acceptable quality and the failure does +not amount to a major failure. Details[here](https://support.gog.com/hc/en- +us/articles/360025857893?product=gog). + + + +b) For New Zealand Users: Neither this nor any other part of this User +Agreement excludes, restricts or modifies the application of any right or +remedy that cannot be so excluded, restricted or modified including those +conferred by the New Zealand Consumer Guarantees Act 1993. Under this Act are +guarantees which include that goods and services are of acceptable quality. If +this guarantee is not met there are entitlements to have the software remedied +(which may include repair, replacement or refund). If a remedy cannot be +provided or the failure is of a substantial character, the act provides for a +refund. + +### Our Voluntary Refund Policy + +7.3. We understand that sometimes a purchase doesn't turn out how you expected +and we want to be fair to GOG users. This is why on top of your statutory +refund rights (described in section 7.1.-7.2. above) we may offer you a +Voluntary Refund Policy described[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy). In some rare cases if we have +reasonable doubts regarding your refund request we may not apply the Voluntary +Refund Policy. In no case this will deprive you of any applicable statutory +refund rights. A sale is considered final once your refund rights expire +(unless we agree otherwise on a case by case basis). + +## 8\. VIRTUAL ITEMS AND VIRTUAL CURRENCY + + + +8.1 With certain GOG content you may be able to purchase or acquire virtual +items and/or virtual currency (we’ll call them “Virtual Goods†for short). +Virtual Goods are subject to this Agreement and in particular the following +default rules, unless there are specific rules for that GOG content (which +will prevail over these rules). + + + +8.2 Virtual Goods are digital items only with no cash-value or real world +existence and cannot be ‘bought’, ‘sold’, gifted, transferred or redeemed, +exchanged for other Virtual Goods, ‘real world’ money, goods, services or +items of monetary value. Trading Virtual Goods is prohibited (unless you are +specifically permitted to do so). Your right to use any Virtual Goods is +limited to a limited, nonexclusive, non-assignable, non-transferable, non- +sublicensable, revocable license to use them solely for your personal +entertainment and non-commercial use in the applicable GOG content. You have +no property interest or right or title in any Virtual Goods, which remains the +appropriate publisher’s property. Virtual Goods may be changed, amended or +reversed if necessary, including to enforce this Agreement. If necessary, +limits may be placed on the use of Virtual Goods (including transaction limits +and balance amounts). + + + +8.3 The existence of a particular offer for Virtual Goods is not a commitment +by us to maintain or continue to make the Virtual Goods or that offer +available in the future. The scope, variety and type of Virtual Goods that you +may obtain can change and we have the right to manage, modify and remove +Virtual Goods if we consider necessary for the ongoing operation of GOG or GOG +content or for other legitimate reasons, in which case we will have no +liability to you or anyone for the exercise of such rights. We will make +reasonable efforts to notify you of any such change and to explain the reason +for such change. + +## 9\. PATCHES, UPDATES AND CHANGES + + +9.1 Occasionally we may need to patch or update GOG services or GOG content +(for example to add or remove features or to resolve software bugs). We need +these rights in order to keep GOG running efficiently and safely. Not patching +or updating the GOG services or GOG content may result in inferior performance +of your version or incompatibility of your version with some of the GOG +services or GOG content features. Doing so, you are also risking not +installing important security updates. Our Partners may use GOG services to +roll out patches or updates for applicable GOG content. + +## 10\. OWNERSHIP OF GOG SERVICES AND INTELLECTUAL PROPERTY RIGHTS + +10.1 GOG services including (but not limited to) their graphics, computer +code, user interface, look and feel, audio, video, text, layout, databases, +data and all other content, and all legal and exploitation rights regarding +them are either owned by us or we license them from third parties. GOG content +is owned by its developers/publishers and licensed by us. All rights are +reserved except as we have explained in this Agreement. You may not use or +exploit any part of the GOG services or GOG content except as explained in +this Agreement. + + + +10.2. GOG respects the intellectual property rights of others. Please read +more[here](https://support.gog.com/hc/articles/16033687971613). + +## 11\. RULES FOR USING GOG SERVICES + +11.1 Please follow these rules regarding the GOG services and GOG content, and +any additional rules we link in 11.2 below. Please read these rules carefully +since failure to follow them (particularly those in relation to cheating) will +be considered a material breach of this Agreement, which could lead to +suspension or cancellation of your access to GOG services. Here are the rules: + + + +(a) Only use GOG services or GOG content for your personal enjoyment (for +example, don't use them to make money, for piracy or for political purposes). + + + +(b) Regarding GOG content, what you can do practically apart from playing the +games (like create derivative works of it) depends on what the GOG content +rights holder allows you to do (GOG can’t grant such rights). So please check +this with the rights holder directly (the first thing you should do though is +to check if they have a EULA and if so what it says). We also ask that you +make only genuine attempts to improve the GOG content. + + + +(c) Regarding GOG services (which includes GOG software), unless you have +prior GOG permission please don’t modify, merge, distribute, translate, +reverse engineer, decompile, disassemble, or create derivative works of them – +unless you’re allowed in this Agreement or by the law in your country. We’d +like to emphasize that you are free to contact us for permission to do these +things and we will review and respond to those requests in good faith. More +generally, at some point in the future we want to open client protocols to +make it easier for users to work with GOG data/software without any need for +reverse engineering or similar techniques. + + + +(d) Don't hack, harm, grief, interrupt or misuse GOG services or GOG content, +GOG users or GOG personnel or use them for any similar purpose. + + + +(e) Do not create, use, make available and/or distribute cheats, exploits, +automation software, robots, bots, mods, hacks, spiders, spyware, cheats, +scripts, trainers, extraction tools or other software that interact with or +affect GOG services or GOG content in any way (including, without limitation, +any unauthorized third party programs that intercept, emulate, or redirect any +communication between GOG or its partners and GOG services and/or any +unauthorized third party programs that collect information about GOG +services). + + + +(f) Don't interfere with the GOG or third party network software or other +software including via tunnelling, code injection, modifying or changing GOG +software, using any other similar software together with GOG services or GOG +content, through protocol emulation, or through creation or use of private +servers regarding GOG services or GOG content. Do not access or attempt to +access areas of GOG.COM, GOG GALAXY or GOG servers that have not been made +available to the public. + + + +(g) Don't do or say anything which is or may be considered racist, xenophobic, +sexist, defamatory or otherwise offensive or illegal (f.ex. exploiting minors, +encouraging violence, engaging in fraud). Be nice to each other please! + + + +(h) Don’t share, ‘buy’, ‘sell’, transfer, gift, lend, steal, misappropriate or +misuse GOG accounts. GOG keys/codes can only be gifted or transferred or used +in the ways permitted by GOG. If you have any questions or problems, contact +customer support. + + + +(i) We ask you to follow any applicable geographic or regional, language or +location-based restrictions, requirements or rules regarding GOG. + + + +(j) We ask you not to do anything in connection with GOG that infringes any +copyright, trademark, patent, trade secret, privacy, publicity, or other right +of others, such as images, photographs, sound files, text files, graphics +files, and any other material or information. + + + +11.2 In addition to the above, below is the list of additional terms that +apply to you when using GOG services. We do not want to repeat ourselves, but +it is important to remember that if you fail to follow them, it will be a +material breach of this Agreement, which could lead to a suspension or +cancellation of your access to GOG services. Here is the list: + + * GOG Code of Conduct ([link](https://support.gog.com/hc/articles/16033977811613)) + + * Infringing Content and Copyright Policy ([link](https://support.gog.com/hc/articles/16033687971613)). + + + +11.3 Every time we make a moderation decision resulting in restricting your +access to GOG services, whenever it is possible you should receive a statement +of reasons outlining why we have made this decision. If you do not agree with +the decision we have made, you have 6 months from the day that you have been +informed about the decision, to make a complaint. The details on how to make a +complaint should be available in your moderation decision. The description of +our complaint-handling system procedure is also available in the Infringing +Content & Copyright Policy +([here](https://support.gog.com/hc/articles/16033687971613)). + +## 12\. USER GENERATED CONTENT + +12.1 This section is about content (e.g. text, photos or links) which you make +available either to us or to other GOG users via GOG services (for example +through your profile picture or through messages to other GOG users). We'll +call this "User Generated Content". + + + +12.2 As far as we and you are concerned, you own any User Generated Content +but we need you to give us some limited rights over it so that we can actually +transmit it through GOG services. So, by posting User Generated Content you +give us a nonexclusive, irrevocable license to use, modify, reproduce, create +derivative works from, distribute, transmit, communicate and publicly +display/perform your User Generated Content in connection with GOG services. + + + +12.3 It is your responsibility to make sure that you have all necessary legal +rights before you use User Generated Content and for checking they are safe to +use – we can't know that ourselves, and we can't check it for you, so we have +to rely on you. + + + +12.4. However, we have the right (but not the obligation) to review and if +appropriate or legally necessary to remove any User Generated Content which is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. If +you find that any such content has been posted on GOG services, please let us +know. We ask you to read our Infringing Content and Copyright Policy +([link](https://support.gog.com/hc/articles/16033687971613)), where we explain +our procedure for reporting infringing content. If you still feel your case is +not fully resolved after our internal procedure, you have access to an out-of- +court dispute settlement - more on this in Section 20 below. + +## 13\. FEEDBACK OR SUGGESTIONS + +13.1 You’re welcome to give us feedback and suggestions to improve GOG +services and we really value them all. However, just so we’re clear, we don’t +have to use or accept them and we won’t owe you anything (financially or +otherwise) regarding them. + +## 14\. USING GOG CONTENT IN FAN WORK + +14.1 For fan work (e.g. works like fan mods, machinima, parodies, homages, +'Let's Play' or other videos or artwork), you need to check with the content +owner (e.g. the developer or publisher) if they are OK with it and if so you +should get permission from them. The reason is simple – the GOG content is the +property of the respective owner, not ours. + +## 15\. THIRD-PARTY CONTENT AND EXTERNAL SERVICES + +15.1 You might get links to third-party websites or content through GOG +services which aren’t connected to us. Using them is up to you – we’re not +responsible for them, we can't promise they will work, what they'll be like or +if they're free. + + + +15.2 You can also use your GOG account to get easy access to some external, +GOG approved partner services, e.g. The Witcher games and sites from our +sister company CD PROJEKT RED. They will have their own terms and conditions +which you will need to agree and follow. Just to be clear: using these +services is all optional and up to you. You have the power! + +## 16\. WARRANTIES AND LIMITATION OF LIABILITY REGARDING GOG SERVICES + +16.1 We warrant that: (i) we have the right to enter this Agreement and to +grant you the license to use GOG services in section 2.1; and (ii) we will +take reasonable care with the GOG services and your use of them; and (iii) we +will use reasonable endeavors to comply with applicable laws in performing our +obligations to you under this Agreement. + + + +16.2. Your representations and warranties. You represent and warrant that you +have the full power and ability to enter into this Agreement and will fully +follow its terms. You also represent and warrant that any User Generated +Content, which you transmit via GOG services does not infringe upon the +intellectual property rights of any third party. You further represent and +warrant that you will not use or contribute User Generated Content that is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. + + + +16.3. We work hard to try to make GOG content work on your systems but we only +have limited time to carry out tests and we don't always get everything right. +Therefore, we can't accept any liability or responsibility for GOG content +except where required by law (see 7.1.-7.2 above). We are also not responsible +for anything that happens to GOG.COM or GOG services which is outside of our +control and we do not guarantee GOG services will work 100% of the time. +However, don't forget you may be entitled to GOG content return and refund if +it has technical issues - see section 7.3. + +## 17\. TERMINATION + +17.1 Your right to terminate the Agreement. You may terminate this Agreement +at any time and without giving any reason by completely ceasing to use GOG +services. If you would like us to delete your account please contact our +Support Team [ here ](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog) or simply by sending an email +request to privacy@gog.com. Termination will not affect already existing +rights or obligations of us or you. + + + +17.2. Our right to terminate the Agreement. If you materially breach this +Agreement, we reserve the right to suspend or cancel your access to GOG +services and GOG content. By material breach of the Agreement we mean a +serious breach which could cause significant harm to GOG, GOG users, as well +as, in particular breach of the provisions of section 11 above or GOG Code of +Conduct. If we suspend or cancel your access to GOG services or GOG content +we'll take reasonable steps to contact you to explain why we have done this +and what (if anything) you can do as a result. + + + +17.3 It seems very unlikely, but if we have to stop providing access to GOG +services and GOG content permanently (not because of any breach by you), we +will try to give you at least sixty (60) days advance notice by posting a note +on www.GOG.COM and sending an email to every registered user – during that +time you should be able to download any GOG content you purchased. + +## 18\. FORCE MAJEURE + +18.1 Neither you nor us will be liable for any failure to perform any +obligation under this Agreement or to provide access to GOG services and GOG +content if that failure is caused by the happening of any unforeseen event +beyond your or our reasonable control including without limitation, Internet +outages, communications outages, fire, flood, war or act of God. + +## 19\. GOVERNING LAW + +### For users resident in the European Union and elsewhere in the world (but +not the USA): + +19.1 You and we agree that your use of GOG services and GOG content and this +Agreement will be governed by and interpreted according to the laws of the +Republic of Poland and that any dispute regarding this Agreement will be heard +non-exclusively by the courts of the Republic of Poland. In any legal claim +under this Agreement, the side which wins will be entitled to its legal fees +and expenses. + + + +19.2. The above choice of governing law and jurisdiction is subject to any +mandatorily applicable principles of consumer protection or other law in your +jurisdiction of residence which would not otherwise be available. + +### For users in the USA only: + +19.3 You and we agree that your use of GOG services and GOG content, and this +Agreement, will be deemed to be entered into in Los Angeles, California and +governed by and interpreted according to the laws of the State of California, +USA (and, if applicable, US federal law). Any legal claim by you against GOG +will be made exclusively in any state or federal court located in Los Angeles, +California, which will have subject matter jurisdiction regarding the dispute +between you and us and therefore we both consent to the exclusive jurisdiction +of those courts. In any legal claim under this Agreement, the side which wins +will be entitled to its legal fees and expenses. + +## 20\. CUSTOMER SUPPORT AND DISPUTE RESOLUTION + +20.1.If you have concerns, claims or issues with us, we hope we can resolve +them quickly and amicably. Please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). We will make reasonable and good +faith efforts to resolve any dispute between us informally. We undertake to +answer any claim within 14 days. + + + +20.2. If it is not resolved during this time, the next steps depend on where +you live. If you live within the EU you may submit your legal claims to the +online dispute resolution platform operated and provided by the European +Commission which can be accessed via http://ec.europa.eu/consumers/odr/ in +order to reach an out of court settlement or initiate a lawsuit. You may also +choose to resolve your dispute through any out-of-court dispute settlement +body certified by your country’s Digital Services Coordinator. + + + +20.3. If you live in the USA or the rest of the world (but not the EU) then +please contact us at legal@gog.com. + +## 21\. OTHER LEGAL STUFF + +21.1 If any part of this Agreement is found not to be legally enforceable, +this will not affect any other part of it. + + + +21.2 This Agreement (including any GOG additional terms referenced in it) +constitutes the entire agreement between you and us and supersedes any earlier +oral or written agreements. If you disagree with this, please contact us as +soon as possible after you start using GOG services at legal@gog.com since +otherwise this will be binding on you after a reasonable time period (usually +30 days). + + + +21.3 This Agreement governs our relationship with you (and vice versa). It +does not create any rights for anyone else. + + + +21.4 Please remember we are subject to various laws and we may be required to +comply with law enforcement or other legal requirements. + + + +21.5 If there is a reorganization, sale or merger of GOG then we may need to +work with relevant third parties to transfer or merge your GOG account. + + + +21.6. You and we agree that the UN Convention on Contracts for the +International Sale of Goods does not apply to this Agreement. + + + +21.7 We can assign, subcontract or transfer this Agreement to a third party or +another member of our group if necessary for the support of GOG, as part of +any reorganization or merger or for other business reasons. We will notify you +if this happens. + + + +21.8. If you are a European Union citizen, then please be aware that GOG has +enabled cross-border portability on free and paid content pursuant to +Regulation (EU) 2017/1128 of the European Parliament and of the Council of 14 +June 2017 on cross-border portability of online content services in the +internal market, but this is subject to any other legal requirements on GOG +including regarding IP protection and may also be subject to any requirements +of developer and publisher partners of GOG. + +## 22\. CHANGES TO THIS AGREEMENT + +22.1 We may change this Agreement if we think it's necessary, e.g. for legal +reasons or to reflect changes in GOG services or GOG content. If so, we will +make the changed Agreement available online at +https://support.gog.com/hc/articles/212632089 and (if you have a GOG account) +we will email you to let you know about any significant changes. + + + +22.2 Any changes to the Agreement will come into force within 30 days of their +announcement online. In the meantime, you're welcome to contact us at +legal@GOG.COM if you have specific questions about the changes. + + + +22.3 If you don't agree to those changes (regardless of whether you email us), +then unfortunately we must ask you to cease using GOG services and GOG +content. We're sorry we have to say that, but we hope you'll appreciate that +for GOG services to work properly we need to have everyone using it under the +same rules instead of different people having different rules. That's why we +encourage you to get in contact if you have queries or concerns. + + + +22.4 Just so you know, we'll never just make a bunch of changes to this +Agreement, not tell you what they are and force you to agree to changes you +don't understand before you can use GOG services! + +## 23\. OUR CONTACT DATA + +23.1. If you have any complaint concerning GOG account, GOG services, or +simply you would like to contact us, here are our contact details: + +Name: GOG sp. z o.o. +Registered Office: Ul. JagielloÅ„ska 74, 03-301 Warsaw, Poland +Registered at the District Court for Warsaw, 14th +Commercial Division of the National Court Register. +Registration Number 0000029514 +Tax number VAT ID (NIP) PL 113-21-77-807 +Share capital: PLN 135.750,00 PLN + +Single point of contact for authorities: +GOG Legal Team +legal@gog.com +Languages we communicate in: English, Polish +Single point of contact for recipients of GOG services: +GOG Support Team +support@gog.com +We mostly speak English and Polish, but will do our best to assist you in any +language that GOG is available in. +Last update (effective date): 17th February 2024 +See the previous version of the User +Agreement[here](https://support.gog.com/hc/articles/212632089). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/serpentisle/tmp/EULA_fr-FR.txt b/info.exult.exult/data/serpentisle/tmp/EULA_fr-FR.txt new file mode 100644 index 0000000..1d14990 --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/EULA_fr-FR.txt @@ -0,0 +1,1729 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM ACCORD UTILISATEUR + +## 1\. A PROPOS DE CET ACCORD + +1.1 Le présent accord est un contrat entre vous (nous vous dénommerons « vous +») et GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Varsovie, Pologne (nous nous +dénommerons « GOG » ou simplement « nous ») et s'applique à www.GOG.COM, à +votre compte utilisateur GOG, à l'application GOG GALAXY (y compris la +boutique GOG GALAXY), à tout jeu ou vidéo ou autre contenu ou service que vous +achetez ou auquel vous accédez par notre intermédiaire, aux forums web GOG, au +support client et technique GOG et aux autres services que nous vous +fournissons (nous dénommons tout cela «services de GOG» pour faire court). +Nous présentons ici vos droits et obligations en tant que bénéficiaire des +services de GOG. + +1.2. Des conditions supplémentaires pourraient s'appliquer aux services de GOG +et, si tel est le cas, nous les publierons pour que vous les acceptiez. Par +exemple, si vous souhaitez utiliser l'application GOG GALAXY, les conditions +correspondantes seront publiées pour acceptation avant que vous ne commenciez +à utiliser ces services. + +1.3 En outre, lorsque nous parlons de jeux, de contenu in-game, d'objets +virtuels, de monnaie ou de vidéos GOG ou d'autres contenus ou services que +vous pouvez acheter ou auxquels vous pouvez accéder via les services GOG, nous +les appelons respectivement "jeux GOG" ou "vidéos GOG" et lorsque nous parlons +de l'ensemble de ces éléments, il s'agit du "contenu GOG". + + + +1.4. Bien que nous n'ayons pas voulu rendre ce document trop long, il convient +de souligner qu'en acceptant notre accord d'utilisation, vous acceptez +également : + +â— notre[Politique de +confidentialité](https://support.gog.com/hc/articles/212632109), qui précise +les données que nous recueillons auprès de vous et les mesures que nous +adoptons pour les protéger, + +â— le [ Code de conduite de GOG +](https://support.gog.com/hc/articles/16033977811613) est un ensemble de +règles que vous devez suivre en tant que membre de notre communauté, + +â— notre [ Politique en matière de contenu illicite et de droits d'auteur +](https://support.gog.com/hc/articles/16033687971613) qui explique la +procédure de signalement d'un contenu illicite publié sur la plateforme GOG et +les résultats que vous obtiendrez en le faisant. + +1.5 GOG travaille avec des partenaires de confiance dont notre compagnie +affiliée, CD PROJEKT S.A., des développeurs, éditeurs, fournisseurs de +solution de paiement et d'assistance clientèle et d'autres sociétés +("Partenaires") – plus de détails sur les dits partenaires plus loin dans cet +Accord. + + + +1.6 Si vous avez plus de 18 ans, bienvenue sur GOG ! Si vous avez entre 16 et +18 ans, avant de vous souhaiter également la bienvenue, nous aimerions que +vous demandiez à un de vos parents ou à votre tuteur légal de lire et +d'accepter cet Accord en votre nom (car dans certains pays, les mineurs en +dessous d'un certain âge ne peuvent pas légalement accepter d'Accord de ce +type). Si vous n'avez pas encore 16 ans, vous ne pouvez pas posséder de compte +ni utiliser les services GOG car il nous est interdit légalement de détenir +des informations relatives à un enfant sans l'accord d'un parent ou tuteur +(que nous encourageons de leur côté). + +## 2\. UTILISATION DES SERVICES GOG ET DU CONTENU GOG + +2.1 Nous vous concédons, à vous et aux autres utilisateurs de GOG, le droit +(désigné sous le nom de "licence") d'utiliser les services GOG et de +télécharger, accéder et/ou regarder en streaming (selon le contenu) et +d'utiliser le contenu GOG. La présente licence est destinée à votre usage +strictement personnel. Nous pouvons interrompre ou suspendre la présente +licence dans certaines situations expliquées plus bas. + + + +2.2 Lorsque vous achetez, accédez ou installez des jeux GOG, vous devrez +parfois accepter les conditions d'utilisation supplémentaires du développeur +ou de l'éditeur du jeu (comme le Contrat de licence utilisateur final). En cas +d'incohérences ou de contradictions entre le CLUF tiers et cet Accord, cet +Accord prévaut. + + + +2.3 En ce qui concerne les vidéos GOG, vous pouvez regarder en streaming les +contenus vidéo que vous avez acheté ou les télécharger pour les regarder à +votre convenance. + + + +2.4 L'utilisation de certains scripts réalisés par des tiers est recommandée +pour un usage complet des fonctionnalités de GOG et, bien que cet usage reste +optionnel, il nous est impossible de promettre une performance optimale du +service sans ces scripts. + + + +2.5 Un mot rapide a propos de GOG GALAXY, notre application (optionnel) qui +vous permet non seulement d'acquérir et d'accéder à du contenu GOG mais qui +offre également des services cool comme une bibliothèque de jeux unifiée et +une liste d'amis sur toutes les plateformes, de jeu multijoueur en ligne, des +succès, du chat cross-plateforme, le suivi de votre temps de jeu, des +sauvegardes dans le cloud et un overlay en jeu. Vous pouvez en apprendre plus +à ce sujet[ici](https://www.gog.com/galaxy). + + + +2.6 Dans certaines parties des services GOG, nous utilisons des systèmes de +recommandation pour vous présenter le contenu qui est le plus susceptible de +vous intéresser. Vous pouvez découvrir où nous les utilisons et comment ils +fonctionnent[ici](https://support.gog.com/hc/articles/16034228157213), y +compris les principaux paramètres que nous utilisons et comment les +influencer. + +## 3\. COMPTES GOG + +3.1 Pour acheter du contenu GOG via les services GOG, et dans certains cas +pour jouer/utiliser le contenu GOG lorsque nos partenaires requièrent +l'utilisation d’un compte GOG, vous allez devoir créer un compte GOG. Cela +nécessite la création d'un mot de passe (codé de façon à nous en restreindre +l’accès) et d'un nom d'utilisateur, et de nous communiquer votre adresse +e-mail (à des fins d'identification). Assurez-vous de conserver vos +identifiants de connexion en sécurité et de surveiller l'utilisation de votre +compte. Dans les paramètres de votre compte GOG, vous pouvez si vous le +souhaitez indiquer votre pays de résidence, votre date de naissance et votre +avatar. Notre Politique de confidentialité vous expliquera plus en détail le +type d'informations que nous collectons et la façon dont nous les utilisons et +dont nous les protégeons. Vous pouvez la +trouver[ici](https://support.gog.com/hc/articles/212632109). + + + +3.2 Vous pouvez utiliser votre compte GOG pour créer un profil public +accessible aux autres utilisateurs. Vous pouvez également utiliser votre +compte GOG pour vous connecter avec d'autres utilisateurs GOG. Nous vous +prions de vous comporter raisonnablement et de garder à l'esprit que vous êtes +responsable de vos actes. + + + +3.3 Votre compte GOG et votre contenu GOG est strictement personnel et ne peut +être partagé, vendu, offert ou transféré à quiconque. Votre utilisation et +votre accès à ce contenu sont soumis aux conditions d'utilisation de GOG qui +sont soumis à la [ Politique de confidentialité +](https://support.gog.com/hc/articles/212632109) et au [ Code de conduite +](https://support.gog.com/hc/articles/16033977811613) de GOG, qui sont mis à +jour ou modifiés en cas de nécessité. + + + +3.4 L'accès et l'utilisation des jeux achetés sur différentes plateformes +(c'est-à-dire avec ce que nous dénommons un « Accès sans Clé »), y compris la +configuration minimale requise, sont régis par les politiques respectives des +plateformes tierces et (le cas échéant) par des conditions contractuelles +supplémentaires fixées par le développeur ou l'éditeur du jeu (par exemple, il +peut vous demander d'accepter un accord de licence d'utilisateur final +spécifique au jeu). Il peut être nécessaire de disposer d'un compte sur une +plateforme tierce. Ces plateformes peuvent proposer des modifications ou des +mises à jour des jeux que vous avez achetés. + +## 4\. CONFIGURATION SYSTÈME REQUISE + +4.1 GOG vous donne accès à de nombreux jeux et services, qui n'ont pas tous +été développés au même moment, ni pour les mêmes plateformes, c'est pourquoi +nous ne pouvons pas vous donner la configuration requise pour l'ensemble des +services GOG ou du contenu GOG. + + + +4.2 Ce que nous pouvons vous dire, c'est que l'utilisation des jeux GOG +nécessite un ordinateur ainsi qu’une souris et un clavier (les contrôles +tactiles ne sont pas supportés) et le système d'exploitation approprié (merci +de vous référer à la page du produit GOG concerné) ainsi que l’installation +des packs de services et des mises à jour importantes. Tous les jeux GOG +doivent être installés en natif sur un ordinateur qui remplit les +spécifications matérielles ou logicielles indiquées (ou supérieures) sur la +page produit GOG. Les jeux GOG ne sont pas testés sur une machine virtuelle et +nous ne pouvons donc vous fournir l'infrastructure nécessaire pour y jouer +depuis le site. + + + +4.3 Pour les vidéos GOG, assurez-vous que votre lecteur vidéo lit les formats +spécifiés sur la page produit GOG. + + + +4.4 Si vous avez des questions sur la configuration requise, n'hésitez pas à +nous contacter ici. Nous tenons à préciser que vous êtes seul responsable de +votre connexion Internet, qui doit être suffisante pour télécharger les jeux +GOG achetés ou les vidéos GOG à regarder en streaming et de l'adéquation de +votre système d'exploitation aux jeux et aux vidéos GOG. + +## 5\. BETAS + +5.1 Au fur et à mesure que GOG se développe, nous pouvons vous offrir un accès +facultatif à des versions « bêta » de logiciels ou de services de GOG (par +exemple, de nouvelles versions de l'application GOG GALAXY mises à disposition +avant sa sortie générale) ou à du contenu GOG. + + + +Voici les règles: + + + +a) Nous (ou le cas échéant, tout autre éditeur/partenaire) définissons les +conditions et les prérequis pour votre accès beta. La proposition d'une beta +et sa maintenance, ainsi que le choix des joueurs qui peuvent l'utiliser +restent à notre seule discrétion. + + + +b) Il pourra vous être demandé de suivre un processus d'enregistrement ou de +remplir d'autres conditions pour accéder à la beta (et cela peut inclure et +nécessiter que vous remplissiez les conditions d'éligibilité). + + + +c) Les betas seront imitées dans le temps et peuvent donner lieu à des +prérequis et contrats supplémentaires. + + + +d) La beta peut impliquer des disparitions, réinitialisations ou corrections +temporaires ou permanentes de serveur/progression/contenu. + + + +e) La beta peut être soumise à des restrictions de confidentialité (qui seront +notifiées à l'avance le cas échéant). + + + +f) Vous pourrez parfois être invité à participer à un processus pour partager +vos impressions sur la beta. Ce processus est totalement optionnel mais votre +participation sera grandement appréciée. + + + +g) La version bêta est destinée à votre usage personnel et à votre plaisir, +vous ne devez donc pas le vendre, le prêter ou le transférer de quelque +manière que ce soit à une tierce personne. + + + +h) L'objectif de vous donner un accès beta est de vous permettre d'essayer +quelque chose de nouveau, mais nous vous demandons de reconnaître qu'elle +n'est pas encore complète. Par conséquent, les beta seront fournies "en +l'état" et ne font l'objet d'aucunes promesses additionnelles, ni d'engagement +de responsabilité de notre part si le logiciel s’avère incomplet, ou ne +fonctionne pas entièrement ou encore crée des problèmes potentiels. Les betas +peuvent ne pas contenir l'intégralité des fonctionnalités et des +fonctionnalités peuvent être changées, modifiées ou supprimées au cours de la +beta. + +## 6\. PAIEMENT ET REMBOURSEMENT DES CONTENUS GOG + +Paiement des contenus GOG + + + +6.1 Si vous décidez d'acquérir un jeu, une vidéo ou autre contenu GOG, vous +devez en général payer votre achat avant de pouvoir y accéder (bien que nous +proposions également des contenus gratuits !). Vous pouvez payer par plusieurs +méthodes de paiement : (i) en utilisant une carte de débit ou de crédit +valide; ou (ii) en utilisant PayPal ou tout autre fournisseur de paiement +autorisé. Gardez vos informations de paiement en lieu sûr. + + + +6.2 Quand vous utilisez une méthode de paiement pour acheter du contenu GOG, +nous nous appuyons sur votre promesse selon laquelle vous êtes en mesure +d'utiliser cette méthode. Vous êtes responsable de tout achat effectué en +utilisant votre compte GOG ou votre méthode de paiement et vous acceptez les +politiques relatives aux prix, au paiement et à la facturation qui leur sont +applicables, telles qu'elles vous sont communiquées au moment de l'achat. Tous +les paiements ne sont ni remboursables ni transférables, sauf dans les cas +expressément prévus par le présent accord. + + + +6.3 Vous pouvez régler vos achats de contenu GOG en dollars américains. +Cependant, si vous habitez dans un pays dont nous supportons la monnaie locale +(voir notre section Support pour plus de détails), vous pourrez payer dans +votre monnaie locale. Si vous réglez vos achats dans une monnaie différente de +celle en cours dans votre pays, vous devrez payer des frais de change auxquels +votre banque peut ajouter une commission. + + + +6.4. Tous les prix sont visibles sur la page du catalogue des produits. Ils +comprennent les taxes telles que la TVA, le cas échéant. Vous devez également +vous attendre à ce que certaines taxes sur la valeur ajoutée soient ajoutées à +votre prix lors du paiement, si la législation locale l'exige (par exemple, +aux États-Unis ou au Canada). + + + +Porte-monnaie GOG + + + +6.5 GOG offre à ses utilisateurs un solde numérique appelé le "Porte-monnaie +GOG" en relation avec votre compte d'utilisateur, que vous pouvez utiliser +pour réaliser des achats de contenu GOG sur les services GOG dédiés. Des fonds +peuvent être ajoutés de deux façons : (i) en utilisant votre méthode de +paiement choisie ; ou (ii) de notre part dans le cadre de notre "Politique de +remboursement volontaire" auquel cas nous pouvons offrir des remboursements +sur le Portefeuille GOG que vous pouvez utiliser pour obtenir un jeu GOG de +remplacement ou tout autre contenu GOG. La disponibilité du Porte-monnaie GOG +est sujette aux règles qui sont énumérées sur notre page Porte-monnaie +GOG,[ici](https://support.gog.com/hc/articles/360001941953-FAQ-GOG-Wallet). + + + +Codes bonus GOG + + + +6.6 Nous pouvons aussi vous proposer des codes bonus limités dans le temps qui +vous permettront d'accéder à des contenus GOG gratuitement ou à prix réduit +(désignés comme "Codes bonus"). Si vous recevez des codes bonus lorsque vous +achetez du contenu GOG, mais que vous décidez par la suite de retourner ce +contenu GOG, nous pensons qu'il est juste que vous retourniez également les +codes bonus. Par conséquent, nous la résilierons ou, si elle a été échangée +contre un jeu GOG, ce jeu sera supprimé de votre compte. + + + +Distribution automatique sur le compte + + + +6.7 Nous disposons d'une fonctionnalité de distribution automatique sur le +compte (désignée comme "Distribution automatique sur le compte GOG") où des +plateformes de distribution, avec qui nous sommes partenaires, pourront vous +vendre des jeux et d'autres contenus que vous pourrez choisir d'activer +automatiquement avec votre compte GOG, sans avoir besoin d'utiliser un code. +Cela signifie que l'intégralité du processus d'achat sera gérée par l'autre +plateforme. Par conséquent, en cas de problème avec le processus d’achat, +veuillez les contacter directement. Dans ce cas là, nous ne pourrons donc pas +vous offrir notre politique de remboursement volontaire (parce que GOG n'a pas +vendu le jeu/contenu). Bien entendu, tout ce qui concerne les services sur +notre plateforme reste notre responsabilité. + + + +6.8 Merci d'utiliser ce système de façon raisonnable et de ne pas en abuser +(par exemple en utilisant des VPN (Réseau privé gratuit) ou toute autre +méthode modifiant votre pays de résidence), ce ne serait pas correct. + +## 7\. REMBOURSEMENTS ET RETOURS + +## Droits de remboursement légaux + + + +7.1. Si vous êtes résident d'un pays de l'Union européenne ou d'autres pays +dont la juridiction est applicable (à l'exclusion des États-Unis), vous avez +le droit légal de vous retirer d'un achat de contenu GOG dans les 14 jours +suivant votre achat, sans donner de motif. Pour exercer le droit de +rétractation, vous devez nous informer de votre décision de rétractation du +présent contrat par une déclaration non équivoque (un courriel envoyé à +support@GOG.COM, ou une lettre physique à l'adresse indiquée à l'article 23 +ci-dessous). Vous pouvez utiliser le modèle de formulaire de rétractation +joint à la fin du présent accord, mais vous n'êtes pas obligé de le faire. +Pour que le délai de rétractation soit respecté, il suffit que vous +transmettiez votre communication relative à l‘exercice du droit de +rétractation avant l‘expiration du délai de rétractation. Toutefois, cela ne +s'applique pas lorsque vous avez expressément consenti à l'exécution du +contenu GOG (qui est un contenu numérique) dès la conclusion du processus +d'achat et que vous avez reconnu la perte de vos droits de rétractation. + + + +7.2. Ni cette section ni aucune autre de cet Accord utilisateur n'ont d'effets +sur vos droits légaux. En particulier : + +a) Pour les utilisateurs australiens : nos produits sont accompagnés de +garanties qui ne peuvent pas être exclues en vertu de la loi australienne sur +la consommation (Australian Consumer Law). Vous avez droit à un remplacement +ou à un remboursement pour une défaillance majeure et à une indemnisation pour +toute autre perte ou dommage raisonnablement prévisible. Vous avez également +le droit de faire réparer ou remplacer les marchandises si les marchandises ne +sont pas de qualité acceptable et que la défaillance ne constitue pas une +défaillance majeure; + + +b) Pour les utilisateurs néo-zélandais : ni cette clause, ni aucune autre de +cet Accord Utilisateur, ne peut exclure, limiter ou modifier l’application des +droits ne pouvant être exclus, limités ou modifiés, y compris ceux conférés +par la loi de 1993 sur les garanties à la consommation en Nouvelle-Zélande +(New Zealand Consumer Guarantees Act 1993). En vertu de cette loi, il existe +des garanties stipulant que les biens et services doivent être de qualité +acceptable. Si cette garantie n'est pas respectée, vous êtes en droit de +demander une rectification du logiciel (ce qui peut inclure sa réparation, son +remplacement ou son remboursement). Si une rectification ne peut être fournie +ou si la défaillance présente un caractère substantiel, la loi prévoit un +remboursement. + + + +Notre Politique de remboursement volontaire + + + +7.3 Nous savons que parfois un achat peut ne pas être à la hauteur de vos +espérances et nous souhaitons être justes avec nos utilisateurs. C'est +pourquoi, en plus de vos droits de remboursement légaux (décrits dans les +sections 7.1.- 7.2. ci-dessus), nous pourrions vous offrir une Politique de +remboursement volontaire +décrite[ici](https://support.gog.com/hc/articles/360006129837). Dans de rares +cas, si nous avons des doutes raisonnables concernant votre demande de +remboursement nous ne pourrions pas appliquer la politique de remboursement +volontaire. En aucun cas, cela ne vous privera des droits de remboursement +légaux applicables. Une vente est considérée comme définitive lorsque vos +droits de remboursement expirent (sauf si nous en convenons autrement au cas +par cas). + +## 8\. MONNAIE ET OBJETS VIRTUELS + +8.1 Avec certains contenus GOG, vous aurez la possibilité d’acheter ou +d’obtenir des objets virtuels et/ou de la monnaie virtuelle (nous les appelons +“Biens Virtuelsâ€). Les biens virtuels sont soumis à cet accord et en +particuliers aux règles qui vont suivre, sauf s' il existe des règles +spécifiques pour ce contenu GOG (ce qui prévaut sur ces règles). + + + +8.2 Les Biens virtuels sont des objets exclusivement numériques qui ne +disposent d'aucune valeur monétaire ou d'existence dans le monde réel. Ils ne +peuvent pas être "achetés", "vendus", donnés, transférés ou échangés, que ce +soit ou non contre d'autres Biens virtuels, de l'argent "réel", des biens, des +services ou des objets d'une valeur monétaire. Échanger des Biens virtuels est +strictement interdit (à moins que vous ne disposiez d'une permission expresse +et spécifique de le faire). Votre droit à utiliser tout type de Biens virtuels +se limite à une licence non exclusive, non assignable, non transférable, qui +ne peut être ni cédée sous une forme de sous-licence, ni révoquée, limitée +dans le cadre d'un usage strictement réservé à votre divertissement personnel +et non commercial du contenu GOG en question. Vous ne possédez aucun intérêt, +titre ou droit de propriété sur aucun des Biens virtuels, lesquels restent la +propriété de l'éditeur concerné. Les Biens virtuels sont susceptibles d’être +changés, amendés ou retournés si nécessaire, y compris pour faire appliquer +cet Accord. Si cela se révèle nécessaire, des limites peuvent être appliquées +sur l'utilisation des Biens virtuels (y compris des limites de transaction, de +solde et de quantité). + + + +8.3 L'existence d'une offre particulière de Biens virtuels ne représente pas +un engagement de notre part de maintenir ou de continuer à fournir des Biens +virtuels ni ne garantit que cette offre restera disponible dans le futur. La +quantité, la variété et le type de Biens virtuels que vous pouvez obtenir +peuvent varier et nous disposons d'un droit de gestion, de modification et de +suppression pour tous les Biens virtuels si nous considérons cela nécessaire +pour la bonne continuation des opérations sur GOG ou des contenus GOG, ou pour +toute autre raison légitime. Dans ce cas, nous ne pourrons pas être tenus +responsables envers vous ou toute autre personne pour notre exercice de ces +dits droit. Nous tâcherons dans la limite du raisonnable de vous notifier de +tout changement et d'expliquer la raison de ces changements. + +## 9\. CORRECTIONS, MISES A JOUR ET MODIFICATIONS + +9.1 Il peut arriver de façon occasionnelle que nous ayons besoin d'implémenter +des corrections ou de mettre à jour les services de GOG ou les contenus GOG +(par exemple pour ajouter ou supprimer des fonctionnalités ou résoudre des +bugs logiciels). Nous avons besoin de ces droits pour que GOG fonctionne +efficacement et en toute sécurité. Le fait de ne pas corriger ou mettre à jour +les services GOG ou le contenu GOG peut entraîner une performance inférieure +de votre version ou une incompatibilité de votre version avec certaines +fonctionnalités des services GOG ou du contenu GOG. Dans ce cas, vous risquez +également de ne pas installer des mises à jour de sécurité importantes. Nos +partenaires peuvent utiliser les services GOG pour déployer des correctifs ou +des mises à jour relatifs au contenu GOG applicable. + +## 10\. PROPRIÉTÉ DES SERVICES GOG ET DROITS DE PROPRIÉTÉ INTELLECTUELLE + +10.1 Les services GOG, y compris mais non limités à leurs graphismes, code, +interface utilisateur, aspect, son et musique, vidéos, texte, mise en page, +base de données, données et tout autre contenu, et tous les droits et droits +d'exploitation qui leur sont liés, sont notre propriété ou celle de nos +licenciés. Les contenus GOG sont la propriété de leurs développeurs/éditeurs +respectifs et distribués par GOG sous licence. Tous droits réservés sauf +précisé dans cet Accord. Vous ne pouvez utiliser ou exploiter aucun élément +des services GOG ou des contenus GOG autres que ceux précisés dans cet Accord. + + + +10.2 GOG respecte les droits de propriété intellectuelle d'autrui. Pour en +savoir plus, +cliquez[ici](https://support.gog.com/hc/articles/213224285?product=gog). + +## 11\. RÈGLES D’UTILISATION DES SERVICES GOG + +11.1 Merci de respecter les présentes règles relatives aux services et au +contenu de GOG, ainsi que toutes les règles supplémentaires que nous indiquons +dans le paragraphe 11.2 ci-dessous. Veuillez lire attentivement ces règles, +car le non-respect de celles-ci (en particulier celles relatives à la +tricherie) sera considéré comme une violation substantielle du présent accord, +ce qui pourrait entraîner la suspension ou l'annulation de votre accès aux +services de GOG. Il s'agit des règles suivantes : + +a) N'utilisez les services ou le contenu de GOG que pour vos loisirs +personnels (par exemple, ne les utilisez pas pour gagner de l'argent, pour le +piratage ou à des fins politiques). + +(b) En ce qui concerne le contenu de GOG, ce que vous pouvez faire +pratiquement en plus de jouer aux jeux (comme créer des Å“uvres dérivées) +dépend de ce que le détenteur des droits sur le contenu de GOG vous autorise à +faire (GOG ne peut pas accorder de tels droits). Veuillez donc vous adresser +directement au détenteur des droits (la première chose à faire est de vérifier +s'il existe un CLUF et, le cas échéant, ce qu'il prévoit). Nous vous +recommandons également de ne faire que des tentatives légitimes pour améliorer +le contenu de GOG. + + + +(c) En ce qui concerne les services GOG (ce qui inclue le logiciel GOG), a +moins que vous n'ayez obtenu l'autorisation préalable de GOG, merci de ne pas +les modifier, fusionner, distribuer, traduire, rétro-concevoir, décompiler, +désassembler ou en créer des oeuvres dérivées ¬ à moins que vous n'y soyez +autorisés par cet Accord ou par les lois de votre pays. Nous voudrions +insister sur le fait que vous êtes libres de nous contacter pour obtenir la +permission d'effectuer ces actions et nous nous pencherons sur ces requêtes en +toute bonne foi. Plus généralement, nous avons pour projet d'ouvrir des +protocoles clients pour faciliter l'utilisation des données et des logiciels +GOG et éviter le recours à la rétro-conception ou des techniques similaires. + + + +(d) Ne commettez pas d'action de piratage, nuisance, interruption ou +d'utilisation abusive contre les services GOG, les contenus GOG, les +utilisateurs de GOG ou le personnel de GOG, et n'utilisez pas lesdits services +avec des objectifs similaires. + + + +(e) Ne pas créer, utiliser, mettre à disposition ou distribuer des fraudes, +des exploits, des logiciels d'automatisation, des robots, des bots, des mods, +des hacks, des spiders, des spywares, des cheats, des scripts, des trainers, +des outils d'extraction ou d'autres logiciels qui interagissent avec ou +affectent les services de GOG ou le contenu GOG de quelque manière que ce soit +(y compris, sans limitation, tout programme tiers non autorisé qui intercepte, +émule ou redirige toute communication entre GOG ou ses partenaires et les +services de GOG ou tout programme tiers non autorisé qui recueille des +informations sur les services de GOG). + + + +(f) Ne pas interférer avec le logiciel du réseau de GOG ou de tiers ou avec +d'autres logiciels, notamment par l'intermédiaire d'un tunnel, d'une injection +de code, d'une modification ou d'un changement du logiciel de GOG, de +l'utilisation de tout autre logiciel similaire avec les services de GOG ou le +contenu de GOG, par l'intermédiaire d'une émulation de protocole ou par la +création ou l'utilisation de serveurs privés en ce qui concerne les services +de GOG ou le contenu de GOG. N'accédez pas ou ne tentez pas d'accéder à des +zones de GOG.COM, GOG GALAXY ou des serveurs GOG qui n'ont pas été mises à la +disposition du public. + + + +(g) Ne pas adopter un comportement ou tenir un propos qui soit ou puisse être +considéré comme raciste, xénophobe, sexiste, diffamatoire ou autrement +offensant ou illégal (par exemple, exploiter des mineurs, encourager la +violence, se livrer à la fraude). Soyez gentils les uns envers les autres, +s'il vous plaît! + + + +(h) Ne partagez pas, n'"achetez" pas, ne "vendez" pas, ne transférez pas, ne +donnez pas, ne prêtez pas, ne volez pas, ne vous appropriez pas, n'utilisez +pas de comptes GOG de manière malhonnête. Les clefs/codes GOG ne peuvent être +donnés ou transférés ou utilisés que dans le cadre limité des usages autorisés +par GOG. Si vous avez des questions ou rencontrez des problèmes, veuillez +contacter l'assistance clientèle. + + + +(i) Nous vous demandons de bien vouloir suivre et respecter toutes les +restrictions de langage, les pré-requis ou règles géographiques ou régionales, +basées sur la géolocalisation, concernant GOG. + + + +(j) Nous vous demandons de ne pas réaliser d'actions en relation avec GOG qui +transgressent tout type de droits d'auteurs, marques déposées, brevets, +secrets commerciaux, droits à la vie privée et de publicité ou tous les autres +droits appartenant à autrui, tels que des images, des photographies, des +fichiers sonores, textuels, graphiques et tout autre type de matériel ou +d'informations. + +11.2 En plus de ce qui précède, vous trouverez ci-dessous la liste des +conditions supplémentaires qui s'appliquent à vous lorsque vous utilisez les +services de GOG. Sans vouloir nous répéter, il convient de se rappeler que si +vous ne les suivez pas, il s'agira d'une violation substantielle du présent +accord, qui pourrait entraîner la suspension ou l'annulation de votre accès +aux services de GOG. Il s'agit des éléments suivants : + +â— le Code de conduite de GOG +([lien](https://support.gog.com/hc/articles/16033977811613)) + +â— la Politique en matière de contenus illicites et de droits d'auteur +([lien](https://support.gog.com/hc/articles/16033687971613)). + +11.3 Chaque fois que nous prenons une décision de modération entraînant une +restriction de votre accès aux services de GOG, vous devez recevoir, dans la +mesure du possible, un exposé des motifs expliquant pourquoi nous avons pris +cette décision. Si vous n'êtes pas d'accord avec la décision que nous avons +prise, vous disposez d'un délai de six mois à compter de la date à laquelle +vous avez été informé de la décision pour déposer une plainte. Les +informations sur la manière de déposer une plainte doivent figurer dans votre +décision de modération. La description de notre procédure de traitement des +plaintes est également disponible dans la Politique en matière de contenus +illicites et de droits +d'auteur[(ici)](https://support.gog.com/hc/articles/16033687971613). + +## 12\. CONTENU GÉNÉRÉ PAR LES UTILISATEURS + +12.1 Cette section concerne les contenus (textes, vidéos, images, captures +d’écran, fonds d’écran, photos, liens...) que vous mettez à notre disposition +ou à celle des autres utilisateurs GOG (par exemple votre photo de profil ou +les messages que vous envoyez aux autres utilisateurs GOG). Nous appelons ça +le "Contenu généré par les utilisateurs" + + + +12.2 Nous considérons que vous êtes propriétaire des contenus que vous générez +mais nous avons besoin que vous nous octroyez des droits limités à leur +encontre, pour que nous puissions les transmettre via les services GOG. Par +conséquent, en publiant du contenu généré par l'utilisateur, vous nous donnez +une licence non exclusive et irrévocable pour utiliser, modifier, reproduire, +créer des Å“uvres dérivées, distribuer, transmettre, communiquer et afficher ou +exécuter publiquement votre contenu généré par l'utilisateur en relation avec +les services de GOG. + + + +12.3 Il est de votre responsabilité de vous assurer que vous détenez tous les +droits nécessaires à l'utilisation des contenus que vous générez et que vous +pouvez légalement les utiliser. Nous ne sommes pas en mesure de le savoir et +nous n'avons aucun moyen de le vérifier, nous devons donc nous en remettre à +vous. + + + +12.4. Nous avons cependant le droit (mais pas l'obligation) de vérifier et, si +nécessaire ou légalement requis, de supprimer tout Contenu généré par les +utilisateurs qui serait à caractère illégal, délictuel, diffamatoire, obscène, +attentatoire à la vie privée d'une autre personne, menaçant, harcelant, +abusif, haineux, raciste ou pornographique, qui porterait atteinte à la vie +privée des personnes, ou qui serait de nature à menacer ou harceler des tiers. +Si vous pensez que du contenu répondant à ces critères a été posté sur les +services GOG, merci de nous le faire savoir. Nous vous invitons à lire notre +Politique en matière de contenus illicites et de droits d'auteur +([ici](https://support.gog.com/hc/articles/16033687971613)), où nous +expliquons notre procédure de signalement des contenus illicites. Si vous +estimez que votre cas n'est pas entièrement résolu après notre procédure +interne , vous avez la possibilité de recourir à un règlement extrajudiciaire +du litige. Pour en savoir plus, voir la section 20 ci-dessous . + +## 13\. COMMENTAIRES ET SUGGESTIONS + +13.1 Nous vous invitons à nous faire part de vos commentaires et suggestions +concernant les services GOG. Ils nous sont précieux. Cependant, nous tenons à +ce qu'il soit clairement établi que nous n'avons aucune obligation d'en tenir +compte ou de les accepter et qu'ils ne donnent lieu à aucune compensation +(financière ou autre) de notre part. + +## 14\. UTILISATION DU CONTENU GOG ET FAN WORK + +14.1 Pour la réalisation de fan work (c'est¬-a¬-dire de fan mods, machinima, +parodies, hommages, vidéos "Let's Play" et autres ou illustrations), vous +devez obtenir au préalable l'accord du propriétaire du contenu (le développeur +ou l'éditeur). La raison est simple : les contenus GOG appartiennent à leurs +propriétaires respectifs et non à GOG. + +## 15\. CONTENU ET SERVICES EXTERNES TIERS + +15.1 Vous pourrez trouver des liens vers des sites ou des contenus tiers au +sein des services GOG. Vous êtes libres de les utiliser ou non mais nous ne +pouvons pas vous assurer qu'ils fonctionneront, vous dire vers quoi ils +pointent ou s'ils seront gratuits. + + + +15.2 Vous pouvez également utiliser votre compte GOG pour un accès rapide a +des services de partenaires externes approuvés par GOG, par exemple, les jeux +et les sites The Witcher de notre société apparentée CD PROJEKT. Ils possèdent +leurs propres conditions d'utilisation, que vous devrez accepter et respecter. +Juste pour être clair : l'utilisation de ses services est optionnelle et +dépend de vous. Vous avez le pouvoir ! + +## 16\. GARANTIES ET LIMITATION DE LA RESPONSABILITÉ DES SERVICES GOG + +16.1 Nous garantissons que : (i) nous avons le droit de conclure cet Accord et +de vous accorder une licence d'utilisation des services GOG telle que décrite +dans la section 2.1 ; et (ii) nous apporterons un soin raisonnable aux +services GOG et à votre utilisation de ces services ; et (iii) nous ferons des +efforts raisonnables pour être en conformité avec les lois applicables dans +l'exercice de nos obligations envers vous en vertu de cet Accord. + + + +16.2. Représentation et garanties. Vous êtes en capacité de vous représenter +et garantissez que vous êtes habilité à conclure cet Accord, et que vous le +suivrez dans son intégralité. Vous garantissez également que tout Contenu +généré par les utilisateurs que vous hébergez sur les services GOG n'enfreint +pas les droits de propriété intellectuelle d'un tiers quelconque. Enfin, vous +garantissez que vous ne ferez pas usage ni contribuerez à du Contenu généré +par les utilisateurs qui serait à caractère illégal, délictuel, diffamatoire, +obscène, abusif, haineux, raciste ou pornographique, qui porterait atteinte à +la vie privée des personnes, ou qui serait de nature à menacer ou harceler des +tiers. + + + +16.3 Nous faisons de notre mieux pour que les contenus GOG fonctionnent +correctement sur vos systèmes d'exploitation mais nous avons un temps limité +pour procéder aux tests et il est possible que certaines choses nous +échappent. Par conséquent, nous ne pouvons être tenus responsables des +contenus GOG, sauf lorsque expressément stipulé par la loi (voir 71 et 7.2 ci- +dessus). Nous ne pouvons être tenus responsables d'événements relatifs aux +services ou au contenu GOG.COM en dehors de notre contrôle et nous ne +garantissons pas que les services de GOG fonctionnent à 100 % du temps. +Cependant, n'oubliez pas que vous pouvez nous retourner le contenu GOG et +obtenir un remboursement si vous rencontrez des problèmes techniques (voir +section 7.3). + +## 17\. RÉSILIATION + +17.1 Votre droit de mettre fin à l’accord. Vous pouvez annuler ou mettre fin à +cet Accord à tout moment et sans avoir à donner de raisons en cessant +définitivement d'utiliser les services GOG. Si vous souhaitez que nous +supprimions votre compte, veuillez contacter notre équipe d'assistance [ ici +](https://support.gog.com/hc/requests/new?category=info&product=gog) ou +simplement en envoyant une demande par courrier électronique à +privacy@gog.com. La résiliation n'affectera pas les droits ou obligations déjà +existants à notre égard ou au vôtre. + + + +17.2 Notre droit de mettre fin à l'accord. Si vous enfreignez +substantiellement le présent accord, nous nous réservons le droit de suspendre +ou d'annuler votre accès aux services de GOG et au contenu GOG. Par violation +substantielle de l'accord, nous entendons une violation grave qui pourrait +causer un préjudice important à GOG, aux utilisateurs de GOG, ainsi que, en +particulier, une violation des dispositions de la section 11 ci-dessus ou du +Code de conduite de GOG. Si nous suspendons ou annulons votre accès aux +services de GOG ou au contenu GOG, nous prendrons des mesures raisonnables +pour vous contacter afin de vous donner les raisons pour lesquelles nous avons +pris cette décision et la mesure que vous pouvez suivre (le cas échéant) en +conséquence. + + + +17.3 Même si cela semble peu probable, dans le cas ou nous serions dans +l'obligation de suspendre l’accès aux services et aux contenus GOG de façon +définitive (et non à cause d'une violation de votre part), nous essaierons de +vous avertir au moins soixante (60) jours à l'avance en publiant un billet sur +www.GOG.COM et en envoyant un email à tous les utilisateurs enregistrés. +Durant toute cette période, vous pourrez télécharger tous les contenus GOG que +vous avez achetés. + +## 18\. FORCE MAJEURE + +18.1 Aucune des parties ne pourra être tenue responsable en cas de manquement +aux obligations du présent Accord ou en cas d'impossibilité de fournir un +accès aux services et aux contenus GOG si cette impossibilité est causée par +un événement imprévisible indépendant de notre ou de votre volonté, y compris +mais de façon non limitative, les coupures Internet, pannes de communications, +incendies, inondations, guerre et catastrophes naturelles. + +## 19\. LOI APPLICABLE + +Pour les utilisateurs résidant dans un pays de l'Union Européenne et ailleurs +dans le monde (en dehors des États-Unis): + + + +19.1 Par la présente, nous acceptons mutuellement que l'utilisation des +services et contenus GOG et cet Accord seront régis par les lois de la Pologne +et que tout différend relatif au présent Accord relèvera de la compétence +nonexclusive des tribunaux Polonais. Pour toute action en justice relevant du +présent Accord, la partie perdante sera condamnée aux dépens. + + + +19.2. Le choix de juridiction et de loi applicable ci-dessus est sujet aux +principes de protection des consommateurs obligatoirement applicables ou à +toute autre loi de votre juridiction de résidence qui ne seraient pas +disponibles autrement. + + + +Pour les utilisateurs résidant aux États-Unis uniquement: + + + +19.3 Par la présente, nous acceptons mutuellement que l'utilisation des +services et contenus GOG et cet Accord seront régis par les lois applicables à +Los Angeles, en Californie, et que tout différend relatif au présent Accord +sera régi et interprété selon les lois de l'État de Californie, aux +États-¬Unis (et, si applicable, selon les lois fédérales américaines). Toute +action en justice entamée par vous contre GOG le sera exclusivement devant un +tribunal d'État ou fédéral de Los Angeles, en Californie, réputé compétent +pour juger notre litige et en conséquence, par la présente, nous reconnaissons +mutuellement la compétence exclusive de ces tribunaux. Pour toute action en +justice relevant du présent Accord, la partie perdante sera condamnée aux +dépens. + +## 20\. ASSISTANCE CLIENTELE ET RÉSOLUTION DES CONFLITS + +20.1 Si vous deviez rencontrer le moindre souci, ou si vous deviez avoir des +réclamations ou des plaintes, nous espérons pouvoir les résoudre rapidement et +à l'amiable, contactez- +nous[ici](https://support.gog.com/hc/requests/new?category=info). Nous +tâcherons de résoudre tout litige de manière informelle, raisonnablement et de +bonne foi. Nous nous efforçons de répondre à la moindre requête sous 14 jours. + + + +20.2 0.2. Si le problème n'est pas résolu pendant cette période, les étapes +suivantes dépendent de votre lieu de résidence. Si vous résidez dans un pays +de l'UE, vous pouvez soumettre vos réclamations juridiques à la plateforme de +résolution des litiges en ligne gérée et fournie par la Commission européenne, +accessible via http://ec.europa.eu/consumers/odr/, afin de parvenir à un +règlement à l'amiable ou d'engager une action en justice. Vous pouvez +également choisir de résoudre votre litige par l'intermédiaire d'un organisme +de règlement extrajudiciaire des litiges certifié par le coordinateur des +services numériques de votre pays. + + + +20.3. Si vous vivez aux États-Unis d'Amérique ou dans le reste du monde (hors +UE), veuillez nous contacter a legal@GOG.COM. + +## 21\. AUTRES CLAUSES LÉGALES + +21.1 Dans l'éventualité ou l'une des dispositions du présent Accord serait +invalidée ou non exécutoire, cela n'aura aucun effet sur la validité ou le +caractère exécutoire des autres dispositions. + + + +21.2 Le présent accord (y compris les conditions supplémentaires de GOG +auxquelles il fait référence) constitue l'intégralité de l'accord entre vous +et nous et remplace tout accord oral ou écrit antérieur. En cas de désaccord, +veuillez nous contacter dès que possible après avoir commencé à utiliser les +services de GOG à l'adresse legal@gog.com, faute de quoi vous serez lié par +cette disposition après un délai raisonnable (généralement de 30 jours).. + + + +21.3 Cet Accord gouverne nos relations mutuelles. Il ne donne de droits à +personne d'autre. + + + +21.4 Veuillez noter que nous sommes soumis à diverses lois et que nous sommes +contraints de nous conformer aux demandes des autorités judiciaires et autres +processus judiciaires. + + + +21.5 Si nous devions procéder à une réorganisation, une vente ou une fusion de +GOG, alors nous pourrions être amenés à travailler avec des tiers pour +transférer ou fusionner votre compte GOG. + + + +21.6 Par la présente, nous acceptons mutuellement que la Convention des +Nations Unies sur les contrats de vente ne s'applique pas sur cet Accord. + + + +21.7 Nous pouvons assigner, sous-traiter ou transférer cet Accord a une partie +tierce ou à un autre membre de notre groupe si nécessaire, pour le support de +GOG ; dans l'éventualité d'une réorganisation ou d'une fusion, ou pour toute +autre raison commerciale. Vous en serez notifié le cas échéant. + + + +21.8 Si vous êtes un citoyen de l'Union européenne, veuillez noter que GOG a +permis la portabilité transfrontalière du contenu gratuit et payant +conformément au règlement (UE) 2017/1128 du Parlement européen et du Conseil +du 14 juin 2017 relatif à la portabilité transfrontalière des services de +contenu en ligne dans le marché intérieur, mais cela est soumis à toute autre +exigence légale concernant GOG, y compris la protection de la propriété +intellectuelle, et peut également être soumis aux exigences des développeurs +et des éditeurs partenaires de GOG. + +## 22\. MODIFICATIONS DU PRÉSENT ACCORD + +22.1 Nous nous réservons le droit de modifier cet Accord si nécessaire, +notamment pour des raisons légales ou d'adéquation avec les modifications +survenues dans les services GOG. Dans cette éventualité, la version modifiée +du présent Accord sera disponible en ligne à l'adresse +https://support.gog.com/hc/articles/212632089 et (si vous avez un compte GOG) +ces changements vous seront notifiés par e-mail. + + + +22.2 Tout changement à cet Accord entrera en vigueur 30 jours après sa mise en +ligne. Entre-temps, vous êtes invité à nous contacter à l'adresse +legal@GOG.COM pour toute question propre à ces modifications. + + + +22.3 Si vous refusez d'accepter ces modifications (en le signalant par e-mail +ou non), nous serons dans l'obligation de vous demander de cesser d'utiliser +les services GOG. Nous en sommes navrés, mais nous espérons que vous +comprendrez que pour le bon fonctionnement des services GOG, il est nécessaire +que les utilisateurs soient tous soumis aux mêmes règles. C'est pourquoi nous +vous encourageons à nous contacter pour toute question ou préoccupation. + + + +22.4 Rassurez-vous, il n'est pas question de modifier drastiquement cet Accord +sans vous informer de la teneur des modifications ou de vous forcer à accepter +des modifications que vous ne comprenez pas avant de pouvoir utiliser GOG! + +## 23\. NOS INFORMATIONS DE CONTACT + +23.1. Si vous avez une plainte concernant le compte GOG, les services GOG, ou +si vous souhaitez simplement nous contacter, utilisez les coordonnées +suivantes : + +Nom : GOG sp. z o.o. + +Siège social : Ul. JagielloÅ„ska 74, 03-301 Varsovie, Pologne + +Enregistré au tribunal de district de Varsovie, 14e division commerciale du +registre national des tribunaux. + +Numéro d'enregistrement 0000029514 + +Numéro d'identification fiscale ID TVA (NIP) PL 113-21-77-807 + +Capital social : 135 750 PLN + +Point de contact unique pour les autorités : + +Équipe juridique de GOG + +legal@gog.com + +Langues dans lesquelles nous communiquons : anglais, polonais + +Point de contact unique pour les bénéficiaires des services de GOG : + +Équipe d'assistance de GOG + +support@gog.com + +Nous parlons principalement l'anglais et le polonais, mais nous ferons de +notre mieux pour vous assister dans toutes les langues dans lesquelles GOG est +disponible. + +Date de la dernière mise à jour : 17 février 2024 + +La version précédente de l'accord sur les conditions d'utilisation est +disponible[ici](https://support.gog.com/hc/articles/360010039713). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/serpentisle/tmp/EULA_pl-PL.txt b/info.exult.exult/data/serpentisle/tmp/EULA_pl-PL.txt new file mode 100644 index 0000000..55ee2cd --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/EULA_pl-PL.txt @@ -0,0 +1,1646 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM Umowa Użytkownika + +## 1\. O NINIEJSZEJ UMOWIE + +1.1. Niniejszy dokument stanowi umowÄ™ pomiÄ™dzy TobÄ… (dalej: “Tyâ€, “Ciebieâ€, +“Tobie†itp.) a GOG sp. z o.o., ul. JagielloÅ„ska 74, 03-301 Warszawa (dalej: +„GOGâ€) i dotyczy portalu www.GOG.COM, konta użytkownika GOG, Aplikacji GOG +GALAXY (w tym sklepu GOG GALAXY), wszystkich gier, filmów i innych treÅ›ci oraz +usÅ‚ug, jakie możesz zakupić lub wykorzystywać za poÅ›rednictwem GOG.COM, forów +GOG, wsparcia klienta i wsparcia technicznego GOG oraz innych usÅ‚ug, które +Å›wiadczymy naszym użytkownikom (łącznie zwanych w skrócie „UsÅ‚ugami GOGâ€). +Tutaj wskazujemy Twoje prawa i obowiÄ…zki jako odbiorcy UsÅ‚ug GOG. + + + +1.2 Ponadto, do UsÅ‚ug GOG mogÄ… mieć zastosowanie dodatkowe warunki, które mogÄ… +zostać przedstawione do twojej akceptacji. JeÅ›li na przykÅ‚ad bÄ™dziesz chciaÅ‚ +korzystać z Aplikacji GOG GALAXY, przedstawimy Ci odpowiednie warunki do +akceptacji, zanim zaczniesz korzystać z aplikacji lub grać w GWINTA. + + + +1.3. Skoro już mówimy o grach, wszystkie treÅ›ci w grach, przedmioty i waluty +wirtualne, filmy GOG i inne treÅ›ci oraz usÅ‚ugi, jakie możesz zakupić lub +wykorzystywać w ramach UsÅ‚ug GOG, bÄ™dziemy dalej nazywać odpowiednio „grami +GOGâ€, „filmami GOG†lub też wszystkie łącznie „treÅ›ciami GOGâ€. + + + +1.4 Nie chcieliÅ›my, żeby ten dokument byÅ‚ zbyt dÅ‚ugi, ale pamiÄ™taj, że +akceptujÄ…c tÄ™ UmowÄ™, akceptujesz również: + + * naszÄ… [ PolitykÄ™ PrywatnoÅ›ci ](https://support.gog.com/hc/articles/212632109) \- która wyjaÅ›nia jakie dane zbieramy od Ciebie i w jaki sposób je chronimy, + + * [ Zasady PostÄ™powania na GOG ](https://support.gog.com/hc/articles/16033977811613) które zawierajÄ… zbiór zasad, które musisz przestrzegać jako czÅ‚onek naszej spoÅ‚ecznoÅ›ci, oraz tÅ‚umaczÄ…ce, co jest (nie)dozwolone na GOG i jak moderujemy treÅ›ci opublikowane na GOG, + + * [ PolitykÄ™ treÅ›ci naruszajÄ…cych i dot. praw autorskich ](https://support.gog.com/hc/articles/16033687971613) która tÅ‚umaczy jak możesz zgÅ‚aszać treÅ›ci naruszajÄ…ce prawo i zasady GOG i co siÄ™ wydarzy po Twoim zgÅ‚oszeniu. + + + +1.5. GOG współpracuje z zaufanymi partnerami, w tym spółkÄ… powiÄ…zanÄ… CD +PROJEKT S.A., deweloperami i wydawcami, dostawcami metod pÅ‚atnoÅ›ci, +oprogramowania do obsÅ‚ugi klienta i innymi podmiotami („Partnerzyâ€). WiÄ™cej +informacji na ich temat znajdziesz siÄ™ w dalszej części tej Umowy. + + + +1.6. Jeżeli masz ukoÅ„czone 18 lat, zapraszamy! Jeżeli jesteÅ› pomiÄ™dzy 16 a 18 +rokiem życia, poproÅ› swojego rodzica lub opiekuna o przeczytanie i +zaakceptowanie tej Umowy w Twoim imieniu, zanim bÄ™dziemy mogli równie ciepÅ‚o +CiÄ™ przywitać (w niektórych krajach osoby poniżej okreÅ›lonego wieku nie mogÄ… +zawierać wiążących prawnie umów takich jak nasza). JeÅ›li nie masz 16 lat, nie +możesz posiadać konta GOG i korzystać z usÅ‚ug GOG ze wzglÄ™du na fakt, że +zgodnie z obowiÄ…zujÄ…cym prawem nie możemy przetwarzać danych osobowych dzieci +bez szczególnego pozwolenia ich rodzica lub opiekuna (oczywiÅ›cie nie ma +przeszkód, by sami rodzice/opiekunowie stworzyli konto GOG). + +2\. KORZYSTANIE Z USÅUG GOG I TREÅšCI GOG + +2.1. Udzielamy Ci osobistego prawa (zwanego „licencjÄ…â€) do korzystania z usÅ‚ug +GOG oraz pobierania, dostÄ™pu lub streamowania oraz korzystania z treÅ›ci GOG. +Licencja ta przeznaczona jest do Twojego użytku osobistego. LicencjÄ™ tÄ™ możemy +zawiesić lub anulować w okreÅ›lonych sytuacjach, wyjaÅ›nionych poniżej. + + + +2.2. Gdy kupujesz, otrzymujesz dostÄ™p lub instalujesz gry GOG możesz zostać +poproszony o akceptacjÄ™ dodatkowych warunków umowy z deweloperem/wydawcÄ… gry +(np. akceptacji umowy EULA dotyczÄ…cej konkretnej gry). W przypadku +rozbieżnoÅ›ci pomiÄ™dzy takÄ… umowÄ… EULA a niniejszÄ… UmowÄ…, niniejsza Umowa jest +nadrzÄ™dna. + + + +2.3 W przypadku filmów GOG, możesz streamować zakupione treÅ›ci wideo lub +pobrać je i oglÄ…dać w wybrany przez siebie sposób. + + + +2.4 Aby zapewnić peÅ‚nÄ… funkcjonalność GOG.COM, zalecamy korzystanie ze +skryptów zewnÄ™trznych. Ich wykorzystanie jest opcjonalne, ale bez nich nie +możemy obiecać peÅ‚nej funkcjonalnoÅ›ci. + + + +2.5 Kilka słów o Aplikacji GOG GALAXY, która jest naszÄ… opcjonalnÄ… usÅ‚ugÄ… +sieciowÄ…, która umożliwia kupowanie i korzystanie z treÅ›ci GOG, a także +oferuje dodatkowe funkcjonalnoÅ›ci jak połączenie list gier z różnych platform +w jednej bibliotece oraz list znajomych z różnych platform w jednej Aplikacji. +GOG GALAXY to także wsparcie dla różnego rodzaju sieciowych elementów gier, +takich jak multiplayer, Å›ledzenie osiÄ…gnięć dla różnych platform, czat, +Å›ledzenie czasu gry, zapisy w chmurze oraz overlay. WiÄ™cej informacji na ten +temat znajdziesz[tutaj](https://www.gog.com/galaxy). + + + +2.6. W niektórych częściach usÅ‚ug GOG, korzystamy z systemów rekomendacji aby +pokazać Ci treÅ›ci, które najprawdopodobniej CiÄ™ zainteresujÄ…. Możesz +dowiedzieć siÄ™ gdzie z nich korzystamy i jak +dziaÅ‚ajÄ…[tutaj](https://support.gog.com/hc/articles/16034228157213), w tym z +jakich głównych parametrów korzystamy i jak możesz na nie wpÅ‚ywać. + + + + + +## 3\. KONTO GOG + +3.1. Aby kupować treÅ›ci w ramach UsÅ‚ug GOG, musisz posiadać konto GOG. W +niektórych przypadkach, nasi partnerzy również wymagajÄ… tego konta do +grania/korzystania z treÅ›ci GOG. Stworzenie konta GOG wymaga utworzenia hasÅ‚a +(które jest zaszyfrowane, wiÄ™c nie mamy do niego dostÄ™pu) oraz nazwy +użytkownika, a także podania nam adresu e-mail (do celów identyfikacyjnych). +Upewnij siÄ™, że dane do logowania przechowujesz w bezpiecznym miejscu i +prawidÅ‚owo korzystasz ze swojego konta GOG. W ustawieniach konta GOG możesz +również opcjonalnie dodać swój kraj zamieszkania, datÄ™ urodzenia i avatar. +Nasza Polityka prywatnoÅ›ci zawiera wiÄ™cej szczegółów na temat informacji, +które gromadzimy, sposobu w jaki je wykorzystujemy oraz chronimy. Możesz +znaleźć jÄ… tu: [ Polityka PrywatnoÅ›ci. +](https://support.gog.com/hc/pl/articles/212632109-Privacy-Policy?product=gog) + + + +3.2 Na swoim koncie GOG możesz ustawić profil publiczny dostÄ™pny dla innych +osób, a także połączyć siÄ™ z innymi użytkownikami GOG. PostÄ™puj rozsÄ…dnie i +pamiÄ™taj, że odpowiadasz za swoje dziaÅ‚ania. + + + +3.3 Twoje konto GOG oraz treÅ›ci GOG sÄ… przypisane do Ciebie i nie możesz +dzielić siÄ™, sprzedać, przekazać ani podarować ich innej osobie. DostÄ™p i +korzystanie z nich podlega naszej [ Polityce PrywatnoÅ›ci +](https://support.gog.com/hc/articles/212632109?product=gog) i[Zasadom +PostÄ™powania na GOG](https://support.gog.com/hc/articles/16033977811613), wraz +z ewentualnymi zmianami gdy to konieczne. + + + +3.4. DostÄ™p i korzystanie z gier kupionych z innych platform (tj. Bezkluczowo, +okreÅ›lanych jako Keyless Access), włączajÄ…c w to minimalne wymagania +systemowe, podlega politykom odpowiadajÄ…cych platform i (jeÅ›li ma +zastosowanie) dodatkowym warunkom umowy z twórcÄ…/wydawcÄ… gry, którzy mogÄ… CiÄ™ +poprosić o podpisanie dodatkowej umowy licencyjnej użytkownika. By mieć dostÄ™p +do zakupionych w ten sposób treÅ›ci, może być wymagane posiadanie konta na +danej platformie. Również od danej platformy mogÄ… w takim przypadku zależeć +aktualizacje i Å‚atki do poszczególnych gier. + +## 4\. WYMAGANIA SYSTEMOWE + +4.1. GOG.COM umożliwia Ci dostÄ™p do wielu różnych treÅ›ci, usÅ‚ug gier +tworzonych w różnych okresach i na różne platformy sprzÄ™towe, dlatego nie +możemy podać Ci jednego zestawu wymagaÅ„ systemowych dla wszystkich usÅ‚ug GOG +lub treÅ›ci GOG. + + + +4.2. Możemy Ci jednak powiedzieć, że korzystanie z jakichkolwiek gier GOG +bÄ™dzie wymagaÅ‚o posiadania komputera wyposażonego w myszkÄ™ i klawiaturÄ™ (brak +wsparcia dla ekranów dotykowych) oraz odpowiedniego systemu operacyjnego +(zajrzyj na odpowiedniÄ… stronÄ™ produktu GOG) wraz z zainstalowanymi service +packami i ważnymi aktualizacjami. Wszystkie gry GOG powinny być natywnie +zainstalowane na komputerze speÅ‚niajÄ…cym co najmniej minimalne wymagania +dotyczÄ…ce sprzÄ™tu i oprogramowania podane na stronie produktu GOG. Gry GOG nie +sÄ… testowane na oprogramowaniu urzÄ…dzeÅ„ wirtualnych, dlatego nie wspieramy tej +formy rozgrywki. + + + +4.3 W przypadku filmów GOG, upewnij siÄ™, że Twój odtwarzacz plików wideo +obsÅ‚uguje format podany na stronie produktu GOG. + + + +4.4 W przypadku pytaÅ„ dotyczÄ…cych wymagaÅ„ systemowych, skontaktuj siÄ™ z nami +pod tym[adresem](https://support.gog.com/hc/requests/new?category=info). W +ramach wyjaÅ›nienia, po Twojej stronie jest zapewnienie, że posiadasz +odpowiedni dostÄ™p do Internetu, aby pobrać zakupione gry GOG lub filmy GOG lub +też streamować filmy GOG, a także, że Twój system umożliwia grÄ™ w gry GOG i +oglÄ…danie filmów GOG. + +## 5\. WERSJE BETA + +5.1 W ramach rozwoju GOG możemy oferować opcjonalny dostÄ™p do wersji beta +oprogramowania lub usÅ‚ug GOG (np. nowe wersje Aplikacji GOG GALAXY dostÄ™pne +przed ich oficjalnym wydaniem) lub treÅ›ci GOG. + + + +Poniżej przedstawiamy zasady: + + + +a) GOG (lub odpowiedni wydawca/partner) okreÅ›la wymagania i warunki dostÄ™pu do +wersji beta. Zapewnienie dostÄ™pu i utrzymanie takiej wersji oraz decyzja o +tym, kto może z niej korzystać należy wyłącznie do nas. + +b) Możesz podlegać dodatkowej rejestracji lub speÅ‚nić dodatkowe wymagania, aby +uzyskać dostÄ™p do wersji beta (co może obejmować kryteria kwalifikacji). + +c) Wersje beta sÄ… ograniczone czasowo i mogÄ… obejmować dodatkowe wymagania +umowne. + +d) Wersje beta mogÄ… wiÄ…zać siÄ™ z czasowym lub trwaÅ‚ym usuniÄ™ciem, resetem lub +zmianÄ… postÄ™pów, treÅ›ci czy zawartoÅ›ci serwerów. + +e) Wersja beta może podlegać zobowiÄ…zaniu do zachowania poufnoÅ›ci (w takim +przypadku zostaniesz o tym wczeÅ›niej powiadomiony). + +f) Możesz zostać poproszony o wyrażenie opinii na temat wersji beta - +odpowiedź nie jest obowiÄ…zkowa, ale bÄ™dzie dla nas bardzo cenna. + +g) Wersja beta przeznaczona jest do Twojego osobistego użytku i zabawy, +dlatego nie możesz jej sprzedać, pożyczyć ani przenieść na innÄ… osobÄ™. + +h) IstotÄ… dostÄ™pu do wersji beta jest możliwość spróbowania czegoÅ› nowego, +lecz musisz pamiÄ™tać, że taka wersja nie jest jeszcze kompletna. Dlatego też, +wersje beta dostarczane sÄ… w stanie, w jakim sÄ… („as isâ€), bez dodatkowych +gwarancji ani odpowiedzialnoÅ›ci po naszej stronie za nieprawidÅ‚owe +funkcjonowanie lub błędy. Wersje beta mogÄ… być niepeÅ‚ne i podlegać zmianom, +modyfikacjom lub korektom. + + + +Możemy oferować dostÄ™p do treÅ›ci GOG w wersji beta/przedpremierowej. Na +przykÅ‚ad, wydawca/partner może wydać grÄ™ lub jej część w formie wersji beta +lub może dołączyć do naszego programu „Early Access†(patrz punkt 8.6 - 8.8 +poniżej). Takie treÅ›ci GOG podlegajÄ… niniejszym zasadom, chyba że odpowiedni +wydawca przedstawi swoje wÅ‚asne zasady (które bÄ™dÄ… wówczas nadrzÄ™dne dla +niniejszej Umowy). + +## 6\. PÅATNOÅšCI ZA TREÅšCI GOG I OTRZYMANIE ZWROTU + +PÅ‚atnoÅ›ci za treÅ›ci GOG + + + +6.1 Jeżeli spodoba Ci siÄ™ gra GOG, film GOG lub inne treÅ›ci GOG, zazwyczaj +musisz zapÅ‚acić za nie przed uzyskaniem dostÄ™pu (ale oferujemy również treÅ›ci +darmowe!). Możesz zapÅ‚acić na różne sposoby: (i) przy użyciu ważnej karty +debetowej lub kredytowej, (ii) przy użyciu PayPal lub innego autoryzowanego +operatora pÅ‚atnoÅ›ci. Dane dotyczÄ…ce pÅ‚atnoÅ›ci przechowuj zawsze w bezpieczny +sposób. + + + +6.2 Kiedy wykorzystujesz okreÅ›lonÄ… formÄ™ pÅ‚atnoÅ›ci do zakupu treÅ›ci GOG, +polegamy na Twoim oÅ›wiadczeniu, że możesz używać takiej metody. Odpowiadasz za +wszystkie zakupy wykonane przy użyciu Twojego konta GOG lub metody pÅ‚atnoÅ›ci, +a także zgadzasz siÄ™ na politykÄ™ cenowÄ…, pÅ‚atnoÅ›ci i rozliczeniowÄ… podanÄ… w +momencie zakupu. Wszystkie pÅ‚atnoÅ›ci sÄ… bezzwrotne i nieprzenoszalne, chyba że +niniejsza Umowa mówi inaczej. + + + +6.3 Za treÅ›ci GOG możesz zawsze zapÅ‚acić w dolarach amerykaÅ„skich. Jeżeli +mieszkasz w kraju, którego waluta lokalna jest przez nas obsÅ‚ugiwana +(szczegóły na ten temat +znajdziesz[tutaj](https://support.gog.com/hc/articles/360001947034)), możesz +zapÅ‚acić również w swojej walucie lokalnej. Jeżeli nie pÅ‚acisz w swojej +walucie lokalnej, możesz ponieść koszty wymiany walut, a także opÅ‚atÄ™ +transakcyjnÄ… stosowanÄ… przez niektóre banki. + + + +6.4 Wszystkie ceny podane sÄ… na stronie katalogu produktów. Ceny zawierajÄ… +podatek od towarów i usÅ‚ug/VAT, jeÅ›li majÄ… zastosowanie. Możesz także +spodziewać siÄ™, że do ceny w koszyku zostanÄ… doliczone podatki od +sprzedaży/VAT, jeÅ›li wymagajÄ… tego lokalne przepisy (np. w USA lub Kanadzie). + + + +Portfel GOG + + + +6.5 GOG oferuje użytkownikom wirtualne konto zwane „Portfelem GOGâ€, powiÄ…zane +z kontem GOG, którego można używać do kupowania treÅ›ci GOG w dedykowanych +usÅ‚ugach GOG. Åšrodki do Portfela GOG można dodawać na dwa sposoby: (i) przy +użyciu wybranej metody pÅ‚atnoÅ›ci lub (ii) przez nas w ramach „Dobrowolnej +Polityki Zwrotów†+(wiÄ™cej[tutaj](https://support.gog.com/hc/articles/360006129837)) \- uzyskane +w ten sposób Å›rodki Portfela GOG możesz wykorzystać, by kupić innÄ… grÄ™ lub +treÅ›ci dostÄ™pne w sklepie GOG. DostÄ™p do Portfela GOG podlega zasadom +dostÄ™pnym[tutaj](https://support.gog.com/hc/pl/articles/360001941953-FAQ- +Portfel-GOG?product=galaxy). + + + +Kody Promocyjne GOG + + + +6.6. Możemy również wydawać zwykle czasowe kody promocyjne, które zapewniajÄ… +darmowy dostÄ™p lub niższÄ… cenÄ™ za treÅ›ci GOG (nazywamy je „Kodami +Promocyjnymiâ€). Jeżeli otrzymasz Kody Promocyjne podczas kupowania treÅ›ci GOG, +a później zdecydujesz siÄ™ zwrócić taki zakup, uważamy, że najuczciwiej bÄ™dzie, +gdy zwrócisz również otrzymane Kody Promocyjne. Dlatego też Kody Promocyjne, +zostanÄ… wygaszone, a jeżeli zostaÅ‚y wydane na grÄ™ GOG, zostanie ona usuniÄ™ta z +Twojego konta. + + + +BezpoÅ›rednio na konto + + + +6.7. Posiadamy funkcjonalność bezpoÅ›redniej dystrybucji na konto użytkownika +(jej nazwa to „GOG Direct to Accountâ€), która pozwala naszym partnerskim +platformom dystrybucyjnym na sprzedaż gier oraz innych treÅ›ci w taki sposób, +że przy zakupie możesz wybrać, by gra lub inna treść zostaÅ‚y automatycznie +aktywowane na Twoim koncie GOG bez potrzeby wykorzystywania kodów. Dla +jasnoÅ›ci – caÅ‚y proces sprzedaży prowadzony jest przez zewnÄ™trznÄ… platformÄ™, +wiÄ™c w przypadku jakichkolwiek problemów z zakupem zgÅ‚oÅ› siÄ™ bezpoÅ›rednio do +dziaÅ‚u odpowiedzialnego za obsÅ‚ugÄ™ klientów tej platformy. W sekcji niżej pt. +„Zwroty†znajdziesz wiÄ™cej informacji na ten temat. W tej konkretnej sytuacji +nie możemy zaproponować Ci zwrotu w ramach naszej Dobrowolnej Polityki +Zwrotów, ponieważ w tym przypadku to nie GOG jest sprzedawcÄ… treÅ›ci). +OczywiÅ›cie nadal jesteÅ›my odpowiedzialni za wszystko,co dotyczy bezpoÅ›rednio +usÅ‚ug naszej platformy. + +## 7\. ZWROTY + +Ustawowe prawo odstÄ…pienia od umowy + + + +7.1 Jeżeli jesteÅ› obywatelem Unii Europejskiej, przysÅ‚uguje Ci ustawowe prawo +odstÄ…pienia od umowy zakupu treÅ›ci GOG (treÅ›ci cyfrowe) w ciÄ…gu 14 dni od daty +zakupu, bez podawania przyczyny. Aby skorzystać z prawa do odstÄ…pienia od +umowy, powinieneÅ› poinformować nas o swojej decyzji o odstÄ…pieniu od +niniejszej umowy w drodze jednoznacznego oÅ›wiadczenia (wiadomość e-mail +wysÅ‚ana na adres support@GOG.COM lub fizyczne pismo wysÅ‚ane na adres wskazany +w punkcie 23 poniżej). Możesz skorzystać ze wzoru formularza odstÄ…pienia od +umowy załączonego na koÅ„cu niniejszej Umowy, ale nie musisz tego robić. Aby +dotrzymać terminu odstÄ…pienia od umowy, wystarczy wysÅ‚ać wiadomość dotyczÄ…cÄ… +wykonania prawa do odstÄ…pienia od umowy przed upÅ‚ywem terminu do odstÄ…pienia +od umowy.To uprawnienie nie przysÅ‚uguje Ci jednak jeÅ›li rozpoczÄ…Å‚eÅ› już +wykonanie umowy oraz wyraźnie zgodziÅ‚eÅ› siÄ™ na rozpoczÄ™cie Å›wiadczenia czyli +udostÄ™pnienie Ci treÅ›ci GOG natychmiast po zakoÅ„czeniu procesu zakupu i +zostaÅ‚eÅ› poinformowany przez nas o utracie prawa odstÄ…pienia od umowy. + + + +7.2 Mamy obowiÄ…zek poinformować CiÄ™ również o sposobie korzystania z prawa +odstÄ…pienia, co wÅ‚aÅ›nie czynimy. Aby skorzystać z ustawowego prawa zwrotu, +musisz powiadomić nas o swojej decyzji za pomocÄ… e-maila lub listu wysÅ‚anego +na adres GOG podany poniżej w punkcie 23.1. W przypadku skutecznego +odstÄ…pienia, zwrócimy Ci caÅ‚ość kwoty otrzymanej za zakupione treÅ›ci bez +nieuzasadnionego opóźnienia i nie później niż w ciÄ…gu 14 dni od daty +otrzymania powiadomienia o odstÄ…pieniu. Do zwrotu wykorzystujemy metodÄ™ +pÅ‚atnoÅ›ci, która zostaÅ‚a przez Ciebie wykorzystana do zrealizowania +transakcji, chyba że wyrazisz zgodÄ™ na innÄ… metodÄ™ zwrotu. Nie ponosisz +żadnych opÅ‚at zwiÄ…zanych z takim zwrotem. Wszystkie treÅ›ci podlegajÄ…ce +zwrotowi przestanÄ… być dostÄ™pne na Twoim koncie GOG. + + + +Å»adne z postanowieÅ„ tej Umowy (w tym powyższe) nie naruszajÄ… Twoich ustawowych +praw. W szczególnoÅ›ci: + + + +a) Dla użytkowników z Australii: treÅ›ci GOG objÄ™te sÄ… gwarancjÄ…, która nie +może zostać wyłączona zgodnie z prawem konsumenckim Australii. Masz prawo +żądać wymiany lub zwrotu pieniÄ™dzy za poważnÄ… wadÄ™ oraz rekompensaty za +wszelkie inne możliwe do przewidzenia straty lub szkody. Masz również prawo do +naprawy lub wymiany treÅ›ci, jeÅ›li ich jakość nie jest zadowalajÄ…ca a wady nie +sÄ… poważnymi wadami; + +b) Dla użytkowników Nowej Zelandii: ani ta, ani jakakolwiek inna część +niniejszej Umowy nie wyklucza, nie ogranicza ani nie modyfikuje stosowania +jakichkolwiek praw lub Å›rodków zaradczych, które nie mogÄ… być wykluczone +ograniczone lub zmodyfikowane w szczególnoÅ›ci tych zawartych w ustawie o +gwarancjach konsumenckich w Nowej Zelandii z 1993 roku. Na podstawie tej +ustawy towary i usÅ‚ugi objÄ™te sÄ… gwarancjÄ… zgodnie z którÄ… majÄ… mieć +akceptowalnÄ… jakość. JeÅ›li ta gwarancja nie zostanie speÅ‚niona, bÄ™dziesz miaÅ‚ +prawo uzyskania Å›rodków zaradczych takich, jak naprawa oprogramowania, wymiana +lub zwrot pieniÄ™dzy. Jeżeli nie można zapewnić Å›rodka zaradczego lub istnieje +poważna wada ustawa ta zapewnia Ci możliwość uzyskania zwrotu pieniÄ™dzy. + + + +Nasza Dobrowolna Polityka Zwrotów + + + +7.3. Rozumiemy, że czasem dokonany zakup nie speÅ‚nia oczekiwaÅ„ i chcemy być +fair w stosunku do użytkowników GOG, dlatego niezależnie od prawa do zwrotów +(opisanego w ustÄ™pach 7.1-7.2 powyżej), możemy zaoferować Ci naszÄ… DobrowolnÄ… +PolitykÄ™ Zwrotów, opisanÄ… +szczegółowo[tutaj](https://support.gog.com/hc/pl/articles/360006129837). W +niektórych przypadkach, jeÅ›li mamy uzasadnione wÄ…tpliwoÅ›ci dotyczÄ…ce Twojego +wniosku o zwrot zakupionego produktu, Dobrowolna Polityka Zwrotów może nie +zostać wziÄ™ta od uwagÄ™. W żadnym wypadku nie pozbawi ciÄ™ to jednak żadnych +obowiÄ…zujÄ…cych ustawowo praw do zwrotu pieniÄ™dzy. Zakup zostaje uznany za +sfinalizowany w momencie wygaÅ›niÄ™cia Twojego prawa do zwrotu (chyba że podlega +innym, odrÄ™bnym ustaleniom, w zależnoÅ›ci od przypadku). + +## 8\. WALUTA WIRTUALNA I PRZEDMIOTY WIRTUALNE + +8.1 Wraz z niektórymi treÅ›ciami GOG można kupić lub uzyskać wirtualne +przedmioty i/lub wirtualnÄ… walutÄ™ (razem zwane „Towarami Wirtualnymiâ€). Towary +Wirtualne podlegajÄ… postanowieniom niniejszej Umowy, w szczególnoÅ›ci poniższym +ogólnym zasadom, chyba że dla takich treÅ›ci GOG obowiÄ…zujÄ… osobne szczególne +zasady (które sÄ… w takim przypadku nadrzÄ™dne). + + + +8.2 Wirtualne Towary sÄ… treÅ›ciami cyfrowymi nieposiadajÄ…cymi wartoÅ›ci +pieniężnej i nieistniejÄ…ce w rzeczywistym Å›wiecie. Nie można ich kupić, +sprzedać, podarować, przekazać, zamienić na inne Towary Wirtualne, ani też na +prawdziwe pieniÄ…dze, towary, usÅ‚ugi lub przedmioty posiadajÄ…ce wartość +pieniężnÄ…. Handel Towarami Wirtualnymi jest zabroniony (chyba, że uzyskaÅ‚eÅ› +wyraźnÄ… zgodÄ™ na takie dziaÅ‚anie). Twoje prawo do korzystania z Towarów +Wirtualnych jest ograniczone do ograniczonej, niewyłącznej, nieprzenoszalnej, +odwoÅ‚alnej licencji bez prawa do udzielania sublicencji na użytkowanie treÅ›ci +GOG wyłącznie dla celów prywatnych i dla wÅ‚asnej rozrywki. Nie posiadasz +udziaÅ‚u, prawa ani tytuÅ‚u do Towarów Wirtualnych, które pozostajÄ… wÅ‚asnoÅ›ciÄ… +odpowiedniego wydawcy. Towary Wirtualne mogÄ… być zmieniane, poprawiane i +usuwane w razie potrzeby, w tym w celu realizacji niniejszej Umowy. W razie +potrzeby możliwe jest również naÅ‚ożenie ograniczeÅ„ na wykorzystanie Towarów +Wirtualnych (w tym limitów transakcji i salda). + + + +8.3 Istnienie specjalnej oferty na Towary Wirtualne nie zobowiÄ…zuje nas do +kontynuowania oferowania Towarów Wirtualnych w ten sam sposób w przyszÅ‚oÅ›ci. +Zakres, rodzaje i typy Towarów Wirtualnych, jakie możesz otrzymać mogÄ… siÄ™ +zmieniać, a GOG może zarzÄ…dzać, modyfikować i usuwać Towary Wirtualne, jeżeli +uznamy to za konieczne do prawidÅ‚owego funkcjonowania GOG.COM, treÅ›ci GOG lub +z innych uzasadnionych powodów. W takim przypadku GOG nie ponosi żadnej +odpowiedzialnoÅ›ci za skorzystanie z tego prawa. DoÅ‚ożymy uzasadnionych staraÅ„, +aby powiadomić CiÄ™ o takich zmianach i uzasadnić ich powody. + +## 9\. ÅATKI, AKTUALIZACJE I ZMIANY + +9.1 Od czasu do czasu może wystÄ…pić konieczność aktualizacji usÅ‚ug GOG lub +treÅ›ci GOG (np. aby dodać lub usunąć elementy lub też usunąć problemy z +oprogramowaniem). Jest to konieczne dla prawidÅ‚owego funkcjonowania usÅ‚ug +GOG.COM. Brak aktualizowania usÅ‚ug GOG lub treÅ›ci GOG przez użytkownika może +doprowadzić do niezgodnoÅ›ci Twojej wersji z niektórymi funkcjami usÅ‚ug GOG lub +treÅ›ci GOG. Nie instalujÄ…c aktualizacji ryzykujesz również niezainstalowanie +ważnych aktualizacji bezpieczeÅ„stwa. Nasi Partnerzy również mogÄ… wykorzystywać +usÅ‚ugi GOG do wprowadzania Å‚atek i aktualizacji odpowiednich treÅ›ci GOG. + + + + +## 10\. TYTUÅ WÅASNOÅšCI DO USÅUG GOG I PRAWA WÅASNOÅšCI INTELEKTUALNEJ + +10.1 UsÅ‚ugi GOG, w tym (miÄ™dzy innymi) grafika, kod, interfejs użytkownika, +wyglÄ…d, dźwiÄ™ki, filmy, tekst, ukÅ‚ad, bazy danych, dane i wszystkie inne +treÅ›ci, a także prawa do ich eksploatacji należą do nas lub otrzymujemy na nie +licencje od podmiotów zewnÄ™trznych. TreÅ›ci GOG stanowiÄ…ce wÅ‚asność +deweloperów/wydawców również podlegajÄ… licencji udzielonej GOG. Wszystkie +prawa sÄ… zastrzeżone, chyba że stwierdziliÅ›my inaczej w niniejszej Umowie. Nie +możesz wykorzystywać usÅ‚ug GOG i treÅ›ci GOG w inny sposób niż okreÅ›lono w +niniejszej Umowie. + + + +10.2 GOG respektuje prawa innych podmiotów do ochrony wÅ‚asnoÅ›ci +intelektualnej. WiÄ™cej informacji można znaleźć[pod tym +adresem](https://support.gog.com/hc/articles/16033687971613). + +## 11\. ZASADY KORZYSTANIA Z USÅUG GOG + +11.1 Prosimy, przestrzegaj poniższych zasad dotyczÄ…cych usÅ‚ug i treÅ›ci GOG, i +wszystkich innych zasad, do których odsyÅ‚amy w punkcie 11.2 poniżej. +Przeczytaj je dokÅ‚adnie, gdyż ich nieprzestrzeganie (zwÅ‚aszcza w przypadku +oszukiwania) bÄ™dzie traktowane jako istotne naruszenie niniejszej Umowy, co +może prowadzić do zawieszenia lub zablokowania dostÄ™pu do usÅ‚ug GOG. A oto +zasady: + + + +(a) Możesz korzystać z usÅ‚ug lub treÅ›ci GOG wyłącznie do wÅ‚asnej rozrywki (nie +możesz wykorzystywać ich w celach zarobkowych, do piractwa lub w celach +politycznych). + + + +(b) W zakresie treÅ›ci GOG, to co możesz robić (w tym modyfikować, łączyć, +dystrybuować, tÅ‚umaczyć, rozkÅ‚adać na części, dekompilować, przeksztaÅ‚cać i +tworzyć prace pochodne) uzależnione jest od pozwolenia wÅ‚aÅ›ciciela praw do +danych treÅ›ci GOG (GOG nie może przyznać takich praw), dlatego sprawdź te +kwestie bezpoÅ›rednio z wÅ‚aÅ›cicielem tych praw (pierwszÄ… rzeczÄ… jakÄ… powinieneÅ› +zrobić jest sprawdzenie, czy istnieje EULA i co ona zawiera). Prosimy również +o podejmowanie tylko autentycznych prób ulepszania treÅ›ci GOG. + + + +(c) W zakresie usÅ‚ug GOG (obejmujÄ…cych oprogramowanie GOG), jeżeli nie masz +wczeÅ›niejszej zgody GOG, nie możesz ich modyfikować, łączyć, dystrybuować, +tÅ‚umaczyć, przeksztaÅ‚cać, dekompilować, rozkÅ‚adać na części ani tworzyć z nich +prac pochodnych - chyba, że dopuszcza to niniejsza Umowa lub prawo +obowiÄ…zujÄ…ce w Twoim kraju. PodkreÅ›lamy, że możesz zgÅ‚osić siÄ™ do nas po zgodÄ™ +na powyższe dziaÅ‚ania i bÄ™dziemy odpowiadać na takie zgÅ‚oszenia w dobrej +wierze. W przyszÅ‚oÅ›ci planujemy używać otwartych protokołów klienta, aby +użytkownicy mogli pracować z danymi/oprogramowaniem GOG bez potrzeby +programowania zwrotnego i podobnych dziaÅ‚aÅ„. + + + +(d) Nie możesz hakować, uszkadzać, zakłócać ani nadużywać usÅ‚ug i treÅ›ci GOG, +nie możesz podejmować podobnych dziaÅ‚aÅ„ wzglÄ™dem użytkowników i personelu GOG, +ani też wykorzystywać ich do takich dziaÅ‚aÅ„. + + + +(e) Nie możesz tworzyć, udostÄ™pniać i/lub dystrybuować cheatów, hacków, +exploitów, automatycznego oprogramowania, robotów, botów, modów, pajÄ…ków, +oprogramowania szpiegujÄ…cego, skryptów, narzÄ™dzi do uzyskiwania danych i +innego oprogramowania, które w dowolny sposób wpÅ‚ywa na usÅ‚ugi GOG lub treÅ›ci +dostÄ™pne na GOG (w tym, miÄ™dzy innymi, nieautoryzowanych programów osób +trzecich, które przejmujÄ…, emulujÄ… lub przekierowujÄ… wiadomoÅ›ci pomiÄ™dzy GOG i +partnerami GOG a usÅ‚ugami GOG, a także nieautoryzowanych programów osób +trzecich, które zbierajÄ… dane o usÅ‚ugach GOG). + + + +(f) Nie ingeruj w oprogramowanie sieciowe GOG i osób trzecich, ani inne +oprogramowanie, w tym poprzez tunelowanie, osadzanie kodu, modyfikacjÄ™ lub +zmianÄ™ oprogramowania GOG, używajÄ…c jakiegokolwiek innego oprogramowania wraz +z usÅ‚ugami lub treÅ›ciami GOG, poprzez emulacjÄ™ protokoÅ‚u, tworzenie lub +korzystanie z serwerów prywatnych w zakresie usÅ‚ug lub treÅ›ci GOG. Nie możesz +próbować uzyskać dostÄ™pu do obszarów GOG.COM Aplikacji GOG GALAXY i serwerów +GOG, które nie sÄ… dostÄ™pne publicznie. + + + +(g) Nie mów, ani nie rób niczego co jest lub może być uznane za rasistowskie, +ksenofobiczne, seksistowskie, zniesÅ‚awiajÄ…ce lub w inny sposób obraźliwe lub +niezgodne z prawem (np. wykorzystywanie nieletnich, zachÄ™canie do przemocy, +uczestniczenie we fraudach). BÄ…dźmy dla siebie mili! + + + +(h) Nie możesz dzielić siÄ™, kupować, sprzedawać, przekazywać, oddawać, +pożyczać, kraść ani sprzeniewierzać kont GOG. Klucze/kody GOG mogÄ… być +przekazywane innym tylko w sposób dozwolony przez GOG.COM. W przypadku pytaÅ„ +lub problemów skontaktuj siÄ™ z obsÅ‚ugÄ… klienta. + + + +(i) Prosimy o przestrzeganie ograniczeÅ„, wymogów i zasad dotyczÄ…cych +lokalizacji geograficznej lub regionu oraz jÄ™zyka w ramach GOG.COM. + + + +(j) Prosimy abyÅ› nie podejmowaÅ‚ żadnych dziaÅ‚aÅ„ w zwiÄ…zku z GOG, które +naruszajÄ… prawa autorskie, znaki towarowe, patenty, tajemnice handlowe, +prywatność i inne prawa osób trzecich, np. odnoÅ›nie do zdjęć, wizerunku, +plików dźwiÄ™kowych, tekstowych i graficznych oraz innych materiałów i +informacji. + + + +11.2 Oprócz powyższych, poniżej znajduje siÄ™ lista dodatkowych warunków, które +majÄ… zastosowanie do Ciebie podczas korzystania z usÅ‚ug GOG. Nie chcemy siÄ™ +powtarzać, ale należy pamiÄ™tać, że ich nieprzestrzeganie bÄ™dzie stanowić +istotne naruszenie niniejszej Umowy, co może prowadzić do zawieszenia lub +zablokowania dostÄ™pu do usÅ‚ug GOG. Oto lista: + + * Zasady PostÄ™powania na GOG ([link](https://support.gog.com/hc/articles/16033977811613)) + + * Polityka dotyczÄ…ca treÅ›ci naruszajÄ…cych i dot. praw autorskich ([link](https://support.gog.com/hc/articles/16033687971613)). + + + +11.3 Za każdym razem, gdy podejmujemy decyzjÄ™ moderacyjnÄ… skutkujÄ…cÄ… +ograniczeniem Twojego dostÄ™pu do usÅ‚ug GOG, kiedykolwiek to możliwe powinieneÅ› +otrzymać uzasadnienie wskazujÄ…ce, dlaczego podjÄ™liÅ›my tÄ™ decyzjÄ™. JeÅ›li nie +zgadzasz siÄ™ z decyzjÄ…, którÄ… podjÄ™liÅ›my, masz 6 miesiÄ™cy na zÅ‚ożenie +odwoÅ‚ania, liczonych od dnia, w którym poinformowaliÅ›my CiÄ™ o tej decyzji. +Szczegóły dotyczÄ…ce skÅ‚adania skarg powinny być dostÄ™pne w decyzji +moderacyjnej. Opis naszej procedury systemu rozpatrywania skarg jest również +dostÄ™pny w Polityce dotyczÄ…cej treÅ›ci naruszajÄ…cych i dot. praw autorskich +([tutaj](https://support.gog.com/hc/articles/16033687971613)). Tam możesz +również znaleźć informacje dot. dziaÅ‚aÅ„, które podejmujemy w przypadku +nadużywania naszych systemów rozpatrywania skarg poprzez czÄ™ste wnoszenie +oczywiÅ›cie bezzasadnych skarg. + +## 12\. TREÅšCI GENEROWANE PRZEZ UÅ»YTKOWNIKA + +12.1. Niniejszy ustÄ™p dotyczy treÅ›ci (np. tekstów, materiałów wideo, +fotografii, zrzutów z ekranu, tapet lub linków), które udostÄ™pniasz nam lub +innym użytkownikom GOG w ramach usÅ‚ug GOG (np. poprzez swoje zdjÄ™cie profilowe +lub wiadomoÅ›ci do innych użytkowników GOG). Nazywamy je dalej „TreÅ›ciami +Generowanymi przez Użytkownikaâ€. + + + +12.2 ZakÅ‚adamy, że zawsze jesteÅ› wÅ‚aÅ›cicielem utworzonych przez siebie treÅ›ci +(TreÅ›ci Wygenerowanych przez Użytkownika), lecz potrzebujemy ograniczonych +praw do nich w celu transmitowania ich w ramach usÅ‚ug GOG. Dlatego też poprzez +opublikowanie TreÅ›ci Wygenerowanych przez Użytkownika, udzielasz nam +niewyłącznej, nieodwoÅ‚alnej licencji na korzystanie, modyfikacjÄ™, odtwarzanie, +tworzenie utworów zależnych, dystrybucjÄ™, przekazywanie i +prezentowanie/wykonywanie publiczne Twoich TreÅ›ci Generowanych przez +Użytkownika w zwiÄ…zku z usÅ‚ugami GOG. + + + +12.3 Przed użyciem TreÅ›ci Generowanych przez Użytkownika musisz upewnić siÄ™, +że posiadasz wszelkie niezbÄ™dne do tego prawa, jak również sprawdzić, czy mogÄ… +one być bezpiecznie wykorzystywane - nie dysponujemy takÄ… wiedzÄ… i nie możemy +tego sprawdzić, dlatego w tym przypadku ufamy Tobie. + + + +12.4 Posiadamy jednakże prawo (lecz nie obowiÄ…zek) do przeglÄ…du oraz, w razie +potrzeby lub koniecznoÅ›ci prawnej, usuniÄ™cia TreÅ›ci Generowanych przez +Użytkownika, które sÄ… niezgodne z prawem, zniesÅ‚awiajÄ…ce, obsceniczne, +nienawistne, rasistowskie, pornograficzne, naruszajÄ…ce prywatność innych, +stanowiÄ…ce groźbÄ™ lub nÄ™kanie. Jeżeli zauważysz takie treÅ›ci w ramach usÅ‚ug +GOG, powiadom nas o tym. Przeczytaj naszÄ… PolitykÄ™ treÅ›ci naruszajÄ…cych i dot. +praw autorskich ([tutaj](https://support.gog.com/hc/articles/16033687971613)), +gdzie wyjaÅ›niamy naszÄ… procedurÄ™ zgÅ‚aszania treÅ›ci naruszajÄ…cych. JeÅ›li po +naszej wewnÄ™trznej procedurze wciąż uważasz, że Twoja sprawa nie zostaÅ‚a w +peÅ‚ni rozwiÄ…zana, masz możliwość skorzystania z pozasÄ…dowego rozwiÄ…zywania +sporów - wiÄ™cej na ten temat w punkcie 20 poniżej. + +## 13\. INFORMACJE ZWROTNE I SUGESTIE + +13.1 Bardzo chÄ™tnie przyjmujemy opinie i sugestie dotyczÄ…ce ulepszania usÅ‚ug +GOG i wszystkie bardzo cenimy. W ramach wyjaÅ›nienia zastrzegamy jednak, że nie +mamy obowiÄ…zku ich wykorzystać czy akceptować, ani też nie jesteÅ›my Ci nic +winni (finansowo lub w inny sposób) w zamian za ich otrzymanie. + +## 14\. WYKORZYSTANIE TREÅšCI GOG W TWÓRCZOÅšCI FANOWSKIEJ + +14.1 W zakresie twórczoÅ›ci fanowskiej (np. prac takich jak fanowskie +modyfikacje gier, machinima, parodie, 'Let's Play', inne materiaÅ‚y wideo i +ilustracje), musisz upewnić siÄ™, że wÅ‚aÅ›ciciel takich treÅ›ci (np. deweloper +lub wydawca) wyraża zgodÄ™ i uzyskać jego pozwolenie. Powód jest prosty - +treÅ›ci GOG stanowiÄ… wÅ‚asność odpowiedniego wÅ‚aÅ›ciciela, a nie GOG. + +## 15\. TREÅšCI OSÓB TRZECICH I USÅUGI ZEWNĘTRZNE + +15.1 UsÅ‚ugi GOG mogÄ… zawierać linki do stron internetowych lub treÅ›ci osób +trzecich. Decyzja o skorzystaniu z tych linków należy wyłącznie do Ciebie – +nie możemy obiecać, że bÄ™dÄ… dziaÅ‚aÅ‚y, jaki bÄ™dzie ich wyglÄ…d, ani że bÄ™dÄ… +darmowe. + + + +15.2 Za poÅ›rednictwem konta GOG możesz uzyskać dostÄ™p do zewnÄ™trznych usÅ‚ug +Zaufanych Partnerów GOG, np. gier z serii Wiedźmin i stron naszej spółki +powiÄ…zanej, CD PROJEKT. PodlegajÄ… one osobnym zasadom i regulaminom, których +musisz przestrzegać. Korzystanie z takich usÅ‚ug jest opcjonalne - wybór należy +wyłącznie do Ciebie. + +## 16\. GWARANCJE I OGRANICZENIE ODPOWIEDZIALNOÅšCI W ZAKRESIE USÅUG GOG + +16.1 Gwarantujemy, że (i) jesteÅ›my uprawnieni do zawarcia niniejszej Umowy +oraz do udzielenia licencji na korzystanie z usÅ‚ug GOG, o których mowa w ust. +2.1, (ii) doÅ‚ożymy uzasadnionej starannoÅ›ci w zakresie jakoÅ›ci usÅ‚ug GOG i +korzystania z nich, (iii) wykonujÄ…c zobowiÄ…zania wynikajÄ…ce z niniejszej Umowy +doÅ‚ożymy uzasadnionych staraÅ„ w celu przestrzegania obowiÄ…zujÄ…cego prawa. + + + +16.2 Twoje oÅ›wiadczenia i gwarancje. OÅ›wiadczasz i gwarantujesz, że jesteÅ› +uprawniony do zawarcia niniejszej Umowy i postÄ™powania zgodnie z jej +postanowieniami. OÅ›wiadczasz także, że wszystkie TreÅ›ci Generowane przez +Użytkownika przekazywane przez Ciebie za poÅ›rednictwem usÅ‚ug GOG nie naruszajÄ… +praw wÅ‚asnoÅ›ci intelektualnej osób trzecich. ZobowiÄ…zujesz siÄ™, że nie +bÄ™dziesz wykorzystywaÅ‚ ani publikowaÅ‚ TreÅ›ci Generowanych przez Użytkownika, +które sÄ… niezgodne z prawem, zniesÅ‚awiajÄ…ce, obsceniczne, nienawistne, +rasistowskie, pornograficzne, naruszajÄ…ce prywatność innych, stanowiÄ…ce groźbÄ™ +lub nÄ™kanie. + + + +16.3 WkÅ‚adamy dużo pracy w to, żeby treÅ›ci GOG dziaÅ‚aÅ‚y w systemach naszych +użytkowników, ale mamy ograniczony czas na testy i czasem zdarza siÄ™, że coÅ› +nie dziaÅ‚a. Dlatego nie możemy przyjąć odpowiedzialnoÅ›ci za treÅ›ci GOG w +wiÄ™kszym zakresie niż wymagajÄ… tego przepisy prawa. Nie odpowiadamy także za +wszelkie zdarzenia dotyczÄ…ce GOG.COM i treÅ›ci GOG, które sÄ… poza naszÄ… +kontrolÄ… oraz nie gwarantujemy, że usÅ‚ugi GOG bÄ™dÄ… dziaÅ‚ać przez 100% czasu. +PamiÄ™taj jednak, że możesz mieć prawo do zwrotu treÅ›ci GOG i odzyskania +wpÅ‚aconej kwoty w przypadku problemów technicznych - patrz ust. 7.3. + +## 17\. ROZWIÄ„ZANIE UMOWY + +17.1. Twoje prawo do rozwiÄ…zania Umowy. Masz prawo rozwiÄ…zać niniejszÄ… UmowÄ™ w +dowolnym momencie, bez podawania przyczyny, poprzez zaprzestanie korzystania z +usÅ‚ug GOG. Jeżeli mamy również usunąć Twoje konto, skontaktuj siÄ™ z zespoÅ‚em +wsparcia [ pod tym adresem +](https://support.gog.com/hc/requests/new?category=info&product=gog) albo po +prostu wysyÅ‚ajÄ…c email na privacy@GOG.COM. RozwiÄ…zanie Umowy nie wpÅ‚ywa na +istniejÄ…ce już zobowiÄ…zania z naszej strony i Twojej strony. + + + +17.2 Prawo GOG do rozwiÄ…zania Umowy. W przypadku istotnego naruszenia +niniejszej Umowy przez Ciebie zastrzegamy sobie prawo do zawieszenia lub +zablokowania Twojego dostÄ™pu do usÅ‚ug i treÅ›ci GOG. Istotne naruszenie +niniejszej Umowy oznacza poważne naruszenie, które może mieć istotny negatywny +wpÅ‚yw na GOG, użytkowników GOG, w szczególnoÅ›ci naruszenie postanowieÅ„ ust. 11 +powyżej lub Zasad PostÄ™powania na GOG. W przypadku zawieszenia lub +zablokowania dostÄ™pu do usÅ‚ug lub treÅ›ci GOG, podejmiemy uzasadnione +dziaÅ‚ania, aby skontaktować siÄ™ z TobÄ…, wyjaÅ›nić Ci dlaczego podjÄ™liÅ›my takÄ… +decyzjÄ™ i (ewentualnie) co musisz zrobić żeby odzyskać dostÄ™p. + + + +17.3 Taka sytuacja wydaje siÄ™ bardzo nieprawdopodobna, ale jeżeli na staÅ‚e +przestaniemy udzielać dostÄ™pu do usÅ‚ug i treÅ›ci GOG (z innych przyczyn niż +naruszenie z Twojej strony), postaramy siÄ™ ogÅ‚osić to z wyprzedzeniem co +najmniej sześćdziesiÄ™ciu (60) dni na www.gog.com i przeÅ›lemy e-mail do +wszystkich zarejestrowanych użytkowników - w tym czasie bÄ™dziesz mógÅ‚ pobrać +wszystkie zakupione treÅ›ci GOG. + +## 18\. SIÅA WYÅ»SZA + +18.1 Ani my, ani Ty nie odpowiadamy za niewykonanie swoich zobowiÄ…zaÅ„ na mocy +niniejszej Umowy oraz brak dostÄ™pu do usÅ‚ug i treÅ›ci GOG, jeżeli takie +niewykonanie zostaÅ‚o spowodowane wydarzeniami niezależnymi od danej strony, w +tym, miÄ™dzy innymi, brakiem dostÄ™pu do Internetu, brakiem połączenia, pożarem, +powodziÄ…, wojnÄ… lub katastrofÄ… naturalnÄ…. + +## 19\. WÅAÅšCIWE PRAWO + +19.1. Ty i my uzgadniamy, że korzystanie z usÅ‚ug i treÅ›ci GOG oraz niniejsza +Umowa podlegajÄ… przepisom prawa polskiego, a wszelkie spory dotyczÄ…ce +niniejszej Umowy bÄ™dÄ… rozpatrywane przez sÄ…dy polskie. W przypadku +postÄ™powania sÄ…dowego dotyczÄ…cego niniejszej Umowy ,strona wygrywajÄ…ca +uprawniona jest do zwrotu swoich kosztów prawnych. + + + +19.2 Powyższy wybór wÅ‚aÅ›ciwego prawa i sÄ…du nie ogranicza obowiÄ…zkowych zasad +ochrony konsumenta i innych przepisów obowiÄ…zujÄ…cych w kraju Twojego +zamieszkania, które nie byÅ‚yby dostÄ™pne w innym wypadku. + +## 20\. WSPARCIE KLIENTA I ROZSTRZYGANIE SPORÓW + +20.1 W przypadku wÄ…tpliwoÅ›ci, zarzutów czy problemów bÄ™dziemy chcieli +rozstrzygnąć je szybko i polubownie tutaj +https://support.gog.com/hc/requests/new?category=info. DoÅ‚ożymy uzasadnionych +staraÅ„ w dobrej wierze, aby nieformalnie rozstrzygnąć wszelkie spory pomiÄ™dzy +nami. ZobowiÄ…zujemy siÄ™ odpowiedzieć na każde zapytanie w ciÄ…gu 14 dni. + + + +20.2 W przypadku braku rozwiÄ…zania sporu w tym terminie, kolejne kroki zależą +od miejsca Twojego zamieszkania. Jeżeli jesteÅ› mieszkaÅ„cem Unii Europejskiej, +możesz przekazać spór do rozpatrzenia na platformie online prowadzonej przez +KomisjÄ™ EuropejskÄ…, dostÄ™pnej na[tej +stronie](http://ec.europa.eu/consumers/odr/), aby rozwiÄ…zać spór pozasÄ…dowo +lub wszcząć postÄ™powanie. Możesz również wybrać rozwiÄ…zanie swojego sporu +poprzez organ pozasÄ…dowego rozstrzygania sporów certyfikowany przez +koordynatora do spraw usÅ‚ug cyfrowych Twojego paÅ„stwa. + +## 21\. INNE INFORMACJE PRAWNE + +21.1 Jeżeli jakakolwiek część niniejszej Umowy zostanie uznana za bezskutecznÄ… +lub nieważnÄ…, nie wpÅ‚ywa to na pozostaÅ‚e części Umowy. + + + +21.2 Niniejsza Umowa (w tym wszystkie regulacje GOG w niej wspomniane) +reguluje relacje pomiÄ™dzy GOG a TobÄ… (i odwrotnie), lecz nie powoduje +powstania żadnych praw dla innych osób. + + + +21.3 PamiÄ™taj, że podlegamy różnym przepisom prawa i możemy mieć obowiÄ…zek +zastosowania siÄ™ do wymagaÅ„ uprawnionych organów paÅ„stwowych lub innych +przepisów prawa. + + + +21.4 Ty i my uzgadniamy, że Konwencja Narodów Zjednoczonych o MiÄ™dzynarodowej +Sprzedaży Towarów nie ma zastosowania do niniejszej Umowy. + + + +21.5. Jeżeli jesteÅ› obywatelem Unii Europejskiej, wiedz, że umożliwiamy +transgraniczne przenoszenie darmowych i pÅ‚atnych treÅ›ci zgodnie z +rozporzÄ…dzeniem (UE) 2017/1128 Parlamentu Europejskiego i Rady z dnia 14 +czerwca 2017 r. w sprawie transgranicznego przenoszenia na rynku wewnÄ™trznym +usÅ‚ug online w zakresie treÅ›ci, jednak może ono podlegać innym wymogom +prawnym, w tym w odniesieniu do ochrony wÅ‚asnoÅ›ci intelektualnej oraz +wymaganiom deweloperów oraz wydawców gier z którymi współpracuje GOG. + +## 22\. ZMIANY NINIEJSZEJ UMOWY + +22.1 Niniejsza Umowa może podlegać zmianom z przyczyn zwiÄ…zanych z przepisami +prawa lub zmianami usÅ‚ug lub treÅ›ci GOG. Postanowienia niniejszej Umowy mogÄ… +być zmieniane tylko w sposób, który nie ogranicza Twoich praw. W przypadku +takiej zmiany, udostÄ™pnimy zmienionÄ… UmowÄ™ online pod adresem [ +https://support.gog.com/hc/articles/212632089 +](https://support.gog.com/hc/articles/212632089) i (jeÅ›li posiadasz konto GOG) +powiadomimy CiÄ™ e-mailowo o wszelkich istotnych zmianach. + + + +22.2 Wszelkie zmiany niniejszej Umowy wchodzÄ… w życie 30 dni po ich ogÅ‚oszeniu +online. W miÄ™dzyczasie możesz kontaktować siÄ™ z nami na adres legal@gog.com +jeÅ›li masz konkretne pytania dotyczÄ…ce wprowadzanych zmian. + + + +22.3. Jeżeli nie wyrażasz zgody na takie zmiany (niezależnie od tego czy +powiadomisz nas o tym e-mailem) bÄ™dziemy zmuszeni poprosić CiÄ™ o zaprzestanie +korzystania z usÅ‚ug i treÅ›ci GOG. Jest nam przykro z tego powodu, lecz mamy +nadziejÄ™, że docenisz stosowanie jednolitych zasad dla wszystkich +użytkowników, co jest konieczne, aby usÅ‚ugi GOG dziaÅ‚aÅ‚y prawidÅ‚owo. Dlatego +też w przypadku jakichkolwiek pytaÅ„ zachÄ™camy do kontaktu. + + + +22.4 Obiecujemy, że nigdy nie wprowadzimy zmian do niniejszej Umowy bez +ostrzeżenia, nie informujÄ…c CiÄ™ o tym i zmuszajÄ…c do akceptacji zmian, których +nie rozumiesz jako warunek korzystania z usÅ‚ug GOG.COM! + +## 23\. NASZE DANE KONTAKTOWE + +23.1 Jeżeli chcesz siÄ™ z nami skontaktować w sprawie zakupu lub w innych +kwestiach, poniżej podajemy nasze dane kontaktowe: + + + +Nazwa: GOG sp. z o.o. + + + +Siedziba: ul. JagielloÅ„ska 74, 03-301 Warszawa, Polska + + + +Spółka zarejestrowana przez SÄ…d Rejonowy w Warszawie, XIV WydziaÅ‚ Gospodarczy +Krajowego Rejestru SÄ…dowego + + + +Numer KRS: 0000029514 + + + +NIP PL 113-21-77-807 + + + +KapitaÅ‚ zakÅ‚adowy: PLN 135 750,00 + + + +E-mail: legal@GOG.COM lub support@GOG.COM + + + +Pojedynczy punkt kontaktowy dla organów: + +GOG Legal Team + +legal@GOG.COM + +JÄ™zyki, w jakich siÄ™ komunikujemy: angielski, polski + + + +Pojedynczy punkt kontaktowy dla odbiorców usÅ‚ug GOG: + +GOG Support Team + +support@GOG.COM + +Mówimy głównie po polsku i angielsku, ale dokonamy staraÅ„, aby wesprzeć CiÄ™ w +każdy jÄ™zyku, w którym GOG jest dostÄ™pny. + +Ostatnia aktualizacja (data wejÅ›cia w życie): 17 lutego 2024 + + + +Aby zobaczyć wczeÅ›niejszÄ… wersjÄ™ Umowy Użytkownika GOG, +kliknij[tutaj](https://support.gog.com/hc/articles/212632089). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/serpentisle/tmp/EULA_pt-BR.txt b/info.exult.exult/data/serpentisle/tmp/EULA_pt-BR.txt new file mode 100644 index 0000000..e35fa4e --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/EULA_pt-BR.txt @@ -0,0 +1,1600 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM USER AGREEMENT + +## 1\. ABOUT THIS AGREEMENT + + + +1.1 This Agreement is a contract between you (we will further call you just +“youâ€) and GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Warsaw, Poland (we will +further call ourselves “GOG†or just “usâ€) and applies to www.GOG.COM, your +GOG user account, GOG GALAXY application (including GOG GALAXY store), any +games or videos or other content or services which you purchase or access via +us, the GOG web forums, GOG customer and technical support and other services +we provide to you (we'll just call all this “GOG services†for short). Here we +set out your rights and obligations as a recipient of GOG services. + + + +1.2. Additional terms may apply to GOG services and in such a case we will +post them for your acceptance. For example, if you would like to use the GOG +GALAXY application, the relevant terms will be posted for your acceptance +before you start using these services. + + + +1.3 Also, when we're talking about games, in-game content, virtual items or +currency or GOG videos or other content or services which you can purchase or +access via GOG services, we’ll just call them “GOG games†or “GOG videos†+respectively and when we talk about them all together they are “GOG contentâ€. + + + +1.4 We didn’t want to make this document too long, but keep in mind that by +accepting our User Agreement you also accept: + + * our [ Privacy Policy ](https://support.gog.com/hc/articles/212632109) \- which explains what data we collect from you and how we protect it, + + * [ GOG Code of Conduct ](https://support.gog.com/hc/articles/16033977811613) which is a set of rules you need to follow as part of our community, + + * [ Infringing Content and Copyright Policy ](https://support.gog.com/hc/articles/16033687971613) which explains how you can report unlawful content on GOG and what happens when you do. + + + +1.5 GOG works with trusted partners, including our related company CD PROJEKT +S.A., developers and publishers, payment providers, customer service software +providers and others (“Partnersâ€) – more on them later in this Agreement. + + + +1.6 If you're over 18, then welcome! If you're between 16 and 18, before we +extend an equally warm welcome, please ask your parent or guardian to review +and approve this Agreement on your behalf (because in some countries people +under a certain age cannot legally enter into contracts like this Agreement). +If you’re not 16 yet you cannot have a GOG account or use the GOG services +because legally we cannot handle personal data of children without a special +parental or guardian’s permission (but your parents/guardians are welcome to +sign up themselves). + +## 2\. USING GOG SERVICES AND GOG CONTENT + + + +2.1 We give you and other GOG users the personal right (known legally as a +'license') to use GOG services and to download, access and/or stream +(depending on the content) and use GOG content. This license is for your +personal use. We can stop or suspend this license in some situations, which +are explained later on. + + + +2.2 When you buy, access or install GOG games, you might have to agree to +additional contract terms with the developer/publisher of the game (e.g. they +might ask you to agree to a game specific End User License Agreement). If +there is any inconsistency or dispute between those ‘EULAs’ and this +Agreement, then this Agreement wins. + + + +2.3 With GOG videos, you can also stream purchased video content or download +it to watch the way you want. + + + +2.4 Using certain third-party scripts is recommended for your full use of GOG +functionality and, although that usage is optional, we cannot promise full +service performance without them. + + + +2.5 A quick word about GOG GALAXY, which is our (optional) application which +not only allows you to buy and access GOG content but also provides cool +features like unified game library, and one friends list across platforms, +online multiplayer, achievements, cross-platform chat, game-time tracking, +cloud-saves and game overlay. You can learn more about +it[here](https://www.gog.com/galaxy). + + + +2.6 In some parts of GOG services, we use recommendation systems to present +you the content that you are most likely to be interested in. You can learn +where we use them and how they work[here](https://support.gog.com/hc/en- +us/articles/16034228157213), including what main parameters we use and how to +influence them. + +## 3\. GOG ACCOUNT + + + +3.1 To buy GOG content from GOG services, and in some cases to play/use GOG +content where our partners require use of a GOG account, you will need to set +up a GOG account. This will involve creating a password (which is encrypted so +we can’t access it) and a username, plus giving us (for identification +purposes) your email address. Please make sure your login credentials are kept +secure and your account is used properly. In your GOG account settings you can +also optionally set your country of residence, birthday and avatar. Our +Privacy Policy gives more details about the information we collect from you +and how we use it and protect it. +It's[here](https://support.gog.com/hc/articles/212632109). + + + +3.2 You can use your GOG account to set up a public profile accessible by +other people. You can also use your GOG account to connect with other GOG +users. Please act sensibly and remember you are responsible for your own +actions. + + + +3.3 Your GOG account and GOG content are personal to you and cannot be shared +with, sold, gifted or transferred to anyone else. Your access to and use of +them is subject to GOG’s [ Privacy Policy +](https://support.gog.com/hc/articles/212632109) and [ Code of Conduct +](https://support.gog.com/hc/articles/16033977811613) which are updated or +amended when necessary. + + + +3.4. Access to and use of the games purchased from different platforms (i.e. +with what we call ‘Keyless Access’), including their minimum system +requirements is governed by respective third-party platform policies and (as +applicable) additional contract terms with the developer/publisher of the game +(e.g. they might ask you to agree to a game specific End User License +Agreement). It may require having a third-party platform account. These +platforms may roll out patches or updates for your purchased games. + +## 4\. SYSTEM REQUIREMENTS + + + +4.1 Because GOG gives you access to many different services and games created +at different times and via different platforms, we cannot give you one set of +system requirements for all GOG services or GOG content. Please make sure your +computer and Internet connection are good enough to use GOG services and play +GOG games and videos. + + + +4.2 What we can tell you is that using any GOG game will require a computer, +equipped with a mouse and keyboard (touchscreen controls are not supported), +with an appropriate operating system (please refer to the relevant GOG product +page) with all service packs and important updates installed on it. All GOG +games should be natively installed on a computer that meets or exceeds the +minimum hardware and software specifications shown on the GOG product page. +GOG games are not tested on virtual machine software and therefore we do not +support playing through them. + + + +4.3 For GOG videos, please make sure your video player supports the videos’ +format specified in the GOG product page. + + + +4.4 If you have questions about system requirements, please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). Just so we're clear, you are +responsible for making sure you have sufficient Internet access to download +purchased GOG games or GOG videos from us or to stream GOG videos and that +your system can play GOG games and watch GOG videos. + +## 5\. BETAS + + + +5.1 As GOG develops, we may offer you optional access to 'beta' versions of +GOG software or services (e.g. new versions of the GOG GALAXY application made +available prior to its general release) or GOG content. + + + +Here are the rules: + + + +a) We (or any applicable publisher/partner) will set the conditions and +requirements for your beta access. Providing and maintaining a beta, and who +can use a beta, is at our discretion. + + + +b) You may be required to go through a registration process or other +requirements to access the beta (and this may include you meeting eligibility +criteria). + + + +c) Betas will be time-limited and there may be extra contract requirements. + + + +d) The beta may involve temporary or permanent server/progress/content wipes, +resets or amendments. + + + +e) The beta may be subject to confidentiality restrictions (which will be +notified to you in advance if so). + + + +f) You may be invited to participate in a feedback process regarding the beta +– this is totally optional but would be really valued. + + + +g) The beta is for your personal use and enjoyment, so you must not sell, loan +or otherwise transfer it to anyone else. + + + +h) The point of you getting beta access is to allow you to try something new, +but we would expect you to recognise that it will not be complete yet. +Therefore betas will be provided 'as is' without any additional promises from +us or any liability on us if it is not complete or does not work fully or +causes issues. Betas may not be totally feature-complete and there may be +feature changes, modifications or removals during the beta. + +## 6\. PAYING FOR GOG CONTENT AND GETTING REFUNDS + +### Paying for GOG content + +6.1 After you decide that you like a GOG game, GOG video or other GOG content, +you usually will need to pay for it before you can access it (though we do +have some free content too!). You can pay in different ways: (i) using a valid +debit or credit card; or (ii) using PayPal or any other authorized payment +provider. Remember to keep your payment details secure. + + + +6.2 When you use a payment method to buy GOG content, we're relying on your +promise that you're able to use that method. You are responsible for any +purchases made using your GOG account or payment method and you agree to the +pricing, payment and billing policies applicable to them, as notified to you +at the time of purchase. All payments are non-refundable and non-transferable +except as expressly provided in this Agreement. + + + +6.3 You can always pay for GOG content in US Dollars. However if you happen to +live in countries where your local currency is supported (see our Support +section [ here ](https://support.gog.com/hc/en- +us/articles/360001947034?product=gog) for details), you will be able to pay in +your local currency. You might have to pay a currency conversion charge if you +are not paying in your home currency and some banks might also add other kinds +of transaction fees. + + + +6.4. All prices are visible in the product catalog page. They’re inclusive of +taxes like VAT, if applicable. You should also expect some sales taxes/VAT to +be added to your price at checkout, if required by your local laws (f.ex. in +US or Canada). + + + +### GOG Wallet + +6.5 GOG offers users a digital account balance called the “GOG Wallet†in +connection with your user account, which you can use to make purchases of GOG +content on dedicated GOG services. Funds can be added to it in two ways: (i) +using your chosen payment method; or (ii) by us as part of our ‘Voluntary +Refund Policy’ (see link[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy)) in which case we may offer refunds +to GOG Wallet that you can use to get a replacement GOG game or other GOG +content. The GOG Wallet is made available subject to rules which are set out +on our GOG Wallet page[here](https://support.gog.com/hc/en- +us/articles/360001941953-FAQ-GOG-Wallet?product=galaxy). + +### GOG Bonus Codes + +6.6. We may also issue usually time-limited bonus codes which give you free or +reduced price access to GOG content (we’ll call them “Bonus Codesâ€). If you +receive Bonus Codes when you buy GOG content but later decide to return that +GOG content, then we think it’s fair for you to return the Bonus Codes too. +Therefore, we will terminate it or, if it has been redeemed for a GOG game, +that game will be removed from your account. + +### Direct to Account Distribution + +6.7 We have a direct to account distribution feature (we’ll call it ‘GOG +Direct to Account) where distribution platforms who partner with us would be +able to sell games or other content to you, where you could choose for that +game/content to be automatically activated within your GOG account, without +the need to redeem any codes. Just to be clear, the whole purchase process is +handled by the other platform, so in case of any issues with the purchase +process please speak with them directly. For this particular matter therefore, +we cannot offer you Our Voluntary Refund Policy (because GOG didn’t sell the +game/content). Of course, anything connected to our platform’s services is +still our responsibility. + +## 7\. REFUNDS AND RETURNS + +### Statutory refund rights + +7.1. If you are a resident of the European Union or other applicable +jurisdictions (excluding the USA), then you have the statutory right to +withdraw from a purchase of GOG content within 14 days of your purchase, +without giving a reason. To exercise the right of withdrawal, you should +inform us of your decision to withdraw from this contract by an unequivocal +statement (an email sent to support@GOG.COM, or a physical letter at an +address set out in Section 23 below). You may use the model withdrawal form +attached at the end of this Agreement, but you do not have to. To meet the +withdrawal deadline, it is sufficient for you to send your communication +concerning your exercise of the right of withdrawal before the withdrawal +period has expired. However, this does not apply where you have expressly +consented to the performance of the GOG content (which is digital content) +beginning immediately upon conclusion of the purchase process and have +acknowledged the loss of your withdrawal rights. + + + +7.2. Neither this nor any other part of this User Agreement affects your +statutory rights. In particular: + + + +a) For Australian Users: Our goods come with guarantees that cannot be +excluded under the Australian Consumer Law. You are entitled to a replacement +or refund for a major failure and compensation for any other reasonably +foreseeable loss or damage. You are also entitled to have the goods repaired +or replaced if the goods fail to be of acceptable quality and the failure does +not amount to a major failure. Details[here](https://support.gog.com/hc/en- +us/articles/360025857893?product=gog). + + + +b) For New Zealand Users: Neither this nor any other part of this User +Agreement excludes, restricts or modifies the application of any right or +remedy that cannot be so excluded, restricted or modified including those +conferred by the New Zealand Consumer Guarantees Act 1993. Under this Act are +guarantees which include that goods and services are of acceptable quality. If +this guarantee is not met there are entitlements to have the software remedied +(which may include repair, replacement or refund). If a remedy cannot be +provided or the failure is of a substantial character, the act provides for a +refund. + +### Our Voluntary Refund Policy + +7.3. We understand that sometimes a purchase doesn't turn out how you expected +and we want to be fair to GOG users. This is why on top of your statutory +refund rights (described in section 7.1.-7.2. above) we may offer you a +Voluntary Refund Policy described[here](https://support.gog.com/hc/en- +us/articles/360006129837?product=galaxy). In some rare cases if we have +reasonable doubts regarding your refund request we may not apply the Voluntary +Refund Policy. In no case this will deprive you of any applicable statutory +refund rights. A sale is considered final once your refund rights expire +(unless we agree otherwise on a case by case basis). + +## 8\. VIRTUAL ITEMS AND VIRTUAL CURRENCY + + + +8.1 With certain GOG content you may be able to purchase or acquire virtual +items and/or virtual currency (we’ll call them “Virtual Goods†for short). +Virtual Goods are subject to this Agreement and in particular the following +default rules, unless there are specific rules for that GOG content (which +will prevail over these rules). + + + +8.2 Virtual Goods are digital items only with no cash-value or real world +existence and cannot be ‘bought’, ‘sold’, gifted, transferred or redeemed, +exchanged for other Virtual Goods, ‘real world’ money, goods, services or +items of monetary value. Trading Virtual Goods is prohibited (unless you are +specifically permitted to do so). Your right to use any Virtual Goods is +limited to a limited, nonexclusive, non-assignable, non-transferable, non- +sublicensable, revocable license to use them solely for your personal +entertainment and non-commercial use in the applicable GOG content. You have +no property interest or right or title in any Virtual Goods, which remains the +appropriate publisher’s property. Virtual Goods may be changed, amended or +reversed if necessary, including to enforce this Agreement. If necessary, +limits may be placed on the use of Virtual Goods (including transaction limits +and balance amounts). + + + +8.3 The existence of a particular offer for Virtual Goods is not a commitment +by us to maintain or continue to make the Virtual Goods or that offer +available in the future. The scope, variety and type of Virtual Goods that you +may obtain can change and we have the right to manage, modify and remove +Virtual Goods if we consider necessary for the ongoing operation of GOG or GOG +content or for other legitimate reasons, in which case we will have no +liability to you or anyone for the exercise of such rights. We will make +reasonable efforts to notify you of any such change and to explain the reason +for such change. + +## 9\. PATCHES, UPDATES AND CHANGES + + +9.1 Occasionally we may need to patch or update GOG services or GOG content +(for example to add or remove features or to resolve software bugs). We need +these rights in order to keep GOG running efficiently and safely. Not patching +or updating the GOG services or GOG content may result in inferior performance +of your version or incompatibility of your version with some of the GOG +services or GOG content features. Doing so, you are also risking not +installing important security updates. Our Partners may use GOG services to +roll out patches or updates for applicable GOG content. + +## 10\. OWNERSHIP OF GOG SERVICES AND INTELLECTUAL PROPERTY RIGHTS + +10.1 GOG services including (but not limited to) their graphics, computer +code, user interface, look and feel, audio, video, text, layout, databases, +data and all other content, and all legal and exploitation rights regarding +them are either owned by us or we license them from third parties. GOG content +is owned by its developers/publishers and licensed by us. All rights are +reserved except as we have explained in this Agreement. You may not use or +exploit any part of the GOG services or GOG content except as explained in +this Agreement. + + + +10.2. GOG respects the intellectual property rights of others. Please read +more[here](https://support.gog.com/hc/articles/16033687971613). + +## 11\. RULES FOR USING GOG SERVICES + +11.1 Please follow these rules regarding the GOG services and GOG content, and +any additional rules we link in 11.2 below. Please read these rules carefully +since failure to follow them (particularly those in relation to cheating) will +be considered a material breach of this Agreement, which could lead to +suspension or cancellation of your access to GOG services. Here are the rules: + + + +(a) Only use GOG services or GOG content for your personal enjoyment (for +example, don't use them to make money, for piracy or for political purposes). + + + +(b) Regarding GOG content, what you can do practically apart from playing the +games (like create derivative works of it) depends on what the GOG content +rights holder allows you to do (GOG can’t grant such rights). So please check +this with the rights holder directly (the first thing you should do though is +to check if they have a EULA and if so what it says). We also ask that you +make only genuine attempts to improve the GOG content. + + + +(c) Regarding GOG services (which includes GOG software), unless you have +prior GOG permission please don’t modify, merge, distribute, translate, +reverse engineer, decompile, disassemble, or create derivative works of them – +unless you’re allowed in this Agreement or by the law in your country. We’d +like to emphasize that you are free to contact us for permission to do these +things and we will review and respond to those requests in good faith. More +generally, at some point in the future we want to open client protocols to +make it easier for users to work with GOG data/software without any need for +reverse engineering or similar techniques. + + + +(d) Don't hack, harm, grief, interrupt or misuse GOG services or GOG content, +GOG users or GOG personnel or use them for any similar purpose. + + + +(e) Do not create, use, make available and/or distribute cheats, exploits, +automation software, robots, bots, mods, hacks, spiders, spyware, cheats, +scripts, trainers, extraction tools or other software that interact with or +affect GOG services or GOG content in any way (including, without limitation, +any unauthorized third party programs that intercept, emulate, or redirect any +communication between GOG or its partners and GOG services and/or any +unauthorized third party programs that collect information about GOG +services). + + + +(f) Don't interfere with the GOG or third party network software or other +software including via tunnelling, code injection, modifying or changing GOG +software, using any other similar software together with GOG services or GOG +content, through protocol emulation, or through creation or use of private +servers regarding GOG services or GOG content. Do not access or attempt to +access areas of GOG.COM, GOG GALAXY or GOG servers that have not been made +available to the public. + + + +(g) Don't do or say anything which is or may be considered racist, xenophobic, +sexist, defamatory or otherwise offensive or illegal (f.ex. exploiting minors, +encouraging violence, engaging in fraud). Be nice to each other please! + + + +(h) Don’t share, ‘buy’, ‘sell’, transfer, gift, lend, steal, misappropriate or +misuse GOG accounts. GOG keys/codes can only be gifted or transferred or used +in the ways permitted by GOG. If you have any questions or problems, contact +customer support. + + + +(i) We ask you to follow any applicable geographic or regional, language or +location-based restrictions, requirements or rules regarding GOG. + + + +(j) We ask you not to do anything in connection with GOG that infringes any +copyright, trademark, patent, trade secret, privacy, publicity, or other right +of others, such as images, photographs, sound files, text files, graphics +files, and any other material or information. + + + +11.2 In addition to the above, below is the list of additional terms that +apply to you when using GOG services. We do not want to repeat ourselves, but +it is important to remember that if you fail to follow them, it will be a +material breach of this Agreement, which could lead to a suspension or +cancellation of your access to GOG services. Here is the list: + + * GOG Code of Conduct ([link](https://support.gog.com/hc/articles/16033977811613)) + + * Infringing Content and Copyright Policy ([link](https://support.gog.com/hc/articles/16033687971613)). + + + +11.3 Every time we make a moderation decision resulting in restricting your +access to GOG services, whenever it is possible you should receive a statement +of reasons outlining why we have made this decision. If you do not agree with +the decision we have made, you have 6 months from the day that you have been +informed about the decision, to make a complaint. The details on how to make a +complaint should be available in your moderation decision. The description of +our complaint-handling system procedure is also available in the Infringing +Content & Copyright Policy +([here](https://support.gog.com/hc/articles/16033687971613)). + +## 12\. USER GENERATED CONTENT + +12.1 This section is about content (e.g. text, photos or links) which you make +available either to us or to other GOG users via GOG services (for example +through your profile picture or through messages to other GOG users). We'll +call this "User Generated Content". + + + +12.2 As far as we and you are concerned, you own any User Generated Content +but we need you to give us some limited rights over it so that we can actually +transmit it through GOG services. So, by posting User Generated Content you +give us a nonexclusive, irrevocable license to use, modify, reproduce, create +derivative works from, distribute, transmit, communicate and publicly +display/perform your User Generated Content in connection with GOG services. + + + +12.3 It is your responsibility to make sure that you have all necessary legal +rights before you use User Generated Content and for checking they are safe to +use – we can't know that ourselves, and we can't check it for you, so we have +to rely on you. + + + +12.4. However, we have the right (but not the obligation) to review and if +appropriate or legally necessary to remove any User Generated Content which is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. If +you find that any such content has been posted on GOG services, please let us +know. We ask you to read our Infringing Content and Copyright Policy +([link](https://support.gog.com/hc/articles/16033687971613)), where we explain +our procedure for reporting infringing content. If you still feel your case is +not fully resolved after our internal procedure, you have access to an out-of- +court dispute settlement - more on this in Section 20 below. + +## 13\. FEEDBACK OR SUGGESTIONS + +13.1 You’re welcome to give us feedback and suggestions to improve GOG +services and we really value them all. However, just so we’re clear, we don’t +have to use or accept them and we won’t owe you anything (financially or +otherwise) regarding them. + +## 14\. USING GOG CONTENT IN FAN WORK + +14.1 For fan work (e.g. works like fan mods, machinima, parodies, homages, +'Let's Play' or other videos or artwork), you need to check with the content +owner (e.g. the developer or publisher) if they are OK with it and if so you +should get permission from them. The reason is simple – the GOG content is the +property of the respective owner, not ours. + +## 15\. THIRD-PARTY CONTENT AND EXTERNAL SERVICES + +15.1 You might get links to third-party websites or content through GOG +services which aren’t connected to us. Using them is up to you – we’re not +responsible for them, we can't promise they will work, what they'll be like or +if they're free. + + + +15.2 You can also use your GOG account to get easy access to some external, +GOG approved partner services, e.g. The Witcher games and sites from our +sister company CD PROJEKT RED. They will have their own terms and conditions +which you will need to agree and follow. Just to be clear: using these +services is all optional and up to you. You have the power! + +## 16\. WARRANTIES AND LIMITATION OF LIABILITY REGARDING GOG SERVICES + +16.1 We warrant that: (i) we have the right to enter this Agreement and to +grant you the license to use GOG services in section 2.1; and (ii) we will +take reasonable care with the GOG services and your use of them; and (iii) we +will use reasonable endeavors to comply with applicable laws in performing our +obligations to you under this Agreement. + + + +16.2. Your representations and warranties. You represent and warrant that you +have the full power and ability to enter into this Agreement and will fully +follow its terms. You also represent and warrant that any User Generated +Content, which you transmit via GOG services does not infringe upon the +intellectual property rights of any third party. You further represent and +warrant that you will not use or contribute User Generated Content that is +unlawful, tortious, defamatory, obscene, invasive of the privacy of another +person, threatening, harassing, abusive, hateful, racist or pornographic. + + + +16.3. We work hard to try to make GOG content work on your systems but we only +have limited time to carry out tests and we don't always get everything right. +Therefore, we can't accept any liability or responsibility for GOG content +except where required by law (see 7.1.-7.2 above). We are also not responsible +for anything that happens to GOG.COM or GOG services which is outside of our +control and we do not guarantee GOG services will work 100% of the time. +However, don't forget you may be entitled to GOG content return and refund if +it has technical issues - see section 7.3. + +## 17\. TERMINATION + +17.1 Your right to terminate the Agreement. You may terminate this Agreement +at any time and without giving any reason by completely ceasing to use GOG +services. If you would like us to delete your account please contact our +Support Team [ here ](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog) or simply by sending an email +request to privacy@gog.com. Termination will not affect already existing +rights or obligations of us or you. + + + +17.2. Our right to terminate the Agreement. If you materially breach this +Agreement, we reserve the right to suspend or cancel your access to GOG +services and GOG content. By material breach of the Agreement we mean a +serious breach which could cause significant harm to GOG, GOG users, as well +as, in particular breach of the provisions of section 11 above or GOG Code of +Conduct. If we suspend or cancel your access to GOG services or GOG content +we'll take reasonable steps to contact you to explain why we have done this +and what (if anything) you can do as a result. + + + +17.3 It seems very unlikely, but if we have to stop providing access to GOG +services and GOG content permanently (not because of any breach by you), we +will try to give you at least sixty (60) days advance notice by posting a note +on www.GOG.COM and sending an email to every registered user – during that +time you should be able to download any GOG content you purchased. + +## 18\. FORCE MAJEURE + +18.1 Neither you nor us will be liable for any failure to perform any +obligation under this Agreement or to provide access to GOG services and GOG +content if that failure is caused by the happening of any unforeseen event +beyond your or our reasonable control including without limitation, Internet +outages, communications outages, fire, flood, war or act of God. + +## 19\. GOVERNING LAW + +### For users resident in the European Union and elsewhere in the world (but +not the USA): + +19.1 You and we agree that your use of GOG services and GOG content and this +Agreement will be governed by and interpreted according to the laws of the +Republic of Poland and that any dispute regarding this Agreement will be heard +non-exclusively by the courts of the Republic of Poland. In any legal claim +under this Agreement, the side which wins will be entitled to its legal fees +and expenses. + + + +19.2. The above choice of governing law and jurisdiction is subject to any +mandatorily applicable principles of consumer protection or other law in your +jurisdiction of residence which would not otherwise be available. + +### For users in the USA only: + +19.3 You and we agree that your use of GOG services and GOG content, and this +Agreement, will be deemed to be entered into in Los Angeles, California and +governed by and interpreted according to the laws of the State of California, +USA (and, if applicable, US federal law). Any legal claim by you against GOG +will be made exclusively in any state or federal court located in Los Angeles, +California, which will have subject matter jurisdiction regarding the dispute +between you and us and therefore we both consent to the exclusive jurisdiction +of those courts. In any legal claim under this Agreement, the side which wins +will be entitled to its legal fees and expenses. + +## 20\. CUSTOMER SUPPORT AND DISPUTE RESOLUTION + +20.1.If you have concerns, claims or issues with us, we hope we can resolve +them quickly and amicably. Please contact +us[here](https://support.gog.com/hc/en- +us/requests/new?category=info&product=gog). We will make reasonable and good +faith efforts to resolve any dispute between us informally. We undertake to +answer any claim within 14 days. + + + +20.2. If it is not resolved during this time, the next steps depend on where +you live. If you live within the EU you may submit your legal claims to the +online dispute resolution platform operated and provided by the European +Commission which can be accessed via http://ec.europa.eu/consumers/odr/ in +order to reach an out of court settlement or initiate a lawsuit. You may also +choose to resolve your dispute through any out-of-court dispute settlement +body certified by your country’s Digital Services Coordinator. + + + +20.3. If you live in the USA or the rest of the world (but not the EU) then +please contact us at legal@gog.com. + +## 21\. OTHER LEGAL STUFF + +21.1 If any part of this Agreement is found not to be legally enforceable, +this will not affect any other part of it. + + + +21.2 This Agreement (including any GOG additional terms referenced in it) +constitutes the entire agreement between you and us and supersedes any earlier +oral or written agreements. If you disagree with this, please contact us as +soon as possible after you start using GOG services at legal@gog.com since +otherwise this will be binding on you after a reasonable time period (usually +30 days). + + + +21.3 This Agreement governs our relationship with you (and vice versa). It +does not create any rights for anyone else. + + + +21.4 Please remember we are subject to various laws and we may be required to +comply with law enforcement or other legal requirements. + + + +21.5 If there is a reorganization, sale or merger of GOG then we may need to +work with relevant third parties to transfer or merge your GOG account. + + + +21.6. You and we agree that the UN Convention on Contracts for the +International Sale of Goods does not apply to this Agreement. + + + +21.7 We can assign, subcontract or transfer this Agreement to a third party or +another member of our group if necessary for the support of GOG, as part of +any reorganization or merger or for other business reasons. We will notify you +if this happens. + + + +21.8. If you are a European Union citizen, then please be aware that GOG has +enabled cross-border portability on free and paid content pursuant to +Regulation (EU) 2017/1128 of the European Parliament and of the Council of 14 +June 2017 on cross-border portability of online content services in the +internal market, but this is subject to any other legal requirements on GOG +including regarding IP protection and may also be subject to any requirements +of developer and publisher partners of GOG. + +## 22\. CHANGES TO THIS AGREEMENT + +22.1 We may change this Agreement if we think it's necessary, e.g. for legal +reasons or to reflect changes in GOG services or GOG content. If so, we will +make the changed Agreement available online at +https://support.gog.com/hc/articles/212632089 and (if you have a GOG account) +we will email you to let you know about any significant changes. + + + +22.2 Any changes to the Agreement will come into force within 30 days of their +announcement online. In the meantime, you're welcome to contact us at +legal@GOG.COM if you have specific questions about the changes. + + + +22.3 If you don't agree to those changes (regardless of whether you email us), +then unfortunately we must ask you to cease using GOG services and GOG +content. We're sorry we have to say that, but we hope you'll appreciate that +for GOG services to work properly we need to have everyone using it under the +same rules instead of different people having different rules. That's why we +encourage you to get in contact if you have queries or concerns. + + + +22.4 Just so you know, we'll never just make a bunch of changes to this +Agreement, not tell you what they are and force you to agree to changes you +don't understand before you can use GOG services! + +## 23\. OUR CONTACT DATA + +23.1. If you have any complaint concerning GOG account, GOG services, or +simply you would like to contact us, here are our contact details: + +Name: GOG sp. z o.o. +Registered Office: Ul. JagielloÅ„ska 74, 03-301 Warsaw, Poland +Registered at the District Court for Warsaw, 14th +Commercial Division of the National Court Register. +Registration Number 0000029514 +Tax number VAT ID (NIP) PL 113-21-77-807 +Share capital: PLN 135.750,00 PLN + +Single point of contact for authorities: +GOG Legal Team +legal@gog.com +Languages we communicate in: English, Polish +Single point of contact for recipients of GOG services: +GOG Support Team +support@gog.com +We mostly speak English and Polish, but will do our best to assist you in any +language that GOG is available in. +Last update (effective date): 17th February 2024 +See the previous version of the User +Agreement[here](https://support.gog.com/hc/articles/212632089). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/serpentisle/tmp/EULA_ru-RU.txt b/info.exult.exult/data/serpentisle/tmp/EULA_ru-RU.txt new file mode 100644 index 0000000..e3d95c8 --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/EULA_ru-RU.txt @@ -0,0 +1,1714 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM ПользовательÑкое Соглашение + +## 1\. ОБ ЭТОМ СОГЛÐШЕÐИИ + +1.1 ÐаÑтоÑщее Соглашение предÑтавлÑет Ñобой договор между вами (далее мы будем +называть Ð²Ð°Ñ Ð¿Ñ€Ð¾Ñто "вы") и компанией GOG sp. z o.o., JagielloÅ„ska 74, 03-301 +Варшава, Польша (далее мы будем называть ÑÐµÐ±Ñ "GOG" или проÑто "мы") и +раÑпроÑтранÑетÑÑ Ð½Ð° Ñайт www.GOG.COM, вашу учетную запиÑÑŒ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ GOG, +приложение GOG GALAXY (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¼Ð°Ð³Ð°Ð·Ð¸Ð½ GOG GALAXY), любые игры или видео, или +другой контент или уÑлуги, которые вы приобретаете или получаете доÑтуп через +наÑ, веб-форумы GOG, клиентÑкую и техничеÑкую поддержку GOG и другие уÑлуги, +которые мы вам предоÑтавлÑем (далее мы будем называть вÑе Ñто проÑто "уÑлуги +GOG" Ð´Ð»Ñ ÐºÑ€Ð°Ñ‚ÐºÐ¾Ñти). ЗдеÑÑŒ мы излагаем ваши права и обÑзанноÑти как Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ +уÑлуг GOG. + + + +1.2. К уÑлугам GOG могут применÑтьÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ уÑловиÑ, и в Ñтом Ñлучае +мы опубликуем их Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ принÑтиÑ. Ðапример, еÑли вы хотите воÑпользоватьÑÑ +приложением GOG GALAXY, ÑоответÑтвующие уÑÐ»Ð¾Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ опубликованы Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ +ÑоглаÑÐ¸Ñ Ð´Ð¾ того, как вы начнете пользоватьÑÑ Ñтими уÑлугами. + + + +1.3. Кроме того, когда мы говорим об играх, внутриигровом контенте, +виртуальных предметах или валюте, видео GOG или другом контенте или уÑлугах, +которые вы можете приобреÑти или получить доÑтуп через ÑервиÑÑ‹ GOG, мы будем +называть их "игры GOG" или "видео GOG" ÑоответÑтвенно, а когда мы говорим о +них вмеÑте, то Ñто "контент GOG". + + + +1.4 Мы не хотели делать Ñтот документ Ñлишком длинным, но имейте в виду, что, +Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°Ñ Ð½Ð°ÑˆÐµ ПользовательÑкое Ñоглашение, вы также ÑоглашаетеÑÑŒ Ñ: + + * нашей [ Политикой конфиденциальноÑти ](https://support.gog.com/hc/articles/212632109) \- в ней объÑÑнÑетÑÑ, какие данные мы Ñобираем у Ð²Ð°Ñ Ð¸ как мы их защищаем, + + * [ КодекÑом Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ GOG ](https://support.gog.com/hc/articles/16033977811613) \- Ñто Ñвод правил, которым вы должны Ñледовать как чаÑть нашего ÑообщеÑтва, + + * [ Политикой в отношении противоправного контента и авторÑких прав ](https://support.gog.com/hc/articles/16033687971613) , в которой объÑÑнÑетÑÑ, как вы можете Ñообщить о противоправном контенте на GOG и что произойдет, еÑли вы Ñто Ñделаете. + + + + + +1.5. GOG Ñотрудничает только Ñ Ð½Ð°Ð´ÐµÐ¶Ð½Ñ‹Ð¼Ð¸ и проверенными партнерами, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ +нашу родÑтвенную компанию CD PROJEKT S.A., разработчиков и издателей, ÑиÑтемы +Ñлектронных платежей, компании, предоÑтавлÑющие ПО Ð´Ð»Ñ Ð¾Ð±ÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð², +и многие другие, (далее "Партнеры") - мы еще вернемÑÑ Ðº ним в Ñтом Соглашении. + + + +1.6. ЕÑли вам больше 18 лет, то добро пожаловать на GOG.COM! ЕÑли вам от 16 до +18 лет, прежде чем мы поприветÑтвуем Ð²Ð°Ñ Ð½Ð° нашем Ñайте, вы должны попроÑить +Ñвоего Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ опекуна прочитать Ñто Соглашение и одобрить его от вашего +имени (потому что в некоторых Ñтранах люди младше определенного возраÑта по +закону не могут заключать такие договора, как наÑтоÑщее Соглашение). Лица +младше 16 лет не могут Ñоздать учётную запиÑÑŒ и пользоватьÑÑ ÑƒÑлугами GOG (но +Ñто могут Ñделать их родители или опекуны), поÑкольку, ÑоглаÑно закону, мы не +имеем права обрабатывать их перÑональные данные без Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÐµÐ¹. + +## 2\. КÐК ПОЛЬЗОВÐТЬСЯ УСЛУГÐМИ И МÐТЕРИÐЛÐМИ GOG + +2.1. Мы предоÑтавлÑем вам и другим пользователÑм GOG личное право (юридичеÑки +оно называетÑÑ Â«Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ») на иÑпользование уÑлуг GOG.COM, на загрузку, доÑтуп +и/или на Ñтриминг (в завиÑимоÑти от Ñитуации) материалов GOG и других УÑлуг +GOG. Эта Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð° иÑключительно Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ личного пользованиÑ. +Мы можем приоÑтановить дейÑтвие Ñтой лицензии или отменить её в некоторых +ÑлучаÑÑ…, которые разъÑÑнены ниже. + + + +2.2. Когда вы покупаете, получаете доÑтуп или уÑтанавливаете игры GOG, вам +иногда придетÑÑ ÑоглашатьÑÑ Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ уÑловиÑми разработчиков или +издателей игры (например, они могут попроÑить Ð²Ð°Ñ ÑоглаÑитьÑÑ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ +Ñоглашением Ð´Ð»Ñ ÐºÐ¾Ð½ÐµÑ‡Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð¹ игры). ЕÑли между такими +лицензионными ÑоглашениÑми и нашим Соглашением наблюдаютÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð¾Ñ€ÐµÑ‡Ð¸Ñ, то +важнее оказываетÑÑ Ð½Ð°ÑˆÐµ Соглашение. + + + +2.3. Купленное видео GOG вы также можете загружать к Ñебе на компьютер или +проÑматривать онлайн — как вам удобнее. + + + +2.4. ИÑпользование определенных Ñторонних программ рекомендуетÑÑ, чтобы +полноÑтью иÑпользовать веÑÑŒ функционал GOG.COM, и Ñ…Ð¾Ñ‚Ñ Ð¸Ñ… иÑпользование не +ÑвлÑетÑÑ Ð¾Ð±Ñзательным, мы не можем гарантировать полноценную работу вÑех +ÑервиÑов без них. + + + +2.5. ÐеÑколько Ñлов о GOG GALAXY - нашем (дополнительном) приложении, которое +не только позволÑет покупать и получать доÑтуп к контенту GOG, но и +предоÑтавлÑет такие возможноÑти, как ÐµÐ´Ð¸Ð½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° игр, единый ÑпиÑок +друзей на вÑех платформах, онлайн-мультиплеер, доÑтижениÑ, кроÑÑплатформенный +чат, отÑлеживание игрового времени, облачные ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸ наложение игры. +Подробнее о нем вы можете узнать[здеÑÑŒ](https://www.gog.com/galaxy). + + + +2.6 Ð’ некоторых чаÑÑ‚ÑÑ… ÑервиÑов GOG мы иÑпользуем рекомендательные ÑиÑтемы, +чтобы предÑтавить вам контент, который, Ñкорее вÑего, Ð²Ð°Ñ Ð·Ð°Ð¸Ð½Ñ‚ÐµÑ€ÐµÑует. Ð’Ñ‹ +можете узнать, где мы их иÑпользуем и как они +работают[здеÑÑŒ](https://support.gog.com/hc/articles/16034228157213), Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ +то, какие оÑновные параметры мы иÑпользуем и как на них влиÑть. + +## 3\. УЧÐТÐÐЯ ЗÐПИСЬ GOG + +3.1. Чтобы купить любые материалы GOG через ÑервиÑÑ‹ GOG, а иногда и чтобы +играть или пользоватьÑÑ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð¾Ð¼ GOG, в ÑлучаÑÑ…, когда наши партнеры требуют +иÑпользовать GOG-аккаунт, вам потребуетÑÑ Ñоздать учётную запиÑÑŒ GOG. При Ñтом +необходимо будет придумать пароль (который будет зашифрован, чтобы мы не +получили к нему доÑтуп) и Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, а также указать ваш Ð°Ð´Ñ€ÐµÑ +Ñлектронной почты (чтобы мы Ñмогли удоÑтоверитьÑÑ Ð² том, что Ñто именно вы). +Сохраните Ñти данные вашей учётной запиÑи и никому их не Ñообщайте. Ð’ +наÑтройках Ñвоей учётной запиÑи GOG вы также можете дополнительно указать Ñвою +Ñтрану проживаниÑ, дату Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸ выбрать аватар. Ð’ нашей Политике +конфиденциальноÑти более подробно напиÑано о том, какие данные о Ð²Ð°Ñ Ð¼Ñ‹ +Ñобираем, как их иÑпользуем и как защищаем. Прочитать её +можно[здеÑÑŒ](https://support.gog.com/hc/articles/212632109). + + + +3.2. Ð’Ñ‹ можете иÑпользовать Ñвою учётную запиÑÑŒ GOG Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ +профилÑ, доÑтупного Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… людей. Ð’Ñ‹ также можете иÑпользовать Ñвою +учётную запиÑÑŒ GOG Ð´Ð»Ñ Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ пользователÑми GOG. Ðе забывайте об +оÑторожноÑти и помните, что вы неÑёте ответÑтвенноÑть за Ñвои дейÑтвиÑ! + + + +3.3 Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ GOG и Ñодержимое GOG ÑвлÑÑŽÑ‚ÑÑ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ личными данными и +не могут быть переданы, проданы, подарены или переданы кому-либо еще. Ваш +доÑтуп к ним и их иÑпользование регулируютÑÑ [ Политикой конфиденциальноÑти +](https://support.gog.com/hc/articles/212632109) и [ КодекÑом Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ +](https://support.gog.com/hc/articles/16033977811613) GOG, которые обновлÑÑŽÑ‚ÑÑ +или изменÑÑŽÑ‚ÑÑ Ð¿Ð¾ мере необходимоÑти. + + + +3.4. ДоÑтуп и иÑпользование игр, приобретенных на различных платформах (Ñ‚. е. +Ñ Ñ‚Ð°Ðº называемым "беÑключевым доÑтупом"), Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¸Ñ… минимальные ÑиÑтемные +требованиÑ, регулируютÑÑ ÑоответÑтвующими политиками Ñторонних платформ и +(еÑли применимо) дополнительными уÑловиÑми договора Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð¼/издателем +игры (например, они могут попроÑить Ð²Ð°Ñ ÑоглаÑитьÑÑ Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ð¼ Ñоглашением +Ñ ÐºÐ¾Ð½ÐµÑ‡Ð½Ñ‹Ð¼ пользователем конкретной игры). Ð”Ð»Ñ Ñтого может потребоватьÑÑ +ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ на Ñторонней платформе. Эти платформы могут выпуÑкать патчи или +Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ñ‹Ñ… вами игр. + +## 4\. СИСТЕМÐЫЕ ТРЕБОВÐÐИЯ + +4.1. GOG.COM предоÑтавлÑет вам доÑтуп к различным уÑлугам и играм, Ñозданным в +разное Ð²Ñ€ÐµÐ¼Ñ Ð¸ на разных платформах, поÑтому мы не можем Ñообщить вам +ÑиÑтемные требованиÑ, подходÑщие Ð´Ð»Ñ Ð²Ñех УÑлуг GOG или вÑех материалов GOG. + + + +4.2. Мы можем только Ñказать, что Ð´Ð»Ñ Ð¸Ð³Ñ€Ñ‹ в конкретную игру GOG вам +потребуетÑÑ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ в комплекте Ñ Ð¼Ñ‹ÑˆÐºÐ¾Ð¹ и клавиатурой (управление на +ÑенÑорном Ñкране не поддерживаетÑÑ), ÑоответÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÑиÑтема +(пожалуйÑта, проверьте Ñто на Ñтранице нужного вам продукта GOG) вмеÑте +уÑтановленными патчами и важными обновлениÑми. ПредполагаетÑÑ, что ВСЕ игры +GOG должны уÑтанавливатьÑÑ Ð½Ð° компьютеры, удовлетворÑющие минимальным +требованиÑм к аппаратному и программному обеÑпечению, указанным на Ñтранице +продукта GOG. Игры GOG не теÑтируютÑÑ Ð½Ð° виртуальных машинах, и, +Ñледовательно, мы не поддерживаем игру на них. + + + +4.3. Что каÑаетÑÑ Ð²Ð¸Ð´ÐµÐ¾ GOG, то убедитеÑÑŒ, что ваш видеоплейер поддерживает +формат видео, указанный на Ñтранице продукта GOG. + + + +4.4. ЕÑли у Ð²Ð°Ñ ÐµÑть вопроÑÑ‹ о ÑиÑтемных требованиÑÑ…, ÑвÑжитеÑÑŒ Ñ +нами[здеÑÑŒ](https://support.gog.com/hc/requests/new). Чтобы не было Ñомнений: +вы Ñами должны убедитьÑÑ Ð² том, что ваш доÑтуп к интернету позволÑет вам +загрузить купленные игры или видео GOG или проÑматривать видео GOG онлайн, и +что ваш компьютер позволÑет вам играть в игры GOG и проÑматривать видео GOG. + +## 5\. БЕТÐ-ДОСТУП К GOG + +5.1 По мере Ñ€Ð°Ð·Ð²Ð¸Ñ‚Ð¸Ñ GOG мы можем предложить вам дополнительный доÑтуп к +"бета-верÑиÑм" программного обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ уÑлуг GOG (например, к новым +верÑиÑм Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ GOG GALAXY, доÑтупным до его общего выпуÑка) или к контенту +GOG. + + + +Вот правила: + + + +a) Мы (или любой издатель/партнер, которого Ñтого может каÑатьÑÑ) +уÑтанавливаем уÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ доÑтупа к бета-верÑии. +ПредоÑтавление доÑтупа к бета-верÑии (а также решение о том, кому предоÑтавить +доÑтуп) и поддержание работоÑпоÑобноÑти такой верÑии выполнÑÑŽÑ‚ÑÑ Ð¿Ð¾ нашему +уÑмотрению. + + + +b) Возможно, вам придетÑÑ Ð¿Ñ€Ð¾Ð¹Ñ‚Ð¸ процеÑÑ Ñ€ÐµÐ³Ð¸Ñтрации или выполнить другие +обÑзательные дейÑтвиÑ, чтобы получить доÑтуп к бета-верÑии (от Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ +потребоватьÑÑ ÑоответÑтвие определенным критериÑм). + + + +c) Бета-верÑии будут иметь Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ времени и могут вноÑить в Ñоглашение +дополнительные требованиÑ. + + + +d) Во Ð²Ñ€ÐµÐ¼Ñ Ð±ÐµÑ‚Ð°-теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹ временные или поÑтоÑнные чиÑтки +Ñерверов/данных, обнуление прохождениÑ/контента, а также перезапуÑки или +иÑправлениÑ. + + + +e) Бета-верÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ подпадать под уÑÐ»Ð¾Ð²Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð´ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð¾Ñти (о чем вы будете +оÑведомлены заранее). + + + +f) Ð’Ð°Ñ Ð¼Ð¾Ð³ÑƒÑ‚ попроÑить поделитьÑÑ Ñвоим отзывом о бета-верÑии - вы Ñами +решаете, делать Ñто или нет, но ваша помощь будет выÑоко оценена. + + + +g) Бета-верÑÐ¸Ñ Ð¿Ñ€ÐµÐ´Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð° Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ личного иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ наÑлаждениÑ, +поÑтому вы не должны продавать, одалживать или иным образом передавать ее +кому-либо еще. + + + +h) ДоÑтуп к бета-верÑии предоÑтавлÑетÑÑ Ð²Ð°Ð¼ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы вы могли оценить +игру и получить новый опыт, однако важно помнить, что перед вами не конечный +продукт. ПоÑтому бета-верÑии игр раÑпроÑтранÑÑŽÑ‚ÑÑ Â«ÐºÐ°Ðº еÑть»: мы не даем +никаких гарантий и не принимаем никакой ответÑтвенноÑти в Ñлучае, еÑли игра не +ÑвлÑетÑÑ Ð·Ð°ÐºÐ¾Ð½Ñ‡ÐµÐ½Ð½Ð¾Ð¹, не работает так, как должна, или приводит к +возникновению проблем. Бета-верÑии могут не обладать полным набором функций, и +во Ð²Ñ€ÐµÐ¼Ñ Ð±ÐµÑ‚Ð°-теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ игры могут быть изменены, модифицированы +или полноÑтью удалены. + + + +Мы можем предоÑтавить доÑтуп к контенту GOG, находÑщемуÑÑ Ð² форме бета-верÑии +или верÑии до официального выхода. Ðапример, издатель/партнер может решить +опубликовать игру или ее чаÑть в качеÑтве бета-верÑии или приÑоединитьÑÑ Ðº +нашей программе «Early Access» (Ñм. раздел 7.6-7.8). Любой подобный контент +GOG также будет регулироватьÑÑ Ñтими правилами, еÑли только издатель не введет +ÑобÑтвенные правила (которые будут иметь преимущеÑтвенную Ñилу). + +## 6\. ОПЛÐТРМÐТЕРИÐЛОВ GOG И ВОЗВРÐТ ДЕÐЕГ + +Оплата материалов GOG + + + +6.1 ПоÑле того как вы решите, что вам понравилаÑÑŒ игра GOG, видео GOG или +другой контент GOG, вам, как правило, придетÑÑ Ð·Ð°Ð¿Ð»Ð°Ñ‚Ð¸Ñ‚ÑŒ за него, прежде чем +вы Ñможете получить к нему доÑтуп (Ñ…Ð¾Ñ‚Ñ Ñƒ Ð½Ð°Ñ ÐµÑть и беÑплатный контент!). Ð’Ñ‹ +можете оплатить покупку различными ÑпоÑобами: (i) Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ дейÑтвующей +дебетовой или кредитной карты; или (ii) Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ PayPal или любого другого +авторизованного платежного провайдера. Ðе забывайте о безопаÑноÑти Ñвоих +платежных реквизитов. + + + +6.2 Когда вы иÑпользуете ÑпоÑоб оплаты Ð´Ð»Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ контента GOG, мы полагаемÑÑ +на ваше обещание, что вы можете иÑпользовать Ñтот ÑпоÑоб. Ð’Ñ‹ неÑете +ответÑтвенноÑть за любые покупки, Ñовершенные Ñ Ð¸Ñпользованием вашей учетной +запиÑи GOG или ÑпоÑоба оплаты, и ÑоглашаетеÑÑŒ Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ð¸Ð¼Ñ‹Ð¼Ð¸ к ним правилами +ценообразованиÑ, оплаты и выÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñчетов, о которых вам ÑообщаетÑÑ Ð² +момент покупки. Ð’Ñе платежи не подлежат возврату и передаче, за иÑключением +Ñлучаев, прÑмо предуÑмотренных в наÑтоÑщем Соглашении. + + + +6.3. Ð’Ñ‹ вÑегда можете оплатить материалы GOG долларами СШÐ. Тем не менее, еÑли +вы проживаете в Ñтранах, где поддерживаетÑÑ Ð²Ð°ÑˆÐ° меÑÑ‚Ð½Ð°Ñ Ð²Ð°Ð»ÑŽÑ‚Ð° (Ñмотрите +полный ÑпиÑок в нашей[Секции +поддержки](https://support.gog.com/hc/sections/202834625-FAQ-Payments-pricing- +and-promos)), вы можете раÑплатитьÑÑ Ñвоей меÑтной валютой. ЕÑли вы +раÑплачиваетеÑÑŒ не Ñвоей меÑтной валютой, то вам, возможно, придётÑÑ Ð¾Ð¿Ð»Ð°Ñ‚Ð¸Ñ‚ÑŒ +и комиÑÑию за конвертацию валюты; некоторые банки также могут взимать плату за +транзакцию. + + + +6.4. Ð’Ñе цены видны на Ñтранице каталога товаров. Они включают в ÑÐµÐ±Ñ Ð½Ð°Ð»Ð¾Ð³Ð¸, +такие как ÐДС, еÑли применимо. Ð’Ñ‹ также должны ожидать, что некоторые налоги Ñ +продаж/ÐДС будут добавлены к цене при оформлении заказа, еÑли Ñто +предуÑмотрено меÑтным законодательÑтвом (например, в СШРили Канаде). + + + +GOG-кошелек + + + +6.5 GOG предлагаем Ñвоим пользователÑм цифровой Ð±Ð°Ð»Ð°Ð½Ñ Ð½Ð° аккаунте, который +называетÑÑ GOG-кошелек и привÑзан к вашей учетной запиÑи. Его можно +иÑпользовать Ð´Ð»Ñ Ð¾Ð¿Ð»Ð°Ñ‚Ñ‹ покупок на контента GOG на площадках GOG. СредÑтва в +кошелек можно начиÑлить Ð´Ð²ÑƒÐ¼Ñ ÑпоÑобами: (i) иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð»ÑŽÐ±Ð¾Ð¹ платежный метод; +или (ii) через «[Политику добровольного возврата +ÑредÑтв](https://support.gog.com/hc/articles/360006129837)», в Ñтом Ñлучае мы +можем предложить возврат ÑредÑтв за приобретенный контент на GOG-кошелек. GOG- +кошелек дейÑтвует в ÑоответÑтвии Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸, которые можно найти на +Ñпециальной Ñтранице[здеÑÑŒ](https://support.gog.com/hc/articles/360001941953). + + + +БонуÑные коды GOG + + + +6.6. Мы также можем выдавать ограниченные по времени бонуÑные коды, которые +предоÑтавлÑÑŽÑ‚ вам беÑплатный или льготный доÑтуп к Ñодержимому GOG (мы будем +называть их "БонуÑные коды"). ЕÑли вы получили бонуÑные коды при покупке +контента GOG, но позже решили вернуть Ñтот контент GOG, мы Ñчитаем, что будет +Ñправедливо, еÑли вы также вернете бонуÑные коды. ПоÑтому мы прекратим их +дейÑтвие или, еÑли они были выкуплены за игру GOG, Ñта игра будет удалена Ñ +вашего аккаунта. + + + +СиÑтема раÑпроÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Direct to Account + + + +6.7 У Ð½Ð°Ñ ÐµÑть ÑиÑтема раÑпроÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Direct to Account (назовем ее GOG +Direct to Account). Эта ÑиÑтема позволÑет партнерÑким платформам диÑтрибуции +продавать игры или другой контент, который можно автоматичеÑки активировать в +учетной запиÑи GOG без каких-либо кодов. Уточним, что веÑÑŒ процеÑÑ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ +обрабатываетÑÑ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ платформой, поÑтому в Ñлучае Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ при +покупке, вам Ñтоит обратитьÑÑ Ð½ÐµÐ¿Ð¾ÑредÑтвенно к ее предÑтавителÑм. Более +подробную информацию об Ñтой ÑиÑтеме можно найти в разделе «Возврат ÑредÑтв и +продукта» ниже. РазумеетÑÑ, мы неÑем полную ответÑтвенноÑть за вÑе, что так +или иначе ÑвÑзано Ñ ÑервиÑами нашей платформы. + +## 7\. ВОЗВРÐТ ДЕÐЕГ И ПРОДУКТР+ +Право на отказ от товара. + + + +7.1. ЕÑли вы ÑвлÑетеÑÑŒ резидентом ЕвропейÑкого Союза или других применимых +юриÑдикций (за иÑключением СШÐ), то у Ð²Ð°Ñ ÐµÑть законное право отказатьÑÑ Ð¾Ñ‚ +покупки контента GOG в течение 14 дней поÑле покупки без объÑÑÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½. +Чтобы воÑпользоватьÑÑ Ð¿Ñ€Ð°Ð²Ð¾Ð¼ на раÑторжение договора, вы должны Ñообщить нам о +Ñвоем решении раÑторгнуть договор путем недвуÑмыÑленного заÑÐ²Ð»ÐµÐ½Ð¸Ñ +(Ñлектронное пиÑьмо, отправленное по адреÑу support@GOG.COM, или физичеÑкое +пиÑьмо по адреÑу, указанному в разделе 23 ниже). Ð’Ñ‹ можете иÑпользовать +типовую форму отзыва, приложенную в конце данного СоглашениÑ, но Ñто не +обÑзательно. Чтобы вложитьÑÑ Ð² указанный Ñрок, доÑтаточно Ñообщить нам об +оÑущеÑтвлении права на аннулирование договора прежде чем Ñрок отзыва иÑтечет. +Однако Ñто не отноÑитÑÑ Ðº ÑлучаÑм, когда вы дали Ñвное ÑоглаÑие на +иÑпользование контента GOG (который ÑвлÑетÑÑ Ñ†Ð¸Ñ„Ñ€Ð¾Ð²Ñ‹Ð¼ контентом) Ñразу поÑле +Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа покупки и признали потерю права на отзыв. + + + +7.2. Ðи Ñта, ни Ð»ÑŽÐ±Ð°Ñ Ð´Ñ€ÑƒÐ³Ð°Ñ Ñ‡Ð°Ñть Ñтого ПользовательÑкого ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ +влиÑет на ваши законные права. Ð’ чаÑтноÑти: + + + +a) Ð”Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ ÐвÑтралии: наши товары предоÑтавлÑÑŽÑ‚ÑÑ Ñ Ð³Ð°Ñ€Ð°Ð½Ñ‚Ð¸Ñми, +которые не могут быть иÑключены в ÑоответÑтвии Ñ Ð°Ð²ÑтралийÑким законом О +защите прав потребителей. Ð’Ñ‹ имеете право на замену или возврат денег в Ñлучае +Ñерьезной неиÑправноÑти и компенÑацию за любые другие обоÑнованно +прогнозируемые убытки или ущерб. Ð’Ñ‹ также имеете право на ремонт или замену +товара, еÑли товар не имеет приемлемого качеÑтва и неиÑправноÑть не ÑвлÑетÑÑ +значительной; + + + +b) Ð”Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ðовой Зеландии: ни Ñто, ни какаÑ-либо Ð´Ñ€ÑƒÐ³Ð°Ñ Ñ‡Ð°Ñть +наÑтоÑщего ПользовательÑкого ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ иÑключает, не ограничивает и не +изменÑет применение каких-либо прав или ÑредÑтв правовой защиты, которые таким +образом не могут быть иÑключены, ограничены или изменены, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ñ€Ð°Ð²Ð°, +предоÑтавленные законом О гарантиÑÑ… потребителей Ðовой Зеландии 1993 года. Ð’ +ÑоответÑтвии Ñ Ñтим законом предоÑтавлÑÑŽÑ‚ÑÑ Ð³Ð°Ñ€Ð°Ð½Ñ‚Ð¸Ð¸ оÑущеÑÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð»ÐµÐ¼Ð¾Ð³Ð¾ +качеÑтва товаров и уÑлуг. ЕÑли Ñта Ð³Ð°Ñ€Ð°Ð½Ñ‚Ð¸Ñ Ð½Ðµ Ñоблюдена, еÑть право на +иÑправление программного обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ (которое может подразумевать ремонт, +замену или возврат). ЕÑли помощь по уÑтранению проблемы не может быть +предоÑтавлена или Ñбой в работе – ÑущеÑтвенный, закон предуÑматривает +возмещение ÑредÑтв. + + + +Ðаша Политика добровольного возврата + + + +7.3. Мы понимаем, что иногда покупка не оправдывает ожиданий, а мы хотим быть +чеÑтными Ñ Ð½Ð°ÑˆÐ¸Ð¼Ð¸ пользователÑми GOG. Именно поÑтому в дополнение к вашим +законным правам на возврат денежных ÑредÑтв (опиÑанным в разделе 7.1.-7.2. +выше) мы можем преложить вам Политику добровольного возврата, +опиÑанную[здеÑÑŒ](https://support.gog.com/hc/articles/36000612983). Продажа +ÑчитаетÑÑ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ поÑле иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐ¸Ñ… прав на возврат +денежных ÑредÑтв (еÑли только мы не договорилиÑÑŒ об ином в каждом конкретном +Ñлучае) + +## 8\. ВИРТУÐЛЬÐЫЕ ПРЕДМЕТЫ И ИГРОВÐЯ Ð’ÐЛЮТР+ +8.1. Ð’ Ñлучае Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ контентом GOG у Ð²Ð°Ñ ÐµÑть возможноÑть купить или +приобреÑти виртуальные предметы и/или виртуальную валюту (Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñтоты мы +будем назвать их «Виртуальные Товары»). Виртуальные Товары подпадают под +правила Ñтого СоглашениÑ, еÑли только у контента GOG, к которому они +отноÑÑÑ‚ÑÑ, нет ÑобÑтвенных правил (которые будут иметь преимущеÑтвенную Ñилу). + + + +8.2. Виртуальные Товары - Ñто цифровые предметы, которые не ÑущеÑтвуют в +реальном мире и не имеют денежной ÑтоимоÑти, их не возможно купить, продать, +подарить, передать, погаÑить, будь то обмен на другие Виртуальные Товары, +«наÑтоÑщие» деньги, товары, уÑлуги или материальные ценноÑти. Обмен +Виртуальных Товаров Ñтрого запрещен (еÑли только у Ð²Ð°Ñ Ð½ÐµÑ‚ на него +Ñпециального разрешениÑ). Ваше право иÑпользовать любые Виртуальные Товары +ограничено ограниченной, неиÑключительной, непередаваемой, не подлежащей +передаче, не имеющей права ÑублицензированиÑ, отзываемой лицензией, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ +позволÑет вам иÑпользовать Виртуальные Товары только Ð´Ð»Ñ Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ Ñ€Ð°Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸ +некоммерчеÑкого иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑоответÑтвующем контенте GOG. У Ð²Ð°Ñ Ð½ÐµÑ‚ +никаких имущеÑтвенных прав на Виртуальные Товары, которые оÑтаютÑÑ Ð² полной +ÑобÑтвенноÑти ÑоответÑтвующего издателÑ. При необходимоÑти Виртуальные Товары +могут быть изменены, иÑправлены или аннулированы. Ð’ том чиÑле и Ñ Ñ†ÐµÐ»ÑŒÑŽ +обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ ÑÐ¾Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ ÑƒÑловий данного СоглашениÑ. Ð’ Ñлучае необходимоÑти на +иÑпользование виртуальных товаров могут быть наложены Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ (в том +чиÑле, ограничение размеров транзакции и количеÑтва ÑредÑтв на Ñчете). + + + +8.3. СущеÑтвование того или иного Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð’Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ… Товаров не +означает, что мы обÑзуемÑÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ‚ÑŒ Ñти товары или продолжать их выпуÑк в +будущем. МаÑштабы, аÑÑортимент и типы Виртуальных Товаров, которые вы можете +приобреÑти, могут изменитьÑÑ, и мы оÑтавлÑем за Ñобой право управлÑть +Виртуальными Товарами, изменÑть их или полноÑтью удалÑть, еÑли мы Ñочтем Ñто +необходимым Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ ÑервиÑа GOG, контента GOG или по любой +другой законной причине. Ð’ Ñтом Ñлучае мы не неÑем никакой ответÑтвенноÑти +перед вами или другими лицами за оÑущеÑтвление Ñтих прав. Мы приложим разумные +уÑилиÑ, чтобы уведомить Ð²Ð°Ñ Ð¾ любых таких изменениÑÑ… и объÑÑнить причину таких +изменений. + +## 9\. ПÐТЧИ, ОБÐОВЛЕÐИЯ И ИЗМЕÐЕÐИЯ + +9.1 Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ времени нам может потребоватьÑÑ Ð¸Ñправление или обновление уÑлуг +GOG или контента GOG (например, Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ или +уÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº в программном обеÑпечении). Эти права нужны нам Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, +чтобы поддерживать Ñффективную и безопаÑную работу GOG. ОтÑутÑтвие иÑправлений +или обновлений Ñлужб GOG или Ñодержимого GOG может привеÑти к Ñнижению +производительноÑти вашей верÑии или неÑовмеÑтимоÑти вашей верÑии Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ +функциÑми Ñлужб GOG или Ñодержимого GOG. При Ñтом вы также риÑкуете не +уÑтановить важные Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти. Ðаши партнеры могут иÑпользовать +Ñлужбы GOG Ð´Ð»Ñ Ð²Ñ‹Ð¿ÑƒÑка иÑправлений или обновлений Ð´Ð»Ñ ÑоответÑтвующего +контента GOG. + +## 10\. ПРÐВО СОБСТВЕÐÐОСТИ ÐРСЕРВИСЫ GOG И ПРÐÐ’Ð ÐРИÐТЕЛЛЕКТУÐЛЬÐУЮ +СОБСТВЕÐÐОСТЬ + +10.1. УÑлуги GOG включают в ÑÐµÐ±Ñ (и Ñто не полный ÑпиÑок) изображениÑ, +компьютерный код, Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, внешний вид и «атмоÑферу», +звукозапиÑи, видеозапиÑи, текÑÑ‚, раÑположение Ñлементов, базы данных, данные и +многое другое, вÑе юридичеÑкие права на которые либо принадлежат нам, либо +переданы нам по лицензии третьими Ñторонами. Материалы GOG принадлежат их +разработчикам/издателÑм и лицензированы нами. Ð’Ñе права Ñохранены, за +иÑключением тех Ñлучаев, которые указаны в Ñтом Соглашении. Вам Ð½ÐµÐ»ÑŒÐ·Ñ +иÑпользовать любую чаÑть УÑлуг GOG или материалов GOG иначе, чем указано в +Ñтом Соглашении. + + + +10.2. GOG уважает права интеллектуальной ÑобÑтвенноÑти других лиц. Подробнее +читайте[здеÑÑŒ](https://support.gog.com/hc/articles/16033687971613). + +## 11\. ПРÐВИЛРПОЛЬЗОВÐÐИЯ УСЛУГÐМИ GOG + +11.1 ПожалуйÑта, Ñоблюдайте Ñти правила, каÑающиеÑÑ ÑƒÑлуг GOG и Ñодержимого +GOG, а также вÑе дополнительные правила, ÑÑылки на которые приведены ниже в +разделе 11.2. ПожалуйÑта, внимательно ознакомьтеÑÑŒ Ñ Ñтими правилами, +поÑкольку их неÑоблюдение (оÑобенно тех, которые каÑаютÑÑ Ð¼Ð¾ÑˆÐµÐ½Ð½Ð¸Ñ‡ÐµÑтва) будет +ÑчитатьÑÑ ÑущеÑтвенным нарушением данного СоглашениÑ, что может привеÑти к +приоÑтановке или аннулированию вашего доÑтупа к уÑлугам GOG. Вот правила: + + + +(a) ИÑпользуйте ÑервиÑÑ‹ GOG или контент GOG только Ð´Ð»Ñ Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ удовольÑÑ‚Ð²Ð¸Ñ +(например, не иÑпользуйте их Ð´Ð»Ñ Ð·Ð°Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ°, пиратÑтва или в политичеÑких +целÑÑ…). + + + +(b) Что каÑаетÑÑ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° GOG, то то, что вы можете делать практичеÑки помимо +игры (например, Ñоздавать производные произведениÑ) , завиÑит от того, что вам +разрешает правообладатель контента GOG (GOG не может предоÑтавлÑть такие +права). ПоÑтому уточните Ñтот Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð½ÐµÐ¿Ð¾ÑредÑтвенно у Ð¿Ñ€Ð°Ð²Ð¾Ð¾Ð±Ð»Ð°Ð´Ð°Ñ‚ÐµÐ»Ñ (в +первую очередь проверьте, еÑть ли у него EULA и еÑли еÑть, то что в нем +напиÑано). Мы также проÑим Ð²Ð°Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°Ñ‚ÑŒ только иÑкренние попытки улучшить +Ñодержание GOG. + + + +(c) Что каÑаетÑÑ Ð£Ñлуг GOG (к которым отноÑитÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð¾Ðµ обеÑпечение GOG), +то без предварительного Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñо Ñтороны GOG их Ð½ÐµÐ»ÑŒÐ·Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸Ñ†Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ, +объединÑть, раÑпроÑтранÑть, переводить, декомпилировать, деаÑÑемблировать, как +и Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать на их оÑнове производные продукты, еÑли только Ñто не +позволено данным Соглашением или законами вашей Ñтраны. Мы бы хотели обратить +ваше внимание на то, что вы вÑегда можете ÑвÑзатьÑÑ Ñ Ð½Ð°Ð¼Ð¸ и попроÑить +Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° такие дейÑтвиÑ; мы раÑÑмотрим вашу проÑьбу и вынеÑем +Ñправедливое решение. Ð’ будущем мы планируем открыть клиентÑкие протоколы, +чтобы облегчить пользователÑм работу Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ и программным обеÑпечением GOG +без необходимоÑти прибегать к декомпилÑции или другим подобным ÑредÑтвам. + + + +(d) Ðе взламывайте, не наноÑите вред, не мешайте работе и не нарушайте правила +ÑкÑплуатации ÑервиÑов GOG и контента GOG, а также не применÑйте аналогичные +дейÑÑ‚Ð²Ð¸Ñ Ðº другим пользователÑм GOG или Ñотрудникам GOG. + + + +(e) Ðе Ñоздавать, не иÑпользовать, не предоÑтавлÑть и/или не раÑпроÑтранÑть +читы, ÑкÑплойты, программы автоматизации, роботы, боты, моды, взломы, пауки, +шпионÑкие программы, читы, Ñкрипты, трейнеры, инÑтрументы Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ +другое программное обеÑпечение, которое взаимодейÑтвует или влиÑет на ÑервиÑÑ‹ +GOG или контент GOG любым ÑпоÑобом (включаÑ, без ограничений, любые +неавторизованные программы третьих лиц, которые перехватывают, Ñмулируют или +перенаправлÑÑŽÑ‚ любые коммуникации между GOG или его партнерами и ÑервиÑами GOG +и/или любые неавторизованные программы третьих лиц, которые Ñобирают +информацию о ÑервиÑах GOG). + + + +(f) Ðе вмешивайтеÑÑŒ в работу Ñетевого программного обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ GOG или третьих +Ñторон, в том чиÑле поÑредÑтвом туннелированиÑ, Ð²Ð½ÐµÐ´Ñ€ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°, модификации +программного обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ GOG, Ñ Ð¸Ñпользованием подобных программ вмеÑте Ñ +УÑлугами или материалами GOG, поÑредÑтвом ÑмулÑции протоколов или путём +ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñтных Ñерверов, дублирующих УÑлуги или материалы GOG. Ðе пытайтеÑÑŒ +получить доÑтуп к уÑлугам GOG.COM, ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ GOG GALAXY или Ñерверам GOG, +которые закрыты от публичного доÑтупа. + + + +(g) Ðе делайте и не говорите ничего, что ÑчитаетÑÑ Ð¸Ð»Ð¸ может ÑчитатьÑÑ +раÑиÑÑ‚Ñким, кÑенофобÑким, ÑекÑиÑÑ‚Ñким, клеветничеÑким или иным оÑкорбительным +или незаконным (например, ÑкÑÐ¿Ð»ÑƒÐ°Ñ‚Ð°Ñ†Ð¸Ñ Ð½ÐµÑовершеннолетних, поощрение наÑилиÑ, +мошенничеÑтво). Будьте добры друг к другу, пожалуйÑта! + + + +(h) Ðе раÑпроÑтранÑйте, не покупайте, на продавайте, не передавайте, не +дарите, не Ñдавайте в аренду, не крадите и не приÑваивайте учетные запиÑи GOG. +Ключи/Коды GOG можно дарить, передавать или иÑпользовать только в ÑоответÑтвии +Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸ GOG. ЕÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ проблемы или вопроÑÑ‹, обратитеÑÑŒ в нашу +Ñлужбу поддержки. + + + +(i) Мы проÑим Ð²Ð°Ñ Ñоблюдать любые возникающие географичеÑкие, региональные, +Ñзыковые или территориальные ограничениÑ, уÑÐ»Ð¾Ð²Ð¸Ñ Ð¸Ð»Ð¸ правила в отношении GOG. + + + +(j) Мы также проÑим Ð²Ð°Ñ Ð½Ðµ Ñовершать в отношении GOG какие-либо дейÑтвиÑ, +которые нарушали бы авторÑкие права, товарный знак, патент, коммерчеÑкую +тайну, неприкоÑновенноÑть чаÑтной жизни, публичноÑть или оÑтальные права +других лиц, такие как: изображениÑ, фотографии, звуковые файлы, текÑтовые +файлы, графичеÑкие файлы и любые другие материалы или информацию. + + + +11.2 Ð’ дополнение к вышеизложенному ниже приведен ÑпиÑок дополнительных +уÑловий, которые применÑÑŽÑ‚ÑÑ Ðº вам при иÑпользовании уÑлуг GOG. Мы не хотим +повторÑтьÑÑ, но важно помнить, что еÑли вы не будете Ñледовать им, Ñто будет +ÑущеÑтвенным нарушением данного СоглашениÑ, что может привеÑти к приоÑтановке +или аннулированию вашего доÑтупа к уÑлугам GOG. СÑылки: + + * ÐšÐ¾Ð´ÐµÐºÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ GOG([ÑÑылка](https://support.gog.com/hc/articles/16033977811613)) + + * Политика в отношении нарушающего права контента и авторÑких прав([ÑÑылка](https://support.gog.com/hc/articles/16033687971613)). + + + +11.3 Каждый раз, когда мы принимаем решение о модерации, приводÑщее к +ограничению вашего доÑтупа к Ñлужбам GOG, вы должны получать изложение причин, +по которым мы принÑли такое решение. ЕÑли вы не ÑоглаÑны Ñ Ð¿Ñ€Ð¸Ð½Ñтым нами +решением, у Ð²Ð°Ñ ÐµÑть 6 меÑÑцев Ñ Ñ‚Ð¾Ð³Ð¾ днÑ, когда вы были проинформированы о +нем, чтобы подать жалобу. ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ том, как подать жалобу, +должна ÑодержатьÑÑ Ð² решении о модерации. ОпиÑание процедуры нашей ÑиÑтемы +обработки жалоб также доÑтупно в Политике в отношении нарушающего контента и +авторÑких прав([здеÑÑŒ](https://support.gog.com/hc/articles/213224285)). + +## 12\. ПОЛЬЗОВÐТЕЛЬСКИЕ МÐТЕРИÐЛЫ + +12.1. Этот раздел поÑвÑщён материалам (например, различным текÑтам, видео, +фотографиÑм, изображениÑм, Ñкриншотам, обоÑм Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ Ñтола или ÑÑылкам), +которые вы передаёте либо нам, либо другим пользователÑм GOG во Ð²Ñ€ÐµÐ¼Ñ +иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð£Ñлуг GOG (например, когда размещаете изображение в Ñвоём +профиле или отÑылаете текÑтовое Ñообщение другим пользователÑм GOG). Будем +называть Ñто «пользовательÑкими материалами». + + + +12.2. Что каÑаетÑÑ Ð½Ð°Ñ Ð¸ ваÑ, то вы ÑвлÑетеÑÑŒ владельцем любого +ПользовательÑкого контента, но нам необходимо, чтобы вы предоÑтавили нам +некоторые ограниченные права на него, чтобы мы могли фактичеÑки передавать его +через Ñлужбы GOG. Таким образом, Ñ€Ð°Ð·Ð¼ÐµÑ‰Ð°Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкий контент, вы +предоÑтавлÑете нам неиÑключительную, безотзывную лицензию на иÑпользование, +изменение, воÑпроизведение, Ñоздание производных работ, раÑпроÑтранение, +передачу, Ñообщение и публичный показ/иÑполнение вашего ПользовательÑкого +контента в ÑвÑзи Ñ ÑƒÑлугами GOG. + + + +12.3. Ð’Ñ‹ должны Ñами убедитьÑÑ Ð² том, что обладаете вÑеми необходимыми правами +на Ñвои пользовательÑкие материалы, прежде чем им пользоватьÑÑ, и проверить, +что никто не помешает его иÑпользовать — Ñами мы не можем знать Ñтого +навернÑка, поÑтому нам приходитÑÑ Ð¿Ð¾Ð»Ð°Ð³Ð°Ñ‚ÑŒÑÑ Ð½Ð° ваÑ. + + + +12.4. Тем не менее, мы имеем право (но не обÑзаны) проверÑть и, еÑли Ñто +умеÑтно или юридичеÑки необходимо, удалÑть любой ПользовательÑкий контент, +который ÑвлÑетÑÑ Ð½ÐµÐ·Ð°ÐºÐ¾Ð½Ð½Ñ‹Ð¼, деликтным, клеветничеÑким, неприÑтойным, +вторгающимÑÑ Ð² чаÑтную жизнь другого лица, угрожающим, преÑледующим, +оÑкорбительным, ненавиÑтничеÑким, раÑиÑÑ‚Ñким или порнографичеÑким. ЕÑли вы +обнаружите, что на ÑервиÑах GOG был размещен подобный контент, пожалуйÑта, +Ñообщите нам об Ñтом. Мы проÑим Ð²Ð°Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸Ñ‚ÑŒÑÑ Ñ Ð½Ð°ÑˆÐµÐ¹ Политикой в отношении +нарушающего права контента +([здеÑÑŒ](https://support.gog.com/hc/articles/16033687971613)), где мы +объÑÑнÑем нашу процедуру ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ нарушающем права контенте. ЕÑли вы вÑе +еще Ñчитаете, что ваше дело не до конца урегулировано поÑле нашей внутренней +процедуры , у Ð²Ð°Ñ ÐµÑть возможноÑть внеÑудебного ÑƒÑ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñпора - +подробнее об Ñтом в разделе 20 ниже . + +## 13\. ОБРÐТÐÐЯ СВЯЗЬ И ПРЕДЛОЖЕÐИЯ + +13.1. Ð’Ñ‹ имеете полное право выÑказывать Ñвоё мнение об УÑлугах GOG и давать +нам Ñоветы по их поводу. Мы дейÑтвительно ценим ваше мнение. Ðо при Ñтом +имейте в виду, что мы не обÑзаны Ñледовать вашим Ñоветам, и что мы вам ничего +не должны за них (в финанÑовом и в любом другом отношении). + +## 14\. ИСПОЛЬЗОВÐÐИЕ МÐТЕРИÐЛОВ GOG Ð’ ПОЛЬЗОВÐТЕЛЬСКИХ ПРОДУКТÐÐ¥ + +14.1. Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие продукты, (например, такие как «моды», +«машинимы», пародии, «летÑплеи» или другие видеоролики или изображениÑ), вы +должны убедитьÑÑ Ð² том, что владельцы материала (например, разработчики или +издатели) не возражают против Ñтого, и еÑли Ð´Ð»Ñ Ñтого необходимо разрешение, +то вы должны получить такое разрешение. Причина проÑта — материал GOG ÑвлÑетÑÑ +ÑобÑтвенноÑтью его ÑоответÑтвующего владельца, а не GOGа. + +## 15\. МÐТЕРИÐЛЫ ТРЕТЬИХ СТОРОРИ Ð’ÐЕШÐИЕ УСЛУГИ + +15.1. ПользуÑÑÑŒ УÑлугами GOG, вы можете получить ÑÑылки на Ñайты и материалы. +Ð’Ñ‹ можете пользоватьÑÑ Ð¸Ð¼Ð¸ по Ñвоему уÑмотрению — мы не обещаем, что они будут +работать, и не знаем, что они Ñобой предÑтавлÑÑŽÑ‚ и беÑплатны ли они Ð´Ð»Ñ +иÑпользованиÑ. + + + +15.2. Ð’Ñ‹ можете также воÑпользоватьÑÑ Ñвоей учётной запиÑью GOG Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ +доÑтупа к внешним уÑлугам, одобренным GOG, например, к играм Ñерии «Ведьмак» и +к Ñайтам нашей родÑтвенной компании CD PROJEKT. У них имеютÑÑ Ñвои уÑÐ»Ð¾Ð²Ð¸Ñ +иÑпользованиÑ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ вы должны будете ознакомитьÑÑ Ð¸ ÑоглаÑитьÑÑ. ПроÑто, +чтобы вы знали: пользоватьÑÑ Ð¸Ð»Ð¸ нет Ñтими уÑлугами — решать иÑключительно +вам. Это ваш выбор! + +## 16\. ГÐРÐÐТИИ И ОГРÐÐИЧЕÐИЯ ОТВЕТСТВЕÐÐОСТИ Ð’ ОТÐОШЕÐИИ УСЛУГ GOG + +16.1. Мы гарантируем Ñледующее: (i) мы имеем право заключать Ñто Соглашение и +предоÑтавлÑть вам лицензию на иÑпользование УÑлуг GOG ÑоглаÑно пункту 2.1; +(ii) мы в разумной Ñтепени ÑтараемÑÑ Ð¾Ð±ÐµÑпечить вам беÑперебойную работу УÑлуг +GOG; и (iii) мы в разумной Ñтепени будем Ñоблюдать применимое +законодательÑтво, ÑÐ»ÐµÐ´ÑƒÑ Ð½Ð°ÑˆÐ¸Ð¼ обÑзательÑтвам ÑоглаÑно Ñтому Соглашению. + + + +16.2. Гарантии Ñ Ð’Ð°ÑˆÐµÐ¹ Ñтороны. Ð’Ñ‹ заÑвлÑете и гарантируете, что у Ð²Ð°Ñ ÐµÑть +право и возможноÑть заключить наÑтоÑщее Соглашение, уÑÐ»Ð¾Ð²Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ вы +обÑзуетеÑÑŒ Ñоблюдать. Ð’Ñ‹ также заÑвлÑете и гарантируете, что любой +ПользовательÑкий материал, который вы передаете через Ñлужбы GOG, не нарушает +права интеллектуальной ÑобÑтвенноÑти какой-либо третьей Ñтороны. Кроме того, +Ð’Ñ‹ заÑвлÑете и гарантируете, что вы не будете иÑпользовать или ÑпоÑобÑтвовать +поÑвлению пользовательÑкого материала, который ÑвлÑетÑÑ Ð½ÐµÐ·Ð°ÐºÐ¾Ð½Ð½Ñ‹Ð¼, +вредоноÑными, клеветничеÑкими, неприÑтойными, поÑÑгающими на +неприкоÑновенноÑть чаÑтной жизни другого лица, угрожающим, оÑкорбительным, +ненавиÑтным, раÑиÑÑ‚Ñким или имеющим порнографичеÑкий характер. + + + +16.3. Мы прилагаем вÑе уÑÐ¸Ð»Ð¸Ñ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы контент GOG работал на ваших +ÑиÑтемах, но у Ð½Ð°Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ð¾Ðµ Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° проведение теÑтов, и мы не вÑегда вÑе +делаем правильно. ПоÑтому мы не неÑем никакой ответÑтвенноÑти за Ñодержимое +GOG, за иÑключением Ñлучаев, предуÑмотренных законом (Ñм. 7.1.-7,2 выше). Мы +также не неÑем ответÑтвенноÑти за то, что проиÑходит Ñ GOG.COM или ÑервиÑами +GOG, которые находÑÑ‚ÑÑ Ð²Ð½Ðµ нашего контролÑ, и мы не гарантируем, что ÑервиÑÑ‹ +GOG будут работать в 100% Ñлучаев. Однако не забывайте, что вы имеете право на +возврат и возмещение ÑтоимоÑти контента GOG, еÑли у него возникли техничеÑкие +проблемы - Ñм. раздел 7.3. + +## 17\. ПРЕКРÐЩЕÐИЕ ДЕЙСТВИЯ СОГЛÐШЕÐИЯ + +17.1 Ваше право раÑторгнуть Соглашение. Ð’Ñ‹ можете раÑторгнуть наÑтоÑщее +Соглашение в любое Ð²Ñ€ÐµÐ¼Ñ Ð¸ без объÑÑÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½, полноÑтью прекратив +пользоватьÑÑ ÑƒÑлугами GOG. ЕÑли вы хотите, чтобы мы удалили вашу учетную +запиÑÑŒ, ÑвÑжитеÑÑŒ Ñ Ð½Ð°ÑˆÐµÐ¹ Ñлужбой поддержки [ здеÑÑŒ +](https://support.gog.com/hc/requests/new) или проÑто отправьте Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾ +Ñлектронной почте на Ð°Ð´Ñ€ÐµÑ privacy@gog.com. Прекращение дейÑÑ‚Ð²Ð¸Ñ Ð½Ðµ повлиÑет +на уже ÑущеÑтвующие права или обÑзательÑтва Ð´Ð»Ñ Ð½Ð°Ñ Ð¸Ð»Ð¸ ваÑ. + + + + +17.2. Ðаше право раÑторгнуть Соглашение. ЕÑли вы ÑущеÑтвенно нарушаете данное +Соглашение, мы оÑтавлÑем за Ñобой право приоÑтановить или отменить ваш доÑтуп +к уÑлугам GOG и контенту GOG. Под ÑущеÑтвенным нарушением Ð¡Ð¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð¼Ñ‹ +понимаем Ñерьезное нарушение, которое может нанеÑти значительный ущерб GOG, +пользователÑм GOG, а также, в чаÑтноÑти, нарушение положений раздела 11 выше +или КодекÑа Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ GOG. ЕÑли мы приоÑтановим или отменим ваш доÑтуп к +Ñлужбам GOG или контенту GOG, мы предпримем разумные меры, чтобы ÑвÑзатьÑÑ Ñ +вами и объÑÑнить, почему мы так поÑтупили и что вы можете Ñделать в результате +Ñтого (еÑли вообще можете). + + + + +17.3. Это выглÑдит маловероÑтным, но еÑли мы примем решение о прекращении +обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ (не в ÑвÑзи Ñ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ нарушениÑми Ñтого договора), мы поÑтараемÑÑ +извеÑтить Ð²Ð°Ñ Ð¾Ð± Ñтом как минимум за 60 дней путем публикации ÑоответÑтвующей +информации на Ñайте GOG.COM и путем отправки ÑоответÑтвующего Ñлектронного +пиÑьма вÑем зарегиÑтрированным пользователÑм. ПоÑле Ñтого у Ð²Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ 60 дней +на то, чтобы Ñкачать веÑÑŒ приобретенный ранее контент. + +## 18\. ФОРС-МÐЖОРÐЫЕ ОБСТОЯТЕЛЬСТВР+ + + +18.1. Ðикто из Ð½Ð°Ñ Ð¸Ð»Ð¸ Ð²Ð°Ñ Ð½Ðµ будет неÑти ответÑтвенноÑть за неиÑполнение +обÑзательÑтв по Ñтому Соглашению, или за непредоÑтавление доÑтупа к УÑлугам и +материалам GOG, еÑли Ñто вызвано непредвиденными обÑтоÑтельÑтвами, +находÑщимиÑÑ Ð²Ð½Ðµ нашего разумного контролÑ, включаÑ, помимо прочего, +прекращение доÑтупа к интернету, Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ ÑвÑзи, пожары, наводнениÑ, военные +дейÑÑ‚Ð²Ð¸Ñ Ð¸ другие форÑ-мажорные обÑтоÑтельÑтва. + +## 19\. ПРИМЕÐИМОЕ ЗÐКОÐОДÐТЕЛЬСТВО + +Ð”Ð»Ñ Ñ€ÐµÐ·Ð¸Ð´ÐµÐ½Ñ‚Ð¾Ð² Ñтран ЕС и других Ñтран мира (за иÑключением СШÐ): + + + +19.1. Мы Ñ Ð²Ð°Ð¼Ð¸ ÑоглашаемÑÑ Ð² том, что ваше иÑпользование УÑлуг и материалов +GOG в рамках Ñтого Ð¡Ð¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ³ÑƒÐ»Ð¸Ñ€ÑƒÐµÑ‚ÑÑ Ð·Ð°ÐºÐ¾Ð½Ð¾Ð´Ð°Ñ‚ÐµÐ»ÑŒÑтвом РеÑпублики +Польши, и что любые Ñпоры, вытекающие из Ñтого СоглашениÑ, решаютÑÑ +иÑключительно в Ñудах РеÑпублики Польши. Ð’ любых Ñудебных иÑках по Ñтому +Соглашению Ð²Ñ‹Ð¸Ð³Ñ€Ð°Ð²ÑˆÐ°Ñ Ñторона получает право на возмещение Ñудебных раÑходов. + + + +19.2. Вышеприведенный выбор регулирующего законодательÑтва и юриÑдикции +подлежит любым мандатно применимым принципам защиты интереÑов потребителей или +другого закона в вашей юриÑдикции по меÑту жительÑтва, который в противном +Ñлучае не был бы доÑтупен. + + + +Только Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ из СШÐ: + + + +19.3. Мы Ñ Ð²Ð°Ð¼Ð¸ ÑоглашаемÑÑ Ð² том, что ваше иÑпользование УÑлуг и материалов +GOG в рамках Ñтого Ð¡Ð¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ ÑчитаетÑÑ Ð²Ñтупившим в Ñилу в Ð›Ð¾Ñ ÐнджелеÑе, +штат КалифорниÑ, и регулируетÑÑ Ð·Ð°ÐºÐ¾Ð½Ð¾Ð´Ð°Ñ‚ÐµÐ»ÑŒÑтво штата ÐšÐ°Ð»Ð¸Ñ„Ð¾Ñ€Ð½Ð¸Ñ Ð¡Ð¾ÐµÐ´Ð¸Ð½Ñ‘Ð½Ð½Ñ‹Ñ… +Штатов Ðмерики (и, наÑколько Ñто применимо, федеральным законодательÑтвом +СШÐ). Любые ваши иÑки против GOG раÑÑматриваютÑÑ Ð¸Ñключительно в федеральных +Ñудах или Ñудах штата в Ð›Ð¾Ñ ÐнджелеÑе, штат КалифорниÑ, имеющих иÑключительную +юриÑдикцию в отношении разноглаÑий между вами и нами, и, Ñледовательно, мы и +вы ÑоглашаемÑÑ Ð½Ð° иÑключительную юриÑдикцию Ñтих Ñудов. Ð’ любых Ñудебных иÑках +по Ñтому Соглашению Ð²Ñ‹Ð¸Ð³Ñ€Ð°Ð²ÑˆÐ°Ñ Ñторона получает право на возмещение Ñудебных +раÑходов. + +## 20.ПОДДЕРЖКРПОЛЬЗОВÐТЕЛЕЙ И РÐЗРЕШЕÐИЕ СПОРОВ + +20.1 ЕÑли у Ð²Ð°Ñ ÐµÑть проблемы, претензии или вопроÑÑ‹ к нам, мы надеемÑÑ, что +мы Ñможем их быÑтро и дружно разрешить +на[Ñтранице](https://support.gog.com/hc/requests/new). Мы предпримем разумные +и доброÑовеÑтные уÑÐ¸Ð»Ð¸Ñ Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ Ñпора между нами вне юридичеÑкой +Ñреды. Мы обÑзуемÑÑ Ð¾Ñ‚Ð²ÐµÑ‡Ð°Ñ‚ÑŒ на любые претензии в течение 14 дней. + + + +20.2. ЕÑли за Ñто Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð° не будет решена, дальнейшие дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°Ð²Ð¸ÑÑÑ‚ +от того, где вы живете. ЕÑли вы проживаете на территории ЕС, вы можете +направить Ñвои юридичеÑкие претензии в онлайн-платформу Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñпоров, +управлÑемую и предоÑтавлÑемую ЕвропейÑкой комиÑÑией, доÑтуп к которой можно +получить по адреÑу, чтобы доÑтичь +внеÑудебного ÑƒÑ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ инициировать Ñудебный процеÑÑ. Ð’Ñ‹ также можете +разрешить Ñвой Ñпор через любой орган внеÑудебного ÑƒÑ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñпоров, +Ñертифицированный координатором цифровых уÑлуг вашей Ñтраны. + + + +20.3. ЕÑли вы живете в СШРили оÑтальном мире (но не в ЕС), пожалуйÑта, +ÑвÑжитеÑÑŒ Ñ Ð½Ð°Ð¼Ð¸ по Ñлектронной почте legal@GOG.COM. + +## 21\. ДРУГИЕ ЮРИДИЧЕСКИЕ ВОПРОСЫ + +21.1. ЕÑли какаÑ-либо чаÑть Ñтого Ð¡Ð¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ признана юридичеÑки +недейÑтвительной, то Ñто не повлиÑет на вÑе оÑтальные его чаÑти. + + + +21.2 ÐаÑтоÑщее Соглашение (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð»ÑŽÐ±Ñ‹Ðµ дополнительные уÑÐ»Ð¾Ð²Ð¸Ñ GOG, +упомÑнутые в нем) предÑтавлÑет Ñобой полное Ñоглашение между вами и нами и +заменÑет Ñобой любые предыдущие уÑтные или пиÑьменные ÑоглашениÑ. ЕÑли вы не +ÑоглаÑны Ñ Ñтим, пожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð½Ð°Ð¼Ð¸ как можно Ñкорее поÑле начала +иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÑлуг GOG по адреÑу legal@gog.com, поÑкольку в противном Ñлучае +Ñто будет обÑзательным Ð´Ð»Ñ Ð²Ð°Ñ Ð¿Ð¾ иÑтечении обуÑловленного периода времени +(обычно 30 дней). + + + +21.3. Это Соглашение регулирует Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ вами и нами. Оно не Ñоздаёт +никаких прав ни Ð´Ð»Ñ ÐºÐ¾Ð³Ð¾ другого. + + + +21.4. Имейте в виду, что мы подчинÑемÑÑ Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñм различных законов, и что +от Ð½Ð°Ñ Ð¼Ð¾Ð³ÑƒÑ‚ потребовать иÑполнить закон, решение Ñуда или другое юридичеÑкое +раÑпорÑжение. + + + +21.5. Ð’ Ñлучае реорганизации, продажи или ÑлиÑÐ½Ð¸Ñ GOG.COM нам, возможно, +потребуетÑÑ Ñотрудничать Ñ ÑоответÑтвующими третьими Ñторонами Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ +или Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи GOG. + + + +21.6. Мы ÑоглашаемÑÑ Ñ Ñ‚ÐµÐ¼, что ÐšÐ¾Ð½Ð²ÐµÐ½Ñ†Ð¸Ñ ÐžÐžÐ Ð¾ договорах международной купли- +продажи товаров не применима к данному Соглашению. + + + +21.7. Мы вправе передать или передоверить Ñто Соглашение третьей Ñтороне или +любому другому члену нашей группы, еÑли Ñто окажетÑÑ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ð¼ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ +GOG, а также в ходе реорганизации, ÑлиÑÐ½Ð¸Ñ Ð¸Ð»Ð¸ по любым другим деловым +причинам. ЕÑли подобное ÑлучитÑÑ, мы Ð²Ð°Ñ Ð¾Ð¿Ð¾Ð²ÐµÑтим. + + + +21.8 ЕÑли вы ÑвлÑетеÑÑŒ гражданином ЕвропейÑкого Союза, то имейте в виду, что +GOG позволÑет портировать между границами беÑплатный и платный контент в +ÑоответÑтвии Ñ Ð ÐµÐ³Ð»Ð°Ð¼ÐµÐ½Ñ‚Ð¾Ð¼ (ЕС) 2017/1128 ЕвропейÑкого парламента и Совета от +14 Ð¸ÑŽÐ½Ñ 2017 года на транÑграничную мобильноÑть ÑервиÑов Ñ Ð¾Ð½Ð»Ð°Ð¹Ð½ материалами +на внутреннем рынке. Ðо Ñто отноÑитÑÑ Ðº любым иным требованиÑм +законодательÑтва на GOG, в том чиÑле каÑающихÑÑ Ð¾Ñ…Ñ€Ð°Ð½Ñ‹ IP, а также может быть +предметом каких-либо требований Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð² и издателей-партнеров GOG. + +## 22\. ИЗМЕÐЕÐИЯ Ð’ ЭТОМ СОГЛÐШЕÐИИ + +22.1 Мы можем изменить наÑтоÑщее Соглашение, еÑли Ñочтем Ñто необходимым, +например, по юридичеÑким причинам или Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в уÑлугах GOG +или контенте GOG. Ð’ Ñтом Ñлучае мы размеÑтим измененное Соглашение в Интернете +по адреÑу [ https://support.gog.com/hc/articles/212632089 +](https://support.gog.com/hc/articles/212632089) и (еÑли у Ð²Ð°Ñ ÐµÑть ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ +запиÑÑŒ GOG) Ñообщим вам по Ñлектронной почте о любых ÑущеÑтвенных изменениÑÑ…. + + + + +22.2. ПоÑле того как мы внеÑём Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Соглашение, оно Ñтанет Ð´Ð»Ñ Ð²Ð°Ñ +юридичеÑки обÑзательным через 30 дней поÑле публикации. Ð’ течение Ñтого +периода вы можете ÑвÑзатьÑÑ Ñ Ð½Ð°Ð¼Ð¸ по адреÑу legal@GOG.COM еÑли у Ð²Ð°Ñ ÐµÑть +конкретные вопроÑÑ‹ по поводу изменений. + + + +22.3. ЕÑли вы не ÑоглаÑны Ñ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ изменениÑми (вне завиÑимоÑти от того, +напиÑали ли вы нам или нет), то, к Ñожалению, мы должны попроÑить Ð²Ð°Ñ +прекратить пользоватьÑÑ Ð£Ñлугами и материалами GOG. Конечно, нам жаль Ñто +признавать, но, надеемÑÑ, вы поймёте, что Ð´Ð»Ñ Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ‰ÐµÐ¹ работы ÑервиÑов GOG +необходимо, чтобы вÑе пользователи придерживалиÑÑŒ одних и тех же, а не разных +правил. Вот почему мы Ñоветуем вам обращатьÑÑ Ðº нам, еÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑƒÑ‚ +вопроÑÑ‹. + + + +22.4. К вашему Ñведению, мы никогда не внеÑём в Ñто Соглашение кучу изменений, +предварительно не Ñказав вам, в чём они заключаютÑÑ, и не будем заÑтавлÑть Ð²Ð°Ñ +ÑоглашатьÑÑ Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñми, еÑли вы не понимаете их, до того как вы Ñможете +пользоватьÑÑ ÑервиÑами GOG! + +23.1. ЕÑли у Ð²Ð°Ñ ÐµÑть какие-либо жалобы, каÑающиеÑÑ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð° GOG, уÑлуг GOG +или проÑто вы хотите ÑвÑзатьÑÑ Ñ Ð½Ð°Ð¼Ð¸, вот наши контактные данные: + + + +Ðазвание: GOG sp. z o.o. + + + +ЮридичеÑкий адреÑ: Ул. ЯгеллонÑÐºÐ°Ñ 74, 03-301 Варшава, Польша + +ЗарегиÑтрировано в Окружном Ñуде Варшавы, 14-й коммерчеÑкий отдел +Ðационального Ñудебного рееÑтра. + + + +РегиÑтрационный номер 0000029514 + + + +Ðалоговый номер Идентификатор ÐДС (ÐИП) ПЛ 113-21-77-807 + + + +УÑтавный капитал: 135.750,00 PLN + + + +Ð•Ð´Ð¸Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° контакта Ð´Ð»Ñ Ð²Ð»Ð°Ñтей: + +ЮридичеÑÐºÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° GOG + +legal@gog.com + +Языки, на которых мы общаемÑÑ: ÐнглийÑкий, польÑкий + + + +Ð•Ð´Ð¸Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° контакта Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»ÐµÐ¹ уÑлуг GOG: + +Служба поддержки GOG + +support@gog.com + +Ð’ оÑновном мы говорим на английÑком и польÑком, но поÑтараемÑÑ Ð¿Ð¾Ð¼Ð¾Ñ‡ÑŒ вам на +любом Ñзыке, на котором доÑтупен GOG. + + + +ПоÑледнее обновление (дата вÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð² Ñилу): 17 Ñ„ÐµÐ²Ñ€Ð°Ð»Ñ 2024 года + + + +ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ +находитÑÑ[здеÑÑŒ](https://support.gog.com/hc/articles/212632089). + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/serpentisle/tmp/EULA_zh-Hans.txt b/info.exult.exult/data/serpentisle/tmp/EULA_zh-Hans.txt new file mode 100644 index 0000000..f6ee049 --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/EULA_zh-Hans.txt @@ -0,0 +1,1340 @@ +ELECTRONIC ARTS +SOFTWARE END USER LICENSE AGREEMENT + +This End User License Agreement (oLicenseo) is an agreement between you and +Electronic Arts Inc., its subsidiaries and affiliates (oEAo). This License +governs your use of this software product and all related documentation, and +updates and upgrades that replace or supplement the software in any respect +and which are not distributed with a separate license (collectively, the +"Software"). This Software is licensed to you, not sold. + +By installing or using the Software, you agree to the terms of this License +and agree to be bound by it. Section 3 below describes the data EA may use to +provide services and support to you in connection with the Software. If you do +not agree to this use of data, do not install or use the Software. IF YOU +INSTALL THE SOFTWARE, THE TERMS AND CONDITIONS OF THIS LICENSE ARE FULLY +ACCEPTED BY YOU. If you do not agree to the terms of this License, then do not +install or use the Software. + +1\. Limited License Grant and Terms of Use. + +A. Grant. Through this purchase, you are acquiring and EA grants you a +personal, limited, non-exclusive license to install and use the Software for +your non-commercial use solely as set forth in this License and the +accompanying documentation. Your acquired rights are subject to your +compliance with this Agreement. Any commercial use is prohibited. You are +expressly prohibited from sub-licensing, renting, leasing or otherwise +distributing the Software or rights to use the Software. The term of your +License shall commence on the date that you install or otherwise use the +Software, and shall end on the earlier of the date that you dispose of or +transfer the Software; or EA's termination of this License. Your license will +terminate immediately if you attempt to circumvent the technical protection +measures for the Software. A separate Terms of Service agreement governs your +use of online services in connection with the Software. You may view the Terms +of Service agreement at http://terms.ea.com. + +B. Access to Software, Online Features And/Or Services. An EA/Origin Account, +including the acceptance of EAĺs online Terms of Service and Privacy Policy +(available at www.ea.com), the installation of Origin client application +(www.origin/about.com) (or superceding download management software) as well +as acceptance of the Origin (or superceding download management software) End +User License Agreement, may be required to access the Software, online +services and/or features and to download and apply Software updates and +patches (if any). Only licensed software can be used to access online services +and/or features (if any), including downloadable content, and access to such +features is limited to you and your immediately family or members of your +household. + +C. Further Restrictions. Your right to use the Software is limited to the +license grant above, and you may not otherwise copy, display, seek to disable, +distribute, perform, publish, modify, create works from, or use the Software +or any component of it, except as expressly authorized by EA. Unless expressly +authorized by EA, you are prohibited from making a copy of the Software +available on a network where it could be used by multiple users. You are +prohibited from making the Software available over a network where it could be +downloaded by multiple users. You may not remove or alter EAĺs trademarks or +logos, or legal notices included in the Software or related assets. + +D. Reservation of Rights. You have obtained a license to the Software and your +rights are subject to this License. Except as expressly licensed to you +herein, EA reserves all right, title and interest in the Software (including +all characters, storyline, images, photographs, animations, video, music, +text), and all associated copyrights, trademarks, and other intellectual +property rights therein. This License is limited to the intellectual property +rights of EA and its licensors in the Software and does not include any rights +to other patents or intellectual property. Except to the extent permitted +under applicable law, you may not decompile, disassemble, or reverse engineer +the Software, or any component thereof, by any means whatsoever. You may not +remove, alter, or obscure any product identification, copyright, or other +intellectual property notices in the Software. All rights not expressly +granted herein are reserved by EA. + +E. Your Contributions. In exchange for use of the Software, and to the extent +that your contributions through use of the Software give rise to any copyright +interest, you hereby grant EA an exclusive, perpetual, irrevocable, fully +transferable and sub-licensable worldwide right and license to use your +contributions in any way and for any purpose in connection with the Software +and related goods and services including the rights to reproduce, copy, adapt, +modify, perform, display, publish, broadcast, transmit, or otherwise +communicate to the public by any means whether now known or unknown and +distribute your contributions without any further notice or compensation to +you of any kind for the whole duration of protection granted to intellectual +property rights by applicable laws and international conventions. You hereby +waive any moral rights of paternity, publication, reputation, or attribution +with respect to EAĺs and other playersĺ use and enjoyment of such assets in +connection with the Software and related goods and services under applicable +law. The license grant to EA, and the above waiver of any applicable moral +rights, survives any termination of this License. + +2\. Consent to Use of Data. When you play this game offline, EA and its +affiliates may collect and store non-personally identifiable data including +your Internet Protocol Address as well as game play and software usage +statistics. If and when you access online features and/or services (if any), +this data may be transmitted to EA. EA may use this information to improve our +products and services and may share anonymous data with third parties. + +To facilitate Technical Protection Measures (if any), the provision of +software updates, any dynamically served content, product support and other +services to you, including marketing, advertising and online play (if any), +you agree that EA and its affiliates may collect, use, store and transmit +technical and related information that identifies your computer (including an +Internet Protocol Address and hardware identification), operating system and +application software and peripheral hardware. EA and its affiliates may also +use this information in the aggregate, in a form which does not personally +identify you, to improve our products and services and we may share anonymous +data with our third party service providers. + +All data is collected, used, stored and transmitted in accordance with EAĺs +Privacy Policy located at http://privacy.ea.com. To the extent that anything +in this section conflicts with the terms of EAĺs Privacy Policy, the terms of +the Privacy Policy shall control. + +3\. Consent to Public Display of Data. If you participate in online services, +such as online play or the downloading and uploading of content, EA and its +affiliates may also collect, use, store, transmit and publicly display +statistical data regarding game play (including scores, rankings and +achievements), or identify content that is created and shared by you with +other players. Data that personally identifies you is collected, used, stored +and transmitted in accordance with EAĺs Privacy Policy located at www.ea.com. + +4\. Termination. This License is effective until terminated. Your rights under +this License will terminate immediately and automatically without any notice +from EA if you fail to comply with any of the terms and conditions of this +License. Promptly upon termination, you must cease all use of the Software and +destroy all copies of the Software in your possession or control. Termination +will not limit any of EAĺs other rights or remedies at law or in equity. +Sections 4 - 13 of this License shall survive termination or expiration of +this License for any reason. + +5\. Disclaimer of Warranties. TO THE FULLEST EXTENT PERMISSIBLE UNDER +APPLICABLE LAW, THE SOFTWARE IS PROVIDED TO YOU oAS IS,o WITH ALL FAULTS, +WITHOUT WARRANTY OF ANY KIND, WITHOUT PERFORMANCE ASSURANCES OR GUARANTEES OF +ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF SATISFACTORY +QUALITY AND PERFORMANCE RESIDES WITH YOU. EA AND EAĺS LICENSORS (COLLECTIVELY +oEAo FOR PURPOSES OF THIS SECTION AND SECTION 7) DO NOT MAKE, AND HEREBY +DISCLAIM, ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING +IMPLIED WARRANTIES OF CONDITION, UNINTERRUPTED USE, MERCHANTABILITY, +SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF +THIRD PARTY RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, +USAGE, OR TRADE PRACTICE. EA DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE SOFTWARE; THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS; THAT +OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE +SOFTWARE WILL INTEROPERATE OR BE COMPATIBLE WITH ANY OTHER SOFTWARE OR THAT +ANY ERRORS IN THE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN ADVICE +PROVIDED BY EA OR ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME +JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED +WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A +CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY NOT APPLY +TO YOU. + +6\. Limitation of Liability. TO THE FULLEST EXTENT PERMISSIBLE BY APPLICABLE +LAW, IN NO EVENT SHALL EA, ITS SUBSIDIARIES OR ITS AFFILIATES BE LIABLE TO YOU +FOR ANY PERSONAL INJURY, PROPERTY DAMAGE, LOST PROFITS, COST OF SUBSTITUTE +GOODS OR SERVICES, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION OR ANY OTHER FORM OF DIRECT OR INDIRECT, SPECIAL, +INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES FROM ANY CAUSES OF ACTION +ARISING OUT OF OR RELATED TO THIS LICENSE OR THE SOFTWARE, WHETHER ARISING IN +TORT (INCLUDING NEGLIGENCE), CONTRACT, STRICT LIABILITY OR OTHERWISE, WHETHER +OR NOT EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOME +JURISDICTIONS DO NOT ALLOW A LIMITATION OF LIABILITY FOR DEATH, PERSONAL +INJURY, FRAUDULENT MISREPRESENTATIONS OR CERTAIN INTENTIONAL OR NEGLIGENT +ACTS, OR VIOLATION OF SPECIFIC STATUTES, OR THE LIMITATION OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO SOME OR ALL OF THE ABOVE LIMITATIONS OF LIABILITY +MAY NOT APPLY TO YOU. In no event shall EAĺs total liability to you for all +damages (except as required by applicable law) exceed the amount actually paid +by you for the Software. + +7\. Limitation of Liability and Disclaimer of Warranties are Material Terms of +this License. You agree that the provisions in this License that limit +liability are essential terms of this License. The foregoing limitations of +liability apply even if the above stated remedy under the Limited Warranty for +Recording Media fails in its essential purpose. + +8\. Severability and Survival. If any provision of this License is illegal or +unenforceable under applicable law, the remainder of the provision shall be +amended to achieve as closely as possible the effect of the original term and +all other provisions of this License shall continue in full force and effect. + +9\. U.S. Government Restricted Rights. If you are a government end user, then +this provision applies to you. The Software provided in connection with this +License has been developed entirely at private expense, as defined in FAR +section 2.101, DFARS section 252.227-7014(a)(1) and DFARS section 252.227-7015 +(or any equivalent or subsequent agency regulation thereof), and is provided +as ocommercial items,o ocommercial computer softwareo and/or ocommercial +computer software documentation.o Consistent with DFARS section 227.7202 and +FAR section 12.212, and to the extent required under U.S. federal law, the +minimum restricted rights as set forth in FAR section 52.227-19 (or any +equivalent or subsequent agency regulation thereof), any use, modification, +reproduction, release, performance, display, disclosure or distribution +thereof by or for the U.S. Government shall be governed solely by this License +and shall be prohibited except to the extent expressly permitted by this +License. + +10\. Injunctive Relief. You agree that a breach of this License will cause +irreparable injury to EA for which monetary damages would not be an adequate +remedy and EA shall be entitled to seek equitable relief in addition to any +remedies it may have hereunder or at law without a bond, other security or +proof of damages. + +11\. Governing Law. If you reside in a Member State of the European Union: (i) +the laws of England, excluding its conflicts-of-law rules, govern this License +and your use of the Application; and (ii) you expressly agree that exclusive +jurisdiction for any claim or action arising out of or relating to this +License and/or your use of the Application shall be the Courts of England, and +you expressly consent to the exercise of personal jurisdiction of such courts. +If you reside elsewhere: (i) the laws of the State of California, excluding +its conflicts-of-law rules, govern this License and/or your use of the +Application; and (ii) you expressly agree that for claims and disputes not +subject to section 14, below, exclusive jurisdiction for any claim or action +arising out of or relating to this License and/or your use of the Application +shall be the federal or state courts that govern San Mateo County, California, +and you expressly consent to the exercise of personal jurisdiction of such +courts. Please note that your conduct may also be subject to other local, +state, national, and international laws. The parties agree that the UN +Convention on Contracts for the International Sale of Goods (Vienna, 1980) +shall not apply to this License or to any dispute or transaction arising out +of this License. + +12\. Export. You agree to abide by U.S. and other applicable export control +laws and agree not to transfer the Software to a foreign national, or national +destination, which is prohibited by such laws, without first obtaining, and +then complying with, any requisite government authorization. You certify that +you are not a person with whom EA is prohibited from transacting business +under applicable law. + +13\. Entire Agreement. This License constitutes the entire agreement between +you and EA with respect to the Software and supersedes all prior or +contemporaneous understandings regarding such subject matter. No amendment to +or modification of this License will be binding unless made in writing and +signed by EA. No failure to exercise, and no delay in exercising, on the part +of either party, any right or any power hereunder shall operate as a waiver +thereof, nor shall any single or partial exercise of any right or power +hereunder preclude further exercise of any other right hereunder. In the event +of a conflict between this License and any applicable purchase or other terms, +the terms of this License shall govern. + +14\. Dispute Resolution By Binding Arbitration. +PLEASE READ THIS CAREFULLY. IT AFFECTS YOUR RIGHTS. +A. Most of your concerns can be resolved quickly and to your satisfaction by +logging into the EA customer support interface with your Account at +http://support.ea.com/. In the unlikely event that EA cannot resolve a concern +to your satisfaction (or if EA cannot resolve a concern it has with you after +attempting to do so informally), then you and EA agree to be bound by the +following procedure to resolve any and all disputes between us. This provision +applies to all consumers to the fullest extent allowable by law, but expressly +excludes residents of Quebec, Russia and the Member States of the European +Union. This agreement is intended to be interpreted broadly. It covers any and +all disputes between us (oDisputeso), including without limitation: +(a) claims arising out of or relating to any aspect of the relationship +between us, whether based in contract, tort, statute, fraud, misrepresentation +or any other legal theory; +(b) claims that arose before this Agreement or any prior agreement (including, +but not limited to, claims relating to advertising); +(c) claims that are currently the subject of purported class action litigation +in which you are not a member of a certified class; and +(d) claims that may arise after the termination of this Agreement. +The only disputes that are not covered by this Section are the following: +1) a claim to enforce or protect, or concerning the validity of, any of your +or EAĺs (or any of EAĺs licensorsĺ) intellectual property rights; +2) a claim related to, or arising from, allegations of theft, piracy, or +unauthorized use; +3) In addition, nothing in this Agreement shall prevent either party from +initiating a small claims court action. +By entering into this Agreement, you and EA expressly waive the right to a +trial by jury or to participate in a class action. With respect to this +Section 16, References to "EA," "you," and "us" include our respective +subsidiaries, affiliates, agents, employees, predecessors in interest, +successors, and assigns, as well as all authorized or unauthorized users or +beneficiaries of services or Software under this or prior agreements between +us. This EULA evidences a transaction in interstate commerce, and thus the +Federal Arbitration Act governs the interpretation and enforcement of this +Section. This arbitration provision shall survive termination of this EULA. +B. Informal Negotiations/Notice of Dispute. You and EA agree to first attempt +to resolve any Dispute informally before initiating arbitration. Such +negotiations commence upon receipt of written notice from one person to the +other (oNotice of Disputeo). Notices of Dispute must: (a) include the full +name and contact information of the complaining party; (b) describe the nature +and basis of the claim or dispute; and (c) set forth the specific relief +sought ("Demand"). EA will send its Notice of Dispute to your billing address +(if you provided it to us) or to the email address you provided to us. You +will send your Notice of Dispute to: Electronic Arts Inc., 209 Redwood Shores +Parkway, Redwood City CA 94065, ATTENTION: Legal Department. +C. Binding Arbitration. If you and EA are unable to resolve a Dispute through +informal negotiations within 30 days after receipt of the Notice of Dispute, +either you or EA may elect to have the Dispute finally and exclusively +resolved by binding arbitration. Any election to arbitrate by one party shall +be final and binding on the other. YOU UNDERSTAND THAT ABSENT THIS PROVISION, +YOU WOULD HAVE THE RIGHT TO SUE IN COURT AND HAVE A JURY TRIAL. The +arbitration shall be commenced and conducted under the Commercial Arbitration +Rules of the American Arbitration Association (oAAAo) and, where appropriate, +the AAAĺs Supplementary Procedures for Consumer Related Disputes (oAAA +Consumer Ruleso), both of which are available at the AAA website www.adr.org. +Your arbitration fees and your share of arbitrator compensation shall be +governed by the AAA Rules and, where appropriate, limited by the AAA Consumer +Rules. If such costs are determined by the arbitrator to be excessive, or if +you send EA a notice to the Notice of Dispute address above indicating that +you are unable to pay the fees required to initiate an arbitration, then EA +will promptly pay all arbitration fees and expenses. The arbitration may be +conducted in person, through the submission of documents, by phone or online. +The arbitrator shall make a decision in writing, and shall provide a statement +of reasons if requested by either party. The arbitrator must follow applicable +law, and any award may be challenged if the arbitrator fails to do so. You and +EA may litigate in court to compel arbitration, to stay proceeding pending +arbitration, or to confirm, modify, vacate or enter judgment on the award +entered by the arbitrator. +D. Restrictions. You and EA agree that any arbitration shall be limited to the +Dispute between EA and you individually. To the full extent permitted by law: +(a) no arbitration shall be joined with any other arbitration proceeding; (b) +there is no right or authority for any Dispute to be arbitrated on a class +action-basis or to utilize class action procedures; and (c) there is no right +or authority for any Dispute to be brought in a purported representative +capacity on behalf of the general public or any other persons. YOU AND EA +AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS +INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED +CLASS OR REPRESENTATIVE PROCEEDING. Further, unless both you and EA agree +otherwise, the arbitrator may not consolidate more than one person's claims, +and may not otherwise preside over any form of a representative or class +proceeding. If this specific provision is found to be unenforceable, then the +entirety of this dispute resolution/arbitration provision shall be null and +void. +E. Location. If you are a resident of the United States, arbitration will take +place at any reasonable location convenient for you. For residents outside the +United States, arbitration shall be initiated in the County of San Mateo, +State of California, United States of America, and you and EA agree to submit +to the personal jurisdiction of that court, in order to compel arbitration, to +stay proceeding pending arbitration, or to confirm, modify, vacate or enter +judgment on the award entered by the arbitrator. +F. Recovery and Attorneysĺ Fees. If the arbitrator rules in your favor on the +merits of any claim you bring against EA and issues you an award that is +greater in monetary value than EA's last written settlement offer made before +final written submissions are made to the arbitrator, then EA will: +(a) Pay you 150% of your arbitration award, up to $5,000 over and above your +arbitration award; and +(b) Pay your attorney, if any, the amount of attorneys' fees, and reimburse +any expenses (including expert witness fees and costs) that you or your +attorney reasonably accrues for investigating, preparing, and pursuing your +claim in arbitration ("the attorney premium"). +The arbitrator may make rulings and resolve disputes as to the payment and +reimbursement of fees, expenses, and the alternative payment and the attorney +premium at any time during the proceeding and upon request from either party +made within fourteen (14) days of the arbitrator's ruling on the merits. +The right to attorneys' fees and expenses discussed above supplements any +right to attorneys' fees and expenses you may have under applicable law, +although you may not recover duplicative awards of attorneys' fees or costs. +EA waives any right it may have to seek an award of attorneysĺ fees and +expenses in connection with any arbitration between us. +G. Limitation on Arbitratorĺs Authority. The arbitrator may award declaratory +or injunctive relief only in favor of the individual party seeking relief and +only to the extent necessary to provide relief warranted by that party's +individual claim. +H. Changes to Agreement. Notwithstanding any provision in this Agreement to +the contrary, we agree that if EA makes any future change to this arbitration +provision (other than a change to the Notice of Dispute address), you may +reject any such change by sending us written notice within thirty (30) days of +the change to the Notice of Dispute address provided above. By rejecting any +future change, you are agreeing that you will arbitrate any dispute between us +in accordance with the language of this provision. + + + + +------------------------------- + + +GOG.COM用户åè®® + +## 1\. 本åè®® + +1.1 本å议是您(我们将进一步称您为“您†)与GOG sp. z o.o., JagielloÅ„ska 74, 03-301 Warsaw, +Poland (我们将进一步称自己为“GOGâ€æˆ–“我们†)之间的åˆåŒï¼Œé€‚用于www.GOG.COMã€æ‚¨çš„GOGç”¨æˆ·å¸æˆ·ã€GOG +GALAXY应用程åºï¼ˆåŒ…括GOG +GALAXYå•†åº—ï¼‰ã€æ‚¨é€šè¿‡æˆ‘ä»¬è´­ä¹°æˆ–è®¿é—®çš„ä»»ä½•æ¸¸æˆæˆ–视频或其他内容或æœåŠ¡ã€GOG网络论å›ã€GOG客户和技术支æŒä»¥åŠæˆ‘们呿‚¨æä¾›çš„å…¶ä»–æœåŠ¡ï¼ˆæˆ‘ä»¬ç®€ç§°ä¸ºâ€œGOGæœåŠ¡â€ +)。在这里,我们列出了您作为GOGæœåŠ¡æŽ¥å—者的æƒåˆ©å’Œä¹‰åŠ¡ã€‚ + + + +1.2. GOGæœåŠ¡å¯èƒ½é€‚ç”¨å…¶ä»–æ¡æ¬¾ï¼Œåœ¨è¿™ç§æƒ…况下,我们将å‘å¸ƒè¿™äº›æ¡æ¬¾ä»¥ä¾›æ‚¨æŽ¥å—。例如,如果您想使用GOG +GALAXY应用程åºï¼Œç›¸å…³æ¡æ¬¾å°†åœ¨æ‚¨å¼€å§‹ä½¿ç”¨è¿™äº›æœåС之å‰å‘布以供您接å—。 + + + +1.3 +此外,当我们谈论您å¯ä»¥é€šè¿‡GOGæœåŠ¡è´­ä¹°æˆ–è®¿é—®çš„æ¸¸æˆã€æ¸¸æˆå†…内容ã€è™šæ‹Ÿç‰©å“æˆ–è´§å¸æˆ–GOG视频或其他内容或æœåŠ¡æ—¶ï¼Œæˆ‘ä»¬åªä¼šå°†å…¶åˆ†åˆ«ç§°ä¸ºâ€œGOG游æˆâ€æˆ–“GOG视频†+,当我们谈论它们时,它们都是“GOG内容â€ã€‚ + + + +1.4 æˆ‘ä»¬ä¸æƒ³è®©è¿™ä»½æ–‡ä»¶å¤ªé•¿ï¼Œä½†è¯·è®°ä½ï¼ŒæŽ¥å—我们的用户å议,您也接å—: + + * 我们的[éšç§æ”¿ç­–](https://support.gog.com/hc/articles/212632109-Privacy-Policy?product=gog)-解释我们从您那里收集的数æ®ä»¥åŠæˆ‘ä»¬å¦‚ä½•ä¿æŠ¤è¿™äº›æ•°æ®ï¼Œ + + * [ GOG行为准则 ](https://support.gog.com/hc/articles/16033977811613) 是您作为我们社区的一部分需è¦éµå®ˆçš„一套规则, + + * [ 《侵æƒå†…å®¹å’Œç‰ˆæƒæ”¿ç­–》 ](https://support.gog.com/hc/articles/16033687971613) ,其中解释了您如何举报GOGä¸Šçš„éžæ³•内容以åŠä¸¾æŠ¥åŽä¼šå‘生什么情况。 + + + +1.5 GOG与å—信任的伙伴åˆä½œï¼ŒåŒ…括我们的关è”å…¬å¸CD PROJEKT S.A.ã€å¼€å‘商和å‘è¡Œå•†ã€æ”¯ä»˜ä¾›åº”商ã€å®¢æˆ·æœåŠ¡ 软件供应商等等( “ åˆä½œä¼™ä¼´â€ +)。在本å议的ç¨åŽéƒ¨åˆ† 详细介ç»ã€‚ + + + +1.6 如果您在18å²ä»¥ä¸Šï¼Œæ¬¢è¿Žåˆ°æ¥ï¼å¦‚果您的年龄在16å²åˆ°18å²ä¹‹é—´ï¼Œåœ¨æˆ‘们呿‚¨è‡´ä»¥åŒæ ·çƒ­çƒˆçš„æ¬¢è¿Žä¹‹å‰ï¼Œè¯·æ‚¨è®©æ‚¨çš„çˆ¶æ¯æˆ–ç›‘æŠ¤äººæŸ¥çœ‹å¹¶ä»£è¡¨æ‚¨åŒæ„本å议(因 +为在有的国家,在特定年龄下的人ä¸èƒ½ç­¾ç½²æœ¬å议这类åˆåŒï¼‰ã€‚如果您未满16å²ï¼Œæ‚¨ä¸èƒ½å–å¾—GOGè´¦å·å¹¶ä½¿ç”¨GOG +æœåŠ¡ï¼Œå› ä¸ºæˆ‘ä»¬åœ¨æ³•å¾‹ä¸Šæœªç»çˆ¶æ¯æˆ–ç›‘æŠ¤äººçš„ç‰¹åˆ«åŒæ„,ä¸å¾—处ç†å„¿ç«¥çš„个人数æ®ï¼ˆä½†æ¬¢è¿Žæ‚¨çš„父æ¯/ç›‘æŠ¤äººæ¥æ³¨å†Œï¼‰ã€‚ + +## 2\. 使用GOGæœåŠ¡å’ŒGOG内容 + +2.1 我们给与您和其他的GOG用户使用GOGæœåŠ¡ã€ä¸‹è½½è®¿é—®å’Œ/或 æµæ’­æ”¾ï¼ˆä¾å†…容而定)和使用GOG内容的个人æƒåˆ©ï¼ˆæ³•律上 称为“ 授æƒâ€ +)。此授æƒä»…陿‚¨ä¸ªäººä½¿ç”¨ã€‚我们å¯ä»¥å†æŸ äº›æƒ…å†µä¸‹åœæ­¢æˆ–æš‚åœæ­¤æŽˆæƒï¼Œè¯¦æƒ…ç¨åŽä»‹ç»ã€‚ + + + +2.2 当您购买, 访问或安装GOGæ¸¸æˆæ—¶ï¼Œæ‚¨å¯èƒ½éœ€è¦åŒæ„由游æˆå¼€ å‘商/å‘行商æå‡ºçš„å…¶ä»–å¥‘çº¦æ¡æ¬¾ï¼ˆä¾‹å¦‚,他们å¯èƒ½ä¼šè¦æ±‚ +æ‚¨åŒæ„一款游æˆä¸“属的最终用户å议)。如果这些最终用 户å议与本åè®®å‘生任何ä¸ä¸€è‡´æˆ–争议,那么以本å议为 准。 + + + +2.3 您å¯ä»¥ä½¿ç”¨GOG视频æœåŠ¡æµæ’­æ”¾å·²è´­ä¹°çš„视频内容,或 将其下载并以您希望的方å¼è§‚看。 + + + +2.4 我们鼓励您使用第三方脚本æ¥å‘挥GOG的全部功能 性,是å¦ä½¿ç”¨ç”±æ‚¨è‡ªè¡Œæ–Ÿé…Œï¼Œè€Œä¸”我们无法ä¿è¯è¿™äº›é¢å¤– 脚本的æœåŠ¡ç‰¹æ€§ã€‚ + + + +2.5 简è¦ä»‹ç»ä¸€ä¸‹GOG GALAXY +,这是我们的(å¯é€‰ï¼‰åº”用程åºï¼Œä¸ä»…å…许您购买和访问GOG内容,还æä¾›ç»Ÿä¸€æ¸¸æˆåº“ã€è·¨å¹³å°çš„æœ‹å‹åˆ—表ã€åœ¨çº¿å¤šäººæ¸¸æˆã€æˆå°±ã€è·¨å¹³å°èŠå¤©ã€æ¸¸æˆæ—¶é—´è·Ÿè¸ªã€äº‘ä¿å­˜å’Œæ¸¸æˆå åŠ ç­‰é…·ç‚«åŠŸèƒ½ã€‚æ‚¨å¯ä»¥åœ¨[此处](https://www.gog.com/galaxy)了解更多信æ¯ã€‚ + + + +2.6 +在GOGæœåŠ¡çš„æŸäº›éƒ¨åˆ†ï¼Œæˆ‘们使用推èç³»ç»Ÿå‘æ‚¨å±•示您最有å¯èƒ½æ„Ÿå…´è¶£çš„内容。您å¯ä»¥åœ¨[这里](https://support.gog.com/hc/articles/16034228157213)了解我们在哪里使用它们以åŠå®ƒä»¬çš„工作原ç†ï¼ŒåŒ…括我们使用的主è¦å‚数以åŠå¦‚何影å“它们。 + +## 3\. GOG账户 + +3.1 è‹¥è¦ä»ŽGOGæœåŠ¡è´­ä¹°GOG内容,或在æŸäº›æƒ…况下游玩/使 用我们的åˆä½œä¼™ä¼´è¦æ±‚使用GOG账户的GOGå†…å®¹æ—¶ï¼Œæ‚¨éœ€è¦ +首先创建一个GOG账户。其中包å«å¯†ç ï¼ˆå¯†ç æ˜¯åŠ å¯†çš„ï¼Œæˆ‘ 们无法得知)和用户å的创建,以åŠå‘我们æä¾›æ‚¨çš„ç”µå­ +邮件地å€ï¼ˆä¸ºäº†éªŒè¯èº«ä»½ç”¨ï¼‰ã€‚è¯·ç¡®ä¿æ‚¨çš„登录信æ¯å¾—以 妥善ä¿ç®¡ï¼Œä¸”您的账户得以åˆç†ä½¿ç”¨ã€‚在您的GOG账户设置 +里,您å¯ä»¥è‡ªè¡Œé€‰æ‹©è®¾ç½®æ‚¨çš„å±…ä½å›½å®¶ã€ç”Ÿæ—¥ã€ä»¥åŠå¤´åƒ 。我们的éšç§æ”¿ç­–详细的介ç»äº†æˆ‘ä»¬ä¼šä»Žæ‚¨å¤„æ”¶é›†çš„ä¿¡æ¯ +ï¼Œä»¥åŠæˆ‘ä»¬ä¼šå¦‚ä½•ä½¿ç”¨å¹¶ä¿æŠ¤è¿™äº›ä¿¡æ¯ã€‚您å¯ä»¥åœ¨[这里](https://support.gog.com/hc/articles/212632109-%20Privacy- +Policy%20)查看。 + + + +3.2 您å¯ä»¥ä½¿ç”¨æ‚¨çš„GOG账户建立一份å¯ç”±ä»–人查看的公开 档案。您还å¯ä»¥ä½¿ç”¨æ‚¨çš„GOG账户与其他的GOG用户进行交 +æµã€‚è¯·ç†æ™ºè¡Œäº‹ã€å¹¶ç‰¢è®°æ‚¨è¦å¯¹è‡ªå·±çš„行为负责。 + + + +3.3 +您的GOG叿ˆ·å’ŒGOG内容仅供您个人使用,ä¸å¾—与其他人共享ã€å‡ºå”®ã€èµ é€æˆ–转让。您对它们的访问和使用å—GOG[éšç§æ”¿ç­–](https://support.gog.com/hc/articles/212632109?product=gog)和行[为准则的约æŸï¼Œå¿…è¦æ—¶ä¼šå¯¹å…¶è¿›è¡Œ](https://support.gog.com/hc/articles/16033977811613)更新或修订。 + + + +3.4. 访问和使用从ä¸åŒå¹³å°è´­ä¹°çš„æ¸¸æˆï¼ˆå³æˆ‘们称之为“无钥匙访问†) +ï¼ŒåŒ…æ‹¬å…¶æœ€ä½Žç³»ç»Ÿè¦æ±‚,å—å„è‡ªçš„ç¬¬ä¸‰æ–¹å¹³å°æ”¿ç­–和(如适用)与游æˆå¼€å‘商/å‘行商的附加åˆåŒæ¡æ¬¾çš„约æŸï¼ˆä¾‹å¦‚,他们å¯èƒ½ä¼šè¦æ±‚æ‚¨åŒæ„特定游æˆçš„æœ€ç»ˆç”¨æˆ·è®¸å¯å议)。您å¯èƒ½éœ€è¦æ‹¥æœ‰ç¬¬ä¸‰æ–¹å¹³å°è´¦å·ã€‚这些平å°å¯èƒ½ä¼šä¸ºæ‚¨è´­ä¹°çš„æ¸¸æˆæŽ¨å‡ºè¡¥ä¸æˆ–更新。 + +## 4\. 系统需求 + +4.1 因为GOG会æä¾›ç»™æ‚¨åœ¨ä¸åŒæ—¶é—´é€šè¿‡ä¸åŒçš„å¹³å°å¼€å‘的许多ä¸åŒæœåŠ¡å’Œæ¸¸ æˆï¼Œæˆ‘们无法为所有的GOGæœåŠ¡æˆ–GOG内容给出一套统一的 系统需求。 + + + +4.2 我们能够告知您的是,使用任何的GOG游æˆéƒ½éœ€è¦å¸¦æœ‰é¼ æ ‡å’Œé”®ç›˜çš„ç”µè„‘ï¼ˆä¸æ”¯æŒè§¦å±ï¼‰ï¼Œå¹¶å®‰è£…了一套 +åˆé€‚çš„æ“作系统(请å‚阅相关的GOG产å“页é¢ï¼‰ï¼Œå¹¶å®‰è£…有 全部补ä¸åŒ…å’Œé‡è¦æ›´æ–°ã€‚所有的GOG游æˆéƒ½åº”该本地安装在 +æ»¡è¶³æˆ–è¶…è¿‡æœ€ä½Žç¡¬ä»¶å’Œè½¯ä»¶è§„æ ¼çš„ç”µè„‘ä¸Šã€‚è¿™äº›è§„æ ¼å‡æ˜¾ 示在相关的GOG产å“页é¢ä¸Šã€‚ GOG游æˆå¹¶æœªåœ¨è™šæ‹Ÿæœºè½¯ä»¶ä¸Š +è¿›è¡Œæµ‹è¯•ï¼Œå› æ­¤æˆ‘ä»¬å¹¶ä¸æ”¯æŒé€šè¿‡è™šæ‹Ÿæœºè½¯ä»¶è¿›è¡Œæ¸¸æˆã€‚ + + + +4.3 对于GOG视频æ¥è¯´ï¼Œè¯·ç¡®ä¿æ‚¨çš„视频播放器支æŒGOG产 å“页é¢ä¸Šé¢æŒ‡å‡ºçš„视频格å¼ã€‚ + + + +4.4 +如果您对系统需求有任何问题,请通过[这里](https://support.gog.com/hc/requests/new?category=info)è”系我们。还需说明,您需è¦è‡ªè¡Œç¡®ä¿æ‚¨çš„互è”网 +接入方å¼è¶³ä»¥ä¸‹è½½ä»Žæˆ‘们处购买的GOGæ¸¸æˆæˆ–GOGè§†é¢‘ã€æˆ– æµæ’­æ”¾GOGè§†é¢‘ï¼Œå¹¶ç¡®ä¿æ‚¨çš„系统å¯ä»¥è¿è¡ŒGOG游æˆåŠè§‚看 GOG视频。 + +## 5\. 测试版本 + +5.1 éšç€GOG的开å‘,我们å¯èƒ½ä¼šä¸ºæ‚¨æä¾›å¯¹GOG软件或æœåŠ¡çš„â€œæµ‹è¯•ç‰ˆâ€ ï¼ˆä¾‹å¦‚ï¼Œåœ¨ä¸€èˆ¬å‘å¸ƒä¹‹å‰æä¾›çš„æ–°ç‰ˆæœ¬çš„GOG +GALAXY应用程åºï¼‰æˆ–GOG内容的å¯é€‰è®¿é—®æƒé™ã€‚ + + + +规则如下: + + + +a) 我们(或任何适用的å‘行商/åˆä½œä¼™ä¼´ï¼‰ä¼šåˆ¶å®šæ‚¨çš„æµ‹è¯•æƒé™çš„æ¡ä»¶å’Œè¦æ±‚。æä¾›å’Œç»´æŠ¤æµ‹è¯•版本,以 åŠè°å¯ä»¥èŽ·å¾—æµ‹è¯•æƒé™ï¼Œå°†ç”±æˆ‘们自行决定。 + + + +b) 您å¯èƒ½éœ€è¦å…ˆå®Œæˆä¸€ç³»åˆ—æ³¨å†Œæ‰‹ç»­æˆ–å…¶ä»–è¦æ±‚æ‰èƒ½èŽ·å¾—æµ‹è¯•æƒé™ï¼ˆåŒ…æ‹¬æ‚¨ä¹Ÿèƒ½éœ€è¦æ»¡è¶³æŸäº›åˆæ ¼æ ‡å‡† )。 + + + +c) 测试æƒé™ä¼šæœ‰æ—¶é—´é™åˆ¶ï¼Œä¹Ÿå¯èƒ½ä¼šæ¶‰åŠå…¶ä»– çš„å¥‘çº¦è¦æ±‚。 + + + +d) 测试过程å¯èƒ½ä¼šåŒ…å«æš‚æ—¶çš„æˆ–永久的æœåС噍/ 进度/内容的清除ã€é‡ç½®ã€æˆ–修改。 + + + +e) 测试过程å¯èƒ½ä¼šå—到ä¿å¯†é™åˆ¶çš„约æŸï¼ˆè‹¥æœ‰ ,会æå‰å‘ŠçŸ¥æ‚¨ï¼‰ã€‚ + + + +f) 您å¯èƒ½ä¼šè¢«é‚€è¯·å°±æµ‹è¯•过程å‚与一个å馈的手续,这当然是éžå¼ºåˆ¶çš„,ä¸è¿‡æˆ‘们会éžå¸¸æ„Ÿè°¢æ‚¨ã€‚ + + + +g) 测试版仅供您个人使用和享å—,因此您ä¸å¾—将其出售ã€å‡ºå€Ÿæˆ–以其他方å¼è½¬è®©ç»™ä»»ä½•人。 + + + +h) 为您æä¾›æµ‹è¯•æƒé™çš„目的是为了让您å“鉴新内容,ä¸è¿‡æˆ‘ä»¬å¸Œæœ›æ‚¨èƒ½äº†è§£ï¼Œæµ‹è¯•ç‰ˆæœ¬å¹¶ä¸æ˜¯æœ€ç»ˆå®Œæˆ 的作å“。因此,测试版本将会以“ ä¸åŠ æ”¹å˜â€ çš„å½¢å¼æä¾› +给你,若其处于未完æˆçжæ€ã€æˆ–无法完整è¿è¡Œã€æˆ–导致任 何问题,我们ä¸ä½œå‡ºä»»ä½•ä¿è¯ï¼Œä¹Ÿä¸æ‰¿æ‹…任何责任。测试 +版本的功能å¯èƒ½ä¹Ÿä¸æ˜¯æœ€ç»ˆç‰ˆæœ¬ï¼Œåœ¨æµ‹è¯•期间å¯èƒ½ä¼šè¿›è¡ŒåŠŸèƒ½çš„æ›´æ”¹ã€è°ƒæ•´ã€æˆ–移除。 + + + +我们å¯èƒ½ä¼šä»¥æµ‹è¯•版/预å‘å¸ƒç‰ˆçš„å½¢å¼æä¾›å¯¹GOG内容的访问æƒé™ã€‚ +例如,å‘布者/åˆä½œä¼™ä¼´å¯èƒ½å†³å®šåœ¨æµ‹è¯•版中å‘å¸ƒæ¸¸æˆæˆ–部分游æˆï¼Œæˆ–者å¯ä»¥åŠ å…¥æˆ‘ä»¬çš„â€œå¼€å‘中游æˆâ€è®¡åˆ’(请å‚阅下é¢çš„第7.6-7.8节)。 +除éžç›¸å…³å‡ºç‰ˆå•†åˆ¶å®šå…¶è‡ªå·±çš„规则(优先于这些规则),å¦åˆ™ä»»ä½•此类GOG内容也将å—这些规则的约æŸã€‚ + +## 6\. 为GOG内容付费并获得退款 + +为GOG内容付费 + + + +6.1 在您决定喜欢GOG游æˆã€GOG视频或其他GOG内容åŽï¼Œæ‚¨é€šå¸¸éœ€è¦å…ˆä»˜è´¹æ‰èƒ½è®¿é—®å®ƒï¼ˆå°½ç®¡æˆ‘们也有一些å…è´¹å†…å®¹ï¼ ï¼‰ã€‚æ‚¨å¯ä»¥é€šè¿‡ä»¥ä¸‹ä¸åŒæ–¹å¼ä»˜æ¬¾ï¼š +(i)ä½¿ç”¨æœ‰æ•ˆçš„å€Ÿè®°å¡æˆ–信用å¡ï¼›æˆ–(ii)使用PayPalæˆ–ä»»ä½•å…¶ä»–æŽˆæƒæ”¯ä»˜æä¾›å•†ã€‚è¯·åŠ¡å¿…ç¡®ä¿æ‚¨çš„付款信æ¯å®‰å…¨ã€‚ + + + +6.2 +当您使用付款方å¼è´­ä¹°GOGå†…å®¹æ—¶ï¼Œæˆ‘ä»¬ä¿¡èµ–æ‚¨çš„æ‰¿è¯ºï¼Œå³æ‚¨å¯ä»¥ä½¿ç”¨è¯¥ä»˜æ¬¾æ–¹å¼ã€‚您对使用您的GOG叿ˆ·æˆ–付款方å¼è¿›è¡Œçš„ä»»ä½•è´­ä¹°è´Ÿè´£ï¼Œå¹¶åŒæ„在购买时通知您的适用定价ã€ä»˜æ¬¾å’Œè´¦å•æ”¿ç­–ã€‚é™¤éžæœ¬åè®®å¦æœ‰æ˜Žç¡®è§„定,å¦åˆ™æ‰€æœ‰ä»˜æ¬¾å‡ä¸å¯é€€è¿˜ä¸”ä¸å¯è½¬è®©ã€‚ + + + +6.3 +您å¯ä»¥ä½¿ç”¨ç¾Žå…ƒéšæ—¶ä¸ºGOG内容付费。ä¸è¿‡å¦‚果我们æ°å¥½æ”¯æŒæ‚¨å±…ä½å›½å®¶çš„当地货å¸ï¼Œï¼ˆè¯·å‚阅我们[这里](https://support.gog.com/hc/articles/212184449)了解详情),您也å¯ä»¥ä½¿ç”¨æ‚¨çš„当地货å¸è¿›è¡Œæ”¯ä»˜ +ã€‚å¦‚æžœæ‚¨ä¸æ˜¯ä½¿ç”¨æ‚¨çš„当地货å¸è¿›è¡Œæ”¯ä»˜ï¼Œæ‚¨å¯èƒ½ä¼šéœ€è¦é¢å¤–支付一笔货å¸å…‘æ¢è´¹ç”¨ï¼Œè€Œä¸”æŸäº›é“¶è¡Œä¹Ÿå¯èƒ½ä¼šé¢å¤–æ”¶å–其他的交易费用。 + + + +6.4. +æ‰€æœ‰ä»·æ ¼å‡æ˜¾ç¤ºåœ¨äº§å“目录页é¢ä¸­ã€‚它们包å«å¢žå€¼ç¨Žç­‰ç¨Žè´¹ï¼ˆå¦‚é€‚ç”¨ï¼‰ã€‚å¦‚æžœå½“åœ°æ³•å¾‹ï¼ˆä¾‹å¦‚ç¾Žå›½æˆ–åŠ æ‹¿å¤§çš„æ³•å¾‹ï¼‰è¦æ±‚,您还应该在结算时将一些销售税/增值税添加到您的价格中。 + + + +GOG钱包 + + + +6.5 GOGå‘用户æä¾›ä¸€ç§æ•°å­—账户余é¢åŠŸèƒ½ï¼Œç§°ä¸ºâ€œGOG钱包†+。该功能与您的用户账户相关è”,您å¯ä»¥ä½¿ç”¨è¯¥åŠŸèƒ½æ¥è´­ä¹°GOG内容。您å¯ä»¥é€šè¿‡ä¸¤ç§æ–¹å¼æ¥å‘其中充值: (i) 使用您所选择的支付方å¼ï¼›æˆ– (ii) +资金退款ä¿éšœï¼ˆè¯¦æƒ…è§ä¸‹æ–¹é€€æ¬¾åˆ°GOG钱包)。 GOG钱包的使用 å—到一些规则的管辖,这些规则在我们的GOG钱包页é¢ä¸­åˆ— +出(è§[这里](https://support.gog.com/hc/articles/360001941953))。 + + + +GOG奖励代ç å¥–åŠ±ä»£ç  + + + +6.6 +我们还会å‘è¡Œé™æ—¶å¥–励代ç ï¼Œè®©æ‚¨å…费或低价访问GOG内容(我们称之为“奖励代ç â€ï¼‰ã€‚如果你在购买GOG内容时收到了补å¿ç ï¼Œä¸è¿‡åœ¨ä¹‹åŽå†³å®šé€€å›žæ­¤GOGå†…å®¹ï¼Œé‚£ä¹ˆæˆ‘ä»¬è®¤ä¸ºå‘æ‚¨ç´¢å›žè¿™äº›è¡¥å¿ç æ˜¯å¾ˆåˆæƒ…åˆç†çš„。因此,我们会:终止其有效性,或者如果该补å¿ç å·²ç»ç”¨äºŽå…‘æ¢GOG游æˆï¼Œè¯¥æ¸¸æˆå°†ä¼šä»Žæ‚¨çš„账户中被删除。 + + + +直连账户分销 + + + +6.7 +我们的直连账户å‘布特色(我们将其称之为‘GOG直连账户’)在于,与我们有åˆä½œå…³ç³»çš„分销平å°å°†å¯ä»¥å‘æ‚¨å‡ºå”®æ¸¸æˆæˆ–其他内容,您在其平å°ä¸Šé€‰æ‹©çš„æ¸¸æˆ/内容将会自动在GOG账户中激活,ä¸éœ€è¦ä»»ä½•激活ç ã€‚需è¦è¯´æ˜Žçš„æ˜¯ï¼Œæ•´ä¸ªè´­ä¹°æµç¨‹ç”±å¹³å°å¤„ç†ï¼Œå› æ­¤å¦‚果购买æµç¨‹å‡ºçŽ°ä»»ä½•é—®é¢˜ï¼Œè¯·ç›´æŽ¥ä¸Žå¹³å°è”系。我们在下é¢çš„“退款与退货â€éƒ¨åˆ†è¯¦ç»†è§£é‡Šäº†è¿™ä¸€ç‚¹ã€‚当然,我们ä»å¯¹ä¸Žæˆ‘们平尿œåŠ¡æœ‰å…³çš„æ‰€æœ‰äº‹ç‰©è´Ÿè´£ã€‚ + +## 7.退款和退货 + +法定退款æƒåˆ© + + + +7.1. +å¦‚æžœæ‚¨æ˜¯æ¬§ç›Ÿæˆ–å…¶ä»–é€‚ç”¨å¸æ³•管辖区(ä¸åŒ…括美国)的居民,则您有法定æƒåˆ©åœ¨è´­ä¹°åŽ14天内退出购买GOG内容,而无需æä¾›ä»»ä½•ç†ç”±ã€‚è¦è¡Œä½¿æ’¤å›žæƒï¼Œæ‚¨åº”通过明确的声明(å‘é€è‡³support@GOG.COM的电å­é‚®ä»¶æˆ–以下第23节规定的地å€çš„实际信件)告知我们您撤回本åˆåŒçš„决定。您å¯ä»¥ä½¿ç”¨æœ¬åè®®ç»“æŸæ—¶éšé™„的模型撤回表格,但您ä¸å¿…这样åšã€‚为了满足撤回期é™ï¼Œæ‚¨åªéœ€åœ¨æ’¤å›žæœŸé™å±Šæ»¡ä¹‹å‰å‘逿œ‰å…³æ‚¨è¡Œä½¿æ’¤å›žæƒçš„é€šä¿¡ã€‚ä½†æ˜¯ï¼Œå¦‚æžœæ‚¨å·²æ˜Žç¡®åŒæ„在购买过程结æŸåŽç«‹å³å¼€å§‹æ‰§è¡ŒGOGå†…å®¹ï¼ˆå³æ•°å­—内容) +,并已承认失去您的撤回æƒï¼Œåˆ™æ­¤è§„定ä¸é€‚用。 + + + +7.2 æœ¬æ¡æ¬¾åŠæœ¬ç”¨æˆ·å议中的任何其他部分å‡ä¸å½±å“您的法定æƒåˆ©ã€‚特别是: + + + +a)对于澳大利亚用户:我们的商å“附带æƒç›Šä¿æŠ¤æ‹…ä¿ï¼Œæ­¤æ‹…ä¿ä¸å¯ä¾æ®æ¾³å¤§åˆ©äºšæ¶ˆè´¹è€…法排除。您有æƒå°±é‡å¤§æ•…障进行æ¢è´§æˆ–退款,或就任何åˆç†å¯é¢„è§çš„æŸå¤±æˆ–æŸå®³å–å¾—èµ”å¿ã€‚如果商å“è´¨é‡ä¸åˆæ ¼ï¼Œæˆ–故障尚未达到é‡å¤§æ•…éšœçš„ç¨‹åº¦ï¼Œæ‚¨åŒæ ·æœ‰æƒè¦æ±‚商å“å¾—åˆ°ä¿®ç†æˆ–æ›´æ¢ã€‚ + + + +b)对于新西兰的用户:对于1993年新西兰消费者æƒç›Šä¿æŠ¤æ³•中所æåˆ°çš„ä¸å¯æŽ’除ã€é™åˆ¶æˆ–修正的任何æƒåˆ©æˆ–补救措施的适用,本用户å议的此部分或任何其他部分ä¸è¿›è¡Œä»»ä½•排除ã€é™åˆ¶æˆ–修正。根æ®è¯¥æ³•案,æƒç›Šä¿æŠ¤æ‹…ä¿çš„范围包括质é‡åˆæ ¼çš„商å“å’ŒæœåŠ¡ã€‚å¦‚æžœæ­¤æ‹…ä¿æœªèƒ½è¾¾æˆï¼Œåˆ™æ‚¨æœ‰æƒå°±è½¯ä»¶èŽ·å¾—è¡¥æ•‘æŽªæ–½ï¼ˆåŒ…æ‹¬ä¿®ç†ã€æ¢è´§æˆ–退款)。如果ä¸èƒ½æä¾›è¡¥æ•‘措施,或故障性质é‡å¤§ï¼Œè¯¥æ³•案规定应予退款。 + + + +我们的退货政策 + + + +7.3 我们明白,有的时候您进行的购买行为å¯èƒ½å¹¶ä¸æ˜¯æ‚¨æƒ³ è¦çš„,我们希望能够公平对待我们的GOGç”¨æˆ·ã€‚æ‰€ä»¥æˆ‘ä»¬å‘ +您æä¾›ä»¥ä¸‹æœåŠ¡ï¼Œåœ¨æžå°‘æ•°æƒ…å†µä¸‹ï¼Œå¦‚æžœæˆ‘ä»¬å¯¹æ‚¨çš„é€€æ¬¾è¦æ±‚有åˆç†çš„疑问,我们å¯èƒ½ä¸é€‚用自愿退款政策。 在任何情况下,这都ä¸ä¼šå‰¥å¤ºæ‚¨ä»»ä½•适用的法定退款æƒåˆ©ã€‚ + +## 8.虚拟物å“å’Œè™šæ‹Ÿè´§å¸ + +8.1 对于æŸäº›GOG内容æ¥è¯´ï¼Œæ‚¨å¯èƒ½å¯ä»¥è´­ä¹°æˆ–获得虚拟物 å“å’Œ/或虚拟货å¸ï¼ˆæˆ‘们将其简称为“ è™šæ‹Ÿè´§å“ â€ ï¼‰ã€‚ +虚拟货å“å—到本åè®®ã€ç‰¹åˆ«æ˜¯ä»¥ä¸‹çš„默认规则所管辖,除 éžè¯¥GOG内容拥有相关的特殊规则(则以这些特殊规则为准 )。 + + + +8.2 虚拟货å“仅是数字物å“,没有现金价值或现实世界的 实物,也无法进行“ 购买†〠“ 出售†ã€èµ é€ã€è½¬äº¤ã€æˆ– +å…‘æ¢ï¼Œæ— è®ºç›®çš„æ˜¯å¦ä¸ºèŽ·å¾—å…¶ä»–æœ‰é‡‘é’±ä»·å€¼çš„è™šæ‹Ÿè´§å“〠“ 真实世界†的钱物ã€ç‰©å“ã€æœåŠ¡ã€æˆ–物å“。虚拟货å“çš„ +äº¤æ˜“æ˜¯ç¦æ­¢çš„(除éžä½ å¾—到了专门的å…许)。你对虚拟货å“的使用æƒå—到一个有é™çš„ã€éžæŽ’ä»–çš„ã€ä¸å¯è½¬è®©çš„ã€ä¸ å¯è½¬æŽˆçš„ã€å¯æ’¤é”€çš„æŽˆæƒæ‰€ç®¡è¾–,规定您仅å¯åœ¨é€‚用的GOG +内容中为了个人的娱ä¹å’Œéžå•†ä¸šç›®çš„使用这些虚拟货å“。 您对任何的虚拟物å“éƒ½ä¸æ‹¥æœ‰è´¢äº§åˆ©ç›Šã€æˆ–æƒåˆ©ã€æˆ–å¥‘æ® ï¼Œè€Œè¿™äº›è™šæ‹Ÿç‰©å“çš„å‘行商ä¿ç•™å…¶æ‰€æœ‰æƒã€‚虚拟物å“å¯èƒ½ +ä¼šåœ¨æœ‰å¿…è¦æ—¶è¢«æ›´æ¢ã€ä¿®æ”¹ã€æˆ–æ’¤é”€ï¼Œå…¶ç›®çš„åŒ…æ‹¬ä¸ºç¬¦åˆæœ¬å议。如果有必è¦ï¼Œè¿™äº›è™šæ‹Ÿè´§å“的使用å¯èƒ½ä¼šå—åˆ°é™ åˆ¶ï¼ˆåŒ…æ‹¬äº¤æ˜“é™åˆ¶å’Œä½™é‡é¢åº¦ï¼‰ã€‚ + + + +8.3 +æˆ‘ä»¬å‘æ‚¨æä¾›æŸä¸€ä»¶è™šæ‹Ÿè´§å“并䏿„å‘³ç€æˆ‘们承诺在未æ¥ä¼šç»´æŒæˆ–ç»§ç»­æä¾›è¯¥è™šæ‹Ÿè´§å“ã€æˆ–ä¿æŒè¯¥è™šæ‹Ÿè´§å“å¯ç”¨ã€‚您å¯ä»¥èŽ·å¾—çš„è™šæ‹Ÿè´§å“的范围ã€ç§ç±»ã€å’Œç±»åž‹å¯èƒ½ä¼šå‘生改å˜ï¼Œè€Œä¸”我们ä¿ç•™åœ¨æˆ‘们认为因GOG.COM或GOG内容的æŒç»­è¿è¥ã€æˆ–å…¶ä»–åˆæ³•ç†ç”±è€Œæœ‰å¿…è¦çš„æƒ…况下管ç†ã€ +调整ã€ä»¥åŠç§»é™¤è™šæ‹Ÿè´§å“çš„æƒåˆ©ï¼Œåœ¨è¿™ç§æƒ…况下,我们在履行这些æƒåˆ©æ—¶å¯¹ä½ æˆ–其他任何人ä¸è´Ÿä»»ä½•责任。我们会在åˆç†çš„æƒ…况䏋呿‚¨é€šçŸ¥ä»»ä½•更改并解释更改的原因。 + +## 9\. è¡¥ä¸ã€æ›´æ–°ã€å’Œæ”¹åЍ + +9.1 +å¶å°”我们å¯èƒ½éœ€è¦ä¿®è¡¥æˆ–æ›´æ–°GOGæœåŠ¡æˆ–GOG内容(例如添加或删除功能或解决软件错误)。为了让GOG高效ã€å®‰å…¨åœ°è¿è¡Œï¼Œæˆ‘们需è¦è¿™äº›æƒåˆ©ã€‚ä¸ä¿®è¡¥æˆ–æ›´æ–°GOGæœåŠ¡æˆ–GOG内容å¯èƒ½ä¼šå¯¼è‡´æ‚¨çš„版本性能较差,或者您的版本与æŸäº›GOGæœåŠ¡æˆ–GOG内容功能ä¸å…¼å®¹ã€‚这样åšï¼Œæ‚¨è¿˜ä¼šé¢ä¸´ä¸å®‰è£…é‡è¦å®‰å…¨æ›´æ–°çš„风险。我们的åˆä½œä¼™ä¼´å¯èƒ½ä¼šä½¿ç”¨GOGæœåŠ¡ä¸ºé€‚ç”¨çš„GOGå†…å®¹æŽ¨å‡ºè¡¥ä¸æˆ–更新。 + +## 10\. GOGæœåŠ¡çš„æ‰€æœ‰æƒå’ŒçŸ¥è¯†äº§æƒ + +10.1 GOGæœåŠ¡åŒ…æ‹¬ï¼ˆå¹¶ä¸é™äºŽï¼‰å…¶å›¾åƒã€ç”µè„‘代ç ã€ç”¨æˆ·ç•Œé¢ã€å¤–观和风格ã€éŸ³é¢‘ã€è§†é¢‘ã€æ–‡å­—ã€å¸ƒå±€ã€æ•°æ®åº“〠+和所有其他内容,所有相关的法定或使用æƒå‡å±žäºŽæˆ‘们或 我们从第三方处获得授æƒã€‚ +GOG内容由其å„自的开å‘商/å‘行商所有ã€å¹¶ç”±æˆ‘们授æƒä½¿ç”¨ã€‚除我们在本å议中特别说 明的情况外,我们ä¿ç•™ä¸€åˆ‡æƒåˆ©ã€‚除了本å议中说明的方 +å¼ä¹‹å¤–,您ä¸èƒ½ä»¥ä»»ä½•å…¶ä»–æ–¹å¼ä½¿ç”¨æˆ–利用GOGæœåŠ¡æˆ–GOG 内容的任何部分。 + + + +10.2. +GOGå°Šé‡ä»–人的知识产æƒã€‚请[在此处](https://support.gog.com/hc/articles/213224285)阅读更多信æ¯ã€‚ + +## 11\. GOGæœåŠ¡ä½¿ç”¨è§„å®š + +11.1 +请éµå®ˆæœ‰å…³GOGæœåŠ¡å’ŒGOGå†…å®¹çš„è¿™äº›è§„åˆ™ï¼Œä»¥åŠæˆ‘们在下文11.2中链接的任何其他规则。请仔细阅读这些规则,因为ä¸éµå®ˆè¿™äº›è§„则(特别是与作弊有关的规则)将被视为严é‡è¿å本å议,这å¯èƒ½å¯¼è‡´æ‚¨æš‚åœæˆ–å–æ¶ˆå¯¹GOGæœåŠ¡çš„è®¿é—®ã€‚ä»¥ä¸‹æ˜¯è§„åˆ™ï¼š + + + +(a)ä»…å°†GOGæœåŠ¡æˆ–GOG内容用于个人娱ä¹ï¼ˆä¾‹å¦‚,请勿将其用于赚钱ã€ç›—版或政治目的)。 + + + +(b)关于GOG内容,除了玩游æˆï¼ˆå¦‚创建è¡ç”Ÿä½œå“)之外,您实际上还å¯ä»¥åšä»€ä¹ˆï¼Œè¿™å–决于GOG内容æƒåˆ©äººå…许您åšä»€ä¹ˆï¼ˆ +GOGä¸èƒ½æŽˆäºˆæ­¤ç±»æƒåˆ©ï¼‰ã€‚因此,请直接与æƒåˆ©æŒæœ‰äººæ ¸å®žï¼ˆä¸è¿‡ï¼Œæ‚¨åº”该åšçš„ç¬¬ä¸€ä»¶äº‹æ˜¯æ£€æŸ¥ä»–ä»¬æ˜¯å¦æœ‰æœ€ç»ˆç”¨æˆ·è®¸å¯å议,如果有的è¯ï¼Œè¯¥åè®®çš„å†…å®¹æ˜¯ä»€ä¹ˆï¼‰ã€‚æˆ‘ä»¬è¿˜è¦æ±‚您仅真诚地å°è¯•改进GOG内容。 + + + +(c) 对于GOGæœåŠ¡æ¥è¯´ï¼ˆåŒ…括GOGè½¯ä»¶ï¼‰ï¼Œé™¤éžæ‚¨äº‹å…ˆèŽ·å¾—äº†GOGçš„å…许,å¦åˆ™è¯·ä¸è¦ä¿®æ”¹ã€åˆå¹¶ã€åˆ†å‘ã€ç¿» +译ã€é€†å‘工程ã€å编译ã€åæ±‡ç¼–ã€æˆ–制作è¡ç”Ÿä½œå“ï¼Œé™¤éž æ‚¨å¾—åˆ°è¿™ä»½å议或是您国家法律的å…许。我们想è¦å¼ºè°ƒï¼Œ 我们欢迎您è”络我们,申请获得以上行为的许å¯ï¼Œè€Œæˆ‘们 +ä¼šä»¥çœŸè¯šçš„å¿ƒå®¡æ ¸å¹¶å›žå¤æ‚¨çš„申请。进一步说,我们希望 能够在未æ¥çš„æŸä¸ªæ—¶é—´å¼€æ”¾ä¸€äº›å®¢æˆ·ç«¯åè®®ï¼Œè®©ç”¨æˆ·ä»¬å¯ +以更方便的使用GOGæ•°æ®/软件,而无需使用逆å‘工程或类 似的技术。 + + +(d) 请ä¸è¦ç ´è§£ã€ç ´åã€éªšæ‰°ã€å¹²æ‰°ã€æˆ–滥用GOGæœåŠ¡æˆ–GOG内容〠GOG用户或GOGå·¥ä½œäººå‘˜ã€æˆ–将其用于 类似的目的。 + + + +(e) +ä¸å¾—以任何方å¼åˆ›å»ºã€ä½¿ç”¨ã€æä¾›å’Œ/或分å‘ä½œå¼Šã€æ¼æ´žåˆ©ç”¨ã€è‡ªåŠ¨åŒ–è½¯ä»¶ã€æœºå™¨äººã€æœºå™¨äººã€modã€é»‘客ã€èœ˜è››ã€é—´è°è½¯ä»¶ã€ä½œå¼Šã€è„šæœ¬ã€åŸ¹è®­å¸ˆã€æå–工具或其他与GOGæœåŠ¡æˆ–GOG内容交互或影å“GOG内容的软件(包括但ä¸é™äºŽæ‹¦æˆªã€æ¨¡æ‹Ÿæˆ–é‡å®šå‘GOG或其åˆä½œä¼™ä¼´ä¸ŽGOGæœåŠ¡ä¹‹é—´çš„ä»»ä½•é€šä¿¡çš„ä»»ä½•æœªç»æŽˆæƒçš„第三方程åºå’Œ/或收集有关GOGæœåŠ¡ä¿¡æ¯çš„ä»»ä½•æœªç»æŽˆæƒçš„第三方程åºï¼‰ã€‚ + + + +(f) ä¸è¦å¹²æ‰°GOGã€æˆ–ç¬¬ä¸‰æ–¹ç½‘ç»œè½¯ä»¶ã€æˆ–å…¶ä»–è½¯ä»¶ï¼ŒåŒ…æ‹¬é€šè¿‡éš§é“æŠ€æœ¯ã€ä»£ç æ³¨å…¥ã€ä¿®æ”¹æˆ–æ›´æ¢GOG软件 +ã€ä¸ŽGOGæœåŠ¡æˆ–GOG内容共åŒä½¿ç”¨ä»»ä½•其他类似的软件ã€é€š 过åè®®æ¨¡æ‹Ÿã€æˆ–通过制作或使用与GOGæœåŠ¡æˆ–GOG内容有关 +çš„ç§æœ‰æœåŠ¡å™¨ã€‚ä¸è¦è®¿é—®æˆ–å°è¯•访问GOG.COM或GOG GALAXYæœåС噍 中未å‘公众开放的区域。 + + +(g) ä¸è¦åšæˆ–è¯´ä»»ä½•è¢«è§†ä¸ºæˆ–å¯èƒ½è¢«è§†ä¸ºç§æ—主义ã€ä»‡å¤–心ç†ã€æ€§åˆ«æ­§è§†ã€è¯½è°¤æˆ–å…¶ä»–å†’çŠ¯æ€§æˆ–éžæ³•的事情(例如剥削未æˆå¹´äººã€é¼“励暴力ã€ä»Žäº‹æ¬ºè¯ˆï¼‰ã€‚è¯·å–„å¾…å½¼æ­¤ï¼ + + + +(h) ä¸è¦åˆ†äº«ã€ “ 购买†〠“ 出售†ã€è½¬äº¤ã€èµ é€ã€ç§Ÿå€Ÿã€ç›—å–ã€ä¾µå æˆ–ä¸å½“使用GOG账户。 GOG密钥/密ç ä»…能以 +GOGå…许的方å¼è¿›è¡Œèµ é€ã€è½¬äº¤æˆ–使用。如果您有任何 疑问或问题,请è”系我们的客户支æŒã€‚ + + +(i) æˆ‘ä»¬è¦æ±‚您éµå®ˆä¸€åˆ‡ä¸ŽGOG有关的ã€é€‚用的 åœ°ç†æˆ–地区ã€è¯­è¨€æˆ–基于ä½ç½®çš„é™åˆ¶ã€è¦æ±‚ã€æˆ–规定。 + + +(j) æˆ‘ä»¬è¦æ±‚您ä¸è¦ä»Žäº‹ä»»ä½•与GOG相关的ã€ä¼š 对他人的版æƒã€å•†æ ‡ã€ä¸“利ã€å•†ä¸šæœºå¯†ã€éšç§æƒã€å…¬å¼€æ€§ ã€æˆ–å…¶ä»–æƒåˆ©é€ æˆä¾µçŠ¯çš„è¡Œä¸ºï¼ŒåŒ…æ‹¬å¹¶ä¸é™äºŽå›¾åƒã€ç…§ç‰‡ +ã€éŸ³é¢‘æ–‡ä»¶ã€æ–‡æœ¬æ–‡ä»¶ã€å›¾åƒæ–‡ä»¶ã€ä»¥åŠä»»ä½•å…¶ä»–çš„ææ–™ 或信æ¯ã€‚ + + + +11.2 +除此之外,以下是使用GOGæœåŠ¡æ—¶é€‚ç”¨äºŽæ‚¨çš„é™„åŠ æ¡æ¬¾åˆ—è¡¨ã€‚æˆ‘ä»¬ä¸æƒ³é‡å¤ï¼Œä½†é‡è¦çš„æ˜¯è¦è®°ä½ï¼Œå¦‚果您ä¸éµå®ˆè¿™äº›è§„定,这将严é‡è¿å本å议,这å¯èƒ½å¯¼è‡´æ‚¨æš‚åœæˆ–å–æ¶ˆå¯¹GOGæœåŠ¡çš„è®¿é—®ã€‚ä»¥ä¸‹æ˜¯åˆ—è¡¨ï¼š + + * GOG行为准则([链接](https://support.gog.com/hc/articles/115001814049-Forum-Code-of-Conduct?product=gog)) + + * ä¾µæƒå†…å®¹å’Œç‰ˆæƒæ”¿ç­–([链接](https://support.gog.com/hc/articles/213224285-Copyright-Policy?product=gog))。 + + + +11.3 +æ¯å½“我们åšå‡ºå®¡æ ¸å†³å®šï¼Œå¯¼è‡´æ‚¨å¯¹GOGæœåŠ¡çš„è®¿é—®å—到é™åˆ¶æ—¶ï¼Œåªè¦æœ‰å¯èƒ½ï¼Œæ‚¨éƒ½åº”该收到一份ç†ç”±è¯´æ˜Žï¼Œæ¦‚述我们åšå‡ºè¿™ä¸€å†³å®šçš„原因。如果您ä¸åŒæ„我们的决定,您有6个月的时间进行投诉。有关如何æå‡ºæŠ•诉的详细信æ¯ï¼Œè¯·å‚阅您的审核决定。我们的投诉处ç†ç³»ç»Ÿç¨‹åºçš„æè¿°ä¹Ÿå¯ä»¥åœ¨ä¾µæƒå†…å®¹å’Œç‰ˆæƒæ”¿ç­–([此处](https://support.gog.com/hc/articles/213224285))中找到。 + +## 12\. 用户生æˆå†…容 + +12.1 本节介ç»çš„ä¸»è¦æ˜¯æ‚¨ä¸ºæˆ‘们或为其他GOG用户ã€é€šè¿‡ GOGæœåŠ¡ï¼ˆä¾‹å¦‚é€šè¿‡æ‚¨çš„æ¡£æ¡ˆå›¾ç‰‡ã€æˆ–通过å‘给其他GOG用 +户的消æ¯ï¼‰æ‰€åˆ›å»ºçš„内容(例如文字ã€è§†é¢‘ã€ç…§ç‰‡ã€å›¾ç‰‡ã€æˆªå›¾ã€å£çº¸æˆ–链接)。 我们将这ç§å†…容称为“ 用户生æˆå†…容†。 + + + +12.2 +就我们和您而言,您拥有任何用户生æˆçš„å†…å®¹ï¼Œä½†æˆ‘ä»¬éœ€è¦æ‚¨æŽˆäºˆæˆ‘ä»¬å¯¹å…¶çš„ä¸€äº›æœ‰é™æƒåˆ©ï¼Œä»¥ä¾¿æˆ‘们能够通过GOGæœåŠ¡è¿›è¡Œå®žé™…ä¼ è¾“ã€‚å› æ­¤ï¼Œé€šè¿‡å‘布用户生æˆå†…å®¹ï¼Œæ‚¨å‘æˆ‘们授予éžç‹¬å®¶ã€ä¸å¯æ’¤é”€çš„许å¯ï¼Œå…许我们使用ã€ä¿®æ”¹ã€å¤åˆ¶ã€åˆ›å»ºè¡ç”Ÿä½œå“ã€åˆ†å‘ã€ä¼ è¾“ã€æ²Ÿé€šä»¥åŠå…¬å¼€å±•示/执行与GOGæœåŠ¡ç›¸å…³çš„ç”¨æˆ·ç”Ÿæˆå†…容。 + + + +12.3 您需è¦è´Ÿè´£ä¿è¯æ‚¨å¯¹ç”¨æˆ·ç”Ÿæˆå†…å®¹çš„ä½¿ç”¨æ‹¥æœ‰æ‰€æœ‰åˆ æ³•çš„æ³•å®šæƒåˆ©ï¼Œå¹¶è´Ÿè´£ç¡®ä¿å…¶å¯ä»¥å®‰å…¨ä½¿ç”¨ã€‚我们无法得 +知这些情况,而且我们无法为您进行检查,所以我们åªèƒ½ 信任您。 + + + +12.4. +但是,我们有æƒï¼ˆä½†æ²¡æœ‰ä¹‰åŠ¡ï¼‰å®¡æŸ¥å¹¶åœ¨é€‚å½“æˆ–æ³•å¾‹ä¸Šå¿…è¦æ—¶åˆ é™¤ä»»ä½•éžæ³•ã€ä¾µæƒã€è¯½è°¤ã€æ·«ç§½ã€ä¾µçŠ¯ä»–äººéšç§ã€å¨èƒã€éªšæ‰°ã€è¾±éª‚ã€ä»‡æ¨ã€ç§æ—主义或色情的用户生æˆå†…容。如果您å‘现任何此类内容已在GOGæœåŠ¡ä¸Šå‘å¸ƒï¼Œè¯·å‘ŠçŸ¥æˆ‘ä»¬ã€‚æˆ‘ä»¬è¦æ±‚您阅读我们的《侵æƒå†…容政策》(此处) +,其中介ç»äº†ä¸¾æŠ¥ä¾µæƒå†…容的程åºã€‚如果您ä»ç„¶è®¤ä¸ºåœ¨æˆ‘们的内部程åºä¹‹åŽï¼Œæ‚¨çš„ä¸ªæ¡ˆä»æœªå¾—到完全解决,您å¯ä»¥å¯»æ±‚庭外纠纷解决办法。详情请å‚阅下文第20节。 + +## 13\. å馈或建议 + +13.1 +我们éžå¸¸æ¬¢è¿Žæ‚¨ç»™æˆ‘们呿¥æœ‰å…³GOGæœåŠ¡çš„å馈和建议。我们éžå¸¸é‡è§†ã€‚ä¸è¿‡æˆ‘们一定è¦è¯´æ˜Žï¼Œæˆ‘们ä¸ä¸€å®šä¼šé‡‡ç”¨æˆ–接纳这些åé¦ˆæˆ–å»ºè®®ï¼Œè€Œä¸”æˆ‘ä»¬ä¸æ‰¿è¯ºä¼šå¯¹æ‚¨è¿›è¡Œ +任何相关的奖励(金钱或其他形å¼ï¼‰ã€‚ + +## 14\. 在网å‹åˆ›ä½œä¸­ä½¿ç”¨GOG内容 + +14.1 对于任何的网å‹ä½œå“æ¥è¯´ï¼ˆä¾‹å¦‚ç½‘å‹æ¨¡ç»„ã€å¼•擎电影 ã€æ¨¡ä»¿ã€è‡´æ•¬ã€æ¸¸æˆè§†é¢‘ã€å’Œå…¶ä»–的视频或美术作å“), +您需è¦è‡ªè¡ŒæŸ¥æ ¸è¯¥å†…容的拥有者(如开å‘商或å‘行商)是 å¦å…许该行为,如果他们å…è®¸ï¼Œé‚£ä¹ˆæ‚¨åº”è¯¥ä»Žä»–ä»¬å¤„èŽ·å– +相应的许å¯ã€‚原因很简å•,所有的GOG内容都是它们å„è‡ªæ‰€æœ‰æƒæŒæœ‰è€…的财产ã€è€Œä¸æ˜¯GOG的。 + +## 15\. 第三方内容和外部æœåŠ¡ + +15.1 您å¯èƒ½ä¼šé€šè¿‡GOGæœåŠ¡èŽ·å–到指å‘第三方网站或内容的链接。您å¯ä»¥è‡ªè¡Œåˆ¤æ–­æ˜¯å¦ä½¿ç”¨è¿™äº›é“¾æŽ¥ï¼Œæˆ‘们无法ä¿è¯è¿™äº›é“¾æŽ¥æœ‰æ•ˆã€å®ƒä»¬æŒ‡å‘ä½•å¤„ã€æˆ–è€…æ˜¯å¦æ”¶è´¹ã€‚ + + + +15.2 您还å¯ä»¥ä½¿ç”¨æ‚¨çš„GOGè´¦æˆ·æ¥æ–¹ä¾¿çš„使用外部的〠GOG 认è¯çš„åˆä½œä¼™ä¼´çš„æœåŠ¡ã€‚ä¾‹å¦‚æˆ‘ä»¬çš„å…³è”å…¬å¸CD PROJEKT +推出的游æˆã€Šå·«å¸ˆã€‹åŠå…¶ç½‘站。它们都有其å„è‡ªçš„æ¡æ¬¾å’Œ æ¡ä»¶ï¼Œæ‚¨éœ€è¦åŒæ„å¹¶éµå®ˆæ–¹å¯ä½¿ç”¨ã€‚一定è¦è¯´æ˜Žï¼šæ˜¯å¦ä½¿ç”¨è¿™äº›æœåŠ¡ï¼Œæ‚¨å¯ä»¥è‡ªè¡Œåˆ¤æ–­ï¼Œè€Œä¸”是éžå¼ºåˆ¶çš„ã€‚è¿™ä¸ªæƒ +åˆ©å±žäºŽæ‚¨ï¼ + +## 16\. 有关GOGæœåŠ¡çš„ä¿è¯å’Œè´£ä»»èŒƒå›´ + +16.1 我们ä¿è¯ï¼š (i) 我们有æƒåˆ©è®¢ç«‹æ­¤åè®®ï¼Œå¹¶æŽˆæƒæ‚¨ä½¿ç”¨ç¬¬2.1节中介ç»çš„GOGæœåŠ¡ï¼›è€Œä¸” (ii) 我们会对GOGæœåŠ¡ +和您的使用体验实施åˆç†çš„关注;而且 (iii) 我们在履行此å议中规定的我们对您的义务时会采å–åˆç†çš„努力æ¥éµ 守适用的法律。 + + + +16.2 您的声明与ä¿è¯ã€‚您在此声明并ä¿è¯æ‚¨æœ‰å®Œæ•´çš„æƒåŠ› 和能力签署本å议并éµå®ˆå…¨éƒ¨æ¡æ¬¾ã€‚您将声明并ä¿è¯æ‚¨é€š +过GOGæœåŠ¡ä¼ è¾“çš„ä»»ä½•ç”¨æˆ·ç”Ÿæˆå†…容å‡ä¸ä¾µçŠ¯ä»»ä½•ç¬¬ä¸‰æ–¹çš„ +知识产æƒã€‚您将进一步声明并ä¿è¯æ‚¨ä¸ä¼šä½¿ç”¨æˆ–为包å«éžæ³•ã€ä¾µæƒã€è¯½è°¤ã€æ·«ç§½ã€ä¾µçŠ¯ä»–äººéšç§ã€å¨èƒã€éªšæ‰°ã€è¾±éª‚ã€æ†Žæ¨ã€ç§æ—歧视或色情内容的用户生æˆå†…容æä¾›å¸®åŠ© 。 + + + +16.3. +我们努力使GOG内容在您的系统上è¿è¡Œï¼Œä½†æˆ‘们进行测试的时间有é™ï¼Œè€Œä¸”æˆ‘ä»¬å¹¶ä¸æ€»æ˜¯æŠŠä¸€åˆ‡éƒ½åšå¥½ã€‚å› æ­¤ï¼Œé™¤éžæ³•å¾‹è¦æ±‚,å¦åˆ™æˆ‘们ä¸å¯¹GOG内容承担任何责任(è§7.1.-7.2以上)。我们也ä¸å¯¹GOG.COM或GOGæœåŠ¡å‘生的任何超出我们控制范围的事情负责,我们也ä¸ä¿è¯GOGæœåŠ¡100%正常工作。但是,ä¸è¦å¿˜è®°ï¼Œå¦‚æžœGOG内容存在技术问题,您å¯èƒ½æœ‰æƒèŽ·å¾—é€€è´§å’Œé€€æ¬¾- +请å‚阅第7.3节。 + +## 17\. 终止 + +17.1 +您终止本å议的æƒåˆ©ã€‚您å¯ä»¥éšæ—¶ç»ˆæ­¢æœ¬å议,无需æä¾›ä»»ä½•ç†ç”±ï¼Œå®Œå…¨åœæ­¢ä½¿ç”¨GOGæœåŠ¡ã€‚å¦‚æžœæ‚¨å¸Œæœ›æˆ‘ä»¬åˆ é™¤æ‚¨çš„å¸æˆ·ï¼Œè¯·[在此处](https://support.gog.com/hc/requests/new)è”系我们的支æŒå›¢é˜Ÿï¼Œæˆ–å‘é€ç”µå­é‚®ä»¶è‡³privacy@gog.com。终止ä¸ä¼šå½±å“我们或您已ç»å­˜åœ¨çš„æƒåˆ©æˆ–ä¹‰åŠ¡ã€‚ + + + +17.2. +我们终止本å议的æƒåˆ©ã€‚如果您严é‡è¿å本å议,我们ä¿ç•™æš‚åœæˆ–å–æ¶ˆæ‚¨å¯¹GOGæœåŠ¡å’ŒGOG内容的访问æƒé™çš„æƒåˆ©ã€‚ä¸¥é‡è¿å本å议是指å¯èƒ½å¯¹GOGã€GOG用户造æˆé‡å¤§æŸå®³çš„严é‡è¿è§„行为,特别是è¿å上述第11节或GOGè¡Œä¸ºå‡†åˆ™çš„è§„å®šã€‚å¦‚æžœæˆ‘ä»¬æš‚åœæˆ–å–æ¶ˆæ‚¨å¯¹GOGæœåŠ¡æˆ–GOG内容的访问æƒé™ï¼Œæˆ‘们将采å–åˆç†æŽªæ–½ä¸Žæ‚¨è”系,解释我们这样åšçš„åŽŸå› ä»¥åŠæ‚¨å¯ä»¥é‡‡å–的措施(如有)。 + + + +17.3虽然概率很å°ï¼Œä½†æ˜¯å¦‚果我们ä¸å¾—䏿°¸ä¹…çš„åœæ­¢å‘您 æä¾›GOGæœåŠ¡å’ŒGOGå†…å®¹ï¼ˆåŽŸå› å¹¶ä¸æ˜¯æ‚¨è¿å本å议),我们会尽全力æå‰è‡³å°‘å…­å( +60)天在www.gog.com上å‘布通知ã€å¹¶å‘所有注册用户å‘é€é‚®ä»¶è¿›è¡Œé€šçŸ¥ï¼Œåœ¨æ­¤æœŸé—´æ‚¨å°†å¯ä»¥ä¸‹è½½æ‚¨è´­ä¹°çš„æ‰€æœ‰GOG内容。 + +## 18\. ä¸å¯æŠ—力 + +18.1 如果因为å‘ç”Ÿäº†æ‚¨æˆ–æˆ‘ä»¬æ— æ³•æŽ§åˆ¶çš„ã€æ— æ³•预知的事件,包括并ä¸é™äºŽç½‘络中断ã€è”络中断ã€ç«ç¾ã€æ´ªæ°´ã€æˆ˜äº‰ã€æˆ–天ç¾ç­‰ï¼Œè€Œå¯¼è‡´æ‚¨æˆ–我们无法履行本å议规定的任 +ä½•ä¹‰åŠ¡æˆ–æ— æ³•å‘æ‚¨æä¾›GOGæœåŠ¡å’ŒGOG内容,您和我方都对此ä¸è´Ÿä»»ä½•责任。 + +## 19\. 适用法律 + +对于居ä½åœ¨æ¬§ç›Ÿå’Œä¸–界其他地区(ä¸åŒ…æ‹¬ç¾Žå›½ï¼‰çš„ç”¨æˆ·æ¥ è¯´ï¼š + + + +19.1 æ‚¨å’Œæˆ‘ä»¬åŒæ–¹å‡åŒæ„您对GOGæœåŠ¡å’ŒGOG内容的使用以 åŠæœ¬å议都å—到波兰共和国的法律所管辖ã€å¹¶ä¾ç…§å…¶è¿›è¡Œ +解释,而且有关此å议的一切纠纷都会由波兰共和国的法 庭éžç‹¬å®¶å®¡ç†ã€‚在此å议下的任何诉讼中,胜诉方需承担 自己的法务费用和支出。 + + + +19.2 上述适用法律和管辖æƒçš„选择应以您居ä½çš„叿³•ç®¡è¾–åŒºé€‚ç”¨çš„å¼ºåˆ¶æ€§æ¶ˆè´¹è€…ä¿æŠ¤è§„å®šæˆ–å…¶ä»–æ³•å¾‹ï¼ˆå¦‚æ— æ¶ˆè´¹è€…ä¿æŠ¤è§„å®šï¼‰ä¸ºå‡†ã€‚ + + + +对于生活在美国的用户æ¥è¯´ï¼š + + + +19.3 æ‚¨å’Œæˆ‘ä»¬åŒæ–¹å‡åŒæ„您对GOGæœåŠ¡å’ŒGOG内容的使用〠+ä»¥åŠæœ¬åè®®ã€å‡ä¼šè¢«è§†ä¸ºæ˜¯åœ¨åŠ åˆ©ç¦å°¼äºšå·žæ´›æ‰çŸ¶å¸‚所订立,且å—到美国加利ç¦å°¼äºšå·žæ³•律所管辖以åŠè§£é‡Šï¼ˆä¸”在 +适用的情况下也å—到美国è”邦法律的管辖和解释)。一切您对GOGåšå‡ºçš„主张å‡ä¼šåœ¨åŠ åˆ©ç¦å°¼äºšå·žæ´›æ‰çŸ¶å¸‚的任 何州立或è”邦法庭中独家进行,并对你我之间的任何争议 +拥有诉讼标的管辖æƒï¼Œå› æ­¤æˆ‘ä»¬åŒæ–¹å‡åŒæ„åŒæ„上述法庭 的独家管辖æƒã€‚在此å议下的任何诉讼中,胜诉方需承担自己的法务费用和支出。 + +## 20\. 客户支æŒåŠäº‰è®®è§£å†³ + +20.1 +如果您对我们有任何疑虑ã€ç”³è¯‰æˆ–问题,我们希望能通过[这里](https://support.gog.com/hc/requests/new)å‹å¥½ã€å¿«é€Ÿåœ°å°†å…¶è§£å†³ã€‚æˆ‘ä»¬å°†é‡‡å– +åˆç†çš„ã€è¯šæ„çš„åŠªåŠ›ä»¥éžæ­£å¼çš„æ–¹å¼ä¸Žæ‚¨è§£å†³ä»»ä½•争议。我们承诺在14日内对任何申诉åšå‡ºå›žå¤ã€‚ + + + +20.2. +如果在此期间没有解决,接下æ¥çš„æ­¥éª¤å–决于您居ä½çš„地方。如果您居ä½åœ¨æ¬§ç›Ÿå¢ƒå†…,您å¯ä»¥å‘欧盟委员会è¿è¥å’Œæä¾›çš„åœ¨çº¿äº‰è®®è§£å†³å¹³å°æäº¤æ³•å¾‹ç´¢èµ”ï¼Œè¯¥å¹³å°å¯é€šè¿‡http://ec.europa.eu/consumers/odr/访问,以达æˆåº­å¤–和解或æèµ·è¯‰è®¼ã€‚您也å¯ä»¥é€‰æ‹©é€šè¿‡æ‚¨æ‰€åœ¨å›½å®¶/地区的数字æœåŠ¡å调员认è¯çš„任何庭外争议解决机构解决您的争议。 + + + +20.3 如果您居ä½åœ¨ç¾Žå›½æˆ–是世界其他地区(ä¸åŒ…括欧盟) ,请通过 legal@GOG.COM è”络我们。 + +## 21\. 其他法务事项 + +21.1 如果本å议的任何一部分被å‘çŽ°æ— æ³•åˆæ³•实施,这对本å议的任何一部分ä¸é€ æˆä»»ä½•å½±å“。 + + + +21.2本å议(包括其中æåŠçš„任何GOGé™„åŠ æ¡æ¬¾ï¼‰æž„æˆæ‚¨ä¸Žæˆ‘们之间的完整å议,并å–代之å‰çš„任何å£å¤´æˆ–书é¢å议。如果您ä¸åŒæ„这一点,请在开始使用GOGæœåŠ¡åŽå°½å¿«é€šè¿‡legal@gog.com与我们è”系,å¦åˆ™è¿™å°†åœ¨åˆç†çš„æ—¶é—´æ®µï¼ˆé€šå¸¸ä¸º30天)åŽå¯¹æ‚¨å…·æœ‰çº¦æŸåŠ›ã€‚ + + + +21.3 本å议管辖我们和您的一切关系(å之亦然)。它并ä¸ä¼šä¸ºå…¶ä»–任何人授予任何æƒåˆ©ã€‚ + + + +21.4 请记ä½ï¼Œæˆ‘们还å—到å„ç§æ³•律的管辖,而且我们å¯èƒ½ä¼šéœ€è¦æœä»Žæ‰§æ³•æœºæž„æˆ–å…¶ä»–åˆæ³•è¦æ±‚。 + + + +21.5 如果GOGå‘生é‡ç»„ã€å‡ºå”®ã€æˆ–åˆå¹¶ï¼Œé‚£ä¹ˆæˆ‘们需 è¦ä¸Žç›¸å…³çš„第三方åˆä½œæ¥è½¬ç§»æˆ–是åˆå¹¶æ‚¨çš„GOG账户。 + + + +21.6 æ‚¨å’Œæˆ‘ä»¬éƒ½åŒæ„è”åˆå›½å›½é™…货物销售åˆåŒå…¬çº¦å¹¶ä¸é€‚用于此å议。 + + + +21.7 如果对GOGçš„æ”¯æŒæœ‰å¿…è¦ã€ä½œä¸ºä»»ä½•é‡ç»„或åˆå¹¶çš„一 éƒ¨åˆ†ã€æˆ–为其他业务原因,我们å¯ä»¥å°†æ­¤å议分é…ã€åˆ†åŒ… +ã€æˆ–转移给第三方或我们集团内的其他æˆå‘˜ã€‚如果å‘生此 类事件,我们将æå‰é€šçŸ¥æ‚¨ã€‚ + + + +21.8 +如果您是欧盟公民,请注æ„ï¼Œæ ¹æ®æ¬§æ´²è®®ä¼šå’Œç†äº‹ä¼šäºŽ2017å¹´6月14日通过的关于国际市场在线内容æœåŠ¡è·¨å¢ƒä¾¿æºæ€§çš„第2017/1128å·æ³•规(EU),GOGå·²ç»èµ‹äºˆå…è´¹å’Œä»˜è´¹å†…å®¹è·¨å¢ƒä¾¿æºæ€§ï¼Œä½†æ­¤è·¨å¢ƒä¾¿æºæ€§éœ€å—其他任何对GOGçš„æ³•å¾‹è¦æ±‚的约æŸï¼ŒåŒ…括知识产æƒçš„ä¿æŠ¤ï¼Œä¸”éœ€å—到GOG的开å‘商和出版商åˆä½œä¼™ä¼´çš„ä»»ä½•è¦æ±‚的约æŸã€‚ + +## 22\. æ­¤å议的更改 + +22.1 +如果我们认为有必è¦ï¼Œä¾‹å¦‚å‡ºäºŽæ³•å¾‹åŽŸå› æˆ–ä¸ºäº†åæ˜ GOGæœåŠ¡æˆ–GOG内容的å˜åŒ–,我们å¯èƒ½ä¼šæ›´æ”¹æœ¬å议。如果是这样,我们将在https://support.gog.com/hc/articles/212632089上在线æä¾›å·²æ›´æ”¹çš„å议,并且(如果您有GOG叿ˆ·ï¼‰æˆ‘们会通过电å­é‚®ä»¶é€šçŸ¥æ‚¨ä»»ä½•é‡å¤§æ›´æ”¹ã€‚ + + + +22.2 本å议的任何更改将在公告上线åŽçš„30天内生效。如果您对更改有疑问的,å¯ä»¥åœ¨æ­¤æœŸé—´é€šè¿‡legal@GOG.COM è”络我们。 + + + +22.3 如果您ä¸åŒæ„这些更改(无论您是å¦è”ç»œæˆ‘ä»¬ï¼‰ï¼Œé‚£ä¹ˆå¾ˆé—æ†¾ï¼Œæˆ‘ä»¬å¿…é¡»è¦æ±‚æ‚¨åœæ­¢ä½¿ç”¨GOGæœåŠ¡å’ŒGOG内容。 +很抱歉我们ä¸å¾—ä¸è¿™æ ·è¯´ï¼Œä¸è¿‡æˆ‘们希望您能ç†è§£ï¼Œä¸ºäº† 让GOGæœåŠ¡èƒ½å¤Ÿæ­£å¸¸è¿è¥ï¼Œæˆ‘们需è¦è®©æ¯ä¸€ä¸ªç”¨æˆ·éƒ½æŒ‰ç…§åŒ +样的规则æ¥ä½¿ç”¨ï¼Œè€Œä¸æ˜¯ç»™ä¸åŒçš„人制定ä¸åŒçš„规则。因此,如果您有任何疑问或咨询,我们鼓励您è”络我们。 + + + +22.4 有必è¦å‘您说明,我们ç»ä¸ä¼šå¯¹æœ¬åè®®åšå‡ºä¸€å¤§å †æ›´æ”¹ï¼Œç„¶åŽä¸å‘Šè¯‰æ‚¨ï¼Œå¹¶è¦æ±‚您在使用GOG.COM之å‰åŒæ„è¿™äº›æ‚¨å¹¶ä¸æ˜Žäº†çš„æ›´æ”¹ï¼ + +## 23 我们的è”ç³»ä¿¡æ¯ + +23.1. 如果您对GOG叿ˆ·ã€GOGæœåŠ¡æœ‰ä»»ä½•æŠ•è¯‰ï¼Œæˆ–è€…åªæ˜¯æƒ³è”系我们,请查看我们的è”系方å¼ï¼š + + + +å…¬å¸åç§°: GOG sp. z o.o. + + + +注册办事处:JagielloÅ„ska 74, 03-301 Warsaw, Poland + +在国家法院登记处第14å•†ä¸šåº­åŽæ²™åœ°åŒºæ³•院登记。 + + + +登记å·ç 0000029514 + + + +税å·å¢žå€¼ç¨Žå·ï¼ˆ NIP ) PL 113-21-77-807 + + + +股本: 135,750.00兹罗æ + + + +当局的å•一è”络点: + +法务团队 + +legal@gog.com + +æˆ‘ä»¬æ²Ÿé€šçš„è¯­è¨€ï¼šè‹±è¯­ã€æ³¢å…°è¯­ + + + +GOGæœåŠ¡æŽ¥æ”¶è€…çš„å•一è”系点: + +支æŒå›¢é˜Ÿ + +support@gog.com + +我们主è¦è®²è‹±è¯­å’Œæ³¢å…°è¯­ï¼Œä½†ä¼šå°½æœ€å¤§åŠªåŠ›ä»¥GOGæä¾›çš„任何语言为您æä¾›å¸®åŠ©ã€‚ + + + +æœ€åŽæ›´æ–°ï¼ˆç”Ÿæ•ˆæ—¥æœŸï¼‰ : 2024å¹´2月17æ—¥ + + + +请[在此](https://support.gog.com/hc/articles/212632089)处查看用户å议的早期版本。 + + + + + + + +------------------------------- + + + +======================================== +========= DOSBox License terms ========= +======================================== + +The DOSBox Team +\--------------- + +Sjoerd v.d. Berg +Peter Veenstra +Ulf Wohlers +Tommy Frossman +Dean Beeler +Sebastian Strohhacker +Ralf Grillenberger + +nick_without_<> @ users.sourceforge.net + +We would like to thank: + +Vlad R. of the vdmsound project for excellent sound blaster info. +Tatsuyuki Satoh of the Mame Team for making an excellent FM emulator. +Jarek Burczynski for the new OPL3 emulator. +Ken Silverman for his work on an OPL2 emulator. + +The Bochs and DOSemu projects which I used for information. +FreeDOS for ideas in making my shell. + +Pierre-Yves Gerardy for hosting the old Beta Board. +Colin Snover for hosting our forum. + +Sourceforge for hosting our homepage and other development tools. +Mirek Luza, for his moderation of the forums. +eL_Pusher, DosFreak and MiniMax for their moderation of VOGONS forum. + +crazyc, gulikoza, M-HT for their work on the dynrec core. + +Jantien for the version management. +Shawn, Johannes and Marcus for creating the MAC OS X version. +Jochen for creating the OS/2 version. +Ido Beeri for the icon. +ripsaw8080 for his hard debugging work. +GOG Team for the splash screen. +All the people who submitted a bug. +The Beta Testers. + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0\. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +1\. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2\. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +c) If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3\. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +4\. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +5\. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6\. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +7\. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8\. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +9\. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10\. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +------------------------------- + + diff --git a/info.exult.exult/data/serpentisle/tmp/GOG.png b/info.exult.exult/data/serpentisle/tmp/GOG.png new file mode 100644 index 0000000..3aeda5e Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/GOG.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/GOG200.png b/info.exult.exult/data/serpentisle/tmp/GOG200.png new file mode 100644 index 0000000..3aeda5e Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/GOG200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/GOG200_new.png b/info.exult.exult/data/serpentisle/tmp/GOG200_new.png new file mode 100644 index 0000000..fb32bc7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/GOG200_new.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/InnoCallback.dll b/info.exult.exult/data/serpentisle/tmp/InnoCallback.dll new file mode 100644 index 0000000..2b33aad Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/InnoCallback.dll differ diff --git a/info.exult.exult/data/serpentisle/tmp/OpenSans-Regular.ttf b/info.exult.exult/data/serpentisle/tmp/OpenSans-Regular.ttf new file mode 100644 index 0000000..db43334 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/OpenSans-Regular.ttf differ diff --git a/info.exult.exult/data/serpentisle/tmp/OpenSans-Semibold.ttf b/info.exult.exult/data/serpentisle/tmp/OpenSans-Semibold.ttf new file mode 100644 index 0000000..1a7679e Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/OpenSans-Semibold.ttf differ diff --git a/info.exult.exult/data/serpentisle/tmp/Support.ico b/info.exult.exult/data/serpentisle/tmp/Support.ico new file mode 100644 index 0000000..e1d26f4 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/Support.ico differ diff --git a/info.exult.exult/data/serpentisle/tmp/background.jpg b/info.exult.exult/data/serpentisle/tmp/background.jpg new file mode 100644 index 0000000..8353eaf Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/background.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/background.png b/info.exult.exult/data/serpentisle/tmp/background.png new file mode 100644 index 0000000..25e76f0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/background.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/bg-bot@2x.jpg b/info.exult.exult/data/serpentisle/tmp/bg-bot@2x.jpg new file mode 100644 index 0000000..50c95a9 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/bg-bot@2x.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/bottombar.png b/info.exult.exult/data/serpentisle/tmp/bottombar.png new file mode 100644 index 0000000..9c71a35 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/bottombar.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/bottombar200.png b/info.exult.exult/data/serpentisle/tmp/bottombar200.png new file mode 100644 index 0000000..fa972b8 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/bottombar200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/botva2.dll b/info.exult.exult/data/serpentisle/tmp/botva2.dll new file mode 100644 index 0000000..59cf6b5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/botva2.dll differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_browse.png b/info.exult.exult/data/serpentisle/tmp/btn_browse.png new file mode 100644 index 0000000..afe5064 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_browse.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_browse200.png b/info.exult.exult/data/serpentisle/tmp/btn_browse200.png new file mode 100644 index 0000000..7b3d472 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_browse200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_close.png b/info.exult.exult/data/serpentisle/tmp/btn_close.png new file mode 100644 index 0000000..dbdffc6 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_close.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_close200.png b/info.exult.exult/data/serpentisle/tmp/btn_close200.png new file mode 100644 index 0000000..6520ede Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_close200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_continue.png b/info.exult.exult/data/serpentisle/tmp/btn_continue.png new file mode 100644 index 0000000..097db4d Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_continue.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_continue200.png b/info.exult.exult/data/serpentisle/tmp/btn_continue200.png new file mode 100644 index 0000000..956017c Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_continue200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_exit.png b/info.exult.exult/data/serpentisle/tmp/btn_exit.png new file mode 100644 index 0000000..6038791 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_exit.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_exit200.png b/info.exult.exult/data/serpentisle/tmp/btn_exit200.png new file mode 100644 index 0000000..3ab5b99 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_exit200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_launch.png b/info.exult.exult/data/serpentisle/tmp/btn_launch.png new file mode 100644 index 0000000..969cb4e Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_launch.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_launch200.png b/info.exult.exult/data/serpentisle/tmp/btn_launch200.png new file mode 100644 index 0000000..c745cb7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_launch200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_md5.png b/info.exult.exult/data/serpentisle/tmp/btn_md5.png new file mode 100644 index 0000000..6a69f73 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_md5.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_md5200.png b/info.exult.exult/data/serpentisle/tmp/btn_md5200.png new file mode 100644 index 0000000..a0a55d5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_md5200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_options.png b/info.exult.exult/data/serpentisle/tmp/btn_options.png new file mode 100644 index 0000000..ad330dd Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_options.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_options200.png b/info.exult.exult/data/serpentisle/tmp/btn_options200.png new file mode 100644 index 0000000..a0a55d5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_options200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_save_as.png b/info.exult.exult/data/serpentisle/tmp/btn_save_as.png new file mode 100644 index 0000000..318db3b Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_save_as.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_save_as200.png b/info.exult.exult/data/serpentisle/tmp/btn_save_as200.png new file mode 100644 index 0000000..41e0139 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_save_as200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_skip.png b/info.exult.exult/data/serpentisle/tmp/btn_skip.png new file mode 100644 index 0000000..4531aa5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_skip.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_skip200.png b/info.exult.exult/data/serpentisle/tmp/btn_skip200.png new file mode 100644 index 0000000..5a459c7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_skip200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_start.png b/info.exult.exult/data/serpentisle/tmp/btn_start.png new file mode 100644 index 0000000..77d1a64 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_start.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_start200.png b/info.exult.exult/data/serpentisle/tmp/btn_start200.png new file mode 100644 index 0000000..44d7de8 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_start200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_tryagain.png b/info.exult.exult/data/serpentisle/tmp/btn_tryagain.png new file mode 100644 index 0000000..ea4b099 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_tryagain.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/btn_tryagain200.png b/info.exult.exult/data/serpentisle/tmp/btn_tryagain200.png new file mode 100644 index 0000000..c29cbe7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/btn_tryagain200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/crcdll.dll b/info.exult.exult/data/serpentisle/tmp/crcdll.dll new file mode 100644 index 0000000..d825542 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/crcdll.dll differ diff --git a/info.exult.exult/data/serpentisle/tmp/empty b/info.exult.exult/data/serpentisle/tmp/empty new file mode 100644 index 0000000..e69de29 diff --git a/info.exult.exult/data/serpentisle/tmp/error.png b/info.exult.exult/data/serpentisle/tmp/error.png new file mode 100644 index 0000000..71d2ff8 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/error.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/error200.png b/info.exult.exult/data/serpentisle/tmp/error200.png new file mode 100644 index 0000000..09e4972 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/error200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/error_icon.png b/info.exult.exult/data/serpentisle/tmp/error_icon.png new file mode 100644 index 0000000..55d2fa7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/error_icon.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/error_icon200.png b/info.exult.exult/data/serpentisle/tmp/error_icon200.png new file mode 100644 index 0000000..52488a5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/error_icon200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/gog.ico b/info.exult.exult/data/serpentisle/tmp/gog.ico new file mode 100644 index 0000000..5a9ec11 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/gog.ico differ diff --git a/info.exult.exult/data/serpentisle/tmp/gog_installer_background.jpg b/info.exult.exult/data/serpentisle/tmp/gog_installer_background.jpg new file mode 100644 index 0000000..8353eaf Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/gog_installer_background.jpg differ diff --git a/info.exult.exult/data/serpentisle/tmp/gog_new.png b/info.exult.exult/data/serpentisle/tmp/gog_new.png new file mode 100644 index 0000000..2b463b3 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/gog_new.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/innoSetupEula.txt b/info.exult.exult/data/serpentisle/tmp/innoSetupEula.txt new file mode 100644 index 0000000..2ded45a --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/innoSetupEula.txt @@ -0,0 +1,38 @@ +======================================== +======= Inno Setup License Terms ======= +======================================== + +Except where otherwise noted, all of the documentation and software included +in the Inno Setup package is copyrighted by Jordan Russell. + +Copyright (C) 1997-2008 Jordan Russell. All rights reserved. + +This software is provided "as-is," without any express or implied warranty. +In no event shall the author be held liable for any damages arising from the +use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter and redistribute it, +provided that the following conditions are met: + +1. All redistributions of source code files must retain all copyright + notices that are currently in place, and this list of conditions without + modification. + +2. All redistributions in binary form must retain all occurrences of the + above copyright notice and web site addresses that are currently in + place (for example, in the About boxes). + +3. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software to + distribute a product, an acknowledgment in the product documentation + would be appreciated but is not required. + +4. Modified versions in source or binary form must be plainly marked as + such, and must not be misrepresented as being the original software. + + +Jordan Russell +jr-2008 AT jrsoftware.org +http://www.jrsoftware.org/ + diff --git a/info.exult.exult/data/serpentisle/tmp/md5log.ini b/info.exult.exult/data/serpentisle/tmp/md5log.ini new file mode 100644 index 0000000..63be282 --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/md5log.ini @@ -0,0 +1 @@ +[Setup] \ No newline at end of file diff --git a/info.exult.exult/data/serpentisle/tmp/ok.png b/info.exult.exult/data/serpentisle/tmp/ok.png new file mode 100644 index 0000000..8bcb1c0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/ok.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/ok200.png b/info.exult.exult/data/serpentisle/tmp/ok200.png new file mode 100644 index 0000000..df673dd Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/ok200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/progress_center.png b/info.exult.exult/data/serpentisle/tmp/progress_center.png new file mode 100644 index 0000000..95f67b5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/progress_center.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/progress_center200.png b/info.exult.exult/data/serpentisle/tmp/progress_center200.png new file mode 100644 index 0000000..13e303c Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/progress_center200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/progress_left.png b/info.exult.exult/data/serpentisle/tmp/progress_left.png new file mode 100644 index 0000000..0fcf26d Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/progress_left.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/progress_left200.png b/info.exult.exult/data/serpentisle/tmp/progress_left200.png new file mode 100644 index 0000000..5ae9ab5 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/progress_left200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/progress_right.png b/info.exult.exult/data/serpentisle/tmp/progress_right.png new file mode 100644 index 0000000..2a17ca0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/progress_right.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/progress_right200.png b/info.exult.exult/data/serpentisle/tmp/progress_right200.png new file mode 100644 index 0000000..4cba6eb Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/progress_right200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/scroll-handle-bot.png b/info.exult.exult/data/serpentisle/tmp/scroll-handle-bot.png new file mode 100644 index 0000000..e02fecd Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/scroll-handle-bot.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/scroll-handle-top.png b/info.exult.exult/data/serpentisle/tmp/scroll-handle-top.png new file mode 100644 index 0000000..3908d00 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/scroll-handle-top.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/slideshow.ini b/info.exult.exult/data/serpentisle/tmp/slideshow.ini new file mode 100644 index 0000000..9da3a19 --- /dev/null +++ b/info.exult.exult/data/serpentisle/tmp/slideshow.ini @@ -0,0 +1,15 @@ +[Header] +count = 2 + +[Billboard 0] +url = https://www.gog.com/en/game/starcrawlers +filename = 1432039876.jpg +timeout = 10000 +skippable = 0 + +[Billboard 1] +url = https://www.gog.com/en/game/space_rangers_hd_a_war_apart +filename = 1207667113.jpg +timeout = 10000 +skippable = 0 + diff --git a/info.exult.exult/data/serpentisle/tmp/track_center.png b/info.exult.exult/data/serpentisle/tmp/track_center.png new file mode 100644 index 0000000..e505572 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/track_center.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/track_center200.png b/info.exult.exult/data/serpentisle/tmp/track_center200.png new file mode 100644 index 0000000..b179ab7 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/track_center200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/track_left.png b/info.exult.exult/data/serpentisle/tmp/track_left.png new file mode 100644 index 0000000..c9d4f3d Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/track_left.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/track_left200.png b/info.exult.exult/data/serpentisle/tmp/track_left200.png new file mode 100644 index 0000000..8b1de8c Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/track_left200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/track_right.png b/info.exult.exult/data/serpentisle/tmp/track_right.png new file mode 100644 index 0000000..54fb78c Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/track_right.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/track_right200.png b/info.exult.exult/data/serpentisle/tmp/track_right200.png new file mode 100644 index 0000000..9772d75 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/track_right200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/trackbar_back.png b/info.exult.exult/data/serpentisle/tmp/trackbar_back.png new file mode 100644 index 0000000..39f6668 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/trackbar_back.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/trackbar_back200.png b/info.exult.exult/data/serpentisle/tmp/trackbar_back200.png new file mode 100644 index 0000000..399d482 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/trackbar_back200.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/trackbar_btn.png b/info.exult.exult/data/serpentisle/tmp/trackbar_btn.png new file mode 100644 index 0000000..062c979 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/trackbar_btn.png differ diff --git a/info.exult.exult/data/serpentisle/tmp/trackbar_btn200.png b/info.exult.exult/data/serpentisle/tmp/trackbar_btn200.png new file mode 100644 index 0000000..b7b13f0 Binary files /dev/null and b/info.exult.exult/data/serpentisle/tmp/trackbar_btn200.png differ diff --git a/info.exult.exult/data/sqsfxbg.flx b/info.exult.exult/data/sqsfxbg.flx new file mode 100755 index 0000000..dbabeea Binary files /dev/null and b/info.exult.exult/data/sqsfxbg.flx differ diff --git a/info.exult.exult/data/sqsfxsi.flx b/info.exult.exult/data/sqsfxsi.flx new file mode 100755 index 0000000..4d0f656 Binary files /dev/null and b/info.exult.exult/data/sqsfxsi.flx differ