Status: | Merged | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Merged at revision: | not available | ||||||||||||
Proposed branch: | lp:~nha/widelands/fixes | ||||||||||||
Merge into: | lp:widelands | ||||||||||||
Diff against target: |
700 lines (+225/-79) 14 files modified
src/log.cc (+2/-2) src/log.h (+2/-0) src/logic/bob.cc (+0/-8) src/logic/bob.h (+7/-1) src/logic/immovable.cc (+25/-3) src/logic/immovable.h (+9/-0) src/logic/instances.cc (+3/-0) src/logic/map.cc (+2/-0) src/logic/soldier.cc (+64/-55) src/logic/worker.cc (+41/-9) src/logic/worker.h (+3/-0) src/ui_basic/editbox.cc (+58/-1) src/ui_basic/editbox.h (+2/-0) src/wlapplication.cc (+7/-0) |
||||||||||||
To merge this branch: | bzr merge lp:~nha/widelands/fixes | ||||||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Widelands Developers | Pending | ||
Review via email:
|
Commit message
Description of the change
Various small fixes and behavior changes that I suggest for merging after the release of build15.
To post a comment you must log in.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
SirVer (sirver) wrote : | # |
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Raul Ferriz (raul.ferriz) wrote : | # |
I have checked the code, but not try to compile and run. It is safe, some clean up and longer waiting checks for soldiers when waiting a signal.
The only but is that I think that this can break replays.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Nicolai Hähnle (nha) wrote : | # |
Yes, it does break replays. I don't think this is a problem, since we have never guaranteed compatibility of replays.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/log.cc' | |||
2 | --- src/log.cc 2010-03-27 23:50:23 +0000 | |||
3 | +++ src/log.cc 2010-04-13 18:44:39 +0000 | |||
4 | @@ -25,6 +25,8 @@ | |||
5 | 25 | 25 | ||
6 | 26 | extern std::ostream & wout; | 26 | extern std::ostream & wout; |
7 | 27 | 27 | ||
8 | 28 | bool g_verbose = false; | ||
9 | 29 | |||
10 | 28 | void log(const char * const fmt, ...) { | 30 | void log(const char * const fmt, ...) { |
11 | 29 | char buffer[2048]; | 31 | char buffer[2048]; |
12 | 30 | va_list va; | 32 | va_list va; |
13 | @@ -33,8 +35,6 @@ | |||
14 | 33 | vsnprintf(buffer, sizeof(buffer), fmt, va); | 35 | vsnprintf(buffer, sizeof(buffer), fmt, va); |
15 | 34 | va_end(va); | 36 | va_end(va); |
16 | 35 | 37 | ||
17 | 36 | //TODO: use iostreams instead of vprintf because other parts of | ||
18 | 37 | // Widelands use iostreams | ||
19 | 38 | wout << buffer; | 38 | wout << buffer; |
20 | 39 | wout.flush(); | 39 | wout.flush(); |
21 | 40 | } | 40 | } |
22 | 41 | 41 | ||
23 | === modified file 'src/log.h' | |||
24 | --- src/log.h 2010-03-27 23:50:23 +0000 | |||
25 | +++ src/log.h 2010-04-13 18:44:39 +0000 | |||
26 | @@ -33,4 +33,6 @@ | |||
27 | 33 | // wout is either std::cout or specified logfile. | 33 | // wout is either std::cout or specified logfile. |
28 | 34 | void log(const char *, ...) PRINTF_FORMAT(1, 2); | 34 | void log(const char *, ...) PRINTF_FORMAT(1, 2); |
29 | 35 | 35 | ||
30 | 36 | extern bool g_verbose; | ||
31 | 37 | |||
32 | 36 | #endif | 38 | #endif |
33 | 37 | 39 | ||
34 | === modified file 'src/logic/bob.cc' | |||
35 | --- src/logic/bob.cc 2010-04-04 12:32:35 +0000 | |||
36 | +++ src/logic/bob.cc 2010-04-13 18:44:39 +0000 | |||
37 | @@ -692,10 +692,6 @@ | |||
38 | 692 | void Bob::movepath_update(Game & game, State & state) | 692 | void Bob::movepath_update(Game & game, State & state) |
39 | 693 | { | 693 | { |
40 | 694 | if (get_signal().size()) { | 694 | if (get_signal().size()) { |
41 | 695 | if (serial() == 3755) | ||
42 | 696 | molog | ||
43 | 697 | ("[movepath_update] signal '%s'; popping task\n", | ||
44 | 698 | get_signal().c_str()); | ||
45 | 699 | return pop_task(game); | 695 | return pop_task(game); |
46 | 700 | } | 696 | } |
47 | 701 | 697 | ||
48 | @@ -919,10 +915,6 @@ | |||
49 | 919 | m_walkstart = game.get_gametime(); | 915 | m_walkstart = game.get_gametime(); |
50 | 920 | m_walkend = m_walkstart + tdelta; | 916 | m_walkend = m_walkstart + tdelta; |
51 | 921 | 917 | ||
52 | 922 | if (serial() == 3755) | ||
53 | 923 | molog | ||
54 | 924 | ("[start_walk]: changint position from (%i, %i) to (%i, %i)\n", | ||
55 | 925 | get_position().x, get_position().y, newnode.x, newnode.y); | ||
56 | 926 | set_position(game, newnode); | 918 | set_position(game, newnode); |
57 | 927 | set_animation(game, a); | 919 | set_animation(game, a); |
58 | 928 | 920 | ||
59 | 929 | 921 | ||
60 | === modified file 'src/logic/bob.h' | |||
61 | --- src/logic/bob.h 2010-04-03 16:44:44 +0000 | |||
62 | +++ src/logic/bob.h 2010-04-13 18:44:39 +0000 | |||
63 | @@ -323,11 +323,17 @@ | |||
64 | 323 | bool is_walking() {return m_walking != IDLE;} | 323 | bool is_walking() {return m_walking != IDLE;} |
65 | 324 | 324 | ||
66 | 325 | 325 | ||
67 | 326 | /** | ||
68 | 327 | * This is a hack that should not be used, if possible. | ||
69 | 328 | * It is only introduced here because profiling showed | ||
70 | 329 | * that soldiers spend a lot of time in the node blocked check. | ||
71 | 330 | */ | ||
72 | 331 | Bob * get_next_on_field() const {return m_linknext;} | ||
73 | 332 | |||
74 | 326 | protected: | 333 | protected: |
75 | 327 | Bob(const Descr & descr); | 334 | Bob(const Descr & descr); |
76 | 328 | virtual ~Bob(); | 335 | virtual ~Bob(); |
77 | 329 | 336 | ||
78 | 330 | |||
79 | 331 | private: | 337 | private: |
80 | 332 | void do_act(Game &); | 338 | void do_act(Game &); |
81 | 333 | void do_pop_task(Game &); | 339 | void do_pop_task(Game &); |
82 | 334 | 340 | ||
83 | === modified file 'src/logic/immovable.cc' | |||
84 | --- src/logic/immovable.cc 2010-04-01 11:19:48 +0000 | |||
85 | +++ src/logic/immovable.cc 2010-04-13 18:44:39 +0000 | |||
86 | @@ -337,7 +337,8 @@ | |||
87 | 337 | m_anim (0), | 337 | m_anim (0), |
88 | 338 | m_program (0), | 338 | m_program (0), |
89 | 339 | m_program_ptr (0), | 339 | m_program_ptr (0), |
91 | 340 | m_program_step(0) | 340 | m_program_step(0), |
92 | 341 | m_reserved_by_worker(false) | ||
93 | 341 | {} | 342 | {} |
94 | 342 | 343 | ||
95 | 343 | 344 | ||
96 | @@ -471,6 +472,22 @@ | |||
97 | 471 | dst.drawanim(pos, m_anim, game.get_gametime() - m_animstart, 0); | 472 | dst.drawanim(pos, m_anim, game.get_gametime() - m_animstart, 0); |
98 | 472 | } | 473 | } |
99 | 473 | 474 | ||
100 | 475 | /** | ||
101 | 476 | * Returns whether this immovable was reserved by a worker. | ||
102 | 477 | */ | ||
103 | 478 | bool Immovable::is_reserved_by_worker() const | ||
104 | 479 | { | ||
105 | 480 | return m_reserved_by_worker; | ||
106 | 481 | } | ||
107 | 482 | |||
108 | 483 | /** | ||
109 | 484 | * Change whether this immovable is marked as reserved by a worker. | ||
110 | 485 | */ | ||
111 | 486 | void Immovable::set_reserved_by_worker(bool reserve) | ||
112 | 487 | { | ||
113 | 488 | m_reserved_by_worker = reserve; | ||
114 | 489 | } | ||
115 | 490 | |||
116 | 474 | 491 | ||
117 | 475 | /* | 492 | /* |
118 | 476 | ============================== | 493 | ============================== |
119 | @@ -480,7 +497,7 @@ | |||
120 | 480 | ============================== | 497 | ============================== |
121 | 481 | */ | 498 | */ |
122 | 482 | 499 | ||
124 | 483 | #define IMMOVABLE_SAVEGAME_VERSION 2 | 500 | #define IMMOVABLE_SAVEGAME_VERSION 3 |
125 | 484 | 501 | ||
126 | 485 | void Immovable::Loader::load(FileRead & fr, uint8_t const version) | 502 | void Immovable::Loader::load(FileRead & fr, uint8_t const version) |
127 | 486 | { | 503 | { |
128 | @@ -537,6 +554,9 @@ | |||
129 | 537 | } | 554 | } |
130 | 538 | 555 | ||
131 | 539 | imm.m_program_step = fr.Signed32(); | 556 | imm.m_program_step = fr.Signed32(); |
132 | 557 | |||
133 | 558 | if (version >= 3) | ||
134 | 559 | imm.m_reserved_by_worker = fr.Unsigned8(); | ||
135 | 540 | } | 560 | } |
136 | 541 | 561 | ||
137 | 542 | void Immovable::Loader::load_pointers() | 562 | void Immovable::Loader::load_pointers() |
138 | @@ -560,7 +580,7 @@ | |||
139 | 560 | void Immovable::save | 580 | void Immovable::save |
140 | 561 | (Editor_Game_Base & egbase, Map_Map_Object_Saver & mos, FileWrite & fw) | 581 | (Editor_Game_Base & egbase, Map_Map_Object_Saver & mos, FileWrite & fw) |
141 | 562 | { | 582 | { |
143 | 563 | // This is in front because it is required to obtain the descriptiong | 583 | // This is in front because it is required to obtain the description |
144 | 564 | // necessary to create the Immovable | 584 | // necessary to create the Immovable |
145 | 565 | fw.Unsigned8(header_Immovable); | 585 | fw.Unsigned8(header_Immovable); |
146 | 566 | fw.Unsigned8(IMMOVABLE_SAVEGAME_VERSION); | 586 | fw.Unsigned8(IMMOVABLE_SAVEGAME_VERSION); |
147 | @@ -586,6 +606,8 @@ | |||
148 | 586 | 606 | ||
149 | 587 | fw.Unsigned32(m_program_ptr); | 607 | fw.Unsigned32(m_program_ptr); |
150 | 588 | fw.Signed32(m_program_step); | 608 | fw.Signed32(m_program_step); |
151 | 609 | |||
152 | 610 | fw.Unsigned8(m_reserved_by_worker); | ||
153 | 589 | } | 611 | } |
154 | 590 | 612 | ||
155 | 591 | Map_Object::Loader * Immovable::load | 613 | Map_Object::Loader * Immovable::load |
156 | 592 | 614 | ||
157 | === modified file 'src/logic/immovable.h' | |||
158 | --- src/logic/immovable.h 2010-02-28 18:40:36 +0000 | |||
159 | +++ src/logic/immovable.h 2010-04-13 18:44:39 +0000 | |||
160 | @@ -153,6 +153,9 @@ | |||
161 | 153 | return descr().get_owner_tribe(); | 153 | return descr().get_owner_tribe(); |
162 | 154 | } | 154 | } |
163 | 155 | 155 | ||
164 | 156 | bool is_reserved_by_worker() const; | ||
165 | 157 | void set_reserved_by_worker(bool reserve); | ||
166 | 158 | |||
167 | 156 | protected: | 159 | protected: |
168 | 157 | Coords m_position; | 160 | Coords m_position; |
169 | 158 | 161 | ||
170 | @@ -163,6 +166,12 @@ | |||
171 | 163 | uint32_t m_program_ptr; ///< index of next instruction to execute | 166 | uint32_t m_program_ptr; ///< index of next instruction to execute |
172 | 164 | int32_t m_program_step; ///< time of next step | 167 | int32_t m_program_step; ///< time of next step |
173 | 165 | 168 | ||
174 | 169 | /** | ||
175 | 170 | * Immovables like trees are reserved by a worker that is walking | ||
176 | 171 | * towards them, so that e.g. two lumberjacks don't attempt to | ||
177 | 172 | * work on the same tree simultaneously. | ||
178 | 173 | */ | ||
179 | 174 | bool m_reserved_by_worker; | ||
180 | 166 | 175 | ||
181 | 167 | // Load/save support | 176 | // Load/save support |
182 | 168 | protected: | 177 | protected: |
183 | 169 | 178 | ||
184 | === modified file 'src/logic/instances.cc' | |||
185 | --- src/logic/instances.cc 2010-03-27 23:50:23 +0000 | |||
186 | +++ src/logic/instances.cc 2010-04-13 18:44:39 +0000 | |||
187 | @@ -437,6 +437,9 @@ | |||
188 | 437 | */ | 437 | */ |
189 | 438 | void Map_Object::molog(char const * fmt, ...) const | 438 | void Map_Object::molog(char const * fmt, ...) const |
190 | 439 | { | 439 | { |
191 | 440 | if (!g_verbose && !m_logsink) | ||
192 | 441 | return; | ||
193 | 442 | |||
194 | 440 | va_list va; | 443 | va_list va; |
195 | 441 | char buffer[2048]; | 444 | char buffer[2048]; |
196 | 442 | 445 | ||
197 | 443 | 446 | ||
198 | === modified file 'src/logic/map.cc' | |||
199 | --- src/logic/map.cc 2010-04-03 16:44:44 +0000 | |||
200 | +++ src/logic/map.cc 2010-04-13 18:44:39 +0000 | |||
201 | @@ -1892,6 +1892,7 @@ | |||
202 | 1892 | 1892 | ||
203 | 1893 | // Recursively check integrity | 1893 | // Recursively check integrity |
204 | 1894 | void debug(uint32_t const node, char const * const str) { | 1894 | void debug(uint32_t const node, char const * const str) { |
205 | 1895 | #if 0 | ||
206 | 1895 | uint32_t l = node * 2 + 1; | 1896 | uint32_t l = node * 2 + 1; |
207 | 1896 | uint32_t r = node * 2 + 2; | 1897 | uint32_t r = node * 2 + 2; |
208 | 1897 | if (m_data[node]->heap_index != static_cast<int32_t>(node)) { | 1898 | if (m_data[node]->heap_index != static_cast<int32_t>(node)) { |
209 | @@ -1912,6 +1913,7 @@ | |||
210 | 1912 | } | 1913 | } |
211 | 1913 | debug(r, str); | 1914 | debug(r, str); |
212 | 1914 | } | 1915 | } |
213 | 1916 | #endif | ||
214 | 1915 | } | 1917 | } |
215 | 1916 | 1918 | ||
216 | 1917 | private: | 1919 | private: |
217 | 1918 | 1920 | ||
218 | === modified file 'src/logic/soldier.cc' | |||
219 | --- src/logic/soldier.cc 2010-04-04 12:32:35 +0000 | |||
220 | +++ src/logic/soldier.cc 2010-04-13 18:44:39 +0000 | |||
221 | @@ -781,7 +781,9 @@ | |||
222 | 781 | if (signal == "blocked") | 781 | if (signal == "blocked") |
223 | 782 | // Wait before we try again. Note that this must come *after* | 782 | // Wait before we try again. Note that this must come *after* |
224 | 783 | // we check for a battle | 783 | // we check for a battle |
226 | 784 | return start_task_idle(game, get_animation("idle"), 250); | 784 | // Note that we *should* be woken via sendSpaceSignals, |
227 | 785 | // so the timeout is just an additional safety net. | ||
228 | 786 | return start_task_idle(game, get_animation("idle"), 5000); | ||
229 | 785 | 787 | ||
230 | 786 | if (!location) { | 788 | if (!location) { |
231 | 787 | molog("[attack] our location disappeared during a battle\n"); | 789 | molog("[attack] our location disappeared during a battle\n"); |
232 | @@ -854,7 +856,7 @@ | |||
233 | 854 | (start_task_movepath | 856 | (start_task_movepath |
234 | 855 | (game, | 857 | (game, |
235 | 856 | baseflag.get_position(), | 858 | baseflag.get_position(), |
237 | 857 | 0, | 859 | 4, // use larger persist when returning home |
238 | 858 | descr().get_right_walk_anims(does_carry_ware()))) | 860 | descr().get_right_walk_anims(does_carry_ware()))) |
239 | 859 | return; | 861 | return; |
240 | 860 | else { | 862 | else { |
241 | @@ -870,7 +872,7 @@ | |||
242 | 870 | (start_task_movepath | 872 | (start_task_movepath |
243 | 871 | (game, | 873 | (game, |
244 | 872 | enemy->base_flag().get_position(), | 874 | enemy->base_flag().get_position(), |
246 | 873 | 2, | 875 | 3, |
247 | 874 | descr().get_right_walk_anims(does_carry_ware()))) | 876 | descr().get_right_walk_anims(does_carry_ware()))) |
248 | 875 | return; | 877 | return; |
249 | 876 | else { | 878 | else { |
250 | @@ -1015,7 +1017,9 @@ | |||
251 | 1015 | if (signal == "blocked") | 1017 | if (signal == "blocked") |
252 | 1016 | // Wait before we try again. Note that this must come *after* | 1018 | // Wait before we try again. Note that this must come *after* |
253 | 1017 | // we check for a battle | 1019 | // we check for a battle |
255 | 1018 | return start_task_idle(game, get_animation("idle"), 250); | 1020 | // Note that we *should* be woken via sendSpaceSignals, |
256 | 1021 | // so the timeout is just an additional safety net. | ||
257 | 1022 | return start_task_idle(game, get_animation("idle"), 5000); | ||
258 | 1019 | 1023 | ||
259 | 1020 | // If we only are defending our home ... | 1024 | // If we only are defending our home ... |
260 | 1021 | if (state.ivar1 & CF_DEFEND_STAYHOME) { | 1025 | if (state.ivar1 & CF_DEFEND_STAYHOME) { |
261 | @@ -1103,7 +1107,7 @@ | |||
262 | 1103 | (start_task_movepath | 1107 | (start_task_movepath |
263 | 1104 | (game, | 1108 | (game, |
264 | 1105 | baseflag.get_position(), | 1109 | baseflag.get_position(), |
266 | 1106 | 0, | 1110 | 4, // use larger persist when returning home |
267 | 1107 | descr().get_right_walk_anims(does_carry_ware()))) | 1111 | descr().get_right_walk_anims(does_carry_ware()))) |
268 | 1108 | return; | 1112 | return; |
269 | 1109 | 1113 | ||
270 | @@ -1153,7 +1157,7 @@ | |||
271 | 1153 | (start_task_movepath | 1157 | (start_task_movepath |
272 | 1154 | (game, | 1158 | (game, |
273 | 1155 | target.s->get_position(), | 1159 | target.s->get_position(), |
275 | 1156 | 1, | 1160 | 3, |
276 | 1157 | descr().get_right_walk_anims(does_carry_ware()), | 1161 | descr().get_right_walk_anims(does_carry_ware()), |
277 | 1158 | false, | 1162 | false, |
278 | 1159 | 1)) | 1163 | 1)) |
279 | @@ -1506,62 +1510,67 @@ | |||
280 | 1506 | bool Soldier::checkNodeBlocked | 1510 | bool Soldier::checkNodeBlocked |
281 | 1507 | (Game & game, FCoords const & field, bool const commit) | 1511 | (Game & game, FCoords const & field, bool const commit) |
282 | 1508 | { | 1512 | { |
297 | 1509 | if (!isOnBattlefield()) | 1513 | State * attackdefense = get_state(taskAttack); |
298 | 1510 | return false; | 1514 | |
299 | 1511 | 1515 | if (!attackdefense) | |
300 | 1512 | if (upcast(Building, building, get_location(game))) { | 1516 | attackdefense = get_state(taskDefense); |
287 | 1513 | if (field == building->get_position()) { | ||
288 | 1514 | if (commit) | ||
289 | 1515 | sendSpaceSignals(game); | ||
290 | 1516 | return false; // we can always walk home | ||
291 | 1517 | } | ||
292 | 1518 | } | ||
293 | 1519 | |||
294 | 1520 | std::vector<Bob *> soldiers; | ||
295 | 1521 | game.map().find_bobs | ||
296 | 1522 | (Area<FCoords>(field, 0), &soldiers, FindBobSoldierOnBattlefield()); | ||
301 | 1523 | 1517 | ||
302 | 1524 | if | 1518 | if |
308 | 1525 | (soldiers.size() && | 1519 | (!attackdefense || |
309 | 1526 | (!m_battle || | 1520 | (attackdefense->ivar1 & CF_RETREAT_WHEN_INJURED and |
310 | 1527 | std::find(soldiers.begin(), soldiers.end(), m_battle->opponent(*this)) | 1521 | attackdefense->ui32var3 > get_current_hitpoints())) |
306 | 1528 | == | ||
307 | 1529 | soldiers.end())) | ||
311 | 1530 | { | 1522 | { |
315 | 1531 | if (commit && soldiers.size() == 1) { | 1523 | // Retreating or non-combatant soldiers act like normal bobs |
316 | 1532 | Soldier & soldier = ref_cast<Soldier, Bob>(*soldiers[0]); | 1524 | return Bob::checkNodeBlocked(game, field, commit); |
317 | 1533 | if (soldier.get_owner() != get_owner() && soldier.canBeChallenged()) { | 1525 | } |
318 | 1526 | |||
319 | 1527 | if (field.field->get_immovable() && field.field->get_immovable() == get_location(game)) { | ||
320 | 1528 | if (commit) | ||
321 | 1529 | sendSpaceSignals(game); | ||
322 | 1530 | return false; // we can always walk home | ||
323 | 1531 | } | ||
324 | 1532 | |||
325 | 1533 | Soldier * foundsoldier = 0; | ||
326 | 1534 | bool foundbattle = false; | ||
327 | 1535 | bool foundopponent = false; | ||
328 | 1536 | bool multiplesoldiers = false; | ||
329 | 1537 | |||
330 | 1538 | for (Bob * bob = field.field->get_first_bob(); bob; bob = bob->get_next_on_field()) { | ||
331 | 1539 | if (upcast(Soldier, soldier, bob)) { | ||
332 | 1540 | if (!soldier->isOnBattlefield() || !soldier->get_current_hitpoints()) | ||
333 | 1541 | continue; | ||
334 | 1542 | |||
335 | 1543 | if (!foundsoldier) { | ||
336 | 1544 | foundsoldier = soldier; | ||
337 | 1545 | } else { | ||
338 | 1546 | multiplesoldiers = true; | ||
339 | 1547 | } | ||
340 | 1548 | |||
341 | 1549 | if (soldier->getBattle()) { | ||
342 | 1550 | foundbattle = true; | ||
343 | 1551 | |||
344 | 1552 | if (m_battle && m_battle->opponent(*this) == soldier) | ||
345 | 1553 | foundopponent = true; | ||
346 | 1554 | } | ||
347 | 1555 | } | ||
348 | 1556 | } | ||
349 | 1557 | |||
350 | 1558 | if (!foundopponent && (foundbattle || foundsoldier)) { | ||
351 | 1559 | if (commit && !foundbattle && !multiplesoldiers) { | ||
352 | 1560 | if (foundsoldier->get_owner() != get_owner() && foundsoldier->canBeChallenged()) { | ||
353 | 1534 | molog | 1561 | molog |
354 | 1535 | ("[checkNodeBlocked] attacking a soldier (%u)\n", | 1562 | ("[checkNodeBlocked] attacking a soldier (%u)\n", |
378 | 1536 | soldier.serial()); | 1563 | foundsoldier->serial()); |
379 | 1537 | new Battle(game, *this, soldier); | 1564 | new Battle(game, *this, *foundsoldier); |
380 | 1538 | } | 1565 | } |
381 | 1539 | } | 1566 | } |
382 | 1540 | 1567 | ||
360 | 1541 | /// Only battles block retreating soldiers | ||
361 | 1542 | State * state = 0; | ||
362 | 1543 | |||
363 | 1544 | if (get_state(taskAttack)) { | ||
364 | 1545 | state = get_state(taskAttack); | ||
365 | 1546 | } | ||
366 | 1547 | if (get_state(taskDefense)) { | ||
367 | 1548 | state = get_state(taskDefense); | ||
368 | 1549 | } | ||
369 | 1550 | if (state) { | ||
370 | 1551 | if | ||
371 | 1552 | (state->ivar1 & CF_RETREAT_WHEN_INJURED and | ||
372 | 1553 | state->ui32var3 > get_current_hitpoints()) | ||
373 | 1554 | { | ||
374 | 1555 | // Retreating soldiers act like normal bobs | ||
375 | 1556 | return Bob::checkNodeBlocked(game, field, commit); | ||
376 | 1557 | } | ||
377 | 1558 | } | ||
383 | 1559 | return true; | 1568 | return true; |
384 | 1569 | } else { | ||
385 | 1570 | if (commit) | ||
386 | 1571 | sendSpaceSignals(game); | ||
387 | 1572 | return false; | ||
388 | 1560 | } | 1573 | } |
389 | 1561 | |||
390 | 1562 | if (commit) | ||
391 | 1563 | sendSpaceSignals(game); | ||
392 | 1564 | return false; | ||
393 | 1565 | } | 1574 | } |
394 | 1566 | 1575 | ||
395 | 1567 | 1576 | ||
396 | 1568 | 1577 | ||
397 | === modified file 'src/logic/worker.cc' | |||
398 | --- src/logic/worker.cc 2010-03-21 20:09:51 +0000 | |||
399 | +++ src/logic/worker.cc 2010-04-13 18:44:39 +0000 | |||
400 | @@ -453,15 +453,18 @@ | |||
401 | 453 | 453 | ||
402 | 454 | Map & map = game.map(); | 454 | Map & map = game.map(); |
403 | 455 | Area<FCoords> area (map.get_fcoords(get_position()), 0); | 455 | Area<FCoords> area (map.get_fcoords(get_position()), 0); |
405 | 456 | if (action.sparam1 == "immovable") | 456 | if (action.sparam1 == "immovable") { |
406 | 457 | bool found_reserved = false; | ||
407 | 458 | |||
408 | 457 | for (;; ++area.radius) { | 459 | for (;; ++area.radius) { |
409 | 458 | if (action.iparam1 < area.radius) { | 460 | if (action.iparam1 < area.radius) { |
410 | 459 | send_signal(game, "fail"); // no object found, cannot run program | 461 | send_signal(game, "fail"); // no object found, cannot run program |
411 | 460 | pop_task(game); | 462 | pop_task(game); |
416 | 461 | informPlayer | 463 | if (!found_reserved) |
417 | 462 | (game, | 464 | informPlayer |
418 | 463 | ref_cast<Building, PlayerImmovable>(*get_location(game)), | 465 | (game, |
419 | 464 | Map_Object_Descr::get_attribute_name(action.iparam2)); | 466 | ref_cast<Building, PlayerImmovable>(*get_location(game)), |
420 | 467 | Map_Object_Descr::get_attribute_name(action.iparam2)); | ||
421 | 465 | return true; | 468 | return true; |
422 | 466 | } | 469 | } |
423 | 467 | std::vector<ImmovableFound> list; | 470 | std::vector<ImmovableFound> list; |
424 | @@ -472,12 +475,21 @@ | |||
425 | 472 | map.find_reachable_immovables | 475 | map.find_reachable_immovables |
426 | 473 | (area, &list, cstep, FindImmovableAttribute(action.iparam2)); | 476 | (area, &list, cstep, FindImmovableAttribute(action.iparam2)); |
427 | 474 | 477 | ||
428 | 478 | for (int idx = list.size() - 1; idx >= 0; idx--) { | ||
429 | 479 | if (upcast(Immovable, imm, list[idx].object)) { | ||
430 | 480 | if (imm->is_reserved_by_worker()) { | ||
431 | 481 | found_reserved = true; | ||
432 | 482 | list.erase(list.begin() + idx); | ||
433 | 483 | } | ||
434 | 484 | } | ||
435 | 485 | } | ||
436 | 486 | |||
437 | 475 | if (list.size()) { | 487 | if (list.size()) { |
439 | 476 | state.objvar1 = list[game.logic_rand() % list.size()].object; | 488 | set_program_objvar(game, state, list[game.logic_rand() % list.size()].object); |
440 | 477 | break; | 489 | break; |
441 | 478 | } | 490 | } |
442 | 479 | } | 491 | } |
444 | 480 | else | 492 | } else { |
445 | 481 | for (;; ++area.radius) { | 493 | for (;; ++area.radius) { |
446 | 482 | if (action.iparam1 < area.radius) { | 494 | if (action.iparam1 < area.radius) { |
447 | 483 | send_signal(game, "fail"); // no object found, cannot run program | 495 | send_signal(game, "fail"); // no object found, cannot run program |
448 | @@ -497,10 +509,11 @@ | |||
449 | 497 | (area, &list, cstep, FindBobAttribute(action.iparam2)); | 509 | (area, &list, cstep, FindBobAttribute(action.iparam2)); |
450 | 498 | 510 | ||
451 | 499 | if (list.size()) { | 511 | if (list.size()) { |
453 | 500 | state.objvar1 = list[game.logic_rand() % list.size()]; | 512 | set_program_objvar(game, state, list[game.logic_rand() % list.size()]); |
454 | 501 | break; | 513 | break; |
455 | 502 | } | 514 | } |
456 | 503 | } | 515 | } |
457 | 516 | } | ||
458 | 504 | 517 | ||
459 | 505 | ++state.ivar1; | 518 | ++state.ivar1; |
460 | 506 | schedule_act(game, 10); | 519 | schedule_act(game, 10); |
461 | @@ -1701,7 +1714,7 @@ | |||
462 | 1701 | "program", | 1714 | "program", |
463 | 1702 | static_cast<Bob::Ptr>(&Worker::program_update), | 1715 | static_cast<Bob::Ptr>(&Worker::program_update), |
464 | 1703 | 0, | 1716 | 0, |
466 | 1704 | 0, | 1717 | static_cast<Bob::Ptr>(&Worker::program_pop), |
467 | 1705 | false | 1718 | false |
468 | 1706 | }; | 1719 | }; |
469 | 1707 | 1720 | ||
470 | @@ -1739,6 +1752,25 @@ | |||
471 | 1739 | } | 1752 | } |
472 | 1740 | } | 1753 | } |
473 | 1741 | 1754 | ||
474 | 1755 | void Worker::program_pop(Game & game, State & state) | ||
475 | 1756 | { | ||
476 | 1757 | set_program_objvar(game, state, 0); | ||
477 | 1758 | } | ||
478 | 1759 | |||
479 | 1760 | void Worker::set_program_objvar(Game & game, State & state, Map_Object * obj) | ||
480 | 1761 | { | ||
481 | 1762 | assert(state.task == &taskProgram); | ||
482 | 1763 | |||
483 | 1764 | if (upcast(Immovable, imm, state.objvar1.get(game))) { | ||
484 | 1765 | imm->set_reserved_by_worker(false); | ||
485 | 1766 | } | ||
486 | 1767 | |||
487 | 1768 | state.objvar1 = obj; | ||
488 | 1769 | |||
489 | 1770 | if (upcast(Immovable, imm, obj)) { | ||
490 | 1771 | imm->set_reserved_by_worker(true); | ||
491 | 1772 | } | ||
492 | 1773 | } | ||
493 | 1742 | 1774 | ||
494 | 1743 | const Bob::Task Worker::taskGowarehouse = { | 1775 | const Bob::Task Worker::taskGowarehouse = { |
495 | 1744 | "gowarehouse", | 1776 | "gowarehouse", |
496 | 1745 | 1777 | ||
497 | === modified file 'src/logic/worker.h' | |||
498 | --- src/logic/worker.h 2010-02-28 18:40:36 +0000 | |||
499 | +++ src/logic/worker.h 2010-04-13 18:44:39 +0000 | |||
500 | @@ -181,6 +181,8 @@ | |||
501 | 181 | 181 | ||
502 | 182 | bool does_carry_ware() {return m_carried_item.is_set();} | 182 | bool does_carry_ware() {return m_carried_item.is_set();} |
503 | 183 | 183 | ||
504 | 184 | void set_program_objvar(Game &, State &, Map_Object * obj); | ||
505 | 185 | |||
506 | 184 | public: | 186 | public: |
507 | 185 | static const Task taskTransfer; | 187 | static const Task taskTransfer; |
508 | 186 | static const Task taskBuildingwork; | 188 | static const Task taskBuildingwork; |
509 | @@ -203,6 +205,7 @@ | |||
510 | 203 | void buildingwork_update(Game &, State &); | 205 | void buildingwork_update(Game &, State &); |
511 | 204 | void return_update(Game &, State &); | 206 | void return_update(Game &, State &); |
512 | 205 | void program_update(Game &, State &); | 207 | void program_update(Game &, State &); |
513 | 208 | void program_pop(Game &, State &); | ||
514 | 206 | void gowarehouse_update(Game &, State &); | 209 | void gowarehouse_update(Game &, State &); |
515 | 207 | void gowarehouse_signalimmediate | 210 | void gowarehouse_signalimmediate |
516 | 208 | (Game &, | 211 | (Game &, |
517 | 209 | 212 | ||
518 | === modified file 'src/ui_basic/editbox.cc' | |||
519 | --- src/ui_basic/editbox.cc 2010-03-27 23:50:23 +0000 | |||
520 | +++ src/ui_basic/editbox.cc 2010-04-13 18:44:39 +0000 | |||
521 | @@ -46,6 +46,9 @@ | |||
522 | 46 | /// Position of the caret. | 46 | /// Position of the caret. |
523 | 47 | uint32_t caret; | 47 | uint32_t caret; |
524 | 48 | 48 | ||
525 | 49 | /// Current scrolling offset to the text anchor position, in pixels | ||
526 | 50 | int32_t scrolloffset; | ||
527 | 51 | |||
528 | 49 | /// Alignment of the text. Vertical alignment is always centered. | 52 | /// Alignment of the text. Vertical alignment is always centered. |
529 | 50 | Align align; | 53 | Align align; |
530 | 51 | }; | 54 | }; |
531 | @@ -69,8 +72,9 @@ | |||
532 | 69 | 72 | ||
533 | 70 | m->id = id; | 73 | m->id = id; |
534 | 71 | m->align = static_cast<Align>((_align & Align_Horizontal) | Align_VCenter); | 74 | m->align = static_cast<Align>((_align & Align_Horizontal) | Align_VCenter); |
535 | 75 | m->caret = 0; | ||
536 | 76 | m->scrolloffset = 0; | ||
537 | 72 | // yes, use *signed* max as maximum length; just a small safe-guard. | 77 | // yes, use *signed* max as maximum length; just a small safe-guard. |
538 | 73 | m->caret = 0; | ||
539 | 74 | m->maxLength = std::numeric_limits<int32_t>::max(); | 78 | m->maxLength = std::numeric_limits<int32_t>::max(); |
540 | 75 | 79 | ||
541 | 76 | set_handle_mouse(true); | 80 | set_handle_mouse(true); |
542 | @@ -138,6 +142,7 @@ | |||
543 | 138 | if (m->caret > m->text.size()) | 142 | if (m->caret > m->text.size()) |
544 | 139 | m->caret = m->text.size(); | 143 | m->caret = m->text.size(); |
545 | 140 | 144 | ||
546 | 145 | check_caret(); | ||
547 | 141 | update(); | 146 | update(); |
548 | 142 | } | 147 | } |
549 | 143 | } | 148 | } |
550 | @@ -163,6 +168,8 @@ | |||
551 | 163 | _align = static_cast<Align>((_align & Align_Horizontal) | Align_VCenter); | 168 | _align = static_cast<Align>((_align & Align_Horizontal) | Align_VCenter); |
552 | 164 | if (_align != m->align) { | 169 | if (_align != m->align) { |
553 | 165 | m->align = _align; | 170 | m->align = _align; |
554 | 171 | m->scrolloffset = 0; | ||
555 | 172 | check_caret(); | ||
556 | 166 | update(); | 173 | update(); |
557 | 167 | } | 174 | } |
558 | 168 | } | 175 | } |
559 | @@ -220,6 +227,7 @@ | |||
560 | 220 | while ((m->text[--m->caret] & 0xc0) == 0x80) | 227 | while ((m->text[--m->caret] & 0xc0) == 0x80) |
561 | 221 | m->text.erase(m->text.begin() + m->caret); | 228 | m->text.erase(m->text.begin() + m->caret); |
562 | 222 | m->text.erase(m->text.begin() + m->caret); | 229 | m->text.erase(m->text.begin() + m->caret); |
563 | 230 | check_caret(); | ||
564 | 223 | changed.call(); | 231 | changed.call(); |
565 | 224 | changedid.call(m->id); | 232 | changedid.call(m->id); |
566 | 225 | update(); | 233 | update(); |
567 | @@ -233,6 +241,7 @@ | |||
568 | 233 | for (uint32_t new_caret = m->caret;; m->caret = new_caret) | 241 | for (uint32_t new_caret = m->caret;; m->caret = new_caret) |
569 | 234 | if (0 == new_caret or isspace(m->text[--new_caret])) | 242 | if (0 == new_caret or isspace(m->text[--new_caret])) |
570 | 235 | break; | 243 | break; |
571 | 244 | check_caret(); | ||
572 | 236 | update(); | 245 | update(); |
573 | 237 | } | 246 | } |
574 | 238 | return true; | 247 | return true; |
575 | @@ -250,6 +259,7 @@ | |||
576 | 250 | m->caret = new_caret; | 259 | m->caret = new_caret; |
577 | 251 | break; | 260 | break; |
578 | 252 | } | 261 | } |
579 | 262 | check_caret(); | ||
580 | 253 | update(); | 263 | update(); |
581 | 254 | } | 264 | } |
582 | 255 | return true; | 265 | return true; |
583 | @@ -257,6 +267,7 @@ | |||
584 | 257 | case SDLK_HOME: | 267 | case SDLK_HOME: |
585 | 258 | if (m->caret != 0) { | 268 | if (m->caret != 0) { |
586 | 259 | m->caret = 0; | 269 | m->caret = 0; |
587 | 270 | check_caret(); | ||
588 | 260 | update(); | 271 | update(); |
589 | 261 | } | 272 | } |
590 | 262 | return true; | 273 | return true; |
591 | @@ -264,6 +275,7 @@ | |||
592 | 264 | case SDLK_END: | 275 | case SDLK_END: |
593 | 265 | if (m->caret != m->text.size()) { | 276 | if (m->caret != m->text.size()) { |
594 | 266 | m->caret = m->text.size(); | 277 | m->caret = m->text.size(); |
595 | 278 | check_caret(); | ||
596 | 267 | update(); | 279 | update(); |
597 | 268 | } | 280 | } |
598 | 269 | return true; | 281 | return true; |
599 | @@ -296,6 +308,7 @@ | |||
600 | 296 | (m->text.begin() + m->caret++, | 308 | (m->text.begin() + m->caret++, |
601 | 297 | ((code.unicode & 0x3f) | 0x80)); | 309 | ((code.unicode & 0x3f) | 0x80)); |
602 | 298 | } | 310 | } |
603 | 311 | check_caret(); | ||
604 | 299 | changed.call(); | 312 | changed.call(); |
605 | 300 | changedid.call(m->id); | 313 | changedid.call(m->id); |
606 | 301 | update(); | 314 | update(); |
607 | @@ -354,6 +367,8 @@ | |||
608 | 354 | break; | 367 | break; |
609 | 355 | } | 368 | } |
610 | 356 | 369 | ||
611 | 370 | pos.x += m->scrolloffset; | ||
612 | 371 | |||
613 | 357 | UI::g_fh->draw_string | 372 | UI::g_fh->draw_string |
614 | 358 | (dst, | 373 | (dst, |
615 | 359 | m_fontname, m_fontsize, m_fontcolor, UI_FONT_CLR_BG, | 374 | m_fontname, m_fontsize, m_fontcolor, UI_FONT_CLR_BG, |
616 | @@ -367,4 +382,46 @@ | |||
617 | 367 | std::numeric_limits<uint32_t>::max()); | 382 | std::numeric_limits<uint32_t>::max()); |
618 | 368 | } | 383 | } |
619 | 369 | 384 | ||
620 | 385 | /** | ||
621 | 386 | * Check the caret's position and scroll it into view if necessary. | ||
622 | 387 | */ | ||
623 | 388 | void EditBox::check_caret() | ||
624 | 389 | { | ||
625 | 390 | std::string leftstr(m->text, 0, m->caret); | ||
626 | 391 | std::string rightstr(m->text, m->caret, std::string::npos); | ||
627 | 392 | uint32_t leftw; | ||
628 | 393 | uint32_t rightw; | ||
629 | 394 | uint32_t tmp; | ||
630 | 395 | |||
631 | 396 | UI::g_fh->get_size(m_fontname, m_fontsize, leftstr, leftw, tmp); | ||
632 | 397 | UI::g_fh->get_size(m_fontname, m_fontsize, rightstr, rightw, tmp); | ||
633 | 398 | |||
634 | 399 | int32_t caretpos; | ||
635 | 400 | |||
636 | 401 | switch (m->align & Align_Horizontal) { | ||
637 | 402 | case Align_HCenter: | ||
638 | 403 | caretpos = (get_w() - static_cast<int32_t>(leftw + rightw)) / 2 + m->scrolloffset + leftw; | ||
639 | 404 | break; | ||
640 | 405 | case Align_Right: | ||
641 | 406 | caretpos = get_w() - 4 + m->scrolloffset - rightw; | ||
642 | 407 | break; | ||
643 | 408 | default: | ||
644 | 409 | caretpos = 4 + m->scrolloffset + leftw; | ||
645 | 410 | break; | ||
646 | 411 | } | ||
647 | 412 | |||
648 | 413 | if (caretpos < 4) | ||
649 | 414 | m->scrolloffset += 4 - caretpos + get_w()/5; | ||
650 | 415 | else if (caretpos > get_w() - 4) | ||
651 | 416 | m->scrolloffset -= caretpos - get_w() + 4 + get_w()/5; | ||
652 | 417 | |||
653 | 418 | if ((m->align & Align_Horizontal) == Align_Left) { | ||
654 | 419 | if (m->scrolloffset > 0) | ||
655 | 420 | m->scrolloffset = 0; | ||
656 | 421 | } else if ((m->align & Align_Horizontal) == Align_Right) { | ||
657 | 422 | if (m->scrolloffset < 0) | ||
658 | 423 | m->scrolloffset = 0; | ||
659 | 424 | } | ||
660 | 425 | } | ||
661 | 426 | |||
662 | 370 | } | 427 | } |
663 | 371 | 428 | ||
664 | === modified file 'src/ui_basic/editbox.h' | |||
665 | --- src/ui_basic/editbox.h 2010-03-27 23:50:23 +0000 | |||
666 | +++ src/ui_basic/editbox.h 2010-04-13 18:44:39 +0000 | |||
667 | @@ -74,6 +74,8 @@ | |||
668 | 74 | RGBColor m_fontcolor; | 74 | RGBColor m_fontcolor; |
669 | 75 | 75 | ||
670 | 76 | boost::scoped_ptr<EditBoxImpl> m; | 76 | boost::scoped_ptr<EditBoxImpl> m; |
671 | 77 | |||
672 | 78 | void check_caret(); | ||
673 | 77 | }; | 79 | }; |
674 | 78 | 80 | ||
675 | 79 | } | 81 | } |
676 | 80 | 82 | ||
677 | === modified file 'src/wlapplication.cc' | |||
678 | --- src/wlapplication.cc 2010-04-12 09:11:24 +0000 | |||
679 | +++ src/wlapplication.cc 2010-04-13 18:44:39 +0000 | |||
680 | @@ -1116,6 +1116,12 @@ | |||
681 | 1116 | m_commandline.erase("double"); | 1116 | m_commandline.erase("double"); |
682 | 1117 | } | 1117 | } |
683 | 1118 | 1118 | ||
684 | 1119 | if (m_commandline.count("verbose")) { | ||
685 | 1120 | g_verbose = true; | ||
686 | 1121 | |||
687 | 1122 | m_commandline.erase("verbose"); | ||
688 | 1123 | } | ||
689 | 1124 | |||
690 | 1119 | if (m_commandline.count("editor")) { | 1125 | if (m_commandline.count("editor")) { |
691 | 1120 | m_filename = m_commandline["editor"]; | 1126 | m_filename = m_commandline["editor"]; |
692 | 1121 | if (m_filename.size() and *m_filename.rbegin() == '/') | 1127 | if (m_filename.size() and *m_filename.rbegin() == '/') |
693 | @@ -1332,6 +1338,7 @@ | |||
694 | 1332 | " testing)\n\n"); | 1338 | " testing)\n\n"); |
695 | 1333 | #endif | 1339 | #endif |
696 | 1334 | #endif | 1340 | #endif |
697 | 1341 | wout << _(" --verbose Enable verbose debug messages\n") << endl; | ||
698 | 1335 | wout << _(" --help Show this help\n") << endl; | 1342 | wout << _(" --help Show this help\n") << endl; |
699 | 1336 | wout | 1343 | wout |
700 | 1337 | << | 1344 | << |
Nicolai, most of these are no brainers and i agree of merging them.
However about the reserved thing please see my comment on the bug report.