Compare commits
426 commits
orc_shaman
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2bbcd5f814 | ||
![]() |
6d97ac494e | ||
![]() |
5b63155a23 | ||
![]() |
392b8dc9fb | ||
![]() |
ec0e0992b6 | ||
![]() |
f360e781c7 | ||
![]() |
78e6bdaa29 | ||
![]() |
4593921b67 | ||
![]() |
fafa0e7b13 | ||
![]() |
96a2ff69c9 | ||
![]() |
507e84e8cb | ||
![]() |
e586f2bcf5 | ||
![]() |
d9ef464b1e | ||
![]() |
0badadaffe | ||
![]() |
4475260e68 | ||
![]() |
868cb845f0 | ||
![]() |
a74b39da25 | ||
![]() |
f73e2b641b | ||
![]() |
001c90c1fc | ||
![]() |
11eaca1277 | ||
![]() |
c9da910fb8 | ||
![]() |
920e155ef6 | ||
![]() |
36fa52fc1a | ||
![]() |
9b0430e1f7 | ||
![]() |
19be417a05 | ||
![]() |
6d10d919d5 | ||
![]() |
e8a3e3fcef | ||
![]() |
8210f33a7b | ||
![]() |
352157d593 | ||
![]() |
10364b169b | ||
![]() |
a6954bd56e | ||
![]() |
6a18a37afe | ||
![]() |
d191109bb4 | ||
![]() |
0c1357b594 | ||
![]() |
f7dc6ebaeb | ||
![]() |
4a689a687d | ||
![]() |
144fa9c71a | ||
![]() |
f5ab5620e2 | ||
![]() |
5e5fc1db5d | ||
![]() |
2be41a4f85 | ||
![]() |
edb4331d56 | ||
![]() |
e037694945 | ||
![]() |
f113b2b7a7 | ||
![]() |
e64283534f | ||
![]() |
f2bcc997b8 | ||
![]() |
782ab2df3e | ||
![]() |
79798b9f2b | ||
![]() |
c1c0111d3c | ||
![]() |
06d1fade32 | ||
![]() |
f29f8fb368 | ||
![]() |
893b31e769 | ||
![]() |
e8af57e3ab | ||
![]() |
f3c48ab8ce | ||
![]() |
a7d3db9cf7 | ||
![]() |
bf4ad3bb42 | ||
![]() |
c762c01924 | ||
![]() |
4fb36d5e08 | ||
![]() |
68f6c984e7 | ||
![]() |
70361db1bd | ||
![]() |
91efe14fba | ||
![]() |
8b77417425 | ||
![]() |
425eca473f | ||
![]() |
2066456654 | ||
![]() |
2debd74605 | ||
![]() |
2dcfe2435c | ||
![]() |
e28217b213 | ||
![]() |
1bd64bd8aa | ||
![]() |
e549b03412 | ||
![]() |
02304cd86f | ||
![]() |
66e94c9a6b | ||
![]() |
c8df594a74 | ||
![]() |
a4a8506dfa | ||
![]() |
028e16d39b | ||
![]() |
ebf9a2949a | ||
![]() |
06781df8f2 | ||
![]() |
f7fd05b63e | ||
![]() |
255b1ad055 | ||
![]() |
e208a4e776 | ||
![]() |
3a74825e8d | ||
![]() |
6d4058d670 | ||
![]() |
dd1eb9e964 | ||
![]() |
f7a271dab9 | ||
![]() |
7d92a8cb4a | ||
![]() |
530cd2b02b | ||
![]() |
10b640c0f2 | ||
![]() |
bed8047ee4 | ||
![]() |
2d9cc9c89d | ||
![]() |
5801b5bcdb | ||
![]() |
2139d5b7b6 | ||
![]() |
b21b828f8d | ||
![]() |
759822a47f | ||
![]() |
2e02f310d2 | ||
![]() |
dcbe883699 | ||
![]() |
ad563d99e9 | ||
![]() |
9a8520a192 | ||
![]() |
91d6bb4b45 | ||
![]() |
2e520d03a5 | ||
![]() |
e0bda68b80 | ||
![]() |
c38b856a82 | ||
![]() |
20242ffc84 | ||
![]() |
5175beb1e7 | ||
![]() |
c4f7523e00 | ||
![]() |
01908e9274 | ||
![]() |
5a10721637 | ||
![]() |
ee84633273 | ||
![]() |
482c2817f9 | ||
![]() |
42ed77905b | ||
![]() |
d3dfe36571 | ||
![]() |
92e91e4c0e | ||
![]() |
ecd273914c | ||
![]() |
7cbe381faa | ||
![]() |
6999b294d5 | ||
![]() |
fe5296aefd | ||
![]() |
0ed106c4e2 | ||
![]() |
70c89f819d | ||
![]() |
a25d28e637 | ||
![]() |
20e61d67ff | ||
![]() |
8f7813c7a0 | ||
![]() |
ba5c1c1ac1 | ||
![]() |
c08152a0e7 | ||
![]() |
8a91549fe8 | ||
![]() |
73c14e0d2b | ||
![]() |
a5dae832c8 | ||
![]() |
7c41d550a9 | ||
![]() |
4dc69c5267 | ||
![]() |
8350f48c88 | ||
![]() |
d8086942df | ||
![]() |
c5c4c7af07 | ||
![]() |
b2bceba9a7 | ||
![]() |
3b8ceb00f0 | ||
![]() |
167677d9de | ||
![]() |
d8d92b5d28 | ||
![]() |
e9e40b5a37 | ||
![]() |
1cf3fed50f | ||
![]() |
47ec1d49e7 | ||
![]() |
fc0e7f7a08 | ||
![]() |
653333a8bf | ||
![]() |
4ccfca6b1d | ||
![]() |
2c216eec72 | ||
![]() |
70a76b0e21 | ||
![]() |
2db282c273 | ||
![]() |
22a1a9d5d4 | ||
![]() |
2477618306 | ||
![]() |
2e0f8c453e | ||
![]() |
98f0d3721c | ||
![]() |
b8747c37b0 | ||
![]() |
7183553e23 | ||
![]() |
99469ba31d | ||
![]() |
ed94f9b02b | ||
![]() |
75f41e84f0 | ||
![]() |
0f8d9a9940 | ||
![]() |
7bc844d4be | ||
![]() |
c475b0c684 | ||
![]() |
a50f047c7c | ||
![]() |
26fd5513b6 | ||
![]() |
56468a9bdc | ||
![]() |
3dff5d2eac | ||
![]() |
5a90e40e19 | ||
![]() |
d2638df581 | ||
![]() |
4d37947ae1 | ||
![]() |
335c4943d2 | ||
![]() |
ce6c56adea | ||
![]() |
bb4eb0bf1b | ||
![]() |
6fb5488464 | ||
![]() |
78f7703639 | ||
![]() |
6fa92f9553 | ||
![]() |
55eef0dbef | ||
![]() |
ad8f94195d | ||
![]() |
7ca616f2ae | ||
![]() |
c7f818d449 | ||
![]() |
79120f1e31 | ||
![]() |
c2b2664eb2 | ||
![]() |
484116ea09 | ||
![]() |
5d3a84084e | ||
![]() |
e2f656f833 | ||
![]() |
b8c912d1e7 | ||
![]() |
d668aea7d0 | ||
![]() |
a5f40c353d | ||
![]() |
653bbb8263 | ||
![]() |
33bc132215 | ||
![]() |
cc2914c1c6 | ||
![]() |
24ad4cb9d2 | ||
![]() |
3d589f8d0d | ||
![]() |
d0050dac8e | ||
![]() |
a6cd4441c9 | ||
![]() |
7782c50f83 | ||
![]() |
715a65438a | ||
![]() |
7810b0308e | ||
![]() |
c2361e3a82 | ||
![]() |
8c8bff7ffb | ||
![]() |
1e12839804 | ||
![]() |
3c45ec93e0 | ||
![]() |
f1e74af2d3 | ||
![]() |
858b2d2bfc | ||
![]() |
3afa75225f | ||
![]() |
c67d447901 | ||
![]() |
11078f3e24 | ||
![]() |
e64765da2a | ||
![]() |
ea6f903c04 | ||
![]() |
df3f2b2653 | ||
![]() |
a6fd520956 | ||
![]() |
d2fc3f3f17 | ||
![]() |
3c17bc83c2 | ||
![]() |
c5cb0f104f | ||
![]() |
34c1c0f61c | ||
![]() |
8b14612fbe | ||
![]() |
812c1e2e5e | ||
![]() |
b9bcdd3b63 | ||
![]() |
690ff375b7 | ||
![]() |
ce54c007bd | ||
![]() |
9330997d10 | ||
![]() |
b2af5d8488 | ||
![]() |
05e8ac2c96 | ||
![]() |
8e57567e24 | ||
![]() |
37b7a83ce0 | ||
![]() |
ddbdf01588 | ||
![]() |
ed37c7f807 | ||
![]() |
a76f96e4ee | ||
![]() |
a8ecf3233b | ||
![]() |
63c161c81c | ||
![]() |
a3f141c196 | ||
![]() |
14302f6bff | ||
![]() |
b905c1aa4a | ||
![]() |
45662a2f83 | ||
![]() |
9d9d2cd027 | ||
![]() |
32b5570103 | ||
![]() |
4f97c10e35 | ||
![]() |
37adb200e6 | ||
![]() |
9a77b72aac | ||
![]() |
6dc65f6483 | ||
![]() |
b859060627 | ||
![]() |
6fcf46a208 | ||
![]() |
12fa8f2844 | ||
![]() |
cd3e8d7652 | ||
![]() |
7f4d2a437b | ||
![]() |
9181e4e298 | ||
![]() |
e460d26dfc | ||
![]() |
05bf146866 | ||
![]() |
82cc6d979d | ||
![]() |
8b0909b24c | ||
![]() |
c3f16b3294 | ||
![]() |
29e79c4235 | ||
![]() |
1aad482fe2 | ||
![]() |
e52d69cf67 | ||
![]() |
0302dd8601 | ||
![]() |
7fb0b8cdb3 | ||
![]() |
403dfbc673 | ||
![]() |
88c6c13fdd | ||
![]() |
0c2b035cc5 | ||
![]() |
ee2bbc40cc | ||
![]() |
7d5663b379 | ||
![]() |
ae5b2f0da6 | ||
![]() |
e0e8b37880 | ||
![]() |
c6853b021d | ||
![]() |
5208905cdf | ||
![]() |
ccb079f05c | ||
![]() |
b26f446d32 | ||
![]() |
e905271c79 | ||
![]() |
83d1bef0bc | ||
![]() |
198b798e49 | ||
![]() |
61480df8eb | ||
![]() |
71dbaab868 | ||
![]() |
1ba3be778b | ||
![]() |
44bb36d411 | ||
![]() |
b5e500cfda | ||
![]() |
3baf3fefe8 | ||
![]() |
c26d45d56e | ||
![]() |
fb2045120b | ||
![]() |
e01fbb6b02 | ||
![]() |
b3ed22d697 | ||
![]() |
dc78046d0f | ||
![]() |
0954c2445e | ||
![]() |
7f9879fc08 | ||
![]() |
deea9ad009 | ||
![]() |
b4d70c4224 | ||
![]() |
70df290584 | ||
![]() |
dfa4d7dd35 | ||
![]() |
ebf825668d | ||
![]() |
cb4d8a8dff | ||
![]() |
84c414c58b | ||
![]() |
0e8edd12e4 | ||
![]() |
9f806362ae | ||
![]() |
ec7679d07f | ||
![]() |
5ab73a51fd | ||
![]() |
d338c90381 | ||
![]() |
c284a080e3 | ||
![]() |
e6d5100924 | ||
![]() |
a34e4a345a | ||
![]() |
fd426b5b9b | ||
![]() |
383ba03664 | ||
![]() |
7047c8f581 | ||
![]() |
019da2f54c | ||
![]() |
d7c9716265 | ||
![]() |
a5e17f770d | ||
![]() |
4e1666c7a1 | ||
![]() |
f7a4041f54 | ||
![]() |
01efec92fa | ||
![]() |
c5891ef7fe | ||
![]() |
6d40872de0 | ||
![]() |
f2bbedb9bb | ||
![]() |
940c9abe80 | ||
![]() |
99f5cfacfb | ||
![]() |
fc514ccefb | ||
![]() |
a80831fb9f | ||
![]() |
672b33f227 | ||
![]() |
5e4728d69e | ||
![]() |
995d67cf77 | ||
![]() |
174be0f8c4 | ||
![]() |
a1cadb54e5 | ||
![]() |
371ddd7716 | ||
![]() |
10594faa83 | ||
![]() |
858268c19a | ||
![]() |
af155b0cea | ||
![]() |
52e132648d | ||
![]() |
38a6508cf4 | ||
![]() |
491c236113 | ||
![]() |
f120a00537 | ||
![]() |
c33bb1fca3 | ||
![]() |
c507e60b73 | ||
![]() |
29191627fa | ||
![]() |
42d349a65d | ||
![]() |
1c4d2f449f | ||
![]() |
63d6fbf89d | ||
![]() |
cff803d2ef | ||
![]() |
7665db46af | ||
![]() |
a96ce07e35 | ||
![]() |
0eb8dc4540 | ||
![]() |
44e21859b2 | ||
![]() |
5a8123669d | ||
![]() |
beac3e2c8d | ||
![]() |
7c042e41b2 | ||
![]() |
dfa8db1f72 | ||
![]() |
b03caa9205 | ||
![]() |
dbcd6527d2 | ||
![]() |
76f20a6149 | ||
![]() |
28414a933d | ||
![]() |
f79e8b444c | ||
![]() |
584248d8df | ||
![]() |
1689f5ed17 | ||
![]() |
0a602e1c7c | ||
![]() |
94b075d720 | ||
![]() |
8b86256e4a | ||
![]() |
c5069a6036 | ||
![]() |
c815e1d23a | ||
![]() |
f04e19934f | ||
![]() |
f4fda31707 | ||
![]() |
08e514bc4b | ||
![]() |
df167bdb43 | ||
![]() |
1ca69e1eca | ||
![]() |
c2757a1d35 | ||
![]() |
d2e7fbbeb8 | ||
![]() |
56cc3aee0f | ||
![]() |
f13d4fe2a4 | ||
![]() |
36146c5c6c | ||
![]() |
9f64e355f9 | ||
![]() |
b1eb871df7 | ||
![]() |
422425f772 | ||
![]() |
78c8ed24fb | ||
![]() |
9ca1c53b22 | ||
![]() |
0e13a7e30f | ||
![]() |
a9637de7e7 | ||
![]() |
98aba787c4 | ||
![]() |
558650bd14 | ||
![]() |
5ec94b5904 | ||
![]() |
ca8a0aede8 | ||
![]() |
32e1bdb2e6 | ||
![]() |
ad736266c1 | ||
![]() |
2931816979 | ||
![]() |
9dc4a94533 | ||
![]() |
0fa0019127 | ||
![]() |
d84669c8a8 | ||
![]() |
58bc7ba4af | ||
![]() |
ea3698665f | ||
![]() |
736e45a197 | ||
![]() |
8079807146 | ||
![]() |
2dd27fcf8e | ||
![]() |
eccce783a9 | ||
![]() |
57bd39d4a5 | ||
![]() |
d9bb46ce37 | ||
![]() |
1597fd0248 | ||
![]() |
fa3d421a85 | ||
![]() |
b1105e2c2f | ||
![]() |
61ac2e3f3f | ||
![]() |
187f10ea84 | ||
![]() |
e7509c5dba | ||
![]() |
08c666156b | ||
![]() |
4062f579e3 | ||
![]() |
2bec13a825 | ||
![]() |
8267bc3d16 | ||
![]() |
1008296863 | ||
![]() |
ede10ca10c | ||
![]() |
d2f6b171c0 | ||
![]() |
5e50ab2bf1 | ||
![]() |
a7420b80ea | ||
![]() |
d0688865ff | ||
![]() |
25718875f0 | ||
![]() |
ea1d915c26 | ||
![]() |
bc971b45c9 | ||
![]() |
17361198fe | ||
![]() |
07df161c96 | ||
![]() |
d4e7f5bc43 | ||
![]() |
d278ae9c5f | ||
![]() |
9c665ae3c4 | ||
![]() |
961a6a5802 | ||
![]() |
68a1d1139f | ||
![]() |
cea9b82863 | ||
![]() |
66103e4d4e | ||
![]() |
4870ff66bd | ||
![]() |
d20128530a | ||
![]() |
1d5d73b75a | ||
![]() |
67335a514d | ||
![]() |
a832ed8b2e | ||
![]() |
3e464cb856 | ||
![]() |
82c7b4c7eb | ||
![]() |
1d9f57a668 | ||
![]() |
95c9f0c720 | ||
![]() |
5913cfdf55 | ||
![]() |
f5906d6224 | ||
![]() |
298065e1bd | ||
![]() |
c7d9c0f5b0 | ||
![]() |
43e1d183e5 | ||
![]() |
291e4bb0e5 | ||
![]() |
2f8d471e80 | ||
![]() |
32c528501f | ||
![]() |
0e326894cb | ||
![]() |
1261d88b15 |
4
.clang-tidy
Normal file
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
Checks: '-*,modernize-use-nullptr,performance-unnecessary-value-param'
|
||||
WarningsAsErrors: true
|
||||
...
|
13
.github/workflows/ci-main.yml
vendored
|
@ -90,10 +90,15 @@ jobs:
|
|||
scons "$@" build="$CFG" ctool="$CC" cxxtool="$CXX" cxx_std="$CXX_STD" \
|
||||
extra_flags_config="-pipe" forum_user_handler=true \
|
||||
nls=false enable_lto="$LTO" system_lua="$SYS_LUA" force_color=true \
|
||||
jobs=2 --debug=time glibcxx_debug=true glibcxx_assertions=true
|
||||
jobs=2 --debug=time glibcxx_debug=true glibcxx_assertions=true compile_db=true
|
||||
}
|
||||
build strict=true wesnoth boost_unit_tests
|
||||
|
||||
build cdb
|
||||
# disable all warnings since we have coverage on them in a standard build, and clang-tidy
|
||||
# triggers false positive compiler warnings that clang itself won't
|
||||
run-clang-tidy -quiet -use-color -j 2 -extra-arg="-w" -warnings-as-errors='*' '^(?!.*src/modules/|.*build/)'
|
||||
|
||||
apt remove -y -qq libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev
|
||||
|
||||
build strict=false wesnothd campaignd
|
||||
|
@ -104,7 +109,7 @@ jobs:
|
|||
cmake "$@" -DCMAKE_BUILD_TYPE="$CFG" -DCXX_STD="$CXX_STD" \
|
||||
-DEXTRA_FLAGS_CONFIG="-pipe" -DENABLE_MYSQL=true \
|
||||
-DENABLE_NLS=false -DENABLE_LTO="$LTO" -DFORCE_COLOR_OUTPUT=true -DLTO_JOBS=2 \
|
||||
-DENABLE_SYSTEM_LUA="$SYS_LUA" .
|
||||
-DENABLE_SYSTEM_LUA="$SYS_LUA -DCLANG_TIDY=true" .
|
||||
}
|
||||
rm -R /usr/local/lib/cmake
|
||||
rm /usr/local/lib/libboost*
|
||||
|
@ -259,7 +264,7 @@ jobs:
|
|||
fail-fast: false
|
||||
matrix:
|
||||
cfg: [ Release ]
|
||||
runs-on: macos-12
|
||||
runs-on: macos-13
|
||||
env:
|
||||
CFG: ${{ matrix.cfg }}
|
||||
|
||||
|
@ -292,7 +297,7 @@ jobs:
|
|||
path: projectfiles/Xcode/Wesnoth_${{ matrix.cfg }}.dmg
|
||||
- name: Run WML tests
|
||||
if: matrix.cfg == 'Release'
|
||||
run: ./run_wml_tests -g -c -t 30 -p "projectfiles/Xcode/build/$CFG/The Battle for Wesnoth.app/Contents/MacOS/The Battle for Wesnoth" -a=--userdata-dir="$PWD/ud"
|
||||
run: ./run_wml_tests -g -c -t 30 -bt 350 -p "projectfiles/Xcode/build/$CFG/The Battle for Wesnoth.app/Contents/MacOS/The Battle for Wesnoth" -a=--userdata-dir="$PWD/ud"
|
||||
- name: Upload userdata files from WML unit tests (logs, replays)
|
||||
if: matrix.cfg == 'Release' && (success() || failure())
|
||||
uses: actions/upload-artifact@v4
|
||||
|
|
11
.github/workflows/codeql.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
|||
# - https://gh.io/supported-runners-and-hardware-resources
|
||||
# - https://gh.io/using-larger-runners
|
||||
# Consider using larger runners for possible analysis time improvements.
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 360
|
||||
permissions:
|
||||
actions: read
|
||||
|
@ -50,11 +50,12 @@ jobs:
|
|||
- name: Install dependencies
|
||||
if: matrix.language == 'cpp'
|
||||
run: |
|
||||
utils/autorevision.sh -t h > src/revision.h
|
||||
sudo apt update
|
||||
sudo apt install scons libboost-system1.74-dev libboost-filesystem1.74-dev libboost-iostreams1.74-dev \
|
||||
libboost-serialization1.74-dev libboost-locale1.74-dev libboost-regex1.74-dev libboost-random1.74-dev \
|
||||
libboost-program-options1.74-dev libboost-thread1.74-dev libboost-context1.74-dev libboost-test-dev \
|
||||
libboost-coroutine1.74-dev libboost-graph1.74-dev libasio-dev libsdl2-dev libsdl2-image-dev \
|
||||
sudo apt install scons libboost-system1.83-dev libboost-filesystem1.83-dev libboost-iostreams1.83-dev \
|
||||
libboost-serialization1.83-dev libboost-locale1.83-dev libboost-regex1.83-dev libboost-random1.83-dev \
|
||||
libboost-program-options1.83-dev libboost-thread1.83-dev libboost-context1.83-dev libboost-test-dev \
|
||||
libboost-coroutine1.83-dev libboost-graph1.83-dev libasio-dev libsdl2-dev libsdl2-image-dev \
|
||||
libsdl2-mixer-dev libvorbis-dev libpango1.0-dev libssl-dev libcurl4-openssl-dev liblua5.4-dev
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).
|
||||
- name: Autobuild
|
||||
|
|
34
.github/workflows/image_metadata.yml
vendored
|
@ -27,9 +27,9 @@ jobs:
|
|||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: check image metadata
|
||||
- name: check image EXIF metadata
|
||||
run: |
|
||||
mapfile -t image_files < <(git diff --name-only --diff-filter=d "$BASE_SHA" "$HEAD_SHA" | grep -E '\.(webp|png|je?pg)$')
|
||||
mapfile -t image_files < <(git diff --name-only --diff-filter=d "$BASE_SHA" "$HEAD_SHA" | grep -E '\.(webp|je?pg)$')
|
||||
# cycle through the changed image files, make sure they have the right fields
|
||||
for file in "${image_files[@]}"; do
|
||||
# check Artist tag, fail if missing
|
||||
|
@ -56,3 +56,33 @@ jobs:
|
|||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
- name: check png XMP metadata
|
||||
run: |
|
||||
mapfile -t image_files < <(git diff --name-only --diff-filter=d "$BASE_SHA" "$HEAD_SHA" | grep -E '\.png$')
|
||||
# cycle through the changed image files, make sure they have the right fields
|
||||
for file in "${image_files[@]}"; do
|
||||
# check Creator tag, fail if missing
|
||||
artist="$(exiftool -p '$XMP:Creator' "$file")"
|
||||
if [ "$artist" ]; then
|
||||
printf 'Creator tag in %s is %s\n' "$file" "$artist"
|
||||
else
|
||||
printf 'no Creator XMP tag in %s\n' "$file"
|
||||
exit 1
|
||||
fi
|
||||
# check Rights tag, fail if missing or wrong type
|
||||
copyright="$(exiftool -p '$XMP:Rights' "$file")"
|
||||
case $copyright in
|
||||
'GNU GPL v2+'|'CC BY-SA 4.0'|CC0)
|
||||
printf 'Rights tag in %s is %s\n' "$file" "$copyright"
|
||||
;;
|
||||
'')
|
||||
printf 'no Rights XMP tag in %s\n' "$file"
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
printf 'Rights tag %s in file %s is not an accepted license! Must be one of: "GNU GPL v2+", "CC BY-SA 4.0", "CC0"\n' "$copyright" "$file"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
|
1
.gitignore
vendored
|
@ -127,6 +127,7 @@ wesnoth.plg
|
|||
*.exe
|
||||
*.dll
|
||||
*.so
|
||||
compile_commands.json
|
||||
|
||||
# library files
|
||||
.libs
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# set minimum version
|
||||
# set minimum version
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
project(wesnoth)
|
||||
|
@ -171,6 +171,7 @@ option(GLIBCXX_ASSERTIONS "Whether to define _GLIBCXX_ASSERTIONS" OFF)
|
|||
option(GLIBCXX_DEBUG "Whether to define _GLIBCXX_DEBUG and _GLIBCXX_DEBUG_PEDANTIC. Requires a version of Boost's program_options that's compiled with __GLIBCXX_DEBUG too." OFF)
|
||||
option(ENABLE_POT_UPDATE_TARGET "Enables the tools to update the pot files and manuals. This target has extra dependencies." OFF)
|
||||
option(FORCE_COLOR_OUTPUT "Always produce ANSI-colored output (GNU/Clang only)." FALSE)
|
||||
option(CLANG_TIDY "Enable clang-tidy linter checks." OFF)
|
||||
|
||||
if(UNIX AND NOT APPLE AND NOT CYGWIN)
|
||||
option(ENABLE_NOTIFICATIONS "Enable Window manager notification messages" ON)
|
||||
|
@ -255,6 +256,11 @@ if(NOT MSVC)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
### Enable clang-tidy linting
|
||||
if (CLANG_TIDY)
|
||||
set(CMAKE_CXX_CLANG_TIDY "clang-tidy -Wno-unknown-warning-option")
|
||||
endif()
|
||||
|
||||
### Set the final compiler flags.
|
||||
|
||||
set(COMPILER_FLAGS "${COMPILER_FLAGS} ${CXX_FLAGS_USER}")
|
||||
|
@ -474,7 +480,7 @@ if(NOT MSVC)
|
|||
else()
|
||||
set(CMAKE_CXX_FLAGS "/W3 /WX /wd4503 /wd4351 /wd4250 /wd4244 /wd4267 /we4239 /wd4275 /EHsc /utf-8 /Zc:__cplusplus" CACHE STRING "Global flags used by the CXX compiler during all builds." FORCE)
|
||||
set(CMAKE_C_FLAGS "/WX" CACHE STRING "Global flags used by the C compiler during all builds." FORCE)
|
||||
add_definitions(-D_WIN32_WINNT=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS -DNOMINMAX)
|
||||
add_definitions(-D_WIN32_WINNT=0x0A00 -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS -DNOMINMAX)
|
||||
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG_LUA")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
## Prerequisites
|
||||
|
||||
Wesnoth requires a compiler with sufficient C++17 support such as GCC 8 and
|
||||
Wesnoth requires a compiler with sufficient C++17 support such as GCC 11 and
|
||||
later, or a version of Clang with equivalent support.
|
||||
|
||||
You'll need to have these libraries and their development headers installed in
|
||||
|
@ -19,6 +19,7 @@ order to build Wesnoth:
|
|||
* System
|
||||
* Coroutine
|
||||
* Graph
|
||||
* Charconv (This requires boost 1.85 or higher and is optional but reccomended especially for clang builds)
|
||||
* SDL2 libraries:
|
||||
* SDL2 >= 2.0.18 (macOS: 2.0.22 due to needing https://github.com/libsdl-org/SDL/commit/3bebdaccb7bff8c40438856081d404a7ce3def30)
|
||||
* SDL2_image >= 2.0.2 (with PNG, JPEG, and WEBP support)
|
||||
|
|
|
@ -120,6 +120,7 @@ opts.AddVariables(
|
|||
BoolVariable("OS_ENV", "Forward the entire OS environment to scons", False),
|
||||
BoolVariable("history", "Clear to disable GNU history support in lua console", True),
|
||||
BoolVariable('force_color', 'Always produce ANSI-colored output (GNU/Clang only).', False),
|
||||
BoolVariable('compile_db', 'Produce a compile_commands.json file.', False),
|
||||
)
|
||||
|
||||
#
|
||||
|
@ -189,6 +190,11 @@ if env['distcc']:
|
|||
|
||||
if env['ccache']: env.Tool('ccache')
|
||||
|
||||
if env['compile_db']:
|
||||
env.Tool('compilation_db')
|
||||
cdb = env.CompilationDatabase()
|
||||
Alias('cdb', cdb)
|
||||
|
||||
boost_version = "1.67"
|
||||
|
||||
def SortHelpText(a, b):
|
||||
|
@ -379,6 +385,7 @@ if env["prereqs"]:
|
|||
conf.CheckBoost("program_options", require_version = boost_version) & \
|
||||
conf.CheckBoost("random", require_version = boost_version) & \
|
||||
conf.CheckBoost("smart_ptr", header_only = True) & \
|
||||
conf.CheckBoostCharconv() & \
|
||||
CheckAsio(conf) & \
|
||||
conf.CheckBoost("thread") & \
|
||||
conf.CheckBoost("locale") & \
|
||||
|
@ -665,7 +672,7 @@ for env in [test_env, client_env, env]:
|
|||
env[d] = os.path.join(env["prefix"], env[d])
|
||||
|
||||
if env["PLATFORM"] == 'win32':
|
||||
env.Append(LIBS = ["wsock32", "crypt32", "iconv", "z", "shlwapi", "winmm", "ole32", "uuid"], CCFLAGS = ["-mthreads"], LINKFLAGS = ["-mthreads"], CPPDEFINES = ["_WIN32_WINNT=0x0601"])
|
||||
env.Append(LIBS = ["wsock32", "crypt32", "iconv", "z", "shlwapi", "winmm", "ole32", "uuid"], CCFLAGS = ["-mthreads"], LINKFLAGS = ["-mthreads"], CPPDEFINES = ["_WIN32_WINNT=0x0A00"])
|
||||
|
||||
if env["PLATFORM"] == 'darwin': # Mac OS X
|
||||
env.Append(FRAMEWORKS = "Cocoa") # Cocoa GUI
|
||||
|
|
119
add_source_file
|
@ -81,7 +81,7 @@ code_blocks_target_translations = {
|
|||
# XCode #
|
||||
#=======#
|
||||
|
||||
def add_to_xcode(filename, targets):
|
||||
def modify_xcode(filename, targets, remove):
|
||||
"""Add the given file to the specified targets.
|
||||
"""
|
||||
projectfile = rootdir.joinpath(
|
||||
|
@ -121,24 +121,29 @@ def add_to_xcode(filename, targets):
|
|||
raise Exception(f"problem finding '{d}' group in '{groupname}'")
|
||||
parent_group = found_groups[0]
|
||||
|
||||
# if the group already has an entry with the same filename, loudly skip.
|
||||
# note: this doesn't allow adding to targets one at a time.
|
||||
# a new file should be added to all targets at once...
|
||||
# or maybe targets could be checked somehow,
|
||||
# or maybe the file could simply be completely removed and readded.
|
||||
if project.get_files_by_name(filename.name, parent=parent_group):
|
||||
print(" '"+filename.name+"' already found in Xcode project '"+",".join(translated_targets)+"', skipping")
|
||||
return
|
||||
if remove :
|
||||
# Remove from all targets if we want to remove
|
||||
for file in project.get_files_by_name(filename.name, parent=parent_group):
|
||||
project.remove_file_by_id(file.get_id())
|
||||
else:
|
||||
# if the group already has an entry with the same filename, loudly skip.
|
||||
# note: this doesn't allow adding to targets one at a time.
|
||||
# a new file should be added to all targets at once...
|
||||
# or maybe targets could be checked somehow,
|
||||
# or maybe the file could simply be completely removed and readded.
|
||||
if project.get_files_by_name(filename.name, parent=parent_group):
|
||||
print(" '"+filename.name+"' already found in Xcode project '"+",".join(translated_targets)+"', skipping")
|
||||
return
|
||||
|
||||
# force is True here because otherwise a duplicate filename in
|
||||
# a different place will block addition of the new file.
|
||||
# the rest is just to match existing project file structure.
|
||||
project.add_file(filename.name,
|
||||
force=True,
|
||||
tree="<group>",
|
||||
parent=parent_group,
|
||||
target_name=translated_targets,
|
||||
)
|
||||
# force is True here because otherwise a duplicate filename in
|
||||
# a different place will block addition of the new file.
|
||||
# the rest is just to match existing project file structure.
|
||||
project.add_file(filename.name,
|
||||
force=True,
|
||||
tree="<group>",
|
||||
parent=parent_group,
|
||||
target_name=translated_targets,
|
||||
)
|
||||
|
||||
# that's done, save the file
|
||||
project.save()
|
||||
|
@ -148,7 +153,7 @@ def add_to_xcode(filename, targets):
|
|||
# source_lists #
|
||||
#==============#
|
||||
|
||||
def add_to_source_list(filename, source_list):
|
||||
def modify_source_list(filename, source_list, remove):
|
||||
source_list_file = rootdir.joinpath("source_lists", source_list)
|
||||
sl_lines = open(source_list_file).readlines()
|
||||
file_line = filename.as_posix() + '\n'
|
||||
|
@ -157,12 +162,16 @@ def add_to_source_list(filename, source_list):
|
|||
if filename.suffix != ".cpp":
|
||||
return
|
||||
|
||||
# if the target already has an entry with the same filename, loudly skip
|
||||
if file_line in sl_lines:
|
||||
print(f" '{filename}' already found in '{source_list}', skipping")
|
||||
return
|
||||
if remove:
|
||||
if file_line in sl_lines: sl_lines.remove(file_line)
|
||||
else:
|
||||
# if the target already has an entry with the same filename, loudly skip
|
||||
if file_line in sl_lines:
|
||||
print(f" '{filename}' already found in '{source_list}', skipping")
|
||||
return
|
||||
|
||||
sl_lines.append(file_line)
|
||||
|
||||
sl_lines.append(file_line)
|
||||
sl_lines.sort()
|
||||
open(source_list_file, 'w').writelines(sl_lines)
|
||||
|
||||
|
@ -170,13 +179,18 @@ def add_to_source_lists(filename, targets):
|
|||
translated_targets = [source_list_target_translations[t] for t in targets]
|
||||
print(" source_list targets:", translated_targets)
|
||||
for t in translated_targets:
|
||||
add_to_source_list(filename, t)
|
||||
modify_source_list(filename, t, False)
|
||||
|
||||
def remove_from_source_lists(filename):
|
||||
# remove from all tagerts if -r was specified.
|
||||
for t in source_list_target_translations.values():
|
||||
modify_source_list(filename, t, True)
|
||||
|
||||
#==============#
|
||||
# Code::Blocks #
|
||||
#==============#
|
||||
|
||||
def add_to_code_blocks_target(filename, target):
|
||||
def modify_code_blocks_target(filename, target, remove):
|
||||
cbp_file = rootdir.joinpath(
|
||||
"projectfiles",
|
||||
"CodeBlocks",
|
||||
|
@ -190,30 +204,33 @@ def add_to_code_blocks_target(filename, target):
|
|||
|
||||
elem = f"\t\t<Unit filename=\"{filename_for_cbp}\" />\n"
|
||||
|
||||
# if the target already has an entry with the same filename, loudly skip
|
||||
if elem in cbp_lines:
|
||||
print(f" '{filename}' already found in '{target}.cbp', skipping")
|
||||
return
|
||||
if remove:
|
||||
if elem in cbp_lines: cbp_lines.remove(elem)
|
||||
else:
|
||||
# if the target already has an entry with the same filename, loudly skip
|
||||
if elem in cbp_lines:
|
||||
print(f" '{filename}' already found in '{target}.cbp', skipping")
|
||||
return
|
||||
|
||||
# find an appropriate line to add before/after
|
||||
index = 0
|
||||
for line in cbp_lines:
|
||||
if line.startswith("\t\t<Unit "):
|
||||
if elem < line:
|
||||
# find an appropriate line to add before/after
|
||||
index = 0
|
||||
for line in cbp_lines:
|
||||
if line.startswith("\t\t<Unit "):
|
||||
if elem < line:
|
||||
break
|
||||
elif line.startswith("\t\t<Extensions>"):
|
||||
# we must be the last entry, as this comes after the Unit section
|
||||
break
|
||||
elif line.startswith("\t\t<Extensions>"):
|
||||
# we must be the last entry, as this comes after the Unit section
|
||||
break
|
||||
index += 1
|
||||
cbp_lines.insert(index, elem)
|
||||
index += 1
|
||||
cbp_lines.insert(index, elem)
|
||||
|
||||
open(cbp_file, 'w').writelines(cbp_lines)
|
||||
|
||||
def add_to_code_blocks(filename, targets):
|
||||
translated_targets = [code_blocks_target_translations[t] for t in targets]
|
||||
def modify_code_blocks(filename, targets, remove):
|
||||
translated_targets = code_blocks_target_translations.values() if remove else [code_blocks_target_translations[t] for t in targets]
|
||||
print(" code::blocks targets:", translated_targets)
|
||||
for t in translated_targets:
|
||||
add_to_code_blocks_target(filename, t)
|
||||
modify_code_blocks_target(filename, t, remove)
|
||||
|
||||
def sanity_check_existing_cpp_hpp(filenames):
|
||||
"""
|
||||
|
@ -285,6 +302,8 @@ if __name__ == "__main__":
|
|||
help="which build targets to add the file to")
|
||||
ap.add_argument("--no-checks", action="store_true",
|
||||
help="do not check whether the files exist, etc")
|
||||
ap.add_argument("-r", "--remove", action="store_true",
|
||||
help="remove the specified files from projectfiles instead of adding them, --target is then ignored")
|
||||
# By default, recognise --help too
|
||||
options = ap.parse_args()
|
||||
|
||||
|
@ -301,7 +320,13 @@ if __name__ == "__main__":
|
|||
sanity_check_existing_cpp_hpp(filenames)
|
||||
|
||||
for filename in filenames:
|
||||
print(f"adding '{filename}' to targets: {options.target}")
|
||||
add_to_xcode(filename, options.target)
|
||||
add_to_source_lists(filename, options.target)
|
||||
add_to_code_blocks(filename, options.target)
|
||||
if options.remove:
|
||||
print(f"removing '{filename}' from all targets")
|
||||
modify_xcode(filename, options.target, True)
|
||||
remove_from_source_lists(filename)
|
||||
modify_code_blocks(filename, options.target, True)
|
||||
else:
|
||||
print(f"adding '{filename}' to targets: {options.target}")
|
||||
modify_xcode(filename, options.target, False)
|
||||
add_to_source_lists(filename, options.target)
|
||||
modify_code_blocks(filename, options.target, False)
|
||||
|
|
|
@ -89,7 +89,6 @@ config_cache/test_transaction
|
|||
config_cache/test_define_loading
|
||||
config_cache/test_lead_spaces_loading
|
||||
config_filters/test_int_add_sub_filter
|
||||
config_filters/test_int_positive_filter
|
||||
config_filters/test_int_signed_filter
|
||||
config_filters/test_without_attribute_filter
|
||||
filesystem/test_fs_game_path_reverse_engineering
|
||||
|
@ -172,20 +171,20 @@ test_lexical_cast_throw<unsigned long long>
|
|||
test_lexical_cast_throw<float>
|
||||
test_lexical_cast_throw<double>
|
||||
test_lexical_cast_throw<long double>
|
||||
test_lexical_cast_signed<signed char>
|
||||
test_lexical_cast_signed<short>
|
||||
test_lexical_cast_signed<int>
|
||||
test_lexical_cast_signed<long>
|
||||
test_lexical_cast_long_long
|
||||
test_lexical_cast_unsigned<unsigned char>
|
||||
test_lexical_cast_unsigned<unsigned short>
|
||||
test_lexical_cast_unsigned<unsigned int>
|
||||
test_lexical_cast_unsigned<unsigned long>
|
||||
test_lexical_cast_unsigned_long_long
|
||||
test_lexical_arethmetic_signed<signed char>
|
||||
test_lexical_arethmetic_signed<short>
|
||||
test_lexical_arethmetic_signed<int>
|
||||
test_lexical_arethmetic_signed<long>
|
||||
test_lexical_arethmetic_signed<long long>
|
||||
test_lexical_arethmetic_signed<unsigned char>
|
||||
test_lexical_arethmetic_signed<unsigned short>
|
||||
test_lexical_arethmetic_signed<unsigned int>
|
||||
test_lexical_arethmetic_signed<unsigned long>
|
||||
test_lexical_arethmetic_signed<unsigned long long>
|
||||
test_lexical_arethmetic_signed<float>
|
||||
test_lexical_arethmetic_signed<double>
|
||||
test_lexical_arethmetic_signed<long double>
|
||||
test_lexical_cast_bool
|
||||
test_lexical_cast_floating_point<float>
|
||||
test_lexical_cast_floating_point<double>
|
||||
test_lexical_cast_floating_point<long double>
|
||||
test_lexical_cast_result
|
||||
test_map_location/map_location_characterization_test_radial_mode
|
||||
test_map_location/reality_check_vector_negation
|
||||
|
|
13022
changelog.md
|
@ -1,2 +0,0 @@
|
|||
### WML Engine
|
||||
* Add alignment in [attack] to specify the alignment of an attack independent of the unit's alignment.
|
|
@ -1,3 +0,0 @@
|
|||
### Units
|
||||
* Walking Corpse: arcane vulnerability reduced from 40% to 20%.
|
||||
* Soulless: arcane vulnerability reduced from 40% to 20%.
|
2
changelog_entries/dune_warmaster.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
### Units
|
||||
* Dune Warmaster: HP 59 -> 61 scimitar damage 9 -> 10
|
5
changelog_entries/ei-dialogue-fixes.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
### Campaigns
|
||||
* Eastern Invasion
|
||||
* S04c: give Mal-Ravanal gold to recruit more units when their army becomes too small
|
||||
* forbid all Dunefolk units to take the Plague Staff
|
||||
* fix minor bugs with dialogues
|
2
changelog_entries/explorer_resistance_nerf.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
### Units
|
||||
* Dwarvish Explorer: physical resists reduced from 20% to 10%, melee damage increased from 10 to 11.
|
3
changelog_entries/fire_guardian_resistances.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
### Units
|
||||
* Fire Wisps and Guardian - Fire Resistance changed from 50% to 70%
|
||||
* Fire Wraith - Fire Resistance changed from 50% to 80%
|
|
@ -1,5 +0,0 @@
|
|||
### User interface
|
||||
GUI2 themes can be loaded from add-ons. Requires a `gui-theme.cfg` file in add-on root with a `[gui]` tag that acts as the entry point for the theme.
|
||||
|
||||
### Lua API
|
||||
Added new function gui.switch_theme() to allow switching to another gui2 theme from inside a scenario.
|
|
@ -1,2 +0,0 @@
|
|||
### User interface
|
||||
* Option key is now identified as such instead of Alt in the Hotkeys preferences section on macOS builds
|
|
@ -1,2 +0,0 @@
|
|||
### User interface
|
||||
* Search filter should now be case-insensitive for more than just ASCII characters (#9328)
|
2
changelog_entries/orcish_xbowman_nerf.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
### Units
|
||||
* Orcish Crossbowman: melee 6-3 -> 4-3, experience to level 43 -> 57
|
|
@ -1,2 +0,0 @@
|
|||
### Formula API
|
||||
* Removed properties `unit.side` and `terrain.owner`. Use `unit.side_number` and `terrain.owner_side` instead.
|
|
@ -1,6 +1,5 @@
|
|||
Date,File,License,Author - Real Name(other name);Real Name(other name);etc,Notes,Needs Update,MD5
|
||||
2009/04/10,data/campaigns/Delfadors_Memoirs/sounds/rumble.wav,GNU GPL v2+,Fabian Müller(fabi/fendrin);Eric S. Raymond(esr),,,ba2422ca12aeebe50955c8f44b52243d
|
||||
2023/09/15,data/campaigns/Eastern_Invasion/music/cry_from_elensefar.ogg,CC BY-SA 4.0,(pluft),,,3b32d7970ab520b2d488559b69b2ac68
|
||||
2023/09/15,data/campaigns/Eastern_Invasion/music/heavens-remix.ogg,CC BY-SA 4.0,(gabriel silver);(dalas),,,158c80c11e2d2cdb5f1ab5cc0298a8fe
|
||||
2023/09/15,data/campaigns/Eastern_Invasion/music/journeys_end_faststart.ogg,GNU GPL v2+,Mattias Westlund(West);(dalas),,,3f6b2c8be4e6e30087b7a3cc5969831b
|
||||
2021/03/20,data/campaigns/Eastern_Invasion/sounds/gate-fall.ogg,GNU GPL v2+,unknown,,,15d08eb898db8684f18de206a6cbd1a5
|
||||
|
@ -25,6 +24,7 @@ Date,File,License,Author - Real Name(other name);Real Name(other name);etc,Notes
|
|||
2013/12/08,data/core/music/battle.ogg,GNU GPL v2+,Aleksi Aubry-Carlson(Aleksi),,,93b53db9e81c0d8879cf4ca51cd246bd
|
||||
2013/12/08,data/core/music/breaking_the_chains.ogg,GNU GPL v2+,Mattias Westlund(West),,,fe599b1e02f41846a6e2afeb7d6df76e
|
||||
2013/12/08,data/core/music/casualties_of_war.ogg,GNU GPL v2+,Tyler Johnson,,,f0c69501a222afd01218ed783fef7b14
|
||||
2023/09/15,data/core/music/cry_from_elensefar.ogg,CC BY-SA 4.0,(pluft),,,3b32d7970ab520b2d488559b69b2ac68
|
||||
2013/12/08,data/core/music/defeat.ogg,GNU GPL v2+,Timothy Pinkham(TimothyP),,,8cb8eb9871292ad288f5c703f0679460
|
||||
2013/12/08,data/core/music/defeat2.ogg,GNU GPL v2+,Ryan Reilly(Rain),,,9775634e4a20c10844c823d5d79f824f
|
||||
2013/12/08,data/core/music/elf-land.ogg,GNU GPL v2+,Aleksi Aubry-Carlson(Aleksi),,,addc5393092c23f2789a028d94f4212e
|
||||
|
|
|
|
@ -21,6 +21,14 @@
|
|||
[/option]
|
||||
[/advanced_preference]
|
||||
|
||||
[advanced_preference]
|
||||
field=addon_icons
|
||||
name= _ "Whether to show icons in the add-ons list on the add-ons manager"
|
||||
description= _ "Disabling saves bandwidth by not sending icons for the add-ons list in the add-ons manager"
|
||||
type=boolean
|
||||
default=yes
|
||||
[/advanced_preference]
|
||||
|
||||
[advanced_preference]
|
||||
field=ask_delete
|
||||
name= _ "Confirm deleting saves"
|
||||
|
|
|
@ -470,7 +470,7 @@ Note: This is a demonstration of how the Goto Micro AI can be used to code guard
|
|||
[message]
|
||||
side=7
|
||||
type=Vampire Bat
|
||||
message= _ "Us four bats switch between running off to the corners of the map (each one to a different corner), and getting back in a group right here. Either behavior is set up with a single [micro_ai] tag, one with 'unique_goals=yes', the other without." # wmllint: no spellcheck
|
||||
message= _ "Us four bats switch between running off to the corners of the map (each one to a different corner), and getting back in a group right here. Either behavior is set up with a single [micro_ai] tag, one with ‘unique_goals=yes’, the other without." # wmllint: no spellcheck
|
||||
[/message]
|
||||
[/event]
|
||||
|
||||
|
@ -488,7 +488,7 @@ Note: This is a demonstration of how the Goto Micro AI can be used to code guard
|
|||
[/message]
|
||||
[message]
|
||||
speaker=messenger1
|
||||
message= _ "Don’t worry, those are really shy ghosts. Nobody knows why, but they always appear in the north this time of year and move through to the south. Also, very unusually for ghosts, they seem to be scared of everybody and avoid other units as much as possible -- except for the bats and saurians, with which they seem to get along just fine for some reason. So as long as we don’t corner them, they’ll leave us alone."
|
||||
message= _ "Don’t worry, those are really shy ghosts. Nobody knows why, but they always appear in the north this time of year and move through to the south. Also, very unusually for ghosts, they seem to be scared of everybody and avoid other units as much as possible — except for the bats and saurians, with which they seem to get along just fine for some reason. So as long as we don’t corner them, they’ll leave us alone."
|
||||
[/message]
|
||||
[event]
|
||||
name=side 8 turn
|
||||
|
@ -553,7 +553,7 @@ Note: This is a demonstration of how the Goto Micro AI can be used to code guard
|
|||
speaker=messenger1
|
||||
message= _ "You’re crazy. It might be shorter as the crow flies, but it will take you forever to get through those mountains.
|
||||
|
||||
Note: The messengers are controlled by Goto Micro AI definitions that differ by a single line, 'use_straight_line=yes/no'." # wmllint: no spellcheck
|
||||
Note: The messengers are controlled by Goto Micro AI definitions that differ by a single line, ‘use_straight_line=yes/no’." # wmllint: no spellcheck
|
||||
[/message]
|
||||
|
||||
[micro_ai]
|
||||
|
|
|
@ -398,7 +398,7 @@ separate attack Zone"
|
|||
speaker=narrator
|
||||
image=portraits/dwarves/guard.webp
|
||||
caption= _ "Standard WML Guardian"
|
||||
message= _ "This is the built-in WML guardian coded using 'ai_special=guardian'. These guardians attack if there is an enemy within their movement range, otherwise they do nothing (except maybe retreating to a village for healing)."
|
||||
message= _ "This is the built-in WML guardian coded using ‘ai_special=guardian’. These guardians attack if there is an enemy within their movement range, otherwise they do nothing (except maybe retreating to a village for healing)."
|
||||
[/message]
|
||||
[/command]
|
||||
[/set_menu_item]
|
||||
|
|
|
@ -147,7 +147,7 @@
|
|||
[message]
|
||||
speaker=Grnk
|
||||
caption= _ "Guardian Micro AI demo"
|
||||
message= _ "In ‘Guardians’, several variations of the standard Wesnoth guardian are shown, including a ""coward"" unit that runs away from any approaching unit (an ""inverse guardian"", in a way)."
|
||||
message= _ "In ‘Guardians’, several variations of the standard Wesnoth guardian are shown, including a “coward” unit that runs away from any approaching unit (an “inverse guardian”, in a way)."
|
||||
[/message]
|
||||
[/command]
|
||||
[/set_menu_item]
|
||||
|
@ -224,7 +224,7 @@
|
|||
[message]
|
||||
speaker=Grnk
|
||||
caption= _ "HttT: The Elves Besieged Micro AI demo"
|
||||
message= _ "This is a reenactment of scenario ""The Elves Besieged"" of the mainline campaign ""Heir to the Throne"", just that the AI is playing Konrad’s side here. The same algorithm as for scenario ""Protect Unit"" is used."
|
||||
message= _ "This is a reenactment of scenario “The Elves Besieged” of the mainline campaign “Heir to the Throne”, just that the AI is playing Konrad’s side here. The same algorithm as for scenario “Protect Unit” is used."
|
||||
[/message]
|
||||
[/command]
|
||||
[/set_menu_item]
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
# This is AI test scenario which is not visible to casual player.
|
||||
[test]
|
||||
id=ai_arena_small
|
||||
name= _ "AI Arena - small"
|
||||
name= _ "AI Arena — small"
|
||||
description= _ "Small ai arena"
|
||||
map_file=ai/maps/scenario-AI_Arena_small.map
|
||||
random_start_time="no"
|
||||
|
@ -310,7 +310,7 @@
|
|||
[message]
|
||||
speaker=narrator
|
||||
image=wesnoth-icon.png
|
||||
message= _ "And so, the AI for team 2 was redeployed from file '$test_path_to_ai'"
|
||||
message= _ "And so, the AI for team 2 was redeployed from file ‘$test_path_to_ai’"
|
||||
[/message]
|
||||
[/event]
|
||||
[/test]
|
||||
|
|
|
@ -620,10 +620,12 @@
|
|||
x,y=$x1,$y1
|
||||
id=Keshan
|
||||
[/have_unit]
|
||||
[message]
|
||||
speaker=unit
|
||||
message= _ "There is somebody here."
|
||||
[/message]
|
||||
[then]
|
||||
[message]
|
||||
speaker=unit
|
||||
message= _ "There is somebody here."
|
||||
[/message]
|
||||
[/then]
|
||||
[else]
|
||||
[message]
|
||||
speaker=unit
|
||||
|
|
|
@ -550,7 +550,7 @@
|
|||
end
|
||||
-- level the unit and give it a random amount of experience up to half of max
|
||||
units[i].experience = units[i].max_experience
|
||||
units[i]:advance( )
|
||||
units[i]:advance(false)
|
||||
units[i].experience = mathx.random ( 0, mathx.round( units[i].max_experience / 2 ) )
|
||||
end
|
||||
>>
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
# e.g. Reducing an ally's gold on high difficulty can make them feel useless, which is not my intention for any of the scenarios with allies
|
||||
#
|
||||
# my goal is for Easy/Normal/Hard difficulty to be 20%/60%/100%; that is to say Easy has 1/5 as many enemies as Hard, and Normal has 3/5 as many
|
||||
# this many not always translate directly to 20/60/100 gold/income, since enemies with many villages effectively have a higher guranteed incoime
|
||||
# this may not always translate directly to 20/60/100 gold/income, since enemies with many villages effectively have a higher guaranteed income
|
||||
# also, remember that [side] {INCOME} doesn't include everyone's base +2 income
|
||||
# and also, some optional "challenge" scenarios have reduced scaling (e.g. All-In), since they're intended as challenges and easily avoidable
|
||||
#
|
||||
|
@ -82,10 +82,10 @@
|
|||
# S08-S12, Gweddry and Co are in the northlands, dealing with the Chief Dra-Nak subplot and trying to get Dacyn's amulet
|
||||
# cramped and/or small battles, focused around looting items and saving enough gold to keep your recalls alive in S12
|
||||
# S13-S18, Gweddry and Co are witnessing a dying Wesnoth, and finally fighting as part of a proper army in a full-fledged war
|
||||
# big battles, where your performance in S01-S12 determine how successful you'll be
|
||||
# big battles, where your performance in S01-S12 determines how successful you'll be
|
||||
#
|
||||
# the campaign is designed with lots of easy-or-hard branching decision points, where one option is easier but the other option has better rewards
|
||||
# S12 "Evacuation" also functions as a decision point - you're guranteed a win even if you don't recruit any units, but the fewer recalls escape the more difficult the future will be
|
||||
# S12 "Evacuation" also functions as a decision point - you're guaranteed a win even if you don't recruit any units, but the fewer recalls escape the more difficult the future will be
|
||||
# players should be able to complete the campaign by taking only the easy, lower-reward options, culminating in the easier finale S17a "The Duel"
|
||||
# but only players who've succeeded at some challenges will have a strong enough army to complete the more difficult finale S17b "All-In"
|
||||
#
|
||||
|
|
|
@ -81,7 +81,7 @@ function wml_actions.bandit_village_capture(cfg)
|
|||
vars.villages_visited = visited + 1
|
||||
|
||||
wesnoth.game_events.fire("addogin_advice", x, y, unit);
|
||||
wml.fire("message" , { x = x , y = y , message = _"They're here!"})
|
||||
wml.fire("message" , { x = x , y = y , message = _"They’re here!"})
|
||||
|
||||
bandits_found(x,y)
|
||||
return
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
#po: The River Guard posts had been built in 470 YW; they were abandoned in 544 YW.
|
||||
#po: The wave of colonization had begun around 530 YW.
|
||||
#po: This intro starts in 625 YW; the king's forces arrive at the outposts in 626 YW.
|
||||
story= _ "In the days of King Garard I, two strong points had been built along the near bank of the River Weldyn, south of Soradoc, to stop bandits and orcish raiders out of the Estmarks from entering Wesnoth. In later years, the river guard posts had been abandoned as colonists spread into the Estmarks and the orcs were driven in retreat north of the Great River."
|
||||
story= _ "In the days of King Garard I, two strong points had been built along the far bank of the River Weldyn, south of Soradoc, to stop bandits and orcish raiders out of the Estmarks from entering Wesnoth. In later years, the river guard posts had been abandoned as colonists spread into the Estmarks and the orcs were driven in retreat north of the Great River."
|
||||
{EI_BIGMAP}
|
||||
[/part]
|
||||
[part]
|
||||
|
@ -673,7 +673,7 @@
|
|||
[message]
|
||||
speaker=Gweddry
|
||||
#po: a huge number of undead are spawning
|
||||
message= _ "Wha- How did so many of them flank us? We’re cut off from Wesnoth!"
|
||||
message= _ "Wha— How did so many of them flank us? We’re cut off from Wesnoth!"
|
||||
[/message]
|
||||
|
||||
# Dacyn reappears and gives message about trapdoor.
|
||||
|
|
|
@ -133,6 +133,8 @@
|
|||
[/modifications]
|
||||
[/unit]
|
||||
|
||||
#endif
|
||||
#ifdef NORMAL
|
||||
{NAMED_NOTRAIT_UNIT 3 (Troll Whelp) 23 8 "Hur" (_"Hur")} {GUARDIAN}
|
||||
[+unit]
|
||||
[modifications]
|
||||
|
|
|
@ -321,9 +321,6 @@
|
|||
#po: star wars reference
|
||||
message= _ "We will watch your career with great interest..."
|
||||
[/message]
|
||||
[endlevel]
|
||||
result=defeat
|
||||
[/endlevel]
|
||||
[/event]
|
||||
[event]
|
||||
name=last breath
|
||||
|
@ -335,10 +332,6 @@
|
|||
speaker=Mal-Tar
|
||||
message= _ "Wait, please, not like this!"
|
||||
[/message]
|
||||
|
||||
# add in the herodeaths. Don't do these before, since we want special behavior for the achievement
|
||||
{HERODEATH_GWEDDRY}
|
||||
{HERODEATH_DACYN}
|
||||
[/event]
|
||||
[event]
|
||||
name=die
|
||||
|
|
|
@ -485,6 +485,7 @@
|
|||
[/set_achievement]
|
||||
[/then]
|
||||
[/if]
|
||||
{HERODEATH_ADDOGIN}
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
|
|
|
@ -801,7 +801,7 @@
|
|||
[else]
|
||||
[gold]
|
||||
side=1
|
||||
amount=-50
|
||||
amount=-$gold_cost
|
||||
[/gold]
|
||||
[sound]
|
||||
name=gold.ogg
|
||||
|
@ -884,7 +884,7 @@
|
|||
[else]
|
||||
[gold]
|
||||
side=1
|
||||
amount=-150
|
||||
amount=-$gold_extra
|
||||
[/gold]
|
||||
[sound]
|
||||
name=gold.ogg
|
||||
|
@ -1008,7 +1008,7 @@
|
|||
[/status]
|
||||
[/modify_unit]
|
||||
|
||||
{CLEAR_VARIABLE gold,gold_cost,herbs_needed,herb_locations}
|
||||
{CLEAR_VARIABLE gold,gold_cost,gold_extra,herbs_needed,herb_locations}
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
|
|
|
@ -230,31 +230,32 @@
|
|||
[/effect]
|
||||
[/modify_unit]
|
||||
[/event]
|
||||
[event] # manually set gold to 0
|
||||
[event]
|
||||
# if ravanal's low on units and ravanal_no_income is cleared, give him gold
|
||||
# otherwise, clear Mal-Ravanal's gold so we don't go positive nor negative
|
||||
name=side 7 turn refresh
|
||||
first_time_only=no
|
||||
|
||||
[filter_condition]
|
||||
{VARIABLE_CONDITIONAL ravanal_no_income equals yes}
|
||||
[/filter_condition]
|
||||
|
||||
[modify_side]
|
||||
side=7
|
||||
gold=0
|
||||
[/modify_side]
|
||||
[/event]
|
||||
[event] # manually set gold to 1000
|
||||
name=side 1
|
||||
first_time_only=no
|
||||
|
||||
[filter_condition]
|
||||
[if]
|
||||
{VARIABLE_CONDITIONAL ravanal_no_income not_equals yes}
|
||||
[/filter_condition]
|
||||
|
||||
[modify_side]
|
||||
side=7
|
||||
gold=9999
|
||||
[/modify_side]
|
||||
[and]
|
||||
[have_unit]
|
||||
side=7
|
||||
count=0-10
|
||||
[/have_unit]
|
||||
[/and]
|
||||
[then]
|
||||
[modify_side]
|
||||
side=7
|
||||
gold=500
|
||||
[/modify_side]
|
||||
[/then]
|
||||
[else]
|
||||
[modify_side]
|
||||
side=7
|
||||
gold=0
|
||||
[/modify_side]
|
||||
[/else]
|
||||
[/if]
|
||||
[/event]
|
||||
|
||||
#--------------------
|
||||
|
@ -664,6 +665,12 @@
|
|||
side=4
|
||||
amount={ON_DIFFICULTY 15 45 75} # otherwise his armies start to feel a little thin around now
|
||||
[/gold]
|
||||
[fire_event]
|
||||
name=dacyn_warning
|
||||
[/fire_event]
|
||||
[/event]
|
||||
[event]
|
||||
name=dacyn_warning
|
||||
[message]
|
||||
speaker=Dacyn
|
||||
message= _ "Gweddry, we should not be here. They are merely toying with us right now, but all will be lost if Mal-Ravanal finds me amongst you!"
|
||||
|
@ -687,6 +694,9 @@
|
|||
[event]
|
||||
name=ravanal_gets_serious
|
||||
|
||||
[fire_event]
|
||||
name=dacyn_warning
|
||||
[/fire_event]
|
||||
{REPLACE_SCENARIO_MUSIC silence.ogg}
|
||||
[message] # if you change this, also change 06b_Soradoc
|
||||
speaker=Mal-Ravanal
|
||||
|
@ -914,7 +924,7 @@
|
|||
[/then]
|
||||
|
||||
[else]
|
||||
{FIND_NEARBY (type,side=Knight,1) 36 15 99}
|
||||
{FIND_NEARBY (trait,side=survivor,1) 36 15 99}
|
||||
[/else]
|
||||
[/if]
|
||||
[message]
|
||||
|
@ -923,7 +933,6 @@
|
|||
[/message]
|
||||
|
||||
{FIND_NEARBY (
|
||||
type=Knight,Terraent
|
||||
side=8
|
||||
) 36 15 99}
|
||||
[message]
|
||||
|
|
|
@ -516,6 +516,38 @@
|
|||
{MODIFY_UNIT id=Dacyn attacks_left 0}
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
name=owaec_joins
|
||||
|
||||
[capture_village]
|
||||
owner_side=2
|
||||
side=1
|
||||
[/capture_village]
|
||||
[modify_unit]
|
||||
[filter]
|
||||
side=2
|
||||
[/filter]
|
||||
|
||||
side=1
|
||||
moves=$($this_unit.max_moves)
|
||||
attacks_left=1
|
||||
{TEAM_COLOR_OVERRIDE () blue}
|
||||
[/modify_unit]
|
||||
[message]
|
||||
speaker=narrator
|
||||
image=wesnoth-icon.png
|
||||
message= _ "(You may now recruit Horsemen and Cavalrymen!)"
|
||||
[/message]
|
||||
[set_extra_recruit] # need to set recruits per-unit (instead of per-side) so we don't mess up the plague staff
|
||||
id=Gweddry
|
||||
extra_recruit={REGULAR_RECRUIT_LIST}
|
||||
[/set_extra_recruit]
|
||||
[set_extra_recruit]
|
||||
id=Owaec
|
||||
extra_recruit={REGULAR_RECRUIT_LIST}
|
||||
[/set_extra_recruit]
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
name=capture
|
||||
first_time_only=no
|
||||
|
@ -718,34 +750,9 @@
|
|||
speaker=Owaec
|
||||
message= _ "Huzzah!! At last, these villagers are liberated! Gweddry, thank you for your aid. I place my Clansmen and myself at your service."
|
||||
[/message]
|
||||
[capture_village]
|
||||
owner_side=2
|
||||
side=1
|
||||
[/capture_village]
|
||||
[modify_unit]
|
||||
[filter]
|
||||
side=2
|
||||
[/filter]
|
||||
|
||||
side=1
|
||||
moves=$($this_unit.max_moves)
|
||||
attacks_left=1
|
||||
{TEAM_COLOR_OVERRIDE () blue}
|
||||
[/modify_unit]
|
||||
[message]
|
||||
speaker=narrator
|
||||
image=wesnoth-icon.png
|
||||
message= _ "(You may now recruit Horsemen and Cavalrymen!)"
|
||||
[/message]
|
||||
[set_extra_recruit] # need to set recruits per-unit (instead of per-side) so we don't mess up the plague staff
|
||||
id=Gweddry
|
||||
extra_recruit={REGULAR_RECRUIT_LIST}
|
||||
[/set_extra_recruit]
|
||||
[set_extra_recruit]
|
||||
id=Owaec
|
||||
extra_recruit={REGULAR_RECRUIT_LIST}
|
||||
[/set_extra_recruit]
|
||||
|
||||
[fire_event]
|
||||
name=owaec_joins
|
||||
[/fire_event]
|
||||
[if]
|
||||
[not]
|
||||
[have_unit]
|
||||
|
@ -879,33 +886,9 @@
|
|||
speaker=Owaec
|
||||
message= _ "Huzzah!! May these be the first of many undead to fall before our hooves! Gweddry, thank you for your aid. I place my Clansmen and myself at your service."
|
||||
[/message]
|
||||
[capture_village]
|
||||
owner_side=2
|
||||
side=1
|
||||
[/capture_village]
|
||||
[modify_unit]
|
||||
[filter]
|
||||
side=2
|
||||
[/filter]
|
||||
|
||||
side=1
|
||||
moves=$($this_unit.max_moves)
|
||||
attacks_left=1
|
||||
{TEAM_COLOR_OVERRIDE () blue}
|
||||
[/modify_unit]
|
||||
[message]
|
||||
speaker=narrator
|
||||
image=wesnoth-icon.png
|
||||
message= _ "(You may now recruit Horsemen and Cavalrymen!)"
|
||||
[/message]
|
||||
[set_extra_recruit] # need to set recruits per-unit (instead of per-side) so we don't mess up the plague staff
|
||||
id=Gweddry
|
||||
extra_recruit={REGULAR_RECRUIT_LIST}
|
||||
[/set_extra_recruit]
|
||||
[set_extra_recruit]
|
||||
id=Owaec
|
||||
extra_recruit={REGULAR_RECRUIT_LIST}
|
||||
[/set_extra_recruit]
|
||||
[fire_event]
|
||||
name=owaec_joins
|
||||
[/fire_event]
|
||||
[message]
|
||||
speaker=Owaec
|
||||
message= _ "Now let us free these villagers from the outlaws terrorizing them!"
|
||||
|
|
|
@ -918,19 +918,6 @@
|
|||
[/message]
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
name=last breath
|
||||
|
||||
[filter]
|
||||
id=Grug
|
||||
[/filter]
|
||||
|
||||
[message]
|
||||
speaker=Grug
|
||||
message= _ "Hurt... grarrgghh..." # wmllint: no spellcheck
|
||||
[/message]
|
||||
[/event]
|
||||
|
||||
{ENEMYDEATHS_SORADOC}
|
||||
{FOREIGN_DEFEAT}
|
||||
|
||||
|
@ -940,9 +927,8 @@
|
|||
{HERODEATH_ADDOGIN}
|
||||
{HERODEATH_HAHID}
|
||||
{HERODEATH_TERRAENT}
|
||||
# {HERODEATH_GRUG} # don't have Gweddry say "he was not one of us, yet [...]"
|
||||
{HERODEATH_GRUG}
|
||||
{HERODEATH_DOLBURRAS}
|
||||
{HERODEATH_HAHID}
|
||||
[/scenario]
|
||||
|
||||
#undef SCENARIO_TURN_LIMIT
|
||||
|
|
|
@ -1731,13 +1731,13 @@ The darkness between worlds opens its maw."
|
|||
[/message]
|
||||
[message]
|
||||
speaker=unit
|
||||
message= _ "<i>Journal of Ravan - 13 Blackfire, 588 YW.
|
||||
message= _ "<i>Journal of Ravan — 13 Blackfire, 588 YW.
|
||||
|
||||
This expedition is proving a greater success than I had anticipated. While Dacyn disarms the traps littered around this place, I have been able to conduct extensive research into the other plane beyond the Maw. There is a realm of souls that can be reached from our very own world, one that Iliah-Malal doubtlessly made contact with using the Amulet of the Veil. From time to time, I hear spirits whispering from the other side, but their voices are faint as of yet. I suspect that if I can somehow reach them, they will be able to answer some of the questions I have been pondering. However, there seems to be a piece of the puzzle still missing.</i>"
|
||||
[/message]
|
||||
[message]
|
||||
speaker=unit
|
||||
message= _ "<i>Journal of Ravan - 21 Whitefire, 589 YW.
|
||||
message= _ "<i>Journal of Ravan — 21 Whitefire, 589 YW.
|
||||
|
||||
I had a dream tonight. Was it a dream? It seemed much more like a vision. I saw a scorching light from twin orbs in the sky, radiating searing brightness over a land teeming with aberrations of constantly shifting flesh. I saw a jewel, no, a key, alight with fire bridging the vast nothingness of the Maw. I saw darkness, merged with light and transfigured, rending the indestructible core of those without form. I hear voices recounting these muddled dreams, yet their words are disjointed, incomprehensible. What are they trying to tell me?</i>"
|
||||
[/message]
|
||||
|
@ -1761,7 +1761,7 @@ I had a dream tonight. Was it a dream? It seemed much more like a vision. I saw
|
|||
[/filter]
|
||||
[message]
|
||||
speaker=unit
|
||||
message= _ "<i>Journal of Ravan - 5 Bleeding Moon, 597 YW.
|
||||
message= _ "<i>Journal of Ravan — 5 Bleeding Moon, 597 YW.
|
||||
|
||||
Nothing is going well. My research has come to a dead end and even the spirits from the other plane no longer speak to me. I can no longer rely on Dacyn either. That stupid man! He decided that playing politics would be a better use of his abilities than helping me decipher this crucial puzzle. As if he could do any good, being the advisor to that half-decrepit old King Haldric. Then again, maybe that is the game Dacyn wants to play. What a shame. I had held him in higher regard than that.</i>"
|
||||
[/message]
|
||||
|
|
|
@ -1862,5 +1862,6 @@ Your punishment is death."
|
|||
{HERODEATH_TERRAENT}
|
||||
{HERODEATH_DOLBURRAS}
|
||||
{HERODEATH_GRUG}
|
||||
{HERODEATH_ADDOGIN}
|
||||
{HERODEATH_HAHID}
|
||||
[/scenario]
|
||||
|
|
|
@ -252,9 +252,9 @@
|
|||
id=dacyn_no_halo
|
||||
[effect]
|
||||
apply_to=remove_ability
|
||||
[experimental_filter_ability]
|
||||
[filter_ability]
|
||||
tag_name=illuminates
|
||||
[/experimental_filter_ability]
|
||||
[/filter_ability]
|
||||
[/effect]
|
||||
[/object]
|
||||
[/modify_unit]
|
||||
|
@ -419,9 +419,9 @@
|
|||
id=dacyn_no_halo
|
||||
[effect]
|
||||
apply_to=remove_ability
|
||||
[experimental_filter_ability]
|
||||
[filter_ability]
|
||||
tag_name=illuminates
|
||||
[/experimental_filter_ability]
|
||||
[/filter_ability]
|
||||
[/effect]
|
||||
[/object]
|
||||
[/modify_unit]
|
||||
|
@ -802,7 +802,7 @@ And the strength of our Flight."
|
|||
[message]
|
||||
speaker=$found_unit.id
|
||||
#po: Speaker is an orc, and Mortic is flying towards them. "What? Hey!" *gets killed by Mortic*
|
||||
message= _ "Wha- hey!"
|
||||
message= _ "Wha— hey!"
|
||||
[/message]
|
||||
[animate_unit]
|
||||
[filter]
|
||||
|
|
|
@ -5,18 +5,13 @@
|
|||
# when you stumble upon 1, it awakens some nearby buddies
|
||||
# when you sight an enemy leader, they recruit, awaken sleepers, and charge at you
|
||||
#
|
||||
# the turn limit is very generous. A player with many veterans can finish quickly and have a large bonus for S16
|
||||
# alternatively, maybe the player only has a few veterans (maybe they lost everything in S12 Evacuation)
|
||||
# then they can take their time, cap villages, farm XP off the swamp, etc.
|
||||
# and wait as long as possible to activate enemy leaders
|
||||
#
|
||||
# note that the map is based off of the penultimate HttT scenario, "Test of the Clans"
|
||||
#
|
||||
|
||||
#define SCENARIO_TURN_LIMIT
|
||||
75 #enddef
|
||||
25 #enddef
|
||||
#define TURNS_LOW_WARNING
|
||||
60 #enddef
|
||||
20 #enddef
|
||||
|
||||
[scenario]
|
||||
id=14_The_Drowned_Plains
|
||||
|
@ -778,10 +773,36 @@
|
|||
clear_shroud=yes
|
||||
side=1
|
||||
[/redraw]
|
||||
#enddef
|
||||
#define GOLD_PICKUP X Y IMAGE AMOUNT LABEL
|
||||
{PLACE_IMAGE {IMAGE} {X} {Y}}
|
||||
{SET_LABEL {X} {Y} {LABEL}}
|
||||
[event]
|
||||
name=moveto
|
||||
[filter]
|
||||
side=1
|
||||
x,y={X},{Y}
|
||||
[/filter]
|
||||
[sound]
|
||||
name=gold.ogg
|
||||
[/sound]
|
||||
[gold]
|
||||
side,amount=1,{AMOUNT}
|
||||
[/gold]
|
||||
{REMOVE_IMAGE $unit.x $unit.y}
|
||||
{REMOVE_LABEL {X} {Y}}
|
||||
[/event]
|
||||
#enddef
|
||||
[event]
|
||||
name=prestart
|
||||
|
||||
{GOLD_PICKUP 69 43 items/gold-coins-medium.png 105 _"105 gold"}
|
||||
{GOLD_PICKUP 70 41 items/gold-coins-small.png 80 _"80 gold"}
|
||||
{GOLD_PICKUP 18 4 items/gold-coins-medium.png 175 _"175 gold"}
|
||||
{GOLD_PICKUP 9 50 items/gold-coins-small.png 55 _"55 gold"}
|
||||
{GOLD_PICKUP 8 50 items/gold-coins-medium.png 150 _"150 gold"}
|
||||
{GOLD_PICKUP 5 51 items/gold-coins-small.png 80 _"80 gold"}
|
||||
|
||||
{SET_LABEL 16 24 _"Lord Alric’s Palace" }
|
||||
{SET_LABEL 17 5 _"Sir Efran’s Castle" }
|
||||
{SET_LABEL 7 50 _"Lord Gaelyc’s Citadel"}
|
||||
|
@ -1257,13 +1278,15 @@
|
|||
[/message]
|
||||
[message]
|
||||
speaker=Gweddry
|
||||
message= _ "I agree, yet all is strangely quiet. Perhaps the remaining undead lie dormant? If we take time to capture villages and rebuild our forces, we may yet be able to reclaim this place."
|
||||
message= _ "I agree, yet all is strangely quiet. Perhaps the remaining undead lie dormant?
|
||||
|
||||
Even if we lack the strength to truly reclaim this place, we should still take the opportunity to gather what supplies remain. When finally we meet the shambling hordes responsible for all this destruction, we must not find our armories wanting."
|
||||
[/message]
|
||||
|
||||
[objectives]
|
||||
side=1
|
||||
[objective]
|
||||
description= _ "Defeat all enemy leaders"
|
||||
description= _ "Gather as much gold as you can before turns run out."
|
||||
condition=win
|
||||
[/objective]
|
||||
[objective]
|
||||
|
@ -1278,17 +1301,13 @@
|
|||
description= _ "Death of Gweddry, Dacyn, or Owaec"
|
||||
condition=lose
|
||||
[/objective]
|
||||
{TURNS_RUN_OUT}
|
||||
[gold_carryover]
|
||||
bonus=yes
|
||||
carryover_percentage=40
|
||||
bonus=no
|
||||
carryover_percentage=80
|
||||
[/gold_carryover]
|
||||
[note]
|
||||
description= _ "Enemy leaders are idle until first sighted, but will then abandon their keep and attack you."
|
||||
[/note]
|
||||
[note]
|
||||
description= _ "It may be wise to capture villages and build up an army before attacking."
|
||||
[/note]
|
||||
[/objectives]
|
||||
|
||||
[event]
|
||||
|
@ -1744,19 +1763,44 @@ I offer one final prayer to the Light, that at least my family may be spared and
|
|||
[filter]
|
||||
id=Khrakrahs
|
||||
[/filter]
|
||||
|
||||
[effect]
|
||||
apply_to=new_ability
|
||||
[abilities]
|
||||
{ABILITY_TERROR}
|
||||
[/abilities]
|
||||
[/effect]
|
||||
|
||||
[effect]
|
||||
apply_to=movement
|
||||
set=3
|
||||
set=3 # needs to be slow, or else his escort can't keep up
|
||||
[/effect]
|
||||
[effect]
|
||||
apply_to=hitpoints
|
||||
increase_total={ON_DIFFICULTY 0 25 50}
|
||||
heal_full=yes
|
||||
[/effect]
|
||||
[effect]
|
||||
apply_to=new_attack
|
||||
name=tail
|
||||
description= _"tail"
|
||||
icon=attacks/tail-dragon.png~GS()
|
||||
type=impact
|
||||
range=melee
|
||||
damage=41 # not quite enough to 1-shot a Heavy Infantryman, unless at night and non-illuminated. This makes the difference between a HI and a Shock Trooper less extreme
|
||||
number=1
|
||||
[/effect]
|
||||
[effect]
|
||||
apply_to=new_animation
|
||||
[attack_anim]
|
||||
[filter_attack]
|
||||
name=tail
|
||||
[/filter_attack]
|
||||
start_time=-200
|
||||
[frame]
|
||||
image="units/monsters/skeletal-dragon/skeletal-dragon.png:400"
|
||||
[/frame]
|
||||
{SOUND:HIT_AND_MISS mace.ogg mace-miss.ogg -75}
|
||||
[/attack_anim]
|
||||
[/effect]
|
||||
# needs to be slow, or else his escort can't keep up
|
||||
[/object]
|
||||
[fire_event]
|
||||
name=moveto
|
||||
|
@ -2049,53 +2093,42 @@ I offer one final prayer to the Light, that at least my family may be spared and
|
|||
# FLAVOR
|
||||
#--------------------
|
||||
[event]
|
||||
name=last breath
|
||||
|
||||
[filter]
|
||||
id=Sir Seoraery,Sir Efran,Khrakrahs
|
||||
[/filter]
|
||||
|
||||
[event]
|
||||
name=new turn
|
||||
[event]
|
||||
name=new turn
|
||||
[message]
|
||||
speaker=Gweddry
|
||||
#po: spoken at the start of a new turn after killing the first undead leader
|
||||
message= _ "Dacyn, I’ve been thinking. This artifact has had such a draining effect on you. Perhaps you should rest and take a moment to regain your strength? I could carry the Amulet for a while, or we could store it away."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Dacyn
|
||||
message= _ "Hmm... I suppose there would be no harm in locking it up somewhere safe."
|
||||
[/message]
|
||||
[message]
|
||||
caption= _ "Unknown"
|
||||
image=units/unknown-unit1.png
|
||||
#po: voices from the amulet talking to Dacyn
|
||||
message= _ "<span size='small' font-style='italic'>You have a great weapon... and you would simply lock it away?</span>"
|
||||
[/message]
|
||||
[message]
|
||||
caption= _ "Unknown 2"
|
||||
image=units/unknown-unit2.png
|
||||
#po: voices from the amulet talking to Dacyn, speaking of Gweddry
|
||||
message= _ "<span size='small' font-style='italic'>His intent is good, but his spirit is weak... he would be corrupted...</span>"
|
||||
[/message]
|
||||
[message]
|
||||
caption= _ "Unknown"
|
||||
image=units/unknown-unit1.png
|
||||
#po: voices from the amulet talking to Dacyn
|
||||
message= _ "<span size='small' font-style='italic'>Only you can be trusted with this responsibility.</span>"
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Dacyn
|
||||
message= _ "But on the other hand... this is a dangerous artifact. I fear that only I can withstand its energies."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Gweddry
|
||||
message= _ "Well, you’re the magic expert."
|
||||
[/message]
|
||||
[/event]
|
||||
[/event]
|
||||
name=turn 16
|
||||
[message]
|
||||
speaker=Gweddry
|
||||
#po: spoken at the start of a new turn after killing the first undead leader
|
||||
message= _ "Dacyn, I’ve been thinking. This artifact has had such a draining effect on you. Perhaps you should rest and take a moment to regain your strength? I could carry the Amulet for a while, or we could store it away."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Dacyn
|
||||
message= _ "Hmm... I suppose there would be no harm in locking it up somewhere safe."
|
||||
[/message]
|
||||
[message]
|
||||
caption= _ "Unknown"
|
||||
image=units/unknown-unit1.png
|
||||
#po: voices from the amulet talking to Dacyn
|
||||
message= _ "<span size='small' font-style='italic'>You have a great weapon... and you would simply lock it away?</span>"
|
||||
[/message]
|
||||
[message]
|
||||
caption= _ "Unknown 2"
|
||||
image=units/unknown-unit2.png
|
||||
#po: voices from the amulet talking to Dacyn, speaking of Gweddry
|
||||
message= _ "<span size='small' font-style='italic'>His intent is good, but his spirit is weak... he would be corrupted...</span>"
|
||||
[/message]
|
||||
[message]
|
||||
caption= _ "Unknown"
|
||||
image=units/unknown-unit1.png
|
||||
#po: voices from the amulet talking to Dacyn
|
||||
message= _ "<span size='small' font-style='italic'>Only you can be trusted with this responsibility.</span>"
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Dacyn
|
||||
message= _ "But on the other hand... this is a dangerous artifact. I fear that only I can withstand its energies."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Gweddry
|
||||
message= _ "Well, you’re the magic expert."
|
||||
[/message]
|
||||
[/event]
|
||||
|
||||
#--------------------
|
||||
|
@ -2106,32 +2139,24 @@ I offer one final prayer to the Light, that at least my family may be spared and
|
|||
name=side 1 turn {TURNS_LOW_WARNING}
|
||||
[message]
|
||||
speaker=Gweddry
|
||||
message= _ "We must finish here and hurry on from this dead place! If the Horse Clans have fallen so completely, I fear for Weldyn and the rest of Wesnoth."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Dacyn
|
||||
message= _ "Why are we here at all? We should be advancing towards Weldyn, not humoring Owaec’s lust for vengeance. The Plains are already drowned."
|
||||
message= _ "If the Horse Clans have fallen so completely, I fear for Weldyn and the rest of Wesnoth. We must make the most of our time here; we cannot afford to tarry too long."
|
||||
[/message]
|
||||
[/event]
|
||||
# time over
|
||||
[event]
|
||||
name=side 1 turn {SCENARIO_TURN_LIMIT} end
|
||||
[message]
|
||||
speaker=Dacyn
|
||||
#po: time over, talking to Owaec
|
||||
message= _ "Enough of this. We have wasted too much time here already; give up your foolish quest of vengeance and travel on."
|
||||
[/message]
|
||||
name=time over # not side 1 turn end, so the AI gets a chance to attack
|
||||
[message]
|
||||
speaker=Owaec
|
||||
#po: time over, talking to Dacyn
|
||||
message= _ "Your search for foul magic has caused enough harm already, and now you would leave my countrymen’s bodies defiled by undeath? I will slay everything that moves in this swamp, and once I am done, perhaps my hammer will find you next!"
|
||||
message= _ "So much death. So many of my kinsmen left unavenged. If only we had more time..."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Dacyn
|
||||
message= _ "You fools are welcome to linger here clearing this swamp, but I intend to travel on alone and defeat Mal-Ravanal. Go as you wish on your own. I have a task to complete."
|
||||
speaker=Gweddry
|
||||
message= _ "We have done all we could here."
|
||||
[/message]
|
||||
[endlevel]
|
||||
result=defeat
|
||||
result=victory
|
||||
bonus=no
|
||||
{NEW_GOLD_CARRYOVER 80}
|
||||
[/endlevel]
|
||||
[/event]
|
||||
|
||||
|
@ -2139,40 +2164,35 @@ I offer one final prayer to the Light, that at least my family may be spared and
|
|||
[event]
|
||||
name=die
|
||||
first_time_only=no
|
||||
|
||||
[filter]
|
||||
id=Sir Seoraery,Sir Efran,Khrakrahs
|
||||
[/filter]
|
||||
|
||||
[if]
|
||||
[not]
|
||||
[have_unit]
|
||||
id=Sir Seoraery,Sir Efran,Khrakrahs
|
||||
[/have_unit]
|
||||
[/not]
|
||||
|
||||
[then]
|
||||
[message]
|
||||
speaker=Owaec
|
||||
message= _ "It is done. My kinsmen have been avenged."
|
||||
[/message]
|
||||
{KILL_COUNT 4 side=2,3,4,6,8 ANIMATE=yes}
|
||||
{KILL side=2,3,4,5,6,7,8}
|
||||
[endlevel]
|
||||
result=victory
|
||||
bonus=yes
|
||||
{NEW_GOLD_CARRYOVER 40}
|
||||
{NEW_GOLD_CARRYOVER 80}
|
||||
[/endlevel]
|
||||
[/then]
|
||||
[/if]
|
||||
[/event]
|
||||
[event]
|
||||
name=victory
|
||||
{KILL_COUNT 4 side=2,3,4,6,8 ANIMATE=yes}
|
||||
{KILL side=2,3,4,5,6,7,8}
|
||||
[message]
|
||||
speaker=Owaec
|
||||
message= _ "It is done. My kinsmen have been avenged."
|
||||
[/message]
|
||||
|
||||
[delay]
|
||||
time=1000
|
||||
[/delay]
|
||||
|
||||
[message]
|
||||
speaker=Owaec
|
||||
message= _ "Mage... I owe you an apology. This destruction... even had we journeyed here instead of questing north, we would most assuredly have made no difference. Of that I am now certain.
|
||||
|
@ -2183,11 +2203,9 @@ The fates may yet reveal that our journey north was necessary, even at such a st
|
|||
speaker=Dacyn
|
||||
message= _ "Apology accepted."
|
||||
[/message]
|
||||
|
||||
[delay]
|
||||
time=2000
|
||||
[/delay]
|
||||
|
||||
[message]
|
||||
speaker=Dacyn
|
||||
message= _ "And I too must admit, I underestimated the power in this Amulet. Even now, voices gnaw at the edges of my mind..."
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
controller=human
|
||||
team_name=good
|
||||
user_team_name=_"Wesnothians"
|
||||
{GOLD 100 75 50} # you're expected to have a large early finish bonus from S14; maybe 300-600 gold
|
||||
{GOLD 0 0 0} # you're expected to have a large early finish bonus from S14; maybe 300-600 gold
|
||||
# you get a lot of income, so even with no carryover you can still recruit enough to defend the central island
|
||||
{FLAG_VARIANT loyalist}
|
||||
[/side]
|
||||
|
@ -1882,7 +1882,7 @@ And leave eternal night to remain."
|
|||
[message]
|
||||
speaker=Mel Guthrak
|
||||
#po: last breath of Mel Guthrak
|
||||
message= _ "Wha- but how?"
|
||||
message= _ "Wha— but how?"
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Gaennell
|
||||
|
|
|
@ -315,50 +315,30 @@
|
|||
time=750
|
||||
[/delay]
|
||||
|
||||
[message]
|
||||
speaker=Konrad
|
||||
image=portraits/konrad_II.webp
|
||||
message= _ "Dolburras, Owaec has told me of the help you provided his men; both your skill at arms and your tenacious spirit. We wish to offer you this finely crafted shield — an heirloom of my line — and an honor guard as you return to Knalga."
|
||||
[/message]
|
||||
[if]
|
||||
{VARIABLE_CONDITIONAL plague_staff_wielder_id equals Dolburras}
|
||||
[have_unit]
|
||||
id=Owaec
|
||||
[/have_unit]
|
||||
|
||||
[then]
|
||||
[message]
|
||||
speaker=Konrad
|
||||
image=portraits/konrad_II.webp
|
||||
#po: the player chose to give Dolburras the plague staff
|
||||
message= _ "Dwarf, <i>necromancer</i>, know that Wesnoth will never tolerate your kind. You shall surrender that accursed stave to be destroyed, you shall foreswear the practice of all magic on penalty of death, and you are hereby exiled from Wesnoth. Be grateful for Our mercy."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Dolburras
|
||||
#po: "Yeah, fair enough. I don't think my kinsmen will look kindly upon necromancies either."
|
||||
message= _ "Aye, fair enough. I dinnae think my kinsmen will look kindly upon necromancies either."
|
||||
#po: "Aye, I am honored. You have my sincerest thanks, your Majesty."
|
||||
message= _ "Aye, I be honored. Ye have my sincerest thanks, yer Majesty."
|
||||
[/message]
|
||||
{CLEAR_VARIABLE plague_staff_wielder_id}
|
||||
[/then]
|
||||
|
||||
[else]
|
||||
[message]
|
||||
speaker=Konrad
|
||||
image=portraits/konrad_II.webp
|
||||
message= _ "Dolburras, Owaec has told me of the help you provided his men; both your skill at arms and your tenacious spirit. We wish to offer you this finely crafted shield — an heirloom of my line — and an honor guard as you return to Knalga."
|
||||
speaker=Dolburras
|
||||
#po: Owaec's dead
|
||||
message= _ "Aye, I be honored. I only wish he were here to see the Clans avenged."
|
||||
[/message]
|
||||
[if]
|
||||
[have_unit]
|
||||
id=Owaec
|
||||
[/have_unit]
|
||||
|
||||
[then]
|
||||
[message]
|
||||
speaker=Dolburras
|
||||
#po: "Aye, I am honored. You have my sincerest thanks, your Majesty."
|
||||
message= _ "Aye, I be honored. Ye have my sincerest thanks, yer Majesty."
|
||||
[/message]
|
||||
[/then]
|
||||
|
||||
[else]
|
||||
[message]
|
||||
speaker=Dolburras
|
||||
#po: Owaec's dead
|
||||
message= _ "Aye, I be honored. I only wish he were here to see the Clans avenged."
|
||||
[/message]
|
||||
[/else]
|
||||
[/if]
|
||||
[/else]
|
||||
[/if]
|
||||
[/then]
|
||||
|
@ -423,34 +403,15 @@
|
|||
time=750
|
||||
[/delay]
|
||||
|
||||
[if]
|
||||
{VARIABLE_CONDITIONAL plague_staff_wielder_id equals "Hahid al-Ali"}
|
||||
[then]
|
||||
[message]
|
||||
speaker=Konrad
|
||||
image=portraits/konrad_II.webp
|
||||
#po: the player chose to give Hahid the plague staff
|
||||
message= _ "Southerner, <i>necromancer</i>, know that Wesnoth will never tolerate your kind. You shall surrender that accursed stave to be destroyed, you shall foreswear the practice of all magic on penalty of death, and you are hereby exiled back to the desert wastes. Be grateful for Our mercy."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Hahid al-Ali
|
||||
message= _ "Bah, I save you barbarians from an invasion, and this is the thanks I get! What happened to being paid thrice what I’m owed? So much for northerner generosity!"
|
||||
[/message]
|
||||
{CLEAR_VARIABLE plague_staff_wielder_id}
|
||||
[/then]
|
||||
|
||||
[else]
|
||||
[message]
|
||||
speaker=Konrad
|
||||
image=portraits/konrad_II.webp
|
||||
message= _ "Hahid al-Ali, We know of your far-off people, but great distance has caused little contact between us. May it be thus no longer. If you accept, We would appoint you as ambassador between our two realms."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Hahid al-Ali
|
||||
message= _ "Me, ambassador to the barbarian kingdoms, what a thought! I am honored, and would be even more honored to learn that the job comes with... excellent pay I hope?"
|
||||
[/message]
|
||||
[/else]
|
||||
[/if]
|
||||
[message]
|
||||
speaker=Konrad
|
||||
image=portraits/konrad_II.webp
|
||||
message= _ "Hahid al-Ali, We know of your far-off people, but great distance has caused little contact between us. May it be thus no longer. If you accept, We would appoint you as ambassador between our two realms."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Hahid al-Ali
|
||||
message= _ "Me, ambassador to the barbarian kingdoms, what a thought! I am honored, and would be even more honored to learn that the job comes with... excellent pay I hope?"
|
||||
[/message]
|
||||
[/then]
|
||||
[/if]
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
die_sound=lich-die.ogg
|
||||
{DEFENSE_ANIM "units/dacyn/dacyn-L5-defend1.png" "units/dacyn/dacyn-L5-defend2.png" {SOUND_LIST:HUMAN_OLD_HIT} }
|
||||
[resistance]
|
||||
arcane=130
|
||||
arcane=120
|
||||
cold=70
|
||||
[/resistance]
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
die_sound={SOUND_LIST:HUMAN_OLD_DIE}
|
||||
{DEFENSE_ANIM "units/dacyn/dacyn-L3-defend1.png" "units/dacyn/dacyn-L3-defend2.png" {SOUND_LIST:HUMAN_OLD_HIT} }
|
||||
[resistance]
|
||||
arcane=90
|
||||
arcane=80
|
||||
cold=80
|
||||
[/resistance]
|
||||
|
||||
|
|
|
@ -533,7 +533,7 @@ When an enemy unit of lower level within a 2 hex radius engages in combat, its a
|
|||
id=arcane_damage_blessing
|
||||
name= _ "arcane blessing"
|
||||
description= _ "All attacks combine the arcane type with the type of the weapon used, so that resistance to arcane does not penalize the user."
|
||||
special_note=_ "This unit's weapons are treated as arcane instead of the declared damage type if that would increase the damage."
|
||||
special_note=_ "This unit’s weapons are treated as arcane instead of the declared damage type if that would increase the damage."
|
||||
alternative_type=arcane
|
||||
affect_self=yes
|
||||
overlay_image="misc/arcane-icon.png"
|
||||
|
@ -545,7 +545,7 @@ When an enemy unit of lower level within a 2 hex radius engages in combat, its a
|
|||
id=arcane_damage_ranged_blessing
|
||||
name= _ "arcane blessing"
|
||||
description= _ "All bow or crossbow attacks combine the arcane type with the type of the weapon used, so that resistance to arcane does not penalize the user."
|
||||
special_note=_ "This unit's bow or crossbow attacks are treated as arcane instead of the declared damage type if that would increase the damage."
|
||||
special_note=_ "This unit’s bow or crossbow attacks are treated as arcane instead of the declared damage type if that would increase the damage."
|
||||
alternative_type=arcane
|
||||
affect_self=yes
|
||||
overlay_image="misc/crystal-quiver-icon.png"
|
||||
|
|
|
@ -118,7 +118,7 @@
|
|||
|
||||
[message]
|
||||
speaker=Dolburras
|
||||
message= _ "Watch out behind ye- ach!" # wmllint: no spellcheck
|
||||
message= _ "Watch out behind ye— ach!" # wmllint: no spellcheck
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Gweddry
|
||||
|
@ -139,7 +139,8 @@
|
|||
message= _ "Hurt... grarrgghh..." # wmllint: no spellcheck
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Gweddry
|
||||
id=Gweddry
|
||||
side=$unit.side
|
||||
message= _ "Though he was not one of us, he served bravely alongside Wesnoth’s best. We must carry on the good fight."
|
||||
[/message]
|
||||
[/event]
|
||||
|
@ -171,11 +172,13 @@
|
|||
message= _ "Alas, my long, storied, and exceedingly profitable career has at last come to an end, so far from home! I only... wish I could have died on the soft sands... instead of among these primitive barbarians..."
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Grug
|
||||
id=Grug
|
||||
side=$unit.side
|
||||
message= _ "Bar... ber... bears? Die why?"
|
||||
[/message]
|
||||
[message]
|
||||
speaker=Dolburras
|
||||
id=Dolburras
|
||||
side=$unit.side
|
||||
message= _ "Aye, ‘tis a sad place for one o’ us foreigners to fall. We’ll miss ye, that’s for sure."
|
||||
[/message]
|
||||
[/event]
|
||||
|
|
|
@ -558,7 +558,7 @@
|
|||
{MODIFY_TERRAIN Qxua 24 2}
|
||||
[message]
|
||||
speaker=Mal-Ravanal
|
||||
message= _ "Wha- what is this?!"
|
||||
message= _ "Wha— what is this?!"
|
||||
[/message]
|
||||
|
||||
{DACYN_ATTACK}
|
||||
|
@ -768,7 +768,7 @@
|
|||
[/message]
|
||||
[message]
|
||||
speaker=Dacyn
|
||||
message= _ "Wha- where am I? What’s happening to me?"
|
||||
message= _ "Wha— where am I? What’s happening to me?"
|
||||
[/message]
|
||||
[message]
|
||||
speaker=spirit
|
||||
|
|
|
@ -70,10 +70,7 @@
|
|||
[/then]
|
||||
|
||||
[else]
|
||||
[message]
|
||||
speaker=unit
|
||||
message={INVALID_DESC}
|
||||
[/message]
|
||||
{INVALID_DESC}
|
||||
[/else]
|
||||
[/if]
|
||||
[/event]
|
||||
|
@ -139,7 +136,7 @@ crystal_quiver #enddef
|
|||
_"Crystal Quiver"
|
||||
_"Arrows from this crystalline quiver glimmer with a pale magical light, <i><b>illuminating</b></i> the surrounding area and making your bow or crossbow attacks <i><b>arcane</b></i>."
|
||||
{NOTE_REUSEABLE}
|
||||
""
|
||||
()
|
||||
(
|
||||
[effect]
|
||||
apply_to=new_ability
|
||||
|
@ -181,7 +178,7 @@ holy_amulet_3 #enddef
|
|||
_"Holy Amulet"
|
||||
_"Engraved with a consecrated symbol, this amulet will bless both your <i><b>melee</b></i> and <i><b>ranged</b></i> attacks with <i><b>arcane</b></i> damage."
|
||||
{NOTE_REUSEABLE}
|
||||
""
|
||||
()
|
||||
(
|
||||
[effect]
|
||||
apply_to=new_ability
|
||||
|
@ -216,7 +213,7 @@ sentinel #enddef
|
|||
_"Shield of the Sentinel"
|
||||
_"Deep within this shield’s towering bulk, enchanted machinery whirrs faintly. Whenever an adjacent ally is hit by an attack, <i><b>this shield’s bearer is hit instead</b></i>."
|
||||
{NOTE_REUSEABLE}
|
||||
""
|
||||
()
|
||||
(
|
||||
[effect]
|
||||
apply_to=overlay
|
||||
|
@ -568,7 +565,7 @@ yeti_steak #enddef
|
|||
_"Yetiburger"
|
||||
_"Eating this funny tasting meat <i><b>doubles your hitpoints</b></i> and grants <i><b>immunity to cold</b></i>."
|
||||
{NOTE_SINGLE_USE}
|
||||
""
|
||||
()
|
||||
(
|
||||
[effect]
|
||||
apply_to=hitpoints
|
||||
|
@ -598,7 +595,7 @@ yeti_steak #enddef
|
|||
|
||||
<i><b><span color='#FF0000'>-1</span> damage, <span color='#FF0000'>-1</span> movement, <span color='#00FF00'>+10</span> hitpoints</b></i>."
|
||||
{NOTE_SINGLE_USE}
|
||||
""
|
||||
()
|
||||
(
|
||||
[effect]
|
||||
apply_to=movement
|
||||
|
@ -631,7 +628,7 @@ baneblade #enddef
|
|||
_"This incorporeal sword resembles those wielded by undead wraiths. Any mortal brave enough to wield it becomes <i><b>chaotic</b></i> and lashes out at their foes with reckless abandon.
|
||||
<i><b>6x4 arcane</b></i> damage, <i><b>drains</b></i>, <i><b>berserk</b></i>."
|
||||
{NOTE_REUSEABLE}
|
||||
""
|
||||
()
|
||||
(
|
||||
[effect]
|
||||
apply_to=attack
|
||||
|
@ -696,7 +693,7 @@ potion_of_barkskin #enddef
|
|||
_"Potion of Barkskin"
|
||||
_"This potion bubbles as though over an open flame, yet is cool to the touch. Its drinker gains the <i><b>steadfast</b></i> ability and can <i><b>heal 2 hitpoints each turn</b></i>, like dwarves with the ‘healthy’ trait."
|
||||
{NOTE_SINGLE_USE}
|
||||
""
|
||||
()
|
||||
(
|
||||
[effect]
|
||||
apply_to=new_ability
|
||||
|
@ -728,7 +725,7 @@ ring_of_invisibility #enddef
|
|||
_"Ring of Invisibility"
|
||||
_"This plain gold ring looks unremarkable, but its wearer gains <i><b>skirmisher</b></i> and <i><b>nightstalk</b></i>, becoming invisible in the dark."
|
||||
{NOTE_REUSEABLE}
|
||||
""
|
||||
()
|
||||
(
|
||||
[effect]
|
||||
apply_to=new_ability
|
||||
|
@ -767,15 +764,15 @@ plague_staff #enddef
|
|||
{ID_PLAGUE_STAFF} _"staff" items/plague-staff.png {X} {Y}
|
||||
(
|
||||
[not]
|
||||
type_adv_tree=White Mage,Paladin
|
||||
|
||||
[not]
|
||||
id=Dacyn
|
||||
[/not]
|
||||
race=dunefolk
|
||||
[/not]
|
||||
|
||||
[not]
|
||||
id=Owaec,Gweddry,Dacyn,Hahid al-Ali,Terraent,Konrad
|
||||
type_adv_tree=White Mage,Paladin
|
||||
[/not]
|
||||
|
||||
[not]
|
||||
id=Owaec,Gweddry,Dacyn,Terraent,Konrad
|
||||
[/not]
|
||||
# messes with existing recruiting, and messes with the S18 cutscene
|
||||
# if Dacyn gets this, it also breaks his scripted advancements (and his S17a recruitment)
|
||||
|
@ -784,8 +781,83 @@ plague_staff #enddef
|
|||
_"Looted from a dead necromancer, the wielder of this dark staff becomes <i><b>chaotic</b></i>, and can <i><b>recruit and recall</b></i> Walking Corpses and Soulless.
|
||||
<i><b>6x3 impact</b></i> damage, <i>plague</i>."
|
||||
{NOTE_REUSEABLE}
|
||||
_"I will not wield such a dark magical artifact, though I shall not begrudge its use by my companions."
|
||||
# this message makes no sense for Dacyn (his entire quest is to get a dark magical artifact), but I couldn't think of something good and generic that works for everyone.
|
||||
(
|
||||
[switch]
|
||||
variable=unit.id
|
||||
[case]
|
||||
value=Owaec
|
||||
[message]
|
||||
speaker=unit
|
||||
message=_"Do not insult me! No clansman will ever stoop to such black magic."
|
||||
[/message]
|
||||
[/case]
|
||||
[case]
|
||||
value=Gweddry
|
||||
[message]
|
||||
speaker=unit
|
||||
message=_"I already have an army of human soldiers — living soldiers. Let someone else use this staff."
|
||||
[/message]
|
||||
[/case]
|
||||
[case]
|
||||
value=Dacyn
|
||||
[message]
|
||||
speaker=unit
|
||||
message=_"Tempting! Most tempting... but I fear it would be unwise for me to wield such a thing. That privilege passes onto another."
|
||||
[/message]
|
||||
[/case]
|
||||
[case]
|
||||
value=Hahid al-Ali
|
||||
[message]
|
||||
speaker=unit
|
||||
message=_"Ha! Good joke! I’m not about to mess around with any of your foul northerner magic; necromancy was the cause of all this trouble in the first place."
|
||||
[/message]
|
||||
[/case]
|
||||
[case]
|
||||
value=Terraent
|
||||
[message]
|
||||
speaker=unit
|
||||
message=_"I serve the light, not this staff of foul darkness! We should cast away this thing and be done with it."
|
||||
[/message]
|
||||
[/case]
|
||||
[case]
|
||||
value=Konrad
|
||||
[message]
|
||||
speaker=unit
|
||||
message=_"...what foul thing is this? Remove it from my presence; necromancy shall not take root in Wesnoth, not under my watch."
|
||||
[/message]
|
||||
[/case]
|
||||
[else]
|
||||
[switch]
|
||||
variable=unit.type
|
||||
[case]
|
||||
value=White Mage,Mage of Light,Paladin
|
||||
[message]
|
||||
speaker=unit
|
||||
message=_"No. I serve that which is good and light, and will not wield such a dark magical artifact."
|
||||
[/message]
|
||||
[/case]
|
||||
[else]
|
||||
[switch]
|
||||
variable=unit.race
|
||||
[case]
|
||||
value=dunefolk
|
||||
[message]
|
||||
speaker=unit
|
||||
message=_"Fighting your northerners’ foul magic is bad enough. Don’t expect me to wield that — civilized cultures don’t mess around with magic."
|
||||
[/message]
|
||||
[/case]
|
||||
[else]
|
||||
[message]
|
||||
speaker=unit
|
||||
message=_"I will not wield such a dark magical artifact, though I shall not begrudge its use by my companions."
|
||||
[/message]
|
||||
[/else]
|
||||
[/switch]
|
||||
[/else]
|
||||
[/switch]
|
||||
[/else]
|
||||
[/switch]
|
||||
)
|
||||
(
|
||||
[effect]
|
||||
apply_to=new_attack
|
||||
|
|
|
@ -574,13 +574,13 @@ Been a tough few days since we left Elensefar with all them patrols running arou
|
|||
[event]
|
||||
name=attack_end
|
||||
[filter]
|
||||
side=2
|
||||
side=3
|
||||
[/filter]
|
||||
[filter_second]
|
||||
side=1
|
||||
[/filter_second]
|
||||
|
||||
{IF_VAR $second_unit.hitpoints greater_than 0 (
|
||||
{IF_VAR second_unit.hitpoints greater_than 0 (
|
||||
[then]
|
||||
[message]
|
||||
speaker=Baldras
|
||||
|
|
|
@ -300,7 +300,8 @@
|
|||
|
||||
[message]
|
||||
role=Supporter
|
||||
message= _ "Great idea, Tallin. It's so dark I probably couldn’t even fight a bat down here."
|
||||
# po: sarcasm about the idea of entering the mines where this scenario takes place
|
||||
message= _ "Great idea, Tallin. It’s so dark I probably couldn’t even fight a bat down here."
|
||||
[/message]
|
||||
|
||||
[move_unit_fake]
|
||||
|
|
|
@ -144,8 +144,8 @@
|
|||
x,y=18,1
|
||||
side=2
|
||||
[modifications]
|
||||
{TRAIT_STRONG}
|
||||
{TRAIT_RESILIENT}
|
||||
{TRAIT_QUICK}
|
||||
{TRAIT_DEXTROUS}
|
||||
[/modifications]
|
||||
[/unit]
|
||||
[unit]
|
||||
|
@ -156,8 +156,8 @@
|
|||
side=2
|
||||
facing=sw
|
||||
[modifications]
|
||||
{TRAIT_DEXTROUS}
|
||||
{TRAIT_RESILIENT}
|
||||
{TRAIT_STRONG}
|
||||
{TRAIT_QUICK}
|
||||
[/modifications]
|
||||
[/unit]
|
||||
[unit]
|
||||
|
@ -172,6 +172,18 @@
|
|||
{TRAIT_RESILIENT}
|
||||
[/modifications]
|
||||
[/unit]
|
||||
[unit]
|
||||
type=Elvish Outrider
|
||||
id=Ealin
|
||||
name= _ "Ealin"
|
||||
x,y=18,1
|
||||
side=2
|
||||
facing=sw
|
||||
[modifications]
|
||||
{TRAIT_QUICK}
|
||||
{TRAIT_RESILIENT}
|
||||
[/modifications]
|
||||
[/unit]
|
||||
[scroll_to]
|
||||
x,y=18,1
|
||||
[/scroll_to]
|
||||
|
@ -263,7 +275,7 @@
|
|||
|
||||
[message]
|
||||
id=Alanin
|
||||
message= _ "Oh no, more of them? And there I thought I could catch my breath…"
|
||||
message= _ "Oh no, more of them? And there I thought I could catch my breath..."
|
||||
[/message]
|
||||
|
||||
[message]
|
||||
|
|
|
@ -113,7 +113,7 @@
|
|||
[/ai]
|
||||
[unit]
|
||||
id=Gathor
|
||||
name= _ "Bar'Gathor"
|
||||
name= _ "Bar’Gathor"
|
||||
type=Orcish Warrior
|
||||
profile=portraits/orcs/grunt-3.webp
|
||||
[modifications]
|
||||
|
|
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
|
@ -0,0 +1,101 @@
|
|||
#textdomain wesnoth-sota
|
||||
[unit_type]
|
||||
id=Orcish Shaman
|
||||
name= _ "Orcish Shaman"
|
||||
race=orc
|
||||
image="units/orcish-shaman.png"
|
||||
hitpoints=23
|
||||
movement_type=orcishfoot
|
||||
profile="portraits/orcish-shaman.webp"
|
||||
[defense]
|
||||
village=30
|
||||
[/defense]
|
||||
movement=5
|
||||
experience=50
|
||||
level=1
|
||||
alignment=chaotic
|
||||
advances_to=null
|
||||
{AMLA_DEFAULT}
|
||||
cost=21
|
||||
usage=mixed fighter
|
||||
description= _ "Orcish Shamans are the guardians of orcish magic. Respected among orcish tribes, they form the Orcish Council, which makes important decisions for the whole Orcish community and arbitrates the many conflicts that arise between tribes of this argumentative race. Although physically weak (for orcs), Orcish Shamans are good spell casters and can curse their enemies, draining their life."
|
||||
die_sound={SOUND_LIST:ORC_DIE}
|
||||
{DEFENSE_ANIM "units/orcish-shaman-defend-2.png" "units/orcish-shaman-defend-1.png" {SOUND_LIST:ORC_HIT} }
|
||||
[attack]
|
||||
name=staff
|
||||
#textdomain wesnoth-units
|
||||
description= _"staff"
|
||||
type=impact
|
||||
range=melee
|
||||
damage=5
|
||||
number=1
|
||||
icon=attacks/druidstaff.png
|
||||
[/attack]
|
||||
[attack]
|
||||
name=curse
|
||||
description= _"curse"
|
||||
#textdomain wesnoth-sota
|
||||
type=pierce
|
||||
range=ranged
|
||||
damage=8
|
||||
number=2
|
||||
[specials]
|
||||
{WEAPON_SPECIAL_DRAIN}
|
||||
[/specials]
|
||||
icon=attacks/curse.png
|
||||
[/attack]
|
||||
[attack_anim]
|
||||
[filter_attack]
|
||||
name=curse
|
||||
[/filter_attack]
|
||||
|
||||
missile_start_time=-200
|
||||
start_time=-350
|
||||
halo1_start_time=-350
|
||||
halo2_start_time=-200
|
||||
sound_start_time=0
|
||||
|
||||
[missile_frame]
|
||||
halo="halo/elven/druid-healing[8~1].png~CS(50,-30,-50):50"
|
||||
offset=1.0~0.0
|
||||
[/missile_frame]
|
||||
|
||||
[frame]
|
||||
image="units/orcish-shaman.png:200"
|
||||
[/frame]
|
||||
[frame]
|
||||
image="units/orcish-shaman-magic.png:300"
|
||||
[/frame]
|
||||
|
||||
[halo1_frame]
|
||||
halo="halo/elven/nature-halo[8~1].png~CS(50,-30,-50)~O([80%*2,60%,40%,30%,20%*3]):75"
|
||||
offset=1.0
|
||||
auto_vflip=no
|
||||
auto_hflip=no
|
||||
[/halo1_frame]
|
||||
|
||||
[halo2_frame]
|
||||
halo="halo/elven/nature-halo[1~8].png~CS(50,-30,-50)~O([20%*3,30%,40%,60%,80%*2]):75"
|
||||
offset=0.0
|
||||
auto_vflip=no
|
||||
auto_hflip=no
|
||||
[/halo2_frame]
|
||||
|
||||
[sound_frame]
|
||||
sound=magicmissile.wav
|
||||
[/sound_frame]
|
||||
[/attack_anim]
|
||||
[attack_anim]
|
||||
[filter_attack]
|
||||
name=staff
|
||||
[/filter_attack]
|
||||
|
||||
start_time=-200
|
||||
|
||||
[frame]
|
||||
image="units/orcish-shaman.png:350"
|
||||
[/frame]
|
||||
|
||||
{SOUND:HIT_AND_MISS staff.ogg staff-miss.ogg -125}
|
||||
[/attack_anim]
|
||||
[/unit_type]
|
|
@ -67,6 +67,8 @@
|
|||
comment = "Sprite animations (defense and magic) of orcish shamans"
|
||||
[/entry]
|
||||
[/about]
|
||||
|
||||
{ENABLE_SAURIAN_SPEARTHROWER}
|
||||
[/campaign]
|
||||
|
||||
#ifdef CAMPAIGN_SON_OF_THE_BLACK_EYE
|
||||
|
@ -77,6 +79,10 @@
|
|||
path=data/campaigns/Son_Of_The_Black_Eye
|
||||
[/binary_path]
|
||||
|
||||
[units]
|
||||
{campaigns/Son_Of_The_Black_Eye/units}
|
||||
[/units]
|
||||
|
||||
#endif
|
||||
|
||||
# wmllint: directory spelling Kapou'e Grüü Rahul Karun
|
||||
|
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 122 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1,018 B After Width: | Height: | Size: 1,018 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 955 B After Width: | Height: | Size: 955 B |
Before Width: | Height: | Size: 945 B After Width: | Height: | Size: 945 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
@ -764,7 +764,7 @@
|
|||
[then]
|
||||
{LOOT $stored_Gruu_side.gold 1}
|
||||
[+message]
|
||||
message= _ "You retrieve $amount_gold of Grüü's leftover gold."
|
||||
message= _ "You retrieve $amount_gold of Grüü’s leftover gold."
|
||||
[/message]
|
||||
|
||||
[gold]
|
||||
|
|
159
data/campaigns/Son_Of_The_Black_Eye/units/Orcish_Shaman.cfg
Normal file
|
@ -0,0 +1,159 @@
|
|||
#textdomain wesnoth-sotbe
|
||||
[unit_type]
|
||||
id=Orcish Shaman
|
||||
name= _ "Orcish Shaman"
|
||||
race=orc
|
||||
image="units/orcish-shaman.png"
|
||||
hitpoints=23
|
||||
movement_type=orcishfoot
|
||||
[defense]
|
||||
village=30
|
||||
[/defense]
|
||||
movement=5
|
||||
experience=50
|
||||
level=1
|
||||
alignment=chaotic
|
||||
advances_to=null
|
||||
{AMLA_DEFAULT}
|
||||
cost=21
|
||||
usage=archer
|
||||
description= _ "Orcish Shamans are the guardians of orcish magic. Respected among orcish tribes, they form the Orcish Council, which makes important decisions for the whole Orcish community and arbitrates the many conflicts that arise between tribes of this argumentative race. Although physically weak (for orcs), Orcish Shamans are good spell casters and can curse their enemies, draining their life."
|
||||
die_sound={SOUND_LIST:ORC_DIE}
|
||||
{DEFENSE_ANIM "units/orcish-shaman-defend-2.png" "units/orcish-shaman-defend-1.png" {SOUND_LIST:ORC_HIT} }
|
||||
[attack]
|
||||
name=staff
|
||||
#textdomain wesnoth-units
|
||||
description= _"staff"
|
||||
type=impact
|
||||
range=melee
|
||||
damage=5
|
||||
number=1
|
||||
icon=attacks/druidstaff.png
|
||||
[/attack]
|
||||
[attack]
|
||||
name=curse
|
||||
description= _"curse"
|
||||
#textdomain wesnoth-sotbe
|
||||
type=pierce
|
||||
range=ranged
|
||||
damage=8
|
||||
number=2
|
||||
[specials]
|
||||
{WEAPON_SPECIAL_DRAIN}
|
||||
[/specials]
|
||||
icon=attacks/curse.png
|
||||
[/attack]
|
||||
[attack_anim]
|
||||
[filter_attack]
|
||||
name=curse
|
||||
[/filter_attack]
|
||||
|
||||
missile_start_time=-200
|
||||
start_time=-350
|
||||
halo1_start_time=-350
|
||||
halo2_start_time=-200
|
||||
sound_start_time=0
|
||||
|
||||
[missile_frame]
|
||||
halo="halo/elven/druid-healing[8~1].png~CS(50,-30,-50):50"
|
||||
offset=1.0~0.0
|
||||
[/missile_frame]
|
||||
|
||||
[frame]
|
||||
image="units/orcish-shaman.png:200"
|
||||
[/frame]
|
||||
[frame]
|
||||
image="units/orcish-shaman-magic.png:300"
|
||||
[/frame]
|
||||
|
||||
[halo1_frame]
|
||||
halo="halo/elven/nature-halo[8~1].png~CS(50,-30,-50)~O([80%*2,60%,40%,30%,20%*3]):75"
|
||||
offset=1.0
|
||||
auto_vflip=no
|
||||
auto_hflip=no
|
||||
[/halo1_frame]
|
||||
|
||||
[halo2_frame]
|
||||
halo="halo/elven/nature-halo[1~8].png~CS(50,-30,-50)~O([20%*3,30%,40%,60%,80%*2]):75"
|
||||
offset=0.0
|
||||
auto_vflip=no
|
||||
auto_hflip=no
|
||||
[/halo2_frame]
|
||||
|
||||
[sound_frame]
|
||||
sound=magicmissile.wav
|
||||
[/sound_frame]
|
||||
[/attack_anim]
|
||||
[attack_anim]
|
||||
[filter_attack]
|
||||
name=staff
|
||||
[/filter_attack]
|
||||
|
||||
start_time=-200
|
||||
|
||||
[frame]
|
||||
image="units/orcish-shaman.png:350"
|
||||
[/frame]
|
||||
|
||||
{SOUND:HIT_AND_MISS staff.ogg staff-miss.ogg -125}
|
||||
[/attack_anim]
|
||||
|
||||
[variation]
|
||||
# Variations are ordered by variadtion_id
|
||||
variation_id=adolescent
|
||||
variation_name= _ "variation^Novice"
|
||||
inherit=yes
|
||||
image="units/novice-orcish-shaman.png"
|
||||
hitpoints=24 # +1
|
||||
description= _ "Orcish Shamans are the guardians of orcish magic. Respected among orcish tribes, they form the Orcish Council, which makes important decisions for the whole Orcish community and arbitrates the many conflicts that arise between tribes of this argumentative race. Although physically weak (for orcs), Orcish Shamans are good spell casters and can curse their enemies, draining their life. Novice Shamans are still young and vigorous, but their spell-casting ability still needs improvement."
|
||||
{DEFENSE_ANIM "units/novice-orcish-shaman-defend-2.png" "units/novice-orcish-shaman-defend-1.png" {SOUND_LIST:ORC_HIT} }
|
||||
[attack]
|
||||
damage=6 # +1
|
||||
[/attack]
|
||||
[attack]
|
||||
damage=7 # -1
|
||||
[/attack]
|
||||
[attack_anim]
|
||||
[frame]
|
||||
image="units/novice-orcish-shaman.png:200"
|
||||
[/frame]
|
||||
[frame]
|
||||
image="units/novice-orcish-shaman-magic.png:300"
|
||||
[/frame]
|
||||
[/attack_anim]
|
||||
[attack_anim]
|
||||
[frame]
|
||||
image="units/novice-orcish-shaman.png:350"
|
||||
[/frame]
|
||||
[/attack_anim]
|
||||
[/variation]
|
||||
|
||||
[variation]
|
||||
variation_id=old
|
||||
variation_name= _ "variation^Elder"
|
||||
image="units/elder-orcish-shaman.png"
|
||||
inherit=yes
|
||||
hitpoints=22 # -1
|
||||
description= _ "Orcish Shamans are the guardians of orcish magic. Respected among orcish tribes, they form the Orcish Council, which makes important decisions for the whole Orcish community and arbitrates the many conflicts that arise between tribes of this argumentative race. Although physically weak (for orcs), Orcish Shamans are good spell casters and can curse their enemies, draining their life. Old Orcish Shamans are shamans that have mastered magic, although their physical strength has declined with age."
|
||||
{DEFENSE_ANIM "units/elder-orcish-shaman-defend-2.png" "units/elder-orcish-shaman-defend-1.png" {SOUND_LIST:ORC_HIT} }
|
||||
[attack]
|
||||
damage=4 # -1
|
||||
[/attack]
|
||||
[attack]
|
||||
damage=9 # +1
|
||||
[/attack]
|
||||
[attack_anim]
|
||||
[frame]
|
||||
image="units/elder-orcish-shaman.png:200"
|
||||
[/frame]
|
||||
[frame]
|
||||
image="units/elder-orcish-shaman-magic.png:300"
|
||||
[/frame]
|
||||
[/attack_anim]
|
||||
[attack_anim]
|
||||
[frame]
|
||||
image="units/elder-orcish-shaman.png:350"
|
||||
[/frame]
|
||||
[/attack_anim]
|
||||
[/variation]
|
||||
[/unit_type]
|
|
@ -10,7 +10,7 @@
|
|||
[event]
|
||||
name=last breath
|
||||
[filter]
|
||||
type=Orcish Shaman,Orcish Adept,Orcish Sorceress
|
||||
type=Orcish Shaman
|
||||
[/filter]
|
||||
[message]
|
||||
speaker=unit
|
||||
|
|
|
@ -5,14 +5,15 @@
|
|||
id={ID_STRING}
|
||||
name={NAME_STRING}
|
||||
unrenamable=yes
|
||||
type=Orcish Sorceress
|
||||
type=Orcish Shaman
|
||||
variation=old
|
||||
profile=portraits/old_orcish_shaman.webp
|
||||
side={SIDE}
|
||||
x={X}
|
||||
y={Y}
|
||||
random_traits=no
|
||||
[modifications]
|
||||
{TRAIT_LOYAL_HERO}
|
||||
{TRAIT_AGED}
|
||||
[/modifications]
|
||||
[/unit]
|
||||
#enddef
|
||||
|
@ -22,7 +23,9 @@
|
|||
id={ID_STRING}
|
||||
name={NAME_STRING}
|
||||
unrenamable=yes
|
||||
type=Orcish Adept
|
||||
type=Orcish Shaman
|
||||
variation=adolescent
|
||||
profile=portraits/young_orcish_shaman.webp
|
||||
side={SIDE}
|
||||
x={X}
|
||||
y={Y}
|
||||
|
@ -39,6 +42,7 @@
|
|||
name={NAME_STRING}
|
||||
unrenamable=yes
|
||||
type=Orcish Shaman
|
||||
profile=portraits/orcish_shaman.webp
|
||||
side={SIDE}
|
||||
x={X}
|
||||
y={Y}
|
||||
|
|
|
@ -69,10 +69,6 @@
|
|||
path=data/campaigns/The_Hammer_of_Thursagan/
|
||||
[/binary_path]
|
||||
|
||||
[lua]
|
||||
code="wesnoth.require 'campaigns/The_Hammer_of_Thursagan/lua/spawns.lua'"
|
||||
[/lua]
|
||||
|
||||
{campaigns/The_Hammer_of_Thursagan/utils}
|
||||
|
||||
[units]
|
||||
|
|
|
@ -1 +1,28 @@
|
|||
#textdomain wesnoth-thot
|
||||
|
||||
[achievement_group]
|
||||
display_name=_"The Hammer of Thursagan"
|
||||
content_for=the_hammer_of_thursagan
|
||||
[achievement]
|
||||
id="gryphon_hunter"
|
||||
name=_"Gryphon Hunter"
|
||||
description=_"Kill the Gryphon leader in High Pass"
|
||||
hidden=yes
|
||||
icon="data/core/images/units/monsters/gryphon.png"
|
||||
icon_completed="data/core/images/units/monsters/gryphon.png~SCALE(72,72)~BLIT("data/core/images/misc/achievement-frames/frame-3-red.png",0,0)"
|
||||
[/achievement]
|
||||
[achievement]
|
||||
id="conqueror_of_the_forest"
|
||||
name=_"Conqueror of the Forest"
|
||||
description=_"Defeat an enemy leader in Forbidden Forest"
|
||||
icon="data/core/images/units/woses/wose-die-fall-5.png"
|
||||
icon_completed="data/core/images/units/woses/wose-die-fall-5.png~SCALE(72,72)~BLIT("data/core/images/misc/achievement-frames/frame-8-grey.png",0,0)"
|
||||
[/achievement]
|
||||
[achievement]
|
||||
id="new_thursagan"
|
||||
name=_"New Thursagan"
|
||||
description=_"Complete The Underlevels on challenging difficulty"
|
||||
icon="data/core/images/items/hammer-runic.png"
|
||||
icon_completed="data/core/images/items/hammer-runic.png~SCALE(72,72)~BLIT("data/core/images/misc/achievement-frames/frame-3-red.png",0,0)"
|
||||
[/achievement]
|
||||
[/achievement_group]
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
-- Used for the bandit spawns in scenario 5
|
||||
|
||||
local utils = wesnoth.require "wml-utils"
|
||||
local wml_actions = wesnoth.wml_actions
|
||||
local T = wml.tag
|
||||
|
||||
function wml_actions.spawn_units(cfg)
|
||||
local x = cfg.x or wml.error("[spawn_units] missing required x= attribute.")
|
||||
local y = cfg.y or wml.error("[spawn_units] missing required y= attribute.")
|
||||
local types = cfg.types or wml.error("[spawn_units] missing required types= attribute.")
|
||||
local count = cfg.count or wml.error("[spawn_units] missing required count= attribute.")
|
||||
local side = cfg.side or wml.error("[spawn_units] missing required side= attribute.")
|
||||
|
||||
local done = 0
|
||||
for i=1,count do
|
||||
local locs = wesnoth.map.find({T["not"] { T.filter {} } , T["and"] { x = x, y = y, radius = 1 } })
|
||||
if #locs == 0 then locs = wesnoth.map.find({T["not"] { T.filter {} } , T["and"] { x = x, y = y, radius = 2 } }) end
|
||||
if #locs == 0 then break end
|
||||
|
||||
done = done + 1
|
||||
|
||||
local unit_type = mathx.random_choice(types)
|
||||
local loc_i = mathx.random_choice("1.."..#locs)
|
||||
|
||||
wml_actions.move_unit_fake({x = string.format("%d,%d", x, locs[loc_i][1]) , y = string.format("%d,%d", y, locs[loc_i][2]) , type = unit_type , side = side})
|
||||
wesnoth.units.to_map({ type = unit_type , side = side, random_traits = "yes", generate_name = "yes" , upkeep = "loyal" }, locs[loc_i][1], locs[loc_i][2])
|
||||
end
|
||||
|
||||
if done > 0 then
|
||||
for then_child in wml.child_range(cfg, "then") do
|
||||
local action = utils.handle_event_commands(then_child, "conditional")
|
||||
if action ~= "none" then return end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -233,6 +233,19 @@
|
|||
#endif
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
name=die
|
||||
|
||||
[filter]
|
||||
id="Kaara"
|
||||
[/filter]
|
||||
|
||||
[set_achievement]
|
||||
content_for=the_hammer_of_thursagan
|
||||
id="gryphon_hunter"
|
||||
[/set_achievement]
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
{QUANTITY name (turn 16) (turn 14) (turn 9)}
|
||||
|
||||
|
|
|
@ -249,6 +249,25 @@
|
|||
[/move_unit_fake]
|
||||
[/event]
|
||||
|
||||
#Death of an enemy leader
|
||||
[event]
|
||||
name=die
|
||||
[filter]
|
||||
canrecruit=yes
|
||||
[not]
|
||||
side=1
|
||||
[/not]
|
||||
[/filter]
|
||||
[message]
|
||||
speaker=second_unit
|
||||
message= _ "We shall pass!"
|
||||
[/message]
|
||||
[set_achievement]
|
||||
content_for=the_hammer_of_thursagan
|
||||
id="conqueror_of_the_forest"
|
||||
[/set_achievement]
|
||||
[/event]
|
||||
|
||||
# Angarthing and Aiglondur speak when they reach the signpost.
|
||||
[event]
|
||||
name=moveto
|
||||
|
@ -316,7 +335,7 @@
|
|||
[/or]
|
||||
[/filter_condition]
|
||||
|
||||
# If Aiglondor is on the signpost and Angarthing next to him, or the other way around,
|
||||
# If Aiglondur is on the signpost and Angarthing next to him, or the other way around,
|
||||
# the player has won. Fire Aiglondur's and Angarthing's messages if they haven't fired yet.
|
||||
[fire_event]
|
||||
name=Aiglondur message
|
||||
|
|
|
@ -1294,6 +1294,13 @@
|
|||
result=victory
|
||||
carryover_report=no
|
||||
[/endlevel]
|
||||
|
||||
#ifdef HARD
|
||||
[set_achievement]
|
||||
content_for=the_hammer_of_thursagan
|
||||
id="new_thursagan"
|
||||
[/set_achievement]
|
||||
#endif
|
||||
[/event]
|
||||
#########################################################################################
|
||||
######################################## Deaths #########################################
|
||||
|
|
|
@ -542,7 +542,7 @@ _f, _f, Re, _f
|
|||
|
||||
[message]
|
||||
speaker=narrator
|
||||
{NARRATOR: _"Deoran and Urza Afalas retreated quickly from Mebrin's fortress..."}
|
||||
{NARRATOR: _"Deoran and Urza Afalas retreated quickly from Mebrin’s fortress..."}
|
||||
image=wesnoth-icon.png
|
||||
[/message]
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
image="data/campaigns/Under_the_Burning_Suns/images/campaign_image.png"
|
||||
abbrev= _ "UtBS"
|
||||
rank=205
|
||||
year="300 AF"
|
||||
year="1000 AF"
|
||||
define=CAMPAIGN_UNDER_THE_BURNING_SUNS
|
||||
first_scenario=01_The_Morning_After
|
||||
|
||||
|
|
|
@ -8,12 +8,12 @@
|
|||
hitpoints=22
|
||||
movement_type=dwarvishfoot
|
||||
movement=4
|
||||
experience=50
|
||||
experience=25
|
||||
{AMLA_DEFAULT}
|
||||
advances_to=null
|
||||
level=1
|
||||
level=0
|
||||
alignment=neutral
|
||||
cost=17
|
||||
cost=12
|
||||
usage=fighter
|
||||
# wmllint: local spelling Dawarf
|
||||
description= _ "Don’t ask where the Dawarf came from. You really don’t want to know. It is a secret well guarded by the great lore-masters of Wesnoth. And it isn’t pretty. Hint: it involves lots of sherbet."
|
||||
|
|
|
@ -1548,10 +1548,10 @@ _ "cooldown 1"#enddef
|
|||
_ "cooldown 2"#enddef
|
||||
|
||||
#define STR_COOLDOWN_RESTRICT_2
|
||||
_ "After using this attack, you can't use it during your next turn."#enddef
|
||||
_ "After using this attack, you can’t use it during your next turn."#enddef
|
||||
|
||||
#define STR_COOLDOWN_RESTRICT_3
|
||||
_ "After using this attack, you can't use it during your next two turns."#enddef
|
||||
_ "After using this attack, you can’t use it during your next two turns."#enddef
|
||||
|
||||
#define WEAPON_SPECIAL_COOLDOWN X
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ local _ = wesnoth.textdomain 'wesnoth-wc'
|
|||
local on_event = wesnoth.require("on_event")
|
||||
|
||||
local strings = {
|
||||
enemy_pet = _ "$name|'s pet"
|
||||
enemy_pet = _ "$name|’s pet"
|
||||
}
|
||||
-- in the later scenarios there is a small chance that a scenario will be themed for an enemy
|
||||
-- which means in paticular changing the castle of the enemy accorign to the unit type of that
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
--<<
|
||||
local _ = wesnoth.textdomain 'wesnoth-wc'
|
||||
local _wesnoth = wesnoth.textdomain "wesnoth"
|
||||
|
||||
local wc2_scenario = {}
|
||||
local on_event = wesnoth.require("on_event")
|
||||
local carryover = wesnoth.require("carryover_gold.lua")
|
||||
|
||||
function wc2_scenario.is_human_side(side_num)
|
||||
return side_num <= wml.variables.wc2_player_count
|
||||
|
@ -42,18 +46,52 @@ function wesnoth.wml_actions.wc2_start_units(cfg)
|
|||
end
|
||||
end
|
||||
|
||||
function wesnoth.wml_actions.wc2_store_carryover(cfg)
|
||||
local human_sides = wesnoth.sides.find(wml.get_child(cfg, "sides"))
|
||||
--use an the average amount of villages for this scenario to stay independent of map generator results.
|
||||
local nvillages = cfg.nvillages
|
||||
local turns_left = math.max(wesnoth.scenario.turns - wesnoth.current.turn, 0)
|
||||
local player_gold = 0
|
||||
function wc2_scenario.average_gold()
|
||||
local total_gold = 0
|
||||
local nsides = 0
|
||||
|
||||
for side_num, side in ipairs(human_sides) do
|
||||
player_gold = player_gold + side.gold
|
||||
for i, s in ipairs(wesnoth.sides) do
|
||||
if wc2_scenario.is_human_side(i) then
|
||||
nsides = nsides + 1
|
||||
total_gold = total_gold + s.gold
|
||||
end
|
||||
end
|
||||
player_gold = math.max(player_gold / #human_sides, 0)
|
||||
wml.variables.wc2_carryover = math.ceil( (nvillages*turns_left + player_gold) * 0.15)
|
||||
return math.floor(total_gold / nsides + 0.5)
|
||||
end
|
||||
|
||||
-- overwrite parts of the carryover gold implementation.
|
||||
function carryover.set_side_carryover_gold(side)
|
||||
local turns_left = carryover.turns_left()
|
||||
-- make the carryover bonus independent of the map generation.
|
||||
local num_villages = wml.variables.wc2_nvillages or carryover.get_num_villages()
|
||||
|
||||
local finishing_bonus_per_turn = wml.variables.wc2_early_victory_bonus or num_villages * side.village_gold + side.base_income
|
||||
local finishing_bonus = finishing_bonus_per_turn * turns_left
|
||||
local avg_gold = wc2_scenario.average_gold()
|
||||
|
||||
side.carryover_gold = math.ceil((avg_gold + finishing_bonus) * side.carryover_percentage / 100)
|
||||
|
||||
return {
|
||||
turns_left = turns_left,
|
||||
avg_gold = avg_gold,
|
||||
finishing_bonus = finishing_bonus,
|
||||
finishing_bonus_per_turn = finishing_bonus_per_turn,
|
||||
}
|
||||
end
|
||||
|
||||
---@param side side
|
||||
---@param info table
|
||||
---@return string
|
||||
function carryover.remaining_gold_message(side, info)
|
||||
return "<small>\n" .. _wesnoth("Remaining gold: ") .. carryover.half_signed_value(side.gold) .. "</small>"
|
||||
.. "<small>\n" .. _("Average remaining gold: ") .. carryover.half_signed_value(info.avg_gold) .. "</small>"
|
||||
end
|
||||
|
||||
---@param side side
|
||||
---@param info table
|
||||
---@return string
|
||||
function carryover.total_gold_message(side, info)
|
||||
return "<small>" .. _wesnoth("Total gold: ") .. carryover.half_signed_value(info.avg_gold + info.finishing_bonus) .. "</small>"
|
||||
end
|
||||
|
||||
-- carryover handling: we use a custom carryover machnics that
|
||||
|
@ -81,11 +119,10 @@ on_event("wc2_start", function(cx)
|
|||
end
|
||||
end
|
||||
|
||||
local gold = (wml.variables.wc2_carryover or 0) + (wml.variables["wc2_difficulty.extra_gold"] or 0)
|
||||
local gold = (wml.variables["wc2_difficulty.extra_gold"] or 0)
|
||||
for i = 1, wml.variables.wc2_player_count do
|
||||
wesnoth.sides[i].gold = wesnoth.sides[i].gold + gold
|
||||
end
|
||||
wml.variables.wc2_carryover = nil
|
||||
end)
|
||||
|
||||
-- our victory condition
|
||||
|
@ -96,9 +133,7 @@ on_event("enemies defeated", function(cx)
|
|||
wesnoth.audio.play("ambient/ship.ogg")
|
||||
wesnoth.wml_actions.endlevel {
|
||||
result = "victory",
|
||||
carryover_percentage = 0,
|
||||
carryover_add = false,
|
||||
carryover_report = false,
|
||||
carryover_report = true,
|
||||
}
|
||||
end)
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ wesnoth.dofile("./scenario_utils/plot.lua")
|
|||
wesnoth.dofile("./scenario_utils/side_definitions.lua")
|
||||
settings = globals.settings or {}
|
||||
|
||||
local n_villages = {27, 40, 53, 63}
|
||||
local early_victory_bonus = {27, 40, 53, 63}
|
||||
|
||||
local function get_map_generator(scenario_data)
|
||||
if globals.settings.default_id then
|
||||
|
@ -45,7 +45,9 @@ function wc_ii_generate_scenario(nplayers, gen_args)
|
|||
std_print("test_nplayers", wml.variables.test_nplayers)
|
||||
local scenario_data = get_scenario_data(nplayers, scenario_num)
|
||||
|
||||
local prestart_event = { name = "prestart" }
|
||||
local prestart_event = {
|
||||
name = "prestart",
|
||||
}
|
||||
-- our [scenario] skeleton
|
||||
local scenario = {
|
||||
event = {
|
||||
|
@ -71,6 +73,7 @@ function wc_ii_generate_scenario(nplayers, gen_args)
|
|||
description="enables the buildin mod to mark units, disable this to be compatible with other mods that do the same thing",
|
||||
},
|
||||
},
|
||||
-- note: in later scenarios these variables will probably be overwritten by whatever is present in the carryover.
|
||||
variables = {
|
||||
wc2_scenario = scenario_num,
|
||||
wc2_player_count = nplayers,
|
||||
|
@ -81,6 +84,8 @@ function wc_ii_generate_scenario(nplayers, gen_args)
|
|||
description = "WC_II_" .. nplayers .. "p_desc",
|
||||
modify_placing = false,
|
||||
turns = scenario_data.turns,
|
||||
carryover_percentage = 15,
|
||||
carryover_add = true,
|
||||
}
|
||||
|
||||
-- add [side]s to the [scenario]
|
||||
|
@ -90,21 +95,6 @@ function wc_ii_generate_scenario(nplayers, gen_args)
|
|||
-- add plot (that is [event] with [message]s)
|
||||
add_plot(scenario, scenario_num, nplayers)
|
||||
|
||||
-- add the gold carryover event
|
||||
if scenario_num < #n_villages then
|
||||
table.insert(scenario.event, {
|
||||
name = "victory",
|
||||
wml.tag.wc2_store_carryover {
|
||||
nvillages = n_villages[scenario_num] + 2 * nplayers,
|
||||
wml.tag.sides {
|
||||
side="1,2,3",
|
||||
wml.tag.has_unit {
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
-- add some wc2 specific wml [event]s
|
||||
for side_num = 1, nplayers do
|
||||
table.insert(scenario.event, {
|
||||
|
@ -117,19 +107,28 @@ function wc_ii_generate_scenario(nplayers, gen_args)
|
|||
})
|
||||
end
|
||||
|
||||
if early_victory_bonus[scenario_num] then
|
||||
table.insert(prestart_event,
|
||||
wml.tag.set_variable {
|
||||
name = "wc2_early_victory_bonus",
|
||||
value = early_victory_bonus[scenario_num] + 2 * nplayers,
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
-- generate the map. (this also adds certain events for example to create [item]s or [sound_source]s)
|
||||
local mapgen_func = get_map_generator(scenario_data)
|
||||
mapgen_func(scenario, nplayers)
|
||||
|
||||
-- set the correct scenario name.
|
||||
if scenario_num == 1 then --first map
|
||||
scenario.name = "WC_II_" .. nplayers .. " - " .. _"Start"
|
||||
scenario.name = _"Start"
|
||||
else
|
||||
local scenario_desc = _ "Scenario" .. scenario_num
|
||||
local scenario_desc = _ "Scenario " .. scenario_num
|
||||
if scenario_num == 5 then
|
||||
scenario_desc = _"Final Battle"
|
||||
end
|
||||
scenario.name = "WC_II_" .. nplayers .. " " .. scenario_desc .. " - "--.. scenario.map_name
|
||||
scenario.name = scenario_desc
|
||||
end
|
||||
|
||||
local res = wc2_convert.lon_to_wml(scenario, "scenario")
|
||||
|
|
|
@ -13,6 +13,18 @@ _ "World Conquest 3p" #enddef
|
|||
#define WC_II_CAMPAIGN_NAME_4P
|
||||
_ "World Conquest 4p" #enddef
|
||||
|
||||
#define WC_II_ABBREV_1P
|
||||
_ "WC1p" #enddef
|
||||
|
||||
#define WC_II_ABBREV_2P
|
||||
_ "WC2p" #enddef
|
||||
|
||||
#define WC_II_ABBREV_3P
|
||||
_ "WC3p" #enddef
|
||||
|
||||
#define WC_II_ABBREV_4P
|
||||
_ "WC4p" #enddef
|
||||
|
||||
#define WC_II_CAMPAIGN_DESC_1P
|
||||
_ "A randomly generated campaign for 1 player. It has 6 levels of difficulty.
|
||||
(Expert level, 5 scenarios.)" #enddef
|
||||
|
@ -101,7 +113,7 @@ _ "World Conquest 4p" #enddef
|
|||
icon = {ICON}
|
||||
image = {IMAGE_ONE}
|
||||
type = mp
|
||||
abbrev = _ "WC" + {PLAYERS}\
|
||||
abbrev = {WC_II_ABBREV_{PLAYERS}P}
|
||||
{WC2_CAMPAIGN_DIFFICULTY VERY_EASY {WC2_HUMAN_DIFFICULTY human-peasants/peasant purple} _"Peasant" _"Beginner" 6 2 2 10 yes 0}
|
||||
{WC2_CAMPAIGN_DIFFICULTY EASY {WC2_HUMAN_DIFFICULTY human-loyalists/sergeant black} _"Sergeant" _"Easy" 7 3 2 7 yes 5}
|
||||
{WC2_CAMPAIGN_DIFFICULTY NORMAL {WC2_HUMAN_DIFFICULTY human-loyalists/lieutenant brown} _"Lieutenant" _"Medium" 8 4 2 5 yes 10} {DEFAULT_DIFFICULTY}
|
||||
|
|
|
@ -13,9 +13,9 @@
|
|||
grow_factor = 1
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_alignment = "left"
|
||||
horizontal_alignment = "center"
|
||||
[label]
|
||||
definition = "title"
|
||||
definition = "title_script"
|
||||
label = _"Select Character"
|
||||
[/label]
|
||||
[/column]
|
||||
|
@ -25,7 +25,7 @@
|
|||
grow_factor = 1
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_alignment = "left"
|
||||
horizontal_alignment = "center"
|
||||
[label]
|
||||
label = _"Who do you want to play as?"
|
||||
[/label]
|
||||
|
@ -39,37 +39,88 @@
|
|||
grow_factor = 1
|
||||
border = "all"
|
||||
border_size = 5
|
||||
[image]
|
||||
label = "units/konrad-fighter.png"
|
||||
[/image]
|
||||
[/column]
|
||||
[column]
|
||||
grow_factor = 1
|
||||
border = "all"
|
||||
border_size = 5
|
||||
[image]
|
||||
label = "units/human-princess.png~TC(1,magenta)"
|
||||
[/image]
|
||||
[/column]
|
||||
[/row]
|
||||
[row]
|
||||
[column]
|
||||
grow_factor = 1
|
||||
border = "all"
|
||||
border_size = 5
|
||||
[button]
|
||||
label = _"Konrad"
|
||||
return_value = 1
|
||||
[/button]
|
||||
[/column]
|
||||
[column]
|
||||
grow_factor = 1
|
||||
border = "all"
|
||||
border_size = 5
|
||||
[button]
|
||||
label = _"Li’sar"
|
||||
return_value = 2
|
||||
[/button]
|
||||
|
||||
[horizontal_listbox]
|
||||
id = "characters"
|
||||
has_minimum = false
|
||||
[list_definition]
|
||||
[row]
|
||||
[column]
|
||||
horizontal_grow = true
|
||||
vertical_grow = true
|
||||
|
||||
[toggle_panel]
|
||||
definition = "default"
|
||||
return_value_id = "ok"
|
||||
linked_group = "panel"
|
||||
|
||||
[grid]
|
||||
[row]
|
||||
grow_factor = 0
|
||||
|
||||
[column]
|
||||
grow_factor = 1
|
||||
horizontal_alignment = "center"
|
||||
|
||||
border = "all"
|
||||
border_size = 5
|
||||
|
||||
[image]
|
||||
id = "image"
|
||||
definition = "default"
|
||||
[/image]
|
||||
[/column]
|
||||
[/row]
|
||||
|
||||
[row]
|
||||
grow_factor = 1
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
border = "all"
|
||||
border_size = 10
|
||||
horizontal_grow = true
|
||||
vertical_alignment = "top"
|
||||
|
||||
[label]
|
||||
id = "name"
|
||||
use_markup = true
|
||||
text_alignment = "center"
|
||||
[/label]
|
||||
[/column]
|
||||
[/row]
|
||||
[/grid]
|
||||
[/toggle_panel]
|
||||
[/column]
|
||||
[/row]
|
||||
[/list_definition]
|
||||
[list_data]
|
||||
[row]
|
||||
[column]
|
||||
[widget]
|
||||
id = "image"
|
||||
label = "portraits/konrad.webp~SCALE(200,200)"
|
||||
[/widget]
|
||||
[widget]
|
||||
id = "name"
|
||||
label = "<span size='x-large' face='OldaniaAdfStd'>" + _"Konrad" + "</span>"
|
||||
[/widget]
|
||||
[/column]
|
||||
[/row]
|
||||
[row]
|
||||
[column]
|
||||
[widget]
|
||||
id = "image"
|
||||
label = "portraits/lisar.webp~SCALE(200,200)~FL()"
|
||||
[/widget]
|
||||
[widget]
|
||||
id = "name"
|
||||
label = "<span size='x-large' face='OldaniaAdfStd'>" + _"Li’sar" + "</span>"
|
||||
[/widget]
|
||||
[/column]
|
||||
[/row]
|
||||
[/list_data]
|
||||
[/horizontal_listbox]
|
||||
[/column]
|
||||
[/row]
|
||||
[/grid]
|
||||
|
|
|
@ -7,17 +7,26 @@ local T = wml.tag
|
|||
local wml_actions = wesnoth.wml_actions
|
||||
local _ = wesnoth.textdomain "wesnoth-tutorial"
|
||||
|
||||
selected = 1
|
||||
|
||||
function pre_show(dialog)
|
||||
local list = dialog:find("characters")
|
||||
list.on_modified = function()
|
||||
selected = list.selected_index
|
||||
dialog:close()
|
||||
end
|
||||
end
|
||||
|
||||
function wml_actions.select_character()
|
||||
local character_selection_dialog = wml.load "campaigns/tutorial/gui/character_selection.cfg"
|
||||
local dialog_wml = wml.get_child(character_selection_dialog, 'resolution')
|
||||
|
||||
local result = wesnoth.sync.evaluate_single(function()
|
||||
return { value = gui.show_dialog(dialog_wml) }
|
||||
return { value = gui.show_dialog(dialog_wml, pre_show, function() end) }
|
||||
end)
|
||||
local character = result.value
|
||||
local unit = wml.variables.student_store
|
||||
|
||||
if character == 2 then
|
||||
if selected == 2 then
|
||||
wesnoth.units.to_map({
|
||||
type = "Fighteress",
|
||||
side = 1,
|
||||
|
|
|
@ -14,6 +14,8 @@ function wesnoth.wml_actions.hint_message(cfg)
|
|||
size = 18,
|
||||
location = {5,5},
|
||||
color = {255, 255, 255},
|
||||
bgcolor = {0, 0, 0},
|
||||
bgalpha = 85,
|
||||
duration = "unlimited",
|
||||
max_width = "40%",
|
||||
valign = "top",
|
||||
|
|
|
@ -151,6 +151,7 @@
|
|||
|
||||
[select_character][/select_character]
|
||||
|
||||
{HIGHLIGHT_IMAGE $student_store.x $student_store.y "misc/unit-marker.png" ()}
|
||||
{CLEAR_VARIABLE student_store}
|
||||
|
||||
{GENDER (
|
||||
|
@ -376,6 +377,17 @@
|
|||
) (
|
||||
{PRINT ( _ "Move Li’sar next to Delfador")}
|
||||
)}
|
||||
|
||||
[store_unit]
|
||||
[filter]
|
||||
id=Delfador
|
||||
[/filter]
|
||||
variable=mentor
|
||||
kill=no
|
||||
[/store_unit]
|
||||
|
||||
{HIGHLIGHT_IMAGE $mentor.x $mentor.y "misc/unit-marker.png" ()}
|
||||
{CLEAR_VARIABLE mentor}
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
|
|
|
@ -9,6 +9,7 @@ wesnoth.dofile 'lua/wml-tags.lua'
|
|||
wesnoth.dofile 'lua/feeding.lua'
|
||||
wesnoth.dofile 'lua/diversion.lua'
|
||||
wesnoth.dofile 'lua/stun.lua'
|
||||
wesnoth.dofile 'lua/scenario_end_events.lua'
|
||||
>>
|
||||
[/lua]
|
||||
|
||||
|
|