Merge lp:~widelands-dev/widelands/spritesheet_generation into lp:widelands

Proposed by GunChleoc
Status: Work in progress
Proposed branch: lp:~widelands-dev/widelands/spritesheet_generation
Merge into: lp:widelands
Diff against target: 4552 lines (+2060/-499)
51 files modified
.bzrignore (+1/-0)
compile.sh (+1/-0)
data/tribes/barbarians.lua (+16/-5)
data/tribes/buildings/productionsites/barbarians/wood_hardener/init.lua (+26/-11)
data/tribes/workers/barbarians/carrier/init.lua (+32/-7)
doc/sphinx/source/animations.rst (+75/-0)
src/graphic/CMakeLists.txt (+2/-8)
src/graphic/animation/CMakeLists.txt (+28/-0)
src/graphic/animation/animation.cc (+195/-0)
src/graphic/animation/animation.h (+129/-76)
src/graphic/animation/animation_manager.cc (+74/-0)
src/graphic/animation/animation_manager.h (+73/-0)
src/graphic/animation/diranimations.cc (+30/-0)
src/graphic/animation/diranimations.h (+3/-3)
src/graphic/animation/nonpacked_animation.cc (+50/-336)
src/graphic/animation/nonpacked_animation.h (+84/-0)
src/graphic/animation/spritesheet_animation.cc (+222/-0)
src/graphic/animation/spritesheet_animation.h (+96/-0)
src/graphic/graphic.cc (+1/-1)
src/graphic/rendertarget.cc (+2/-1)
src/graphic/text/CMakeLists.txt (+1/-0)
src/graphic/text/rt_render.cc (+2/-1)
src/logic/map_objects/CMakeLists.txt (+1/-0)
src/logic/map_objects/bob.h (+1/-2)
src/logic/map_objects/immovable.cc (+1/-0)
src/logic/map_objects/immovable.h (+0/-1)
src/logic/map_objects/map_object.cc (+14/-6)
src/logic/map_objects/map_object.h (+3/-2)
src/logic/map_objects/tribes/constructionsite.cc (+6/-5)
src/logic/map_objects/tribes/dismantlesite.cc (+0/-1)
src/logic/map_objects/tribes/ship.h (+1/-1)
src/logic/map_objects/tribes/soldier.cc (+1/-0)
src/logic/map_objects/tribes/tribe_descr.cc (+32/-23)
src/logic/map_objects/tribes/tribe_descr.h (+7/-1)
src/logic/map_objects/tribes/tribes.cc (+10/-0)
src/logic/map_objects/tribes/tribes.h (+3/-0)
src/logic/map_objects/tribes/ware_descr.cc (+0/-1)
src/logic/map_objects/tribes/worker_descr.cc (+0/-2)
src/logic/map_objects/tribes/worker_descr.h (+1/-1)
src/logic/map_objects/world/critter.h (+1/-1)
src/logic/map_objects/world/terrain_description.cc (+2/-2)
src/scripting/lua_root.cc (+36/-0)
src/scripting/lua_root.h (+1/-0)
src/website/CMakeLists.txt (+19/-0)
src/website/create_spritesheet.cc (+361/-0)
src/website/lua/CMakeLists.txt (+10/-0)
src/website/lua/lua_tree.cc (+165/-0)
src/website/lua/lua_tree.h (+98/-0)
src/website/lua/value.cc (+62/-0)
src/website/lua/value.h (+76/-0)
test/maps/plain.wmf/scripting/test_ui.lua (+5/-1)
To merge this branch: bzr merge lp:~widelands-dev/widelands/spritesheet_generation
Reviewer Review Type Date Requested Status
Widelands Developers Pending
Review via email: mp+370824@code.launchpad.net

Commit message

Add support for spritesheets
- Add support for spritesheets and refactor animation classes
- New utility wl_create_spritesheet to create spritesheets for animations
- Animations are also cropped to save more space
- Spritesheet animations are kept in separate Lua tables for performance reasons
- New Lua function add_custom_worker to support writing tests
- Convert Barbarian Carrier and Wood Hardener as examples

Description of the change

Spritesheets :)

Note that the idle carrier gets a black background when zoomed out - this is a proof-of-concept that the correct mipmap files are being generated and used. The files at 0.5 scale can be deleted before merging.

Once this is in, we should look at exporting all 4 scales directly from Blender for maximum quality.

To post a comment you must log in.
8706. By GunChleoc

Fix codecheck.

8707. By GunChleoc

Fix memory leak.

8708. By GunChleoc

Fix compiler warning.

Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 5366. State: canceled. Details: https://travis-ci.org/widelands/widelands/builds/579080616.
Appveyor build 5136. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_spritesheet_generation-5136.

8709. By GunChleoc

Shut up a warning.

8710. By GunChleoc

Remove animation tests, because the scripting packet can't handle them yet.

Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 5372. State: failed. Details: https://travis-ci.org/widelands/widelands/builds/579190053.
Appveyor build 5142. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_spritesheet_generation-5142.

8711. By GunChleoc

Fix variable name shadowing and give UI test more time to close the map view.

Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 5379. State: passed. Details: https://travis-ci.org/widelands/widelands/builds/579383950.
Appveyor build 5149. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_spritesheet_generation-5149.

8712. By GunChleoc

Merged trunk.

8713. By GunChleoc

Merged trunk.

8714. By GunChleoc

Merged trunk.

Unmerged revisions

8714. By GunChleoc

Merged trunk.

8713. By GunChleoc

Merged trunk.

8712. By GunChleoc

Merged trunk.

8711. By GunChleoc

Fix variable name shadowing and give UI test more time to close the map view.

8710. By GunChleoc

Remove animation tests, because the scripting packet can't handle them yet.

8709. By GunChleoc

Shut up a warning.

8708. By GunChleoc

Fix compiler warning.

8707. By GunChleoc

Fix memory leak.

8706. By GunChleoc

Fix codecheck.

8705. By GunChleoc

Test optional parameters.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.bzrignore'
2--- .bzrignore 2017-04-20 11:02:01 +0000
3+++ .bzrignore 2019-09-08 20:16:16 +0000
4@@ -11,6 +11,7 @@
5 update.sh
6 widelands
7 wl_map*_info
8+wl_create_spritesheet
9 locale
10 VERSION
11
12
13=== modified file 'compile.sh'
14--- compile.sh 2019-07-20 13:07:07 +0000
15+++ compile.sh 2019-09-08 20:16:16 +0000
16@@ -301,6 +301,7 @@
17 mv src/widelands ../widelands
18
19 if [ $BUILD_WEBSITE = "ON" ]; then
20+ mv ../build/src/website/wl_create_spritesheet ../wl_create_spritesheet
21 mv ../build/src/website/wl_map_object_info ../wl_map_object_info
22 mv ../build/src/website/wl_map_info ../wl_map_info
23 fi
24
25=== modified file 'data/tribes/barbarians.lua'
26--- data/tribes/barbarians.lua 2019-05-26 01:46:18 +0000
27+++ data/tribes/barbarians.lua 2019-09-08 20:16:16 +0000
28@@ -1,12 +1,23 @@
29 image_dirname = path.dirname(__file__) .. "images/barbarians/"
30
31-animations = {}
32-add_animation(animations, "frontier", image_dirname, "frontier", {1, 19})
33-add_animation(animations, "flag", image_dirname, "flag", {10, 38}, 5)
34-
35 tribes:new_tribe {
36 name = "barbarians",
37- animations = animations,
38+ animations = {
39+ flag = {
40+ directory = image_dirname,
41+ basename = "flag",
42+ fps = 5,
43+ frames = 16,
44+ columns = 4,
45+ rows = 4,
46+ hotspot = { 11, 39 }
47+ },
48+ frontier = {
49+ directory = image_dirname,
50+ basename = "frontier",
51+ hotspot = { 1, 19 }
52+ },
53+ },
54
55 -- Image file paths for this tribe's road textures
56 roads = {
57
58=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/build_00.png'
59Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/build_00.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/build_00.png 1970-01-01 00:00:00 +0000 differ
60=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/build_00_pc.png'
61Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/build_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/build_00_pc.png 1970-01-01 00:00:00 +0000 differ
62=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/build_01.png'
63Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/build_01.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/build_01.png 1970-01-01 00:00:00 +0000 differ
64=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/build_01_pc.png'
65Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/build_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/build_01_pc.png 1970-01-01 00:00:00 +0000 differ
66=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/build_02.png'
67Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/build_02.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/build_02.png 1970-01-01 00:00:00 +0000 differ
68=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/build_02_pc.png'
69Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/build_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/build_02_pc.png 1970-01-01 00:00:00 +0000 differ
70=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/build_03.png'
71Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/build_03.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/build_03.png 1970-01-01 00:00:00 +0000 differ
72=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/build_03_pc.png'
73Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/build_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/build_03_pc.png 1970-01-01 00:00:00 +0000 differ
74=== added file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/build_1.png'
75Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/build_1.png 1970-01-01 00:00:00 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/build_1.png 2019-09-08 20:16:16 +0000 differ
76=== added file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/build_1_pc.png'
77Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/build_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/build_1_pc.png 2019-09-08 20:16:16 +0000 differ
78=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_00.png'
79Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_00.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_00.png 1970-01-01 00:00:00 +0000 differ
80=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_00_pc.png'
81Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_00_pc.png 1970-01-01 00:00:00 +0000 differ
82=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_01.png'
83Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_01.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_01.png 1970-01-01 00:00:00 +0000 differ
84=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_01_pc.png'
85Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_01_pc.png 1970-01-01 00:00:00 +0000 differ
86=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_02.png'
87Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_02.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_02.png 1970-01-01 00:00:00 +0000 differ
88=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_02_pc.png'
89Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_02_pc.png 1970-01-01 00:00:00 +0000 differ
90=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_03.png'
91Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_03.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_03.png 1970-01-01 00:00:00 +0000 differ
92=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_03_pc.png'
93Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_03_pc.png 1970-01-01 00:00:00 +0000 differ
94=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_04.png'
95Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_04.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_04.png 1970-01-01 00:00:00 +0000 differ
96=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_04_pc.png'
97Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_04_pc.png 1970-01-01 00:00:00 +0000 differ
98=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_05.png'
99Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_05.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_05.png 1970-01-01 00:00:00 +0000 differ
100=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_05_pc.png'
101Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_05_pc.png 1970-01-01 00:00:00 +0000 differ
102=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_06.png'
103Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_06.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_06.png 1970-01-01 00:00:00 +0000 differ
104=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_06_pc.png'
105Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_06_pc.png 1970-01-01 00:00:00 +0000 differ
106=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_07.png'
107Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_07.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_07.png 1970-01-01 00:00:00 +0000 differ
108=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_07_pc.png'
109Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_07_pc.png 1970-01-01 00:00:00 +0000 differ
110=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_08.png'
111Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_08.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_08.png 1970-01-01 00:00:00 +0000 differ
112=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_08_pc.png'
113Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_08_pc.png 1970-01-01 00:00:00 +0000 differ
114=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_09.png'
115Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_09.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_09.png 1970-01-01 00:00:00 +0000 differ
116=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_09_pc.png'
117Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_09_pc.png 1970-01-01 00:00:00 +0000 differ
118=== added file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_1.png'
119Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_1.png 1970-01-01 00:00:00 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_1.png 2019-09-08 20:16:16 +0000 differ
120=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_10.png'
121Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_10.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_10.png 1970-01-01 00:00:00 +0000 differ
122=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_10_pc.png'
123Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_10_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_10_pc.png 1970-01-01 00:00:00 +0000 differ
124=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_11.png'
125Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_11.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_11.png 1970-01-01 00:00:00 +0000 differ
126=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_11_pc.png'
127Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_11_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_11_pc.png 1970-01-01 00:00:00 +0000 differ
128=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_12.png'
129Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_12.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_12.png 1970-01-01 00:00:00 +0000 differ
130=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_12_pc.png'
131Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_12_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_12_pc.png 1970-01-01 00:00:00 +0000 differ
132=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_13.png'
133Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_13.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_13.png 1970-01-01 00:00:00 +0000 differ
134=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_13_pc.png'
135Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_13_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_13_pc.png 1970-01-01 00:00:00 +0000 differ
136=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_14.png'
137Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_14.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_14.png 1970-01-01 00:00:00 +0000 differ
138=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_14_pc.png'
139Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_14_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_14_pc.png 1970-01-01 00:00:00 +0000 differ
140=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_15.png'
141Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_15.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_15.png 1970-01-01 00:00:00 +0000 differ
142=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_15_pc.png'
143Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_15_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_15_pc.png 1970-01-01 00:00:00 +0000 differ
144=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_16.png'
145Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_16.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_16.png 1970-01-01 00:00:00 +0000 differ
146=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_16_pc.png'
147Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_16_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_16_pc.png 1970-01-01 00:00:00 +0000 differ
148=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_17.png'
149Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_17.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_17.png 1970-01-01 00:00:00 +0000 differ
150=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_17_pc.png'
151Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_17_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_17_pc.png 1970-01-01 00:00:00 +0000 differ
152=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_18.png'
153Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_18.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_18.png 1970-01-01 00:00:00 +0000 differ
154=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_18_pc.png'
155Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_18_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_18_pc.png 1970-01-01 00:00:00 +0000 differ
156=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_19.png'
157Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_19.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_19.png 1970-01-01 00:00:00 +0000 differ
158=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_19_pc.png'
159Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_19_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_19_pc.png 1970-01-01 00:00:00 +0000 differ
160=== added file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_1_pc.png'
161Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/idle_1_pc.png 2019-09-08 20:16:16 +0000 differ
162=== modified file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/init.lua'
163--- data/tribes/buildings/productionsites/barbarians/wood_hardener/init.lua 2019-05-29 18:29:28 +0000
164+++ data/tribes/buildings/productionsites/barbarians/wood_hardener/init.lua 2019-09-08 20:16:16 +0000
165@@ -19,22 +19,37 @@
166 },
167
168 animations = {
169+ unoccupied = {
170+ directory = dirname,
171+ basename = "unoccupied",
172+ hotspot = { 52, 64 },
173+ }
174+ },
175+ spritesheets = {
176 idle = {
177- pictures = path.list_files(dirname .. "idle_??.png"),
178- hotspot = { 52, 64 },
179+ directory = dirname,
180+ basename = "idle",
181+ frames = 20,
182+ columns = 4,
183+ rows = 5,
184+ hotspot = { 50, 65 }
185 },
186 build = {
187- pictures = path.list_files(dirname .. "build_??.png"),
188- hotspot = { 52, 64 },
189+ directory = dirname,
190+ basename = "build",
191+ frames = 4,
192+ columns = 2,
193+ rows = 2,
194+ hotspot = { 50, 61 }
195 },
196 working = {
197- pictures = path.list_files(dirname .. "working_??.png"),
198- hotspot = { 52, 64 },
199- },
200- unoccupied = {
201- pictures = path.list_files(dirname .. "unoccupied_??.png"),
202- hotspot = { 52, 64 },
203- },
204+ directory = dirname,
205+ basename = "working",
206+ frames = 20,
207+ columns = 4,
208+ rows = 5,
209+ hotspot = { 53, 65 }
210+ }
211 },
212
213 aihints = {
214
215=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_00.png'
216Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_00.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_00.png 1970-01-01 00:00:00 +0000 differ
217=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_00_pc.png'
218Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_00_pc.png 1970-01-01 00:00:00 +0000 differ
219=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_01.png'
220Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_01.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_01.png 1970-01-01 00:00:00 +0000 differ
221=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_01_pc.png'
222Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_01_pc.png 1970-01-01 00:00:00 +0000 differ
223=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_02.png'
224Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_02.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_02.png 1970-01-01 00:00:00 +0000 differ
225=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_02_pc.png'
226Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_02_pc.png 1970-01-01 00:00:00 +0000 differ
227=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_03.png'
228Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_03.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_03.png 1970-01-01 00:00:00 +0000 differ
229=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_03_pc.png'
230Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_03_pc.png 1970-01-01 00:00:00 +0000 differ
231=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_04.png'
232Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_04.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_04.png 1970-01-01 00:00:00 +0000 differ
233=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_04_pc.png'
234Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_04_pc.png 1970-01-01 00:00:00 +0000 differ
235=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_05.png'
236Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_05.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_05.png 1970-01-01 00:00:00 +0000 differ
237=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_05_pc.png'
238Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_05_pc.png 1970-01-01 00:00:00 +0000 differ
239=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_06.png'
240Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_06.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_06.png 1970-01-01 00:00:00 +0000 differ
241=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_06_pc.png'
242Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_06_pc.png 1970-01-01 00:00:00 +0000 differ
243=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_07.png'
244Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_07.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_07.png 1970-01-01 00:00:00 +0000 differ
245=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_07_pc.png'
246Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_07_pc.png 1970-01-01 00:00:00 +0000 differ
247=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_08.png'
248Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_08.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_08.png 1970-01-01 00:00:00 +0000 differ
249=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_08_pc.png'
250Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_08_pc.png 1970-01-01 00:00:00 +0000 differ
251=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_09.png'
252Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_09.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_09.png 1970-01-01 00:00:00 +0000 differ
253=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_09_pc.png'
254Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_09_pc.png 1970-01-01 00:00:00 +0000 differ
255=== added file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_1.png'
256Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_1.png 1970-01-01 00:00:00 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_1.png 2019-09-08 20:16:16 +0000 differ
257=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_10.png'
258Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_10.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_10.png 1970-01-01 00:00:00 +0000 differ
259=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_10_pc.png'
260Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_10_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_10_pc.png 1970-01-01 00:00:00 +0000 differ
261=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_11.png'
262Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_11.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_11.png 1970-01-01 00:00:00 +0000 differ
263=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_11_pc.png'
264Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_11_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_11_pc.png 1970-01-01 00:00:00 +0000 differ
265=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_12.png'
266Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_12.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_12.png 1970-01-01 00:00:00 +0000 differ
267=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_12_pc.png'
268Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_12_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_12_pc.png 1970-01-01 00:00:00 +0000 differ
269=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_13.png'
270Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_13.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_13.png 1970-01-01 00:00:00 +0000 differ
271=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_13_pc.png'
272Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_13_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_13_pc.png 1970-01-01 00:00:00 +0000 differ
273=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_14.png'
274Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_14.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_14.png 1970-01-01 00:00:00 +0000 differ
275=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_14_pc.png'
276Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_14_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_14_pc.png 1970-01-01 00:00:00 +0000 differ
277=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_15.png'
278Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_15.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_15.png 1970-01-01 00:00:00 +0000 differ
279=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_15_pc.png'
280Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_15_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_15_pc.png 1970-01-01 00:00:00 +0000 differ
281=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_16.png'
282Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_16.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_16.png 1970-01-01 00:00:00 +0000 differ
283=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_16_pc.png'
284Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_16_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_16_pc.png 1970-01-01 00:00:00 +0000 differ
285=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_17.png'
286Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_17.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_17.png 1970-01-01 00:00:00 +0000 differ
287=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_17_pc.png'
288Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_17_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_17_pc.png 1970-01-01 00:00:00 +0000 differ
289=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_18.png'
290Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_18.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_18.png 1970-01-01 00:00:00 +0000 differ
291=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_18_pc.png'
292Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_18_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_18_pc.png 1970-01-01 00:00:00 +0000 differ
293=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_19.png'
294Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_19.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_19.png 1970-01-01 00:00:00 +0000 differ
295=== removed file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_19_pc.png'
296Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_19_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_19_pc.png 1970-01-01 00:00:00 +0000 differ
297=== added file 'data/tribes/buildings/productionsites/barbarians/wood_hardener/working_1_pc.png'
298Binary files data/tribes/buildings/productionsites/barbarians/wood_hardener/working_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/buildings/productionsites/barbarians/wood_hardener/working_1_pc.png 2019-09-08 20:16:16 +0000 differ
299=== removed file 'data/tribes/images/barbarians/flag_00.png'
300Binary files data/tribes/images/barbarians/flag_00.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_00.png 1970-01-01 00:00:00 +0000 differ
301=== removed file 'data/tribes/images/barbarians/flag_00_pc.png'
302Binary files data/tribes/images/barbarians/flag_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_00_pc.png 1970-01-01 00:00:00 +0000 differ
303=== removed file 'data/tribes/images/barbarians/flag_01.png'
304Binary files data/tribes/images/barbarians/flag_01.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_01.png 1970-01-01 00:00:00 +0000 differ
305=== removed file 'data/tribes/images/barbarians/flag_01_pc.png'
306Binary files data/tribes/images/barbarians/flag_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_01_pc.png 1970-01-01 00:00:00 +0000 differ
307=== removed file 'data/tribes/images/barbarians/flag_02.png'
308Binary files data/tribes/images/barbarians/flag_02.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_02.png 1970-01-01 00:00:00 +0000 differ
309=== removed file 'data/tribes/images/barbarians/flag_02_pc.png'
310Binary files data/tribes/images/barbarians/flag_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_02_pc.png 1970-01-01 00:00:00 +0000 differ
311=== removed file 'data/tribes/images/barbarians/flag_03.png'
312Binary files data/tribes/images/barbarians/flag_03.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_03.png 1970-01-01 00:00:00 +0000 differ
313=== removed file 'data/tribes/images/barbarians/flag_03_pc.png'
314Binary files data/tribes/images/barbarians/flag_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_03_pc.png 1970-01-01 00:00:00 +0000 differ
315=== removed file 'data/tribes/images/barbarians/flag_04.png'
316Binary files data/tribes/images/barbarians/flag_04.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_04.png 1970-01-01 00:00:00 +0000 differ
317=== removed file 'data/tribes/images/barbarians/flag_04_pc.png'
318Binary files data/tribes/images/barbarians/flag_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_04_pc.png 1970-01-01 00:00:00 +0000 differ
319=== removed file 'data/tribes/images/barbarians/flag_05.png'
320Binary files data/tribes/images/barbarians/flag_05.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_05.png 1970-01-01 00:00:00 +0000 differ
321=== removed file 'data/tribes/images/barbarians/flag_05_pc.png'
322Binary files data/tribes/images/barbarians/flag_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_05_pc.png 1970-01-01 00:00:00 +0000 differ
323=== removed file 'data/tribes/images/barbarians/flag_06.png'
324Binary files data/tribes/images/barbarians/flag_06.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_06.png 1970-01-01 00:00:00 +0000 differ
325=== removed file 'data/tribes/images/barbarians/flag_06_pc.png'
326Binary files data/tribes/images/barbarians/flag_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_06_pc.png 1970-01-01 00:00:00 +0000 differ
327=== removed file 'data/tribes/images/barbarians/flag_07.png'
328Binary files data/tribes/images/barbarians/flag_07.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_07.png 1970-01-01 00:00:00 +0000 differ
329=== removed file 'data/tribes/images/barbarians/flag_07_pc.png'
330Binary files data/tribes/images/barbarians/flag_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_07_pc.png 1970-01-01 00:00:00 +0000 differ
331=== removed file 'data/tribes/images/barbarians/flag_08.png'
332Binary files data/tribes/images/barbarians/flag_08.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_08.png 1970-01-01 00:00:00 +0000 differ
333=== removed file 'data/tribes/images/barbarians/flag_08_pc.png'
334Binary files data/tribes/images/barbarians/flag_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_08_pc.png 1970-01-01 00:00:00 +0000 differ
335=== removed file 'data/tribes/images/barbarians/flag_09.png'
336Binary files data/tribes/images/barbarians/flag_09.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_09.png 1970-01-01 00:00:00 +0000 differ
337=== removed file 'data/tribes/images/barbarians/flag_09_pc.png'
338Binary files data/tribes/images/barbarians/flag_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_09_pc.png 1970-01-01 00:00:00 +0000 differ
339=== added file 'data/tribes/images/barbarians/flag_1.png'
340Binary files data/tribes/images/barbarians/flag_1.png 1970-01-01 00:00:00 +0000 and data/tribes/images/barbarians/flag_1.png 2019-09-08 20:16:16 +0000 differ
341=== removed file 'data/tribes/images/barbarians/flag_10.png'
342Binary files data/tribes/images/barbarians/flag_10.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_10.png 1970-01-01 00:00:00 +0000 differ
343=== removed file 'data/tribes/images/barbarians/flag_10_pc.png'
344Binary files data/tribes/images/barbarians/flag_10_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_10_pc.png 1970-01-01 00:00:00 +0000 differ
345=== removed file 'data/tribes/images/barbarians/flag_11.png'
346Binary files data/tribes/images/barbarians/flag_11.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_11.png 1970-01-01 00:00:00 +0000 differ
347=== removed file 'data/tribes/images/barbarians/flag_11_pc.png'
348Binary files data/tribes/images/barbarians/flag_11_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_11_pc.png 1970-01-01 00:00:00 +0000 differ
349=== removed file 'data/tribes/images/barbarians/flag_12.png'
350Binary files data/tribes/images/barbarians/flag_12.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_12.png 1970-01-01 00:00:00 +0000 differ
351=== removed file 'data/tribes/images/barbarians/flag_12_pc.png'
352Binary files data/tribes/images/barbarians/flag_12_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_12_pc.png 1970-01-01 00:00:00 +0000 differ
353=== removed file 'data/tribes/images/barbarians/flag_13.png'
354Binary files data/tribes/images/barbarians/flag_13.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_13.png 1970-01-01 00:00:00 +0000 differ
355=== removed file 'data/tribes/images/barbarians/flag_13_pc.png'
356Binary files data/tribes/images/barbarians/flag_13_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_13_pc.png 1970-01-01 00:00:00 +0000 differ
357=== removed file 'data/tribes/images/barbarians/flag_14.png'
358Binary files data/tribes/images/barbarians/flag_14.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_14.png 1970-01-01 00:00:00 +0000 differ
359=== removed file 'data/tribes/images/barbarians/flag_14_pc.png'
360Binary files data/tribes/images/barbarians/flag_14_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_14_pc.png 1970-01-01 00:00:00 +0000 differ
361=== removed file 'data/tribes/images/barbarians/flag_15.png'
362Binary files data/tribes/images/barbarians/flag_15.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_15.png 1970-01-01 00:00:00 +0000 differ
363=== removed file 'data/tribes/images/barbarians/flag_15_pc.png'
364Binary files data/tribes/images/barbarians/flag_15_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/images/barbarians/flag_15_pc.png 1970-01-01 00:00:00 +0000 differ
365=== added file 'data/tribes/images/barbarians/flag_1_pc.png'
366Binary files data/tribes/images/barbarians/flag_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/images/barbarians/flag_1_pc.png 2019-09-08 20:16:16 +0000 differ
367=== added file 'data/tribes/workers/barbarians/carrier/idle_0.5.png'
368Binary files data/tribes/workers/barbarians/carrier/idle_0.5.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/idle_0.5.png 2019-09-08 20:16:16 +0000 differ
369=== added file 'data/tribes/workers/barbarians/carrier/idle_0.5_pc.png'
370Binary files data/tribes/workers/barbarians/carrier/idle_0.5_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/idle_0.5_pc.png 2019-09-08 20:16:16 +0000 differ
371=== removed file 'data/tribes/workers/barbarians/carrier/idle_00.png'
372Binary files data/tribes/workers/barbarians/carrier/idle_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_00.png 1970-01-01 00:00:00 +0000 differ
373=== removed file 'data/tribes/workers/barbarians/carrier/idle_00_pc.png'
374Binary files data/tribes/workers/barbarians/carrier/idle_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_00_pc.png 1970-01-01 00:00:00 +0000 differ
375=== removed file 'data/tribes/workers/barbarians/carrier/idle_01.png'
376Binary files data/tribes/workers/barbarians/carrier/idle_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_01.png 1970-01-01 00:00:00 +0000 differ
377=== removed file 'data/tribes/workers/barbarians/carrier/idle_01_pc.png'
378Binary files data/tribes/workers/barbarians/carrier/idle_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_01_pc.png 1970-01-01 00:00:00 +0000 differ
379=== removed file 'data/tribes/workers/barbarians/carrier/idle_02.png'
380Binary files data/tribes/workers/barbarians/carrier/idle_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_02.png 1970-01-01 00:00:00 +0000 differ
381=== removed file 'data/tribes/workers/barbarians/carrier/idle_02_pc.png'
382Binary files data/tribes/workers/barbarians/carrier/idle_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_02_pc.png 1970-01-01 00:00:00 +0000 differ
383=== removed file 'data/tribes/workers/barbarians/carrier/idle_03.png'
384Binary files data/tribes/workers/barbarians/carrier/idle_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_03.png 1970-01-01 00:00:00 +0000 differ
385=== removed file 'data/tribes/workers/barbarians/carrier/idle_03_pc.png'
386Binary files data/tribes/workers/barbarians/carrier/idle_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_03_pc.png 1970-01-01 00:00:00 +0000 differ
387=== removed file 'data/tribes/workers/barbarians/carrier/idle_04.png'
388Binary files data/tribes/workers/barbarians/carrier/idle_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_04.png 1970-01-01 00:00:00 +0000 differ
389=== removed file 'data/tribes/workers/barbarians/carrier/idle_04_pc.png'
390Binary files data/tribes/workers/barbarians/carrier/idle_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_04_pc.png 1970-01-01 00:00:00 +0000 differ
391=== removed file 'data/tribes/workers/barbarians/carrier/idle_05.png'
392Binary files data/tribes/workers/barbarians/carrier/idle_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_05.png 1970-01-01 00:00:00 +0000 differ
393=== removed file 'data/tribes/workers/barbarians/carrier/idle_05_pc.png'
394Binary files data/tribes/workers/barbarians/carrier/idle_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_05_pc.png 1970-01-01 00:00:00 +0000 differ
395=== removed file 'data/tribes/workers/barbarians/carrier/idle_06.png'
396Binary files data/tribes/workers/barbarians/carrier/idle_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_06.png 1970-01-01 00:00:00 +0000 differ
397=== removed file 'data/tribes/workers/barbarians/carrier/idle_06_pc.png'
398Binary files data/tribes/workers/barbarians/carrier/idle_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_06_pc.png 1970-01-01 00:00:00 +0000 differ
399=== removed file 'data/tribes/workers/barbarians/carrier/idle_07.png'
400Binary files data/tribes/workers/barbarians/carrier/idle_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_07.png 1970-01-01 00:00:00 +0000 differ
401=== removed file 'data/tribes/workers/barbarians/carrier/idle_07_pc.png'
402Binary files data/tribes/workers/barbarians/carrier/idle_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_07_pc.png 1970-01-01 00:00:00 +0000 differ
403=== removed file 'data/tribes/workers/barbarians/carrier/idle_08.png'
404Binary files data/tribes/workers/barbarians/carrier/idle_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_08.png 1970-01-01 00:00:00 +0000 differ
405=== removed file 'data/tribes/workers/barbarians/carrier/idle_08_pc.png'
406Binary files data/tribes/workers/barbarians/carrier/idle_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_08_pc.png 1970-01-01 00:00:00 +0000 differ
407=== removed file 'data/tribes/workers/barbarians/carrier/idle_09.png'
408Binary files data/tribes/workers/barbarians/carrier/idle_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_09.png 1970-01-01 00:00:00 +0000 differ
409=== removed file 'data/tribes/workers/barbarians/carrier/idle_09_pc.png'
410Binary files data/tribes/workers/barbarians/carrier/idle_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_09_pc.png 1970-01-01 00:00:00 +0000 differ
411=== added file 'data/tribes/workers/barbarians/carrier/idle_1.png'
412Binary files data/tribes/workers/barbarians/carrier/idle_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/idle_1.png 2019-09-08 20:16:16 +0000 differ
413=== removed file 'data/tribes/workers/barbarians/carrier/idle_10.png'
414Binary files data/tribes/workers/barbarians/carrier/idle_10.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_10.png 1970-01-01 00:00:00 +0000 differ
415=== removed file 'data/tribes/workers/barbarians/carrier/idle_10_pc.png'
416Binary files data/tribes/workers/barbarians/carrier/idle_10_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_10_pc.png 1970-01-01 00:00:00 +0000 differ
417=== removed file 'data/tribes/workers/barbarians/carrier/idle_11.png'
418Binary files data/tribes/workers/barbarians/carrier/idle_11.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_11.png 1970-01-01 00:00:00 +0000 differ
419=== removed file 'data/tribes/workers/barbarians/carrier/idle_11_pc.png'
420Binary files data/tribes/workers/barbarians/carrier/idle_11_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_11_pc.png 1970-01-01 00:00:00 +0000 differ
421=== removed file 'data/tribes/workers/barbarians/carrier/idle_12.png'
422Binary files data/tribes/workers/barbarians/carrier/idle_12.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_12.png 1970-01-01 00:00:00 +0000 differ
423=== removed file 'data/tribes/workers/barbarians/carrier/idle_12_pc.png'
424Binary files data/tribes/workers/barbarians/carrier/idle_12_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_12_pc.png 1970-01-01 00:00:00 +0000 differ
425=== removed file 'data/tribes/workers/barbarians/carrier/idle_13.png'
426Binary files data/tribes/workers/barbarians/carrier/idle_13.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_13.png 1970-01-01 00:00:00 +0000 differ
427=== removed file 'data/tribes/workers/barbarians/carrier/idle_13_pc.png'
428Binary files data/tribes/workers/barbarians/carrier/idle_13_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_13_pc.png 1970-01-01 00:00:00 +0000 differ
429=== removed file 'data/tribes/workers/barbarians/carrier/idle_14.png'
430Binary files data/tribes/workers/barbarians/carrier/idle_14.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_14.png 1970-01-01 00:00:00 +0000 differ
431=== removed file 'data/tribes/workers/barbarians/carrier/idle_14_pc.png'
432Binary files data/tribes/workers/barbarians/carrier/idle_14_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_14_pc.png 1970-01-01 00:00:00 +0000 differ
433=== removed file 'data/tribes/workers/barbarians/carrier/idle_15.png'
434Binary files data/tribes/workers/barbarians/carrier/idle_15.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_15.png 1970-01-01 00:00:00 +0000 differ
435=== removed file 'data/tribes/workers/barbarians/carrier/idle_15_pc.png'
436Binary files data/tribes/workers/barbarians/carrier/idle_15_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_15_pc.png 1970-01-01 00:00:00 +0000 differ
437=== removed file 'data/tribes/workers/barbarians/carrier/idle_16.png'
438Binary files data/tribes/workers/barbarians/carrier/idle_16.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_16.png 1970-01-01 00:00:00 +0000 differ
439=== removed file 'data/tribes/workers/barbarians/carrier/idle_16_pc.png'
440Binary files data/tribes/workers/barbarians/carrier/idle_16_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_16_pc.png 1970-01-01 00:00:00 +0000 differ
441=== removed file 'data/tribes/workers/barbarians/carrier/idle_17.png'
442Binary files data/tribes/workers/barbarians/carrier/idle_17.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_17.png 1970-01-01 00:00:00 +0000 differ
443=== removed file 'data/tribes/workers/barbarians/carrier/idle_17_pc.png'
444Binary files data/tribes/workers/barbarians/carrier/idle_17_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_17_pc.png 1970-01-01 00:00:00 +0000 differ
445=== removed file 'data/tribes/workers/barbarians/carrier/idle_18.png'
446Binary files data/tribes/workers/barbarians/carrier/idle_18.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_18.png 1970-01-01 00:00:00 +0000 differ
447=== removed file 'data/tribes/workers/barbarians/carrier/idle_18_pc.png'
448Binary files data/tribes/workers/barbarians/carrier/idle_18_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_18_pc.png 1970-01-01 00:00:00 +0000 differ
449=== removed file 'data/tribes/workers/barbarians/carrier/idle_19.png'
450Binary files data/tribes/workers/barbarians/carrier/idle_19.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_19.png 1970-01-01 00:00:00 +0000 differ
451=== removed file 'data/tribes/workers/barbarians/carrier/idle_19_pc.png'
452Binary files data/tribes/workers/barbarians/carrier/idle_19_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_19_pc.png 1970-01-01 00:00:00 +0000 differ
453=== added file 'data/tribes/workers/barbarians/carrier/idle_1_pc.png'
454Binary files data/tribes/workers/barbarians/carrier/idle_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/idle_1_pc.png 2019-09-08 20:16:16 +0000 differ
455=== removed file 'data/tribes/workers/barbarians/carrier/idle_20.png'
456Binary files data/tribes/workers/barbarians/carrier/idle_20.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_20.png 1970-01-01 00:00:00 +0000 differ
457=== removed file 'data/tribes/workers/barbarians/carrier/idle_20_pc.png'
458Binary files data/tribes/workers/barbarians/carrier/idle_20_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_20_pc.png 1970-01-01 00:00:00 +0000 differ
459=== removed file 'data/tribes/workers/barbarians/carrier/idle_21.png'
460Binary files data/tribes/workers/barbarians/carrier/idle_21.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_21.png 1970-01-01 00:00:00 +0000 differ
461=== removed file 'data/tribes/workers/barbarians/carrier/idle_21_pc.png'
462Binary files data/tribes/workers/barbarians/carrier/idle_21_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_21_pc.png 1970-01-01 00:00:00 +0000 differ
463=== removed file 'data/tribes/workers/barbarians/carrier/idle_22.png'
464Binary files data/tribes/workers/barbarians/carrier/idle_22.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_22.png 1970-01-01 00:00:00 +0000 differ
465=== removed file 'data/tribes/workers/barbarians/carrier/idle_22_pc.png'
466Binary files data/tribes/workers/barbarians/carrier/idle_22_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_22_pc.png 1970-01-01 00:00:00 +0000 differ
467=== removed file 'data/tribes/workers/barbarians/carrier/idle_23.png'
468Binary files data/tribes/workers/barbarians/carrier/idle_23.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_23.png 1970-01-01 00:00:00 +0000 differ
469=== removed file 'data/tribes/workers/barbarians/carrier/idle_23_pc.png'
470Binary files data/tribes/workers/barbarians/carrier/idle_23_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_23_pc.png 1970-01-01 00:00:00 +0000 differ
471=== removed file 'data/tribes/workers/barbarians/carrier/idle_24.png'
472Binary files data/tribes/workers/barbarians/carrier/idle_24.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_24.png 1970-01-01 00:00:00 +0000 differ
473=== removed file 'data/tribes/workers/barbarians/carrier/idle_24_pc.png'
474Binary files data/tribes/workers/barbarians/carrier/idle_24_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_24_pc.png 1970-01-01 00:00:00 +0000 differ
475=== removed file 'data/tribes/workers/barbarians/carrier/idle_25.png'
476Binary files data/tribes/workers/barbarians/carrier/idle_25.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_25.png 1970-01-01 00:00:00 +0000 differ
477=== removed file 'data/tribes/workers/barbarians/carrier/idle_25_pc.png'
478Binary files data/tribes/workers/barbarians/carrier/idle_25_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_25_pc.png 1970-01-01 00:00:00 +0000 differ
479=== removed file 'data/tribes/workers/barbarians/carrier/idle_26.png'
480Binary files data/tribes/workers/barbarians/carrier/idle_26.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_26.png 1970-01-01 00:00:00 +0000 differ
481=== removed file 'data/tribes/workers/barbarians/carrier/idle_26_pc.png'
482Binary files data/tribes/workers/barbarians/carrier/idle_26_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_26_pc.png 1970-01-01 00:00:00 +0000 differ
483=== removed file 'data/tribes/workers/barbarians/carrier/idle_27.png'
484Binary files data/tribes/workers/barbarians/carrier/idle_27.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_27.png 1970-01-01 00:00:00 +0000 differ
485=== removed file 'data/tribes/workers/barbarians/carrier/idle_27_pc.png'
486Binary files data/tribes/workers/barbarians/carrier/idle_27_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_27_pc.png 1970-01-01 00:00:00 +0000 differ
487=== removed file 'data/tribes/workers/barbarians/carrier/idle_28.png'
488Binary files data/tribes/workers/barbarians/carrier/idle_28.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_28.png 1970-01-01 00:00:00 +0000 differ
489=== removed file 'data/tribes/workers/barbarians/carrier/idle_28_pc.png'
490Binary files data/tribes/workers/barbarians/carrier/idle_28_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_28_pc.png 1970-01-01 00:00:00 +0000 differ
491=== removed file 'data/tribes/workers/barbarians/carrier/idle_29.png'
492Binary files data/tribes/workers/barbarians/carrier/idle_29.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_29.png 1970-01-01 00:00:00 +0000 differ
493=== removed file 'data/tribes/workers/barbarians/carrier/idle_29_pc.png'
494Binary files data/tribes/workers/barbarians/carrier/idle_29_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_29_pc.png 1970-01-01 00:00:00 +0000 differ
495=== removed file 'data/tribes/workers/barbarians/carrier/idle_30.png'
496Binary files data/tribes/workers/barbarians/carrier/idle_30.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_30.png 1970-01-01 00:00:00 +0000 differ
497=== removed file 'data/tribes/workers/barbarians/carrier/idle_30_pc.png'
498Binary files data/tribes/workers/barbarians/carrier/idle_30_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_30_pc.png 1970-01-01 00:00:00 +0000 differ
499=== removed file 'data/tribes/workers/barbarians/carrier/idle_31.png'
500Binary files data/tribes/workers/barbarians/carrier/idle_31.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_31.png 1970-01-01 00:00:00 +0000 differ
501=== removed file 'data/tribes/workers/barbarians/carrier/idle_31_pc.png'
502Binary files data/tribes/workers/barbarians/carrier/idle_31_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_31_pc.png 1970-01-01 00:00:00 +0000 differ
503=== removed file 'data/tribes/workers/barbarians/carrier/idle_32.png'
504Binary files data/tribes/workers/barbarians/carrier/idle_32.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_32.png 1970-01-01 00:00:00 +0000 differ
505=== removed file 'data/tribes/workers/barbarians/carrier/idle_32_pc.png'
506Binary files data/tribes/workers/barbarians/carrier/idle_32_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_32_pc.png 1970-01-01 00:00:00 +0000 differ
507=== removed file 'data/tribes/workers/barbarians/carrier/idle_33.png'
508Binary files data/tribes/workers/barbarians/carrier/idle_33.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_33.png 1970-01-01 00:00:00 +0000 differ
509=== removed file 'data/tribes/workers/barbarians/carrier/idle_33_pc.png'
510Binary files data/tribes/workers/barbarians/carrier/idle_33_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_33_pc.png 1970-01-01 00:00:00 +0000 differ
511=== removed file 'data/tribes/workers/barbarians/carrier/idle_34.png'
512Binary files data/tribes/workers/barbarians/carrier/idle_34.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_34.png 1970-01-01 00:00:00 +0000 differ
513=== removed file 'data/tribes/workers/barbarians/carrier/idle_34_pc.png'
514Binary files data/tribes/workers/barbarians/carrier/idle_34_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_34_pc.png 1970-01-01 00:00:00 +0000 differ
515=== removed file 'data/tribes/workers/barbarians/carrier/idle_35.png'
516Binary files data/tribes/workers/barbarians/carrier/idle_35.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_35.png 1970-01-01 00:00:00 +0000 differ
517=== removed file 'data/tribes/workers/barbarians/carrier/idle_35_pc.png'
518Binary files data/tribes/workers/barbarians/carrier/idle_35_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_35_pc.png 1970-01-01 00:00:00 +0000 differ
519=== removed file 'data/tribes/workers/barbarians/carrier/idle_36.png'
520Binary files data/tribes/workers/barbarians/carrier/idle_36.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_36.png 1970-01-01 00:00:00 +0000 differ
521=== removed file 'data/tribes/workers/barbarians/carrier/idle_36_pc.png'
522Binary files data/tribes/workers/barbarians/carrier/idle_36_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_36_pc.png 1970-01-01 00:00:00 +0000 differ
523=== removed file 'data/tribes/workers/barbarians/carrier/idle_37.png'
524Binary files data/tribes/workers/barbarians/carrier/idle_37.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_37.png 1970-01-01 00:00:00 +0000 differ
525=== removed file 'data/tribes/workers/barbarians/carrier/idle_37_pc.png'
526Binary files data/tribes/workers/barbarians/carrier/idle_37_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_37_pc.png 1970-01-01 00:00:00 +0000 differ
527=== removed file 'data/tribes/workers/barbarians/carrier/idle_38.png'
528Binary files data/tribes/workers/barbarians/carrier/idle_38.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_38.png 1970-01-01 00:00:00 +0000 differ
529=== removed file 'data/tribes/workers/barbarians/carrier/idle_38_pc.png'
530Binary files data/tribes/workers/barbarians/carrier/idle_38_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_38_pc.png 1970-01-01 00:00:00 +0000 differ
531=== removed file 'data/tribes/workers/barbarians/carrier/idle_39.png'
532Binary files data/tribes/workers/barbarians/carrier/idle_39.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_39.png 1970-01-01 00:00:00 +0000 differ
533=== removed file 'data/tribes/workers/barbarians/carrier/idle_39_pc.png'
534Binary files data/tribes/workers/barbarians/carrier/idle_39_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_39_pc.png 1970-01-01 00:00:00 +0000 differ
535=== removed file 'data/tribes/workers/barbarians/carrier/idle_40.png'
536Binary files data/tribes/workers/barbarians/carrier/idle_40.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_40.png 1970-01-01 00:00:00 +0000 differ
537=== removed file 'data/tribes/workers/barbarians/carrier/idle_40_pc.png'
538Binary files data/tribes/workers/barbarians/carrier/idle_40_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_40_pc.png 1970-01-01 00:00:00 +0000 differ
539=== removed file 'data/tribes/workers/barbarians/carrier/idle_41.png'
540Binary files data/tribes/workers/barbarians/carrier/idle_41.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_41.png 1970-01-01 00:00:00 +0000 differ
541=== removed file 'data/tribes/workers/barbarians/carrier/idle_41_pc.png'
542Binary files data/tribes/workers/barbarians/carrier/idle_41_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_41_pc.png 1970-01-01 00:00:00 +0000 differ
543=== removed file 'data/tribes/workers/barbarians/carrier/idle_42.png'
544Binary files data/tribes/workers/barbarians/carrier/idle_42.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_42.png 1970-01-01 00:00:00 +0000 differ
545=== removed file 'data/tribes/workers/barbarians/carrier/idle_42_pc.png'
546Binary files data/tribes/workers/barbarians/carrier/idle_42_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_42_pc.png 1970-01-01 00:00:00 +0000 differ
547=== removed file 'data/tribes/workers/barbarians/carrier/idle_43.png'
548Binary files data/tribes/workers/barbarians/carrier/idle_43.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_43.png 1970-01-01 00:00:00 +0000 differ
549=== removed file 'data/tribes/workers/barbarians/carrier/idle_43_pc.png'
550Binary files data/tribes/workers/barbarians/carrier/idle_43_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_43_pc.png 1970-01-01 00:00:00 +0000 differ
551=== removed file 'data/tribes/workers/barbarians/carrier/idle_44.png'
552Binary files data/tribes/workers/barbarians/carrier/idle_44.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_44.png 1970-01-01 00:00:00 +0000 differ
553=== removed file 'data/tribes/workers/barbarians/carrier/idle_44_pc.png'
554Binary files data/tribes/workers/barbarians/carrier/idle_44_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_44_pc.png 1970-01-01 00:00:00 +0000 differ
555=== removed file 'data/tribes/workers/barbarians/carrier/idle_45.png'
556Binary files data/tribes/workers/barbarians/carrier/idle_45.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_45.png 1970-01-01 00:00:00 +0000 differ
557=== removed file 'data/tribes/workers/barbarians/carrier/idle_45_pc.png'
558Binary files data/tribes/workers/barbarians/carrier/idle_45_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_45_pc.png 1970-01-01 00:00:00 +0000 differ
559=== removed file 'data/tribes/workers/barbarians/carrier/idle_46.png'
560Binary files data/tribes/workers/barbarians/carrier/idle_46.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_46.png 1970-01-01 00:00:00 +0000 differ
561=== removed file 'data/tribes/workers/barbarians/carrier/idle_46_pc.png'
562Binary files data/tribes/workers/barbarians/carrier/idle_46_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_46_pc.png 1970-01-01 00:00:00 +0000 differ
563=== removed file 'data/tribes/workers/barbarians/carrier/idle_47.png'
564Binary files data/tribes/workers/barbarians/carrier/idle_47.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_47.png 1970-01-01 00:00:00 +0000 differ
565=== removed file 'data/tribes/workers/barbarians/carrier/idle_47_pc.png'
566Binary files data/tribes/workers/barbarians/carrier/idle_47_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_47_pc.png 1970-01-01 00:00:00 +0000 differ
567=== removed file 'data/tribes/workers/barbarians/carrier/idle_48.png'
568Binary files data/tribes/workers/barbarians/carrier/idle_48.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_48.png 1970-01-01 00:00:00 +0000 differ
569=== removed file 'data/tribes/workers/barbarians/carrier/idle_48_pc.png'
570Binary files data/tribes/workers/barbarians/carrier/idle_48_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_48_pc.png 1970-01-01 00:00:00 +0000 differ
571=== removed file 'data/tribes/workers/barbarians/carrier/idle_49.png'
572Binary files data/tribes/workers/barbarians/carrier/idle_49.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_49.png 1970-01-01 00:00:00 +0000 differ
573=== removed file 'data/tribes/workers/barbarians/carrier/idle_49_pc.png'
574Binary files data/tribes/workers/barbarians/carrier/idle_49_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_49_pc.png 1970-01-01 00:00:00 +0000 differ
575=== removed file 'data/tribes/workers/barbarians/carrier/idle_50.png'
576Binary files data/tribes/workers/barbarians/carrier/idle_50.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_50.png 1970-01-01 00:00:00 +0000 differ
577=== removed file 'data/tribes/workers/barbarians/carrier/idle_50_pc.png'
578Binary files data/tribes/workers/barbarians/carrier/idle_50_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_50_pc.png 1970-01-01 00:00:00 +0000 differ
579=== removed file 'data/tribes/workers/barbarians/carrier/idle_51.png'
580Binary files data/tribes/workers/barbarians/carrier/idle_51.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_51.png 1970-01-01 00:00:00 +0000 differ
581=== removed file 'data/tribes/workers/barbarians/carrier/idle_51_pc.png'
582Binary files data/tribes/workers/barbarians/carrier/idle_51_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_51_pc.png 1970-01-01 00:00:00 +0000 differ
583=== removed file 'data/tribes/workers/barbarians/carrier/idle_52.png'
584Binary files data/tribes/workers/barbarians/carrier/idle_52.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_52.png 1970-01-01 00:00:00 +0000 differ
585=== removed file 'data/tribes/workers/barbarians/carrier/idle_52_pc.png'
586Binary files data/tribes/workers/barbarians/carrier/idle_52_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_52_pc.png 1970-01-01 00:00:00 +0000 differ
587=== removed file 'data/tribes/workers/barbarians/carrier/idle_53.png'
588Binary files data/tribes/workers/barbarians/carrier/idle_53.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_53.png 1970-01-01 00:00:00 +0000 differ
589=== removed file 'data/tribes/workers/barbarians/carrier/idle_53_pc.png'
590Binary files data/tribes/workers/barbarians/carrier/idle_53_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_53_pc.png 1970-01-01 00:00:00 +0000 differ
591=== removed file 'data/tribes/workers/barbarians/carrier/idle_54.png'
592Binary files data/tribes/workers/barbarians/carrier/idle_54.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_54.png 1970-01-01 00:00:00 +0000 differ
593=== removed file 'data/tribes/workers/barbarians/carrier/idle_54_pc.png'
594Binary files data/tribes/workers/barbarians/carrier/idle_54_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_54_pc.png 1970-01-01 00:00:00 +0000 differ
595=== removed file 'data/tribes/workers/barbarians/carrier/idle_55.png'
596Binary files data/tribes/workers/barbarians/carrier/idle_55.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_55.png 1970-01-01 00:00:00 +0000 differ
597=== removed file 'data/tribes/workers/barbarians/carrier/idle_55_pc.png'
598Binary files data/tribes/workers/barbarians/carrier/idle_55_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_55_pc.png 1970-01-01 00:00:00 +0000 differ
599=== removed file 'data/tribes/workers/barbarians/carrier/idle_56.png'
600Binary files data/tribes/workers/barbarians/carrier/idle_56.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_56.png 1970-01-01 00:00:00 +0000 differ
601=== removed file 'data/tribes/workers/barbarians/carrier/idle_56_pc.png'
602Binary files data/tribes/workers/barbarians/carrier/idle_56_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_56_pc.png 1970-01-01 00:00:00 +0000 differ
603=== removed file 'data/tribes/workers/barbarians/carrier/idle_57.png'
604Binary files data/tribes/workers/barbarians/carrier/idle_57.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_57.png 1970-01-01 00:00:00 +0000 differ
605=== removed file 'data/tribes/workers/barbarians/carrier/idle_57_pc.png'
606Binary files data/tribes/workers/barbarians/carrier/idle_57_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_57_pc.png 1970-01-01 00:00:00 +0000 differ
607=== removed file 'data/tribes/workers/barbarians/carrier/idle_58.png'
608Binary files data/tribes/workers/barbarians/carrier/idle_58.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_58.png 1970-01-01 00:00:00 +0000 differ
609=== removed file 'data/tribes/workers/barbarians/carrier/idle_58_pc.png'
610Binary files data/tribes/workers/barbarians/carrier/idle_58_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_58_pc.png 1970-01-01 00:00:00 +0000 differ
611=== removed file 'data/tribes/workers/barbarians/carrier/idle_59.png'
612Binary files data/tribes/workers/barbarians/carrier/idle_59.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_59.png 1970-01-01 00:00:00 +0000 differ
613=== removed file 'data/tribes/workers/barbarians/carrier/idle_59_pc.png'
614Binary files data/tribes/workers/barbarians/carrier/idle_59_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_59_pc.png 1970-01-01 00:00:00 +0000 differ
615=== removed file 'data/tribes/workers/barbarians/carrier/idle_60.png'
616Binary files data/tribes/workers/barbarians/carrier/idle_60.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_60.png 1970-01-01 00:00:00 +0000 differ
617=== removed file 'data/tribes/workers/barbarians/carrier/idle_60_pc.png'
618Binary files data/tribes/workers/barbarians/carrier/idle_60_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_60_pc.png 1970-01-01 00:00:00 +0000 differ
619=== removed file 'data/tribes/workers/barbarians/carrier/idle_61.png'
620Binary files data/tribes/workers/barbarians/carrier/idle_61.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_61.png 1970-01-01 00:00:00 +0000 differ
621=== removed file 'data/tribes/workers/barbarians/carrier/idle_61_pc.png'
622Binary files data/tribes/workers/barbarians/carrier/idle_61_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_61_pc.png 1970-01-01 00:00:00 +0000 differ
623=== removed file 'data/tribes/workers/barbarians/carrier/idle_62.png'
624Binary files data/tribes/workers/barbarians/carrier/idle_62.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_62.png 1970-01-01 00:00:00 +0000 differ
625=== removed file 'data/tribes/workers/barbarians/carrier/idle_62_pc.png'
626Binary files data/tribes/workers/barbarians/carrier/idle_62_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_62_pc.png 1970-01-01 00:00:00 +0000 differ
627=== removed file 'data/tribes/workers/barbarians/carrier/idle_63.png'
628Binary files data/tribes/workers/barbarians/carrier/idle_63.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_63.png 1970-01-01 00:00:00 +0000 differ
629=== removed file 'data/tribes/workers/barbarians/carrier/idle_63_pc.png'
630Binary files data/tribes/workers/barbarians/carrier/idle_63_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_63_pc.png 1970-01-01 00:00:00 +0000 differ
631=== removed file 'data/tribes/workers/barbarians/carrier/idle_64.png'
632Binary files data/tribes/workers/barbarians/carrier/idle_64.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_64.png 1970-01-01 00:00:00 +0000 differ
633=== removed file 'data/tribes/workers/barbarians/carrier/idle_64_pc.png'
634Binary files data/tribes/workers/barbarians/carrier/idle_64_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_64_pc.png 1970-01-01 00:00:00 +0000 differ
635=== removed file 'data/tribes/workers/barbarians/carrier/idle_65.png'
636Binary files data/tribes/workers/barbarians/carrier/idle_65.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_65.png 1970-01-01 00:00:00 +0000 differ
637=== removed file 'data/tribes/workers/barbarians/carrier/idle_65_pc.png'
638Binary files data/tribes/workers/barbarians/carrier/idle_65_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_65_pc.png 1970-01-01 00:00:00 +0000 differ
639=== removed file 'data/tribes/workers/barbarians/carrier/idle_66.png'
640Binary files data/tribes/workers/barbarians/carrier/idle_66.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_66.png 1970-01-01 00:00:00 +0000 differ
641=== removed file 'data/tribes/workers/barbarians/carrier/idle_66_pc.png'
642Binary files data/tribes/workers/barbarians/carrier/idle_66_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_66_pc.png 1970-01-01 00:00:00 +0000 differ
643=== removed file 'data/tribes/workers/barbarians/carrier/idle_67.png'
644Binary files data/tribes/workers/barbarians/carrier/idle_67.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_67.png 1970-01-01 00:00:00 +0000 differ
645=== removed file 'data/tribes/workers/barbarians/carrier/idle_67_pc.png'
646Binary files data/tribes/workers/barbarians/carrier/idle_67_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_67_pc.png 1970-01-01 00:00:00 +0000 differ
647=== removed file 'data/tribes/workers/barbarians/carrier/idle_68.png'
648Binary files data/tribes/workers/barbarians/carrier/idle_68.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_68.png 1970-01-01 00:00:00 +0000 differ
649=== removed file 'data/tribes/workers/barbarians/carrier/idle_68_pc.png'
650Binary files data/tribes/workers/barbarians/carrier/idle_68_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_68_pc.png 1970-01-01 00:00:00 +0000 differ
651=== removed file 'data/tribes/workers/barbarians/carrier/idle_69.png'
652Binary files data/tribes/workers/barbarians/carrier/idle_69.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_69.png 1970-01-01 00:00:00 +0000 differ
653=== removed file 'data/tribes/workers/barbarians/carrier/idle_69_pc.png'
654Binary files data/tribes/workers/barbarians/carrier/idle_69_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_69_pc.png 1970-01-01 00:00:00 +0000 differ
655=== removed file 'data/tribes/workers/barbarians/carrier/idle_70.png'
656Binary files data/tribes/workers/barbarians/carrier/idle_70.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_70.png 1970-01-01 00:00:00 +0000 differ
657=== removed file 'data/tribes/workers/barbarians/carrier/idle_70_pc.png'
658Binary files data/tribes/workers/barbarians/carrier/idle_70_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_70_pc.png 1970-01-01 00:00:00 +0000 differ
659=== removed file 'data/tribes/workers/barbarians/carrier/idle_71.png'
660Binary files data/tribes/workers/barbarians/carrier/idle_71.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_71.png 1970-01-01 00:00:00 +0000 differ
661=== removed file 'data/tribes/workers/barbarians/carrier/idle_71_pc.png'
662Binary files data/tribes/workers/barbarians/carrier/idle_71_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_71_pc.png 1970-01-01 00:00:00 +0000 differ
663=== removed file 'data/tribes/workers/barbarians/carrier/idle_72.png'
664Binary files data/tribes/workers/barbarians/carrier/idle_72.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_72.png 1970-01-01 00:00:00 +0000 differ
665=== removed file 'data/tribes/workers/barbarians/carrier/idle_72_pc.png'
666Binary files data/tribes/workers/barbarians/carrier/idle_72_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_72_pc.png 1970-01-01 00:00:00 +0000 differ
667=== removed file 'data/tribes/workers/barbarians/carrier/idle_73.png'
668Binary files data/tribes/workers/barbarians/carrier/idle_73.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_73.png 1970-01-01 00:00:00 +0000 differ
669=== removed file 'data/tribes/workers/barbarians/carrier/idle_73_pc.png'
670Binary files data/tribes/workers/barbarians/carrier/idle_73_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_73_pc.png 1970-01-01 00:00:00 +0000 differ
671=== removed file 'data/tribes/workers/barbarians/carrier/idle_74.png'
672Binary files data/tribes/workers/barbarians/carrier/idle_74.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_74.png 1970-01-01 00:00:00 +0000 differ
673=== removed file 'data/tribes/workers/barbarians/carrier/idle_74_pc.png'
674Binary files data/tribes/workers/barbarians/carrier/idle_74_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_74_pc.png 1970-01-01 00:00:00 +0000 differ
675=== removed file 'data/tribes/workers/barbarians/carrier/idle_75.png'
676Binary files data/tribes/workers/barbarians/carrier/idle_75.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_75.png 1970-01-01 00:00:00 +0000 differ
677=== removed file 'data/tribes/workers/barbarians/carrier/idle_75_pc.png'
678Binary files data/tribes/workers/barbarians/carrier/idle_75_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_75_pc.png 1970-01-01 00:00:00 +0000 differ
679=== removed file 'data/tribes/workers/barbarians/carrier/idle_76.png'
680Binary files data/tribes/workers/barbarians/carrier/idle_76.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_76.png 1970-01-01 00:00:00 +0000 differ
681=== removed file 'data/tribes/workers/barbarians/carrier/idle_76_pc.png'
682Binary files data/tribes/workers/barbarians/carrier/idle_76_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_76_pc.png 1970-01-01 00:00:00 +0000 differ
683=== removed file 'data/tribes/workers/barbarians/carrier/idle_77.png'
684Binary files data/tribes/workers/barbarians/carrier/idle_77.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_77.png 1970-01-01 00:00:00 +0000 differ
685=== removed file 'data/tribes/workers/barbarians/carrier/idle_77_pc.png'
686Binary files data/tribes/workers/barbarians/carrier/idle_77_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_77_pc.png 1970-01-01 00:00:00 +0000 differ
687=== removed file 'data/tribes/workers/barbarians/carrier/idle_78.png'
688Binary files data/tribes/workers/barbarians/carrier/idle_78.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_78.png 1970-01-01 00:00:00 +0000 differ
689=== removed file 'data/tribes/workers/barbarians/carrier/idle_78_pc.png'
690Binary files data/tribes/workers/barbarians/carrier/idle_78_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_78_pc.png 1970-01-01 00:00:00 +0000 differ
691=== removed file 'data/tribes/workers/barbarians/carrier/idle_79.png'
692Binary files data/tribes/workers/barbarians/carrier/idle_79.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_79.png 1970-01-01 00:00:00 +0000 differ
693=== removed file 'data/tribes/workers/barbarians/carrier/idle_79_pc.png'
694Binary files data/tribes/workers/barbarians/carrier/idle_79_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_79_pc.png 1970-01-01 00:00:00 +0000 differ
695=== removed file 'data/tribes/workers/barbarians/carrier/idle_80.png'
696Binary files data/tribes/workers/barbarians/carrier/idle_80.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_80.png 1970-01-01 00:00:00 +0000 differ
697=== removed file 'data/tribes/workers/barbarians/carrier/idle_80_pc.png'
698Binary files data/tribes/workers/barbarians/carrier/idle_80_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_80_pc.png 1970-01-01 00:00:00 +0000 differ
699=== removed file 'data/tribes/workers/barbarians/carrier/idle_81.png'
700Binary files data/tribes/workers/barbarians/carrier/idle_81.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_81.png 1970-01-01 00:00:00 +0000 differ
701=== removed file 'data/tribes/workers/barbarians/carrier/idle_81_pc.png'
702Binary files data/tribes/workers/barbarians/carrier/idle_81_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_81_pc.png 1970-01-01 00:00:00 +0000 differ
703=== removed file 'data/tribes/workers/barbarians/carrier/idle_82.png'
704Binary files data/tribes/workers/barbarians/carrier/idle_82.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_82.png 1970-01-01 00:00:00 +0000 differ
705=== removed file 'data/tribes/workers/barbarians/carrier/idle_82_pc.png'
706Binary files data/tribes/workers/barbarians/carrier/idle_82_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_82_pc.png 1970-01-01 00:00:00 +0000 differ
707=== removed file 'data/tribes/workers/barbarians/carrier/idle_83.png'
708Binary files data/tribes/workers/barbarians/carrier/idle_83.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_83.png 1970-01-01 00:00:00 +0000 differ
709=== removed file 'data/tribes/workers/barbarians/carrier/idle_83_pc.png'
710Binary files data/tribes/workers/barbarians/carrier/idle_83_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_83_pc.png 1970-01-01 00:00:00 +0000 differ
711=== removed file 'data/tribes/workers/barbarians/carrier/idle_84.png'
712Binary files data/tribes/workers/barbarians/carrier/idle_84.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_84.png 1970-01-01 00:00:00 +0000 differ
713=== removed file 'data/tribes/workers/barbarians/carrier/idle_84_pc.png'
714Binary files data/tribes/workers/barbarians/carrier/idle_84_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_84_pc.png 1970-01-01 00:00:00 +0000 differ
715=== removed file 'data/tribes/workers/barbarians/carrier/idle_85.png'
716Binary files data/tribes/workers/barbarians/carrier/idle_85.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_85.png 1970-01-01 00:00:00 +0000 differ
717=== removed file 'data/tribes/workers/barbarians/carrier/idle_85_pc.png'
718Binary files data/tribes/workers/barbarians/carrier/idle_85_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_85_pc.png 1970-01-01 00:00:00 +0000 differ
719=== removed file 'data/tribes/workers/barbarians/carrier/idle_86.png'
720Binary files data/tribes/workers/barbarians/carrier/idle_86.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_86.png 1970-01-01 00:00:00 +0000 differ
721=== removed file 'data/tribes/workers/barbarians/carrier/idle_86_pc.png'
722Binary files data/tribes/workers/barbarians/carrier/idle_86_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_86_pc.png 1970-01-01 00:00:00 +0000 differ
723=== removed file 'data/tribes/workers/barbarians/carrier/idle_87.png'
724Binary files data/tribes/workers/barbarians/carrier/idle_87.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_87.png 1970-01-01 00:00:00 +0000 differ
725=== removed file 'data/tribes/workers/barbarians/carrier/idle_87_pc.png'
726Binary files data/tribes/workers/barbarians/carrier/idle_87_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_87_pc.png 1970-01-01 00:00:00 +0000 differ
727=== removed file 'data/tribes/workers/barbarians/carrier/idle_88.png'
728Binary files data/tribes/workers/barbarians/carrier/idle_88.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_88.png 1970-01-01 00:00:00 +0000 differ
729=== removed file 'data/tribes/workers/barbarians/carrier/idle_88_pc.png'
730Binary files data/tribes/workers/barbarians/carrier/idle_88_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_88_pc.png 1970-01-01 00:00:00 +0000 differ
731=== removed file 'data/tribes/workers/barbarians/carrier/idle_89.png'
732Binary files data/tribes/workers/barbarians/carrier/idle_89.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_89.png 1970-01-01 00:00:00 +0000 differ
733=== removed file 'data/tribes/workers/barbarians/carrier/idle_89_pc.png'
734Binary files data/tribes/workers/barbarians/carrier/idle_89_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_89_pc.png 1970-01-01 00:00:00 +0000 differ
735=== removed file 'data/tribes/workers/barbarians/carrier/idle_90.png'
736Binary files data/tribes/workers/barbarians/carrier/idle_90.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_90.png 1970-01-01 00:00:00 +0000 differ
737=== removed file 'data/tribes/workers/barbarians/carrier/idle_90_pc.png'
738Binary files data/tribes/workers/barbarians/carrier/idle_90_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_90_pc.png 1970-01-01 00:00:00 +0000 differ
739=== removed file 'data/tribes/workers/barbarians/carrier/idle_91.png'
740Binary files data/tribes/workers/barbarians/carrier/idle_91.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_91.png 1970-01-01 00:00:00 +0000 differ
741=== removed file 'data/tribes/workers/barbarians/carrier/idle_91_pc.png'
742Binary files data/tribes/workers/barbarians/carrier/idle_91_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_91_pc.png 1970-01-01 00:00:00 +0000 differ
743=== removed file 'data/tribes/workers/barbarians/carrier/idle_92.png'
744Binary files data/tribes/workers/barbarians/carrier/idle_92.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_92.png 1970-01-01 00:00:00 +0000 differ
745=== removed file 'data/tribes/workers/barbarians/carrier/idle_92_pc.png'
746Binary files data/tribes/workers/barbarians/carrier/idle_92_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_92_pc.png 1970-01-01 00:00:00 +0000 differ
747=== removed file 'data/tribes/workers/barbarians/carrier/idle_93.png'
748Binary files data/tribes/workers/barbarians/carrier/idle_93.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_93.png 1970-01-01 00:00:00 +0000 differ
749=== removed file 'data/tribes/workers/barbarians/carrier/idle_93_pc.png'
750Binary files data/tribes/workers/barbarians/carrier/idle_93_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_93_pc.png 1970-01-01 00:00:00 +0000 differ
751=== removed file 'data/tribes/workers/barbarians/carrier/idle_94.png'
752Binary files data/tribes/workers/barbarians/carrier/idle_94.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_94.png 1970-01-01 00:00:00 +0000 differ
753=== removed file 'data/tribes/workers/barbarians/carrier/idle_94_pc.png'
754Binary files data/tribes/workers/barbarians/carrier/idle_94_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_94_pc.png 1970-01-01 00:00:00 +0000 differ
755=== removed file 'data/tribes/workers/barbarians/carrier/idle_95.png'
756Binary files data/tribes/workers/barbarians/carrier/idle_95.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_95.png 1970-01-01 00:00:00 +0000 differ
757=== removed file 'data/tribes/workers/barbarians/carrier/idle_95_pc.png'
758Binary files data/tribes/workers/barbarians/carrier/idle_95_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_95_pc.png 1970-01-01 00:00:00 +0000 differ
759=== removed file 'data/tribes/workers/barbarians/carrier/idle_96.png'
760Binary files data/tribes/workers/barbarians/carrier/idle_96.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_96.png 1970-01-01 00:00:00 +0000 differ
761=== removed file 'data/tribes/workers/barbarians/carrier/idle_96_pc.png'
762Binary files data/tribes/workers/barbarians/carrier/idle_96_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_96_pc.png 1970-01-01 00:00:00 +0000 differ
763=== removed file 'data/tribes/workers/barbarians/carrier/idle_97.png'
764Binary files data/tribes/workers/barbarians/carrier/idle_97.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_97.png 1970-01-01 00:00:00 +0000 differ
765=== removed file 'data/tribes/workers/barbarians/carrier/idle_97_pc.png'
766Binary files data/tribes/workers/barbarians/carrier/idle_97_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_97_pc.png 1970-01-01 00:00:00 +0000 differ
767=== removed file 'data/tribes/workers/barbarians/carrier/idle_98.png'
768Binary files data/tribes/workers/barbarians/carrier/idle_98.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_98.png 1970-01-01 00:00:00 +0000 differ
769=== removed file 'data/tribes/workers/barbarians/carrier/idle_98_pc.png'
770Binary files data/tribes/workers/barbarians/carrier/idle_98_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_98_pc.png 1970-01-01 00:00:00 +0000 differ
771=== removed file 'data/tribes/workers/barbarians/carrier/idle_99.png'
772Binary files data/tribes/workers/barbarians/carrier/idle_99.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_99.png 1970-01-01 00:00:00 +0000 differ
773=== removed file 'data/tribes/workers/barbarians/carrier/idle_99_pc.png'
774Binary files data/tribes/workers/barbarians/carrier/idle_99_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/idle_99_pc.png 1970-01-01 00:00:00 +0000 differ
775=== modified file 'data/tribes/workers/barbarians/carrier/init.lua'
776--- data/tribes/workers/barbarians/carrier/init.lua 2019-09-05 15:28:23 +0000
777+++ data/tribes/workers/barbarians/carrier/init.lua 2019-09-08 20:16:16 +0000
778@@ -1,11 +1,5 @@
779 dirname = path.dirname(__file__)
780
781-animations = {}
782-add_animation(animations, "idle", dirname, "idle", {14, 21}, 5)
783-add_directional_animation(animations, "walk", dirname, "walk", {9, 19}, 10)
784-add_directional_animation(animations, "walkload", dirname, "walkload", {7, 22}, 10)
785-
786-
787 tribes:new_carrier_type {
788 msgctxt = "barbarians_worker",
789 name = "barbarians_carrier",
790@@ -17,5 +11,36 @@
791
792 buildcost = {}, -- This will give the worker the property "buildable"
793
794- animations = animations,
795+ spritesheets = {
796+ idle = {
797+ directory = dirname,
798+ basename = "idle",
799+ fps = 5,
800+ frames = 100,
801+ columns = 10,
802+ rows = 10,
803+ hotspot = { 15, 22 }
804+ },
805+
806+ walk = {
807+ directory = dirname,
808+ basename = "walk",
809+ fps = 10,
810+ frames = 10,
811+ columns = 3,
812+ rows = 4,
813+ directional = true,
814+ hotspot = { 10, 20 }
815+ },
816+ walkload = {
817+ directory = dirname,
818+ basename = "walkload",
819+ fps = 10,
820+ frames = 10,
821+ columns = 3,
822+ rows = 4,
823+ directional = true,
824+ hotspot = { 8, 23 }
825+ }
826+ }
827 }
828
829=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_00.png'
830Binary files data/tribes/workers/barbarians/carrier/walk_e_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_00.png 1970-01-01 00:00:00 +0000 differ
831=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_00_pc.png'
832Binary files data/tribes/workers/barbarians/carrier/walk_e_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_00_pc.png 1970-01-01 00:00:00 +0000 differ
833=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_01.png'
834Binary files data/tribes/workers/barbarians/carrier/walk_e_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_01.png 1970-01-01 00:00:00 +0000 differ
835=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_01_pc.png'
836Binary files data/tribes/workers/barbarians/carrier/walk_e_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_01_pc.png 1970-01-01 00:00:00 +0000 differ
837=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_02.png'
838Binary files data/tribes/workers/barbarians/carrier/walk_e_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_02.png 1970-01-01 00:00:00 +0000 differ
839=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_02_pc.png'
840Binary files data/tribes/workers/barbarians/carrier/walk_e_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_02_pc.png 1970-01-01 00:00:00 +0000 differ
841=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_03.png'
842Binary files data/tribes/workers/barbarians/carrier/walk_e_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_03.png 1970-01-01 00:00:00 +0000 differ
843=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_03_pc.png'
844Binary files data/tribes/workers/barbarians/carrier/walk_e_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_03_pc.png 1970-01-01 00:00:00 +0000 differ
845=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_04.png'
846Binary files data/tribes/workers/barbarians/carrier/walk_e_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_04.png 1970-01-01 00:00:00 +0000 differ
847=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_04_pc.png'
848Binary files data/tribes/workers/barbarians/carrier/walk_e_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_04_pc.png 1970-01-01 00:00:00 +0000 differ
849=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_05.png'
850Binary files data/tribes/workers/barbarians/carrier/walk_e_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_05.png 1970-01-01 00:00:00 +0000 differ
851=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_05_pc.png'
852Binary files data/tribes/workers/barbarians/carrier/walk_e_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_05_pc.png 1970-01-01 00:00:00 +0000 differ
853=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_06.png'
854Binary files data/tribes/workers/barbarians/carrier/walk_e_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_06.png 1970-01-01 00:00:00 +0000 differ
855=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_06_pc.png'
856Binary files data/tribes/workers/barbarians/carrier/walk_e_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_06_pc.png 1970-01-01 00:00:00 +0000 differ
857=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_07.png'
858Binary files data/tribes/workers/barbarians/carrier/walk_e_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_07.png 1970-01-01 00:00:00 +0000 differ
859=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_07_pc.png'
860Binary files data/tribes/workers/barbarians/carrier/walk_e_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_07_pc.png 1970-01-01 00:00:00 +0000 differ
861=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_08.png'
862Binary files data/tribes/workers/barbarians/carrier/walk_e_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_08.png 1970-01-01 00:00:00 +0000 differ
863=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_08_pc.png'
864Binary files data/tribes/workers/barbarians/carrier/walk_e_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_08_pc.png 1970-01-01 00:00:00 +0000 differ
865=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_09.png'
866Binary files data/tribes/workers/barbarians/carrier/walk_e_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_09.png 1970-01-01 00:00:00 +0000 differ
867=== removed file 'data/tribes/workers/barbarians/carrier/walk_e_09_pc.png'
868Binary files data/tribes/workers/barbarians/carrier/walk_e_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_e_09_pc.png 1970-01-01 00:00:00 +0000 differ
869=== added file 'data/tribes/workers/barbarians/carrier/walk_e_1.png'
870Binary files data/tribes/workers/barbarians/carrier/walk_e_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_e_1.png 2019-09-08 20:16:16 +0000 differ
871=== added file 'data/tribes/workers/barbarians/carrier/walk_e_1_pc.png'
872Binary files data/tribes/workers/barbarians/carrier/walk_e_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_e_1_pc.png 2019-09-08 20:16:16 +0000 differ
873=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_00.png'
874Binary files data/tribes/workers/barbarians/carrier/walk_ne_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_00.png 1970-01-01 00:00:00 +0000 differ
875=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_00_pc.png'
876Binary files data/tribes/workers/barbarians/carrier/walk_ne_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_00_pc.png 1970-01-01 00:00:00 +0000 differ
877=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_01.png'
878Binary files data/tribes/workers/barbarians/carrier/walk_ne_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_01.png 1970-01-01 00:00:00 +0000 differ
879=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_01_pc.png'
880Binary files data/tribes/workers/barbarians/carrier/walk_ne_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_01_pc.png 1970-01-01 00:00:00 +0000 differ
881=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_02.png'
882Binary files data/tribes/workers/barbarians/carrier/walk_ne_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_02.png 1970-01-01 00:00:00 +0000 differ
883=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_02_pc.png'
884Binary files data/tribes/workers/barbarians/carrier/walk_ne_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_02_pc.png 1970-01-01 00:00:00 +0000 differ
885=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_03.png'
886Binary files data/tribes/workers/barbarians/carrier/walk_ne_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_03.png 1970-01-01 00:00:00 +0000 differ
887=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_03_pc.png'
888Binary files data/tribes/workers/barbarians/carrier/walk_ne_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_03_pc.png 1970-01-01 00:00:00 +0000 differ
889=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_04.png'
890Binary files data/tribes/workers/barbarians/carrier/walk_ne_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_04.png 1970-01-01 00:00:00 +0000 differ
891=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_04_pc.png'
892Binary files data/tribes/workers/barbarians/carrier/walk_ne_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_04_pc.png 1970-01-01 00:00:00 +0000 differ
893=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_05.png'
894Binary files data/tribes/workers/barbarians/carrier/walk_ne_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_05.png 1970-01-01 00:00:00 +0000 differ
895=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_05_pc.png'
896Binary files data/tribes/workers/barbarians/carrier/walk_ne_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_05_pc.png 1970-01-01 00:00:00 +0000 differ
897=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_06.png'
898Binary files data/tribes/workers/barbarians/carrier/walk_ne_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_06.png 1970-01-01 00:00:00 +0000 differ
899=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_06_pc.png'
900Binary files data/tribes/workers/barbarians/carrier/walk_ne_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_06_pc.png 1970-01-01 00:00:00 +0000 differ
901=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_07.png'
902Binary files data/tribes/workers/barbarians/carrier/walk_ne_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_07.png 1970-01-01 00:00:00 +0000 differ
903=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_07_pc.png'
904Binary files data/tribes/workers/barbarians/carrier/walk_ne_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_07_pc.png 1970-01-01 00:00:00 +0000 differ
905=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_08.png'
906Binary files data/tribes/workers/barbarians/carrier/walk_ne_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_08.png 1970-01-01 00:00:00 +0000 differ
907=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_08_pc.png'
908Binary files data/tribes/workers/barbarians/carrier/walk_ne_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_08_pc.png 1970-01-01 00:00:00 +0000 differ
909=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_09.png'
910Binary files data/tribes/workers/barbarians/carrier/walk_ne_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_09.png 1970-01-01 00:00:00 +0000 differ
911=== removed file 'data/tribes/workers/barbarians/carrier/walk_ne_09_pc.png'
912Binary files data/tribes/workers/barbarians/carrier/walk_ne_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_09_pc.png 1970-01-01 00:00:00 +0000 differ
913=== added file 'data/tribes/workers/barbarians/carrier/walk_ne_1.png'
914Binary files data/tribes/workers/barbarians/carrier/walk_ne_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_1.png 2019-09-08 20:16:16 +0000 differ
915=== added file 'data/tribes/workers/barbarians/carrier/walk_ne_1_pc.png'
916Binary files data/tribes/workers/barbarians/carrier/walk_ne_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_ne_1_pc.png 2019-09-08 20:16:16 +0000 differ
917=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_00.png'
918Binary files data/tribes/workers/barbarians/carrier/walk_nw_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_00.png 1970-01-01 00:00:00 +0000 differ
919=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_00_pc.png'
920Binary files data/tribes/workers/barbarians/carrier/walk_nw_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_00_pc.png 1970-01-01 00:00:00 +0000 differ
921=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_01.png'
922Binary files data/tribes/workers/barbarians/carrier/walk_nw_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_01.png 1970-01-01 00:00:00 +0000 differ
923=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_01_pc.png'
924Binary files data/tribes/workers/barbarians/carrier/walk_nw_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_01_pc.png 1970-01-01 00:00:00 +0000 differ
925=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_02.png'
926Binary files data/tribes/workers/barbarians/carrier/walk_nw_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_02.png 1970-01-01 00:00:00 +0000 differ
927=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_02_pc.png'
928Binary files data/tribes/workers/barbarians/carrier/walk_nw_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_02_pc.png 1970-01-01 00:00:00 +0000 differ
929=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_03.png'
930Binary files data/tribes/workers/barbarians/carrier/walk_nw_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_03.png 1970-01-01 00:00:00 +0000 differ
931=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_03_pc.png'
932Binary files data/tribes/workers/barbarians/carrier/walk_nw_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_03_pc.png 1970-01-01 00:00:00 +0000 differ
933=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_04.png'
934Binary files data/tribes/workers/barbarians/carrier/walk_nw_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_04.png 1970-01-01 00:00:00 +0000 differ
935=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_04_pc.png'
936Binary files data/tribes/workers/barbarians/carrier/walk_nw_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_04_pc.png 1970-01-01 00:00:00 +0000 differ
937=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_05.png'
938Binary files data/tribes/workers/barbarians/carrier/walk_nw_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_05.png 1970-01-01 00:00:00 +0000 differ
939=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_05_pc.png'
940Binary files data/tribes/workers/barbarians/carrier/walk_nw_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_05_pc.png 1970-01-01 00:00:00 +0000 differ
941=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_06.png'
942Binary files data/tribes/workers/barbarians/carrier/walk_nw_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_06.png 1970-01-01 00:00:00 +0000 differ
943=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_06_pc.png'
944Binary files data/tribes/workers/barbarians/carrier/walk_nw_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_06_pc.png 1970-01-01 00:00:00 +0000 differ
945=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_07.png'
946Binary files data/tribes/workers/barbarians/carrier/walk_nw_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_07.png 1970-01-01 00:00:00 +0000 differ
947=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_07_pc.png'
948Binary files data/tribes/workers/barbarians/carrier/walk_nw_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_07_pc.png 1970-01-01 00:00:00 +0000 differ
949=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_08.png'
950Binary files data/tribes/workers/barbarians/carrier/walk_nw_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_08.png 1970-01-01 00:00:00 +0000 differ
951=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_08_pc.png'
952Binary files data/tribes/workers/barbarians/carrier/walk_nw_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_08_pc.png 1970-01-01 00:00:00 +0000 differ
953=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_09.png'
954Binary files data/tribes/workers/barbarians/carrier/walk_nw_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_09.png 1970-01-01 00:00:00 +0000 differ
955=== removed file 'data/tribes/workers/barbarians/carrier/walk_nw_09_pc.png'
956Binary files data/tribes/workers/barbarians/carrier/walk_nw_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_09_pc.png 1970-01-01 00:00:00 +0000 differ
957=== added file 'data/tribes/workers/barbarians/carrier/walk_nw_1.png'
958Binary files data/tribes/workers/barbarians/carrier/walk_nw_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_1.png 2019-09-08 20:16:16 +0000 differ
959=== added file 'data/tribes/workers/barbarians/carrier/walk_nw_1_pc.png'
960Binary files data/tribes/workers/barbarians/carrier/walk_nw_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_nw_1_pc.png 2019-09-08 20:16:16 +0000 differ
961=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_00.png'
962Binary files data/tribes/workers/barbarians/carrier/walk_se_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_00.png 1970-01-01 00:00:00 +0000 differ
963=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_00_pc.png'
964Binary files data/tribes/workers/barbarians/carrier/walk_se_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_00_pc.png 1970-01-01 00:00:00 +0000 differ
965=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_01.png'
966Binary files data/tribes/workers/barbarians/carrier/walk_se_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_01.png 1970-01-01 00:00:00 +0000 differ
967=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_01_pc.png'
968Binary files data/tribes/workers/barbarians/carrier/walk_se_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_01_pc.png 1970-01-01 00:00:00 +0000 differ
969=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_02.png'
970Binary files data/tribes/workers/barbarians/carrier/walk_se_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_02.png 1970-01-01 00:00:00 +0000 differ
971=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_02_pc.png'
972Binary files data/tribes/workers/barbarians/carrier/walk_se_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_02_pc.png 1970-01-01 00:00:00 +0000 differ
973=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_03.png'
974Binary files data/tribes/workers/barbarians/carrier/walk_se_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_03.png 1970-01-01 00:00:00 +0000 differ
975=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_03_pc.png'
976Binary files data/tribes/workers/barbarians/carrier/walk_se_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_03_pc.png 1970-01-01 00:00:00 +0000 differ
977=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_04.png'
978Binary files data/tribes/workers/barbarians/carrier/walk_se_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_04.png 1970-01-01 00:00:00 +0000 differ
979=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_04_pc.png'
980Binary files data/tribes/workers/barbarians/carrier/walk_se_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_04_pc.png 1970-01-01 00:00:00 +0000 differ
981=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_05.png'
982Binary files data/tribes/workers/barbarians/carrier/walk_se_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_05.png 1970-01-01 00:00:00 +0000 differ
983=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_05_pc.png'
984Binary files data/tribes/workers/barbarians/carrier/walk_se_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_05_pc.png 1970-01-01 00:00:00 +0000 differ
985=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_06.png'
986Binary files data/tribes/workers/barbarians/carrier/walk_se_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_06.png 1970-01-01 00:00:00 +0000 differ
987=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_06_pc.png'
988Binary files data/tribes/workers/barbarians/carrier/walk_se_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_06_pc.png 1970-01-01 00:00:00 +0000 differ
989=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_07.png'
990Binary files data/tribes/workers/barbarians/carrier/walk_se_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_07.png 1970-01-01 00:00:00 +0000 differ
991=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_07_pc.png'
992Binary files data/tribes/workers/barbarians/carrier/walk_se_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_07_pc.png 1970-01-01 00:00:00 +0000 differ
993=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_08.png'
994Binary files data/tribes/workers/barbarians/carrier/walk_se_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_08.png 1970-01-01 00:00:00 +0000 differ
995=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_08_pc.png'
996Binary files data/tribes/workers/barbarians/carrier/walk_se_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_08_pc.png 1970-01-01 00:00:00 +0000 differ
997=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_09.png'
998Binary files data/tribes/workers/barbarians/carrier/walk_se_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_09.png 1970-01-01 00:00:00 +0000 differ
999=== removed file 'data/tribes/workers/barbarians/carrier/walk_se_09_pc.png'
1000Binary files data/tribes/workers/barbarians/carrier/walk_se_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_se_09_pc.png 1970-01-01 00:00:00 +0000 differ
1001=== added file 'data/tribes/workers/barbarians/carrier/walk_se_1.png'
1002Binary files data/tribes/workers/barbarians/carrier/walk_se_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_se_1.png 2019-09-08 20:16:16 +0000 differ
1003=== added file 'data/tribes/workers/barbarians/carrier/walk_se_1_pc.png'
1004Binary files data/tribes/workers/barbarians/carrier/walk_se_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_se_1_pc.png 2019-09-08 20:16:16 +0000 differ
1005=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_00.png'
1006Binary files data/tribes/workers/barbarians/carrier/walk_sw_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_00.png 1970-01-01 00:00:00 +0000 differ
1007=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_00_pc.png'
1008Binary files data/tribes/workers/barbarians/carrier/walk_sw_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_00_pc.png 1970-01-01 00:00:00 +0000 differ
1009=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_01.png'
1010Binary files data/tribes/workers/barbarians/carrier/walk_sw_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_01.png 1970-01-01 00:00:00 +0000 differ
1011=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_01_pc.png'
1012Binary files data/tribes/workers/barbarians/carrier/walk_sw_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_01_pc.png 1970-01-01 00:00:00 +0000 differ
1013=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_02.png'
1014Binary files data/tribes/workers/barbarians/carrier/walk_sw_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_02.png 1970-01-01 00:00:00 +0000 differ
1015=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_02_pc.png'
1016Binary files data/tribes/workers/barbarians/carrier/walk_sw_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_02_pc.png 1970-01-01 00:00:00 +0000 differ
1017=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_03.png'
1018Binary files data/tribes/workers/barbarians/carrier/walk_sw_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_03.png 1970-01-01 00:00:00 +0000 differ
1019=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_03_pc.png'
1020Binary files data/tribes/workers/barbarians/carrier/walk_sw_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_03_pc.png 1970-01-01 00:00:00 +0000 differ
1021=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_04.png'
1022Binary files data/tribes/workers/barbarians/carrier/walk_sw_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_04.png 1970-01-01 00:00:00 +0000 differ
1023=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_04_pc.png'
1024Binary files data/tribes/workers/barbarians/carrier/walk_sw_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_04_pc.png 1970-01-01 00:00:00 +0000 differ
1025=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_05.png'
1026Binary files data/tribes/workers/barbarians/carrier/walk_sw_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_05.png 1970-01-01 00:00:00 +0000 differ
1027=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_05_pc.png'
1028Binary files data/tribes/workers/barbarians/carrier/walk_sw_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_05_pc.png 1970-01-01 00:00:00 +0000 differ
1029=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_06.png'
1030Binary files data/tribes/workers/barbarians/carrier/walk_sw_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_06.png 1970-01-01 00:00:00 +0000 differ
1031=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_06_pc.png'
1032Binary files data/tribes/workers/barbarians/carrier/walk_sw_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_06_pc.png 1970-01-01 00:00:00 +0000 differ
1033=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_07.png'
1034Binary files data/tribes/workers/barbarians/carrier/walk_sw_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_07.png 1970-01-01 00:00:00 +0000 differ
1035=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_07_pc.png'
1036Binary files data/tribes/workers/barbarians/carrier/walk_sw_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_07_pc.png 1970-01-01 00:00:00 +0000 differ
1037=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_08.png'
1038Binary files data/tribes/workers/barbarians/carrier/walk_sw_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_08.png 1970-01-01 00:00:00 +0000 differ
1039=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_08_pc.png'
1040Binary files data/tribes/workers/barbarians/carrier/walk_sw_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_08_pc.png 1970-01-01 00:00:00 +0000 differ
1041=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_09.png'
1042Binary files data/tribes/workers/barbarians/carrier/walk_sw_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_09.png 1970-01-01 00:00:00 +0000 differ
1043=== removed file 'data/tribes/workers/barbarians/carrier/walk_sw_09_pc.png'
1044Binary files data/tribes/workers/barbarians/carrier/walk_sw_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_09_pc.png 1970-01-01 00:00:00 +0000 differ
1045=== added file 'data/tribes/workers/barbarians/carrier/walk_sw_1.png'
1046Binary files data/tribes/workers/barbarians/carrier/walk_sw_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_1.png 2019-09-08 20:16:16 +0000 differ
1047=== added file 'data/tribes/workers/barbarians/carrier/walk_sw_1_pc.png'
1048Binary files data/tribes/workers/barbarians/carrier/walk_sw_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_sw_1_pc.png 2019-09-08 20:16:16 +0000 differ
1049=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_00.png'
1050Binary files data/tribes/workers/barbarians/carrier/walk_w_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_00.png 1970-01-01 00:00:00 +0000 differ
1051=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_00_pc.png'
1052Binary files data/tribes/workers/barbarians/carrier/walk_w_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_00_pc.png 1970-01-01 00:00:00 +0000 differ
1053=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_01.png'
1054Binary files data/tribes/workers/barbarians/carrier/walk_w_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_01.png 1970-01-01 00:00:00 +0000 differ
1055=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_01_pc.png'
1056Binary files data/tribes/workers/barbarians/carrier/walk_w_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_01_pc.png 1970-01-01 00:00:00 +0000 differ
1057=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_02.png'
1058Binary files data/tribes/workers/barbarians/carrier/walk_w_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_02.png 1970-01-01 00:00:00 +0000 differ
1059=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_02_pc.png'
1060Binary files data/tribes/workers/barbarians/carrier/walk_w_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_02_pc.png 1970-01-01 00:00:00 +0000 differ
1061=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_03.png'
1062Binary files data/tribes/workers/barbarians/carrier/walk_w_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_03.png 1970-01-01 00:00:00 +0000 differ
1063=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_03_pc.png'
1064Binary files data/tribes/workers/barbarians/carrier/walk_w_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_03_pc.png 1970-01-01 00:00:00 +0000 differ
1065=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_04.png'
1066Binary files data/tribes/workers/barbarians/carrier/walk_w_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_04.png 1970-01-01 00:00:00 +0000 differ
1067=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_04_pc.png'
1068Binary files data/tribes/workers/barbarians/carrier/walk_w_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_04_pc.png 1970-01-01 00:00:00 +0000 differ
1069=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_05.png'
1070Binary files data/tribes/workers/barbarians/carrier/walk_w_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_05.png 1970-01-01 00:00:00 +0000 differ
1071=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_05_pc.png'
1072Binary files data/tribes/workers/barbarians/carrier/walk_w_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_05_pc.png 1970-01-01 00:00:00 +0000 differ
1073=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_06.png'
1074Binary files data/tribes/workers/barbarians/carrier/walk_w_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_06.png 1970-01-01 00:00:00 +0000 differ
1075=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_06_pc.png'
1076Binary files data/tribes/workers/barbarians/carrier/walk_w_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_06_pc.png 1970-01-01 00:00:00 +0000 differ
1077=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_07.png'
1078Binary files data/tribes/workers/barbarians/carrier/walk_w_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_07.png 1970-01-01 00:00:00 +0000 differ
1079=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_07_pc.png'
1080Binary files data/tribes/workers/barbarians/carrier/walk_w_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_07_pc.png 1970-01-01 00:00:00 +0000 differ
1081=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_08.png'
1082Binary files data/tribes/workers/barbarians/carrier/walk_w_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_08.png 1970-01-01 00:00:00 +0000 differ
1083=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_08_pc.png'
1084Binary files data/tribes/workers/barbarians/carrier/walk_w_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_08_pc.png 1970-01-01 00:00:00 +0000 differ
1085=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_09.png'
1086Binary files data/tribes/workers/barbarians/carrier/walk_w_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_09.png 1970-01-01 00:00:00 +0000 differ
1087=== removed file 'data/tribes/workers/barbarians/carrier/walk_w_09_pc.png'
1088Binary files data/tribes/workers/barbarians/carrier/walk_w_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walk_w_09_pc.png 1970-01-01 00:00:00 +0000 differ
1089=== added file 'data/tribes/workers/barbarians/carrier/walk_w_1.png'
1090Binary files data/tribes/workers/barbarians/carrier/walk_w_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_w_1.png 2019-09-08 20:16:16 +0000 differ
1091=== added file 'data/tribes/workers/barbarians/carrier/walk_w_1_pc.png'
1092Binary files data/tribes/workers/barbarians/carrier/walk_w_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walk_w_1_pc.png 2019-09-08 20:16:16 +0000 differ
1093=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_00.png'
1094Binary files data/tribes/workers/barbarians/carrier/walkload_e_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_00.png 1970-01-01 00:00:00 +0000 differ
1095=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_00_pc.png'
1096Binary files data/tribes/workers/barbarians/carrier/walkload_e_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_00_pc.png 1970-01-01 00:00:00 +0000 differ
1097=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_01.png'
1098Binary files data/tribes/workers/barbarians/carrier/walkload_e_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_01.png 1970-01-01 00:00:00 +0000 differ
1099=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_01_pc.png'
1100Binary files data/tribes/workers/barbarians/carrier/walkload_e_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_01_pc.png 1970-01-01 00:00:00 +0000 differ
1101=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_02.png'
1102Binary files data/tribes/workers/barbarians/carrier/walkload_e_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_02.png 1970-01-01 00:00:00 +0000 differ
1103=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_02_pc.png'
1104Binary files data/tribes/workers/barbarians/carrier/walkload_e_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_02_pc.png 1970-01-01 00:00:00 +0000 differ
1105=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_03.png'
1106Binary files data/tribes/workers/barbarians/carrier/walkload_e_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_03.png 1970-01-01 00:00:00 +0000 differ
1107=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_03_pc.png'
1108Binary files data/tribes/workers/barbarians/carrier/walkload_e_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_03_pc.png 1970-01-01 00:00:00 +0000 differ
1109=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_04.png'
1110Binary files data/tribes/workers/barbarians/carrier/walkload_e_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_04.png 1970-01-01 00:00:00 +0000 differ
1111=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_04_pc.png'
1112Binary files data/tribes/workers/barbarians/carrier/walkload_e_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_04_pc.png 1970-01-01 00:00:00 +0000 differ
1113=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_05.png'
1114Binary files data/tribes/workers/barbarians/carrier/walkload_e_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_05.png 1970-01-01 00:00:00 +0000 differ
1115=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_05_pc.png'
1116Binary files data/tribes/workers/barbarians/carrier/walkload_e_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_05_pc.png 1970-01-01 00:00:00 +0000 differ
1117=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_06.png'
1118Binary files data/tribes/workers/barbarians/carrier/walkload_e_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_06.png 1970-01-01 00:00:00 +0000 differ
1119=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_06_pc.png'
1120Binary files data/tribes/workers/barbarians/carrier/walkload_e_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_06_pc.png 1970-01-01 00:00:00 +0000 differ
1121=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_07.png'
1122Binary files data/tribes/workers/barbarians/carrier/walkload_e_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_07.png 1970-01-01 00:00:00 +0000 differ
1123=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_07_pc.png'
1124Binary files data/tribes/workers/barbarians/carrier/walkload_e_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_07_pc.png 1970-01-01 00:00:00 +0000 differ
1125=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_08.png'
1126Binary files data/tribes/workers/barbarians/carrier/walkload_e_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_08.png 1970-01-01 00:00:00 +0000 differ
1127=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_08_pc.png'
1128Binary files data/tribes/workers/barbarians/carrier/walkload_e_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_08_pc.png 1970-01-01 00:00:00 +0000 differ
1129=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_09.png'
1130Binary files data/tribes/workers/barbarians/carrier/walkload_e_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_09.png 1970-01-01 00:00:00 +0000 differ
1131=== removed file 'data/tribes/workers/barbarians/carrier/walkload_e_09_pc.png'
1132Binary files data/tribes/workers/barbarians/carrier/walkload_e_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_09_pc.png 1970-01-01 00:00:00 +0000 differ
1133=== added file 'data/tribes/workers/barbarians/carrier/walkload_e_1.png'
1134Binary files data/tribes/workers/barbarians/carrier/walkload_e_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_1.png 2019-09-08 20:16:16 +0000 differ
1135=== added file 'data/tribes/workers/barbarians/carrier/walkload_e_1_pc.png'
1136Binary files data/tribes/workers/barbarians/carrier/walkload_e_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_e_1_pc.png 2019-09-08 20:16:16 +0000 differ
1137=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_00.png'
1138Binary files data/tribes/workers/barbarians/carrier/walkload_ne_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_00.png 1970-01-01 00:00:00 +0000 differ
1139=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_00_pc.png'
1140Binary files data/tribes/workers/barbarians/carrier/walkload_ne_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_00_pc.png 1970-01-01 00:00:00 +0000 differ
1141=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_01.png'
1142Binary files data/tribes/workers/barbarians/carrier/walkload_ne_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_01.png 1970-01-01 00:00:00 +0000 differ
1143=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_01_pc.png'
1144Binary files data/tribes/workers/barbarians/carrier/walkload_ne_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_01_pc.png 1970-01-01 00:00:00 +0000 differ
1145=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_02.png'
1146Binary files data/tribes/workers/barbarians/carrier/walkload_ne_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_02.png 1970-01-01 00:00:00 +0000 differ
1147=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_02_pc.png'
1148Binary files data/tribes/workers/barbarians/carrier/walkload_ne_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_02_pc.png 1970-01-01 00:00:00 +0000 differ
1149=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_03.png'
1150Binary files data/tribes/workers/barbarians/carrier/walkload_ne_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_03.png 1970-01-01 00:00:00 +0000 differ
1151=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_03_pc.png'
1152Binary files data/tribes/workers/barbarians/carrier/walkload_ne_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_03_pc.png 1970-01-01 00:00:00 +0000 differ
1153=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_04.png'
1154Binary files data/tribes/workers/barbarians/carrier/walkload_ne_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_04.png 1970-01-01 00:00:00 +0000 differ
1155=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_04_pc.png'
1156Binary files data/tribes/workers/barbarians/carrier/walkload_ne_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_04_pc.png 1970-01-01 00:00:00 +0000 differ
1157=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_05.png'
1158Binary files data/tribes/workers/barbarians/carrier/walkload_ne_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_05.png 1970-01-01 00:00:00 +0000 differ
1159=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_05_pc.png'
1160Binary files data/tribes/workers/barbarians/carrier/walkload_ne_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_05_pc.png 1970-01-01 00:00:00 +0000 differ
1161=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_06.png'
1162Binary files data/tribes/workers/barbarians/carrier/walkload_ne_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_06.png 1970-01-01 00:00:00 +0000 differ
1163=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_06_pc.png'
1164Binary files data/tribes/workers/barbarians/carrier/walkload_ne_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_06_pc.png 1970-01-01 00:00:00 +0000 differ
1165=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_07.png'
1166Binary files data/tribes/workers/barbarians/carrier/walkload_ne_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_07.png 1970-01-01 00:00:00 +0000 differ
1167=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_07_pc.png'
1168Binary files data/tribes/workers/barbarians/carrier/walkload_ne_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_07_pc.png 1970-01-01 00:00:00 +0000 differ
1169=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_08.png'
1170Binary files data/tribes/workers/barbarians/carrier/walkload_ne_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_08.png 1970-01-01 00:00:00 +0000 differ
1171=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_08_pc.png'
1172Binary files data/tribes/workers/barbarians/carrier/walkload_ne_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_08_pc.png 1970-01-01 00:00:00 +0000 differ
1173=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_09.png'
1174Binary files data/tribes/workers/barbarians/carrier/walkload_ne_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_09.png 1970-01-01 00:00:00 +0000 differ
1175=== removed file 'data/tribes/workers/barbarians/carrier/walkload_ne_09_pc.png'
1176Binary files data/tribes/workers/barbarians/carrier/walkload_ne_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_09_pc.png 1970-01-01 00:00:00 +0000 differ
1177=== added file 'data/tribes/workers/barbarians/carrier/walkload_ne_1.png'
1178Binary files data/tribes/workers/barbarians/carrier/walkload_ne_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_1.png 2019-09-08 20:16:16 +0000 differ
1179=== added file 'data/tribes/workers/barbarians/carrier/walkload_ne_1_pc.png'
1180Binary files data/tribes/workers/barbarians/carrier/walkload_ne_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_ne_1_pc.png 2019-09-08 20:16:16 +0000 differ
1181=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_00.png'
1182Binary files data/tribes/workers/barbarians/carrier/walkload_nw_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_00.png 1970-01-01 00:00:00 +0000 differ
1183=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_00_pc.png'
1184Binary files data/tribes/workers/barbarians/carrier/walkload_nw_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_00_pc.png 1970-01-01 00:00:00 +0000 differ
1185=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_01.png'
1186Binary files data/tribes/workers/barbarians/carrier/walkload_nw_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_01.png 1970-01-01 00:00:00 +0000 differ
1187=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_01_pc.png'
1188Binary files data/tribes/workers/barbarians/carrier/walkload_nw_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_01_pc.png 1970-01-01 00:00:00 +0000 differ
1189=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_02.png'
1190Binary files data/tribes/workers/barbarians/carrier/walkload_nw_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_02.png 1970-01-01 00:00:00 +0000 differ
1191=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_02_pc.png'
1192Binary files data/tribes/workers/barbarians/carrier/walkload_nw_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_02_pc.png 1970-01-01 00:00:00 +0000 differ
1193=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_03.png'
1194Binary files data/tribes/workers/barbarians/carrier/walkload_nw_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_03.png 1970-01-01 00:00:00 +0000 differ
1195=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_03_pc.png'
1196Binary files data/tribes/workers/barbarians/carrier/walkload_nw_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_03_pc.png 1970-01-01 00:00:00 +0000 differ
1197=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_04.png'
1198Binary files data/tribes/workers/barbarians/carrier/walkload_nw_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_04.png 1970-01-01 00:00:00 +0000 differ
1199=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_04_pc.png'
1200Binary files data/tribes/workers/barbarians/carrier/walkload_nw_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_04_pc.png 1970-01-01 00:00:00 +0000 differ
1201=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_05.png'
1202Binary files data/tribes/workers/barbarians/carrier/walkload_nw_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_05.png 1970-01-01 00:00:00 +0000 differ
1203=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_05_pc.png'
1204Binary files data/tribes/workers/barbarians/carrier/walkload_nw_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_05_pc.png 1970-01-01 00:00:00 +0000 differ
1205=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_06.png'
1206Binary files data/tribes/workers/barbarians/carrier/walkload_nw_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_06.png 1970-01-01 00:00:00 +0000 differ
1207=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_06_pc.png'
1208Binary files data/tribes/workers/barbarians/carrier/walkload_nw_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_06_pc.png 1970-01-01 00:00:00 +0000 differ
1209=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_07.png'
1210Binary files data/tribes/workers/barbarians/carrier/walkload_nw_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_07.png 1970-01-01 00:00:00 +0000 differ
1211=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_07_pc.png'
1212Binary files data/tribes/workers/barbarians/carrier/walkload_nw_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_07_pc.png 1970-01-01 00:00:00 +0000 differ
1213=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_08.png'
1214Binary files data/tribes/workers/barbarians/carrier/walkload_nw_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_08.png 1970-01-01 00:00:00 +0000 differ
1215=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_08_pc.png'
1216Binary files data/tribes/workers/barbarians/carrier/walkload_nw_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_08_pc.png 1970-01-01 00:00:00 +0000 differ
1217=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_09.png'
1218Binary files data/tribes/workers/barbarians/carrier/walkload_nw_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_09.png 1970-01-01 00:00:00 +0000 differ
1219=== removed file 'data/tribes/workers/barbarians/carrier/walkload_nw_09_pc.png'
1220Binary files data/tribes/workers/barbarians/carrier/walkload_nw_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_09_pc.png 1970-01-01 00:00:00 +0000 differ
1221=== added file 'data/tribes/workers/barbarians/carrier/walkload_nw_1.png'
1222Binary files data/tribes/workers/barbarians/carrier/walkload_nw_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_1.png 2019-09-08 20:16:16 +0000 differ
1223=== added file 'data/tribes/workers/barbarians/carrier/walkload_nw_1_pc.png'
1224Binary files data/tribes/workers/barbarians/carrier/walkload_nw_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_nw_1_pc.png 2019-09-08 20:16:16 +0000 differ
1225=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_00.png'
1226Binary files data/tribes/workers/barbarians/carrier/walkload_se_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_00.png 1970-01-01 00:00:00 +0000 differ
1227=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_00_pc.png'
1228Binary files data/tribes/workers/barbarians/carrier/walkload_se_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_00_pc.png 1970-01-01 00:00:00 +0000 differ
1229=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_01.png'
1230Binary files data/tribes/workers/barbarians/carrier/walkload_se_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_01.png 1970-01-01 00:00:00 +0000 differ
1231=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_01_pc.png'
1232Binary files data/tribes/workers/barbarians/carrier/walkload_se_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_01_pc.png 1970-01-01 00:00:00 +0000 differ
1233=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_02.png'
1234Binary files data/tribes/workers/barbarians/carrier/walkload_se_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_02.png 1970-01-01 00:00:00 +0000 differ
1235=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_02_pc.png'
1236Binary files data/tribes/workers/barbarians/carrier/walkload_se_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_02_pc.png 1970-01-01 00:00:00 +0000 differ
1237=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_03.png'
1238Binary files data/tribes/workers/barbarians/carrier/walkload_se_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_03.png 1970-01-01 00:00:00 +0000 differ
1239=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_03_pc.png'
1240Binary files data/tribes/workers/barbarians/carrier/walkload_se_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_03_pc.png 1970-01-01 00:00:00 +0000 differ
1241=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_04.png'
1242Binary files data/tribes/workers/barbarians/carrier/walkload_se_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_04.png 1970-01-01 00:00:00 +0000 differ
1243=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_04_pc.png'
1244Binary files data/tribes/workers/barbarians/carrier/walkload_se_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_04_pc.png 1970-01-01 00:00:00 +0000 differ
1245=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_05.png'
1246Binary files data/tribes/workers/barbarians/carrier/walkload_se_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_05.png 1970-01-01 00:00:00 +0000 differ
1247=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_05_pc.png'
1248Binary files data/tribes/workers/barbarians/carrier/walkload_se_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_05_pc.png 1970-01-01 00:00:00 +0000 differ
1249=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_06.png'
1250Binary files data/tribes/workers/barbarians/carrier/walkload_se_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_06.png 1970-01-01 00:00:00 +0000 differ
1251=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_06_pc.png'
1252Binary files data/tribes/workers/barbarians/carrier/walkload_se_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_06_pc.png 1970-01-01 00:00:00 +0000 differ
1253=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_07.png'
1254Binary files data/tribes/workers/barbarians/carrier/walkload_se_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_07.png 1970-01-01 00:00:00 +0000 differ
1255=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_07_pc.png'
1256Binary files data/tribes/workers/barbarians/carrier/walkload_se_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_07_pc.png 1970-01-01 00:00:00 +0000 differ
1257=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_08.png'
1258Binary files data/tribes/workers/barbarians/carrier/walkload_se_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_08.png 1970-01-01 00:00:00 +0000 differ
1259=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_08_pc.png'
1260Binary files data/tribes/workers/barbarians/carrier/walkload_se_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_08_pc.png 1970-01-01 00:00:00 +0000 differ
1261=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_09.png'
1262Binary files data/tribes/workers/barbarians/carrier/walkload_se_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_09.png 1970-01-01 00:00:00 +0000 differ
1263=== removed file 'data/tribes/workers/barbarians/carrier/walkload_se_09_pc.png'
1264Binary files data/tribes/workers/barbarians/carrier/walkload_se_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_09_pc.png 1970-01-01 00:00:00 +0000 differ
1265=== added file 'data/tribes/workers/barbarians/carrier/walkload_se_1.png'
1266Binary files data/tribes/workers/barbarians/carrier/walkload_se_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_1.png 2019-09-08 20:16:16 +0000 differ
1267=== added file 'data/tribes/workers/barbarians/carrier/walkload_se_1_pc.png'
1268Binary files data/tribes/workers/barbarians/carrier/walkload_se_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_se_1_pc.png 2019-09-08 20:16:16 +0000 differ
1269=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_00.png'
1270Binary files data/tribes/workers/barbarians/carrier/walkload_sw_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_00.png 1970-01-01 00:00:00 +0000 differ
1271=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_00_pc.png'
1272Binary files data/tribes/workers/barbarians/carrier/walkload_sw_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_00_pc.png 1970-01-01 00:00:00 +0000 differ
1273=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_01.png'
1274Binary files data/tribes/workers/barbarians/carrier/walkload_sw_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_01.png 1970-01-01 00:00:00 +0000 differ
1275=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_01_pc.png'
1276Binary files data/tribes/workers/barbarians/carrier/walkload_sw_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_01_pc.png 1970-01-01 00:00:00 +0000 differ
1277=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_02.png'
1278Binary files data/tribes/workers/barbarians/carrier/walkload_sw_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_02.png 1970-01-01 00:00:00 +0000 differ
1279=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_02_pc.png'
1280Binary files data/tribes/workers/barbarians/carrier/walkload_sw_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_02_pc.png 1970-01-01 00:00:00 +0000 differ
1281=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_03.png'
1282Binary files data/tribes/workers/barbarians/carrier/walkload_sw_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_03.png 1970-01-01 00:00:00 +0000 differ
1283=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_03_pc.png'
1284Binary files data/tribes/workers/barbarians/carrier/walkload_sw_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_03_pc.png 1970-01-01 00:00:00 +0000 differ
1285=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_04.png'
1286Binary files data/tribes/workers/barbarians/carrier/walkload_sw_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_04.png 1970-01-01 00:00:00 +0000 differ
1287=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_04_pc.png'
1288Binary files data/tribes/workers/barbarians/carrier/walkload_sw_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_04_pc.png 1970-01-01 00:00:00 +0000 differ
1289=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_05.png'
1290Binary files data/tribes/workers/barbarians/carrier/walkload_sw_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_05.png 1970-01-01 00:00:00 +0000 differ
1291=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_05_pc.png'
1292Binary files data/tribes/workers/barbarians/carrier/walkload_sw_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_05_pc.png 1970-01-01 00:00:00 +0000 differ
1293=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_06.png'
1294Binary files data/tribes/workers/barbarians/carrier/walkload_sw_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_06.png 1970-01-01 00:00:00 +0000 differ
1295=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_06_pc.png'
1296Binary files data/tribes/workers/barbarians/carrier/walkload_sw_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_06_pc.png 1970-01-01 00:00:00 +0000 differ
1297=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_07.png'
1298Binary files data/tribes/workers/barbarians/carrier/walkload_sw_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_07.png 1970-01-01 00:00:00 +0000 differ
1299=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_07_pc.png'
1300Binary files data/tribes/workers/barbarians/carrier/walkload_sw_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_07_pc.png 1970-01-01 00:00:00 +0000 differ
1301=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_08.png'
1302Binary files data/tribes/workers/barbarians/carrier/walkload_sw_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_08.png 1970-01-01 00:00:00 +0000 differ
1303=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_08_pc.png'
1304Binary files data/tribes/workers/barbarians/carrier/walkload_sw_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_08_pc.png 1970-01-01 00:00:00 +0000 differ
1305=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_09.png'
1306Binary files data/tribes/workers/barbarians/carrier/walkload_sw_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_09.png 1970-01-01 00:00:00 +0000 differ
1307=== removed file 'data/tribes/workers/barbarians/carrier/walkload_sw_09_pc.png'
1308Binary files data/tribes/workers/barbarians/carrier/walkload_sw_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_09_pc.png 1970-01-01 00:00:00 +0000 differ
1309=== added file 'data/tribes/workers/barbarians/carrier/walkload_sw_1.png'
1310Binary files data/tribes/workers/barbarians/carrier/walkload_sw_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_1.png 2019-09-08 20:16:16 +0000 differ
1311=== added file 'data/tribes/workers/barbarians/carrier/walkload_sw_1_pc.png'
1312Binary files data/tribes/workers/barbarians/carrier/walkload_sw_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_sw_1_pc.png 2019-09-08 20:16:16 +0000 differ
1313=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_00.png'
1314Binary files data/tribes/workers/barbarians/carrier/walkload_w_00.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_00.png 1970-01-01 00:00:00 +0000 differ
1315=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_00_pc.png'
1316Binary files data/tribes/workers/barbarians/carrier/walkload_w_00_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_00_pc.png 1970-01-01 00:00:00 +0000 differ
1317=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_01.png'
1318Binary files data/tribes/workers/barbarians/carrier/walkload_w_01.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_01.png 1970-01-01 00:00:00 +0000 differ
1319=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_01_pc.png'
1320Binary files data/tribes/workers/barbarians/carrier/walkload_w_01_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_01_pc.png 1970-01-01 00:00:00 +0000 differ
1321=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_02.png'
1322Binary files data/tribes/workers/barbarians/carrier/walkload_w_02.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_02.png 1970-01-01 00:00:00 +0000 differ
1323=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_02_pc.png'
1324Binary files data/tribes/workers/barbarians/carrier/walkload_w_02_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_02_pc.png 1970-01-01 00:00:00 +0000 differ
1325=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_03.png'
1326Binary files data/tribes/workers/barbarians/carrier/walkload_w_03.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_03.png 1970-01-01 00:00:00 +0000 differ
1327=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_03_pc.png'
1328Binary files data/tribes/workers/barbarians/carrier/walkload_w_03_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_03_pc.png 1970-01-01 00:00:00 +0000 differ
1329=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_04.png'
1330Binary files data/tribes/workers/barbarians/carrier/walkload_w_04.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_04.png 1970-01-01 00:00:00 +0000 differ
1331=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_04_pc.png'
1332Binary files data/tribes/workers/barbarians/carrier/walkload_w_04_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_04_pc.png 1970-01-01 00:00:00 +0000 differ
1333=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_05.png'
1334Binary files data/tribes/workers/barbarians/carrier/walkload_w_05.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_05.png 1970-01-01 00:00:00 +0000 differ
1335=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_05_pc.png'
1336Binary files data/tribes/workers/barbarians/carrier/walkload_w_05_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_05_pc.png 1970-01-01 00:00:00 +0000 differ
1337=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_06.png'
1338Binary files data/tribes/workers/barbarians/carrier/walkload_w_06.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_06.png 1970-01-01 00:00:00 +0000 differ
1339=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_06_pc.png'
1340Binary files data/tribes/workers/barbarians/carrier/walkload_w_06_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_06_pc.png 1970-01-01 00:00:00 +0000 differ
1341=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_07.png'
1342Binary files data/tribes/workers/barbarians/carrier/walkload_w_07.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_07.png 1970-01-01 00:00:00 +0000 differ
1343=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_07_pc.png'
1344Binary files data/tribes/workers/barbarians/carrier/walkload_w_07_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_07_pc.png 1970-01-01 00:00:00 +0000 differ
1345=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_08.png'
1346Binary files data/tribes/workers/barbarians/carrier/walkload_w_08.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_08.png 1970-01-01 00:00:00 +0000 differ
1347=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_08_pc.png'
1348Binary files data/tribes/workers/barbarians/carrier/walkload_w_08_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_08_pc.png 1970-01-01 00:00:00 +0000 differ
1349=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_09.png'
1350Binary files data/tribes/workers/barbarians/carrier/walkload_w_09.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_09.png 1970-01-01 00:00:00 +0000 differ
1351=== removed file 'data/tribes/workers/barbarians/carrier/walkload_w_09_pc.png'
1352Binary files data/tribes/workers/barbarians/carrier/walkload_w_09_pc.png 2019-03-30 06:46:25 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_09_pc.png 1970-01-01 00:00:00 +0000 differ
1353=== added file 'data/tribes/workers/barbarians/carrier/walkload_w_1.png'
1354Binary files data/tribes/workers/barbarians/carrier/walkload_w_1.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_1.png 2019-09-08 20:16:16 +0000 differ
1355=== added file 'data/tribes/workers/barbarians/carrier/walkload_w_1_pc.png'
1356Binary files data/tribes/workers/barbarians/carrier/walkload_w_1_pc.png 1970-01-01 00:00:00 +0000 and data/tribes/workers/barbarians/carrier/walkload_w_1_pc.png 2019-09-08 20:16:16 +0000 differ
1357=== modified file 'doc/sphinx/source/animations.rst'
1358--- doc/sphinx/source/animations.rst 2019-05-25 08:51:42 +0000
1359+++ doc/sphinx/source/animations.rst 2019-09-08 20:16:16 +0000
1360@@ -7,10 +7,20 @@
1361 For information on how to create the animations' images with Blender, see
1362 `GraphicsDevelopment <https://wl.widelands.org/wiki/GraphicsDevelopment/>`_.
1363
1364+The Blender export will give you a list of files for each animation.
1365+We call this a "file" animation.
1366+Once you have tested your animation in Widelands and are satisfied with the results,
1367+we recommend that you convert it to a :ref:`spritesheet <animations_spritesheets>`.
1368+This will save disk space and make animation loading faster.
1369+
1370 Animations are defined as `Lua tables <http://lua-users.org/wiki/TablesTutorial>`_.
1371 All :ref:`map objects <animations_map_object_types>` have a mandatory ``idle`` animation.
1372 They can then have further animations, depending on what their specific capabilities are.
1373
1374+
1375+File Animations
1376+---------------
1377+
1378 We recommend that you use the :ref:`animations_convenience_functions` below for
1379 the Lua coding, but let's look at an example first to understand which options
1380 are available, and what your image files need to look like:
1381@@ -90,6 +100,71 @@
1382 ``walk_ne_1_01.png`` etc. for scale `1` and so on.
1383
1384
1385+.. _animations_spritesheets:
1386+
1387+Spritesheet Animations
1388+----------------------
1389+
1390+The same map object can have a mix of file and spritesheet animations.
1391+For converting a file animation to a spritesheet animation, use the command line
1392+to call ``./wl_create_spritesheet`` from the Widelands program directory.
1393+This will print the command line options to use for converting your animation.
1394+
1395+After conversion, you will need to delete the old files and copy over the new files,
1396+then delete the old animation code in the map object's ``init.lua`` file and add the new code.
1397+The tool will print the new code to the console for you, so all you need to do is copy/paste
1398+and then add any missing optional parameters back in.
1399+
1400+Note that except for flag and frontier animations, the table for spritesheets is
1401+called ``spritesheets``, not ``animations``!
1402+This distinction is necessary for performance reasons.
1403+
1404+Spritesheets have three additional mandatory parameters so that the engine can
1405+identify the individual textures in the sheet:
1406+
1407+**frames**
1408+ The number of frames (images) that this animation has. Equal to the number of
1409+ files in a file animation.
1410+
1411+**columns**
1412+ The number of image columns in the spritesheet.
1413+
1414+**rows**
1415+ The number of image rows in the spritesheet.
1416+
1417+
1418+Here's the example from above as spritesheets:
1419+
1420+.. code-block:: lua
1421+
1422+ spritesheets = {
1423+ idle = {
1424+ directory = path.dirname(__file__),
1425+ basename = "idle",
1426+ fps = 4,
1427+ frames = 150,
1428+ rows = 13,
1429+ columns = 12,
1430+ hotspot = { 5, 7 }
1431+ sound_effect = {
1432+ path = "sound/foo/bar",
1433+ priority = 128
1434+ },
1435+ representative_frame = 3,
1436+ },
1437+ walk = {
1438+ directory = path.dirname(__file__),
1439+ basename = "walk",
1440+ fps = 4,
1441+ frames = 10,
1442+ rows = 4,
1443+ columns = 3,
1444+ directional = true,
1445+ hotspot = { 5, 7 }
1446+ },
1447+ ...
1448+ }
1449+
1450
1451 .. _animations_convenience_functions:
1452
1453
1454=== modified file 'src/graphic/CMakeLists.txt'
1455--- src/graphic/CMakeLists.txt 2019-06-01 14:07:35 +0000
1456+++ src/graphic/CMakeLists.txt 2019-09-08 20:16:16 +0000
1457@@ -1,3 +1,4 @@
1458+add_subdirectory(animation)
1459 add_subdirectory(styles)
1460 add_subdirectory(text)
1461
1462@@ -310,10 +311,7 @@
1463
1464 wl_library(graphic
1465 SRCS
1466- animation.cc
1467- animation.h
1468 default_resolution.h
1469- diranimations.h
1470 graphic.cc
1471 graphic.h
1472 style_manager.cc
1473@@ -330,25 +328,21 @@
1474 base_scoped_timer
1475 build_info
1476 graphic_align
1477+ graphic_animation
1478 graphic_build_texture_atlas
1479 graphic_color
1480 graphic_draw_programs
1481 graphic_gl_utils
1482 graphic_image_cache
1483 graphic_image_io
1484- graphic_playercolor
1485 graphic_render_queue
1486 graphic_styles
1487 graphic_surface
1488 io_filesystem
1489 io_stream
1490- logic_constants
1491- logic_exceptions
1492 logic_widelands_geometry
1493- note_sound
1494 notifications
1495 scripting_lua_interface
1496 scripting_lua_table
1497- sound
1498 )
1499
1500
1501=== added directory 'src/graphic/animation'
1502=== added file 'src/graphic/animation/CMakeLists.txt'
1503--- src/graphic/animation/CMakeLists.txt 1970-01-01 00:00:00 +0000
1504+++ src/graphic/animation/CMakeLists.txt 2019-09-08 20:16:16 +0000
1505@@ -0,0 +1,28 @@
1506+wl_library(graphic_animation
1507+ SRCS
1508+ animation.cc
1509+ animation.h
1510+ animation_manager.cc
1511+ animation_manager.h
1512+ diranimations.h
1513+ diranimations.cc
1514+ nonpacked_animation.cc
1515+ nonpacked_animation.h
1516+ spritesheet_animation.cc
1517+ spritesheet_animation.h
1518+ DEPENDS
1519+ base_geometry
1520+ base_log
1521+ base_macros
1522+ graphic
1523+ graphic_color
1524+ graphic_playercolor
1525+ graphic_surface
1526+ io_filesystem
1527+ logic_constants
1528+ logic_exceptions
1529+ note_sound
1530+ scripting_lua_table
1531+ sound
1532+ sound_constants
1533+)
1534
1535=== added file 'src/graphic/animation/animation.cc'
1536--- src/graphic/animation/animation.cc 1970-01-01 00:00:00 +0000
1537+++ src/graphic/animation/animation.cc 2019-09-08 20:16:16 +0000
1538@@ -0,0 +1,195 @@
1539+/*
1540+ * Copyright (C) 2002-2019 by the Widelands Development Team
1541+ *
1542+ * This program is free software; you can redistribute it and/or
1543+ * modify it under the terms of the GNU General Public License
1544+ * as published by the Free Software Foundation; either version 2
1545+ * of the License, or (at your option) any later version.
1546+ *
1547+ * This program is distributed in the hope that it will be useful,
1548+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1549+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1550+ * GNU General Public License for more details.
1551+ *
1552+ * You should have received a copy of the GNU General Public License
1553+ * along with this program; if not, write to the Free Software
1554+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1555+ *
1556+ */
1557+
1558+#include "graphic/animation/animation.h"
1559+
1560+#include <cassert>
1561+#include <memory>
1562+
1563+#include "base/vector.h"
1564+#include "io/filesystem/layered_filesystem.h"
1565+#include "logic/game_data_error.h"
1566+#include "scripting/lua_table.h"
1567+#include "sound/note_sound.h"
1568+#include "sound/sound_handler.h"
1569+
1570+const std::map<float, std::string> Animation::kSupportedScales { {0.5, "_0.5"}, {1, "_1"}, {2, "_2"}, {4, "_4"}};
1571+
1572+Animation::MipMapEntry::MipMapEntry() : has_playercolor_masks(false) {
1573+}
1574+
1575+Animation::Animation(const LuaTable& table) :
1576+ representative_frame_(table.has_key("representative_frame") ? table.get_int("representative_frame") : 0),
1577+ hotspot_(table.get_vector<std::string, int>("hotspot")),
1578+ frametime_(table.has_key("fps") ? (1000 / get_positive_int(table, "fps")) : kFrameLength),
1579+ play_once_(table.has_key("play_once") ? table.get_bool("play_once") : false),
1580+ sound_effect_(kNoSoundEffect),
1581+ sound_priority_(kFxPriorityLowest) {
1582+ try {
1583+ // Sound
1584+ if (table.has_key("sound_effect")) {
1585+ std::unique_ptr<LuaTable> sound_effects = table.get_table("sound_effect");
1586+ sound_effect_ =
1587+ SoundHandler::register_fx(SoundType::kAmbient, sound_effects->get_string("path"));
1588+
1589+ if (sound_effects->has_key<std::string>("priority")) {
1590+ sound_priority_ = sound_effects->get_int("priority");
1591+ }
1592+
1593+ if (sound_priority_ < kFxPriorityLowest) {
1594+ throw Widelands::GameDataError(
1595+ "Minmum priority for sounds is %d, but only %d was specified for %s",
1596+ kFxPriorityLowest, sound_priority_, sound_effects->get_string("path").c_str());
1597+ }
1598+ }
1599+ } catch (const LuaError& e) {
1600+ throw wexception("Error in animation table: %s", e.what());
1601+ }
1602+ assert(frametime_ > 0);
1603+}
1604+
1605+const Animation::MipMapEntry& Animation::mipmap_entry(float scale) const {
1606+ assert(mipmaps_.count(scale) == 1);
1607+ const MipMapEntry& mipmap = *mipmaps_.at(scale);
1608+ mipmap.ensure_graphics_are_loaded();
1609+ return mipmap;
1610+}
1611+
1612+Rectf Animation::source_rectangle(const int percent_from_bottom, float scale) const {
1613+ const MipMapEntry& mipmap = mipmap_entry(find_best_scale(scale));
1614+ const float h = percent_from_bottom * mipmap.height() / 100;
1615+ // Using floor for pixel perfect positioning
1616+ return Rectf(0.f, std::floor(mipmap.height() - h), mipmap.width(), h);
1617+}
1618+
1619+Rectf Animation::destination_rectangle(const Vector2f& position,
1620+ const Rectf& source_rect,
1621+ const float scale) const {
1622+ const float best_scale = find_best_scale(scale);
1623+ return Rectf(position.x - (hotspot_.x - source_rect.x / best_scale) * scale,
1624+ position.y - (hotspot_.y - source_rect.y / best_scale) * scale,
1625+ source_rect.w * scale / best_scale, source_rect.h * scale / best_scale);
1626+}
1627+
1628+uint16_t Animation::nr_frames() const {
1629+ assert(nr_frames_ > 0);
1630+ return nr_frames_;
1631+}
1632+
1633+int Animation::height() const {
1634+ return mipmap_entry(1.0f).height();
1635+}
1636+
1637+int Animation::width() const {
1638+ return mipmap_entry(1.0f).width();
1639+}
1640+
1641+uint32_t Animation::frametime() const {
1642+ assert(frametime_ > 0);
1643+ return frametime_;
1644+}
1645+
1646+const Vector2i& Animation::hotspot() const {
1647+ return hotspot_;
1648+}
1649+
1650+uint32_t Animation::current_frame(uint32_t time) const {
1651+ if (nr_frames() > 1) {
1652+ return (play_once_ && time / frametime_ > static_cast<uint32_t>(nr_frames() - 1)) ?
1653+ static_cast<uint32_t>(nr_frames() - 1) :
1654+ time / frametime_ % nr_frames();
1655+ }
1656+ return 0;
1657+}
1658+
1659+void Animation::add_available_scales(const std::string& basename, const std::string& directory) {
1660+ for (const auto& scale : kSupportedScales) {
1661+ add_scale_if_files_present(basename, directory, scale.first, scale.second);
1662+ }
1663+
1664+ if (mipmaps_.count(1.0f) == 0) {
1665+ // There might be only 1 scale
1666+ add_scale_if_files_present(basename, directory, 1.0f, "");
1667+ if (mipmaps_.count(1.0f) == 0) {
1668+ // No files found at all
1669+ throw Widelands::GameDataError(
1670+ "Animation in directory '%s' with basename '%s' has no images for mandatory "
1671+ "scale '1' in mipmap - supported scales are: 0.5, 1, 2, 4",
1672+ directory.c_str(), basename.c_str());
1673+ }
1674+ }
1675+}
1676+
1677+// TODO(unknown): The chosen semantics of animation sound effects is problematic:
1678+// What if the game runs very slowly or very quickly?
1679+void Animation::trigger_sound(uint32_t time, const Widelands::Coords& coords) const {
1680+ if (sound_effect_ == kNoSoundEffect || coords == Widelands::Coords::null()) {
1681+ return;
1682+ }
1683+ if (current_frame(time) == 0) {
1684+ Notifications::publish(
1685+ NoteSound(SoundType::kAmbient, sound_effect_, coords, sound_priority_));
1686+ }
1687+}
1688+
1689+std::set<float> Animation::available_scales() const {
1690+ std::set<float> result;
1691+ for (const auto& scale : kSupportedScales) {
1692+ if (mipmaps_.count(scale.first) == 1) {
1693+ result.insert(scale.first);
1694+ }
1695+ }
1696+ return result;
1697+}
1698+
1699+void Animation::blit(uint32_t time,
1700+ const Widelands::Coords& coords,
1701+ const Rectf& source_rect,
1702+ const Rectf& destination_rect,
1703+ const RGBColor* clr,
1704+ Surface* target,
1705+ float scale) const {
1706+ mipmap_entry(find_best_scale(scale))
1707+ .blit(current_frame(time), source_rect, destination_rect, clr, target);
1708+ trigger_sound(time, coords);
1709+}
1710+
1711+void Animation::load_default_scale_and_sounds() const {
1712+ mipmaps_.at(1.0f)->ensure_graphics_are_loaded();
1713+ if (sound_effect_ != kNoSoundEffect && !SoundHandler::is_backend_disabled()) {
1714+ g_sh->load_fx(SoundType::kAmbient, sound_effect_);
1715+ }
1716+}
1717+
1718+float Animation::find_best_scale(float scale) const {
1719+ assert(!mipmaps_.empty());
1720+ float result = mipmaps_.begin()->first;
1721+ for (const auto& mipmap : mipmaps_) {
1722+ // The map is reverse sorted, so we can break as soon as we are lower than the wanted scale
1723+ if (mipmap.first < scale) {
1724+ break;
1725+ }
1726+ result = mipmap.first;
1727+ }
1728+ return result;
1729+}
1730+
1731+int Animation::representative_frame() const {
1732+ return representative_frame_;
1733+}
1734
1735=== renamed file 'src/graphic/animation.h' => 'src/graphic/animation/animation.h'
1736--- src/graphic/animation.h 2019-05-27 21:04:13 +0000
1737+++ src/graphic/animation/animation.h 2019-09-08 20:16:16 +0000
1738@@ -17,12 +17,12 @@
1739 *
1740 */
1741
1742-#ifndef WL_GRAPHIC_ANIMATION_H
1743-#define WL_GRAPHIC_ANIMATION_H
1744+#ifndef WL_GRAPHIC_ANIMATION_ANIMATION_H
1745+#define WL_GRAPHIC_ANIMATION_ANIMATION_H
1746
1747-#include <cstring>
1748 #include <map>
1749 #include <memory>
1750+#include <set>
1751 #include <string>
1752 #include <vector>
1753
1754@@ -31,16 +31,14 @@
1755 #include "base/macros.h"
1756 #include "base/rect.h"
1757 #include "base/vector.h"
1758+#include "graphic/color.h"
1759+#include "graphic/image.h"
1760 #include "graphic/surface.h"
1761-#include "logic/widelands_geometry.h"
1762-
1763-class Image;
1764-class LuaTable;
1765-class Surface;
1766-struct RGBColor;
1767-
1768-/// FRAME_LENGTH is the default animation speed
1769-constexpr int FRAME_LENGTH = 250;
1770+#include "scripting/lua_table.h"
1771+#include "sound/constants.h"
1772+
1773+/// The default animation speed
1774+constexpr int kFrameLength = 250;
1775
1776 /**
1777 * Representation of an Animation in the game. An animation is a looping set of
1778@@ -53,30 +51,44 @@
1779 */
1780 class Animation {
1781 public:
1782- Animation(int representative_frame) : representative_frame_(representative_frame) {
1783- }
1784- virtual ~Animation() {
1785- }
1786+ /// Whether we have an animation consisting of multiple files or of 1 single spritesheet file
1787+ enum class Type {
1788+ kFile,
1789+ kSpritesheet
1790+ };
1791+
1792+ /// The mipmap scales supported by the engine as float and filename suffix.
1793+ /// Ensure that this always matches supported_scales in data/scripting/mapobjects.lua.
1794+ static const std::map<float, std::string> kSupportedScales;
1795+ explicit Animation(const LuaTable& table);
1796+ virtual ~Animation() = default;
1797
1798 /// The height of this animation.
1799- virtual float height() const = 0;
1800+ int height() const;
1801+ /// The width of this animation.
1802+ int width() const;
1803+ /// The hotspot of this animation for aligning it on the map.
1804+ const Vector2i& hotspot() const;
1805+
1806+ /// The frame to be blitted for the given 'time'
1807+ uint32_t current_frame(uint32_t time) const;
1808
1809 /// The size of the animation source images in pixels. Use 'percent_from_bottom' to crop the
1810 /// animation.
1811- virtual Rectf source_rectangle(int percent_from_bottom, float scale) const = 0;
1812+ Rectf source_rectangle(int percent_from_bottom, float scale) const;
1813
1814 /// Calculates the destination rectangle for blitting the animation in pixels.
1815 /// 'position' is where the top left corner of the animation will end up,
1816 /// 'source_rect' is the rectangle calculated by source_rectangle,
1817 /// 'scale' is the zoom scale.
1818- virtual Rectf
1819- destination_rectangle(const Vector2f& position, const Rectf& source_rect, float scale) const = 0;
1820-
1821- /// The number of animation frames of this animation.
1822- virtual uint16_t nr_frames() const = 0;
1823-
1824- /// The number of milliseconds each frame will be displayed.
1825- virtual uint32_t frametime() const = 0;
1826+ Rectf
1827+ destination_rectangle(const Vector2f& position, const Rectf& source_rect, float scale) const;
1828+
1829+ /// The number of animation frames of this animation. Returns a positive integer.
1830+ uint16_t nr_frames() const;
1831+
1832+ /// The number of milliseconds each frame will be displayed. Returns a positive integer.
1833+ uint32_t frametime() const;
1834
1835 /// An image of the first frame, blended with the given player color.
1836 /// The 'clr' is the player color used for blending - the parameter can be
1837@@ -89,66 +101,107 @@
1838 /// The 'clr' is the player color used for blitting - the parameter can be 'nullptr',
1839 /// in which case the neutral image will be blitted. The Surface is the 'target'
1840 /// for the blit operation and must be non-null.
1841- virtual void blit(uint32_t time,
1842+ void blit(uint32_t time,
1843 const Widelands::Coords& coords,
1844 const Rectf& source_rect,
1845 const Rectf& destination_rect,
1846 const RGBColor* clr,
1847- Surface* target,
1848- float scale) const = 0;
1849+ Surface* target, float scale) const;
1850+
1851+ /// We need to expose these for the packed animation,
1852+ /// so that the create_spritesheet utility can use them.
1853+ /// Do not use otherwise.
1854+ virtual std::vector<const Image*> images(float scale) const = 0;
1855+ /// We need to expose these for the packed animation,
1856+ /// so that the create_spritemap utility can use them.
1857+ /// Do not use otherwise.
1858+ virtual std::vector<const Image*> pc_masks(float scale) const = 0;
1859+
1860+ /// The scales for which this animation has exact images.
1861+ std::set<float> available_scales() const;
1862
1863 /// Load animation images into memory for default scale.
1864- virtual void load_default_scale_and_sounds() const = 0;
1865+ void load_default_scale_and_sounds() const;
1866+
1867+ /// The frame to be shown in menus etc.
1868+ int representative_frame() const;
1869
1870 protected:
1871+ /// Animation data for a particular scale
1872+ struct MipMapEntry {
1873+
1874+ MipMapEntry();
1875+ virtual ~MipMapEntry() {}
1876+
1877+ /// Loads the graphics if they are not yet loaded.
1878+ virtual void ensure_graphics_are_loaded() const = 0;
1879+
1880+ /// Load the needed graphics from disk.
1881+ virtual void load_graphics() = 0;
1882+
1883+ /// Blit the frame at the given index
1884+ virtual void blit(uint32_t idx,
1885+ const Rectf& source_rect,
1886+ const Rectf& destination_rect,
1887+ const RGBColor* clr,
1888+ Surface* target) const = 0;
1889+
1890+ /// The width of this mipmap entry's textures
1891+ virtual int width() const = 0;
1892+ /// The height of this mipmap entry's textures
1893+ virtual int height() const = 0;
1894+
1895+ /// Whether this texture set has player color masks provided
1896+ bool has_playercolor_masks;
1897+ };
1898+
1899+ /// Register animations for the scales listed in kSupportedScales if available. The scale of 1.0 is mandatory.
1900+ void add_available_scales(const std::string& basename, const std::string& directory);
1901+
1902 /// Play the sound effect associated with this animation at the given time.
1903 /// Any sound effects are played with stereo position according to 'coords'.
1904 /// If 'coords' == Widelands::Coords::null(), skip playing any sound effects.
1905- virtual void trigger_sound(uint32_t time, const Widelands::Coords& coords) const = 0;
1906-
1907-protected:
1908+ void trigger_sound(uint32_t time, const Widelands::Coords& coords) const;
1909+
1910+ /// Ensures that the graphics are loaded before returning the entry
1911+ const Animation::MipMapEntry& mipmap_entry(float scale) const;
1912+
1913+ /// The number of textures this animation will play
1914+ uint16_t nr_frames_;
1915+
1916+ /// Reverse sort the zoom scales for faster lookup
1917+ struct MipMapCompare {
1918+ inline bool operator() (const float lhs, const float rhs) const
1919+ {return lhs > rhs;}
1920+ };
1921+ /// Texture sets for different zoom scales
1922+ std::map<float, std::unique_ptr<MipMapEntry>, MipMapCompare> mipmaps_;
1923+
1924+private:
1925+ DISALLOW_COPY_AND_ASSIGN(Animation);
1926+
1927+ /// Look for a file or files for the given scale, and if we have any, add a mipmap entry for them.
1928+ virtual void add_scale_if_files_present(const std::string& basename, const std::string& directory,
1929+ float scale_as_float, const std::string& scale_as_string) = 0;
1930+
1931+ /// Find the best scale for blitting at the given zoom 'scale'
1932+ float find_best_scale(float scale) const;
1933+
1934+ /// The frame to show in menus, in the in-game help etc.
1935 int representative_frame_;
1936
1937-private:
1938- DISALLOW_COPY_AND_ASSIGN(Animation);
1939-};
1940-
1941-/**
1942- * The animation manager manages a list of all active animations.
1943- */
1944-class AnimationManager {
1945-public:
1946- /**
1947- * Loads an animation, graphics sound and everything from a Lua table.
1948- *
1949- * The 'basename' is the filename prefix for loading the images, e.g. "idle" or "walk_ne".
1950- *
1951- * The Lua table must contain a table 'pictures' with image paths and a 'hotspot' table.
1952- *
1953- * Optional parameters in the Lua table are 'fps' and 'sound_effect'.
1954- */
1955- uint32_t load(const LuaTable& table, const std::string& basename);
1956- /// Same as above, but this animation will be used for getting a representative image by map
1957- /// object name
1958- uint32_t
1959- load(const std::string& map_object_name, const LuaTable& table, const std::string& basename);
1960-
1961- /// Returns the animation with the given ID or throws an exception if it is
1962- /// unknown.
1963- const Animation& get_animation(uint32_t id) const;
1964-
1965- /// Returns the representative image, using the given player color.
1966- /// If this image has been generated before, it is pulled from the cache using
1967- /// the clr argument that was used previously.
1968- const Image* get_representative_image(uint32_t id, const RGBColor* clr = nullptr);
1969- const Image* get_representative_image(const std::string& map_object_name,
1970- const RGBColor* clr = nullptr);
1971-
1972-private:
1973- std::vector<std::unique_ptr<Animation>> animations_;
1974- std::map<std::pair<uint32_t, const RGBColor*>, std::unique_ptr<const Image>>
1975- representative_images_;
1976- std::map<std::string, uint32_t> representative_animations_by_map_object_name_;
1977-};
1978-
1979-#endif // end of include guard: WL_GRAPHIC_ANIMATION_H
1980+ /// For aligning the image on the map
1981+ Vector2i hotspot_ = Vector2i::zero();
1982+
1983+ /// The length of each frame
1984+ const uint32_t frametime_;
1985+ /// If this is 'true', don't loop the animation
1986+ const bool play_once_;
1987+
1988+ /// ID of sound effect that will be played at frame 0, or kNoSoundEffect if there is no sound effect to be played.
1989+ FxId sound_effect_;
1990+ /// How likely it is that the sound effect will be played
1991+ int32_t sound_priority_;
1992+};
1993+
1994+#endif // end of include guard: WL_GRAPHIC_ANIMATION_ANIMATION_H
1995
1996=== added file 'src/graphic/animation/animation_manager.cc'
1997--- src/graphic/animation/animation_manager.cc 1970-01-01 00:00:00 +0000
1998+++ src/graphic/animation/animation_manager.cc 2019-09-08 20:16:16 +0000
1999@@ -0,0 +1,74 @@
2000+/*
2001+ * Copyright (C) 2002-2019 by the Widelands Development Team
2002+ *
2003+ * This program is free software; you can redistribute it and/or
2004+ * modify it under the terms of the GNU General Public License
2005+ * as published by the Free Software Foundation; either version 2
2006+ * of the License, or (at your option) any later version.
2007+ *
2008+ * This program is distributed in the hope that it will be useful,
2009+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2010+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2011+ * GNU General Public License for more details.
2012+ *
2013+ * You should have received a copy of the GNU General Public License
2014+ * along with this program; if not, write to the Free Software
2015+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2016+ *
2017+ */
2018+
2019+#include "graphic/animation/animation_manager.h"
2020+
2021+#include <memory>
2022+
2023+#include "graphic/animation/nonpacked_animation.h"
2024+#include "graphic/animation/spritesheet_animation.h"
2025+#include "graphic/graphic.h"
2026+
2027+
2028+uint32_t AnimationManager::load(const LuaTable& table, const std::string& basename, Animation::Type type) {
2029+ switch (type) {
2030+ case Animation::Type::kFile:
2031+ animations_.push_back(std::unique_ptr<Animation>(new NonPackedAnimation(table, basename)));
2032+ break;
2033+ case Animation::Type::kSpritesheet:
2034+ animations_.push_back(std::unique_ptr<Animation>(new SpriteSheetAnimation(table, basename)));
2035+ }
2036+ return animations_.size();
2037+}
2038+uint32_t AnimationManager::load(const std::string& map_object_name,
2039+ const LuaTable& table,
2040+ const std::string& basename, Animation::Type type) {
2041+ const size_t result = load(table, basename, type);
2042+ representative_animations_by_map_object_name_.insert(std::make_pair(map_object_name, result));
2043+ return result;
2044+}
2045+
2046+const Animation& AnimationManager::get_animation(uint32_t id) const {
2047+ if (!id || id > animations_.size()) {
2048+ throw wexception("Requested unknown animation with id: %i", id);
2049+ }
2050+ return *animations_[id - 1];
2051+}
2052+
2053+const Image* AnimationManager::get_representative_image(uint32_t id, const RGBColor* clr) {
2054+ const auto hash = std::make_pair(id, clr);
2055+ if (representative_images_.count(hash) != 1) {
2056+ representative_images_.insert(std::make_pair(
2057+ hash, std::unique_ptr<const Image>(
2058+ std::move(g_gr->animations().get_animation(id).representative_image(clr)))));
2059+ }
2060+ return representative_images_.at(hash).get();
2061+}
2062+
2063+const Image* AnimationManager::get_representative_image(const std::string& map_object_name,
2064+ const RGBColor* clr) {
2065+ if (representative_animations_by_map_object_name_.count(map_object_name) != 1) {
2066+ log("Warning: %s has no animation assigned for its representative image, or it's not a known "
2067+ "map object\n",
2068+ map_object_name.c_str());
2069+ return new Texture(0, 0);
2070+ }
2071+ return get_representative_image(
2072+ representative_animations_by_map_object_name_.at(map_object_name), clr);
2073+}
2074
2075=== added file 'src/graphic/animation/animation_manager.h'
2076--- src/graphic/animation/animation_manager.h 1970-01-01 00:00:00 +0000
2077+++ src/graphic/animation/animation_manager.h 2019-09-08 20:16:16 +0000
2078@@ -0,0 +1,73 @@
2079+/*
2080+ * Copyright (C) 2002-2019 by the Widelands Development Team
2081+ *
2082+ * This program is free software; you can redistribute it and/or
2083+ * modify it under the terms of the GNU General Public License
2084+ * as published by the Free Software Foundation; either version 2
2085+ * of the License, or (at your option) any later version.
2086+ *
2087+ * This program is distributed in the hope that it will be useful,
2088+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2089+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2090+ * GNU General Public License for more details.
2091+ *
2092+ * You should have received a copy of the GNU General Public License
2093+ * along with this program; if not, write to the Free Software
2094+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2095+ *
2096+ */
2097+
2098+#ifndef WL_GRAPHIC_ANIMATION_ANIMATION_MANAGER_H
2099+#define WL_GRAPHIC_ANIMATION_ANIMATION_MANAGER_H
2100+
2101+#include <map>
2102+#include <memory>
2103+#include <vector>
2104+
2105+#include "graphic/animation/animation.h"
2106+#include "graphic/color.h"
2107+#include "graphic/image.h"
2108+#include "scripting/lua_table.h"
2109+
2110+/**
2111+* The animation manager manages a list of all active animations.
2112+*/
2113+class AnimationManager {
2114+public:
2115+ /**
2116+ * Loads an animation, graphics sound and everything from a Lua table.
2117+ * For the contents of the Lua table, cf. doc/sphinx/source/animations.rst or https://www.widelands.org/documentation/animations/.
2118+ *
2119+ * The 'basename' is the filename prefix for loading the images, e.g. "idle" or "walk_ne".
2120+ */
2121+ uint32_t load(const LuaTable& table, const std::string& basename, Animation::Type type);
2122+ /// Same as above, but this animation will be used for getting a representative image by map
2123+ /// object name
2124+ uint32_t load(const std::string& map_object_name, const LuaTable& table, const std::string& basename, Animation::Type type);
2125+
2126+ /// Returns the animation with the given ID or throws an exception if it is
2127+ /// unknown.
2128+ const Animation& get_animation(uint32_t id) const;
2129+
2130+ /// Returns the representative image for the animation with the given 'id', using the given player color.
2131+ /// If this image has already been generated, it is pulled from the cache using
2132+ /// the clr argument that was used previously.
2133+ const Image* get_representative_image(uint32_t id, const RGBColor* clr = nullptr);
2134+
2135+ /// Returns the representative image for the given map object, using the given player color.
2136+ /// If this image has already been generated, it is pulled from the cache using
2137+ /// the clr argument that was used previously.
2138+ const Image* get_representative_image(const std::string& map_object_name,
2139+ const RGBColor* clr = nullptr);
2140+
2141+private:
2142+ /// A list of all known animations
2143+ std::vector<std::unique_ptr<Animation>> animations_;
2144+ /// Maps the animations' vector indices + player colors to their representative images
2145+ std::map<std::pair<uint32_t, const RGBColor*>, std::unique_ptr<const Image>>
2146+ representative_images_;
2147+ /// Maps map object names to the ID of the animations that contain their representative images
2148+ std::map<std::string, uint32_t> representative_animations_by_map_object_name_;
2149+};
2150+
2151+#endif // end of include guard: WL_GRAPHIC_ANIMATION_ANIMATION_MANAGER_H
2152
2153=== added file 'src/graphic/animation/diranimations.cc'
2154--- src/graphic/animation/diranimations.cc 1970-01-01 00:00:00 +0000
2155+++ src/graphic/animation/diranimations.cc 2019-09-08 20:16:16 +0000
2156@@ -0,0 +1,30 @@
2157+/*
2158+ * Copyright (C) 2002-2019 by the Widelands Development Team
2159+ *
2160+ * This program is free software; you can redistribute it and/or
2161+ * modify it under the terms of the GNU General Public License
2162+ * as published by the Free Software Foundation; either version 2
2163+ * of the License, or (at your option) any later version.
2164+ *
2165+ * This program is distributed in the hope that it will be useful,
2166+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2167+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2168+ * GNU General Public License for more details.
2169+ *
2170+ * You should have received a copy of the GNU General Public License
2171+ * along with this program; if not, write to the Free Software
2172+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2173+ *
2174+ */
2175+
2176+#include "graphic/animation/diranimations.h"
2177+
2178+DirAnimations::DirAnimations(
2179+ uint32_t dir1, uint32_t dir2, uint32_t dir3, uint32_t dir4, uint32_t dir5, uint32_t dir6) {
2180+ animations_[0] = dir1;
2181+ animations_[1] = dir2;
2182+ animations_[2] = dir3;
2183+ animations_[3] = dir4;
2184+ animations_[4] = dir5;
2185+ animations_[5] = dir6;
2186+}
2187
2188=== renamed file 'src/graphic/diranimations.h' => 'src/graphic/animation/diranimations.h'
2189--- src/graphic/diranimations.h 2019-02-23 11:00:49 +0000
2190+++ src/graphic/animation/diranimations.h 2019-09-08 20:16:16 +0000
2191@@ -17,8 +17,8 @@
2192 *
2193 */
2194
2195-#ifndef WL_GRAPHIC_DIRANIMATIONS_H
2196-#define WL_GRAPHIC_DIRANIMATIONS_H
2197+#ifndef WL_GRAPHIC_ANIMATION_DIRANIMATIONS_H
2198+#define WL_GRAPHIC_ANIMATION_DIRANIMATIONS_H
2199
2200 #include <string>
2201
2202@@ -54,4 +54,4 @@
2203 uint32_t animations_[6];
2204 };
2205
2206-#endif // end of include guard: WL_GRAPHIC_DIRANIMATIONS_H
2207+#endif // end of include guard: WL_GRAPHIC_ANIMATION_DIRANIMATIONS_H
2208
2209=== renamed file 'src/graphic/animation.cc' => 'src/graphic/animation/nonpacked_animation.cc'
2210--- src/graphic/animation.cc 2019-05-27 21:04:13 +0000
2211+++ src/graphic/animation/nonpacked_animation.cc 2019-09-08 20:16:16 +0000
2212@@ -17,124 +17,25 @@
2213 *
2214 */
2215
2216-#include "graphic/animation.h"
2217+#include "graphic/animation/nonpacked_animation.h"
2218
2219 #include <cassert>
2220 #include <cstdio>
2221 #include <limits>
2222 #include <memory>
2223-#include <set>
2224
2225 #include <boost/algorithm/string/replace.hpp>
2226 #include <boost/format.hpp>
2227
2228-#include "base/i18n.h"
2229-#include "base/log.h"
2230 #include "base/macros.h"
2231-#include "graphic/diranimations.h"
2232 #include "graphic/graphic.h"
2233 #include "graphic/image.h"
2234-#include "graphic/image_cache.h"
2235 #include "graphic/playercolor.h"
2236 #include "graphic/texture.h"
2237 #include "io/filesystem/filesystem.h"
2238 #include "io/filesystem/layered_filesystem.h"
2239 #include "logic/game_data_error.h"
2240 #include "scripting/lua_table.h"
2241-#include "sound/note_sound.h"
2242-#include "sound/sound_handler.h"
2243-
2244-namespace {
2245-// The mipmap scales supported by the engine.
2246-// Ensure that this always matches supported_scales in data/scripting/mapobjects.lua.
2247-const std::set<float> kSupportedScales{0.5, 1, 2, 4};
2248-
2249-/**
2250- * Implements the Animation interface for an animation that is unpacked on disk, that
2251- * is every frame and every pc color frame is an singular file on disk.
2252- */
2253-class NonPackedAnimation : public Animation {
2254-public:
2255- struct MipMapEntry {
2256- explicit MipMapEntry(std::vector<std::string> files);
2257-
2258- // Loads the graphics if they are not yet loaded.
2259- void ensure_graphics_are_loaded() const;
2260-
2261- // Load the needed graphics from disk.
2262- void load_graphics();
2263-
2264- void blit(uint32_t idx,
2265- const Rectf& source_rect,
2266- const Rectf& destination_rect,
2267- const RGBColor* clr,
2268- Surface* target) const;
2269-
2270- // Whether this image set has player color masks provided
2271- bool has_playercolor_masks;
2272-
2273- // Image files on disk
2274- std::vector<std::string> image_files;
2275-
2276- // Loaded images for each frame
2277- std::vector<const Image*> frames;
2278-
2279- private:
2280- // Player color mask files on disk
2281- std::vector<std::string> playercolor_mask_image_files;
2282-
2283- // Loaded player color mask images for each frame
2284- std::vector<const Image*> playercolor_mask_frames;
2285- };
2286-
2287- ~NonPackedAnimation() override {
2288- }
2289- explicit NonPackedAnimation(const LuaTable& table, const std::string& basename);
2290-
2291- // Implements Animation.
2292- float height() const override;
2293- Rectf source_rectangle(int percent_from_bottom, float scale) const override;
2294- Rectf destination_rectangle(const Vector2f& position,
2295- const Rectf& source_rect,
2296- float scale) const override;
2297- uint16_t nr_frames() const override;
2298- uint32_t frametime() const override;
2299- const Image* representative_image(const RGBColor* clr) const override;
2300- virtual void blit(uint32_t time,
2301- const Widelands::Coords& coords,
2302- const Rectf& source_rect,
2303- const Rectf& destination_rect,
2304- const RGBColor* clr,
2305- Surface* target,
2306- float scale) const override;
2307- void load_default_scale_and_sounds() const override;
2308-
2309-private:
2310- float find_best_scale(float scale) const;
2311-
2312- // TODO(unknown): The chosen semantics of animation sound effects is problematic:
2313- // What if the game runs very slowly or very quickly?
2314- void trigger_sound(uint32_t framenumber, const Widelands::Coords& coords) const override;
2315-
2316- uint32_t current_frame(uint32_t time) const;
2317-
2318- uint32_t frametime_;
2319- uint16_t nr_frames_;
2320-
2321- Vector2i hotspot_;
2322-
2323- struct MipMapCompare {
2324- bool operator()(const float lhs, const float rhs) const {
2325- return lhs > rhs;
2326- }
2327- };
2328- std::map<float, std::unique_ptr<MipMapEntry>, MipMapCompare> mipmaps_;
2329-
2330- // ID of sound effect that will be played at frame 0.
2331- FxId sound_effect_;
2332- int32_t sound_priority_;
2333- bool play_once_;
2334-};
2335
2336 /*
2337 ==============================================================================
2338@@ -144,8 +45,8 @@
2339 ==============================================================================
2340 */
2341
2342-NonPackedAnimation::MipMapEntry::MipMapEntry(std::vector<std::string> files)
2343- : has_playercolor_masks(false), image_files(files) {
2344+NonPackedAnimation::NonPackedMipMapEntry::NonPackedMipMapEntry(std::vector<std::string> files)
2345+ : Animation::MipMapEntry(), image_files(files) {
2346 if (image_files.empty()) {
2347 throw Widelands::GameDataError(
2348 "Animation without image files. For a scale of 1.0, the template should look similar to "
2349@@ -165,19 +66,15 @@
2350 }
2351
2352 assert(!image_files.empty());
2353- assert(playercolor_mask_image_files.size() == image_files.size() ||
2354- playercolor_mask_image_files.empty());
2355 }
2356
2357-// Loads the graphics if they are not yet loaded.
2358-void NonPackedAnimation::MipMapEntry::ensure_graphics_are_loaded() const {
2359+void NonPackedAnimation::NonPackedMipMapEntry::ensure_graphics_are_loaded() const {
2360 if (frames.empty()) {
2361- const_cast<MipMapEntry*>(this)->load_graphics();
2362+ const_cast<NonPackedMipMapEntry*>(this)->load_graphics();
2363 }
2364 }
2365
2366-// Load the needed graphics from disk.
2367-void NonPackedAnimation::MipMapEntry::load_graphics() {
2368+void NonPackedAnimation::NonPackedMipMapEntry::load_graphics() {
2369 if (image_files.empty()) {
2370 throw Widelands::GameDataError("animation without image files.");
2371 }
2372@@ -216,7 +113,7 @@
2373 }
2374 }
2375
2376-void NonPackedAnimation::MipMapEntry::blit(uint32_t idx,
2377+void NonPackedAnimation::NonPackedMipMapEntry::blit(uint32_t idx,
2378 const Rectf& source_rect,
2379 const Rectf& destination_rect,
2380 const RGBColor* clr,
2381@@ -233,6 +130,13 @@
2382 }
2383 }
2384
2385+int NonPackedAnimation::NonPackedMipMapEntry::width() const {
2386+ return frames.at(0)->width();
2387+}
2388+int NonPackedAnimation::NonPackedMipMapEntry::height() const {
2389+ return frames.at(0)->height();
2390+}
2391+
2392 /*
2393 ==============================================================================
2394
2395@@ -242,102 +146,47 @@
2396 */
2397
2398 NonPackedAnimation::NonPackedAnimation(const LuaTable& table, const std::string& basename)
2399- : Animation(table.has_key("representative_frame") ? table.get_int("representative_frame") : 0),
2400- frametime_(FRAME_LENGTH),
2401- hotspot_(table.get_vector<std::string, int>("hotspot")),
2402- sound_effect_(kNoSoundEffect),
2403- sound_priority_(kFxPriorityLowest),
2404- play_once_(false) {
2405+ : Animation(table) {
2406 try {
2407- // Sound
2408- if (table.has_key("sound_effect")) {
2409- std::unique_ptr<LuaTable> sound_effects = table.get_table("sound_effect");
2410- sound_effect_ =
2411- SoundHandler::register_fx(SoundType::kAmbient, sound_effects->get_string("path"));
2412-
2413- if (sound_effects->has_key<std::string>("priority")) {
2414- sound_priority_ = sound_effects->get_int("priority");
2415- }
2416-
2417- if (sound_priority_ < kFxPriorityLowest) {
2418- throw Widelands::GameDataError(
2419- "Minmum priority for sounds is %d, but only %d was specified for %s",
2420- kFxPriorityLowest, sound_priority_, sound_effects->get_string("path").c_str());
2421- }
2422- }
2423-
2424- // Repetition
2425- if (table.has_key("play_once")) {
2426- play_once_ = table.get_bool("play_once");
2427- }
2428-
2429 // Get image files
2430 if (table.has_key("pictures")) {
2431 // TODO(GunChleoc): Old code - remove this option once conversion has been completed
2432 mipmaps_.insert(std::make_pair(
2433- 1.0f, std::unique_ptr<MipMapEntry>(
2434- new MipMapEntry(table.get_table("pictures")->array_entries<std::string>()))));
2435+ 1.0f, std::unique_ptr<NonPackedMipMapEntry>(
2436+ new NonPackedMipMapEntry(table.get_table("pictures")->array_entries<std::string>()))));
2437 } else {
2438 if (basename.empty() || !table.has_key("directory")) {
2439 throw Widelands::GameDataError(
2440 "Animation did not define both a basename and a directory for its image files");
2441 }
2442- const std::string directory = table.get_string("directory");
2443-
2444- // List files for the given scale, and if we have any, add a mipmap entry for them.
2445- auto add_scale = [this, basename, directory](
2446- float scale_as_float, const std::string& scale_as_string) {
2447- std::vector<std::string> filenames =
2448- g_fs->get_sequential_files(directory, basename + scale_as_string, "png");
2449- if (!filenames.empty()) {
2450- mipmaps_.insert(std::make_pair(
2451- scale_as_float, std::unique_ptr<MipMapEntry>(new MipMapEntry(filenames))));
2452- }
2453- };
2454- add_scale(0.5f, "_0.5");
2455- add_scale(1.0f, "_1");
2456- add_scale(2.0f, "_2");
2457- add_scale(4.0f, "_4");
2458-
2459- if (mipmaps_.count(1.0f) == 0) {
2460- // There might be only 1 scale
2461- add_scale(1.0f, "");
2462- if (mipmaps_.count(1.0f) == 0) {
2463- // No files found at all
2464- throw Widelands::GameDataError(
2465- "Animation in directory '%s' with basename '%s' has no images for mandatory "
2466- "scale '1' in mipmap - supported scales are: 0.5, 1, 2, 4",
2467- directory.c_str(), basename.c_str());
2468- }
2469- }
2470+ add_available_scales(basename, table.get_string("directory"));
2471 }
2472
2473- // Frames and FPS
2474- nr_frames_ = mipmaps_.begin()->second->image_files.size();
2475- if (table.has_key("fps")) {
2476- if (nr_frames_ == 1) {
2477+ // Frames
2478+ const NonPackedMipMapEntry& first = dynamic_cast<const NonPackedMipMapEntry&>(*mipmaps_.begin()->second.get());
2479+ nr_frames_ = first.image_files.size();
2480+ if (table.has_key("fps") && nr_frames_ == 1) {
2481 throw Widelands::GameDataError("Animation with one picture %s must not have 'fps'",
2482- mipmaps_.begin()->second->image_files.front().c_str());
2483- }
2484- frametime_ = 1000 / get_positive_int(table, "fps");
2485+ first.image_files.front().c_str());
2486 }
2487
2488- if (representative_frame_ < 0 || representative_frame_ > nr_frames_ - 1) {
2489+ if (representative_frame() < 0 || representative_frame() > nr_frames_ - 1) {
2490 throw wexception("Animation has %d as its representative frame, but the frame indices "
2491 "available are 0 - %d",
2492- representative_frame_, nr_frames_ - 1);
2493+ representative_frame(), nr_frames_ - 1);
2494 }
2495
2496 // Perform some checks to make sure that the data is complete and consistent
2497 const bool should_have_playercolor = mipmaps_.begin()->second->has_playercolor_masks;
2498 for (const auto& mipmap : mipmaps_) {
2499- if (mipmap.second->image_files.size() != nr_frames_) {
2500+ const NonPackedMipMapEntry& nonpacked_mipmap = dynamic_cast<const NonPackedMipMapEntry&>(*mipmap.second.get());
2501+ if (nonpacked_mipmap.image_files.size() != nr_frames_) {
2502 throw Widelands::GameDataError(
2503 "Mismatched number of images for different scales in animation table: %" PRIuS
2504 " vs. %u at scale %.2f",
2505- mipmap.second->image_files.size(), nr_frames_, static_cast<double>(mipmap.first));
2506+ nonpacked_mipmap.image_files.size(), nr_frames_, static_cast<double>(mipmap.first));
2507 }
2508- if (mipmap.second->has_playercolor_masks != should_have_playercolor) {
2509+ if (nonpacked_mipmap.has_playercolor_masks != should_have_playercolor) {
2510 throw Widelands::GameDataError(
2511 "Mismatched existence of player colors in animation table for scales %.2f and %.2f",
2512 static_cast<double>(mipmaps_.begin()->first), static_cast<double>(mipmap.first));
2513@@ -352,40 +201,23 @@
2514 }
2515 }
2516
2517-float NonPackedAnimation::find_best_scale(float scale) const {
2518- assert(!mipmaps_.empty());
2519- float result = mipmaps_.begin()->first;
2520- for (const auto& mipmap : mipmaps_) {
2521- // The map is reverse sorted, so we can break as soon as we are lower than the wanted scale
2522- if (mipmap.first < scale) {
2523- break;
2524- }
2525- result = mipmap.first;
2526- }
2527- return result;
2528-}
2529-
2530-float NonPackedAnimation::height() const {
2531- const MipMapEntry& mipmap = *mipmaps_.at(1.0f);
2532- mipmap.ensure_graphics_are_loaded();
2533- return mipmap.frames.front()->height();
2534-}
2535-
2536-uint16_t NonPackedAnimation::nr_frames() const {
2537- return nr_frames_;
2538-}
2539-
2540-uint32_t NonPackedAnimation::frametime() const {
2541- return frametime_;
2542+std::vector<const Image*> NonPackedAnimation::images(float scale) const {
2543+ const NonPackedMipMapEntry& mipmap = dynamic_cast<const NonPackedMipMapEntry&>(mipmap_entry(scale));
2544+ return mipmap.frames;
2545+}
2546+
2547+std::vector<const Image*> NonPackedAnimation::pc_masks(float scale) const {
2548+ const NonPackedMipMapEntry& mipmap = dynamic_cast<const NonPackedMipMapEntry&>(mipmap_entry(scale));
2549+ return mipmap.playercolor_mask_frames;
2550 }
2551
2552 const Image* NonPackedAnimation::representative_image(const RGBColor* clr) const {
2553- const MipMapEntry& mipmap = *mipmaps_.at(1.0f);
2554- std::vector<std::string> images = mipmap.image_files;
2555- assert(!images.empty());
2556+ const NonPackedMipMapEntry& mipmap = dynamic_cast<const NonPackedMipMapEntry&>(mipmap_entry(1.0f));
2557+ assert(!mipmap.image_files.empty());
2558+ const std::string& image_filename = mipmap.image_files[representative_frame()];
2559 const Image* image = (mipmap.has_playercolor_masks && clr) ?
2560- playercolor_image(*clr, images[representative_frame_]) :
2561- g_gr->images().get(images[representative_frame_]);
2562+ playercolor_image(*clr, image_filename) :
2563+ g_gr->images().get(image_filename);
2564
2565 const int w = image->width();
2566 const int h = image->height();
2567@@ -395,130 +227,12 @@
2568 return rv;
2569 }
2570
2571-uint32_t NonPackedAnimation::current_frame(uint32_t time) const {
2572- if (nr_frames() > 1) {
2573- return (play_once_ && time / frametime_ > static_cast<uint32_t>(nr_frames() - 1)) ?
2574- static_cast<uint32_t>(nr_frames() - 1) :
2575- time / frametime_ % nr_frames();
2576- }
2577- return 0;
2578-}
2579-
2580-void NonPackedAnimation::trigger_sound(uint32_t time, const Widelands::Coords& coords) const {
2581- if (sound_effect_ == kNoSoundEffect || coords == Widelands::Coords::null()) {
2582- return;
2583- }
2584-
2585- const uint32_t framenumber = current_frame(time);
2586-
2587- if (framenumber == 0) {
2588- Notifications::publish(
2589- NoteSound(SoundType::kAmbient, sound_effect_, coords, sound_priority_));
2590- }
2591-}
2592-
2593-Rectf NonPackedAnimation::source_rectangle(const int percent_from_bottom, float scale) const {
2594- const MipMapEntry& mipmap = *mipmaps_.at(find_best_scale(scale));
2595- mipmap.ensure_graphics_are_loaded();
2596- const Image* first_frame = mipmap.frames.front();
2597- const float h = percent_from_bottom * first_frame->height() / 100;
2598- // Using floor for pixel perfect positioning
2599- return Rectf(0.f, std::floor(first_frame->height() - h), first_frame->width(), h);
2600-}
2601-
2602-Rectf NonPackedAnimation::destination_rectangle(const Vector2f& position,
2603- const Rectf& source_rect,
2604- const float scale) const {
2605- const float best_scale = find_best_scale(scale);
2606- return Rectf(position.x - (hotspot_.x - source_rect.x / best_scale) * scale,
2607- position.y - (hotspot_.y - source_rect.y / best_scale) * scale,
2608- source_rect.w * scale / best_scale, source_rect.h * scale / best_scale);
2609-}
2610-
2611-void NonPackedAnimation::blit(uint32_t time,
2612- const Widelands::Coords& coords,
2613- const Rectf& source_rect,
2614- const Rectf& destination_rect,
2615- const RGBColor* clr,
2616- Surface* target,
2617- float scale) const {
2618- mipmaps_.at(find_best_scale(scale))
2619- ->blit(current_frame(time), source_rect, destination_rect, clr, target);
2620- trigger_sound(time, coords);
2621-}
2622-
2623-void NonPackedAnimation::load_default_scale_and_sounds() const {
2624- mipmaps_.at(1.0f)->ensure_graphics_are_loaded();
2625- if (sound_effect_ != kNoSoundEffect && !SoundHandler::is_backend_disabled()) {
2626- g_sh->load_fx(SoundType::kAmbient, sound_effect_);
2627- }
2628-}
2629-
2630-} // namespace
2631-
2632-/*
2633-==============================================================================
2634-
2635-DirAnimations IMPLEMENTAION
2636-
2637-==============================================================================
2638-*/
2639-
2640-DirAnimations::DirAnimations(
2641- uint32_t dir1, uint32_t dir2, uint32_t dir3, uint32_t dir4, uint32_t dir5, uint32_t dir6) {
2642- animations_[0] = dir1;
2643- animations_[1] = dir2;
2644- animations_[2] = dir3;
2645- animations_[3] = dir4;
2646- animations_[4] = dir5;
2647- animations_[5] = dir6;
2648-}
2649-
2650-/*
2651-==============================================================================
2652-
2653-AnimationManager IMPLEMENTATION
2654-
2655-==============================================================================
2656-*/
2657-uint32_t AnimationManager::load(const LuaTable& table, const std::string& basename) {
2658- animations_.push_back(std::unique_ptr<Animation>(new NonPackedAnimation(table, basename)));
2659- return animations_.size();
2660-}
2661-uint32_t AnimationManager::load(const std::string& map_object_name,
2662- const LuaTable& table,
2663- const std::string& basename) {
2664- animations_.push_back(std::unique_ptr<Animation>(new NonPackedAnimation(table, basename)));
2665- const size_t result = animations_.size();
2666- representative_animations_by_map_object_name_.insert(std::make_pair(map_object_name, result));
2667- return result;
2668-}
2669-
2670-const Animation& AnimationManager::get_animation(uint32_t id) const {
2671- if (!id || id > animations_.size())
2672- throw Widelands::GameDataError("Requested unknown animation with id: %i", id);
2673-
2674- return *animations_[id - 1];
2675-}
2676-
2677-const Image* AnimationManager::get_representative_image(uint32_t id, const RGBColor* clr) {
2678- const auto hash = std::make_pair(id, clr);
2679- if (representative_images_.count(hash) != 1) {
2680- representative_images_.insert(std::make_pair(
2681- hash, std::unique_ptr<const Image>(
2682- std::move(g_gr->animations().get_animation(id).representative_image(clr)))));
2683- }
2684- return representative_images_.at(hash).get();
2685-}
2686-
2687-const Image* AnimationManager::get_representative_image(const std::string& map_object_name,
2688- const RGBColor* clr) {
2689- if (representative_animations_by_map_object_name_.count(map_object_name) != 1) {
2690- log("Warning: %s has no animation assigned for its representative image, or it's not a known "
2691- "map object\n",
2692- map_object_name.c_str());
2693- return new Texture(0, 0);
2694- }
2695- return get_representative_image(
2696- representative_animations_by_map_object_name_.at(map_object_name), clr);
2697+void NonPackedAnimation::add_scale_if_files_present(const std::string& basename, const std::string& directory,
2698+ float scale_as_float, const std::string& scale_as_string) {
2699+ std::vector<std::string> filenames =
2700+ g_fs->get_sequential_files(directory, basename + scale_as_string, "png");
2701+ if (!filenames.empty()) {
2702+ mipmaps_.insert(std::make_pair(
2703+ scale_as_float, std::unique_ptr<NonPackedMipMapEntry>(new NonPackedMipMapEntry(std::move(filenames)))));
2704+ }
2705 }
2706
2707=== added file 'src/graphic/animation/nonpacked_animation.h'
2708--- src/graphic/animation/nonpacked_animation.h 1970-01-01 00:00:00 +0000
2709+++ src/graphic/animation/nonpacked_animation.h 2019-09-08 20:16:16 +0000
2710@@ -0,0 +1,84 @@
2711+/*
2712+ * Copyright (C) 2002-2019 by the Widelands Development Team
2713+ *
2714+ * This program is free software; you can redistribute it and/or
2715+ * modify it under the terms of the GNU General Public License
2716+ * as published by the Free Software Foundation; either version 2
2717+ * of the License, or (at your option) any later version.
2718+ *
2719+ * This program is distributed in the hope that it will be useful,
2720+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2721+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2722+ * GNU General Public License for more details.
2723+ *
2724+ * You should have received a copy of the GNU General Public License
2725+ * along with this program; if not, write to the Free Software
2726+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2727+ *
2728+ */
2729+
2730+#ifndef WL_GRAPHIC_ANIMATION_NONPACKED_ANIMATION_H
2731+#define WL_GRAPHIC_ANIMATION_NONPACKED_ANIMATION_H
2732+
2733+#include <map>
2734+#include <memory>
2735+#include <string>
2736+#include <vector>
2737+
2738+#include "base/rect.h"
2739+#include "base/vector.h"
2740+#include "graphic/animation/animation.h"
2741+#include "graphic/color.h"
2742+#include "graphic/image.h"
2743+#include "graphic/surface.h"
2744+#include "scripting/lua_table.h"
2745+
2746+/**
2747+ * Implements the Animation interface for an animation that is unpacked on disk, that
2748+ * is every frame and every pc color frame is an singular file on disk.
2749+ */
2750+class NonPackedAnimation : public Animation {
2751+public:
2752+ ~NonPackedAnimation() override = default;
2753+ explicit NonPackedAnimation(const LuaTable& table, const std::string& basename);
2754+
2755+ const Image* representative_image(const RGBColor* clr) const override;
2756+
2757+ std::vector<const Image*> images(float scale) const override;
2758+ std::vector<const Image*> pc_masks(float scale) const override;
2759+
2760+private:
2761+ void add_scale_if_files_present(const std::string& basename, const std::string& directory,
2762+ float scale_as_float, const std::string& scale_as_string) override;
2763+
2764+ struct NonPackedMipMapEntry : Animation::MipMapEntry {
2765+ explicit NonPackedMipMapEntry(std::vector<std::string> files);
2766+ ~NonPackedMipMapEntry() override = default;
2767+
2768+ void ensure_graphics_are_loaded() const override;
2769+ void load_graphics() override;
2770+
2771+ void blit(uint32_t idx,
2772+ const Rectf& source_rect,
2773+ const Rectf& destination_rect,
2774+ const RGBColor* clr,
2775+ Surface* target) const override;
2776+
2777+ int width() const override;
2778+ int height() const override;
2779+
2780+ /// Image files on disk
2781+ std::vector<std::string> image_files;
2782+
2783+ /// Loaded images for each frame
2784+ std::vector<const Image*> frames;
2785+
2786+ /// Loaded player color mask images for each frame
2787+ std::vector<const Image*> playercolor_mask_frames;
2788+
2789+ private:
2790+ /// Player color mask files on disk
2791+ std::vector<std::string> playercolor_mask_image_files;
2792+ };
2793+};
2794+#endif // end of include guard: WL_GRAPHIC_ANIMATION_NONPACKED_ANIMATION_H
2795
2796=== added file 'src/graphic/animation/spritesheet_animation.cc'
2797--- src/graphic/animation/spritesheet_animation.cc 1970-01-01 00:00:00 +0000
2798+++ src/graphic/animation/spritesheet_animation.cc 2019-09-08 20:16:16 +0000
2799@@ -0,0 +1,222 @@
2800+/*
2801+ * Copyright (C) 2019 by the Widelands Development Team
2802+ *
2803+ * This program is free software; you can redistribute it and/or
2804+ * modify it under the terms of the GNU General Public License
2805+ * as published by the Free Software Foundation; either version 2
2806+ * of the License, or (at your option) any later version.
2807+ *
2808+ * This program is distributed in the hope that it will be useful,
2809+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2810+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2811+ * GNU General Public License for more details.
2812+ *
2813+ * You should have received a copy of the GNU General Public License
2814+ * along with this program; if not, write to the Free Software
2815+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2816+ *
2817+ */
2818+
2819+#include "graphic/animation/spritesheet_animation.h"
2820+
2821+#include <cassert>
2822+#include <cstdio>
2823+#include <limits>
2824+#include <memory>
2825+
2826+#include <boost/algorithm/string/replace.hpp>
2827+#include <boost/format.hpp>
2828+
2829+#include "base/log.h"
2830+#include "base/macros.h"
2831+#include "graphic/graphic.h"
2832+#include "graphic/image.h"
2833+#include "graphic/playercolor.h"
2834+#include "graphic/texture.h"
2835+#include "io/filesystem/filesystem.h"
2836+#include "io/filesystem/layered_filesystem.h"
2837+#include "logic/game_data_error.h"
2838+#include "scripting/lua_table.h"
2839+
2840+/*
2841+==============================================================================
2842+
2843+SpriteSheetAnimation::MipMapEntry IMPLEMENTATION
2844+
2845+==============================================================================
2846+*/
2847+
2848+SpriteSheetAnimation::SpriteSheetMipMapEntry::SpriteSheetMipMapEntry(const std::string& file, int init_rows, int init_columns)
2849+ : Animation::MipMapEntry(), sheet(nullptr), playercolor_mask_sheet(nullptr), rows(init_rows), columns(init_columns), w(0), h(0), sheet_file(file), playercolor_mask_sheet_file("") {
2850+
2851+ assert(g_fs->file_exists(file));
2852+
2853+ playercolor_mask_sheet_file = file;
2854+ boost::replace_last(playercolor_mask_sheet_file, ".png", "_pc.png");
2855+ if (g_fs->file_exists(playercolor_mask_sheet_file)) {
2856+ has_playercolor_masks = true;
2857+ } else {
2858+ playercolor_mask_sheet_file = "";
2859+ }
2860+}
2861+
2862+
2863+void SpriteSheetAnimation::SpriteSheetMipMapEntry::ensure_graphics_are_loaded() const {
2864+ if (sheet == nullptr) {
2865+ const_cast<SpriteSheetMipMapEntry*>(this)->load_graphics();
2866+ }
2867+}
2868+
2869+void SpriteSheetAnimation::SpriteSheetMipMapEntry::load_graphics() {
2870+ sheet = g_gr->images().get(sheet_file);
2871+
2872+ if (!playercolor_mask_sheet_file.empty()) {
2873+ playercolor_mask_sheet = g_gr->images().get(playercolor_mask_sheet_file);
2874+
2875+ if (sheet->width() != playercolor_mask_sheet->width()) {
2876+ throw Widelands::GameDataError(
2877+ "animation sprite sheet has width %d but playercolor mask sheet has width %d. The sheet's image is %s",
2878+ sheet->width(), playercolor_mask_sheet->width(), sheet_file.c_str());
2879+ }
2880+ if (sheet->height() != playercolor_mask_sheet->height()) {
2881+ throw Widelands::GameDataError(
2882+ "animation sprite sheet has height %d but playercolor mask sheet has height %d. The sheet's image is %s",
2883+ sheet->height(), playercolor_mask_sheet->height(), sheet_file.c_str());
2884+ }
2885+ }
2886+
2887+ // Frame width and height
2888+ w = sheet->width() / columns;
2889+ h = sheet->height() / rows;
2890+}
2891+
2892+void SpriteSheetAnimation::SpriteSheetMipMapEntry::blit(uint32_t idx,
2893+ const Rectf& source_rect,
2894+ const Rectf& destination_rect,
2895+ const RGBColor* clr,
2896+ Surface* target) const {
2897+ assert(sheet != nullptr);
2898+ assert(target);
2899+ assert(static_cast<int>(idx) <= columns * rows);
2900+
2901+ const int column = idx % columns;
2902+ const int row = idx / columns;
2903+
2904+ Rectf frame_rect(source_rect.x + column * width(), source_rect.y + row * height(),
2905+ source_rect.w, source_rect.h);
2906+
2907+ if (!has_playercolor_masks || clr == nullptr) {
2908+ target->blit(destination_rect, *sheet, frame_rect, 1., BlendMode::UseAlpha);
2909+ } else {
2910+ assert(playercolor_mask_sheet != nullptr);
2911+ target->blit_blended(
2912+ destination_rect, *sheet, *playercolor_mask_sheet, frame_rect, *clr);
2913+ }
2914+}
2915+
2916+int SpriteSheetAnimation::SpriteSheetMipMapEntry::width() const {
2917+ return w;
2918+}
2919+int SpriteSheetAnimation::SpriteSheetMipMapEntry::height() const {
2920+ return h;
2921+}
2922+
2923+/*
2924+==============================================================================
2925+
2926+SpriteSheetAnimation IMPLEMENTATION
2927+
2928+==============================================================================
2929+*/
2930+
2931+SpriteSheetAnimation::SpriteSheetAnimation(const LuaTable& table, const std::string& basename)
2932+ : Animation(table) {
2933+ try {
2934+ // Get image files
2935+ if (basename.empty() || !table.has_key("directory")) {
2936+ throw Widelands::GameDataError(
2937+ "Animation did not define both a basename and a directory for its sprite sheet file");
2938+ }
2939+ const std::string directory = table.get_string("directory");
2940+
2941+ // Frames, rows and columns
2942+ nr_frames_ = table.get_int("frames");
2943+ rows_ = table.get_int("rows");
2944+ columns_ = table.get_int("columns");
2945+
2946+ add_available_scales(basename, directory);
2947+
2948+ // Perform some checks to make sure that the data is complete and consistent
2949+ const SpriteSheetMipMapEntry& first = dynamic_cast<const SpriteSheetMipMapEntry&>(*mipmaps_.begin()->second.get());
2950+ if (table.has_key("fps") && nr_frames_ == 1) {
2951+ throw Widelands::GameDataError("'%s' sprite sheet animation with one frame must not have 'fps'",
2952+ basename.c_str());
2953+ }
2954+
2955+ if (representative_frame() < 0 || representative_frame() > nr_frames_ - 1) {
2956+ throw Widelands::GameDataError("Animation has %d as its representative frame, but the frame indices "
2957+ "available are 0 - %d",
2958+ representative_frame(), nr_frames_ - 1);
2959+ }
2960+
2961+ if (rows_ * columns_ < nr_frames_) {
2962+ throw Widelands::GameDataError("Animation has %d frames, which does not fit into %d rows x %d columns",
2963+ nr_frames_, rows_, columns_);
2964+ }
2965+
2966+ const bool should_have_playercolor = first.has_playercolor_masks;
2967+ for (const auto& mipmap : mipmaps_) {
2968+ if (first.has_playercolor_masks != should_have_playercolor) {
2969+ throw Widelands::GameDataError(
2970+ "Mismatched existence of player colors in animation table for scales %.2f and %.2f",
2971+ static_cast<double>(mipmaps_.begin()->first), static_cast<double>(mipmap.first));
2972+ }
2973+ }
2974+ if (mipmaps_.count(1.0f) != 1) {
2975+ throw Widelands::GameDataError(
2976+ "All animations must provide images for the neutral scale (1.0)");
2977+ }
2978+ } catch (const LuaError& e) {
2979+ throw Widelands::GameDataError("Error in animation table: %s", e.what());
2980+ }
2981+}
2982+
2983+std::vector<const Image*> SpriteSheetAnimation::images(float) const {
2984+ // We only need to implement this if we add compressed spritemaps, or maybe for usage in a test
2985+ log("ERROR: Accessing image files is not supported by spritesheets\n");
2986+ NEVER_HERE();
2987+}
2988+
2989+std::vector<const Image*> SpriteSheetAnimation::pc_masks(float) const {
2990+ // We only need to implement this if we add compressed spritemaps, or maybe for usage in a test
2991+ log("ERROR: Accessing image files is not supported by spritesheets\n");
2992+ NEVER_HERE();
2993+}
2994+
2995+const Image* SpriteSheetAnimation::representative_image(const RGBColor* clr) const {
2996+ const SpriteSheetMipMapEntry& mipmap = dynamic_cast<const SpriteSheetMipMapEntry&>(mipmap_entry(1.0f));
2997+ const int column = representative_frame() % columns_;
2998+ const int row = representative_frame() / columns_;
2999+ const int w = width();
3000+ const int h = height();
3001+
3002+ Texture* rv = new Texture(w, h);
3003+ Rectf rect(Vector2f::zero(), w, h);
3004+ if (mipmap.has_playercolor_masks && clr) {
3005+ rv->fill_rect(rect, RGBAColor(0, 0, 0, 0));
3006+ rv->blit_blended(Rectf(column * w, row * h, w, h), *mipmap.sheet, *mipmap.playercolor_mask_sheet, rect, *clr);
3007+ } else {
3008+ rv->blit(Rectf(column * w, row * h, w, h), *mipmap.sheet, rect, 1., BlendMode::Copy);
3009+ }
3010+ return rv;
3011+}
3012+
3013+void SpriteSheetAnimation::add_scale_if_files_present(const std::string& basename, const std::string& directory,
3014+ float scale_as_float, const std::string& scale_as_string) {
3015+ const std::string path =
3016+ directory + g_fs->file_separator() + basename + scale_as_string + ".png";
3017+ if (g_fs->file_exists(path)) {
3018+ mipmaps_.insert(std::make_pair(
3019+ scale_as_float, std::unique_ptr<SpriteSheetMipMapEntry>(new SpriteSheetMipMapEntry(path, rows_, columns_))));
3020+ }
3021+}
3022
3023=== added file 'src/graphic/animation/spritesheet_animation.h'
3024--- src/graphic/animation/spritesheet_animation.h 1970-01-01 00:00:00 +0000
3025+++ src/graphic/animation/spritesheet_animation.h 2019-09-08 20:16:16 +0000
3026@@ -0,0 +1,96 @@
3027+/*
3028+ * Copyright (C) 2019 by the Widelands Development Team
3029+ *
3030+ * This program is free software; you can redistribute it and/or
3031+ * modify it under the terms of the GNU General Public License
3032+ * as published by the Free Software Foundation; either version 2
3033+ * of the License, or (at your option) any later version.
3034+ *
3035+ * This program is distributed in the hope that it will be useful,
3036+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3037+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3038+ * GNU General Public License for more details.
3039+ *
3040+ * You should have received a copy of the GNU General Public License
3041+ * along with this program; if not, write to the Free Software
3042+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
3043+ *
3044+ */
3045+
3046+#ifndef WL_GRAPHIC_ANIMATION_SPRITESHEET_ANIMATION_H
3047+#define WL_GRAPHIC_ANIMATION_SPRITESHEET_ANIMATION_H
3048+
3049+#include <map>
3050+#include <memory>
3051+#include <string>
3052+#include <vector>
3053+
3054+#include "base/rect.h"
3055+#include "base/vector.h"
3056+#include "graphic/animation/animation.h"
3057+#include "graphic/color.h"
3058+#include "graphic/image.h"
3059+#include "graphic/surface.h"
3060+#include "scripting/lua_table.h"
3061+
3062+/**
3063+ * Implements the Animation interface for an animation where the images are in a spritesheet.
3064+ */
3065+class SpriteSheetAnimation : public Animation {
3066+public:
3067+ ~SpriteSheetAnimation() override = default;
3068+ explicit SpriteSheetAnimation(const LuaTable& table, const std::string& basename);
3069+
3070+ const Image* representative_image(const RGBColor* clr) const override;
3071+
3072+ std::vector<const Image*> images(float scale) const override;
3073+ std::vector<const Image*> pc_masks(float scale) const override;
3074+
3075+private:
3076+ void add_scale_if_files_present(const std::string& basename, const std::string& directory,
3077+ float scale_as_float, const std::string& scale_as_string) override;
3078+
3079+ struct SpriteSheetMipMapEntry : Animation::MipMapEntry {
3080+ explicit SpriteSheetMipMapEntry(const std::string& file, int init_rows, int columns);
3081+
3082+ void ensure_graphics_are_loaded() const override;
3083+ void load_graphics() override;
3084+
3085+ void blit(uint32_t idx,
3086+ const Rectf& source_rect,
3087+ const Rectf& destination_rect,
3088+ const RGBColor* clr,
3089+ Surface* target) const override;
3090+
3091+ int width() const override;
3092+ int height() const override;
3093+
3094+ /// Loaded sprite sheet for all frames
3095+ const Image* sheet;
3096+
3097+ /// Loaded player color mask sprite sheet for all frames
3098+ const Image* playercolor_mask_sheet;
3099+
3100+ /// Number of rows for the spritesheets
3101+ const int rows;
3102+ /// Number of columns for the spritesheets
3103+ const int columns;
3104+ /// Texture width
3105+ int w;
3106+ /// Texture height
3107+ int h;
3108+
3109+ private:
3110+ /// Sprite sheet file name on disk
3111+ const std::string sheet_file;
3112+
3113+ /// Player color mask file on disk
3114+ std::string playercolor_mask_sheet_file;
3115+ };
3116+
3117+ /// Number of rows for the spritesheets
3118+ int rows_;
3119+ /// Number of columns for the spritesheets
3120+ int columns_;
3121+};
3122+#endif // end of include guard: WL_GRAPHIC_ANIMATION_SPRITESHEET_ANIMATION_H
3123
3124=== modified file 'src/graphic/graphic.cc'
3125--- src/graphic/graphic.cc 2019-03-12 20:55:44 +0000
3126+++ src/graphic/graphic.cc 2019-09-08 20:16:16 +0000
3127@@ -26,7 +26,7 @@
3128 #include "base/wexception.h"
3129 #include "build_info.h"
3130 #include "graphic/align.h"
3131-#include "graphic/animation.h"
3132+#include "graphic/animation/animation_manager.h"
3133 #include "graphic/build_texture_atlas.h"
3134 #include "graphic/gl/initialize.h"
3135 #include "graphic/gl/system_headers.h"
3136
3137=== modified file 'src/graphic/rendertarget.cc'
3138--- src/graphic/rendertarget.cc 2019-05-27 14:28:34 +0000
3139+++ src/graphic/rendertarget.cc 2019-09-08 20:16:16 +0000
3140@@ -21,7 +21,8 @@
3141
3142 #include "base/macros.h"
3143 #include "graphic/align.h"
3144-#include "graphic/animation.h"
3145+#include "graphic/animation/animation.h"
3146+#include "graphic/animation/animation_manager.h"
3147 #include "graphic/graphic.h"
3148 #include "graphic/surface.h"
3149
3150
3151=== modified file 'src/graphic/text/CMakeLists.txt'
3152--- src/graphic/text/CMakeLists.txt 2019-05-04 05:17:56 +0000
3153+++ src/graphic/text/CMakeLists.txt 2019-09-08 20:16:16 +0000
3154@@ -35,6 +35,7 @@
3155 base_macros
3156 graphic
3157 graphic_align
3158+ graphic_animation
3159 graphic_color
3160 graphic_image_cache
3161 graphic_image_io
3162
3163=== modified file 'src/graphic/text/rt_render.cc'
3164--- src/graphic/text/rt_render.cc 2019-05-26 17:21:15 +0000
3165+++ src/graphic/text/rt_render.cc 2019-09-08 20:16:16 +0000
3166@@ -36,7 +36,8 @@
3167 #include "base/vector.h"
3168 #include "base/wexception.h"
3169 #include "graphic/align.h"
3170-#include "graphic/animation.h"
3171+#include "graphic/animation/animation.h"
3172+#include "graphic/animation/animation_manager.h"
3173 #include "graphic/graphic.h"
3174 #include "graphic/image_cache.h"
3175 #include "graphic/image_io.h"
3176
3177=== modified file 'src/logic/map_objects/CMakeLists.txt'
3178--- src/logic/map_objects/CMakeLists.txt 2019-08-09 17:29:40 +0000
3179+++ src/logic/map_objects/CMakeLists.txt 2019-09-08 20:16:16 +0000
3180@@ -123,6 +123,7 @@
3181 base_math
3182 economy
3183 graphic
3184+ graphic_animation
3185 graphic_color
3186 graphic_fonthandler
3187 graphic_image_io
3188
3189=== modified file 'src/logic/map_objects/bob.h'
3190--- src/logic/map_objects/bob.h 2019-04-24 06:01:37 +0000
3191+++ src/logic/map_objects/bob.h 2019-09-08 20:16:16 +0000
3192@@ -23,8 +23,7 @@
3193 #include "base/macros.h"
3194 #include "base/vector.h"
3195 #include "economy/route.h"
3196-#include "graphic/animation.h"
3197-#include "graphic/diranimations.h"
3198+#include "graphic/animation/diranimations.h"
3199 #include "logic/map_objects/draw_text.h"
3200 #include "logic/map_objects/map_object.h"
3201 #include "logic/map_objects/walkingdir.h"
3202
3203=== modified file 'src/logic/map_objects/immovable.cc'
3204--- src/logic/map_objects/immovable.cc 2019-08-21 17:57:37 +0000
3205+++ src/logic/map_objects/immovable.cc 2019-09-08 20:16:16 +0000
3206@@ -30,6 +30,7 @@
3207 #include "base/macros.h"
3208 #include "base/wexception.h"
3209 #include "config.h"
3210+#include "graphic/animation/animation_manager.h"
3211 #include "graphic/graphic.h"
3212 #include "graphic/rendertarget.h"
3213 #include "helper.h"
3214
3215=== modified file 'src/logic/map_objects/immovable.h'
3216--- src/logic/map_objects/immovable.h 2019-04-24 06:01:37 +0000
3217+++ src/logic/map_objects/immovable.h 2019-09-08 20:16:16 +0000
3218@@ -24,7 +24,6 @@
3219 #include <unordered_map>
3220
3221 #include "base/macros.h"
3222-#include "graphic/animation.h"
3223 #include "logic/map_objects/buildcost.h"
3224 #include "logic/map_objects/draw_text.h"
3225 #include "logic/map_objects/map_object.h"
3226
3227=== modified file 'src/logic/map_objects/map_object.cc'
3228--- src/logic/map_objects/map_object.cc 2019-05-27 21:04:13 +0000
3229+++ src/logic/map_objects/map_object.cc 2019-09-08 20:16:16 +0000
3230@@ -29,6 +29,7 @@
3231
3232 #include "base/log.h"
3233 #include "base/wexception.h"
3234+#include "graphic/animation/animation_manager.h"
3235 #include "graphic/font_handler.h"
3236 #include "graphic/graphic.h"
3237 #include "graphic/rendertarget.h"
3238@@ -242,13 +243,20 @@
3239 init_name,
3240 init_descname,
3241 table.has_key("helptext_script") ? table.get_string("helptext_script") : "") {
3242+ bool has_animations = false;
3243 if (table.has_key("animations")) {
3244- add_animations(*table.get_table("animations"));
3245+ has_animations = true;
3246+ add_animations(*table.get_table("animations"), Animation::Type::kFile);
3247+ }
3248+ if (table.has_key("spritesheets")) {
3249+ has_animations = true;
3250+ add_animations(*table.get_table("spritesheets"), Animation::Type::kSpritesheet);
3251+ }
3252+ if (has_animations) {
3253 if (!is_animation_known("idle")) {
3254 throw GameDataError(
3255 "Map object %s has animations but no idle animation", init_name.c_str());
3256 }
3257-
3258 assert(g_gr->animations().get_representative_image(name())->width() > 0);
3259 }
3260 if (table.has_key("icon")) {
3261@@ -273,7 +281,7 @@
3262 /**
3263 * Add all animations for this map object
3264 */
3265-void MapObjectDescr::add_animations(const LuaTable& table) {
3266+void MapObjectDescr::add_animations(const LuaTable& table, Animation::Type anim_type) {
3267 for (const std::string& animname : table.keys<std::string>()) {
3268 try {
3269 std::unique_ptr<LuaTable> anim = table.get_table(animname);
3270@@ -293,7 +301,7 @@
3271 const std::string directional_basename =
3272 basename + animation_direction_names[dir - 1];
3273 anims_.insert(std::pair<std::string, uint32_t>(
3274- directional_animname, g_gr->animations().load(*anim, directional_basename)));
3275+ directional_animname, g_gr->animations().load(*anim, directional_basename, anim_type)));
3276 }
3277 } else {
3278 if (is_animation_known(animname)) {
3279@@ -302,10 +310,10 @@
3280 }
3281 if (animname == "idle") {
3282 anims_.insert(std::pair<std::string, uint32_t>(
3283- animname, g_gr->animations().load(name_, *anim, basename)));
3284+ animname, g_gr->animations().load(name_, *anim, basename, anim_type)));
3285 } else {
3286 anims_.insert(std::pair<std::string, uint32_t>(
3287- animname, g_gr->animations().load(*anim, basename)));
3288+ animname, g_gr->animations().load(*anim, basename, anim_type)));
3289 }
3290 }
3291 } catch (const std::exception& e) {
3292
3293=== modified file 'src/logic/map_objects/map_object.h'
3294--- src/logic/map_objects/map_object.h 2019-05-25 08:51:42 +0000
3295+++ src/logic/map_objects/map_object.h 2019-09-08 20:16:16 +0000
3296@@ -32,6 +32,8 @@
3297
3298 #include "base/log.h"
3299 #include "base/macros.h"
3300+#include "graphic/animation/animation.h"
3301+#include "graphic/animation/diranimations.h"
3302 #include "graphic/color.h"
3303 #include "graphic/image.h"
3304 #include "logic/cmd_queue.h"
3305@@ -43,7 +45,6 @@
3306
3307 class FileRead;
3308 class RenderTarget;
3309-struct DirAnimations;
3310
3311 namespace Widelands {
3312
3313@@ -157,7 +158,7 @@
3314 void assign_directional_animation(DirAnimations* anims, const std::string& basename);
3315
3316 private:
3317- void add_animations(const LuaTable& table);
3318+ void add_animations(const LuaTable& table, Animation::Type anim_type);
3319
3320 /// Throws an exception if the MapObjectDescr has no representative image
3321 void check_representative_image();
3322
3323=== modified file 'src/logic/map_objects/tribes/constructionsite.cc'
3324--- src/logic/map_objects/tribes/constructionsite.cc 2019-09-05 19:57:55 +0000
3325+++ src/logic/map_objects/tribes/constructionsite.cc 2019-09-08 20:16:16 +0000
3326@@ -27,7 +27,8 @@
3327 #include "base/macros.h"
3328 #include "base/wexception.h"
3329 #include "economy/wares_queue.h"
3330-#include "graphic/animation.h"
3331+#include "graphic/animation/animation.h"
3332+#include "graphic/animation/animation_manager.h"
3333 #include "graphic/graphic.h"
3334 #include "graphic/rendertarget.h"
3335 #include "logic/editor_game_base.h"
3336@@ -79,25 +80,25 @@
3337 ++animation_index;
3338 assert(animation_index < animations.size());
3339 }
3340- const uint32_t anim_time = frame_index * FRAME_LENGTH;
3341+ const uint32_t anim_time = frame_index * kFrameLength;
3342
3343 if (frame_index > 0) {
3344 // Not the first pic within this animation – draw the previous one
3345 dst->blit_animation(point_on_dst, Widelands::Coords::null(), scale,
3346- animations[animation_index].first, anim_time - FRAME_LENGTH,
3347+ animations[animation_index].first, anim_time - kFrameLength,
3348 &player_color);
3349 } else if (animation_index > 0) {
3350 // The first pic, but not the first series of animations – draw the last pic of the previous
3351 // series
3352 dst->blit_animation(
3353 point_on_dst, Widelands::Coords::null(), scale, animations[animation_index - 1].first,
3354- FRAME_LENGTH * (animations[animation_index - 1].second - 1), &player_color);
3355+ kFrameLength * (animations[animation_index - 1].second - 1), &player_color);
3356 } else if (was) {
3357 // First pic in first series, but there was another building here before –
3358 // get its most fitting picture and draw it instead
3359 const uint32_t unocc = was->get_unoccupied_animation();
3360 dst->blit_animation(point_on_dst, Widelands::Coords::null(), scale, unocc,
3361- FRAME_LENGTH * (g_gr->animations().get_animation(unocc).nr_frames() - 1),
3362+ kFrameLength * (g_gr->animations().get_animation(unocc).nr_frames() - 1),
3363 &player_color);
3364 }
3365 // Now blit a segment of the current construction phase from the bottom.
3366
3367=== modified file 'src/logic/map_objects/tribes/dismantlesite.cc'
3368--- src/logic/map_objects/tribes/dismantlesite.cc 2019-09-05 19:57:55 +0000
3369+++ src/logic/map_objects/tribes/dismantlesite.cc 2019-09-08 20:16:16 +0000
3370@@ -27,7 +27,6 @@
3371 #include "base/macros.h"
3372 #include "base/wexception.h"
3373 #include "economy/wares_queue.h"
3374-#include "graphic/animation.h"
3375 #include "graphic/rendertarget.h"
3376 #include "logic/editor_game_base.h"
3377 #include "logic/game.h"
3378
3379=== modified file 'src/logic/map_objects/tribes/ship.h'
3380--- src/logic/map_objects/tribes/ship.h 2019-04-24 06:51:31 +0000
3381+++ src/logic/map_objects/tribes/ship.h 2019-09-08 20:16:16 +0000
3382@@ -25,7 +25,7 @@
3383
3384 #include "base/macros.h"
3385 #include "economy/shippingitem.h"
3386-#include "graphic/diranimations.h"
3387+#include "graphic/animation/diranimations.h"
3388 #include "logic/map_objects/bob.h"
3389
3390 namespace Widelands {
3391
3392=== modified file 'src/logic/map_objects/tribes/soldier.cc'
3393--- src/logic/map_objects/tribes/soldier.cc 2019-09-05 19:57:55 +0000
3394+++ src/logic/map_objects/tribes/soldier.cc 2019-09-08 20:16:16 +0000
3395@@ -30,6 +30,7 @@
3396 #include "base/wexception.h"
3397 #include "economy/economy.h"
3398 #include "economy/flag.h"
3399+#include "graphic/animation/animation_manager.h"
3400 #include "graphic/graphic.h"
3401 #include "graphic/rendertarget.h"
3402 #include "helper.h"
3403
3404=== modified file 'src/logic/map_objects/tribes/tribe_descr.cc'
3405--- src/logic/map_objects/tribes/tribe_descr.cc 2019-05-30 19:34:33 +0000
3406+++ src/logic/map_objects/tribes/tribe_descr.cc 2019-09-08 20:16:16 +0000
3407@@ -29,6 +29,7 @@
3408 #include "base/i18n.h"
3409 #include "base/macros.h"
3410 #include "base/wexception.h"
3411+#include "graphic/animation/animation_manager.h"
3412 #include "graphic/graphic.h"
3413 #include "io/filesystem/layered_filesystem.h"
3414 #include "logic/game.h"
3415@@ -67,11 +68,13 @@
3416 std::unique_ptr<LuaTable> animations_table = items_table->get_table("frontier");
3417 frontier_animation_id_ =
3418 g_gr->animations().load(name_ + std::string("_frontier"), *animations_table,
3419- animations_table->get_string("basename"));
3420+ animations_table->get_string("basename"),
3421+ animations_table->has_key("columns") ? Animation::Type::kSpritesheet : Animation::Type::kFile);
3422 animations_table = items_table->get_table("flag");
3423 flag_animation_id_ =
3424- g_gr->animations().load(name_ + std::string("_frontier"), *animations_table,
3425- animations_table->get_string("basename"));
3426+ g_gr->animations().load(name_ + std::string("_flag"), *animations_table,
3427+ animations_table->get_string("basename"),
3428+ animations_table->has_key("columns") ? Animation::Type::kSpritesheet : Animation::Type::kFile);
3429 }
3430
3431 items_table = table.get_table("roads");
3432@@ -121,26 +124,8 @@
3433 items_table = table.get_table("workers_order");
3434 for (const int key : items_table->keys<int>()) {
3435 std::vector<DescriptionIndex> column;
3436- std::vector<std::string> workernames =
3437- items_table->get_table(key)->array_entries<std::string>();
3438- for (size_t rowindex = 0; rowindex < workernames.size(); ++rowindex) {
3439- try {
3440- DescriptionIndex workerindex = tribes_.safe_worker_index(workernames[rowindex]);
3441- if (has_worker(workerindex)) {
3442- throw GameDataError(
3443- "Duplicate definition of worker '%s'", workernames[rowindex].c_str());
3444- }
3445- workers_.insert(workerindex);
3446- column.push_back(workerindex);
3447-
3448- const WorkerDescr& worker_descr = *tribes_.get_worker_descr(workerindex);
3449- if (worker_descr.is_buildable() && worker_descr.buildcost().empty()) {
3450- worker_types_without_cost_.push_back(workerindex);
3451- }
3452- } catch (const WException& e) {
3453- throw GameDataError(
3454- "Failed adding worker '%s: %s", workernames[rowindex].c_str(), e.what());
3455- }
3456+ for (const std::string& workername : items_table->get_table(key)->array_entries<std::string>()) {
3457+ add_worker(workername, column);
3458 }
3459 if (!column.empty()) {
3460 workers_order_.push_back(column);
3461@@ -448,6 +433,30 @@
3462 }
3463 }
3464
3465+void TribeDescr::add_worker(const std::string& workername, std::vector<DescriptionIndex>& workers_order_column) {
3466+ try {
3467+ DescriptionIndex workerindex = tribes_.safe_worker_index(workername);
3468+ if (has_worker(workerindex)) {
3469+ throw GameDataError(
3470+ "Duplicate definition of worker '%s'", workername.c_str());
3471+ }
3472+ workers_.insert(workerindex);
3473+ workers_order_column.push_back(workerindex);
3474+
3475+ const WorkerDescr& worker_descr = *tribes_.get_worker_descr(workerindex);
3476+ if (worker_descr.is_buildable() && worker_descr.buildcost().empty()) {
3477+ worker_types_without_cost_.push_back(workerindex);
3478+ }
3479+ } catch (const WException& e) {
3480+ throw GameDataError(
3481+ "Failed adding worker '%s: %s", workername.c_str(), e.what());
3482+ }
3483+}
3484+
3485+void TribeDescr::add_worker(const std::string& workername) {
3486+ add_worker(workername, workers_order_.back());
3487+}
3488+
3489 ToolbarImageset* TribeDescr::toolbar_image_set() const {
3490 return toolbar_image_set_.get();
3491 }
3492
3493=== modified file 'src/logic/map_objects/tribes/tribe_descr.h'
3494--- src/logic/map_objects/tribes/tribe_descr.h 2019-05-30 19:34:33 +0000
3495+++ src/logic/map_objects/tribes/tribe_descr.h 2019-09-08 20:16:16 +0000
3496@@ -25,7 +25,7 @@
3497 #include <vector>
3498
3499 #include "base/macros.h"
3500-#include "graphic/animation.h"
3501+#include "graphic/animation/animation.h"
3502 #include "graphic/toolbar_imageset.h"
3503 #include "logic/map_objects/immovable.h"
3504 #include "logic/map_objects/tribes/building.h"
3505@@ -161,12 +161,18 @@
3506 return ship_names_;
3507 }
3508
3509+ /// Registers a building with the tribe
3510 void add_building(const std::string& buildingname);
3511+ /// Registers a worker with the tribe and adds it to the bottom of the last worker column
3512+ void add_worker(const std::string& workername);
3513
3514 // The custom toolbar imageset if any. Can be nullptr.
3515 ToolbarImageset* toolbar_image_set() const;
3516
3517 private:
3518+ /// Registers a worker with the tribe and adds it to the bottom of the given worker column
3519+ void add_worker(const std::string& workername, std::vector<DescriptionIndex>& workers_order_column);
3520+
3521 // Helper function for adding a special worker type (carriers etc.)
3522 DescriptionIndex add_special_worker(const std::string& workername);
3523 // Helper function for adding a special building type (port etc.)
3524
3525=== modified file 'src/logic/map_objects/tribes/tribes.cc'
3526--- src/logic/map_objects/tribes/tribes.cc 2019-08-21 20:01:40 +0000
3527+++ src/logic/map_objects/tribes/tribes.cc 2019-09-08 20:16:16 +0000
3528@@ -149,6 +149,16 @@
3529 }
3530 }
3531
3532+void Tribes::add_custom_worker(const LuaTable& table) {
3533+ const std::string tribename = table.get_string("tribename");
3534+ if (Widelands::tribe_exists(tribename)) {
3535+ TribeDescr* descr = tribes_->get_mutable(tribe_index(tribename));
3536+ descr->add_worker(table.get_string("workername"));
3537+ } else {
3538+ throw GameDataError("The tribe '%s'' has no preload file.", tribename.c_str());
3539+ }
3540+}
3541+
3542 size_t Tribes::nrbuildings() const {
3543 return buildings_->size();
3544 }
3545
3546=== modified file 'src/logic/map_objects/tribes/tribes.h'
3547--- src/logic/map_objects/tribes/tribes.h 2019-05-16 09:15:03 +0000
3548+++ src/logic/map_objects/tribes/tribes.h 2019-09-08 20:16:16 +0000
3549@@ -94,7 +94,10 @@
3550 /// Adds a specific tribe's configuration.
3551 void add_tribe(const LuaTable& table);
3552
3553+ /// Registers a custom scenario building with the tribes
3554 void add_custom_building(const LuaTable& table);
3555+ /// Registers a custom scenario worker with the tribes
3556+ void add_custom_worker(const LuaTable& table);
3557
3558 size_t nrbuildings() const;
3559 size_t nrtribes() const;
3560
3561=== modified file 'src/logic/map_objects/tribes/ware_descr.cc'
3562--- src/logic/map_objects/tribes/ware_descr.cc 2019-05-22 11:23:14 +0000
3563+++ src/logic/map_objects/tribes/ware_descr.cc 2019-09-08 20:16:16 +0000
3564@@ -24,7 +24,6 @@
3565 #include <boost/format.hpp>
3566
3567 #include "base/i18n.h"
3568-#include "graphic/animation.h"
3569 #include "logic/game_data_error.h"
3570 #include "logic/map_objects/tribes/tribe_descr.h"
3571
3572
3573=== modified file 'src/logic/map_objects/tribes/worker_descr.cc'
3574--- src/logic/map_objects/tribes/worker_descr.cc 2019-05-25 08:51:42 +0000
3575+++ src/logic/map_objects/tribes/worker_descr.cc 2019-09-08 20:16:16 +0000
3576@@ -95,8 +95,6 @@
3577 assign_directional_animation(&walk_anims_, "walk");
3578
3579 // Many workers don't carry wares, so they have no walkload animation.
3580- std::unique_ptr<LuaTable> anims(table.get_table("animations"));
3581- anims->do_not_warn_about_unaccessed_keys();
3582 if (is_animation_known("walkload_e")) {
3583 assign_directional_animation(&walkload_anims_, "walkload");
3584 }
3585
3586=== modified file 'src/logic/map_objects/tribes/worker_descr.h'
3587--- src/logic/map_objects/tribes/worker_descr.h 2019-05-26 11:45:16 +0000
3588+++ src/logic/map_objects/tribes/worker_descr.h 2019-09-08 20:16:16 +0000
3589@@ -24,7 +24,7 @@
3590
3591 #include "ai/ai_hints.h"
3592 #include "base/macros.h"
3593-#include "graphic/diranimations.h"
3594+#include "graphic/animation/diranimations.h"
3595 #include "logic/map_objects/bob.h"
3596 #include "logic/map_objects/immovable.h"
3597 #include "scripting/lua_table.h"
3598
3599=== modified file 'src/logic/map_objects/world/critter.h'
3600--- src/logic/map_objects/world/critter.h 2019-02-23 11:00:49 +0000
3601+++ src/logic/map_objects/world/critter.h 2019-09-08 20:16:16 +0000
3602@@ -21,7 +21,7 @@
3603 #define WL_LOGIC_MAP_OBJECTS_WORLD_CRITTER_H
3604
3605 #include "base/macros.h"
3606-#include "graphic/diranimations.h"
3607+#include "graphic/animation/diranimations.h"
3608 #include "logic/map_objects/bob.h"
3609
3610 class LuaTable;
3611
3612=== modified file 'src/logic/map_objects/world/terrain_description.cc'
3613--- src/logic/map_objects/world/terrain_description.cc 2019-08-22 19:30:40 +0000
3614+++ src/logic/map_objects/world/terrain_description.cc 2019-09-08 20:16:16 +0000
3615@@ -24,7 +24,7 @@
3616 #include <boost/format.hpp>
3617
3618 #include "base/i18n.h"
3619-#include "graphic/animation.h"
3620+#include "graphic/animation/animation.h"
3621 #include "graphic/graphic.h"
3622 #include "graphic/texture.h"
3623 #include "logic/game_data_error.h"
3624@@ -134,7 +134,7 @@
3625 }
3626
3627 texture_paths_ = table.get_table("textures")->array_entries<std::string>();
3628- frame_length_ = FRAME_LENGTH;
3629+ frame_length_ = kFrameLength;
3630 if (texture_paths_.empty()) {
3631 throw GameDataError("Terrain %s has no images.", name_.c_str());
3632 } else if (texture_paths_.size() == 1) {
3633
3634=== modified file 'src/scripting/lua_root.cc'
3635--- src/scripting/lua_root.cc 2019-03-01 04:19:53 +0000
3636+++ src/scripting/lua_root.cc 2019-09-08 20:16:16 +0000
3637@@ -540,6 +540,7 @@
3638 METHOD(LuaTribes, new_warehouse_type),
3639 METHOD(LuaTribes, new_worker_type),
3640 METHOD(LuaTribes, add_custom_building),
3641+ METHOD(LuaTribes, add_custom_worker),
3642 {0, 0},
3643 };
3644 const PropertyType<LuaTribes> LuaTribes::Properties[] = {
3645@@ -926,6 +927,41 @@
3646 return 0;
3647 }
3648
3649+
3650+/* RST
3651+ .. method:: add_custom_worker{table}
3652+
3653+ Adds a worker building to a tribe, e.g. for use in a scenario.
3654+ The worker must already be known to the tribes and should be defined in
3655+ the ``map:scripting/tribes/`` directory.
3656+
3657+ **Note:** This function *has* to be called from ``map:scripting/tribes/init.lua``.
3658+
3659+ The table has the following entries:
3660+
3661+ **tribename**
3662+ *Mandatory*. The name of the tribe that this worker will be added to.
3663+
3664+ **workername**
3665+ *Mandatory*. The name of the worker to be added to the tribe.
3666+
3667+ :returns: :const:`0`
3668+*/
3669+int LuaTribes::add_custom_worker(lua_State* L) {
3670+ if (lua_gettop(L) != 2) {
3671+ report_error(L, "Takes only one argument.");
3672+ }
3673+
3674+ try {
3675+ LuaTable table(L); // Will pop the table eventually.
3676+ EditorGameBase& egbase = get_egbase(L);
3677+ egbase.mutable_tribes()->add_custom_worker(table);
3678+ } catch (std::exception& e) {
3679+ report_error(L, "%s", e.what());
3680+ }
3681+ return 0;
3682+}
3683+
3684 /*
3685 ==========================================================
3686 C METHODS
3687
3688=== modified file 'src/scripting/lua_root.h'
3689--- src/scripting/lua_root.h 2019-02-23 11:00:49 +0000
3690+++ src/scripting/lua_root.h 2019-09-08 20:16:16 +0000
3691@@ -173,6 +173,7 @@
3692 int new_warehouse_type(lua_State* L);
3693 int new_worker_type(lua_State* L);
3694 int add_custom_building(lua_State* L);
3695+ int add_custom_worker(lua_State* L);
3696
3697 /*
3698 * C methods
3699
3700=== modified file 'src/website/CMakeLists.txt'
3701--- src/website/CMakeLists.txt 2019-05-04 15:37:33 +0000
3702+++ src/website/CMakeLists.txt 2019-09-08 20:16:16 +0000
3703@@ -1,3 +1,4 @@
3704+add_subdirectory(lua)
3705 add_subdirectory(json)
3706
3707 wl_library(website_common
3708@@ -12,6 +13,24 @@
3709 io_filesystem
3710 )
3711
3712+wl_binary(wl_create_spritesheet
3713+ SRCS
3714+ create_spritesheet.cc
3715+ DEPENDS
3716+ base_log
3717+ base_macros
3718+ graphic
3719+ graphic_animation
3720+ graphic_image_io
3721+ graphic_surface
3722+ io_filesystem
3723+ logic
3724+ logic_constants
3725+ logic_map_objects
3726+ lua_tree
3727+ website_common
3728+)
3729+
3730
3731 wl_binary(wl_map_info
3732 SRCS
3733
3734=== added file 'src/website/create_spritesheet.cc'
3735--- src/website/create_spritesheet.cc 1970-01-01 00:00:00 +0000
3736+++ src/website/create_spritesheet.cc 2019-09-08 20:16:16 +0000
3737@@ -0,0 +1,361 @@
3738+/*
3739+ * Copyright (C) 2018-2019 by the Widelands Development Team
3740+ *
3741+ * This program is free software; you can redistribute it and/or
3742+ * modify it under the terms of the GNU General Public License
3743+ * as published by the Free Software Foundation; either version 2
3744+ * of the License, or (at your option) any later version.
3745+ *
3746+ * This program is distributed in the hope that it will be useful,
3747+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3748+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3749+ * GNU General Public License for more details.
3750+ *
3751+ * You should have received a copy of the GNU General Public License
3752+ * along with this program; if not, write to the Free Software
3753+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
3754+ *
3755+ */
3756+
3757+#include <cassert>
3758+#include <memory>
3759+#include <vector>
3760+
3761+#include <SDL.h>
3762+#include <boost/algorithm/string.hpp>
3763+#include <boost/format.hpp>
3764+
3765+#include "base/log.h"
3766+#include "base/macros.h"
3767+#include "graphic/animation/animation.h"
3768+#include "graphic/animation/animation_manager.h"
3769+#include "graphic/graphic.h"
3770+#include "graphic/image.h"
3771+#include "graphic/image_io.h"
3772+#include "io/filesystem/filesystem.h"
3773+#include "io/filesystem/layered_filesystem.h"
3774+#include "logic/editor_game_base.h"
3775+#include "logic/map_objects/tribes/tribes.h"
3776+#include "logic/map_objects/world/critter.h"
3777+#include "logic/map_objects/world/world.h"
3778+#include "logic/widelands.h"
3779+#include "website/lua/lua_tree.h"
3780+#include "website/website_common.h"
3781+
3782+namespace {
3783+char const* const animation_direction_names[6] = {"_ne", "_e", "_se", "_sw", "_w", "_nw"};
3784+
3785+// Find trimmed rect according to transparent pixels.
3786+// Lock texture before you call this function.
3787+// TODO(GunChleoc): Revisit trimming when we have fresh Blender exports, to make sure that we won't jump a pixel when zooming
3788+void find_trim_rect(Texture* texture, Recti* rect) {
3789+ const int max_x = texture->width();
3790+ const int max_y = texture->height();
3791+
3792+ // Find left margin
3793+ bool found = false;
3794+ for (int x = 0; x < max_x && !found; ++x) {
3795+ for (int y = 0; y < max_y && !found; ++y) {
3796+ RGBAColor pixel = texture->get_pixel(x, y);
3797+ if (pixel.a != 0) {
3798+ rect->x = std::min(rect->x, x - 1);
3799+ found = true;
3800+ }
3801+ }
3802+ }
3803+ // Find right margin
3804+ found = false;
3805+ for (int x = max_x - 1; x >= 0 && !found; --x) {
3806+ for (int y = 0; y < max_y && !found; ++y) {
3807+ RGBAColor pixel = texture->get_pixel(x, y);
3808+ if (pixel.a != 0) {
3809+ rect->w = std::max(max_x, x + 1 - rect->x);
3810+ found = true;
3811+ }
3812+ }
3813+ }
3814+ // Find top margin
3815+ found = false;
3816+ for (int y = 0; y < max_y && !found; ++y) {
3817+ for (int x = 0; x < max_x && !found; ++x) {
3818+ RGBAColor pixel = texture->get_pixel(x, y);
3819+ if (pixel.a != 0) {
3820+ rect->y = std::min(rect->y, y - 1);
3821+ found = true;
3822+ }
3823+ }
3824+ }
3825+ // Find bottom margin
3826+ found = false;
3827+ for (int y = max_y - 1; y >= 0 && !found; --y) {
3828+ for (int x = 0; x < max_x && !found; ++x) {
3829+ RGBAColor pixel = texture->get_pixel(x, y);
3830+ if (pixel.a != 0) {
3831+ rect->h = std::max(max_y, y + 1 - rect->y);
3832+ found = true;
3833+ }
3834+ }
3835+ }
3836+}
3837+
3838+// Finds margins so that we can crop the animation to save space
3839+void find_margins(const std::vector<const Image*>& images, Recti* margins) {
3840+ for (const Image* image : images) {
3841+ std::unique_ptr<Texture> temp_texture(new Texture(image->width(), image->height()));
3842+ Rectf image_dimensions(Vector2f::zero(), image->width(), image->height());
3843+ temp_texture->blit(image_dimensions, *image, image_dimensions, 1., BlendMode::Copy);
3844+ temp_texture->lock();
3845+ find_trim_rect(temp_texture.get(), margins);
3846+ }
3847+}
3848+
3849+// Write a spritesheet of the given images into the given filename
3850+void write_spritesheet(std::vector<const Image*> imgs, const std::string& filename, const Recti& rect, int columns, int spritesheet_width, int spritesheet_height, FileSystem* out_filesystem) {
3851+ log("CREATING %d x %d spritesheet with %d columns, %" PRIuS " frames. Image size: %d x %d.\n", spritesheet_width, spritesheet_height, columns, imgs.size(), rect.w, rect.h);
3852+ std::unique_ptr<Texture> spritesheet(new Texture(spritesheet_width, spritesheet_height));
3853+ spritesheet->fill_rect(Rectf(Vector2f::zero(), spritesheet_width, spritesheet_height), RGBAColor(0, 0, 0, 0));
3854+ int row = 0;
3855+ int col = 0;
3856+ for (size_t i = 0; i < imgs.size(); ++i, ++col) {
3857+ if (col == columns) {
3858+ col = 0;
3859+ ++row;
3860+ }
3861+ const Image* image = imgs[i];
3862+ const int x = col * rect.w;
3863+ const int y = row * rect.h;
3864+ log("Frame %" PRIuS " at: %d, %d, %d, %d\n", i, x, y, x + rect.w, y + rect.h);
3865+ spritesheet->blit(Rectf(x, y, rect.w, rect.h), *image, Rectf(rect.x, rect.y, rect.w, rect.h), 1., BlendMode::Copy);
3866+ }
3867+ std::unique_ptr<::StreamWrite> sw(out_filesystem->open_stream_write(filename));
3868+ save_to_png(spritesheet.get(), sw.get(), ColorType::RGBA);
3869+ log("Wrote spritesheet to %s/%s\n", out_filesystem->get_basename().c_str(), filename.c_str());
3870+}
3871+
3872+// Container for writing spritesheet files
3873+struct SpritesheetData {
3874+ explicit SpritesheetData(const std::string& fb,
3875+ const std::vector<const Image*>& im,
3876+ const std::vector<const Image*>& pc) :
3877+ filename_base(fb),
3878+ images(im),
3879+ pc_masks(pc) {}
3880+
3881+ const std::string filename_base;
3882+ const std::vector<const Image*> images;
3883+ const std::vector<const Image*> pc_masks;
3884+};
3885+
3886+// Reads animation data from engine and then creates spritesheets and the corresponding lua code.
3887+void write_animation_spritesheets(Widelands::EditorGameBase& egbase,
3888+ const std::string& map_object_name,
3889+ const std::string& animation_name,
3890+ FileSystem* out_filesystem) {
3891+ const Widelands::Tribes& tribes = egbase.tribes();
3892+ const Widelands::World& world = egbase.world();
3893+ log("==========================================\n");
3894+
3895+ bool is_fontier_or_flag_animation = false;
3896+ uint32_t frontier_or_flag_animation_id = 0;
3897+
3898+ // Get the map object
3899+ const Widelands::MapObjectDescr* descr = nullptr;
3900+ if (tribes.building_exists(tribes.building_index(map_object_name))) {
3901+ descr = tribes.get_building_descr(tribes.building_index(map_object_name));
3902+ } else if (tribes.ware_exists(tribes.ware_index(map_object_name))) {
3903+ descr = tribes.get_ware_descr(tribes.ware_index(map_object_name));
3904+ } else if (tribes.worker_exists(tribes.worker_index(map_object_name))) {
3905+ descr = tribes.get_worker_descr(tribes.worker_index(map_object_name));
3906+ } else if (tribes.immovable_exists(tribes.immovable_index(map_object_name))) {
3907+ descr = tribes.get_immovable_descr(tribes.immovable_index(map_object_name));
3908+ } else if (tribes.ship_exists(tribes.ship_index(map_object_name))) {
3909+ descr = tribes.get_ship_descr(tribes.ship_index(map_object_name));
3910+ } else if (world.get_immovable_index(map_object_name) != Widelands::INVALID_INDEX) {
3911+ descr = world.get_immovable_descr(world.get_immovable_index(map_object_name));
3912+ } else if (world.get_critter_descr(map_object_name)) {
3913+ descr = world.get_critter_descr(map_object_name);
3914+ } else {
3915+ // Frontier and flag animations need special treatment
3916+ std::vector<std::string> map_object_name_vector;
3917+ boost::split(
3918+ map_object_name_vector, map_object_name, boost::is_any_of("_"));
3919+ if (map_object_name_vector.size() == 2) {
3920+ const Widelands::TribeDescr* tribe =
3921+ tribes.get_tribe_descr(tribes.tribe_index(map_object_name_vector.front()));
3922+ if (map_object_name_vector.back() == "frontier") {
3923+ is_fontier_or_flag_animation = true;
3924+ frontier_or_flag_animation_id = tribe->frontier_animation();
3925+ } else if (map_object_name_vector.back() == "flag") {
3926+ is_fontier_or_flag_animation = true;
3927+ frontier_or_flag_animation_id = tribe->flag_animation();
3928+ }
3929+ }
3930+ }
3931+ if (!is_fontier_or_flag_animation && descr == nullptr) {
3932+ log("ABORTING. Unable to find map object for '%s'!\n", map_object_name.c_str());
3933+ return;
3934+ }
3935+ assert(is_fontier_or_flag_animation || (descr->name() == map_object_name));
3936+
3937+ const bool is_directional = !is_fontier_or_flag_animation && descr->is_animation_known(animation_name + animation_direction_names[0]);
3938+
3939+ // Ensure that the animation exists
3940+ if (!is_fontier_or_flag_animation) {
3941+ if (!descr->is_animation_known(animation_name) && !descr->is_animation_known(animation_name + "_ne")) {
3942+ log("ABORTING. Unknown animation '%s' for '%s'\n", animation_name.c_str(),
3943+ map_object_name.c_str());
3944+ return;
3945+ }
3946+ }
3947+
3948+ // Representative animation for collecting global paramaters for the animation set
3949+ const Animation& representative_animation =
3950+ g_gr->animations().get_animation(is_fontier_or_flag_animation ?
3951+ frontier_or_flag_animation_id :
3952+ descr->get_animation(is_directional ?
3953+ animation_name + "_ne" :
3954+ animation_name, nullptr));
3955+
3956+ const int nr_frames = representative_animation.nr_frames();
3957+
3958+ // Only create spritesheet if animation has more than 1 frame.
3959+ if (nr_frames < 2) {
3960+ log("ABORTING. Animation '%s' for '%s' has less than 2 images and doesn't need a spritesheet.\n", animation_name.c_str(),
3961+ map_object_name.c_str());
3962+ return;
3963+ }
3964+
3965+ // Add global paramaters for this animation to Lua
3966+ std::unique_ptr<LuaTree::Element> lua_object(new LuaTree::Element());
3967+ LuaTree::Object* lua_animation = lua_object->add_object(animation_name);
3968+ lua_animation->add_raw("directory", "path.dirname(__file__)");
3969+ lua_animation->add_string("basename", animation_name);
3970+
3971+ // We only write FPS if the animation is not a build animation and does not use the default FPS.
3972+ if (animation_name != "build") {
3973+ uint32_t frametime = representative_animation.frametime();
3974+ assert(frametime > 0);
3975+ if (frametime != kFrameLength) {
3976+ assert(nr_frames > 1);
3977+ lua_animation->add_int("fps", 1000 / frametime);
3978+ }
3979+ }
3980+
3981+ log("WRITING '%s' animation for '%s'. It has %d pictures and %" PRIuS " scales.\n", animation_name.c_str(),
3982+ map_object_name.c_str(), nr_frames, representative_animation.available_scales().size());
3983+
3984+ const int columns = floor(sqrt(nr_frames));
3985+ int rows = 1;
3986+ while (rows * columns < nr_frames) {
3987+ ++rows;
3988+ }
3989+
3990+ lua_animation->add_int("frames", nr_frames);
3991+ lua_animation->add_int("rows", rows);
3992+ lua_animation->add_int("columns", columns);
3993+
3994+ const int representative_frame = representative_animation.representative_frame();
3995+ if (representative_frame > 0) {
3996+ lua_animation->add_int("representative_frame", representative_frame);
3997+ }
3998+
3999+ if (is_directional) {
4000+ lua_animation->add_bool("directional", true);
4001+ }
4002+
4003+ // Create image files for each scale and find & write the hotspot
4004+ for (const float scale : representative_animation.available_scales()) {
4005+ // Collect animation data to write
4006+ std::vector<SpritesheetData> spritesheets_to_write;
4007+ if (is_directional) {
4008+ for (int dir = 1; dir <= 6; ++dir) {
4009+ const std::string directional_animname =
4010+ animation_name + animation_direction_names[dir - 1];
4011+ if (!descr->is_animation_known(directional_animname)) {
4012+ throw wexception("Missing directional animation '%s\'",
4013+ directional_animname.c_str());
4014+ }
4015+ const std::string filename_base =
4016+ (boost::format("%s%s_%d") % animation_name % animation_direction_names[dir - 1] % scale).str();
4017+ const Animation& directional_animation =
4018+ g_gr->animations().get_animation(descr->get_animation(directional_animname, nullptr));
4019+ spritesheets_to_write.push_back(SpritesheetData(filename_base,
4020+ directional_animation.images(scale),
4021+ directional_animation.pc_masks(scale)));
4022+ }
4023+
4024+ } else {
4025+ spritesheets_to_write.push_back(SpritesheetData((boost::format("%s_%d") % animation_name % scale).str(),
4026+ representative_animation.images(scale),
4027+ representative_animation.pc_masks(scale)));
4028+ }
4029+
4030+ // Find margins for trimming
4031+ std::vector<const Image*> images = spritesheets_to_write.front().images;
4032+ Recti margins(images.front()->width() / 2, images.front()->height() / 2, images.front()->width() / 2, images.front()->height() / 2);
4033+ for (const auto& animation_data : spritesheets_to_write) {
4034+ find_margins(animation_data.images, &margins);
4035+ }
4036+
4037+ // Write the spritesheet(s)
4038+ const int spritesheet_width = columns * margins.w;
4039+ const int spritesheet_height = rows * margins.h;
4040+
4041+ if (spritesheet_width > kMinimumSizeForTextures || spritesheet_height > kMinimumSizeForTextures) {
4042+ egbase.cleanup_objects();
4043+ throw wexception("Unable to create spritesheet; either the width (%d) or the height (%d) are bigger than the minimum supported texture size (%d)", spritesheet_width, spritesheet_height, kMinimumSizeForTextures);
4044+ }
4045+
4046+ // Write spritesheets for animation and player colors
4047+ for (const auto& spritesheet_data : spritesheets_to_write) {
4048+ write_spritesheet(spritesheet_data.images, spritesheet_data.filename_base + ".png", margins, columns, spritesheet_width, spritesheet_height, out_filesystem);
4049+ if (!spritesheet_data.pc_masks.empty()) {
4050+ write_spritesheet(spritesheet_data.pc_masks, spritesheet_data.filename_base + "_pc.png", margins, columns, spritesheet_width, spritesheet_height, out_filesystem);
4051+ }
4052+ }
4053+
4054+ if (scale == 1.0f) {
4055+ // Adjust and write hostspot
4056+ LuaTree::Object* lua_table = lua_animation->add_object("hotspot");
4057+ const Vector2i& hotspot = representative_animation.hotspot();
4058+ lua_table->add_int("", hotspot.x - margins.x);
4059+ lua_table->add_int("", hotspot.y - margins.y);
4060+ }
4061+ }
4062+
4063+ log("LUA CODE:\n%s\n", lua_animation->as_string().c_str());
4064+ log("Done!\n");
4065+}
4066+
4067+} // namespace
4068+
4069+/*
4070+ ==========================================================
4071+ MAIN
4072+ ==========================================================
4073+ */
4074+
4075+int main(int argc, char** argv) {
4076+ if (argc != 4) {
4077+ log("Usage: %s <mapobject_name> <animation_name> <existing-output-path>\n", argv[0]);
4078+ return 1;
4079+ }
4080+
4081+ const std::string map_object_name = argv[1];
4082+ const std::string animation_name = argv[2];
4083+ const std::string output_path = argv[3];
4084+
4085+ try {
4086+ initialize();
4087+ std::unique_ptr<FileSystem> out_filesystem(&FileSystem::create(output_path));
4088+ Widelands::EditorGameBase egbase(nullptr);
4089+ write_animation_spritesheets(egbase, map_object_name, animation_name, out_filesystem.get());
4090+ egbase.cleanup_objects();
4091+ } catch (std::exception& e) {
4092+ log("Exception: %s.\n", e.what());
4093+ cleanup();
4094+ return 1;
4095+ }
4096+ cleanup();
4097+ return 0;
4098+}
4099
4100=== added directory 'src/website/lua'
4101=== added file 'src/website/lua/CMakeLists.txt'
4102--- src/website/lua/CMakeLists.txt 1970-01-01 00:00:00 +0000
4103+++ src/website/lua/CMakeLists.txt 2019-09-08 20:16:16 +0000
4104@@ -0,0 +1,10 @@
4105+wl_library(lua_tree
4106+ SRCS
4107+ lua_tree.cc
4108+ lua_tree.h
4109+ value.cc
4110+ value.h
4111+ DEPENDS
4112+ io_fileread
4113+ io_filesystem
4114+)
4115
4116=== added file 'src/website/lua/lua_tree.cc'
4117--- src/website/lua/lua_tree.cc 1970-01-01 00:00:00 +0000
4118+++ src/website/lua/lua_tree.cc 2019-09-08 20:16:16 +0000
4119@@ -0,0 +1,165 @@
4120+/*
4121+ * Copyright (C) 2018-2019 by the Widelands Development Team
4122+ *
4123+ * This program is free software; you can redistribute it and/or
4124+ * modify it under the terms of the GNU General Public License
4125+ * as published by the Free Software Foundation; either version 2
4126+ * of the License, or (at your option) any later version.
4127+ *
4128+ * This program is distributed in the hope that it will be useful,
4129+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4130+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4131+ * GNU General Public License for more details.
4132+ *
4133+ * You should have received a copy of the GNU General Public License
4134+ * along with this program; if not, write to the Free Software
4135+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
4136+ *
4137+ */
4138+
4139+#include "website/lua/lua_tree.h"
4140+
4141+#include <memory>
4142+
4143+#include "io/filewrite.h"
4144+
4145+// ########################## LuaTree Element #############################
4146+
4147+namespace LuaTree {
4148+const std::string LuaTree::Element::tab_ = " ";
4149+
4150+LuaTree::Object* Element::add_object(const std::string& key) {
4151+ children_.push_back(std::unique_ptr<LuaTree::Object>(new LuaTree::Object(key, level_ + 1)));
4152+ return dynamic_cast<LuaTree::Object*>(children_.back().get());
4153+}
4154+
4155+void Element::add_bool(const std::string& key, bool value) {
4156+ if (key.empty()) {
4157+ keyless_values_.push_back(std::unique_ptr<LuaTree::Value>(new LuaTree::Boolean(value)));
4158+ } else {
4159+ values_.push_back(std::unique_ptr<KeyValuePair>(new KeyValuePair(key, new LuaTree::Boolean(value))));
4160+ }
4161+}
4162+
4163+void Element::add_double(const std::string& key, double value) {
4164+ if (key.empty()) {
4165+ keyless_values_.push_back(std::unique_ptr<LuaTree::Value>(new LuaTree::Boolean(value)));
4166+ } else {
4167+ values_.push_back(std::unique_ptr<KeyValuePair>(new KeyValuePair(key, new LuaTree::Double(value))));
4168+ }
4169+}
4170+void Element::add_int(const std::string& key, int value) {
4171+ if (key.empty()) {
4172+ keyless_values_.push_back(std::unique_ptr<LuaTree::Value>(new LuaTree::Int(value)));
4173+ } else {
4174+ values_.push_back(std::unique_ptr<KeyValuePair>(new KeyValuePair(key, new LuaTree::Int(value))));
4175+ }
4176+}
4177+void Element::add_empty(const std::string& key) {
4178+ if (key.empty()) {
4179+ keyless_values_.push_back(std::unique_ptr<LuaTree::Value>(new LuaTree::Empty()));
4180+ } else {
4181+ values_.push_back(std::unique_ptr<KeyValuePair>(new KeyValuePair(key, new LuaTree::Empty())));
4182+ }
4183+}
4184+void Element::add_string(const std::string& key, const std::string& value) {
4185+ if (key.empty()) {
4186+ keyless_values_.push_back(std::unique_ptr<LuaTree::Value>(new LuaTree::String(value)));
4187+ } else {
4188+ values_.push_back(std::unique_ptr<KeyValuePair>(new KeyValuePair(key, new LuaTree::String(value))));
4189+ }
4190+}
4191+
4192+void Element::add_raw(const std::string& key, const std::string& value) {
4193+ if (key.empty()) {
4194+ keyless_values_.push_back(std::unique_ptr<LuaTree::Value>(new LuaTree::Raw(value)));
4195+ } else {
4196+ values_.push_back(std::unique_ptr<KeyValuePair>(new KeyValuePair(key, new LuaTree::Raw(value))));
4197+ }
4198+}
4199+
4200+void Element::write_to_file(FileSystem& fs, const std::string& filename) const {
4201+ FileWrite file_writer;
4202+ file_writer.text(as_string());
4203+ file_writer.write(fs, filename);
4204+}
4205+
4206+std::string Element::as_string() const {
4207+ return children_as_string();
4208+}
4209+
4210+std::string Element::keyless_values_as_string() const {
4211+ std::string result = "{";
4212+ if (!keyless_values_.empty()) {
4213+ for (size_t i = 0; i < keyless_values_.size() - 1; ++i) {
4214+ const auto& element = keyless_values_.at(i);
4215+ const std::string element_as_string = element->as_string();
4216+ result += " " + element_as_string + ",";
4217+ }
4218+ const auto& element = keyless_values_.at(keyless_values_.size() - 1);
4219+ const std::string element_as_string = element->as_string();
4220+ result += " " + element_as_string;
4221+ }
4222+ result += (children_.empty() && values_.empty()) ? " }" : " },";
4223+ return result;
4224+}
4225+
4226+std::string Element::values_as_string(const std::string& tabs) const {
4227+ std::string result = "";
4228+ if (!values_.empty()) {
4229+ for (size_t i = 0; i < values_.size() - 1; ++i) {
4230+ const auto& element = values_.at(i);
4231+ const std::string element_as_string = element->value->as_string();
4232+ result +=
4233+ tabs + tab_ + key_to_string(element->key, element_as_string.empty()) + element_as_string + ",\n";
4234+ }
4235+ const auto& element = values_.at(values_.size() - 1);
4236+ const std::string element_as_string = element->value->as_string();
4237+ result += tabs + tab_ + key_to_string(element->key, element_as_string.empty()) + element_as_string +
4238+ (children_.empty() ? "\n" : ",\n");
4239+ }
4240+ return result;
4241+}
4242+
4243+std::string Element::children_as_string() const {
4244+ std::string result = "";
4245+ if (!children_.empty()) {
4246+ for (size_t i = 0; i < children_.size() - 1; ++i) {
4247+ result += children_.at(i)->as_string() + ",\n";
4248+ }
4249+ result += children_.at(children_.size() - 1)->as_string() + "\n";
4250+ }
4251+ return result;
4252+}
4253+
4254+std::string Element::key_to_string(const std::string& value, bool value_is_empty) {
4255+ return value + (value_is_empty ? "" : " = ");
4256+}
4257+
4258+// ########################## LuaTree Table #############################
4259+
4260+Object::Object(const std::string& key, int level) : LuaTree::Element(key, level) {
4261+}
4262+
4263+std::string Object::as_string() const {
4264+ std::string result = "";
4265+ std::string tabs = "";
4266+ for (int i = 0; i < level_; ++i) {
4267+ tabs += tab_;
4268+ }
4269+
4270+ if (!keyless_values_.empty()) {
4271+ result += tabs + (key_.empty() ? "" : key_to_string(key_));
4272+ result += keyless_values_as_string();
4273+ } else {
4274+ result += tabs + (key_.empty() ? "" : key_to_string(key_)) + "{\n";
4275+ }
4276+ result += values_as_string(tabs);
4277+ result += children_as_string();
4278+ if (keyless_values_.empty()) {
4279+ result += tabs + "}";
4280+ }
4281+ return result;
4282+}
4283+
4284+} // namespace LuaTree
4285
4286=== added file 'src/website/lua/lua_tree.h'
4287--- src/website/lua/lua_tree.h 1970-01-01 00:00:00 +0000
4288+++ src/website/lua/lua_tree.h 2019-09-08 20:16:16 +0000
4289@@ -0,0 +1,98 @@
4290+/*
4291+ * Copyright (C) 2018-2019 by the Widelands Development Team
4292+ *
4293+ * This program is free software; you can redistribute it and/or
4294+ * modify it under the terms of the GNU General Public License
4295+ * as published by the Free Software Foundation; either version 2
4296+ * of the License, or (at your option) any later version.
4297+ *
4298+ * This program is distributed in the hope that it will be useful,
4299+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4300+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4301+ * GNU General Public License for more details.
4302+ *
4303+ * You should have received a copy of the GNU General Public License
4304+ * along with this program; if not, write to the Free Software
4305+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
4306+ *
4307+ */
4308+
4309+#ifndef WL_WEBSITE_LUA_LUA_TREE_H
4310+#define WL_WEBSITE_LUA_LUA_TREE_H
4311+
4312+#include <cassert>
4313+#include <memory>
4314+#include <string>
4315+#include <vector>
4316+
4317+#include "io/filesystem/filesystem.h"
4318+#include "website/lua/value.h"
4319+
4320+namespace LuaTree {
4321+
4322+class Object;
4323+
4324+class Element {
4325+protected:
4326+ // Constructor for child node
4327+ explicit Element(const std::string& key, int level) : key_(key), level_(level) {
4328+ }
4329+
4330+public:
4331+ // Constructor for root node
4332+ explicit Element() : LuaTree::Element("", -1) {
4333+ }
4334+ virtual ~Element() = default;
4335+
4336+ LuaTree::Object* add_object(const std::string& key = "");
4337+ void add_bool(const std::string& key, bool value);
4338+ void add_double(const std::string& key, double value);
4339+ void add_int(const std::string& key, int value);
4340+ void add_empty(const std::string& key);
4341+ void add_string(const std::string& key, const std::string& value);
4342+ void add_raw(const std::string& key, const std::string& value);
4343+
4344+ void write_to_file(FileSystem& fs, const std::string& filename) const;
4345+
4346+ virtual std::string as_string() const;
4347+
4348+protected:
4349+ static const std::string tab_;
4350+
4351+ struct KeyValuePair {
4352+ explicit KeyValuePair(const std::string& init_key, LuaTree::Value* init_value) :
4353+ key(init_key),
4354+ value(init_value) {}
4355+
4356+ const std::string key;
4357+ std::unique_ptr<LuaTree::Value> value;
4358+ };
4359+
4360+ std::string keyless_values_as_string() const;
4361+ std::string values_as_string(const std::string& tabs) const;
4362+ std::string children_as_string() const;
4363+ static std::string key_to_string(const std::string& value, bool value_is_empty = false);
4364+
4365+ std::string key_;
4366+ const int level_;
4367+ std::vector<std::unique_ptr<LuaTree::Element>> children_;
4368+ std::vector<std::unique_ptr<KeyValuePair>> values_;
4369+ std::vector<std::unique_ptr<LuaTree::Value>> keyless_values_;
4370+};
4371+
4372+class Object : public Element {
4373+ friend class LuaTree::Element;
4374+
4375+protected:
4376+ // Constructor for child node
4377+ explicit Object(const std::string& key, int level);
4378+
4379+public:
4380+ // Constructor for root node
4381+ explicit Object() : LuaTree::Element("", 0) {
4382+ }
4383+ std::string as_string() const override;
4384+};
4385+
4386+} // namespace LuaTree
4387+#endif // end of include guard: WL_WEBSITE_LUA_LUA_TREE_H
4388
4389=== added file 'src/website/lua/value.cc'
4390--- src/website/lua/value.cc 1970-01-01 00:00:00 +0000
4391+++ src/website/lua/value.cc 2019-09-08 20:16:16 +0000
4392@@ -0,0 +1,62 @@
4393+/*
4394+ * Copyright (C) 2018-2019 by the Widelands Development Team
4395+ *
4396+ * This program is free software; you can redistribute it and/or
4397+ * modify it under the terms of the GNU General Public License
4398+ * as published by the Free Software Foundation; either version 2
4399+ * of the License, or (at your option) any later version.
4400+ *
4401+ * This program is distributed in the hope that it will be useful,
4402+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4403+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4404+ * GNU General Public License for more details.
4405+ *
4406+ * You should have received a copy of the GNU General Public License
4407+ * along with this program; if not, write to the Free Software
4408+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
4409+ *
4410+ */
4411+
4412+#include "website/lua/value.h"
4413+
4414+#include <sstream>
4415+
4416+namespace LuaTree {
4417+
4418+Boolean::Boolean(bool value) : bool_value(value) {
4419+}
4420+std::string Boolean::as_string() const {
4421+ return bool_value ? "true" : "false";
4422+}
4423+
4424+Double::Double(double value) : double_value(value) {
4425+}
4426+std::string Double::as_string() const {
4427+ std::ostringstream strs;
4428+ strs << double_value;
4429+ return strs.str();
4430+}
4431+
4432+Int::Int(int value) : int_value(value) {}
4433+std::string Int::as_string() const {
4434+ std::ostringstream strs;
4435+ strs << int_value;
4436+ return strs.str();
4437+}
4438+
4439+std::string Empty::as_string() const {
4440+ return "nil";
4441+}
4442+
4443+String::String(const std::string& value) : string_value(value) {}
4444+std::string String::as_string() const {
4445+ return "\"" + string_value + "\"";
4446+}
4447+
4448+Raw::Raw(const std::string& value) : raw_value(value) {}
4449+std::string Raw::as_string() const {
4450+ return raw_value;
4451+}
4452+
4453+
4454+} // namespace LuaTree
4455
4456=== added file 'src/website/lua/value.h'
4457--- src/website/lua/value.h 1970-01-01 00:00:00 +0000
4458+++ src/website/lua/value.h 2019-09-08 20:16:16 +0000
4459@@ -0,0 +1,76 @@
4460+/*
4461+ * Copyright (C) 2018-2019 by the Widelands Development Team
4462+ *
4463+ * This program is free software; you can redistribute it and/or
4464+ * modify it under the terms of the GNU General Public License
4465+ * as published by the Free Software Foundation; either version 2
4466+ * of the License, or (at your option) any later version.
4467+ *
4468+ * This program is distributed in the hope that it will be useful,
4469+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4470+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4471+ * GNU General Public License for more details.
4472+ *
4473+ * You should have received a copy of the GNU General Public License
4474+ * along with this program; if not, write to the Free Software
4475+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
4476+ *
4477+ */
4478+
4479+#ifndef WL_WEBSITE_LUA_VALUE_H
4480+#define WL_WEBSITE_LUA_VALUE_H
4481+
4482+#include <string>
4483+
4484+namespace LuaTree {
4485+
4486+/// Value types for LuaTree
4487+struct Value {
4488+ Value() = default;
4489+ virtual ~Value() = default;
4490+ virtual std::string as_string() const = 0;
4491+};
4492+
4493+struct Boolean : Value {
4494+ explicit Boolean(bool value);
4495+ std::string as_string() const override;
4496+private:
4497+ const bool bool_value;
4498+};
4499+
4500+struct Double : Value {
4501+ explicit Double(double value);
4502+ std::string as_string() const override;
4503+private:
4504+ const double double_value;
4505+};
4506+
4507+struct Empty : Value {
4508+ Empty() = default;
4509+ std::string as_string() const override;
4510+};
4511+
4512+struct Int : Value {
4513+ explicit Int(int value);
4514+ std::string as_string() const override;
4515+private:
4516+ const int int_value;
4517+};
4518+
4519+struct String : Value {
4520+ explicit String(const std::string& value);
4521+ std::string as_string() const override;
4522+private:
4523+ const std::string string_value;
4524+};
4525+
4526+struct Raw : Value {
4527+ explicit Raw(const std::string& value);
4528+ std::string as_string() const override;
4529+private:
4530+ const std::string raw_value;
4531+};
4532+
4533+
4534+} // namespace LuaTree
4535+#endif // end of include guard: WL_WEBSITE_LUA_VALUE_H
4536
4537=== modified file 'test/maps/plain.wmf/scripting/test_ui.lua'
4538--- test/maps/plain.wmf/scripting/test_ui.lua 2019-08-10 10:01:04 +0000
4539+++ test/maps/plain.wmf/scripting/test_ui.lua 2019-09-08 20:16:16 +0000
4540@@ -77,7 +77,11 @@
4541 ok_button:click()
4542
4543 -- Give Widelands some time to close the map view
4544- sleep(10000)
4545+ count = 0
4546+ while (wl.ui.MapView() ~= nil and count < 50) do
4547+ sleep(1000)
4548+ count = count + 1
4549+ end
4550 assert_nil(wl.ui.MapView(), "Exiting by main menu did not close the map view")
4551
4552 if (wl.ui.MapView() ~= nil) then

Subscribers

People subscribed via source and target branches

to status/vote changes: