Compare commits

..

4 commits

2156 changed files with 247887 additions and 295488 deletions

View file

@ -1,4 +0,0 @@
---
Checks: '-*,modernize-use-nullptr,performance-unnecessary-value-param'
WarningsAsErrors: true
...

View file

@ -90,15 +90,10 @@ 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 compile_db=true
jobs=2 --debug=time glibcxx_debug=true glibcxx_assertions=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
@ -109,7 +104,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 -DCLANG_TIDY=true" .
-DENABLE_SYSTEM_LUA="$SYS_LUA" .
}
rm -R /usr/local/lib/cmake
rm /usr/local/lib/libboost*
@ -264,7 +259,7 @@ jobs:
fail-fast: false
matrix:
cfg: [ Release ]
runs-on: macos-13
runs-on: macos-12
env:
CFG: ${{ matrix.cfg }}
@ -297,7 +292,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 -bt 350 -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 -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

View file

@ -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-24.04
runs-on: ubuntu-latest
timeout-minutes: 360
permissions:
actions: read
@ -50,12 +50,11 @@ 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.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 \
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 \
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

View file

@ -27,9 +27,9 @@ jobs:
with:
fetch-depth: 0
- name: check image EXIF metadata
- name: check image metadata
run: |
mapfile -t image_files < <(git diff --name-only --diff-filter=d "$BASE_SHA" "$HEAD_SHA" | grep -E '\.(webp|je?pg)$')
mapfile -t image_files < <(git diff --name-only --diff-filter=d "$BASE_SHA" "$HEAD_SHA" | grep -E '\.(webp|png|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,33 +56,3 @@ 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
View file

@ -127,7 +127,6 @@ wesnoth.plg
*.exe
*.dll
*.so
compile_commands.json
# library files
.libs

View file

@ -1,4 +1,4 @@
# set minimum version
# set minimum version
cmake_minimum_required(VERSION 3.14)
project(wesnoth)
@ -171,7 +171,6 @@ 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)
@ -256,11 +255,6 @@ 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}")
@ -480,7 +474,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=0x0A00 -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS -DNOMINMAX)
add_definitions(-D_WIN32_WINNT=0x0601 -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")

View file

@ -2,7 +2,7 @@
## Prerequisites
Wesnoth requires a compiler with sufficient C++17 support such as GCC 11 and
Wesnoth requires a compiler with sufficient C++17 support such as GCC 8 and
later, or a version of Clang with equivalent support.
You'll need to have these libraries and their development headers installed in
@ -19,7 +19,6 @@ 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)

View file

@ -120,7 +120,6 @@ 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),
)
#
@ -190,11 +189,6 @@ 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):
@ -385,7 +379,6 @@ 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") & \
@ -672,7 +665,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=0x0A00"])
env.Append(LIBS = ["wsock32", "crypt32", "iconv", "z", "shlwapi", "winmm", "ole32", "uuid"], CCFLAGS = ["-mthreads"], LINKFLAGS = ["-mthreads"], CPPDEFINES = ["_WIN32_WINNT=0x0601"])
if env["PLATFORM"] == 'darwin': # Mac OS X
env.Append(FRAMEWORKS = "Cocoa") # Cocoa GUI

View file

@ -81,7 +81,7 @@ code_blocks_target_translations = {
# XCode #
#=======#
def modify_xcode(filename, targets, remove):
def add_to_xcode(filename, targets):
"""Add the given file to the specified targets.
"""
projectfile = rootdir.joinpath(
@ -121,29 +121,24 @@ def modify_xcode(filename, targets, remove):
raise Exception(f"problem finding '{d}' group in '{groupname}'")
parent_group = found_groups[0]
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
# 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()
@ -153,7 +148,7 @@ def modify_xcode(filename, targets, remove):
# source_lists #
#==============#
def modify_source_list(filename, source_list, remove):
def add_to_source_list(filename, source_list):
source_list_file = rootdir.joinpath("source_lists", source_list)
sl_lines = open(source_list_file).readlines()
file_line = filename.as_posix() + '\n'
@ -162,16 +157,12 @@ def modify_source_list(filename, source_list, remove):
if filename.suffix != ".cpp":
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)
# 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.sort()
open(source_list_file, 'w').writelines(sl_lines)
@ -179,18 +170,13 @@ 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:
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)
add_to_source_list(filename, t)
#==============#
# Code::Blocks #
#==============#
def modify_code_blocks_target(filename, target, remove):
def add_to_code_blocks_target(filename, target):
cbp_file = rootdir.joinpath(
"projectfiles",
"CodeBlocks",
@ -204,33 +190,30 @@ def modify_code_blocks_target(filename, target, remove):
elem = f"\t\t<Unit filename=\"{filename_for_cbp}\" />\n"
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
# 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:
break
elif line.startswith("\t\t<Extensions>"):
# we must be the last entry, as this comes after the Unit section
# 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
index += 1
cbp_lines.insert(index, elem)
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)
open(cbp_file, 'w').writelines(cbp_lines)
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]
def add_to_code_blocks(filename, targets):
translated_targets = [code_blocks_target_translations[t] for t in targets]
print(" code::blocks targets:", translated_targets)
for t in translated_targets:
modify_code_blocks_target(filename, t, remove)
add_to_code_blocks_target(filename, t)
def sanity_check_existing_cpp_hpp(filenames):
"""
@ -302,8 +285,6 @@ 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()
@ -320,13 +301,7 @@ if __name__ == "__main__":
sanity_check_existing_cpp_hpp(filenames)
for filename in filenames:
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)
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)

View file

@ -89,6 +89,7 @@ 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
@ -171,20 +172,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_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_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_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

13014
changelog.md

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,2 @@
### WML Engine
* Add alignment in [attack] to specify the alignment of an attack independent of the unit's alignment.

View file

@ -0,0 +1,3 @@
### Units
* Walking Corpse: arcane vulnerability reduced from 40% to 20%.
* Soulless: arcane vulnerability reduced from 40% to 20%.

View file

@ -1,2 +0,0 @@
### Units
* Dune Warmaster: HP 59 -> 61 scimitar damage 9 -> 10

View file

@ -1,5 +0,0 @@
### 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

View file

@ -1,2 +0,0 @@
### Units
* Dwarvish Explorer: physical resists reduced from 20% to 10%, melee damage increased from 10 to 11.

View file

@ -1,3 +0,0 @@
### Units
* Fire Wisps and Guardian - Fire Resistance changed from 50% to 70%
* Fire Wraith - Fire Resistance changed from 50% to 80%

View file

@ -0,0 +1,5 @@
### 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.

View file

@ -0,0 +1,2 @@
### User interface
* Option key is now identified as such instead of Alt in the Hotkeys preferences section on macOS builds

View file

@ -0,0 +1,2 @@
### User interface
* Search filter should now be case-insensitive for more than just ASCII characters (#9328)

View file

@ -1,2 +0,0 @@
### Units
* Orcish Crossbowman: melee 6-3 -> 4-3, experience to level 43 -> 57

View file

@ -0,0 +1,2 @@
### Formula API
* Removed properties `unit.side` and `terrain.owner`. Use `unit.side_number` and `terrain.owner_side` instead.

View file

@ -1,5 +1,6 @@
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
@ -24,7 +25,6 @@ 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

1 Date File License Author - Real Name(other name);Real Name(other name);etc Notes Needs Update MD5
2 2009/04/10 data/campaigns/Delfadors_Memoirs/sounds/rumble.wav GNU GPL v2+ Fabian Müller(fabi/fendrin);Eric S. Raymond(esr) ba2422ca12aeebe50955c8f44b52243d
3 2023/09/15 data/campaigns/Eastern_Invasion/music/cry_from_elensefar.ogg CC BY-SA 4.0 (pluft) 3b32d7970ab520b2d488559b69b2ac68
4 2023/09/15 data/campaigns/Eastern_Invasion/music/heavens-remix.ogg CC BY-SA 4.0 (gabriel silver);(dalas) 158c80c11e2d2cdb5f1ab5cc0298a8fe
5 2023/09/15 data/campaigns/Eastern_Invasion/music/journeys_end_faststart.ogg GNU GPL v2+ Mattias Westlund(West);(dalas) 3f6b2c8be4e6e30087b7a3cc5969831b
6 2021/03/20 data/campaigns/Eastern_Invasion/sounds/gate-fall.ogg GNU GPL v2+ unknown 15d08eb898db8684f18de206a6cbd1a5
25 2013/12/08 data/core/music/battle.ogg GNU GPL v2+ Aleksi Aubry-Carlson(Aleksi) 93b53db9e81c0d8879cf4ca51cd246bd
26 2013/12/08 data/core/music/breaking_the_chains.ogg GNU GPL v2+ Mattias Westlund(West) fe599b1e02f41846a6e2afeb7d6df76e
27 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
28 2013/12/08 data/core/music/defeat.ogg GNU GPL v2+ Timothy Pinkham(TimothyP) 8cb8eb9871292ad288f5c703f0679460
29 2013/12/08 data/core/music/defeat2.ogg GNU GPL v2+ Ryan Reilly(Rain) 9775634e4a20c10844c823d5d79f824f
30 2013/12/08 data/core/music/elf-land.ogg GNU GPL v2+ Aleksi Aubry-Carlson(Aleksi) addc5393092c23f2789a028d94f4212e

View file

@ -21,14 +21,6 @@
[/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"

View file

@ -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= _ "Dont 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 dont corner them, theyll leave us alone."
message= _ "Dont 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 dont corner them, theyll 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= _ "Youre 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]

View file

@ -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]

View file

@ -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 Konrads 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 Konrads side here. The same algorithm as for scenario ""Protect Unit"" is used."
[/message]
[/command]
[/set_menu_item]

View file

@ -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]

View file

@ -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(false)
units[i]:advance( )
units[i].experience = mathx.random ( 0, mathx.round( units[i].max_experience / 2 ) )
end
>>

View file

@ -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 may not always translate directly to 20/60/100 gold/income, since enemies with many villages effectively have a higher guaranteed income
# this many not always translate directly to 20/60/100 gold/income, since enemies with many villages effectively have a higher guranteed incoime
# 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 determines how successful you'll be
# big battles, where your performance in S01-S12 determine 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 guaranteed 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 guranteed 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"
#

View file

@ -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 = _"Theyre here!"})
wml.fire("message" , { x = x , y = y , message = _"They're here!"})
bandits_found(x,y)
return

View file

@ -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 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."
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."
{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? Were cut off from Wesnoth!"
message= _ "Wha- How did so many of them flank us? Were cut off from Wesnoth!"
[/message]
# Dacyn reappears and gives message about trapdoor.

View file

@ -133,8 +133,6 @@
[/modifications]
[/unit]
#endif
#ifdef NORMAL
{NAMED_NOTRAIT_UNIT 3 (Troll Whelp) 23 8 "Hur" (_"Hur")} {GUARDIAN}
[+unit]
[modifications]

View file

@ -321,6 +321,9 @@
#po: star wars reference
message= _ "We will watch your career with great interest..."
[/message]
[endlevel]
result=defeat
[/endlevel]
[/event]
[event]
name=last breath
@ -332,6 +335,10 @@
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

View file

@ -485,7 +485,6 @@
[/set_achievement]
[/then]
[/if]
{HERODEATH_ADDOGIN}
[/event]
[event]

View file

@ -801,7 +801,7 @@
[else]
[gold]
side=1
amount=-$gold_cost
amount=-50
[/gold]
[sound]
name=gold.ogg
@ -884,7 +884,7 @@
[else]
[gold]
side=1
amount=-$gold_extra
amount=-150
[/gold]
[sound]
name=gold.ogg
@ -1008,7 +1008,7 @@
[/status]
[/modify_unit]
{CLEAR_VARIABLE gold,gold_cost,gold_extra,herbs_needed,herb_locations}
{CLEAR_VARIABLE gold,gold_cost,herbs_needed,herb_locations}
[/event]
[event]

View file

@ -230,32 +230,31 @@
[/effect]
[/modify_unit]
[/event]
[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
[event] # manually set gold to 0
name=side 7 turn refresh
first_time_only=no
[if]
[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]
{VARIABLE_CONDITIONAL ravanal_no_income not_equals yes}
[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]
[/filter_condition]
[modify_side]
side=7
gold=9999
[/modify_side]
[/event]
#--------------------
@ -665,12 +664,6 @@
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!"
@ -694,9 +687,6 @@
[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
@ -924,7 +914,7 @@
[/then]
[else]
{FIND_NEARBY (trait,side=survivor,1) 36 15 99}
{FIND_NEARBY (type,side=Knight,1) 36 15 99}
[/else]
[/if]
[message]
@ -933,6 +923,7 @@
[/message]
{FIND_NEARBY (
type=Knight,Terraent
side=8
) 36 15 99}
[message]

View file

@ -516,38 +516,6 @@
{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
@ -750,9 +718,34 @@
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]
[fire_event]
name=owaec_joins
[/fire_event]
[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]
[if]
[not]
[have_unit]
@ -886,9 +879,33 @@
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]
[fire_event]
name=owaec_joins
[/fire_event]
[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]
[message]
speaker=Owaec
message= _ "Now let us free these villagers from the outlaws terrorizing them!"

View file

@ -918,6 +918,19 @@
[/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}
@ -927,8 +940,9 @@
{HERODEATH_ADDOGIN}
{HERODEATH_HAHID}
{HERODEATH_TERRAENT}
{HERODEATH_GRUG}
# {HERODEATH_GRUG} # don't have Gweddry say "he was not one of us, yet [...]"
{HERODEATH_DOLBURRAS}
{HERODEATH_HAHID}
[/scenario]
#undef SCENARIO_TURN_LIMIT

View file

@ -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]

View file

@ -1862,6 +1862,5 @@ Your punishment is death."
{HERODEATH_TERRAENT}
{HERODEATH_DOLBURRAS}
{HERODEATH_GRUG}
{HERODEATH_ADDOGIN}
{HERODEATH_HAHID}
[/scenario]

View file

@ -252,9 +252,9 @@
id=dacyn_no_halo
[effect]
apply_to=remove_ability
[filter_ability]
[experimental_filter_ability]
tag_name=illuminates
[/filter_ability]
[/experimental_filter_ability]
[/effect]
[/object]
[/modify_unit]
@ -419,9 +419,9 @@
id=dacyn_no_halo
[effect]
apply_to=remove_ability
[filter_ability]
[experimental_filter_ability]
tag_name=illuminates
[/filter_ability]
[/experimental_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]

View file

@ -5,13 +5,18 @@
# 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
25 #enddef
75 #enddef
#define TURNS_LOW_WARNING
20 #enddef
60 #enddef
[scenario]
id=14_The_Drowned_Plains
@ -773,36 +778,10 @@
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 Alrics Palace" }
{SET_LABEL 17 5 _"Sir Efrans Castle" }
{SET_LABEL 7 50 _"Lord Gaelycs Citadel"}
@ -1278,15 +1257,13 @@
[/message]
[message]
speaker=Gweddry
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= _ "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]
[objectives]
side=1
[objective]
description= _ "Gather as much gold as you can before turns run out."
description= _ "Defeat all enemy leaders"
condition=win
[/objective]
[objective]
@ -1301,13 +1278,17 @@ Even if we lack the strength to truly reclaim this place, we should still take t
description= _ "Death of Gweddry, Dacyn, or Owaec"
condition=lose
[/objective]
{TURNS_RUN_OUT}
[gold_carryover]
bonus=no
carryover_percentage=80
bonus=yes
carryover_percentage=40
[/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]
@ -1763,44 +1744,19 @@ 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 # 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]
set=3
[/effect]
# needs to be slow, or else his escort can't keep up
[/object]
[fire_event]
name=moveto
@ -2093,42 +2049,53 @@ I offer one final prayer to the Light, that at least my family may be spared and
# FLAVOR
#--------------------
[event]
name=turn 16
[message]
speaker=Gweddry
#po: spoken at the start of a new turn after killing the first undead leader
message= _ "Dacyn, Ive 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, youre the magic expert."
[/message]
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, Ive 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, youre the magic expert."
[/message]
[/event]
[/event]
[/event]
#--------------------
@ -2139,24 +2106,32 @@ 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= _ "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= _ "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 Owaecs lust for vengeance. The Plains are already drowned."
[/message]
[/event]
# time over
[event]
name=time over # not side 1 turn end, so the AI gets a chance to attack
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]
[message]
speaker=Owaec
message= _ "So much death. So many of my kinsmen left unavenged. If only we had more time..."
#po: time over, talking to Dacyn
message= _ "Your search for foul magic has caused enough harm already, and now you would leave my countrymens 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]
[message]
speaker=Gweddry
message= _ "We have done all we could here."
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."
[/message]
[endlevel]
result=victory
bonus=no
{NEW_GOLD_CARRYOVER 80}
result=defeat
[/endlevel]
[/event]
@ -2164,35 +2139,40 @@ 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 80}
{NEW_GOLD_CARRYOVER 40}
[/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.
@ -2203,9 +2183,11 @@ 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..."

View file

@ -37,7 +37,7 @@
controller=human
team_name=good
user_team_name=_"Wesnothians"
{GOLD 0 0 0} # you're expected to have a large early finish bonus from S14; maybe 300-600 gold
{GOLD 100 75 50} # 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

View file

@ -315,30 +315,50 @@
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]
[have_unit]
id=Owaec
[/have_unit]
{VARIABLE_CONDITIONAL plague_staff_wielder_id equals Dolburras}
[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."
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."
[/message]
{CLEAR_VARIABLE plague_staff_wielder_id}
[/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."
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]
[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]
@ -403,15 +423,34 @@
time=750
[/delay]
[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]
[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 Im 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]
[/then]
[/if]

View file

@ -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=120
arcane=130
cold=70
[/resistance]

View file

@ -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=80
arcane=90
cold=80
[/resistance]

View file

@ -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 units 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 units 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"

View file

@ -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,8 +139,7 @@
message= _ "Hurt... grarrgghh..." # wmllint: no spellcheck
[/message]
[message]
id=Gweddry
side=$unit.side
speaker=Gweddry
message= _ "Though he was not one of us, he served bravely alongside Wesnoths best. We must carry on the good fight."
[/message]
[/event]
@ -172,13 +171,11 @@
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]
id=Grug
side=$unit.side
speaker=Grug
message= _ "Bar... ber... bears? Die why?"
[/message]
[message]
id=Dolburras
side=$unit.side
speaker=Dolburras
message= _ "Aye, tis a sad place for one o us foreigners to fall. Well miss ye, thats for sure."
[/message]
[/event]

View file

@ -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? Whats happening to me?"
message= _ "Wha- where am I? Whats happening to me?"
[/message]
[message]
speaker=spirit

View file

@ -70,7 +70,10 @@
[/then]
[else]
{INVALID_DESC}
[message]
speaker=unit
message={INVALID_DESC}
[/message]
[/else]
[/if]
[/event]
@ -136,7 +139,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
@ -178,7 +181,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
@ -213,7 +216,7 @@ sentinel #enddef
_"Shield of the Sentinel"
_"Deep within this shields towering bulk, enchanted machinery whirrs faintly. Whenever an adjacent ally is hit by an attack, <i><b>this shields bearer is hit instead</b></i>."
{NOTE_REUSEABLE}
()
""
(
[effect]
apply_to=overlay
@ -565,7 +568,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
@ -595,7 +598,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
@ -628,7 +631,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
@ -693,7 +696,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
@ -725,7 +728,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
@ -763,16 +766,16 @@ plague_staff #enddef
{PLACE_ITEM
{ID_PLAGUE_STAFF} _"staff" items/plague-staff.png {X} {Y}
(
[not]
race=dunefolk
[/not]
[not]
type_adv_tree=White Mage,Paladin
[not]
id=Dacyn
[/not]
[/not]
[not]
id=Owaec,Gweddry,Dacyn,Terraent,Konrad
id=Owaec,Gweddry,Dacyn,Hahid al-Ali,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)
@ -781,83 +784,8 @@ 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}
(
[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! Im 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. Dont expect me to wield that — civilized cultures dont 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]
)
_"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.
(
[effect]
apply_to=new_attack

View file

@ -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=3
side=2
[/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

View file

@ -300,8 +300,7 @@
[message]
role=Supporter
# po: sarcasm about the idea of entering the mines where this scenario takes place
message= _ "Great idea, Tallin. Its so dark I probably couldnt even fight a bat down here."
message= _ "Great idea, Tallin. It's so dark I probably couldnt even fight a bat down here."
[/message]
[move_unit_fake]

View file

@ -144,8 +144,8 @@
x,y=18,1
side=2
[modifications]
{TRAIT_QUICK}
{TRAIT_DEXTROUS}
{TRAIT_STRONG}
{TRAIT_RESILIENT}
[/modifications]
[/unit]
[unit]
@ -156,8 +156,8 @@
side=2
facing=sw
[modifications]
{TRAIT_STRONG}
{TRAIT_QUICK}
{TRAIT_DEXTROUS}
{TRAIT_RESILIENT}
[/modifications]
[/unit]
[unit]
@ -172,18 +172,6 @@
{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]
@ -275,7 +263,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]

View file

@ -113,7 +113,7 @@
[/ai]
[unit]
id=Gathor
name= _ "BarGathor"
name= _ "Bar'Gathor"
type=Orcish Warrior
profile=portraits/orcs/grunt-3.webp
[modifications]

View file

@ -67,8 +67,6 @@
comment = "Sprite animations (defense and magic) of orcish shamans"
[/entry]
[/about]
{ENABLE_SAURIAN_SPEARTHROWER}
[/campaign]
#ifdef CAMPAIGN_SON_OF_THE_BLACK_EYE

View file

@ -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]

View file

@ -69,6 +69,10 @@
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]

View file

@ -1,28 +1 @@
#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]

View file

@ -0,0 +1,35 @@
-- 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

View file

@ -233,19 +233,6 @@
#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)}

View file

@ -249,25 +249,6 @@
[/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
@ -335,7 +316,7 @@
[/or]
[/filter_condition]
# If Aiglondur is on the signpost and Angarthing next to him, or the other way around,
# If Aiglondor 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

View file

@ -1294,13 +1294,6 @@
result=victory
carryover_report=no
[/endlevel]
#ifdef HARD
[set_achievement]
content_for=the_hammer_of_thursagan
id="new_thursagan"
[/set_achievement]
#endif
[/event]
#########################################################################################
######################################## Deaths #########################################

View file

@ -542,7 +542,7 @@ _f, _f, Re, _f
[message]
speaker=narrator
{NARRATOR: _"Deoran and Urza Afalas retreated quickly from Mebrins fortress..."}
{NARRATOR: _"Deoran and Urza Afalas retreated quickly from Mebrin's fortress..."}
image=wesnoth-icon.png
[/message]

View file

@ -13,7 +13,7 @@
image="data/campaigns/Under_the_Burning_Suns/images/campaign_image.png"
abbrev= _ "UtBS"
rank=205
year="1000 AF"
year="300 AF"
define=CAMPAIGN_UNDER_THE_BURNING_SUNS
first_scenario=01_The_Morning_After

View file

@ -8,12 +8,12 @@
hitpoints=22
movement_type=dwarvishfoot
movement=4
experience=25
experience=50
{AMLA_DEFAULT}
advances_to=null
level=0
level=1
alignment=neutral
cost=12
cost=17
usage=fighter
# wmllint: local spelling Dawarf
description= _ "Dont ask where the Dawarf came from. You really dont want to know. It is a secret well guarded by the great lore-masters of Wesnoth. And it isnt pretty. Hint: it involves lots of sherbet."

View file

@ -1548,10 +1548,10 @@ _ "cooldown 1"#enddef
_ "cooldown 2"#enddef
#define STR_COOLDOWN_RESTRICT_2
_ "After using this attack, you cant 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 cant 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

View file

@ -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

View file

@ -1,10 +1,6 @@
--<<
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
@ -46,52 +42,18 @@ function wesnoth.wml_actions.wc2_start_units(cfg)
end
end
function wc2_scenario.average_gold()
local total_gold = 0
local nsides = 0
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
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
for side_num, side in ipairs(human_sides) do
player_gold = player_gold + side.gold
end
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>"
player_gold = math.max(player_gold / #human_sides, 0)
wml.variables.wc2_carryover = math.ceil( (nvillages*turns_left + player_gold) * 0.15)
end
-- carryover handling: we use a custom carryover machnics that
@ -119,10 +81,11 @@ on_event("wc2_start", function(cx)
end
end
local gold = (wml.variables["wc2_difficulty.extra_gold"] or 0)
local gold = (wml.variables.wc2_carryover or 0) + (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
@ -133,7 +96,9 @@ on_event("enemies defeated", function(cx)
wesnoth.audio.play("ambient/ship.ogg")
wesnoth.wml_actions.endlevel {
result = "victory",
carryover_report = true,
carryover_percentage = 0,
carryover_add = false,
carryover_report = false,
}
end)

View file

@ -10,7 +10,7 @@ wesnoth.dofile("./scenario_utils/plot.lua")
wesnoth.dofile("./scenario_utils/side_definitions.lua")
settings = globals.settings or {}
local early_victory_bonus = {27, 40, 53, 63}
local n_villages = {27, 40, 53, 63}
local function get_map_generator(scenario_data)
if globals.settings.default_id then
@ -45,9 +45,7 @@ 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 = {
@ -73,7 +71,6 @@ 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,
@ -84,8 +81,6 @@ 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]
@ -95,6 +90,21 @@ 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, {
@ -107,28 +117,19 @@ 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 = _"Start"
scenario.name = "WC_II_" .. nplayers .. " - " .. _"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 = scenario_desc
scenario.name = "WC_II_" .. nplayers .. " " .. scenario_desc .. " - "--.. scenario.map_name
end
local res = wc2_convert.lon_to_wml(scenario, "scenario")

View file

@ -13,18 +13,6 @@ _ "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
@ -113,7 +101,7 @@ _ "WC4p" #enddef
icon = {ICON}
image = {IMAGE_ONE}
type = mp
abbrev = {WC_II_ABBREV_{PLAYERS}P}
abbrev = _ "WC" + {PLAYERS}\
{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}

View file

@ -13,9 +13,9 @@
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "center"
horizontal_alignment = "left"
[label]
definition = "title_script"
definition = "title"
label = _"Select Character"
[/label]
[/column]
@ -25,7 +25,7 @@
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "center"
horizontal_alignment = "left"
[label]
label = _"Who do you want to play as?"
[/label]
@ -39,88 +39,37 @@
grow_factor = 1
border = "all"
border_size = 5
[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'>" + _"Lisar" + "</span>"
[/widget]
[/column]
[/row]
[/list_data]
[/horizontal_listbox]
[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 = _"Lisar"
return_value = 2
[/button]
[/column]
[/row]
[/grid]

View file

@ -7,26 +7,17 @@ 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, pre_show, function() end) }
return { value = gui.show_dialog(dialog_wml) }
end)
local character = result.value
local unit = wml.variables.student_store
if selected == 2 then
if character == 2 then
wesnoth.units.to_map({
type = "Fighteress",
side = 1,

View file

@ -14,8 +14,6 @@ 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",

View file

@ -151,7 +151,6 @@
[select_character][/select_character]
{HIGHLIGHT_IMAGE $student_store.x $student_store.y "misc/unit-marker.png" ()}
{CLEAR_VARIABLE student_store}
{GENDER (
@ -377,17 +376,6 @@
) (
{PRINT ( _ "Move Lisar 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]

View file

@ -9,7 +9,6 @@ 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]

View file

@ -1175,10 +1175,10 @@ sort=yes
email = "mishanhideaki88_AT_gmail.com"
[/entry]
[entry]
name = "いいむらなおき (amatubu) Naoki Iimura"
name = "いいむらなおき (amatubu) - Naoki Iimura"
[/entry]
[entry]
name = "岡田信人 Nobuhito Okada"
name = "岡田信人 - Nobuhito Okada"
email = "okyada_AT_gmail.com"
[/entry]
[entry]

View file

@ -26,7 +26,7 @@
[topic]
id=editor_tool_paint
title= _ "Paint Tool"
text= "<img src=icons/action/editor-tool-paint_60.png align=left />" + _ "Paint terrain tiles on the map.
text= "<img src=icons/action/editor-tool-paint_60.png align=left box=yes/>" + _ "Paint terrain tiles on the map.
The paint tool utilizes the brush sizes and the terrain palette.
<header>Keyboard Modifiers</header>
@ -36,11 +36,11 @@ The paint tool utilizes the brush sizes and the terrain palette.
<header>Brush Sizes</header>
The selected brush changes the size of the tool:" +
"<table>" +
"<row><col><img src=icons/action/editor-brush-1_30.png align=left /></col><col>" + _ "Paint single hexes." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-2_30.png align=left /></col><col>" + _ "Paint seven hexes at a time." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-3_30.png align=left /></col><col>" + _ "Paint nineteen hexes at a time." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-nw-se_30.png align=left /></col><col>" + _ "Paint three hexes in a line." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-sw-ne_30.png align=left /></col><col>" + _ "Paint three hexes in a line." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-1_30.png align=left box=yes/></col><col>" + _ "Paint single hexes." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-2_30.png align=left box=yes/></col><col>" + _ "Paint seven hexes at a time." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-3_30.png align=left box=yes/></col><col>" + _ "Paint nineteen hexes at a time." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-nw-se_30.png align=left box=yes/></col><col>" + _ "Paint three hexes in a line." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-sw-ne_30.png align=left box=yes/></col><col>" + _ "Paint three hexes in a line." + "</col></row>" +
"</table>"
[/topic]
# wmllint: markcheck on
@ -49,7 +49,7 @@ The selected brush changes the size of the tool:" +
[topic]
id=editor_tool_fill
title= _ "Fill Tool"
text= "<img src=icons/action/editor-tool-fill_60.png align=left />" + _ "Fill continuous regions of terrain with a different one.
text= "<img src=icons/action/editor-tool-fill_60.png align=left box=yes/>" + _ "Fill continuous regions of terrain with a different one.
The fill tool utilizes the terrain palette.
<header>Keyboard Modifiers</header>
@ -62,7 +62,7 @@ The fill tool utilizes the terrain palette.
[topic]
id=editor_tool_select
title= _ "Select Tool"
text= "<img src=icons/action/editor-tool-select_60.png align=left />" + _ "Selects a set of hex fields, for use with with the cut, copy and fill-selection buttons below the menu bar.
text= "<img src=icons/action/editor-tool-select_60.png align=left box=yes/>" + _ "Selects a set of hex fields, for use with with the cut, copy and fill-selection buttons below the menu bar.
<header>Keyboard Modifiers</header>
• Shift+mouse click: Magic Wand mode, select the hex under the mouse cursor, and adjoining hexes of the same terrain type.
@ -71,11 +71,11 @@ The fill tool utilizes the terrain palette.
<bold>Brush Sizes</bold>
The selected brush changes the size of the tool:" +
"<table>" +
"<row><col><img src=icons/action/editor-brush-1_30.png align=left /></col><col>" + _ "Select single hexes." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-2_30.png align=left /></col><col>" + _ "Select seven hexes at a time." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-3_30.png align=left /></col><col>" + _ "Select nineteen hexes at a time." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-nw-se_30.png align=left /></col><col>" + _ "Select three hexes in a line." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-sw-ne_30.png align=left /></col><col>" + _ "Select three hexes in a line." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-1_30.png align=left box=yes /></col><col>" + _ "Select single hexes." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-2_30.png align=left box=yes /></col><col>" + _ "Select seven hexes at a time." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-3_30.png align=left box=yes /></col><col>" + _ "Select nineteen hexes at a time." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-nw-se_30.png align=left box=yes /></col><col>" + _ "Select three hexes in a line." + "</col></row>" +
"<row><col><img src=icons/action/editor-brush-sw-ne_30.png align=left box=yes /></col><col>" + _ "Select three hexes in a line." + "</col></row>" +
"</table>"
[/topic]
# wmllint: markcheck on
@ -84,17 +84,17 @@ The selected brush changes the size of the tool:" +
[topic]
id=editor_tool_paste
title= _ "Clipboard and Paste Tool"
text= "<img src=icons/action/editor-paste_60.png align=left />" + _ "Rotate, flip and paste the terrain in the clipboard
text= "<img src=icons/action/editor-paste_60.png align=left box=yes />" + _ "Rotate, flip and paste the terrain in the clipboard
Hexes can be cut or copied to the clipboard using the <ref dst='editor_tool_select'>Select Tool</ref>.
The paste tool shows an outline of the clipboard, which can be pasted with a mouse-click. Only the outline is shown, but mistakes can be corrected with the undo function, which is bound to both Control+Z and to the same key as the in-game undo function.
The paste tool also has some clipboard-manipulation functions:" +
"<table>" +
"<row><col><img src=icons/action/editor-clipboard-rotate-cw_30.png align=left /></col><col>" + _ "Rotate clockwise by 60°." + "</col></row>" +
"<row><col><img src=icons/action/editor-clipboard-rotate-ccw_30.png align=left /></col><col>" + _ "Rotate counter-clockwise by 60°." + "</col></row>" +
"<row><col><img src=icons/action/editor-clipboard-flip-horizontal_30.png align=left /></col><col>" + _ "Flip horizontally" + "</col></row>" +
"<row><col><img src=icons/action/editor-clipboard-flip-vertical_30.png align=left /></col><col>" + _ "Flip vertically" + "</col></row>" +
"<row><col><img src=icons/action/editor-clipboard-rotate-cw_30.png align=left box=yes /></col><col>" + _ "Rotate clockwise by 60°." + "</col></row>" +
"<row><col><img src=icons/action/editor-clipboard-rotate-ccw_30.png align=left box=yes /></col><col>" + _ "Rotate counter-clockwise by 60°." + "</col></row>" +
"<row><col><img src=icons/action/editor-clipboard-flip-horizontal_30.png align=left box=yes /></col><col>" + _ "Flip horizontally" + "</col></row>" +
"<row><col><img src=icons/action/editor-clipboard-flip-vertical_30.png align=left box=yes /></col><col>" + _ "Flip vertically" + "</col></row>" +
"</table>"
[/topic]
# wmllint: markcheck on
@ -103,7 +103,7 @@ The paste tool also has some clipboard-manipulation functions:" +
[topic]
id=editor_tool_starting
title= _ "Starting Locations Tool"
text= "<img src=icons/action/editor-tool-starting-position_60.png align=left />" +
text= "<img src=icons/action/editor-tool-starting-position_60.png align=left box=yes />" +
# po: the parts about "10" being shown as "Player 10" use the translatable string "Player $side_num" in the wesnoth-editor textdomain
_ "Defines the side leader starting position.
This tool sets the side leaders default starting locations, and named special locations. Both types of location are enabled in both <ref dst='..editor_mode_terrain'>Terrain Editor</ref> and <ref dst='..editor_mode_scenario'>Scenario Editor</ref> modes. The location names are shown as a list in the editor palette, clicking on the map will place that name on a hex, each location can only be placed on a single hex, and the editor will only allow one location per hex.
@ -129,7 +129,7 @@ Named locations can be accessed from WML using the Standard Location Filters
# po: The images here have text, while they could be translated I assume editor-only images wont be.
# po: In English the text is “IO” for impassable and “UO” for unwalkable.
_ "editor^<header>Movement Overlays</header>
<img src='terrain/grass/green.png~BLIT(terrain/impassable-editor.png~O(0.5))' /><img src='terrain/grass/green.png~BLIT(terrain/unwalkable-editor.png~O(0.5))' align=here /><br/><bold>Impassable and Unwalkable</bold>
<img src='terrain/grass/green.png~BLIT(terrain/impassable-editor.png~O(0.5))' box=yes /><img src='terrain/grass/green.png~BLIT(terrain/unwalkable-editor.png~O(0.5))' align=here box=yes /><br/><bold>Impassable and Unwalkable</bold>
While easily noticeable in the editor, these are invisible in the game, so the mixed terrains created by them look like the base terrain. They create a mixed terrain with the movement costs set to “impassable” or “unwalkable” respectively." + "
@ -137,7 +137,7 @@ While easily noticeable in the editor, these are invisible in the game, so the m
# po: The images here have text, while they could be translated I assume editor-only images wont be.
# po: In English these images are the literal text “Castle overlay” and “Keep overlay”.
_ "editor^<header>Castle Overlays</header>
<img src='terrain/grass/green.png~BLIT(terrain/castle/castle-overlay-editor.png~O(0.5))' align=here /><img src='terrain/grass/green.png~BLIT(terrain/castle/keep-overlay-editor.png~O(0.5))' align=here />
<img src='terrain/grass/green.png~BLIT(terrain/castle/castle-overlay-editor.png~O(0.5))' align=here box=yes /><img src='terrain/grass/green.png~BLIT(terrain/castle/keep-overlay-editor.png~O(0.5))' align=here box=yes />
Adding either of these overlays to a passable hex allows units to be recruited onto a hex. The keep also allows a leader to recruit from there.
These can be added to an impassable hex to connect a castle to a visually-separate keep through an impassable wall. Its also possible to create a castle that seems to have grassland between the keep and towers, however this requires the connecting hexes to be occupied or blocked to prevent units being recruited onto them." + "
@ -146,13 +146,13 @@ These can be added to an impassable hex to connect a castle to a visually-separa
# po: The image here has text, while it could be translated I assume editor-only images wont be.
# po: In English this image is the literal text “Village overlay”.
_ "editor^<header>Village Overlay</header>
<img src='terrain/grass/green.png~BLIT(terrain/village/village-overlay-editor.png~O(0.5))' align=here />
<img src='terrain/grass/green.png~BLIT(terrain/village/village-overlay-editor.png~O(0.5))' align=here box=yes />
This turns any base terrain into a village, providing income and healing." + "
" +
# po: The image is an “S” on a solid black background.
_ "editor^<header>Fake Shroud</header>
<img src=terrain/void/shroud-editor.png align=left />
<img src=terrain/void/shroud-editor.png align=left box=yes />
Fake Shroud looks like an unexplored area, even in scenarios that have shroud disabled and even when the players units can see the hex."
[/topic]
@ -160,12 +160,12 @@ Fake Shroud looks like an unexplored area, even in scenarios that have shroud di
[topic]
id=editor_terrain_elevation
title= _ "Terrain Elevation Graphics"
text="<img src='icons/terrain/terrain_group_elevation_30.png~SCALE(60,60)' align=left />" +
text="<img src='icons/terrain/terrain_group_elevation_30.png~SCALE(60,60)' align=left box=yes />" +
_ "
A cosmetic elevation effect that looks a little different in the editor than in the game due to visual aids in the editor; all the overlays described here are found in the terrain palettes “elevation” group.
" +
_ "editor^<header>Direct Overlays</header>" +
"<br/><img src='terrain/elevation/bluffs-tile.png' /><img src='terrain/elevation/regular-tile.png' /><br/>" +
"<br/><img src='terrain/elevation/bluffs-tile.png' box=yes /><img src='terrain/elevation/regular-tile.png' box=yes /><br/>" +
_ "
<b>Bluffs and Gulch</b>
@ -176,8 +176,8 @@ The bluffs, gulches, and similar variations are much like a standard terrain ove
"
" +
"<table>" +
"<row><col><img src='terrain/grass/green.png~BLIT(terrain/floodfill/flood_high.png)' /></col><col>" + _ "Raised elevation on-map marker" + "</col></row>" +
"<row><col><img src='terrain/floodfill/marker-high-tile.png' /></col><col>" + _ "Raised elevation editor palette icon" + "</col></row>" +
"<row><col><img src='terrain/grass/green.png~BLIT(terrain/floodfill/flood_high.png)' box=yes /></col><col>" + _ "Raised elevation on-map marker" + "</col></row>" +
"<row><col><img src='terrain/floodfill/marker-high-tile.png' box=yes /></col><col>" + _ "Raised elevation editor palette icon" + "</col></row>" +
"</table>" +
"To make a patch of terrain higher or lower, and still be able to use other overlay terrains such as trees, you will need to use these markers. Placing one of these arrows on the map will flood-fill the map with a color-coded haze; neither the haze nor the arrow will be visible in game. The hazed area will have a border ledge, making it look higher or lower than the adjacent tiles.
@ -192,7 +192,7 @@ The marker arrows are not very useful by themselves, but the bluffs/gulch-type t
An example use case would be:
1. Select the Bluffs (^Qhh) from the editor palette and use single-hex paint tool to outline a big blob over an empty, all-grass map.
2. Place a Marker High (^_mh) arrow on a tile inside the blob (not on the Bluffs border).
3. The blob should all be raised now, and as long as you dont overwrite the Marker or Bluffs overlays, you can add other terrain overlays as needed.
3. The blob should all be raised now, and as long as you don't overwrite the Marker or Bluffs overlays, you can add other terrain overlays as needed.
The graphics used to represent the ledge borders are determined by the base terrain.
" +
@ -205,7 +205,7 @@ The graphics used to represent the ledge borders are determined by the base terr
title= _ "Deprecated Terrain"
# po: The main reason for choosing “D” is that the hole in the middle of the letter makes it easier to see which terrain is underneath it. This uses a hardcoded image and doesnt expect the image to be translated.
# po: The Xol and ^Efs terrains help pages arent given hyperlinks, because they both have hide_help enabled. Even when on a map with Xol on it, ctrl+t will show the hidden page but the ref still wont link to it.
text= _ "editor^<img src='terrain/grass/green.png~BLIT(terrain/deprecated-editor.png)' />
text= _ "editor^<img src='terrain/grass/green.png~BLIT(terrain/deprecated-editor.png)' box=yes/>
The magenta D (for “Deprecated”).
This is shown in the editor over deprecated terrain codes. Examples are:
@ -220,7 +220,7 @@ The help pages for these terrains may have additional text thats only shown i
[topic]
id=editor_tool_label
title= _ "Label Tool"
text= "<img src=icons/action/editor-tool-label_60.png align=left />" + _ "Put text labels on the map.
text= "<img src=icons/action/editor-tool-label_60.png align=left box=yes />" + _ "Put text labels on the map.
• Left-click will open a dialog box to create a new label or edit an existing one.
• Right-click deletes.
• Drag-and-drop with the left mouse button moves labels.
@ -235,7 +235,7 @@ This tool is only available in Scenario Mode; the decorations are implemented in
[topic]
id=editor_tool_scenery
title= _ "Item Tool (Scenery Tool)"
text= "<img src=icons/action/editor-tool-item_60.png align=left />" + _ "The Item Tool allows placing decorations such as windmills, bookcases and monoliths.
text= "<img src=icons/action/editor-tool-item_60.png align=left box=yes />" + _ "The Item Tool allows placing decorations such as windmills, bookcases and monoliths.
Multiple items can be placed on the same hex.
• Left-click will place a decoration on the clicked hex.
@ -253,7 +253,7 @@ This tool is only available in Scenario Mode; the decorations are not part of th
[topic]
id=editor_tool_village
title= _ "Village Ownership Tool"
text= "<img src=icons/action/editor-tool-village_60.png align=left />" + _ "This tool assigns ownership of villages at the start of a scenario.
text= "<img src=icons/action/editor-tool-village_60.png align=left box=yes />" + _ "This tool assigns ownership of villages at the start of a scenario.
The villages must first be placed on the terrain with the <ref dst='editor_tool_paint'>Paint Tool</ref>.
• Left-click will assign the village to the currently-selected side.
@ -269,7 +269,7 @@ This tool is only available in Scenario Mode; ownership information is stored by
[topic]
id=editor_tool_unit
title= _ "Unit Tool"
text= "<img src=icons/action/editor-tool-unit_60.png align=left />" + _ "Place units belonging to the currently-selected side.
text= "<img src=icons/action/editor-tool-unit_60.png align=left box=yes />" + _ "Place units belonging to the currently-selected side.
• Left-click will place a unit.
• Left drag-and-drop will move an already-placed unit.
• Various operations are added to the right-click menu when the hex contains a unit.
@ -306,7 +306,7 @@ This tool is only available in Scenario Mode; it adds WML <italic>[time_area]</i
[topic]
id=editor_playlist
title= _ "Playlist Manager"
text= "<img src=icons/action/playlist_30.png align=left />" + _ "Shows a list of music tracks known to the editor, with toggle-boxes to enable them.
text= "<img src=icons/action/playlist_30.png align=left box=yes />" + _ "Shows a list of music tracks known to the editor, with toggle-boxes to enable them.
This tool is only available in Scenario Mode; it adds WML <italic>[music]</italic> tags to the scenario."
[/topic]
# wmllint: unbalanced-off
@ -358,7 +358,7 @@ The map wont look exactly the same in the game as it does in the editor, beca
• Event handlers and scripting
The editor is not a tool to help you with scripting the scenarios event handlers.
The editor is not a tool to help you scripting the scenarios event handlers.
• Infinite Backwards Compatibility
@ -403,7 +403,7 @@ To load a map that was created in the scenario editor, use “Load Map” from t
The map editor saves one file when in terrain mode (a .map) or two files when in scenario mode (both a .map and a .cfg).
Loading a .cfg file has different results depending on the contents of the .cfg file. For .cfg files that were created by the scenario editor, it will open the .cfg in the scenario editor. However, for .cfg files that cannot be opened by the scenario editor, the editor will attempt to find the scenarios map data and open the corresponding .map file in terrain-only mode, as if the .map file was chosen in the file selector. It is recommended in those cases to simply load the .map file directly instead."
Loading a .cfg file has different results depending on the contents of the .cfg file. For .cfg files that were created by the scenario editor, it will open the .cfg in the scenario editor. However, for .cfg files that cannot be opened by the scenario editor, the editor will attempt to find the scenario's map data and open the corresponding .map file in terrain-only mode, as if the .map file was chosen in the file selector. It is recommended in those cases to simply load the .map file directly instead."
[/topic]
# wmllint: markcheck on
@ -411,7 +411,7 @@ Loading a .cfg file has different results depending on the contents of the .cfg
# wmllint: unbalanced-on
[topic]
id=editor_separate_events_file
title= _ "Separate Event Files"
title= _ "Using a separate file for WML events"
text= _ "When loading a .cfg file, the scenario editor understands files created by the scenario editor, but is likely to have difficulty with files that have been edited by hand.
One option is to create a separate WML file, also with the .cfg extension, which uses the WML preprocessor to include the editor-created file. This separate file contains both the <span face='monospace'>[scenario]</span> tag and any hand-edited WML such as events. With this workflow, the add-ons file structure could look like this:
@ -424,7 +424,7 @@ If your add-on will only be used on 1.18 and later, it is instead recommended to
• <span face='monospace'>maps/first.map</span>
◦ this is the .map file created by the scenario editor when saving in scenario mode
• <span face='monospace'>scenarios/other.cfg</span>
◦ this is the .cfg file containing everything that the scenario editor doesnt understand
◦ this is the .cfg file containing everything that the scenario editor doesn't understand
• <span face='monospace'>scenarios/first.cfg</span>
◦ inside the <span face='monospace'>[scenario]</span> element, use <span face='monospace'>map_file=&quot;first.map&quot;</span> to load the map file
◦ inside the <span face='monospace'>[scenario]</span> element, use <span face='monospace'>include_file=&quot;other.cfg&quot;</span> to load the additional cfg file"
@ -436,7 +436,7 @@ If your add-on will only be used on 1.18 and later, it is instead recommended to
[topic]
id=editor_masks
title= _ "Editor Mask Usage"
text= _ "Masks can be applied to a base map for reuse in several scenarios playing at the same locations."
text= _ "Masks can be applied to a base map for reusal in several scenarios playing at the same locations."
[/topic]
# wmllint: markcheck on
@ -445,7 +445,7 @@ If your add-on will only be used on 1.18 and later, it is instead recommended to
id=editor_time_schedule
# po: Time of Day and Schedule Editor, please use a short string as it will be used in the left-hand pane of the help browser
title= _ "ToD and Schedule Editor"
text= "<img src='icons/action/editor-switch-time_30.png' align=left />" + _ "This button at the top-right of the screen accesses the time-of-day preview and the schedule editor.
text= "<img src='icons/action/editor-switch-time_30.png' align=left box=yes />" + _ "This button at the top-right of the screen accesses the time-of-day preview and the schedule editor.
In terrain mode, this displays the map as it will be recolored at different times of day.
In scenario mode, the button accesses an editor for individual schedules for <ref dst='editor_named_area'>time areas</ref>."
@ -462,11 +462,9 @@ In scenario mode, the button accesses an editor for individual schedules for <re
<bold>Filter</bold>
There is a filter function to show only a subset of the available items — this is the leftmost of the four buttons at the top of the palette, and the graphic changes depending on what is selected. Examples:" +
"<table>" +
"<row><col><img src=icons/terrain/terrain_group_all_30.png align=left /></col><col>" + _ "Show all kinds of terrain" + "</col></row>" +
"<row><col><img src=icons/terrain/terrain_group_water_deep_30.png align=left /></col><col>" + _ "Show only water terrains" + "</col></row>" +
"<row><col><img src=icons/terrain/terrain_group_village_30.png align=left /></col><col>" + _ "Show only villages" + "</col></row>" +
"</table>"
"<table/><img src=icons/terrain/terrain_group_all_30.png align=left box=yes /></col><col>" + _ "Show all kinds of terrain</col></row>" +
"<img src=icons/terrain/terrain_group_water_deep_30.png align=left box=yes /></col><col>" + _ "Show only water terrains</col></row>" +
"<img src=icons/terrain/terrain_group_village_30.png align=left box=yes /></col><col>" + _ "Show only villages</col></row><endtable/>"
[/topic]
# wmllint: markcheck on
@ -483,7 +481,7 @@ There is a filter function to show only a subset of the available items — this
" + _ "<header>Native</header>
A map file consists of rows with comma-separated terrain code strings. The only non-terrain information provided by the map syntax is the set of locations created by the <ref dst='editor_tool_starting'>Starting Locations Tool</ref>. The files can be edited with a general purpose text editor.
A map file consists of rows with comma separated terrain code strings. The only non-terrain information provided by the map syntax is the set of locations created by the <ref dst='editor_tool_starting'>Starting Locations Tool</ref>. The files can be edited with a general purpose text editor like notepad.
These files can be used directly for multiplayer games, the number of players is automatically determined by the number of starting positions. When saved in the default directory, the map can be found in the “Custom Maps” game type of the multiplayer “Create Game” dialog; you may need to refresh the cache (press F5 on the title screen) before a newly-created map appears.
@ -496,7 +494,7 @@ The <italic>map_file</italic> method is preferred over using a preprocessor incl
" + _ "<header>Embedded</header>
The map data can be stored as part of a scenarios .cfg file, directly in the <italic>map_data</italic> attribute. In other words, in the place that the preprocessor would include it when using the preprocessor-include method.
The map data can stored as part of a scenarios .cfg file, directly in the <italic>map_data</italic> attribute. In other words, in the place that the preprocessor would include it when using the preprocessor-include method.
<header>Using Embedded Format in Terrain Mode</header>

View file

@ -93,7 +93,7 @@
[topic]
id=..introduction
title= _ "Introduction"
text="<img src=misc/logo-bg.png~BLIT(misc/logo.png) align=middle /><br/>" + _ "<italic>Battle for Wesnoth</italic> is a turn-based fantasy strategy game somewhat unusual among modern strategy games. While other games strive for complexity, <italic>Battle for Wesnoth</italic> strives for simplicity of both rules and gameplay. This does not make the game simple, however — from these simple rules arises a wealth of strategy, making the game easy to learn but a challenge to master.
text="<img>src=misc/logo-bg.png~BLIT(misc/logo.png) align=middle</img>" + _ "<br/><italic>text='Battle for Wesnoth'</italic> is a turn-based fantasy strategy game somewhat unusual among modern strategy games. While other games strive for complexity, <italic>text='Battle for Wesnoth'</italic> strives for simplicity of both rules and gameplay. This does not make the game simple, however — from these simple rules arises a wealth of strategy, making the game easy to learn but a challenge to master.
The following pages outline all you need to know to play Wesnoth. As you play, new information is added to the various categories as you come across new aspects of the game. For more detailed information on special situations and exceptions, follow the included links."
[/topic]
@ -153,7 +153,8 @@ The <italic>text='Battle for Wesnoth'</italic> project was begun in 2003, and ha
[topic]
id=.unknown_unit
title= _ "Unknown Unit"
text="<img src='units/unknown-unit.png~RC(magenta>red)' align=left float=yes />" + _ "
text="<img>src=units/unknown-unit.png~RC(magenta>red) align=left float=yes</img>" + _ "
This unit is unknown for the moment. You must discover it in the game to be allowed to see its description."
[/topic]
# wmllint: markcheck on
@ -575,7 +576,7 @@ Mixed terrain types share the properties of multiple basic terrain types — uni
" + "<img src='terrain/hills/regular.png~BLIT(terrain/forest/pine-tile.png)'/>" + "<img src='terrain/hills/desert.png'/>" + "<img src='terrain/cave/hills-variation.png'/><br/>" + _ "One notable exception is bridge terrains, such as <italic>bridges over shallow water</italic>, <italic>fords</italic>, and <italic>bridges over chasms</italic>. Fords are easily passable to both merfolk and humans — all units moving on a ford enjoy the best defense and best movement out of flat and shallow water, rather than the worse movement of the two. Similarly, bridges over chasms are passable to nonfliers (unsurprisingly).
" + "<img src='terrain/water/coast-tile.png~BLIT(terrain/bridge/wood-se-nw.png)'/>" + "<img src='terrain/water/ford-tile.png'/>" + "<img src='terrain/chasm/regular-tile.png~BLIT(terrain/cave/chasm-stone-bridge-sw-ne-tile.png)'/><br/>" + _ "Land-based villages generally give the best defense and movement as well. These villages are mixed terrains, based on the village terrain type, together with hill, swamp, and cave, respectively.
" + "<img src='terrain/water/coast-tile.png~BLIT(terrain/bridge/wood-se-nw.png)'/>" + "<img src='terrain/water/ford-tile.png'/>" + "<img src='terrain/chasm/regular-tile.png~BLIT(terrain/cave/chasm-stone-bridge-sw-ne-tile.png)'/>" + _ "<br/>Land-based villages generally give the best defense and movement as well. These villages are mixed terrains, based on the village terrain type, together with hill, swamp, and cave, respectively.
" + "<img src='terrain/hills/regular.png~BLIT(terrain/village/human-hills-tile.png)'/>" + "<img src='terrain/swamp/water-tile.png~BLIT(terrain/village/swampwater-tile.png)'/>" + "<img src='terrain/cave/floor6.png~BLIT(terrain/village/cave-tile.png)'/><br/>" + _ "Finally, water villages are generally inhospitable to land units, and do not give defense or movement benefits associated with the village terrain type. Instead, they count only as water tiles.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 MiB

After

Width:  |  Height:  |  Size: 14 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

Some files were not shown because too many files have changed in this diff Show more