Merge lp:~widelands-dev/widelands/bug-1830526-soldier-walk-anims into lp:widelands

Proposed by Benedikt Straub
Status: Merged
Merged at revision: 9128
Proposed branch: lp:~widelands-dev/widelands/bug-1830526-soldier-walk-anims
Merge into: lp:widelands
Diff against target: 78 lines (+18/-7)
3 files modified
src/logic/map_objects/tribes/soldier.cc (+10/-5)
src/logic/map_objects/tribes/soldier.h (+7/-1)
src/logic/map_objects/tribes/worker_descr.h (+1/-1)
To merge this branch: bzr merge lp:~widelands-dev/widelands/bug-1830526-soldier-walk-anims
Reviewer Review Type Date Requested Status
GunChleoc Approve
Review via email: mp+367939@code.launchpad.net

Commit message

Cache soldiersĀ“ directional animations as unique_ptr to prevent memory leaks

To post a comment you must log in.
Revision history for this message
GunChleoc (gunchleoc) wrote :

Code LGTM - just 1 nit for a variable name

review: Approve
Revision history for this message
GunChleoc (gunchleoc) wrote :

Done some testing - it's gone :)

@bunnybot merge

Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 5066. State: passed. Details: https://travis-ci.org/widelands/widelands/builds/537427196.
Appveyor build 4846. State: failed. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_bug_1830526_soldier_walk_anims-4846.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/logic/map_objects/tribes/soldier.cc'
2--- src/logic/map_objects/tribes/soldier.cc 2019-05-18 20:43:25 +0000
3+++ src/logic/map_objects/tribes/soldier.cc 2019-05-26 12:22:03 +0000
4@@ -280,18 +280,23 @@
5 }
6
7 const DirAnimations& SoldierDescr::get_right_walk_anims(bool const ware,
8- const Worker* worker) const {
9- const Soldier* soldier = dynamic_cast<const Soldier*>(worker);
10+ Worker* worker) const {
11+ Soldier* soldier = dynamic_cast<Soldier*>(worker);
12 if (!soldier) {
13 return WorkerDescr::get_right_walk_anims(ware, worker);
14 }
15- DirAnimations* anim = new DirAnimations();
16+ auto& cache = soldier->get_walking_animations_cache();
17+ if (cache.first && cache.first->matches(soldier)) {
18+ return *cache.second;
19+ }
20 for (const auto& pair : walk_name_) {
21 if (pair.first->matches(soldier)) {
22+ cache.first.reset(new SoldierLevelRange(*pair.first));
23+ cache.second.reset(new DirAnimations());
24 for (uint8_t dir = 1; dir <= 6; ++dir) {
25- anim->set_animation(dir, get_animation(pair.second.at(dir), worker));
26+ cache.second->set_animation(dir, get_animation(pair.second.at(dir), worker));
27 }
28- return *anim;
29+ return *cache.second;
30 }
31 }
32 throw GameDataError(
33
34=== modified file 'src/logic/map_objects/tribes/soldier.h'
35--- src/logic/map_objects/tribes/soldier.h 2019-05-18 20:43:25 +0000
36+++ src/logic/map_objects/tribes/soldier.h 2019-05-26 12:22:03 +0000
37@@ -133,7 +133,7 @@
38
39 uint32_t get_rand_anim(Game& game, const std::string& name, const Soldier* soldier) const;
40
41- const DirAnimations& get_right_walk_anims(bool const ware, const Worker* w) const override;
42+ const DirAnimations& get_right_walk_anims(bool const ware, Worker* w) const override;
43 uint32_t get_animation(const std::string& anim, const MapObject* mo = nullptr) const override;
44
45 protected:
46@@ -312,6 +312,10 @@
47 void start_task_move_in_battle(Game&, CombatWalkingDir);
48 void start_task_die(Game&);
49
50+ std::pair<std::unique_ptr<SoldierLevelRange>, std::unique_ptr<DirAnimations>>& get_walking_animations_cache() {
51+ return walking_animations_cache_;
52+ }
53+
54 private:
55 void attack_update(Game&, State&);
56 void attack_pop(Game&, State&);
57@@ -363,6 +367,8 @@
58 */
59 Battle* battle_;
60
61+ std::pair<std::unique_ptr<SoldierLevelRange>, std::unique_ptr<DirAnimations>> walking_animations_cache_;
62+
63 static constexpr uint8_t kSoldierHealthBarWidth = 13;
64
65 /// Number of consecutive blocked signals until the soldiers are considered permanently stuck
66
67=== modified file 'src/logic/map_objects/tribes/worker_descr.h'
68--- src/logic/map_objects/tribes/worker_descr.h 2019-05-19 09:21:11 +0000
69+++ src/logic/map_objects/tribes/worker_descr.h 2019-05-26 12:22:03 +0000
70@@ -87,7 +87,7 @@
71 default_target_quantity_ = 1;
72 }
73
74- virtual const DirAnimations& get_right_walk_anims(bool const carries_ware, const Worker*) const {
75+ virtual const DirAnimations& get_right_walk_anims(bool const carries_ware, Worker*) const {
76 return carries_ware ? walkload_anims_ : walk_anims_;
77 }
78 WorkerProgram const* get_program(const std::string&) const;

Subscribers

People subscribed via source and target branches

to status/vote changes: