Skip to content

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
...
  • 18 commits
  • 49 files changed
  • 0 commit comments
  • 3 contributors
Commits on May 01, 2012
@Cyp Cyp Try harder to prevent desynch on player leaving.
There seem to be way too many ways that a player can leave, disconnect, drop, be
kicked, leave (again), be destroyed and/or be cleared.

During a game, NET_PLAYER_DROPPED must not be sent, since it is executed at a random
game time, and GAME_PLAYER_LEFT must be sent instead. Independently of whether the
player left, disconnected, dropped, was kicked, left, was destroyed, was eaten by a
grue, or was cleared.
2309f16
Commits on May 02, 2012
@Cyp Cyp Adjust turret pitch as far as possible, and no farther.
Weapons could fail to fire, if the desired pitch was outside the limits.

Fixes ticket:3267.
17d3ea3
@Cyp Cyp Fix destroyed structure count to count destroyed non-walls instead of…
… destroyed walls.

Introduced in f6ddbf1.

Fixes ticket:3380 and ticket:3435.
fae22f7
@Cyp Cyp Add ┼-shaped gate model.
The ┴- and ┘-shaped model files are currently ┼-shaped, and the ┼-shaped model will
need updating to avoid Z-fighting.

Fixes ticket:3336.
00bbfea
@Cyp Cyp Allow shooting through open gates.
Also, raise fully-opened gates by 1 unit, to better support models of ┼-shaped gates,
where the heights of the gate pieces differ by one unit to avoid Z-fighting.
fcd5510
@Cyp Cyp Add new corner gate models by Berg.
And fix old gate model (also fixed by Berg).
0964038
@Cyp Cyp Do not make all tanks suddenly accelerate to hover speeds at end of p…
…ath.

Fixes ticket:3424.
fb49891
@Cyp Cyp Prefer targets not too close to fire, and prefer very damaged targets.
Previously, preferred damaged over non-damaged, but not very damaged over lightly
damaged, due to integer truncation.
fb8efec
@Cyp Cyp Let structures look for good targets, instead of shooting at the near…
…est target.

The targetAttackWeight() function with special cases for structures is now actually
used for structures.
430e55e
@Cyp Cyp Update ChangeLog. 7fe5f66
@cybersphinx cybersphinx Remove unused variable to shut up gcc 4.7.
Leftover from fcd5510.
af01684
Commits on May 03, 2012
@Cyp Cyp Do not freeze on player leaving, either.
Introduced in 2309f16. (Although freezing isn't much
worse than desynch.)
93f0e61
@cybersphinx cybersphinx Turkish translation update by Ayhan Görgülü.
Closes #3417.
3015548
@cybersphinx cybersphinx French translation update by Amiral JCDG.
Closes #3430.
17f7f71
@cybersphinx cybersphinx Update translations. 4011144
@cybersphinx cybersphinx Update ChangeLog. 1e1b51a
Commits on May 04, 2012
@Cyp Cyp Fix kicking of AIs.
See 93f0e61, introduced in 2309f16.

Fixes ticket:3439.
ca736e7
automerge Merge branch 'bugfixes' into 3.1 a28bcf9
Showing with 2,510 additions and 1,909 deletions.
  1. +18 −2 ChangeLog
  2. +1 −1 data/mp/stats/structures.txt
  3. +10 −10 data/mp/structs/blgateh.pie
  4. +61 −0 data/mp/structs/blgateh_l.pie
  5. +75 −0 data/mp/structs/blgateh_t.pie
  6. +83 −0 data/mp/structs/blgateh_x.pie
  7. +3 −0 data/mp/wrf/piestats.wrf
  8. +26 −12 lib/netplay/netplay.cpp
  9. +32 −2 lib/netplay/nettypes.cpp
  10. +2 −0 lib/netplay/nettypes.h
  11. +366 −308 po/ca_ES.po
  12. +366 −316 po/cs.po
  13. +366 −312 po/da.po
  14. +367 −315 po/de.po
  15. +367 −316 po/en_GB.po
  16. +367 −315 po/es.po
Sorry, we could not display the entire diff because it was too big.
View
20 ChangeLog
@@ -1,12 +1,28 @@
-2012-04-25: Version 3.1_beta9
+2012-05-03: Version 3.1_beta9
* General:
* Change: Save campaign and skirmish games separately (ticket:3377, commit:d8789661fbffe2f648a06a0689de3a9350bbe8b0)
- * Fix: Don't confuse different unit templates (ticket:3146, ticket:3369, commit:28c10b00a8f3bf6d87176e3aba8fba65993cedba)
+ * Change: Target selection improvements (commit:fb8efec5b0278468c445173f7d4e30e209f621c6, commit:430e55e5cd279c27bfee42736fb1a516be375114)
+ * Fix: Don't confuse different unit templates (ticket:3146, ticket:3369, commit:28c10b00a8f3bf6d87176e3aba8fba65993cedba, commit:0de0c416297a1694146af7ca82189ee971c93502, commit:3bebe1a0d6c3e8f230b56def4a823430a2a58c9f, commit:0ad220b334cabb17d356e0132fc07c36624455da)
+ * Fix: Don't confuse Super Transport with other templates (ticket:3426, commit:146332aaee331997dd668bf36635fa190ca7ba2b)
+ * Fix: Don't keep revealing terrain after units are destroyed (ticket:3339, ticket:3419, commit:21326496e1b4348ec96a96e268d138394aef183c)
+ * Fix: Don't randomly prevent units from firing (ticket:3267, commit:17d3ea3863fb4b68da6b4bff7a11726d746c1aad)
+ * Fix: Don't accelerate just before reaching the destination (ticket:3424, commit:fb49891c23d368f85b16904c35642b75f278784c)
+ * Fix: Allow shooting through open gates (commit:fcd5510a1311cfc535685aeac2983df13800729e)
+ * Fix: Display correct destroyed structure count at end of game (ticket:3380, ticket:3435, commit:fae22f7e2031eff681a5e94b6cb51546789ad1c1)
* Multiplayer:
* Fix: Don't desync after picking up oil barrels (ticket:3396, ticket:3413, commit:b6834d18cb7a42a60675379ca99ae241cb65374e)
+ * Fix: Don't desync or freeze when a player leaves (commit:2309f165b021e7ea0a4d9c8a2e85cdea6e8f10ba, commit:93f0e61d924d6709c8db68b53d19f7e3bbeaa911)
+ * Fix: Network performance improvements (commit:b9cc7702b7dc7ff3781f32f69b9cac110ebd6b98, commit:049982522b9e247a2c8a23c43e89fdc1af9a3ad6)
+ * Fix: Make debug build net usage stats meaningful (commit:5e3d4bcb388f36c86dd26b5f9783c7574c5a4901, commit:282efa8884a61d940b0414f0526b8abef78b62d0)
* Campaign:
* Change: Disable the save option between campaign missions and the autosave, since the resulting savegames don't always work correctly (ticket:3377, commit:62da559ebe7fbb0ede9592b4b5d9382fecd9ef09)
* Fix: Don't slow the game down by spamming asserts (ticket:3403, commit:9775d0c4f66f80d6378cee0dc9ea31d3cdfe5708)
+ * Graphics:
+ * Fix: Scavenger MRAs (ticket:3365, commit:e50d51339eb55f6990b97ad4e28722b6a4eea23c)
+ * Fix: Add gate corners, and fix gate team colour (commit:00bbfea089fc881ac5ca31b50c463bddfcf4c141, commit:0964038ae0c39c6fcb73eb2f6ef3700d295080ce)
+ * Translations:
+ * Update: Turkish (ticket:3417, commit:3015548e6d161ebca885893471edeb26043ffb28)
+ * Update: French (ticket:3430, commit:17f7f71f9b4b629491212dbb32d0ec811fa488b9)
2012-04-22: Version 3.1_beta8
* General:
View
2 data/mp/stats/structures.txt
@@ -20,7 +20,7 @@ A0CommandCentreNP,HQ,Level One,HARD,0,2,2,Concrete,500,3,10,1000,10,100,30,300,1
A0CyborgFactory,CYBORG FACTORY,Level All,MEDIUM,1,1,2,Concrete,500,2,10,1000,100,100,30,150,255,20,ZNULLECM,DefaultSensor1Mk1,1,blcfact1.pie,blbcfact.pie,1,0
A0FacMod1,FACTORY MODULE,Level All,MEDIUM,1,3,3,Concrete,250,2,10,500,100,100,25,150,255,30,ZNULLECM,DefaultSensor1Mk1,0,blfact1.pie,0,1,0
A0HardcreteMk1CWall,CORNER WALL,Level All,HARD,1,1,1,Concrete,125,2,15,700,10,25,1,0,255,0,ZNULLECM,ZNULLSENSOR,0,BLWALLC1.pie,0,0,0
-A0HardcreteMk1Gate,GATE,Level All,HARD,1,1,1,Concrete,250,2,15,700,10,25,1,0,255,0,ZNULLECM,ZNULLSENSOR,0,BLGATEH.pie,0,0,0
+A0HardcreteMk1Gate,GATE,Level All,HARD,1,1,1,Concrete,250,2,15,700,10,25,1,0,255,0,ZNULLECM,ZNULLSENSOR,0,blgateh.pie@blgateh_x.pie@blgateh_t.pie@blgateh_l.pie,0,0,0
A0HardcreteMk1Wall,WALL,Level All,HARD,1,1,1,Concrete,125,2,15,700,10,25,1,0,255,0,ZNULLECM,ZNULLSENSOR,0,blwallh.pie@blwallc1.pie@blwallh_t.pie@blwallh_l.pie,0,1,0
A0LasSatCommand,DOOR,Level All,MEDIUM,1,2,2,Concrete,2500,2,16,1000,10,1000,1,0,255,0,ZNULLECM,0,1,milasbas.pie,0,0,1
A0LightFactory,FACTORY,Level All,MEDIUM,1,3,3,Concrete,500,3,10,1000,100,100,30,150,255,20,ZNULLECM,BaBaSensor,1,blfact0.pie@factory_module1.pie@blfact1.pie@factory_module2.pie@blfact2.pie,blbfact.pie,1,0
View
20 data/mp/structs/blgateh.pie
@@ -33,13 +33,13 @@ POLYGONS 22
200 3 10 3 11 0 117 21 175 0 175
200 3 11 2 5 90 175 69 175 69 117
200 3 11 5 10 90 175 69 117 90 117
- 4200 3 12 13 14 8 1 56 14 55 225 55 238 2 238
- 4200 3 12 14 15 8 1 56 14 55 225 2 238 2 225
- 4200 3 13 12 4 8 1 56 14 55 238 4 238 4 225
- 4200 3 13 4 5 8 1 56 14 55 238 4 225 55 225
- 4200 3 14 13 5 8 1 56 14 2 238 55 238 55 225
- 4200 3 14 5 1 8 1 56 14 2 238 55 225 2 225
- 4200 3 15 14 1 8 1 56 14 5 225 55 225 55 238
- 4200 3 15 1 7 8 1 56 14 5 225 55 238 5 238
- 4200 3 12 15 7 8 1 56 14 55 225 2 225 2 238
- 4200 3 12 7 4 8 1 56 14 55 225 2 238 55 238
+ 200 3 12 13 14 55 225 55 238 2 238
+ 200 3 12 14 15 55 225 2 238 2 225
+ 200 3 13 12 4 55 238 4 238 4 225
+ 200 3 13 4 5 55 238 4 225 55 225
+ 200 3 14 13 5 2 238 55 238 55 225
+ 200 3 14 5 1 2 238 55 225 2 225
+ 200 3 15 14 1 5 225 55 225 55 238
+ 200 3 15 1 7 5 225 55 238 5 238
+ 200 3 12 15 7 55 225 2 225 2 238
+ 200 3 12 7 4 55 225 2 238 55 238
View
61 data/mp/structs/blgateh_l.pie
@@ -0,0 +1,61 @@
+PIE 2
+TYPE 10200
+TEXTURE 0 page-12-player-buildings.png 256 256
+LEVELS 1
+LEVEL 1
+POINTS 22
+ -14 0 65
+ -12 62 65
+ -12 62 13
+ -14 0 14
+ 13 62 -12
+ 14 0 -14
+ 12 62 65
+ 14 0 65
+ 0 62 65
+ 0 0 65
+ -12 77 65
+ 12 77 65
+ 13 77 -12
+ -12 77 13
+ -66 0 14
+ -66 62 12
+ -66 62 -12
+ -66 0 -14
+ -66 62 0
+ -66 0 0
+ -66 77 12
+ -66 77 -12
+POLYGONS 32
+ 200 3 0 1 2 21 175 21 117 69 117
+ 200 3 0 2 3 21 175 69 117 69 175
+ 200 3 5 4 6 21 175 21 117 69 117
+ 200 3 5 6 7 21 175 69 117 69 175
+ 200 3 8 1 0 0 117 21 117 21 175
+ 200 3 8 0 9 0 117 21 175 0 175
+ 200 3 9 7 6 90 175 69 175 69 117
+ 200 3 9 6 8 90 175 69 117 90 117
+ 200 3 10 11 12 56 225 56 238 3 238
+ 200 3 10 12 13 56 225 3 238 20 225
+ 200 3 11 10 1 17 238 17 225 27 225
+ 200 3 11 1 6 17 238 27 225 27 238
+ 200 3 12 11 6 3 239 55 238 55 225
+ 200 3 12 6 4 3 239 55 225 3 225
+ 200 3 10 13 2 41 225 8 225 8 238
+ 200 3 10 2 1 41 225 8 238 41 237
+ 200 3 2 15 14 69 117 21 117 21 175
+ 200 3 3 2 14 69 175 69 117 21 175
+ 200 3 16 4 5 69 117 21 117 21 175
+ 200 3 17 16 5 69 175 69 117 21 175
+ 200 3 14 15 18 21 175 21 117 0 117
+ 200 3 19 14 18 0 175 21 175 0 117
+ 200 3 16 17 19 69 117 69 175 90 175
+ 200 3 18 16 19 90 117 69 117 90 175
+ 200 3 12 21 20 3 238 56 238 56 225
+ 200 3 13 12 20 20 225 3 238 56 225
+ 200 3 15 20 21 27 225 17 225 17 238
+ 200 3 16 15 21 27 238 27 225 17 238
+ 200 3 16 21 12 55 225 55 238 3 239
+ 200 3 4 16 12 3 225 55 225 3 239
+ 200 3 2 13 20 8 238 8 225 41 225
+ 200 3 15 2 20 41 237 8 238 41 225
View
75 data/mp/structs/blgateh_t.pie
@@ -0,0 +1,75 @@
+PIE 2
+TYPE 10200
+TEXTURE 0 page-12-player-buildings.png 256 256
+LEVELS 1
+LEVEL 1
+POINTS 30
+ -65 0 -14
+ -65 62 -12
+ 65 62 -12
+ 65 0 -14
+ 65 62 0
+ 65 62 12
+ 65 0 14
+ 65 0 0
+ -65 62 12
+ -65 0 14
+ -65 62 0
+ -65 0 0
+ -65 78 -12
+ -65 78 12
+ 65 78 12
+ 65 78 -12
+ -14 0 65
+ -12 62 65
+ -12 62 12
+ -14 0 12
+ 12 62 12
+ 14 0 12
+ 12 62 65
+ 14 0 65
+ 0 62 65
+ 0 0 65
+ -12 78 65
+ 12 78 65
+ 12 78 12
+ -12 78 12
+POLYGONS 38
+ 200 3 0 1 2 21 175 21 117 69 117
+ 200 3 0 2 3 21 175 69 117 69 175
+ 200 3 4 5 6 0 117 21 117 21 175
+ 200 3 4 6 7 0 117 21 175 0 175
+ 200 3 7 3 2 90 175 69 175 69 117
+ 200 3 7 2 4 90 175 69 117 90 117
+ 200 3 6 5 8 21 175 21 117 69 117
+ 200 3 6 8 9 21 175 69 117 69 175
+ 200 3 10 1 0 0 117 21 117 21 175
+ 200 3 10 0 11 0 117 21 175 0 175
+ 200 3 11 9 8 90 175 69 175 69 117
+ 200 3 11 8 10 90 175 69 117 90 117
+ 200 3 12 13 14 55 225 55 238 2 238
+ 200 3 12 14 15 55 225 2 238 2 225
+ 200 3 13 12 1 55 238 4 238 4 225
+ 200 3 13 1 8 55 238 4 225 55 225
+ 200 3 14 13 8 2 238 55 238 55 225
+ 200 3 14 8 5 2 238 55 225 2 225
+ 200 3 15 14 5 5 225 55 225 55 238
+ 200 3 15 5 2 5 225 55 238 5 238
+ 200 3 12 15 2 55 225 2 225 2 238
+ 200 3 12 2 1 55 225 2 238 55 238
+ 200 3 16 17 18 22 176 22 118 41 117
+ 200 3 16 18 19 22 176 41 117 41 175
+ 200 3 21 20 22 49 175 49 117 68 117
+ 200 3 21 22 23 49 175 68 117 68 175
+ 200 3 24 17 16 0 117 21 117 21 175
+ 200 3 24 16 25 0 117 21 175 0 175
+ 200 3 25 23 22 90 175 69 175 69 117
+ 200 3 25 22 24 90 175 69 117 90 117
+ 200 3 26 27 28 55 225 55 238 31 238
+ 200 3 26 28 29 55 225 31 238 31 225
+ 200 3 27 26 17 55 238 4 238 4 225
+ 200 3 27 17 22 55 238 4 225 55 225
+ 200 3 28 27 22 31 238 55 238 55 225
+ 200 3 28 22 20 31 238 55 225 31 225
+ 200 3 26 29 18 55 225 31 225 31 238
+ 200 3 26 18 17 55 225 31 238 55 238
View
83 data/mp/structs/blgateh_x.pie
@@ -0,0 +1,83 @@
+PIE 2
+TYPE 10200
+TEXTURE 0 page-12-player-buildings.png 256 256
+LEVELS 1
+LEVEL 1
+POINTS 32
+ -65 0 -14
+ -65 62 -12
+ 65 62 -12
+ 65 0 -14
+ 65 62 0
+ 65 62 12
+ 65 0 14
+ 65 0 0
+ -65 62 12
+ -65 0 14
+ -65 62 0
+ -65 0 0
+ -65 78 -12
+ -65 78 12
+ 65 78 12
+ 65 78 -12
+ -14 0 65
+ -12 62 65
+ -12 62 -65
+ -14 0 -65
+ 0 62 -65
+ 12 62 -65
+ 14 0 -65
+ 0 0 -65
+ 12 62 65
+ 14 0 65
+ 0 62 65
+ 0 0 65
+ -12 78 65
+ 12 78 65
+ 12 77 -65
+ -12 77 -65
+POLYGONS 44
+ 200 3 0 1 2 21 175 21 117 69 117
+ 200 3 0 2 3 21 175 69 117 69 175
+ 200 3 4 5 6 0 117 21 117 21 175
+ 200 3 4 6 7 0 117 21 175 0 175
+ 200 3 7 3 2 90 175 69 175 69 117
+ 200 3 7 2 4 90 175 69 117 90 117
+ 200 3 6 5 8 21 175 21 117 69 117
+ 200 3 6 8 9 21 175 69 117 69 175
+ 200 3 10 1 0 0 117 21 117 21 175
+ 200 3 10 0 11 0 117 21 175 0 175
+ 200 3 11 9 8 90 175 69 175 69 117
+ 200 3 11 8 10 90 175 69 117 90 117
+ 200 3 12 13 14 55 225 55 238 2 238
+ 200 3 12 14 15 55 225 2 238 2 225
+ 200 3 13 12 1 55 238 4 238 4 225
+ 200 3 13 1 8 55 238 4 225 55 225
+ 200 3 14 13 8 2 238 55 238 55 225
+ 200 3 14 8 5 2 238 55 225 2 225
+ 200 3 15 14 5 5 225 55 225 55 238
+ 200 3 15 5 2 5 225 55 238 5 238
+ 200 3 12 15 2 55 225 2 225 2 238
+ 200 3 12 2 1 55 225 2 238 55 238
+ 200 3 16 17 18 21 175 21 117 69 117
+ 200 3 16 18 19 21 175 69 117 69 175
+ 200 3 20 21 22 0 117 21 117 21 175
+ 200 3 20 22 23 0 117 21 175 0 175
+ 200 3 23 19 18 90 175 69 175 69 117
+ 200 3 23 18 20 90 175 69 117 90 117
+ 200 3 22 21 24 21 175 21 117 69 117
+ 200 3 22 24 25 21 175 69 117 69 175
+ 200 3 26 17 16 0 117 21 117 21 175
+ 200 3 26 16 27 0 117 21 175 0 175
+ 200 3 27 25 24 90 175 69 175 69 117
+ 200 3 27 24 26 90 175 69 117 90 117
+ 200 3 28 29 30 55 225 55 238 2 238
+ 200 3 28 30 31 55 225 2 238 2 225
+ 200 3 29 28 17 55 238 4 238 4 225
+ 200 3 29 17 24 55 238 4 225 55 225
+ 200 3 30 29 24 2 238 55 238 55 225
+ 200 3 30 24 21 2 238 55 225 2 225
+ 200 3 31 30 21 5 225 55 225 55 238
+ 200 3 31 21 18 5 225 55 238 5 238
+ 200 3 28 31 18 55 225 2 225 2 238
+ 200 3 28 18 17 55 225 2 238 55 238
View
3 data/mp/wrf/piestats.wrf
@@ -20,6 +20,9 @@ file IMD "blwallc1.pie"
file IMD "blwallh_t.pie"
file IMD "blwallh_l.pie"
file IMD "blgateh.pie"
+file IMD "blgateh_x.pie"
+file IMD "blgateh_t.pie"
+file IMD "blgateh_l.pie"
file IMD "blwallc2.pie"
file IMD "blwall2.pie"
file IMD "blwallc3.pie"
View
38 lib/netplay/netplay.cpp
@@ -452,9 +452,12 @@ static void NETplayerClientDisconnect(uint32_t index)
NETlogEntry("Player has left unexpectedly.", SYNC_FLAG, index);
// Announce to the world. This was really icky, because we may have been calling the send
// function recursively. We really ought to have had a send queue, and now we finally do...
- NETbeginEncode(NETbroadcastQueue(), NET_PLAYER_DROPPED);
- NETuint32_t(&index);
- NETend();
+ if (ingame.localJoiningInProgress) // Only if game hasn't actually started yet.
+ {
+ NETbeginEncode(NETbroadcastQueue(), NET_PLAYER_DROPPED);
+ NETuint32_t(&index);
+ NETend();
+ }
}
else
{
@@ -485,7 +488,10 @@ static void NETplayerLeaving(UDWORD index)
}
sync_counter.left++;
MultiPlayerLeave(index); // more cleanup
- NET_DestroyPlayer(index); // sets index player's array to false
+ if (ingame.localJoiningInProgress) // Only if game hasn't actually started yet.
+ {
+ NET_DestroyPlayer(index); // sets index player's array to false
+ }
}
/**
@@ -503,14 +509,17 @@ static void NETplayerDropped(UDWORD index)
return;
}
- // Send message type specifically for dropped / disconnects
- NETbeginEncode(NETbroadcastQueue(), NET_PLAYER_DROPPED);
- NETuint32_t(&id);
- NETend();
- debug(LOG_INFO, "sending NET_PLAYER_DROPPED for player %d", id);
sync_counter.drops++;
- NET_DestroyPlayer(id); // just clears array
MultiPlayerLeave(id); // more cleanup
+ if (ingame.localJoiningInProgress) // Only if game hasn't actually started yet.
+ {
+ // Send message type specifically for dropped / disconnects
+ NETbeginEncode(NETbroadcastQueue(), NET_PLAYER_DROPPED);
+ NETuint32_t(&id);
+ NETend();
+ debug(LOG_INFO, "sending NET_PLAYER_DROPPED for player %d", id);
+ NET_DestroyPlayer(id); // just clears array
+ }
NETsetPlayerConnectionStatus(CONNECTIONSTATUS_PLAYER_DROPPED, id);
}
@@ -1472,18 +1481,23 @@ static bool NETprocessSystemMessage(NETQUEUE playerQueue, uint8_t type)
NETbeginDecode(playerQueue, NET_SHARE_GAME_QUEUE);
NETuint8_t(&player);
NETuint32_t(&num);
+ bool isSentByCorrectClient = responsibleFor(playerQueue.index, player);
+ isSentByCorrectClient = isSentByCorrectClient || (playerQueue.index == NET_HOST_ONLY && playerQueue.index != selectedPlayer); // Let host spoof other people's NET_SHARE_GAME_QUEUE messages, but not our own. This allows the host to spoof a GAME_PLAYER_LEFT message (but spoofing any message when the player is still there will fail with desynch).
+ if (!isSentByCorrectClient || player > MAX_PLAYERS)
+ {
+ break;
+ }
for (n = 0; n < num; ++n)
{
NETnetMessage(&message);
- // TODO Check that playerQueue is actually responsible for this game queue.
NETinsertMessageFromNet(NETgameQueue(player), message);
NETlogPacket(message->type, message->rawLen(), true);
delete message;
message = NULL;
}
- if (!NETend() || player > MAX_PLAYERS)
+ if (!NETend())
{
debug(LOG_ERROR, "Bad NET_SHARE_GAME_QUEUE message.");
break;
View
34 lib/netplay/nettypes.cpp
@@ -338,6 +338,18 @@ NETQUEUE NETgameQueue(unsigned player)
return ret;
}
+NETQUEUE NETgameQueueForced(unsigned player)
+{
+ NETQUEUE ret;
+ ASSERT(player < MAX_PLAYERS, "Huh?");
+ NetQueue *queue = gameQueues[player];
+ ret.queue = queue;
+ ret.isPair = false;
+ ret.index = player;
+ ret.queueType = QUEUE_GAME_FORCED;
+ return ret;
+}
+
NETQUEUE NETbroadcastQueue()
{
NETQUEUE ret;
@@ -451,7 +463,7 @@ bool NETend()
queue->pushMessage(message);
NETlogPacket(message.type, message.data.size(), false);
- if (queueInfo.queueType == QUEUE_GAME)
+ if (queueInfo.queueType == QUEUE_GAME || queueInfo.queueType == QUEUE_GAME_FORCED)
{
ASSERT(message.type > GAME_MIN_TYPE && message.type < GAME_MAX_TYPE, "Inserting %s into game queue.", messageTypeToString(message.type));
}
@@ -469,6 +481,24 @@ bool NETend()
// We have ended the serialisation, so mark the direction invalid
NETsetPacketDir(PACKET_INVALID);
+ if (queueInfo.queueType == QUEUE_GAME_FORCED) // If true, we must be the host, inserting a GAME_PLAYER_LEFT into the other player's game queue. Since they left, they're not around to complain about us messing with their queue, which would normally cause a desynch.
+ {
+ // Almost duplicate code from NETflushGameQueues() in here.
+
+ // Decoded in NETprocessSystemMessage in netplay.cpp.
+ uint8_t player = queueInfo.index;
+ uint32_t num = 1;
+ NetMessage backupMessage = message; // 'message' will be overwritten, so we need a copy (to avoid trying to insert a message into itself).
+ NETbeginEncode(NETbroadcastQueue(), NET_SHARE_GAME_QUEUE);
+ NETuint8_t(&player);
+ NETuint32_t(&num);
+ for (uint32_t n = 0; n < num; ++n)
+ {
+ queueAuto(backupMessage);
+ }
+ NETend();
+ }
+
return true; // Serialising never fails.
}
@@ -504,7 +534,7 @@ void NETflushGameQueues()
continue; // Nothing to send for this player.
}
- // Decoded in NETprocessSystemMessage in netplay.c.
+ // Decoded in NETprocessSystemMessage in netplay.cpp.
NETbeginEncode(NETbroadcastQueue(), NET_SHARE_GAME_QUEUE);
NETuint8_t(&player);
NETuint32_t(&num);
View
2 lib/netplay/nettypes.h
@@ -40,6 +40,7 @@ enum QueueType
QUEUE_TMP,
QUEUE_NET,
QUEUE_GAME,
+ QUEUE_GAME_FORCED,
QUEUE_BROADCAST,
};
@@ -54,6 +55,7 @@ struct NETQUEUE
NETQUEUE NETnetTmpQueue(unsigned tmpPlayer); ///< One of the temp queues from before a client has joined the game. (See comments on tmpQueues in nettypes.cpp.)
NETQUEUE NETnetQueue(unsigned player); ///< The queue pair used for sending and receiving data directly from another client. (See comments on netQueues in nettypes.cpp.)
NETQUEUE NETgameQueue(unsigned player); ///< The game action queue. (See comments on gameQueues in nettypes.cpp.)
+NETQUEUE NETgameQueueForced(unsigned player); ///< Only used by the host, to force-feed a GAME_PLAYER_LEFT message into someone's game queue.
NETQUEUE NETbroadcastQueue(void); ///< The queue for sending data directly to the netQueues of all clients, not just a specific one. (See comments on broadcastQueue in nettypes.cpp.)
void NETinsertRawData(NETQUEUE queue, uint8_t *data, size_t dataLen); ///< Dump raw data from sockets and raw data sent via host here.
View
674 po/ca_ES.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: warzone2100-master_20110320qt\n"
"Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n"
-"POT-Creation-Date: 2012-04-09 23:37+0200\n"
+"POT-Creation-Date: 2012-05-03 18:57+0200\n"
"PO-Revision-Date: 2011-04-03 19:45+0200\n"
"Last-Translator: Àngel Mompó <mecatxis@gmail.com>\n"
"Language-Team: <ca@dodds.net>\n"
@@ -11893,17 +11893,17 @@ msgstr ""
msgid "OpenGL 1.4 + VBO extension is not supported by your system. The game requires this. Please upgrade your graphics drivers/hardware, if possible."
msgstr ""
-#: lib/netplay/netplay.cpp:193
-#: lib/netplay/netplay.cpp:1053
+#: lib/netplay/netplay.cpp:203
+#: lib/netplay/netplay.cpp:1078
msgid "Enter password here"
msgstr "Fiqueu la contrasenya aquí"
-#: lib/netplay/netplay.cpp:2121
+#: lib/netplay/netplay.cpp:2120
#, c-format
msgid "Could not resolve masterserver name (%s)!"
msgstr "No s'ha pogut resoldre el nom del servidor mestre (%s)!"
-#: lib/netplay/netplay.cpp:2143
+#: lib/netplay/netplay.cpp:2142
#, c-format
msgid ""
"Error connecting to the lobby server: %s.\n"
@@ -11912,7 +11912,7 @@ msgid ""
" or to forward the port to your system."
msgstr ""
-#: lib/netplay/netplay.cpp:2817
+#: lib/netplay/netplay.cpp:2816
msgid "Failed to get a lobby response!"
msgstr ""
@@ -11968,30 +11968,30 @@ msgstr "Desa la partida"
#: src/hci.cpp:4926
#: src/intelmap.cpp:531
#: src/intorder.cpp:727
-#: src/loadsave.cpp:240
+#: src/loadsave.cpp:250
#: src/multimenu.cpp:498
-#: src/multimenu.cpp:1349
+#: src/multimenu.cpp:1364
#: src/transporter.cpp:278
#: src/transporter.cpp:359
#: src/transporter.cpp:822
msgid "Close"
msgstr "Tanca"
-#: src/cheat.cpp:162
+#: src/cheat.cpp:165
#, c-format
msgid "%s wants to enable debug mode. Enabled: %s, Disabled: %s."
msgstr ""
-#: src/cheat.cpp:166
+#: src/cheat.cpp:169
#, c-format
msgid "%s wants to disable debug mode. Enabled: %s, Disabled: %s."
msgstr ""
-#: src/cheat.cpp:172
+#: src/cheat.cpp:175
msgid "Debug mode now enabled!"
msgstr ""
-#: src/cheat.cpp:177
+#: src/cheat.cpp:180
#, fuzzy
msgid "Debug mode now disabled!"
msgstr "S'ha obert el menú de depuració"
@@ -12345,81 +12345,81 @@ msgstr "%s - Aliat - Desperfectes %d%% - Experiència %d, %s"
msgid "Unit Lost!"
msgstr "Heu perdut una unitat!"
-#: src/droid.cpp:1288
+#: src/droid.cpp:1277
msgid "Structure Restored"
msgstr "Estructura recuperada"
-#: src/droid.cpp:2260
+#: src/droid.cpp:2237
#, c-format
msgid "Group %u selected - %u Unit"
msgid_plural "Group %u selected - %u Units"
msgstr[0] "S'ha seleccionat el grup %u - %u unitat"
msgstr[1] "S'ha seleccionat el grup %u - %u unitats"
-#: src/droid.cpp:2273
+#: src/droid.cpp:2250
#, c-format
msgid "%u unit assigned to Group %u"
msgid_plural "%u units assigned to Group %u"
msgstr[0] "S'ha assignat %u unitat al grup %u"
msgstr[1] "S'ha assignat %u unitats al grup %u"
-#: src/droid.cpp:2286
+#: src/droid.cpp:2263
#, c-format
msgid "Centered on Group %u - %u Unit"
msgid_plural "Centered on Group %u - %u Units"
msgstr[0] "S'ha centrat al grup %u - %u unitat"
msgstr[1] "S'ha centrat al grup %u - %u unitats"
-#: src/droid.cpp:2290
+#: src/droid.cpp:2267
#, c-format
msgid "Aligning with Group %u - %u Unit"
msgid_plural "Aligning with Group %u - %u Units"
msgstr[0] "S'alinea amb el grup %u - %u Unitat"
msgstr[1] "S'alinea amb el grup %u - %u Unitats"
-#: src/droid.cpp:2472
+#: src/droid.cpp:2449
msgid "Rookie"
msgstr "Principiant"
-#: src/droid.cpp:2473
+#: src/droid.cpp:2450
msgctxt "rank"
msgid "Green"
msgstr "Novell"
-#: src/droid.cpp:2474
+#: src/droid.cpp:2451
msgid "Trained"
msgstr "Entrenat"
-#: src/droid.cpp:2475
+#: src/droid.cpp:2452
msgid "Regular"
msgstr "Regular"
-#: src/droid.cpp:2476
+#: src/droid.cpp:2453
msgid "Professional"
msgstr "Professional"
-#: src/droid.cpp:2477
+#: src/droid.cpp:2454
msgid "Veteran"
msgstr "Veterà"
-#: src/droid.cpp:2478
+#: src/droid.cpp:2455
msgid "Elite"
msgstr "Èlit"
-#: src/droid.cpp:2479
+#: src/droid.cpp:2456
msgid "Special"
msgstr "Especial"
-#: src/droid.cpp:2480
+#: src/droid.cpp:2457
msgid "Hero"
msgstr "Heroi"
-#: src/droid.cpp:3438
+#: src/droid.cpp:3415
#, c-format
msgid "%s wanted to give you a %s but you have too many!"
msgstr "%s vol donar-vos un %s però en teniu masses!"
-#: src/droid.cpp:3442
+#: src/droid.cpp:3419
#, c-format
msgid "You wanted to give %s a %s but they have too many!"
msgstr "Voleu donar %s a %s però en té masses!"
@@ -12468,15 +12468,15 @@ msgstr "APRENENTATGE"
#. TRANSLATORS: "Return", in this context, means "return to previous screen/menu"
#: src/frontend.cpp:190
-#: src/frontend.cpp:250
-#: src/frontend.cpp:381
-#: src/frontend.cpp:451
-#: src/frontend.cpp:592
-#: src/frontend.cpp:738
-#: src/frontend.cpp:872
-#: src/frontend.cpp:1107
-#: src/frontend.cpp:1261
-#: src/frontend.cpp:1281
+#: src/frontend.cpp:251
+#: src/frontend.cpp:390
+#: src/frontend.cpp:462
+#: src/frontend.cpp:603
+#: src/frontend.cpp:749
+#: src/frontend.cpp:883
+#: src/frontend.cpp:1118
+#: src/frontend.cpp:1272
+#: src/frontend.cpp:1292
msgctxt "menu"
msgid "Return"
msgstr "Torna"
@@ -12494,320 +12494,330 @@ msgid "Challenges"
msgstr "Desafiaments"
#: src/frontend.cpp:247
-#: src/ingameop.cpp:273
-msgid "Load Game"
+#, fuzzy
+msgid "Load Campaign Game"
msgstr "Carrega una part."
-#: src/frontend.cpp:249
+#: src/frontend.cpp:248
+#, fuzzy
+msgid "Load Skirmish Game"
+msgstr "Escaramussa"
+
+#: src/frontend.cpp:250
msgid "SINGLE PLAYER"
msgstr "UN JUGADOR"
-#: src/frontend.cpp:322
-#: src/ingameop.cpp:494
-#: src/mission.cpp:2493
-#: src/mission.cpp:2594
-msgid "Load Saved Game"
+#: src/frontend.cpp:326
+#: src/ingameop.cpp:504
+#, fuzzy
+msgid "Load Campaign Saved Game"
+msgstr "Carrega una partida desada"
+
+#: src/frontend.cpp:331
+#: src/ingameop.cpp:508
+#, fuzzy
+msgid "Load Skirmish Saved Game"
msgstr "Carrega una partida desada"
-#: src/frontend.cpp:376
+#: src/frontend.cpp:385
msgid "MULTI PLAYER"
msgstr "JOC EN XARXA"
-#: src/frontend.cpp:378
+#: src/frontend.cpp:387
msgid "Host Game"
msgstr "Crea una partida"
-#: src/frontend.cpp:379
+#: src/frontend.cpp:388
msgid "Join Game"
msgstr "Uneix-te a una partida"
-#: src/frontend.cpp:384
+#: src/frontend.cpp:393
msgid "TCP PORT 2100 MUST BE OPENED IN YOUR FIREWALL / ROUTER TO HOST GAMES!"
msgstr ""
-#: src/frontend.cpp:444
+#: src/frontend.cpp:455
#: src/multiint.cpp:1400
msgid "OPTIONS"
msgstr "OPCIONS"
-#: src/frontend.cpp:445
+#: src/frontend.cpp:456
msgid "Game Options"
msgstr "Opcions del joc"
-#: src/frontend.cpp:446
+#: src/frontend.cpp:457
msgid "Graphics Options"
msgstr "Opcions dels gràfics"
-#: src/frontend.cpp:447
+#: src/frontend.cpp:458
msgid "Video Options"
msgstr "Opcions dels vídeos"
-#: src/frontend.cpp:448
+#: src/frontend.cpp:459
#: src/ingameop.cpp:268
msgid "Audio Options"
msgstr "Opcions de l'àudio"
-#: src/frontend.cpp:449
+#: src/frontend.cpp:460
msgid "Mouse Options"
msgstr "Opcions del ratolí"
-#: src/frontend.cpp:450
+#: src/frontend.cpp:461
msgid "Key Mappings"
msgstr "Mapatge de tecles"
-#: src/frontend.cpp:510
+#: src/frontend.cpp:521
msgid "Video Playback"
msgstr "Reprod. dels vídeos"
-#: src/frontend.cpp:514
-#: src/frontend.cpp:666
+#: src/frontend.cpp:525
+#: src/frontend.cpp:677
msgid "1X"
msgstr "1X"
-#: src/frontend.cpp:518
-#: src/frontend.cpp:656
+#: src/frontend.cpp:529
+#: src/frontend.cpp:667
msgid "2X"
msgstr "2X"
-#: src/frontend.cpp:522
-#: src/frontend.cpp:661
-#: src/frontend.cpp:812
-#: src/frontend.cpp:895
+#: src/frontend.cpp:533
+#: src/frontend.cpp:672
+#: src/frontend.cpp:823
+#: src/frontend.cpp:906
msgid "Fullscreen"
msgstr "Pant. completa"
-#: src/frontend.cpp:531
+#: src/frontend.cpp:542
msgid "Scanlines"
msgstr ""
-#: src/frontend.cpp:535
-#: src/frontend.cpp:556
-#: src/frontend.cpp:564
-#: src/frontend.cpp:580
-#: src/frontend.cpp:610
-#: src/frontend.cpp:628
-#: src/frontend.cpp:646
-#: src/frontend.cpp:691
-#: src/frontend.cpp:837
-#: src/frontend.cpp:847
-#: src/frontend.cpp:919
-#: src/frontend.cpp:980
-#: src/frontend.cpp:1023
-#: src/frontend.cpp:1064
-#: src/frontend.cpp:1076
-#: src/frontend.cpp:1088
-#: src/frontend.cpp:1123
-#: src/frontend.cpp:1136
-#: src/frontend.cpp:1150
+#: src/frontend.cpp:546
+#: src/frontend.cpp:567
+#: src/frontend.cpp:575
+#: src/frontend.cpp:591
+#: src/frontend.cpp:621
+#: src/frontend.cpp:639
+#: src/frontend.cpp:657
+#: src/frontend.cpp:702
+#: src/frontend.cpp:848
+#: src/frontend.cpp:858
+#: src/frontend.cpp:930
+#: src/frontend.cpp:991
+#: src/frontend.cpp:1034
+#: src/frontend.cpp:1075
+#: src/frontend.cpp:1087
+#: src/frontend.cpp:1099
+#: src/frontend.cpp:1134
+#: src/frontend.cpp:1147
+#: src/frontend.cpp:1161
msgid "Off"
msgstr "Inactiu"
-#: src/frontend.cpp:539
-#: src/frontend.cpp:681
+#: src/frontend.cpp:550
+#: src/frontend.cpp:692
msgid "50%"
msgstr ""
-#: src/frontend.cpp:543
-#: src/frontend.cpp:686
-#: src/multiplay.cpp:1988
+#: src/frontend.cpp:554
+#: src/frontend.cpp:697
+#: src/multiplay.cpp:1999
msgid "Black"
msgstr "Negre"
-#: src/frontend.cpp:549
+#: src/frontend.cpp:560
msgid "Screen Shake"
msgstr "Tremolor de pant."
-#: src/frontend.cpp:552
-#: src/frontend.cpp:568
-#: src/frontend.cpp:576
-#: src/frontend.cpp:615
-#: src/frontend.cpp:633
-#: src/frontend.cpp:642
-#: src/frontend.cpp:833
-#: src/frontend.cpp:985
-#: src/frontend.cpp:1019
-#: src/frontend.cpp:1060
-#: src/frontend.cpp:1072
-#: src/frontend.cpp:1084
-#: src/frontend.cpp:1128
-#: src/frontend.cpp:1141
-#: src/frontend.cpp:1155
+#: src/frontend.cpp:563
+#: src/frontend.cpp:579
+#: src/frontend.cpp:587
+#: src/frontend.cpp:626
+#: src/frontend.cpp:644
+#: src/frontend.cpp:653
+#: src/frontend.cpp:844
+#: src/frontend.cpp:996
+#: src/frontend.cpp:1030
+#: src/frontend.cpp:1071
+#: src/frontend.cpp:1083
+#: src/frontend.cpp:1095
+#: src/frontend.cpp:1139
+#: src/frontend.cpp:1152
+#: src/frontend.cpp:1166
msgid "On"
msgstr "Actiu"
-#: src/frontend.cpp:561
+#: src/frontend.cpp:572
msgid "Subtitles"
msgstr "Subtitols"
-#: src/frontend.cpp:573
+#: src/frontend.cpp:584
msgid "Shadows"
msgstr "Ombres"
-#: src/frontend.cpp:584
-#: src/frontend.cpp:1288
+#: src/frontend.cpp:595
+#: src/frontend.cpp:1299
msgid "Radar"
msgstr "Radar"
-#: src/frontend.cpp:585
-#: src/frontend.cpp:698
-#: src/frontend.cpp:1289
+#: src/frontend.cpp:596
+#: src/frontend.cpp:709
+#: src/frontend.cpp:1300
msgid "Rotating"
msgstr "Giratori"
-#: src/frontend.cpp:585
-#: src/frontend.cpp:698
-#: src/frontend.cpp:1289
+#: src/frontend.cpp:596
+#: src/frontend.cpp:709
+#: src/frontend.cpp:1300
msgid "Fixed"
msgstr "Fixe"
-#: src/frontend.cpp:588
+#: src/frontend.cpp:599
msgid "GRAPHICS OPTIONS"
msgstr "OPCIONS DELS GRÀFICS"
-#: src/frontend.cpp:726
+#: src/frontend.cpp:737
#: src/ingameop.cpp:168
msgid "Voice Volume"
msgstr "Volum veu"
-#: src/frontend.cpp:730
+#: src/frontend.cpp:741
#: src/ingameop.cpp:173
msgid "FX Volume"
msgstr "Volum efectes"
-#: src/frontend.cpp:734
+#: src/frontend.cpp:745
#: src/ingameop.cpp:178
msgid "Music Volume"
msgstr "Volum música"
-#: src/frontend.cpp:741
+#: src/frontend.cpp:752
msgid "AUDIO OPTIONS"
msgstr "OPCIONS DE L'ÀUDIO"
-#: src/frontend.cpp:805
+#: src/frontend.cpp:816
msgid "* Takes effect on game restart"
msgstr "* Té efecte quan reinicieu"
-#: src/frontend.cpp:808
+#: src/frontend.cpp:819
msgid "Graphics Mode*"
msgstr "Mode gràfic*"
-#: src/frontend.cpp:816
-#: src/frontend.cpp:890
+#: src/frontend.cpp:827
+#: src/frontend.cpp:901
msgid "Windowed"
msgstr "Finestra"
-#: src/frontend.cpp:820
+#: src/frontend.cpp:831
msgid "Resolution*"
msgstr "Resolució*"
-#: src/frontend.cpp:825
+#: src/frontend.cpp:836
msgid "Texture size"
msgstr "Mida de la textura"
-#: src/frontend.cpp:829
+#: src/frontend.cpp:840
#, fuzzy
msgid "Vertical sync"
msgstr "Sincro. vertical*"
-#: src/frontend.cpp:864
-#: src/frontend.cpp:925
+#: src/frontend.cpp:875
+#: src/frontend.cpp:936
#, fuzzy
msgid "Unsupported"
msgstr "Transport"
-#: src/frontend.cpp:869
+#: src/frontend.cpp:880
msgid "VIDEO OPTIONS"
msgstr "OPCIONS DE VIDEO"
-#: src/frontend.cpp:1057
+#: src/frontend.cpp:1068
msgid "Reverse Rotation"
msgstr "Rotació inversa"
-#: src/frontend.cpp:1068
+#: src/frontend.cpp:1079
msgid "Trap Cursor"
msgstr "Captura el cursor"
-#: src/frontend.cpp:1081
+#: src/frontend.cpp:1092
msgid "Switch Mouse Buttons"
msgstr "Intercanvia els botons"
-#: src/frontend.cpp:1093
+#: src/frontend.cpp:1104
msgid "Rotate Screen"
msgstr "Rota la pantalla"
-#: src/frontend.cpp:1096
-#: src/frontend.cpp:1169
+#: src/frontend.cpp:1107
+#: src/frontend.cpp:1180
msgid "Middle Mouse"
msgstr "Botó del mig"
-#: src/frontend.cpp:1100
-#: src/frontend.cpp:1164
+#: src/frontend.cpp:1111
+#: src/frontend.cpp:1175
msgid "Right Mouse"
msgstr "Botó dret"
-#: src/frontend.cpp:1104
+#: src/frontend.cpp:1115
msgid "MOUSE OPTIONS"
msgstr "OPCIONS DEL RATOLÍ"
-#: src/frontend.cpp:1204
-#: src/frontend.cpp:1282
+#: src/frontend.cpp:1215
+#: src/frontend.cpp:1293
msgid "Language"
msgstr "Idioma"
-#: src/frontend.cpp:1208
-#: src/frontend.cpp:1286
+#: src/frontend.cpp:1219
+#: src/frontend.cpp:1297
msgid "Difficulty"
msgstr "Dificultat"
-#: src/frontend.cpp:1212
-#: src/frontend.cpp:1293
-#: src/frontend.cpp:1325
+#: src/frontend.cpp:1223
+#: src/frontend.cpp:1304
+#: src/frontend.cpp:1336
#: src/multiint.cpp:214
msgid "Easy"
msgstr "Fàcil"
-#: src/frontend.cpp:1215
-#: src/frontend.cpp:1296
-#: src/frontend.cpp:1317
+#: src/frontend.cpp:1226
+#: src/frontend.cpp:1307
+#: src/frontend.cpp:1328
msgid "Normal"
msgstr "Normal"
-#: src/frontend.cpp:1219
-#: src/frontend.cpp:1299
-#: src/frontend.cpp:1321
+#: src/frontend.cpp:1230
+#: src/frontend.cpp:1310
+#: src/frontend.cpp:1332
#: src/multiint.cpp:214
msgid "Hard"
msgstr "Difícil"
-#: src/frontend.cpp:1224
-#: src/frontend.cpp:1287
+#: src/frontend.cpp:1235
+#: src/frontend.cpp:1298
msgid "Scroll Speed"
msgstr "Veloc. desplaçament"
-#: src/frontend.cpp:1228
-#: src/frontend.cpp:1283
+#: src/frontend.cpp:1239
+#: src/frontend.cpp:1294
#, fuzzy
msgid "Unit Colour:"
msgstr "Color de les unitats"
-#: src/frontend.cpp:1248
-#: src/frontend.cpp:1284
+#: src/frontend.cpp:1259
+#: src/frontend.cpp:1295
#, fuzzy
msgid "Campaign"
msgstr "Campanya nova"
-#: src/frontend.cpp:1258
-#: src/frontend.cpp:1285
+#: src/frontend.cpp:1269
+#: src/frontend.cpp:1296
#, fuzzy
msgid "Skirmish/Multiplayer"
msgstr "Partida en xarxa"
-#: src/frontend.cpp:1264
-#: src/frontend.cpp:1280
+#: src/frontend.cpp:1275
+#: src/frontend.cpp:1291
msgid "GAME OPTIONS"
msgstr "OPCIONS DE JOC"
-#: src/frontend.cpp:1425
+#: src/frontend.cpp:1436
#: src/multiint.cpp:2538
msgid "Mod: "
msgstr "Mod:"
@@ -12994,34 +13004,48 @@ msgid "WARNING: You're the host. If you quit, the game ends for everyone!"
msgstr "Avís: Sou l'amfitrió. Si sortiu, la partida s'acabarà per tothom!"
#: src/ingameop.cpp:187
-#: src/ingameop.cpp:522
+#: src/ingameop.cpp:538
msgid "Tactical UI (Target Origin Icon): Show"
msgstr "UI tàctic (Icona d'origen tactic): Mostra"
#: src/ingameop.cpp:192
-#: src/ingameop.cpp:526
+#: src/ingameop.cpp:542
msgid "Tactical UI (Target Origin Icon): Hide"
msgstr "UI tàctic (Icona d'origen tàctic): Amaga"
#: src/ingameop.cpp:275
-#: src/ingameop.cpp:498
-#: src/mission.cpp:2480
-#: src/mission.cpp:2597
+#: src/ingameop.cpp:282
+msgid "Load Game"
+msgstr "Carrega una part."
+
+#: src/ingameop.cpp:277
+#: src/ingameop.cpp:284
+#: src/mission.cpp:2601
msgid "Save Game"
msgstr "Desa la partida"
-#: src/ingameop.cpp:339
+#: src/ingameop.cpp:349
msgid "Host has quit the game!"
msgstr "L'amfitrió ha tancat la partida!"
-#: src/ingameop.cpp:345
+#: src/ingameop.cpp:355
msgid "The game can't continue without the host."
msgstr "La partida no pot continuar sense l'amfitrió."
-#: src/ingameop.cpp:351
+#: src/ingameop.cpp:361
msgid "--> QUIT <--"
msgstr "--> Surt <--"
+#: src/ingameop.cpp:512
+#, fuzzy
+msgid "Save Campaign Game"
+msgstr "Campanya nova"
+
+#: src/ingameop.cpp:516
+#, fuzzy
+msgid "Save Skirmish Game"
+msgstr "Escaramussa"
+
#: src/init.cpp:423
#, c-format
msgid ""
@@ -13056,7 +13080,7 @@ msgid "Need more resources!"
msgstr ""
#: src/intelmap.cpp:242
-#: src/keybind.cpp:1370
+#: src/keybind.cpp:1397
msgid "PAUSED"
msgstr "EN PAUSA"
@@ -13183,262 +13207,267 @@ msgstr "Assigna la producció de la fàbrica de convertiplans"
msgid "Circle"
msgstr "Cercle"
-#: src/keybind.cpp:136
+#: src/keybind.cpp:138
msgid "Sorry, that cheat is disabled in multiplayer games."
msgstr "Ho lamento, aquesta trampa està deshabilitada a les partides multijugador."
-#: src/keybind.cpp:142
+#: src/keybind.cpp:171
msgid "Warning! This cheat is buggy. We recommend to NOT use it."
msgstr "Alerta! Aquesta trampa pot contenir errades. Us recomanem que NO la feu servir."
-#: src/keybind.cpp:199
+#: src/keybind.cpp:228
msgid "Ouch! Droid's health is down 20%!"
msgstr ""
-#: src/keybind.cpp:215
+#: src/keybind.cpp:244
msgid "Ouch! Structure's health is down 20%!"
msgstr ""
-#: src/keybind.cpp:270
+#: src/keybind.cpp:299
msgid "Lets us see what you see!"
msgstr "Deixeu-me veure el que veieu!"
-#: src/keybind.cpp:272
+#: src/keybind.cpp:301
msgid "Fine, weapon & sensor display is off!"
msgstr "Molt bé, la pantalla de les armes i els sensors està apagada!"
-#: src/keybind.cpp:445
-#: src/keybind.cpp:475
-#: src/keybind.cpp:492
-#: src/keybind.cpp:536
-#: src/keybind.cpp:644
-#: src/keybind.cpp:684
-#: src/keybind.cpp:790
-#: src/keybind.cpp:1317
-#: src/keybind.cpp:1424
-#: src/keybind.cpp:1553
-#: src/keybind.cpp:1911
-#: src/keybind.cpp:1952
+#: src/keybind.cpp:423
+#, fuzzy, c-format
+msgid "Player %u is cheating a new droid army of: %s."
+msgstr "El jugador %u està fent trampes (mode depuració) amb un nou ciborg: %s"
+
+#: src/keybind.cpp:461
+#: src/keybind.cpp:491
+#: src/keybind.cpp:508
+#: src/keybind.cpp:552
+#: src/keybind.cpp:661
+#: src/keybind.cpp:701
+#: src/keybind.cpp:807
+#: src/keybind.cpp:1344
+#: src/keybind.cpp:1451
+#: src/keybind.cpp:1580
+#: src/keybind.cpp:1938
+#: src/keybind.cpp:1979
#, c-format
msgid "(Player %u) is using cheat :%s"
msgstr "(El jugador %u) fa servir trampes :%s"
-#: src/keybind.cpp:446
+#: src/keybind.cpp:462
msgid "Hard as nails!!!"
msgstr "Dur com les ungles!!!"
-#: src/keybind.cpp:460
+#: src/keybind.cpp:476
msgid "Takings thing easy!"
msgstr "Agafant-se les coses amb calma!"
-#: src/keybind.cpp:476
+#: src/keybind.cpp:492
msgid "1000 big ones!!!"
msgstr "1000 dels grossos!!!"
-#: src/keybind.cpp:493
+#: src/keybind.cpp:509
msgid "Power overwhelming"
msgstr "Energia desbordant"
-#: src/keybind.cpp:508
+#: src/keybind.cpp:524
msgid "Back to normality!"
msgstr "Tornada a la normalitat"
-#: src/keybind.cpp:521
+#: src/keybind.cpp:537
msgid "Getting tricky!"
msgstr "Us esteu tornant trampós!"
-#: src/keybind.cpp:537
+#: src/keybind.cpp:553
msgid "Twice as nice!"
msgstr "El doble de bonic!"
-#: src/keybind.cpp:548
+#: src/keybind.cpp:564
msgid "FPS display is enabled."
msgstr "S'ha habilitat el visor de FPS"
-#: src/keybind.cpp:552
+#: src/keybind.cpp:568
msgid "FPS display is disabled."
msgstr "S'ha deshabilitat el visor de FPS"
-#: src/keybind.cpp:609
+#: src/keybind.cpp:626
#, c-format
msgid "(Player %u) is using a cheat :Num Droids: %d Num Structures: %d Num Features: %d"
msgstr "(Jugador %u) fa servir una trampa: Nº ciborgs: %d Nº estructures: %d Nº Funcions: %d"
-#: src/keybind.cpp:645
+#: src/keybind.cpp:662
msgid "Infinite power disabled"
msgstr "Energia infinita deshabilitada"
-#: src/keybind.cpp:645
+#: src/keybind.cpp:662
msgid "Infinite power enabled"
msgstr "Energia infinita habilitada"
-#: src/keybind.cpp:685
+#: src/keybind.cpp:702
msgid "All items made available"
msgstr "Estan disponibles tots els objectes"
-#: src/keybind.cpp:791
+#: src/keybind.cpp:808
msgid "Fog on"
msgstr "Boira activada"
-#: src/keybind.cpp:791
+#: src/keybind.cpp:808
msgid "Fog off"
msgstr "Boira desactivada"
-#: src/keybind.cpp:1202
+#: src/keybind.cpp:1229
#, c-format
msgid "Warning! This cheat can cause dire problems later on! [%s]"
msgstr "Alerta! Aquesta trampa pot portar problemes tard o d'hora! [%s]"
-#: src/keybind.cpp:1202
+#: src/keybind.cpp:1229
msgid "Ending Mission."
msgstr "Es finalitza la missió."
-#: src/keybind.cpp:1318
+#: src/keybind.cpp:1345
msgid "God Mode ON"
msgstr "Mode Déu activat"
-#: src/keybind.cpp:1318
+#: src/keybind.cpp:1345
msgid "God Mode OFF"
msgstr "Mode Déu desactivat"
-#: src/keybind.cpp:1330
+#: src/keybind.cpp:1357
msgid "View Aligned to North"
msgstr "Vista alineada al nord"
-#: src/keybind.cpp:1339
+#: src/keybind.cpp:1366
#, c-format
msgid "Trap cursor %s"
msgstr "Cursor atrapat %s"
-#: src/keybind.cpp:1425
+#: src/keybind.cpp:1452
msgid "Researched EVERYTHING for you!"
msgstr "TOT investigat per vos!"
-#: src/keybind.cpp:1490
+#: src/keybind.cpp:1517
#, c-format
msgid "(Player %u) is using cheat :%s %s"
msgstr "(Jugador %u) fa servir una trampa: %s %s"
-#: src/keybind.cpp:1490
+#: src/keybind.cpp:1517
msgid "Researched"
msgstr "Investigat"
-#: src/keybind.cpp:1511
+#: src/keybind.cpp:1538
msgid "Only displaying energy bars when selected"
msgstr "Només es mostra les barres d'energia quan es selecciona"
-#: src/keybind.cpp:1514
+#: src/keybind.cpp:1541
msgid "Always displaying energy bars for units"
msgstr "Sempre mostra les barres d'energia de les unitats"
-#: src/keybind.cpp:1517
+#: src/keybind.cpp:1544
msgid "Always displaying energy bars for units and structures"
msgstr "Sempre mostra les barres d'energia de les unitats i estructures"
-#: src/keybind.cpp:1539
+#: src/keybind.cpp:1566
msgid "Demo mode off - Returning to normal game mode"
msgstr "Mode demo apagat - Es torna al mode de joc normal"
-#: src/keybind.cpp:1554
+#: src/keybind.cpp:1581
msgid "Debug menu is Open"
msgstr "S'ha obert el menú de depuració"
-#: src/keybind.cpp:1591
+#: src/keybind.cpp:1618
msgid "Unable to locate any oil derricks!"
msgstr "No es pot trobar cap pou de petroli!"
-#: src/keybind.cpp:1813
+#: src/keybind.cpp:1840
msgid "Oh, the weather outside is frightful... SNOW"
msgstr "Oh, el temps fora és glaçat... NEVA"
-#: src/keybind.cpp:1819
+#: src/keybind.cpp:1846
msgid "Singing in the rain, I'm singing in the rain... RAIN"
msgstr "Cantant sota la pluja, «I'm singing in the rain...» Plou"
-#: src/keybind.cpp:1825
+#: src/keybind.cpp:1852
msgid "Forecast : Clear skies for all areas... NO WEATHER"
msgstr "El temps: Cels clars arreu... SENSE TEMPS"
-#: src/keybind.cpp:1910
+#: src/keybind.cpp:1937
msgid "Warning! This can have drastic consequences if used incorrectly in missions."
msgstr "Alerta! Això pot tenir conseqüències dràstiques si es fa servir malament a les missions."
-#: src/keybind.cpp:1912
+#: src/keybind.cpp:1939
msgid "All enemies destroyed by cheating!"
msgstr "Tots els enemics han estat destruïts fent trampes!"
-#: src/keybind.cpp:1953
+#: src/keybind.cpp:1980
msgid "Destroying selected droids and structures!"
msgstr "Es destrueixen els ciborgs i estructures seleccionats!"
-#: src/keybind.cpp:2520
+#: src/keybind.cpp:2547
msgid "Centered on player HQ, direction NORTH"
msgstr "Centrat en el QG del jugador, direcció NORD"
-#: src/keybind.cpp:2532
+#: src/keybind.cpp:2559
msgid "Unable to locate HQ!"
msgstr "No es pot localitzar el QG"
-#: src/keybind.cpp:2539
+#: src/keybind.cpp:2566
msgid "Formation speed limiting has been removed from the game due to bugs."
msgstr "El límit de velocitat de les formacions ha estat retirat del joc per que té errades."
-#: src/keybind.cpp:2588
+#: src/keybind.cpp:2615
msgid "Vertical rotation direction: Normal"
msgstr "Direcció de rotació vertical: Normal"
-#: src/keybind.cpp:2593
+#: src/keybind.cpp:2620
msgid "Vertical rotation direction: Flipped"
msgstr "Direcció de rotació vertical: Canviada"
-#: src/keybind.cpp:2602
+#: src/keybind.cpp:2629
msgid "Screen shake when things die: Off"
msgstr "Tremolor de pantalla quan les coses es moren: Apagat"
-#: src/keybind.cpp:2607
+#: src/keybind.cpp:2634
msgid "Screen shake when things die: On"
msgstr "Tremolor de pantalla quan les coses es moren: Encés"
-#: src/keybind.cpp:2657
+#: src/keybind.cpp:2684
msgid "Sorry, but game speed cannot be changed in multiplayer."
msgstr "Lamentablement la velocitat del joc no es pot canviar en una partida en xarxa."
-#: src/keybind.cpp:2692
-#: src/keybind.cpp:2744
+#: src/keybind.cpp:2719
+#: src/keybind.cpp:2771
msgid "Game Speed Reset"
msgstr "Es restaura la velocitat de la partida"
-#: src/keybind.cpp:2696
+#: src/keybind.cpp:2723
#, fuzzy, c-format
msgid "Game Speed Increased to %s"
msgstr "La velocitat de la partida s'ha incrementat en %3.1f"
-#: src/keybind.cpp:2700
+#: src/keybind.cpp:2727
#, fuzzy, c-format
msgid "Game Speed Reduced to %s"
msgstr "La velocitat de la partida s'ha disminuït en %3.1f"
-#: src/keybind.cpp:2756
+#: src/keybind.cpp:2783
msgid "Radar showing friend-foe colors"
msgstr "El radar mostra els colors amics-enemics"
-#: src/keybind.cpp:2760
+#: src/keybind.cpp:2787
msgid "Radar showing player colors"
msgstr "El radar mostra el color dels jugadors"
-#: src/keybind.cpp:2775
+#: src/keybind.cpp:2802
msgid "Radar showing only objects"
msgstr "El radar només mostra objectes"
-#: src/keybind.cpp:2778
+#: src/keybind.cpp:2805
msgid "Radar blending terrain and height"
msgstr "El radar barreja el terreny i l'alçada"
-#: src/keybind.cpp:2781
+#: src/keybind.cpp:2808
msgid "Radar showing terrain"
msgstr "El radar mostra el terreny"
-#: src/keybind.cpp:2784
+#: src/keybind.cpp:2811
msgid "Radar showing height"
msgstr "El radar mostra l'alçada"
@@ -14004,8 +14033,8 @@ msgid "OBJECTIVE FAILED"
msgstr "HEU FRACASSAT"
#: src/mission.cpp:2459
-#: src/mission.cpp:2499
-#: src/mission.cpp:2611
+#: src/mission.cpp:2503
+#: src/mission.cpp:2615
msgid "Quit To Main Menu"
msgstr "Torna al menú principal"
@@ -14013,61 +14042,66 @@ msgstr "Torna al menú principal"
msgid "Continue Game"
msgstr "Continua jugant"
-#: src/mission.cpp:2562
+#: src/mission.cpp:2497
+#: src/mission.cpp:2598
+msgid "Load Saved Game"
+msgstr "Carrega una partida desada"
+
+#: src/mission.cpp:2566
msgid "GAME SAVED :"
msgstr "S'HA DESAT LA PARTIDA:"
-#: src/move.cpp:2282
+#: src/move.cpp:2277
#, c-format
msgid "You found %u power in an oil drum."
msgstr "Heu trobat %u energia en un bidó de petroli."
-#: src/multigifts.cpp:180
+#: src/multigifts.cpp:217
#, c-format
msgid "%s Gives You A Visibility Report"
msgstr "%s us dona un informe de visibilitat"
-#: src/multigifts.cpp:202
+#: src/multigifts.cpp:239
#, c-format
msgid "%s Gives you a %s"
msgstr "%s uns dona un %s"
-#: src/multigifts.cpp:250
+#: src/multigifts.cpp:287
#, c-format
msgid "Tried to give away a non-empty %s - but this is not allowed."
msgstr "S'ha intentat eliminar un %s que no és buit - però no està permés"
-#: src/multigifts.cpp:292
+#: src/multigifts.cpp:329
#, c-format
msgid "%s Gives You Technology Documents"
msgstr "%s us entrega documents sobre tecnologia"
-#: src/multigifts.cpp:343
+#: src/multigifts.cpp:380
#, c-format
msgid "%s Gives You %u Power"
msgstr "%s us dona %u punts d'energia"
-#: src/multigifts.cpp:371
+#: src/multigifts.cpp:408
#, c-format
msgid "%s Requests An Alliance With You"
msgstr "%s us demana si us voleu aliar amb ell"
-#: src/multigifts.cpp:380
+#: src/multigifts.cpp:417
#, c-format
msgid "You Invite %s To Form An Alliance"
msgstr "Heu convidat a %s a formar una aliança"
-#: src/multigifts.cpp:401
+#: src/multigifts.cpp:438
#, c-format
msgid "%s Breaks The Alliance With %s"
msgstr "%s ha trencat l'aliança amb %s"
-#: src/multigifts.cpp:431
+#: src/multigifts.cpp:468
#, c-format
msgid "%s Forms An Alliance With %s"
msgstr "%s S'ha aliat amb %s"
-#: src/multigifts.cpp:684
+#: src/multigifts.cpp:721
#, c-format
msgid "You Discover Blueprints For %s"
msgstr "Heu descobert traces de %s"
@@ -14424,7 +14458,7 @@ msgstr "S'ha habilitat el mode «equips tancats»"
#: src/multiint.cpp:3103
#: src/multiint.cpp:3172
-#: src/multimenu.cpp:1472
+#: src/multimenu.cpp:1487
#, c-format
msgid "The host has kicked %s from the game!"
msgstr "L'amfitrió ha fet fora %s de la partida!"
@@ -14491,27 +14525,27 @@ msgstr "Ping"
msgid "Players Still Joining"
msgstr "Els jugadors encara s'estan unint"
-#: src/multijoin.cpp:267
+#: src/multijoin.cpp:264
#, c-format
msgid "%s has Left the Game"
msgstr "%s ha deixat la partida"
-#: src/multijoin.cpp: