Compare commits

...

2795 Commits

Author SHA1 Message Date
Matthias Mailänder
0fa258b950 Merge pull request #3551 from pchote/changelog
Update changelog for new playtest.
2013-07-13 01:12:40 -07:00
Paul Chote
5a06d9dfec Update changelog for new playtest. 2013-07-13 19:37:04 +12:00
Matthias Mailänder
80593ef27f Merge pull request #3550 from pchote/starting-units
Support starting units.
2013-07-13 00:24:05 -07:00
Paul Chote
a678337d14 Enable starting units in C&C. 2013-07-13 19:18:27 +12:00
Paul Chote
55653c3f1f Add lobby support for configuring starting units. 2013-07-13 19:18:27 +12:00
Paul Chote
db22f3568d Remove obsolete DefaultStartingUnits parameter.
It was only actually used by bomber-john. Everything
else also removed SpawnMPUnits, making it redundant.
2013-07-13 19:18:27 +12:00
Paul Chote
d3110bd114 Fix Doughnut Hole spawn behavior. 2013-07-13 19:18:27 +12:00
Paul Chote
7376cccf4d Smarter unit spawn logic. Fixes #3496. 2013-07-13 19:18:27 +12:00
Paul Chote
2091a386fb Improve support for picking a valid actor spawn cell. 2013-07-13 19:18:26 +12:00
Paul Chote
6bf783e674 Add IEnumerable.RandomOrDefault extension. 2013-07-13 19:18:26 +12:00
Paul Chote
06b06a5dad Merge pull request #3375 from i80and/pathingdomains
Pathingdomains
2013-07-12 23:01:38 -07:00
Andrew Aldridge
8287c5c872 Use static empty pathfinding path when possible 2013-07-12 09:43:35 -04:00
i80and
8c3769c99f Add self to AUTHORS 2013-07-12 09:40:59 -04:00
Andrew Aldridge
259e121307 Substantial performance improvement in DomainIndex
* Get rid of HashSets
      * Cache CanTraverseTile()'s terrain offsets
2013-07-12 09:40:59 -04:00
Andrew Aldridge
3fed98fcb1 Add support for bridge construction
Each movement class is given a crude transientDomain graph.  Whenever a bridge state
changes, the domain index rebuilds the relevant cells, setting its domain and creating
a transient domain connection.

This graph is searched as a fallback if the straightforward domain comparison is false.
Behavior needs to be double-checked, and ideally destructing connections would be supported,
but so far performance and behavior on allies-02 seems good.
2013-07-12 09:40:59 -04:00
Andrew Aldridge
ba885907ba Use MobileInfo.GetMovementClass for domain indexing, clearing path for caching and smarter behavior
* Move DomainIndex from being a manual hard-coded hook in World to an IWorldLoaded trait.
2013-07-12 09:40:55 -04:00
Andrew Aldridge
6fb01c7ab8 Properly deal with FindUnitPathToRange
This fixes boats attacking land targets.
2013-07-12 09:37:01 -04:00
i80and
d4cead2187 Initial terrain domain work 2013-07-12 09:37:00 -04:00
ScottNZ
b639179f31 Put a hospital in the centre of the Tournament Island map 2013-07-12 20:58:49 +12:00
Paul Chote
ed54b34c8a Merge pull request #3523 from ScottNZ/orders
Add RejectsOrders to disallow orders for offmap aircraft etc
2013-07-11 22:07:48 -07:00
ScottNZ
e4e92ec900 Add RejectsOrders to disallow orders for offmap aircraft etc 2013-07-12 16:04:14 +12:00
i80and
1fe2418e22 Factor out the CVec direction list. 2013-07-11 20:32:42 -04:00
Paul Chote
3b6ab58940 Merge pull request #3471 from Mailaender/monsters
Added Monsters
2013-07-11 15:08:02 -07:00
Paul Chote
086b0a62e9 Merge pull request #3533 from Mailaender/stylecop
Added StyleCop Support
2013-07-11 15:01:30 -07:00
Matthias Mailänder
a676c4f311 fix glitchy dino stand animations 2013-07-11 20:55:34 +02:00
Matthias Mailänder
dc2c16130b arming the dinos and making them buildable without cheats
no ranks and player color remapping for them though
2013-07-11 20:53:48 +02:00
Matthias Mailänder
d38a17ddf8 fix and add the funpark sequences 2013-07-11 20:53:48 +02:00
Matthias Mailänder
1740e95716 added rules for C&C dinosaurs being already shipped 2013-07-11 20:53:48 +02:00
Matthias Mailänder
7867277321 fix yaml for player controlled visceroid 2013-07-11 20:53:48 +02:00
Matthias Mailänder
cc15320963 removed non-playable aircraft from C&C developer mode 2013-07-11 20:53:48 +02:00
Matthias Mailänder
6b5f40bd79 faster ants and consistent weapon naming 2013-07-11 20:53:48 +02:00
Matthias Mailänder
504dfff769 added General Stavros voice from Counterstrike 2013-07-11 20:53:48 +02:00
Matthias Mailänder
861be8f157 added ant larvae from Counterstrike 2013-07-11 20:53:48 +02:00
Matthias Mailänder
be38038782 added Ant Queen from Counterstrike 2013-07-11 20:52:55 +02:00
Matthias Mailänder
016292fca4 added the ant hill from Counterstrike 2013-07-11 20:52:10 +02:00
Matthias Mailänder
f638bf4156 added Giant Ant from Counterstrike 2013-07-11 20:52:10 +02:00
Matthias Mailänder
4d7f1462ef added an alarm sound from EXPAND2.MIX 2013-07-11 20:52:10 +02:00
Matthias Mailänder
0cf63d9899 added a Zombie unit 2013-07-11 20:52:10 +02:00
Matthias Mailänder
9a6e7f749b Merge pull request #3545 from pchote/infantry-range-fix
Infantry range fix
2013-07-11 11:45:15 -07:00
Matthias Mailänder
a35a046ede disable more StyleCop rules based on @pchote's wishlist 2013-07-11 20:29:00 +02:00
Matthias Mailänder
95d8c17d71 Merge pull request #3548 from pchote/regression-fixes
Regression fixes
2013-07-11 11:13:46 -07:00
Paul Chote
9746b53cb6 Merge pull request #3535 from chrisforbes/lobby-robustness
restrict packet size to 4K in server
2013-07-11 04:33:42 -07:00
Paul Chote
54bdaa1037 Merge pull request #3512 from Mailaender/community-assets
Added decorative pixelart contributed by the community
2013-07-11 04:09:50 -07:00
Paul Chote
a23998819e Merge pull request #3534 from Mailaender/editorconfig
Added EditorConfig Support
2013-07-11 03:01:09 -07:00
Paul Chote
571a1e6fd1 Merge pull request #3543 from chrisforbes/build-speed-rename-revert
rename BuildSpeedModifier back to BuildSpeed
2013-07-11 03:00:23 -07:00
Paul Chote
823a502873 Tidy RadarWidget. 2013-07-11 19:59:07 +12:00
Paul Chote
93ee46ba52 Default radar bin to enabled. Fixes observers and replays. 2013-07-11 19:59:07 +12:00
Paul Chote
6a37808dae Fix RadarWidget eating input outside its bounds. 2013-07-11 19:59:06 +12:00
Paul Chote
a783321c03 Fix BackgroundWidget eating input outside its bounds. 2013-07-11 19:59:06 +12:00
Paul Chote
045eb12388 Fix an integer overflow in Target.IsInRange. 2013-07-11 19:59:06 +12:00
Paul Chote
a49cc78c57 Tidy Sync. 2013-07-11 19:44:15 +12:00
Paul Chote
60f49b39d4 Fix #3546. 2013-07-11 18:45:12 +12:00
Paul Chote
11cebddaa9 Convert Sound.Play* to WPos. 2013-07-11 17:37:27 +12:00
Paul Chote
a263fd879d Account for sub-cell offsets in FindUnitPathToRange. Fixes #2417. 2013-07-10 21:23:30 +12:00
Paul Chote
b10a5d27a0 Tidy up Move. 2013-07-10 20:34:19 +12:00
Paul Chote
0326d2bbd0 Use WRange for Follow. 2013-07-10 20:03:53 +12:00
Paul Chote
ee188ededd Fix Follow formatting. 2013-07-10 20:01:04 +12:00
Paul Chote
91698678a2 Use WRange for Mobile.MoveWithinRange. 2013-07-10 19:59:03 +12:00
Paul Chote
ae987b3c10 Tidy AttackFrontal. 2013-07-10 19:24:49 +12:00
Paul Chote
935b829532 Tidy TargetableUnit and subclasses. 2013-07-10 19:22:11 +12:00
Paul Chote
bed2745c61 Tidy TargetableBuilding. 2013-07-10 19:09:49 +12:00
Paul Chote
9b9952dcdf Change ITargetable TargetableCells -> TargetablePositions. 2013-07-10 19:09:28 +12:00
Chris Forbes
401ffaff17 rename BuildSpeedModifier back to BuildSpeed 2013-07-10 16:34:43 +12:00
Matthias Mailänder
4cebe6b9dc split ammobox into 3 single SHPs because of editor limitations 2013-07-09 17:33:37 +02:00
Matthias Mailänder
93d1241a72 more descriptive and consistent name for utility poles 2013-07-09 17:33:37 +02:00
Matthias Mailänder
827352aa4e consistently name tank traps 2013-07-09 17:33:34 +02:00
Matthias Mailänder
2d1a4404bc added an Asian hut by @JOoGraphics
http://content.open-ra.org/?p=detail&table=units&id=351

Conflicts:
	mods/ra/rules/civilian.yaml
2013-07-09 17:32:47 +02:00
Matthias Mailänder
e0a7819c54 Added Russian city building by @JOoGraphics
http://content.open-ra.org/?p=detail&table=units&id=308
2013-07-09 17:32:46 +02:00
Matthias Mailänder
71a4ebe8b7 added a temperat rice field by @JOoGraphics
http://content.open-ra.org/?p=detail&table=units&id=307
2013-07-09 17:32:46 +02:00
Matthias Mailänder
6a7f8c9416 added a tank trap by @CombineCR
http://content.open-ra.org/?p=detail&table=units&id=322
2013-07-09 17:32:46 +02:00
Matthias Mailänder
f93aa9511b Added a new mine that seeds gems by @CombineCR
http://content.open-ra.org/?p=detail&table=units&id=323
2013-07-09 17:32:46 +02:00
Matthias Mailänder
3cff9cc392 Added ammo boxes by @CombineCR
http://content.open-ra.org/?p=detail&table=units&id=324
2013-07-09 17:32:46 +02:00
Matthias Mailänder
e7708e7b4a Added Utility Poles by @CombineCR
http://content.open-ra.org/?p=detail&table=units&id=330
2013-07-09 17:32:46 +02:00
Matthias Mailänder
8fedf1f0f4 added Czech hedgehog by @JOoGraphics
http://content.open-ra.org/?p=detail&table=units&id=339
2013-07-09 17:32:46 +02:00
Matthias Mailänder
7b3c322b13 Merge pull request #3538 from chrisforbes/fix-legacy-capture-timing
fix a timing bug in LegacyCaptureActor
2013-07-08 14:52:37 -07:00
Chris Forbes
10e0f367a8 fix a timing bug in LegacyCaptureActor 2013-07-09 08:15:03 +12:00
Matthias Mailänder
46eb82c5af Merge pull request #3537 from tben643/mammoth-change
Mammoth Tank build time reduction
2013-07-08 11:50:24 -07:00
Matthias Mailänder
bd4434d8db spaces → tabs for @NukemBro's latest missions 2013-07-08 19:44:15 +02:00
Matthias Mailänder
8bb5b5700b added StyleCop support
with some rules we disagree with disabled
2013-07-08 19:42:32 +02:00
Matthias Mailänder
a90b3a9cd3 Merge pull request #3525 from pchote/ra-widget-cleanup
Widget fixes
2013-07-08 10:39:25 -07:00
Matthias Mailänder
f0f64010ec Merge pull request #3531 from pchote/world-targets
Convert more things to world coordinates
2013-07-08 10:33:25 -07:00
Ben Thatcher
5b07a3147b reduced Mammoth Tank build time 44s->36s 2013-07-08 22:36:34 +09:30
Paul Chote
2cff2d8bbe Improve Leap behavior:
* Configurable jump speed.
* Configurable jump angle.
* Configurable attack sound (uses weapon report).
* Don't accidentally eat tanks.
2013-07-08 23:40:22 +12:00
Paul Chote
4fbed810dc Redo husk particle physics using LerpQuadratic. 2013-07-08 23:40:22 +12:00
Paul Chote
5976913c73 Add WPos/WVec.LerpQuadratic to simplify ballistic calculations. 2013-07-08 23:40:22 +12:00
Paul Chote
1e7f1ab225 Convert Explosion to world coords. 2013-07-08 23:40:22 +12:00
Paul Chote
01de84e9fc Ensure valid targets in Selectable. 2013-07-08 23:40:21 +12:00
Paul Chote
8fe0eb73e2 Ensure a valid target in move. 2013-07-08 23:40:21 +12:00
Paul Chote
87361df043 Centralize weapon validity check into WeaponInfo. 2013-07-08 23:40:21 +12:00
Paul Chote
4b1323ada5 Target cleanup. 2013-07-08 21:52:28 +12:00
Paul Chote
89fd889cf4 Convert Target positions to world coords. 2013-07-08 21:52:28 +12:00
Paul Chote
d0bed06765 Use WVec overload of Util.GetFacing where possible. 2013-07-08 21:52:27 +12:00
Paul Chote
7883b1bd7f Convert Combat.DoExplosion to world coords. 2013-07-08 21:52:27 +12:00
Paul Chote
0fdffd7b6a Convert Drag to world coords. 2013-07-08 21:52:27 +12:00
Paul Chote
7f25573cfa Convert Selectable to world coords. 2013-07-08 21:52:26 +12:00
Paul Chote
9eaeeffae9 CenterLocation.ToCPos() -> CenterPosition.ToCPos(). 2013-07-08 21:52:26 +12:00
Paul Chote
e741e83fd4 Convert IonCannon to world coords. 2013-07-08 21:52:26 +12:00
Paul Chote
2a0eff2ed0 Convert DrawLineToTarget to world coords. 2013-07-08 21:52:25 +12:00
Paul Chote
f9ec5fd9b7 Add WPos.ToCPos(). 2013-07-08 21:52:25 +12:00
Paul Chote
561cb6cfe0 Rewrite Leap activity to be more robust.
The dog will now always leap to the target
subcell (even if the target dies or moves),
and will kill whatever happens to be in the
target cell when it lands.
2013-07-08 21:52:25 +12:00
Paul Chote
82b7854ed7 Make MobileInfo.SubCellOffsets static. 2013-07-08 21:52:25 +12:00
Paul Chote
34df1ab705 Remove Combat.IsInRange(). Closes #3433. 2013-07-08 21:52:25 +12:00
Paul Chote
39e699d119 Convert BaseProvider range check to world coords. 2013-07-08 21:52:24 +12:00
Paul Chote
ec15aa5ee4 Restore radar enable/disable sounds. 2013-07-08 21:06:30 +12:00
Chris Forbes
edb08d6fec restrict packet size to 4K in server
- Sending a negative length no longer crashes the server
- Sending very large lengths can't force us to buffer stupid amounts of data

The offending client just gets kicked if they do this.
2013-07-08 14:58:07 +12:00
Matthias Mailänder
631baeafd2 added EditorConfig support
http://editorconfig.org
2013-07-07 11:16:59 +02:00
Paul Chote
d631f1b06b Use Target range checks in CarpetBomb. 2013-07-06 19:16:16 +12:00
Paul Chote
ec9054ceb1 Use Target range checks in AutoTarget and dependencies. 2013-07-06 19:16:16 +12:00
Paul Chote
4a471eff8b Use Target range checks in AttackLoyalty. 2013-07-06 19:12:26 +12:00
Paul Chote
07f9575bb7 Use Target range checks in AttackLeap. 2013-07-06 19:12:26 +12:00
Paul Chote
3a0f6dda08 Use Target range checks in Armament. 2013-07-06 19:12:26 +12:00
Paul Chote
6f67602d57 Use Target range checks in attack activities. 2013-07-06 19:12:26 +12:00
Paul Chote
399aac7e0f Extend Target with world-coordinate range checks. 2013-07-06 19:12:26 +12:00
Paul Chote
eec986d93d Add world coords overload of FindUnitsInCircle. 2013-07-06 19:12:25 +12:00
Paul Chote
e765fb6439 Make world-coordinates [Sync]able 2013-07-06 18:43:06 +12:00
Chris Forbes
f05bd319c5 Merge pull request #3520 from ScottNZ/hosp
Make captured hospitals in cnc/ra gradually heal all infantry units on the map
2013-07-05 17:39:40 -07:00
Chris Forbes
f81d086673 Merge pull request #3527 from pchote/spectator-color-fix
Spectator fixes
2013-07-05 17:30:53 -07:00
Paul Chote
18cecf8a67 Disable pausing for spectators. Fixes #3340. 2013-07-06 11:31:43 +12:00
Paul Chote
3a356782fc Force spectator color to white on join. Fixes #3501. 2013-07-06 11:11:48 +12:00
Matthias Mailänder
5626088042 Merge pull request #3497 from wuschel/bleed
added huge RA KotH map ATHENA
2013-07-05 10:44:25 -07:00
Matthias Mailänder
af2218b0ed Merge pull request #3500 from hasufell/Makefile
MAKE: refactor Makefile
2013-07-05 10:30:44 -07:00
hasufell
db1a0dd9c7 MAKE: quote all variables that can contain whitespace 2013-07-05 19:00:51 +02:00
hasufell
3e1a0e2458 MAKE: install more missing files
this should fix crash when clicking on "credits"
and the asset browser
2013-07-05 18:57:43 +02:00
Paul Chote
948eaa03c5 Fix lobby option checkbox widths. Fixes #3521. 2013-07-05 21:58:09 +12:00
Paul Chote
15b09d8938 Fix C&C lobby button order. 2013-07-05 21:54:36 +12:00
Paul Chote
f8313672ff Kill PowerBarWidget. Fixes #3446. 2013-07-05 21:50:34 +12:00
Chris Forbes
db9582f799 Merge pull request #3498 from Mailaender/explosion-offsets
Remove redundant explosion bits and fix lonestar mig contrails
2013-07-05 02:48:06 -07:00
Paul Chote
6fa4e54022 Remove the hardcoded mess of RadarBinWidget. 2013-07-04 23:19:25 +12:00
ScottNZ
4f099348b2 Make captured hospitals in cnc/ra gradually heal all infantry units on the map 2013-07-04 18:38:49 +12:00
hasufell
e18e09361d MAKE: simplify install rules
just copy all mod folders recursively, this also fixes
missing d2k/weapons and ra/sequences folders
2013-07-04 00:30:23 +02:00
wuschel
595603daf0 RA map ATHENA: added Allowbots false
see above // as mentioned in https://github.com/OpenRA/OpenRA/pull/3509
and
e0ffc205b1
2013-07-02 13:53:30 +02:00
wuschel
166e26db5b added huge RA KotH map ATHENA
The map has been tested with four players and was reasonably lag free.
Note that this is the newer fixed after the multiplayer playtests - the
one on the content openra is outdated.

While the map is working perfectly fine, it would be great if
https://github.com/OpenRA/OpenRA/issues/3496 could be implemented. That
way, the player would have multiple starting options.
2013-07-02 13:36:55 +02:00
Chris Forbes
71656b609a Merge pull request #3518 from ScottNZ/teslacoil
Tesla Coil improvements
2013-07-01 19:17:59 -07:00
ScottNZ
53f960ebd2 Reduce price of Tesla Coil from $1500 to $1200 2013-07-02 14:15:24 +12:00
ScottNZ
fd454d86fc Fix Tesla Coil zap and sequence timings 2013-07-02 14:15:08 +12:00
Paul Chote
4d3f7b366b Clean up RadarWidget code. Fixes #3508. 2013-07-01 21:11:05 +12:00
Paul Chote
4c0e61bca6 Merge pull request #3510 from Mailaender/d2k-stats
Fixed Dune 2000 combat stats and weapon sounds
2013-07-01 01:18:48 -07:00
Paul Chote
daf445366c Merge pull request #3509 from Mailaender/disallow-bots
Disallow bots on maps they don't understand
2013-07-01 01:03:08 -07:00
Paul Chote
7b5d20e81f Merge pull request #3494 from Mailaender/fix-packaging
Packaged files missing from playtest-20130629
2013-07-01 00:57:15 -07:00
Matthias Mailänder
5f3dc49e50 added some missing file endings to hidden d2k weapon sounds 2013-06-30 20:41:48 +02:00
Matthias Mailänder
526c6331ab Update Combat stats in Dune 2000
fixes #3506
2013-06-30 20:21:22 +02:00
Matthias Mailänder
c98338b639 disallow bots on Nishnekolymsk
2 separated land masses
2013-06-30 20:11:53 +02:00
Matthias Mailänder
cff1c1375f disallow AI on Hasselhoff
3 separated land masses
2013-06-30 20:09:28 +02:00
Matthias Mailänder
631726641b Disallow bot in dropzone minigames
they don't understand the concept of crate hunting
2013-06-30 20:07:20 +02:00
Matthias Mailänder
a515f0b7b0 Disallow bots in minigame Bomber John 2013-06-30 20:05:33 +02:00
Matthias Mailänder
507c9ceabf disallow bots on texas sea
bots don't understand oil derricks
and the path finder will go crazy
2013-06-30 20:02:48 +02:00
Matthias Mailänder
e0ffc205b1 Artemis map is far too huge for AI
FindTilesInCircle supports queries for only <= 50
fixes #3507
2013-06-30 20:01:20 +02:00
Matthias Mailänder
dfe3d7bfaa Disallow bots on Pluto
huge islands map
2013-06-30 19:59:39 +02:00
Matthias Mailänder
7c9b53c8d8 Disallow bots on Zeus
huge islands map
2013-06-30 19:57:50 +02:00
Matthias Mailänder
e00041c2bc Disallow bots on Poseidon
huge islands map
2013-06-30 19:57:35 +02:00
Matthias Mailänder
b3ba7cb8d0 Disallow bots on Apollo
huge island map
2013-06-30 19:51:17 +02:00
Matthias Mailänder
53312694d4 disallow bots on Doughnut Hole
they can't use the naval transport
and path to human players if they move from the island
2013-06-30 19:50:25 +02:00
Matthias Mailänder
fc49950fd4 Merge pull request #3504 from pchote/more-lobby-polish
Overhaul lobby layout
2013-06-30 10:42:17 -07:00
Paul Chote
c4190167ee Root the player bin in the lobby ui correctly. Fixes #3505. 2013-06-30 21:40:37 +12:00
Paul Chote
47406d8765 Overhaul lobby layout. 2013-06-30 20:34:25 +12:00
Matthias Mailänder
09dd36d31b fix contrail offsets for the migs in fort lonestar
was using the badr ones before
2013-06-30 09:33:45 +02:00
Paul Chote
a49bf40413 Replace add bots / assign with a combined slot options dropdown. 2013-06-30 14:29:49 +12:00
Paul Chote
0ad9e65577 Add group labels to the slots dropdown. 2013-06-30 12:29:52 +12:00
hasufell
0477a2eb05 MAKE: revert DATA_INSTALL_DIR value for backwardscompat
otherwise build scripts will have to adjust
2013-06-29 22:35:49 +02:00
hasufell
e0395fe903 MAKE: refactor Makefile
improved readability, moved tools at the top, rules at the bottom

make -> build core
make all -> build core and tools
install -> install core
install-all install core and tools
2013-06-29 22:25:38 +02:00
Matthias Mailänder
62b193254b adjust explosion positions with sequence offsets instead 2013-06-29 20:24:51 +02:00
Matthias Mailänder
cfd5a73b92 forgot to add AUTHORS and global mix database.dat to NSIS script 2013-06-29 15:45:17 +02:00
Matthias Mailänder
9d256d93a5 don't list every file in RPM spec %files
folders are enough
2013-06-29 15:24:03 +02:00
Matthias Mailänder
85c146caf2 don't break if FILES contain spaces 2013-06-29 15:20:40 +02:00
Matthias Mailänder
5e3f19ea52 fix typo in spec file 2013-06-29 14:56:41 +02:00
Matthias Mailänder
09ce64ee04 add the global mix database from XCC
required for the asset browser
2013-06-29 14:47:52 +02:00
Matthias Mailänder
b3cddbba41 added AUTHORS to packages
required for the new Credits button
2013-06-29 14:28:25 +02:00
Matthias Mailänder
046d6be402 Merge pull request #3490 from pchote/changelog
Updated changelog for playtest-201306XX.
2013-06-29 04:53:23 -07:00
Paul Chote
cb6b4c3b93 Updated changelog with key changes from release-20130514...04ae39. 2013-06-29 23:49:06 +12:00
Paul Chote
04ae39caa5 Merge pull request #3467 from Mailaender/autotarget-bots
AutoTarget unarmed buildings again to help AI crush it's enemy
2013-06-29 04:16:34 -07:00
Matthias Mailänder
63a1377aca Merge pull request #3489 from ScottNZ/balance
More RA balance work
2013-06-29 03:12:36 -07:00
Matthias Mailänder
450fbded3f Merge pull request #3487 from pchote/server-client-fix
Prevent handshake spoofing of Client data.
2013-06-29 01:26:37 -07:00
Matthias Mailänder
e805dff16f Merge pull request #3486 from pchote/misc-ui-polish
Misc UI polish.
2013-06-29 01:22:12 -07:00
ScottNZ
8f087878be Merge pull request #3488 from cjshmyr/maps
RA map - doughnut - made trees for bottom teams more even towards middil...
2013-06-29 00:02:04 -07:00
ScottNZ
716b470911 Increase repair of mechanic from 13 to 20. Increase light armour multiplier percentage from 40% to 100%. 2013-06-29 15:41:29 +12:00
Paul Chote
05030e6b98 Polish d2k/ra map chooser. 2013-06-29 15:14:04 +12:00
Paul Chote
e6eac5a6c0 Remove duplication between ra and d2k lobby yaml. 2013-06-29 13:29:39 +12:00
Paul Chote
ec7bbd6c18 Add Ui.LoadWidget<T> overload. 2013-06-29 13:29:39 +12:00
Paul Chote
528198977a Move color picker remap indices into a chrome metric. 2013-06-29 13:29:39 +12:00
Paul Chote
fd660c7fa0 Make ChromeMetrics accessible from mod dlls. 2013-06-29 12:58:48 +12:00
Paul Chote
fe6c6a3017 Add Developer Menu toggle. Fixes #3296. 2013-06-29 12:53:09 +12:00
Paul Chote
f4d37857aa Remove now-obsolete desync cheat. 2013-06-29 12:53:09 +12:00
Paul Chote
3e2f7b41d8 Use a trylock to simplify ColorMixerWidget. Fixes #3374. 2013-06-29 12:53:09 +12:00
Paul Chote
d7a580584d Remove renderer type setting.
Multiple people have needed support after breaking
their game by switching to an unsupported renderer.
2013-06-29 12:53:09 +12:00
Paul Chote
f7f8740745 Simplify some setting descriptions. 2013-06-29 12:53:09 +12:00
Paul Chote
7eb579cb6c Remove settings UI for IgnoreVersionMismatch. 2013-06-29 12:53:08 +12:00
Paul Chote
8307014de9 Improve kick button label for C&C. 2013-06-29 12:53:08 +12:00
Paul Chote
daf94e61e0 Add some noise to the C&C dialog textures. 2013-06-29 12:53:08 +12:00
ScottNZ
07689efc6e MRJ missile deflection range increased from 3 to 4. 2013-06-29 12:49:42 +12:00
ScottNZ
14a952169b Iron Curtain duration increased from 15 to 20. Chronosphere duration decreased from 30 to 20. 2013-06-29 12:49:42 +12:00
ScottNZ
646f7c1362 RA Sniper HP reduced from 200 to 80. 2013-06-29 12:49:41 +12:00
Paul Chote
faa745e566 Merge pull request #3456 from ScottNZ/lobby
Add temp banning to servers
2013-06-28 16:33:23 -07:00
Curtis Shmyr
3485a5e855 RA map - doughnut - made trees for bottom teams more even towards middile. Added missing fences top. 2013-06-28 17:16:06 -06:00
Paul Chote
79779d69ba Prevent handshake spoofing of Client data. 2013-06-29 11:12:41 +12:00
ScottNZ
a6e5a0b53f Add temp banning to servers 2013-06-29 10:58:37 +12:00
Matthias Mailänder
6cd69f5c05 Merge pull request #3479 from pchote/conyard-fix
Fix zombie MCV bug.
2013-06-27 14:14:38 -07:00
Matthias Mailänder
251c316120 Merge pull request #3480 from pchote/server-fix
Handle failure cases of Socket.Send.
2013-06-27 13:47:43 -07:00
Paul Chote
8856a1444c Handle failure cases of Socket.Send. Fixes #3455. 2013-06-27 18:43:10 +12:00
Paul Chote
791cdeba4d Cancel make animation if the building dies. Fixes #3464. 2013-06-27 18:07:51 +12:00
Curtis Shmyr
39e97ee767 Merge pull request #3477 from ScottNZ/bleed
Reduce RA oil derrick capture bonus from $500 to $100
2013-06-26 21:51:57 -07:00
ScottNZ
7e7d48444b Reduce RA oil derrick capture bonus from $500 to $100 2013-06-27 16:31:44 +12:00
Matthias Mailänder
bd7e8da81d Merge pull request #3475 from pchote/startgame-fix
Startgame fix and observer tweaks.
2013-06-26 11:21:39 -07:00
Paul Chote
1fce900801 Set spectator color to white & remove selector. 2013-06-26 22:32:27 +12:00
Paul Chote
859af00f1c Remove unused spectator ready checkboxes. 2013-06-26 22:21:13 +12:00
Paul Chote
6e4cf37e44 Fixes #3336. 2013-06-26 21:42:56 +12:00
Chris Forbes
1cd3adef5e Merge pull request #3472 from pchote/renderer-regressions
Fix renderer regressions
2013-06-26 02:00:35 -07:00
Paul Chote
557492cc72 Merge pull request #3474 from chrisforbes/movement-equiv-classes
movement equivalence classes
2013-06-26 01:56:25 -07:00
Chris Forbes
c0e0efd0ef movement equivalence classes
These can be used as a basis for a bunch of pathing optimizations.

- Feasability of movement can be precomputed for each class, avoiding
  the worst-case pathfinding behavior

- A path could potentially be shared between all members of a class.
  This isnt necessarily the best path for any single unit, as it
  doesn't care about efficiency of movement across various terrain --
  but it would be a "reasonable" path that the whole group could take
  together.

- General pathing checks can be converted from intersection of sets of
  strings to a simple AND.

- Other, wilder things.

V2: be paranoid about too-long bit vectors.
2013-06-26 20:50:51 +12:00
Paul Chote
185e9b3f08 Fix and rewrite contrails. Closes #3457. 2013-06-25 19:38:48 +12:00
Paul Chote
c886253738 Fix white lines at the bottom of units. 2013-06-25 18:40:11 +12:00
Paul Chote
f52a1c1521 Round CashTick pos to the nearest int. 2013-06-24 19:31:15 +12:00
Chris Forbes
fc6a38182d Merge pull request #3461 from Mailaender/default-buffer-size
More Debug Logging for the Server/Client connection
2013-06-23 14:37:05 -07:00
Chris Forbes
5dca3742f1 Merge pull request #3470 from ScottNZ/production
Favour newer buildings over older buildings when a unit can appear from ...
2013-06-23 14:33:33 -07:00
ScottNZ
9f1d9e153a Favour newer buildings over older buildings when a unit can appear from multiple buildings after being built 2013-06-24 09:16:35 +12:00
Chris Forbes
836a0ffe4b Merge pull request #3465 from Mailaender/legacy-capture-fixes
Various fixes towards LegacyCapture
2013-06-23 13:48:19 -07:00
ScottNZ
c7ccdfde2d Merge pull request #3469 from Mailaender/unarm-observers
Removed SupportPowerBin from Observer Widget
2013-06-23 04:56:12 -07:00
Matthias Mailänder
d18289d5bc remove SupportPowerBin from observer widget
fixes #3444
2013-06-23 13:45:33 +02:00
Matthias Mailänder
fcf987a4dd also revert AutoTargetIgnore: for all buildings in d2k 2013-06-23 13:15:52 +02:00
Matthias Mailänder
52069c6788 also revert AutoTargetIgnore: for all buildings in cnc 2013-06-23 13:15:47 +02:00
Matthias Mailänder
c20df5874d Revert "don't auto-target unarmed buildings in ra mod"
This reverts commit c74fa90305
2013-06-23 13:10:03 +02:00
Matthias Mailänder
e6bdacce9c various fixes towards LegacyCapture
- sniper using Captures, but churches using LegacyCapturable
- unable to parse CaptureThreshold/SabotageHPRemoval from yaml
- not firing up INotifyCapture and breaking:
  * sniper transforming the church on capture in ra
  * proc not giving away it's contents in cnc
2013-06-23 12:43:24 +02:00
Matthias Mailänder
2b84dbfccf Merge pull request #3463 from pchote/harv-force-move
Allow force-move to disable the harvest activity.
2013-06-23 02:26:25 -07:00
Paul Chote
efc494b859 Allow force-move to disable the harvest activity. Fixes #3459. 2013-06-23 14:22:37 +12:00
Matthias Mailänder
6a50c760ae record socket buffer sizes to server.log
for investigating #3455
2013-06-22 15:49:52 +02:00
Matthias Mailänder
c18b5e424e at least write the acception we swallow here to the server.log 2013-06-22 15:46:26 +02:00
Matthias Mailänder
8ddc840370 fix some plenks
no logic changes
2013-06-22 15:17:10 +02:00
Matthias Mailänder
dab3d99890 write another socket error catch into server.log 2013-06-22 15:16:32 +02:00
Matthias Mailänder
b93e9a5945 Merge pull request #3458 from pchote/harvester-animations
Fix the harvest animations for TS and D2k.
2013-06-22 01:21:34 -07:00
Matthias Mailänder
c9e46ee0f6 Merge pull request #3454 from pchote/cargo-antivis
Fix shroud glitches once and for all
2013-06-22 01:01:29 -07:00
Paul Chote
c94e80d682 Fix D2k harvester dock animation. 2013-06-22 19:31:18 +12:00
Paul Chote
2e2e95ef57 Add D2k harvest animation.
harvest2.shp is movingsand2.shp with a corrected frame order.
2013-06-22 19:25:10 +12:00
Paul Chote
0029cb8aec Allow Harvester to define the number of harvestable facings. 2013-06-22 19:25:10 +12:00
Paul Chote
0424b56af1 Add WithHarvestAnimation for TS and D2K harvester animations. 2013-06-22 19:25:10 +12:00
Paul Chote
80c3cf479d Remove harvester dependency on RenderUnit. 2013-06-22 16:58:40 +12:00
Paul Chote
6d24eb14d7 Merge pull request #3371 from aperkins81/bleed
Add Bots button in Lobby
2013-06-21 18:52:17 -07:00
Paul Chote
76efea72d9 Merge pull request #3441 from Mailaender/display-server-error
Display ServerError in CONNECTIONFAILED_PANEL
2013-06-21 18:45:24 -07:00
Paul Chote
37bc3766a5 Merge pull request #3420 from Mailaender/sound-info
Display the current sound engine in the console
2013-06-21 18:42:06 -07:00
Paul Chote
9adfb56f65 Only update vis for actors in the world. Fixes #2726. 2013-06-22 13:15:38 +12:00
Paul Chote
b95cd0c91f Add an extra sanity check. 2013-06-22 13:15:38 +12:00
Paul Chote
7bce2017c3 Simplify and increase robustness of Shroud et al. Fixes #3440. 2013-06-22 13:15:27 +12:00
Andy Perkins
23d9d611c1 Lobby, Add Bots button 2013-06-22 07:56:06 +10:00
Matthias Mailänder
13fbcc56ee inform the user which sound engine is used 2013-06-21 18:13:13 +02:00
Matthias Mailänder
e9b2bcc579 fix some plenks
no logic changes
2013-06-21 18:05:30 +02:00
Matthias Mailänder
65088ea2d5 display the last ServerError in the connection failed dialog
closes #2727
2013-06-21 18:04:40 +02:00
Paul Chote
897cb13626 Merge pull request #3452 from Mailaender/center-range
Don't discriminate bottom right directions when checking whether a unit is in range.
2013-06-21 05:39:47 -07:00
Paul Chote
574ab7281b Merge pull request #3429 from Mailaender/dont-crash-on-drop
Don't crash when the player to drop can't be found.
2013-06-21 02:05:10 -07:00
Paul Chote
a13ce8cd40 Merge pull request #3439 from Mailaender/kill-cargo
Kill Cargo properly
2013-06-21 00:43:07 -07:00
Matthias Mailänder
ed8f6d9691 Attack the center of the cell instead of the top left corner
to not discriminate bottom right directions. Fixes #2205
2013-06-20 20:37:04 +02:00
Matthias Mailänder
29c93182f1 remove some plenks
no logic changes
2013-06-20 20:12:55 +02:00
Matthias Mailänder
c5a8af9885 Merge pull request #3450 from pchote/offset-sprites
Allow sequences to define sprite offsets
2013-06-20 09:46:39 -07:00
Paul Chote
c40fd80ae1 Remove obsolete SpriteRenderable ctor. 2013-06-20 22:35:01 +12:00
Paul Chote
90d7f230ed Move RallyPoint offset into sequences. 2013-06-20 22:35:01 +12:00
Paul Chote
88fd5ba094 Move SatelliteLaunch offsets into sequences. 2013-06-20 22:28:57 +12:00
Paul Chote
3095c6ea5f Move WithFire, Burns offsets into sequences. 2013-06-20 22:01:59 +12:00
Paul Chote
fc33c56d61 Use NormalizeSequence in RenderBuildingWall. 2013-06-20 21:53:31 +12:00
Paul Chote
5084b30f3f Simplify RenderGunboat. 2013-06-20 21:53:31 +12:00
Paul Chote
5ee9b5cab4 Support additional render damage states for buildings. 2013-06-20 21:53:31 +12:00
Paul Chote
1a3a4bd7ba Remove unnecessary parameter from RenderSprites ctor. 2013-06-20 21:39:12 +12:00
Paul Chote
ac0094176a Reduce C&C silo pip count to a reasonable number. 2013-06-20 18:39:27 +12:00
Paul Chote
5734131310 Remove unnecessary fields from RenderBuilding*. 2013-06-20 18:29:20 +12:00
Paul Chote
e99d0a0b43 RenderBuildingRefinery -> WithResources. 2013-06-20 18:28:33 +12:00
Paul Chote
f376eb9b2a Move proc light offset into sequences. Fixes #3391. 2013-06-20 17:59:27 +12:00
Paul Chote
98039abf1b Allow sequences to define a pixel offset. Fixes #3287. 2013-06-20 17:58:32 +12:00
Paul Chote
9a6b5e21dc Account for sprite offsets in RenderDebugGeometry. 2013-06-20 17:57:23 +12:00
Chris Forbes
979ac4f91f Merge pull request #3407 from pchote/voxel-fbo
Voxel refactoring
2013-06-19 14:57:17 -07:00
Matthias Mailänder
425aa46476 kill the cargo instead of just destroying it
fixes #2983 and the player statistics
2013-06-19 19:09:40 +02:00
Chris Forbes
5a0bd24a4e Merge pull request #3411 from Mailaender/save-the-gnomes
Made ore mines indestructible
2013-06-18 19:57:24 -07:00
Chris Forbes
d60b33b159 Merge pull request #3442 from pchote/credits-menu
Ingame credits menu
2013-06-18 19:19:51 -07:00
Paul Chote
74ddb432aa Update AUTHORS for display in the credits panel. 2013-06-19 13:29:41 +12:00
Paul Chote
a0e224ec71 Add a Credits menu. Fixes #2864. 2013-06-19 13:21:29 +12:00
Matthias Mailänder
b7f1711497 remove some plenks
no logic changes
2013-06-18 20:11:27 +02:00
Paul Chote
66383a57d1 Merge pull request #3435 from chrisforbes/revert-sniper-hotkey
fix sniper hotkey conflict AGAIN
2013-06-17 22:16:43 -07:00
Chris Forbes
d7bafdf0c8 Merge pull request #3428 from ScottNZ/maps
Remove some maps
2013-06-17 22:12:43 -07:00
Chris Forbes
698efb4995 fix sniper hotkey conflict AGAIN
You can't use `s`, it's a combat hotkey.
2013-06-18 11:32:22 +12:00
Matthias Mailänder
321ed4ea3d Merge pull request #3432 from chrisforbes/remove-BuiltAt
closes #2323
2013-06-17 14:08:16 -07:00
Chris Forbes
6c1d4efb07 remove useless Buildable.BuiltAt
V2: don't leave the broken [ActorReference] attached to Owner.
2013-06-18 09:02:12 +12:00
Matthias Mailänder
708e91145c log exception thrown when the handshake fails 2013-06-17 22:50:47 +02:00
Matthias Mailänder
6b261534d8 remove some plenks
no logic changes
2013-06-17 22:50:39 +02:00
Chris Forbes
627a892097 Merge pull request #3430 from Mailaender/csc-target-x86
corflags OpenRA.Utility.exe /32BITREQ+
2013-06-17 13:37:45 -07:00
Chris Forbes
c862ba6e03 Merge pull request #3431 from Mailaender/chronoshift-shellmap
Let the cruisers jump in again on the temperat shellmap
2013-06-17 13:36:44 -07:00
Matthias Mailänder
7e39b2546b corflags OpenRA.Utility.exe /32BITREQ+
fixes #2812
2013-06-17 22:04:16 +02:00
Matthias Mailänder
659600db23 let the cruiser jump in earlier and nearer to friendly harbor
fixes #3126
2013-06-17 21:50:05 +02:00
Matthias Mailänder
875ac468d3 log the catched exception when a client is dropped
because order dispatching failed for debugging
2013-06-17 20:46:02 +02:00
Matthias Mailänder
b01d55f1f6 Don't crash when the player to drop can't be found.
fixes #3224
2013-06-17 19:42:56 +02:00
Matthias Mailänder
734f12bbc6 Merge pull request #3426 from chrisforbes/ra_perf_removal
ra_perf removal
2013-06-17 09:34:02 -07:00
ScottNZ
6f3cd5dff2 Remove hotzone, mjolnir-2, seaside 2013-06-17 20:55:42 +12:00
Chris Forbes
787fde31ed Merge pull request #3405 from Mailaender/fort-bugstar
Fixed the worsed problems in Fort Lonestar
2013-06-16 21:37:07 -07:00
Chris Forbes
c273a02b94 remove ra_perf mod 2013-06-17 13:23:32 +12:00
Chris Forbes
6735fd593b Merge pull request #3425 from wuschel/bleed
Added wuschel to contributors
2013-06-16 17:18:53 -07:00
wuschel
154cdc8709 Added wuschel to contributors
Added wuschel to contributors.
2013-06-17 01:41:56 +02:00
Chris Forbes
cec62bd356 Merge pull request #3424 from wuschel/bleed
Updating 7 large scale wuschel maps
2013-06-16 15:53:49 -07:00
wuschel
b34a31b5be Updating 7 wuschel maps
updated: RA map POSEIDON - facelift, small tactical changes on middle
island.
updated: RA map PLUTO - corrected oil derrick that was not capturable.
updated: RA map ARTEMIS - some cosmetic changes on main island.
updated: RA map ARES - minor yaml changes to MISS.
updated: RA map APOLLO - minor yaml changes to MISS.
updated: RA map DIONYSUS - cosmetic changes on main island, minor yaml
changes to MISS.
added: RA map ZEUS, 256x320 (lo and behold, the father of all mapz!)

Note: ZEUS, ARTEMIS and APOLLO need
https://github.com/OpenRA/OpenRA/pull/3375 to be implemented in order to
avoid lags. The first map is lagging badly.
2013-06-16 23:48:50 +02:00
Chris Forbes
5d733b8e45 Merge pull request #3414 from Mailaender/sound.rs
Added native support for Dune 2000 SOUND.RS packages
2013-06-16 14:00:41 -07:00
Chris Forbes
2deef04095 Merge pull request #3418 from Mailaender/no-husk-reservation
Don't reserve airfields/helipads for husks that just fall down
2013-06-16 13:56:19 -07:00
Chris Forbes
e03734f2b4 Merge pull request #3423 from Mailaender/imperial-basin
Added Imperial Basin
2013-06-16 13:53:53 -07:00
Matthias Mailänder
ce01eca4d7 clean up d2k map folder
- removed Forgotten Path as it lacks quality
- replaced small originals with larger/modded versions
2013-06-16 22:39:42 +02:00
Matthias Mailänder
ae8c556187 added Imperial Basin
http://content.open-ra.org/index.php?p=detail&table=maps&id=1028
2013-06-16 22:34:03 +02:00
Matthias Mailänder
11755798cc Don't reserve airfields/helipads for husks that just fall down
fixes #3376
2013-06-16 12:43:41 +02:00
Paul Chote
e229194b62 Change extension check to EXT_fbo. 2013-06-16 19:50:52 +12:00
Paul Chote
82059dca6d Add BeamRenderable for lasers. 2013-06-16 19:37:54 +12:00
Paul Chote
1eb04a70a5 Add TextRenderable for CashTick. Make ticks consistent. 2013-06-16 19:10:38 +12:00
Matthias Mailänder
886099a948 Merge pull request #3415 from pchote/remove-dead-external-connect
Remove Bitrotted JoinExternalGame.
2013-06-15 10:44:30 -07:00
Paul Chote
71616201ff Ignore unknown wav chunks instead of throwing. 2013-06-15 19:41:07 +02:00
Paul Chote
2eeabfe668 Fixup: Use ReadASCIIZ in D2kSoundResources. 2013-06-15 19:41:07 +02:00
Paul Chote
0c4df26ed0 Add Stream.ReadASCIIZ for d2k. 2013-06-15 19:41:07 +02:00
Matthias Mailänder
cdeea80037 replaced Dune 2000 AUD with original WAV
removed *.aud hard-coding everywhere
2013-06-15 19:41:07 +02:00
Matthias Mailänder
9fb98f04d4 implement the fact chunk for WAVE files 2013-06-15 19:41:07 +02:00
Matthias Mailänder
85da51ca09 added a Dune 2000 SOUND.RS parser
again @pchote via IRC
2013-06-15 19:41:07 +02:00
Matthias Mailänder
d98a766362 Merge pull request #3403 from wuschel/bleed
added new RA multiplayer (desert) map: Pluto
2013-06-15 10:40:02 -07:00
Paul Chote
659e56f0fa Remove Bitrotted JoinExternalGame. Fixes #3406. Closes #2153. 2013-06-16 04:19:06 +12:00
Matthias Mailänder
924aba49ea Merge pull request #3413 from pchote/install-modchooser
Add "Change Mod" buttons to RA and D2K. Fixes #3401.
2013-06-15 02:34:54 -07:00
Paul Chote
0e21107694 Add "Change Mod" buttons to RA and D2K. Fixes #3401. 2013-06-15 21:24:49 +12:00
Matthias Mailänder
f918d1d0b2 removed spurious tabs 2013-06-15 11:02:46 +02:00
Matthias Mailänder
52de4e1796 made ore mines indestructible
don't inherit tree to avoid future regressions
2013-06-15 10:50:25 +02:00
Paul Chote
52335a37bf Allow/require renderers to enable alpha blending when needed. Fixes voxel shadow issues. 2013-06-15 19:31:52 +12:00
Paul Chote
4c22193446 Remove obsolete Stencil Buffer functions. 2013-06-15 19:31:52 +12:00
Paul Chote
c5337cdcf3 Reimplement voxel rendering with a FBO. 2013-06-15 19:31:52 +12:00
Paul Chote
2215f74959 Support rendering sprites into non-rectangular quads. 2013-06-15 19:16:09 +12:00
Paul Chote
7a71f87d9f Introduce Renderable.BeforeRender().
WorldRenderer.Draw() has been slightly reorganized
to ensure that BeforeRender is called before any
drawing render state (e.g. scissor) has been set.
2013-06-15 19:16:08 +12:00
Paul Chote
18311be3ae Remove nearest-int position rounding from SpriteRenderer.
The things that want to be rounded already do this
much earlier (wr.ScreenPxPosition, etc).
2013-06-15 19:16:08 +12:00
Paul Chote
7d09e78655 Add WorldRgbaSpriteRenderer. 2013-06-15 19:16:08 +12:00
Paul Chote
7beef85a64 Use PaletteReferences everywhere. 2013-06-15 19:16:08 +12:00
Paul Chote
e5bcb88b0e Support sprites with an internal offset. 2013-06-15 19:16:08 +12:00
Paul Chote
9b576d3fdd Add a visualization layer for renderable geometry. 2013-06-15 19:16:08 +12:00
Paul Chote
4152f61999 Move MakeFloatMatrix to Graphics.Util. 2013-06-15 19:16:08 +12:00
Paul Chote
5f0ab1f62d Add functions for calculating voxel bounding boxes. 2013-06-15 19:16:08 +12:00
Paul Chote
37770a4e47 Extract voxel transform matrix into a function. 2013-06-15 19:16:08 +12:00
Paul Chote
013ad0617e Allow sheets to wrap an ITexture directly. 2013-06-15 19:16:07 +12:00
Paul Chote
22e6966c8e Texture changes:
* The GL texture id is now readonly.
* Added Size property.
* Added GetData() for reading data back from the GPU.
* Added SetEmpty() for creating an empty texture of a given size.
2013-06-15 19:16:07 +12:00
Paul Chote
4c8c010506 Expose FBOs to engine code. 2013-06-15 19:16:07 +12:00
Paul Chote
0e1c12131a Generalize SheetBuilder overflow behavior. 2013-06-15 19:16:07 +12:00
Paul Chote
cd268c11ee Move IsPowerOf2 to Exts. 2013-06-15 19:16:07 +12:00
Paul Chote
da8202a15e Clean up LineRenderer whitespace (no code changes). 2013-06-15 19:09:20 +12:00
Paul Chote
ef95faa9b9 Fix LaserZap LineRenderer flushing. 2013-06-15 19:09:20 +12:00
Matthias Mailänder
b2201a0463 fixed conflicting sniper hotkey and too much damage vs walls
closes #3381
2013-06-15 08:35:29 +02:00
Matthias Mailänder
ebe0b0323e make the snipers fire at targets in Fort Lonestar 2013-06-15 08:35:29 +02:00
Matthias Mailänder
2b8319090e fixed Mig bombers crashing to earth when entering Fort Lonestar 2013-06-15 08:35:29 +02:00
Matthias Mailänder
bad3bd5fbb added the parabox animation when parabomb cates are collected 2013-06-15 08:35:21 +02:00
ScottNZ
06b797fd14 Rename FortScript.cs to match the name of the map it's for 2013-06-14 20:40:40 +12:00
ScottNZ
5d37438561 Unbreak Fort Lonestar 2013-06-14 20:33:33 +12:00
ScottNZ
1593c94d90 Add some debugging information to LoadYamlRules 2013-06-14 20:33:26 +12:00
ScottNZ
c2e450986f Add license notice to FortScript.cs 2013-06-14 20:20:55 +12:00
ScottNZ
6b44d232e7 Add Nukem's maps to the csproj 2013-06-14 20:20:33 +12:00
Matthias Mailänder
01a625691a Merge pull request #3389 from ScottNZ/infil
Infiltration code cleanup
2013-06-14 00:08:24 -07:00
ScottNZ
5334589922 Infiltration code cleanup 2013-06-14 18:58:39 +12:00
Chris Forbes
17a3c0773b Merge pull request #3404 from cjshmyr/prodqueue
Fix BuildTimeSpeedReduction being one step (building) too early with bui...
2013-06-13 17:37:57 -07:00
Curtis Shmyr
06375fe1a3 Fix BuildTimeSpeedReduction being one step (building) too early with build speed reduction 2013-06-13 18:31:30 -06:00
wuschel
e3bde3ccfe added new RA multiplayer (desert) map: Pluto
Added Pluto,  a new RA multiplayer map that focuses on Naval engagements
and oil derrick control.
2013-06-13 19:21:14 +02:00
Chris Forbes
6a5f1b0f63 Merge pull request #3400 from Mailaender/xbuild-warning
Fixed CS1701 xbuild/md-tool warning
2013-06-12 21:29:55 -07:00
Matthias Mailänder
10e5558812 fix an xbuild/md-tool warning
Assuming assembly reference.
You may need to supply runtime policy (CS1701)
2013-06-13 06:18:01 +02:00
Chris Forbes
2301c11309 Merge pull request #3383 from Mailaender/wave
Added support for WAVE sound files
2013-06-12 17:01:20 -07:00
Curtis Shmyr
db0829e6a0 Merge pull request #3397 from chrisforbes/target-generations
Target generations
2013-06-12 17:01:08 -07:00
Chris Forbes
c5f491dfc4 Merge pull request #3385 from cjshmyr/prodqueue
Production queue - change BuildTimeSpeedUpDivisor
2013-06-12 17:00:20 -07:00
Curtis Shmyr
3513e6538a Build Acceleration - Change BuildTimeSpeedReduction to be more configurable 2013-06-12 17:45:43 -06:00
Chris Forbes
6ca4f0797a Merge pull request #3399 from wuschel/bleed
Renamed Ares: National Park to Dionysus
2013-06-12 16:11:42 -07:00
wuschel
18a64cb0e5 Renamed Ares: National Park to Dionysus
Renamed map upon chrisf's request.
2013-06-13 00:10:15 +02:00
Curtis Shmyr
ec9345b051 Merge pull request #3398 from chrisforbes/panic-heal
Fix #3393: Prevent ScaredyCat from reacting to healing
2013-06-12 15:06:27 -07:00
Chris Forbes
0a8e47c357 Fix #3393: Prevent ScaredyCat from reacting to healing 2013-06-13 10:03:08 +12:00
Chris Forbes
59d10cfc5d Invalidate targets when chronoshifted
This replaces OpenRA/OpenRA#2807, without the massive cost.
2013-06-13 09:47:42 +12:00
Chris Forbes
ae809ce39f Use actor/target generations to invalidate targets on ownership change 2013-06-13 09:44:50 +12:00
Chris Forbes
5bc47f4834 Add generation counting to Actor and Target
This allows us to invalidate targets based on arbitrary conditions,
just by bumping the actor's generation number.

The next patches will use this.
2013-06-13 09:44:13 +12:00
Chris Forbes
a9b6a94ade Merge pull request #3396 from wuschel/bleed
wuschel's OpenRA map update
2013-06-12 14:30:24 -07:00
Chris Forbes
1258a6186c Merge pull request #3379 from NukemBro/bleed
Mission Changes
2013-06-12 14:30:11 -07:00
Chris Forbes
b91c8f0b6a Merge pull request #3384 from cjshmyr/engi2
Capture changes - Engis now capture from outside. Added classic (legacy)...
2013-06-12 14:29:42 -07:00
wuschel
1b4521fd51 Added new OpenRA map: Artemis
Added new large OpenRA map based on western part of Zeus map. NOTE: The
file on the content.openra website is out of date.
2013-06-12 22:38:28 +02:00
Paul Chote
f871998a35 Merge pull request #3380 from Mailaender/setup.z
Added an InstallShield extraction frontend for Dune 2000
2013-06-12 11:18:22 -07:00
Matthias Mailänder
0554ef35b7 added support for WAVE sound files
closes #2174
2013-06-12 20:18:07 +02:00
Paul Chote
1ea322ff9b Merge pull request #3294 from Mailaender/single-player-orderlag
Set the OrderLatency to 1 in single player games
2013-06-12 11:02:53 -07:00
wuschel
5ea2598ea9 Updated my maps: Apollo, Ares, Ares National Park, Poseidon
Removed the oil derrick and mine layer modd in the yaml files, since
they are no longer necessary.
2013-06-12 19:56:49 +02:00
Curtis Shmyr
6a1b37b5b7 Capture changes - Engis now capture from outside. Added classic (legacy) capturable traits. 2013-06-11 20:44:06 -06:00
Matthias Mailänder
801f293948 also extract GAMESFX from Dune 2000 setup.z 2013-06-09 17:31:14 +02:00
Matthias Mailänder
c9466f995b extracting d2k setup.z works now, adapting the UI 2013-06-09 16:54:13 +02:00
Chris Forbes
d898899de7 Revert "sound and explosion changes"
This reverts commit 7e3f90ee1d.
2013-06-09 13:17:15 +12:00
Grant H.
54439f8af8 Mission changes
Mission changes
2013-06-08 18:46:32 -05:00
Grant H.
eb159afb64 Fixed Survival02
Few Changes
2013-06-08 18:39:59 -05:00
Chris Forbes
e7fcb758e3 Merge pull request #3361 from pchote/voxels
TS/RA2 Voxel support
2013-06-06 17:25:39 -07:00
Matthias Mailänder
22a8af34ea Merge pull request #3373 from ScottNZ/husk
Rework aircraft destruction to use husks instead of the original actor. Fixes #3324 and closes #3216.
2013-06-06 10:20:17 -07:00
ScottNZ
5184cee3ca Rework aircraft destruction to use husks instead of the original actor 2013-06-07 05:04:47 +12:00
Matthias Mailänder
fd3f48b359 Merge pull request #3372 from ScottNZ/missions
Mission objectives refactoring
2013-06-05 09:37:44 -07:00
ScottNZ
d040153017 Sort/remove usings 2013-06-06 03:10:21 +12:00
ScottNZ
77f66fa8b8 Add dynamic heights for things in the objectives panel. 2013-06-06 03:09:02 +12:00
ScottNZ
20058b137e Adjust CountdownTimerWidget's red-white time threshold to 60s 2013-06-06 02:16:45 +12:00
ScottNZ
11d8b4e747 Change some Destroyed checks to IsDead checks 2013-06-06 02:08:29 +12:00
ScottNZ
82128be9e2 Refactor Survival 01 objectives code 2013-06-06 02:07:07 +12:00
ScottNZ
51fcb8d679 Refactor Soviet 01 Classic objectives code 2013-06-06 02:04:24 +12:00
ScottNZ
0acfb77be9 Refactor Monster Tank Madness objectives code 2013-06-06 01:59:32 +12:00
ScottNZ
e4cd7220cc Refactor Allies 04 objectives code 2013-06-06 01:54:40 +12:00
ScottNZ
cdb74fd547 Refactor Allies 03 objectives code 2013-06-06 01:51:15 +12:00
ScottNZ
aecc3624ba Refactor Allies 02 objectives code 2013-06-06 01:47:38 +12:00
ScottNZ
fdfd2eacea Refactor Allies 01 objectives code 2013-06-06 01:40:42 +12:00
Chris Forbes
9383e0572d Merge pull request #3370 from pchote/server-admin-fix
Simplify admin promotion check in ValidateClient.
2013-06-05 03:40:27 -07:00
Paul Chote
18f1683968 Simplify admin promotion check in ValidateClient.
This also fixes a crash if we want to allow
multiple admins in a server.
2013-06-05 22:35:30 +12:00
Grant H.
980c44bf62 Added Sahara
Sahara 4v4 desert map.
2013-06-05 02:13:41 -05:00
Grant H.
1043f58cc4 Finished Fort LoneStar
Finished Fort LoneStar + Added 2 new Desert maps:
-Great Sahara
-Suffrage
2013-06-05 01:57:08 -05:00
Paul Chote
7fb643f962 Add render trait for Mammoth Mk II. 2013-06-04 20:40:25 +12:00
Paul Chote
5cfde95358 Add a basic set of voxel render traits. 2013-06-04 20:40:24 +12:00
Paul Chote
235042ea65 Add VoxelRenderable to integrate voxel drawing with render traits. 2013-06-04 20:40:24 +12:00
Paul Chote
82faf7e929 Allow mods and maps to define voxel sequences. 2013-06-04 20:40:24 +12:00
Paul Chote
a00696ec3b Add core voxel rendering code. 2013-06-04 20:40:24 +12:00
Paul Chote
6cef4290df Store the voxel normals table in a palette. 2013-06-04 20:40:24 +12:00
Paul Chote
af6791d942 Implement hva parser. 2013-06-04 20:25:21 +12:00
Paul Chote
992db08f71 Implement vxl parser. 2013-06-04 20:25:21 +12:00
Paul Chote
656a529249 Support Vertex objects with custom z coordinate. 2013-06-04 20:25:21 +12:00
Paul Chote
f6264eeba4 Expose stencil buffer to render code.
The intention is to provide a layer for tracking shadow
rendering, so a single bit is sufficient for now.
2013-06-04 20:25:21 +12:00
Paul Chote
1b34c7d6b9 Expose depth buffer to render code. 2013-06-04 20:25:21 +12:00
Paul Chote
9566385aac Add renderer support for additional vec* uniforms. 2013-06-04 20:25:20 +12:00
Paul Chote
064938378f Add renderer support for matrix uniforms. 2013-06-04 20:25:20 +12:00
Paul Chote
fb3e776cb9 Add matrix helpers to Graphics.Util. 2013-06-04 20:25:20 +12:00
Paul Chote
eff46cf40d Add a Name field to Armament for other traits to reference. 2013-06-04 20:25:20 +12:00
Grant H.
9ed7d05ca7 Added Sahara Map
Added Sahara 4v4 map
Good balanced ore and symmetrical
2013-06-02 20:23:12 -05:00
Grant H.
1456cd6254 Fort LoneStar Fixes/Changes
Added:
-Game-play Balance changes
-Greater Difficulty
-Added Boss(es)
2013-06-02 18:54:53 -05:00
Chris Forbes
8c9fb382e3 Merge pull request #3366 from pchote/bridge-fix
Fixes #3329
2013-06-02 00:44:28 -07:00
Paul Chote
06d11c4fa9 Make missing tile transparent to avoid visual glitch with bridge1h in maps. 2013-06-02 19:27:23 +12:00
Paul Chote
50dff05675 Return a synthesized tile for missing indices. Fixes #3329. 2013-06-02 19:26:55 +12:00
Paul Chote
5692b95ad2 Use stream extensions to read binary map data. 2013-06-02 17:29:31 +12:00
Grant H.
130300074e Added New Missions
Added New Single-player Survival Map - Survival02
Added New 4 Player Co-op Survival Minigame - Fort LoneStar
2013-06-01 19:09:27 -05:00
ScottNZ
0cccfa4f8c Adjust some Tournament Island rock positions 2013-06-02 02:52:51 +12:00
Matthias Mailänder
ee058e72a9 Merge pull request #3356 from pchote/consistent-stream-reading
Fix BinaryReader / stream inconsistencies.
2013-06-01 03:51:16 -07:00
Matthias Mailänder
10acb115da Merge pull request #3358 from ScottNZ/maps
Add Tournament Island map to RA
2013-06-01 03:34:57 -07:00
Paul Chote
61c5b99dc5 Remove BinaryReader from R8Reader. 2013-06-01 15:09:36 +12:00
Paul Chote
edf604e080 Remove BinaryReader from VqaReader. 2013-06-01 15:09:36 +12:00
Paul Chote
6d8df80664 Remove BinaryReader from Dune2ShpReader. 2013-06-01 15:09:36 +12:00
Paul Chote
dd23e9598a Remove BinaryReader from ShpTSReader. 2013-06-01 15:09:36 +12:00
Paul Chote
6edde6c4ac Remove BinaryReader from MixFile. 2013-06-01 15:09:36 +12:00
Paul Chote
93b606da2c Add stream extensions for reading basic types. 2013-06-01 15:09:35 +12:00
Paul Chote
a3729a11c7 Extract stream extensions to their own file. 2013-06-01 15:09:35 +12:00
Chris Forbes
646b94e7cb Merge pull request #3348 from pchote/rendersprites
Renderer refactoring - Traits
2013-05-31 20:05:02 -07:00
Chris Forbes
bd72179cb2 Merge pull request #3355 from ScottNZ/follow
Guard fixes
2013-05-31 18:38:53 -07:00
Chris Forbes
4552bbf19f Merge pull request #3345 from reaperrr/minorfixes01
Some minor fixes
2013-05-31 18:38:14 -07:00
Paul Chote
8123a383b6 Fixes #3334. 2013-06-01 12:53:31 +12:00
ScottNZ
81991ffae0 Add Tournament Island map to RA 2013-06-01 12:00:05 +12:00
ScottNZ
02a8b05aff Remove ability to have a single unit guard itself 2013-05-31 18:12:30 +12:00
ScottNZ
5f3563d83e Fix #3354: Guard queries trait from destroyed object 2013-05-31 18:10:56 +12:00
Chris Forbes
733f29d184 Merge pull request #3351 from reaperrr/patch-2
fixes d2k mod Sound weapon
2013-05-29 14:22:27 -07:00
reaperrr
92d72cc725 fixing d2k mod Sound weapon
I hadn't noticed that the D2K mod uses LaserZap as well. Added HitAnim and replaced BeamRadius with BeamWidth.
2013-05-29 22:21:44 +03:00
Matthias Mailänder
cc9a45daff set the order lag to 1 in single player games 2013-05-28 19:36:23 +02:00
reaperrr
ec36279ecb changes temp shellmap allied color to same as singleplayer/desert shellmap. 2013-05-28 17:55:59 +02:00
reaperrr
403f3745d9 undo change to desert shellmap allied color 2013-05-28 17:54:47 +02:00
Paul Chote
bf3d337913 Support alternate sequence ordering for ts and d2k. Fixes #3333. 2013-05-28 22:37:07 +12:00
Paul Chote
c149898592 Separate IBodyOrientation from render traits. 2013-05-28 22:37:06 +12:00
Paul Chote
53aa698491 Rename LocalCoordinatesModel -> BodyOrientation. 2013-05-28 22:34:59 +12:00
Paul Chote
e7aa6ce998 Change traits to use RenderSprites directly. 2013-05-28 22:34:58 +12:00
Paul Chote
07f3c0171d Allow turret recoil to be disabled. 2013-05-28 22:34:58 +12:00
Paul Chote
1d5f67cb6a Allow turrets to have a different facing count to the actor body. 2013-05-28 22:34:58 +12:00
Paul Chote
13f8d944d2 Split RenderSprites out of RenderSimple.
RenderSprites handles sprite drawing independently
from the extra bits needed by actors that only use
sprites.
2013-05-28 22:34:57 +12:00
Paul Chote
e029347355 Merge pull request #3344 from reaperrr/sequences
Splits sequences.yaml into multiple files.
2013-05-28 03:25:50 -07:00
Paul Chote
0d6f02abcc Merge pull request #3182 from Mailaender/d2k-font
Added a new d2k title font
2013-05-28 03:14:24 -07:00
Paul Chote
cae9bef807 Merge pull request #3310 from psydev/bleed
new cnc map: deterring democracy (expansion of east vs. west)
2013-05-28 03:12:08 -07:00
Paul Chote
1a307b45e4 Merge pull request #3323 from psydev/cnc
cnc balance - orca tweaked (improved), sam fix, viceroid
2013-05-28 03:01:30 -07:00
psydev
e885e428ae removed debugretaliate and debugautotarget entries 2013-05-27 15:22:22 -07:00
reaperrr
f22216aeb5 bring temp shellmap allied color in line with desert shellmap/original RA. 2013-05-27 22:02:34 +02:00
reaperrr
7a4d06efb7 make allied color on desert shellmap slightly more vibrant. 2013-05-27 22:01:50 +02:00
reaperrr
d4b21ce206 removing tech center sequence duplicate.
there already is a more 'sophisticated' entry in map.yaml.
2013-05-27 21:23:51 +02:00
reaperrr
592c76eb6e sequences.yaml split-up
Implementing cjshmyr's suggestions.
2013-05-27 21:03:12 +02:00
reaperrr
5ef3a49485 Splits sequences.yaml into multiple files.
The sequences.yaml is a behemoth, next to impossible to navigate other than through the search function. Splitting it into multiple files named after their category makes navigation easier for everyone.
2013-05-27 19:35:22 +02:00
psydev
f31912aa42 reduce orca reload time, similar to earlier levels
Orca was over-nerfed with respect to reload time. It was not effective at finishing off vehicles and buildings if it ran out of ammo, because it took way too long to reload.

Its reload time has been set to the old one, but now it reloads 2 pips at a time, so it is slightly slower than originally, but not by much. It's a bit OP when it loads one at a time, it seems.
2013-05-26 18:42:58 -07:00
psydev
84ab4ec854 gave SAM missile a spread, to match MSAM.
To increase power vs. large groups of helis
2013-05-26 18:42:57 -07:00
psydev
beb73befa3 return orca range to 5
Problem: orcas in small groups will sometimes get in each other's way and be stuck outside of range. The old range was 5, but this was to nerf large groups.

Orcas have been nerfed in several ways. One of the ways was to reduce their range from 5 to 4. However, when the range reduction is coupled with all the other nerfs, it seems a bit too much. Orcas are fairly vulnerable now that air defense has improved.
2013-05-26 18:42:56 -07:00
psydev
a0fa99037b increase viceroid sight & scan range
Viceroids are kind of passive. Would like them to be a bit more aggressive when units are nearby.
2013-05-26 18:42:56 -07:00
Chris Forbes
1c6a98ba93 Merge pull request #3337 from Mailaender/auto-target-buildings
Don't auto-target unarmed buildings in RA mod
2013-05-26 13:24:07 -07:00
Chris Forbes
2958c80e51 Merge pull request #3342 from baxtor/setup-z-fix
Fixes #2216 InstallShield .Z package decompression
2013-05-26 13:23:51 -07:00
Chris Forbes
33376b52bd Merge pull request #3312 from ScottNZ/forcemove
Add force-move
2013-05-26 13:23:14 -07:00
Chris Forbes
5af277d20e Merge pull request #3338 from Mailaender/gps-dots
Added GPS dot shadows again and removed pixelation
2013-05-26 13:21:47 -07:00
Chris Forbes
a863f556a6 Merge pull request #3339 from reaperrr/laserzap
LaserZap improvements rev.2
2013-05-26 13:20:15 -07:00
baxtor
629fe95ebd Fixes issue #2216 InstallShield .Z package decompression 2013-05-26 21:51:37 +02:00
reaperrr
547e64724f Changes name of LaserZap Explosion trait to HitAnim.
Additionally sets default HitAnim to null instead of "laserfire", to avoid crashes when neither a custom HitAnim nor laserfire anim are present.
2013-05-26 16:47:23 +02:00
reaperrr
afb67f8595 Replaces BeamRadius with BeamWidth.
Allows for more fine-grained control over laserbeam width.
2013-05-26 16:45:16 +02:00
Matthias Mailänder
413b476c01 this is not the repository for the open-ra.org website 2013-05-25 19:13:03 +02:00
Matthias Mailänder
113968aaa7 PNGs are not artsrc 2013-05-25 19:12:39 +02:00
Matthias Mailänder
770477f7a5 removed hard-coded GPS dot upscaling
please create a bigger sprite instead
2013-05-25 19:12:22 +02:00
Matthias Mailänder
90dc755ad4 fixed GPS dot shadow remapping, closes #3319 2013-05-25 19:11:12 +02:00
Matthias Mailänder
c74fa90305 don't auto-target unarmed buildings in ra mod 2013-05-25 15:39:04 +02:00
Chris Forbes
93c89a6ef5 Merge pull request #3286 from pchote/renderable-refactoring
Renderer refactoring - Renderables
2013-05-24 20:26:29 -07:00
Chris Forbes
9d074c6721 Merge pull request #3305 from pchote/mixdatabase
Parse XCC mix databases
2013-05-24 20:25:38 -07:00
Chris Forbes
835dfd0780 Merge pull request #3320 from reaperrr/improved_visuals_v2
several visual improvements
2013-05-24 20:24:18 -07:00
Chris Forbes
bd360dab54 Merge pull request #3330 from ScottNZ/balance
Oil derrick buff
2013-05-24 20:23:22 -07:00
Scott_NZ
81563ee5d6 Add capture bonus to OILB 2013-05-25 03:16:58 +12:00
Paul Chote
0dd8d7f7b6 Distinguish between classic and crc file hashes. Fixes #3306, #3328. 2013-05-24 21:10:41 +12:00
Paul Chote
a11e403084 Draw turrets, spinners, rotors at ZOffset +1 relative to the body. 2013-05-24 18:18:47 +12:00
Paul Chote
d048d083c4 Convert px z offsets to world coords. 2013-05-24 17:41:55 +12:00
Paul Chote
437de8e884 Fix FTRK turret position. 2013-05-23 21:39:57 +12:00
Paul Chote
25dd8d9fa7 Fix aircraft shadow render order. 2013-05-23 21:25:11 +12:00
psydev
debfdfbad2 fix bialystok map--removed viceroids. && renamed. 2013-05-20 20:14:52 -07:00
psydev
923df5eafe dd: changed to 1vs1. dd+: added more land 2013-05-20 19:58:37 -07:00
psydev
38fcfe9a83 fixed map: the_hourglass. Creeps & biolab problems. 2013-05-20 19:20:31 -07:00
reaperrr
f85fce2ed1 adding myself to AUTHORS 2013-05-20 21:34:00 +02:00
reaperrr
e1669ecd70 construction yard with shadow
It always annoyed me that the CY had no shadow at all. This adds some at the edges.
2013-05-20 15:48:59 +02:00
reaperrr
3cc3a7dd65 crates with shadow and wood crate palette fix
- westwood never bothered converting the wood crate to RA's palette. I did.
- shadows added to both wood crate and silver crate.
2013-05-20 02:14:02 +02:00
reaperrr
2abb6421fe gap gen & mgg with shadows 2013-05-20 02:03:53 +02:00
reaperrr
579bafd439 Yak shp fix
Originally, the 2nd frame of yak.shp used greyscale for the tail fins instead of remap.
2013-05-20 02:01:09 +02:00
reaperrr
0719b89cdf adjusting explosion position
- originally, frag1 was not centric and appears to the right of the impact/exploding vehicle.
- fball1 appeared quite a bit below the impact point. This moves it up a little.
2013-05-20 01:58:53 +02:00
reaperrr
e3391d1535 changes light tank bullet to 50cal.shp
a better match for the low damage per shot, imo.
2013-05-20 01:54:54 +02:00
reaperrr
04fd2e6d0f changes civ pistol explosion to single piff
multiple piffs from a civilian pistol shot? Looks a little strange ;)
2013-05-20 01:53:07 +02:00
reaperrr
fbe06df9e6 silo gfx improvements
- fixed some minor errors on the undamaged frames.
- added shadow.
2013-05-20 01:49:28 +02:00
reaperrr
4e7f04da5f airfield gfx improvements
- added separate idle shp to allow using all 8 frames while keeping idle/active separate.
- replaced some empty/background pixels inside tower with shadow.
2013-05-20 01:47:42 +02:00
psydev
4e3da1c081 updated & renamed rock_canyon. && Fewer players. 2013-05-19 00:43:27 -07:00
Paul Chote
d9fab238d5 Show individual packages in the asset browser list. 2013-05-19 19:16:15 +12:00
Paul Chote
de3d4da000 Allow mounted IFolders to be queried. 2013-05-19 19:14:20 +12:00
psydev
9067c2c842 updated 2 maps to allow for fewer players 2013-05-18 23:39:21 -07:00
psydev
69ae57b246 removed old version of east vs. west 2013-05-18 23:13:48 -07:00
psydev
6d3cf83052 update & rename east vs. west; made expanded ver. 2013-05-18 23:13:48 -07:00
psydev
e6745f80ce new map: expansion of east vs. west redux 2013-05-18 23:13:47 -07:00
Paul Chote
f7aca32e0e Fix unit turret vs War Factory roof rendering. 2013-05-19 11:10:04 +12:00
Scott_NZ
ac430bd3bc Add force-move 2013-05-18 17:52:36 +12:00
Matthias Mailänder
be3b18057a replace PackageContent yamls with XCC database 2013-05-18 07:34:49 +02:00
Curtis Shmyr
9772f9b770 Merge pull request #3311 from chrisforbes/placebuilding-resolve
validate building placement in ResolveOrder as well
2013-05-17 21:14:53 -07:00
Chris Forbes
4d85605cca fix validation of startgame order 2013-05-18 15:58:16 +12:00
Chris Forbes
96ecb7c232 validate building placement in ResolveOrder as well 2013-05-18 15:47:11 +12:00
Paul Chote
112034a41d Allow hashes to be accepted as valid mix filenames. 2013-05-18 03:59:46 +12:00
Paul Chote
9dc3f4bf2d Add IFolder.AllFileNames() for listing the filenames in a package. 2013-05-17 23:52:02 +12:00
Paul Chote
974e9b3325 Write XCC compatible mix files. 2013-05-17 23:46:29 +12:00
Paul Chote
47f078ec3a Parse XCC global mix database. 2013-05-17 23:46:24 +12:00
Paul Chote
8817fd2cc5 Parse XCC local mix database. 2013-05-17 23:46:24 +12:00
Paul Chote
50b87b580a Remove 12 character limit from mix content names (XCC compatibility). 2013-05-17 23:46:19 +12:00
Paul Chote
170e14546a Convert NukeLaunch to world coordinates. 2013-05-17 18:12:29 +12:00
Paul Chote
4b4c1b71df Convert GpsSatellite to world coordinates. 2013-05-17 18:12:29 +12:00
Paul Chote
e122797a68 Convert CrateEffect to world coordinates. 2013-05-17 18:12:29 +12:00
Paul Chote
4d8dd2db7d Convert Corpse to world coordinates. 2013-05-17 18:12:29 +12:00
Paul Chote
3e1c1096c2 Convert Smoke to world coordinates. 2013-05-17 18:12:29 +12:00
Paul Chote
c6e6977bf6 Convert RallyPoint to world coordinates. 2013-05-17 18:12:28 +12:00
Paul Chote
85056e1c6c Convert bridges to world coordinates. 2013-05-17 18:12:28 +12:00
Paul Chote
57142fbb8d Convert indicator overlays to world coordinates. 2013-05-17 18:12:28 +12:00
Paul Chote
e382dc9b71 Remove obsolete functions from WorldRenderer. 2013-05-17 18:12:28 +12:00
Paul Chote
e1290dca47 Round PxPosition to the nearest pixel. 2013-05-17 18:12:28 +12:00
Paul Chote
ca5f2c3785 Split Renderable into an IRenderable interface and SpriteRenderable implementation. 2013-05-17 18:12:28 +12:00
Paul Chote
9b7aaebcbc Rewrite RenderCargo -> WithCargo.
Now uses world coordinates and properly displays
cargo at all facings.
2013-05-17 18:12:27 +12:00
Paul Chote
462478afdf Convert building rendering to world coordinates. 2013-05-17 18:12:27 +12:00
Paul Chote
d7e6125dd7 Convert ChronoshiftPower to world coords. 2013-05-17 18:12:27 +12:00
Paul Chote
79cbb7f729 Convert Parachute to world coords. 2013-05-17 18:12:27 +12:00
Paul Chote
fe716e76a7 Convert AnimationWithOffset to world coords.
Animations (via Actor.CenterPosition) now
understand Altitude, so there is potential for
mis-positioned animations if any existing altitude
hacks were missed.
2013-05-17 18:12:27 +12:00
Paul Chote
fb17654ea0 Convert Renderable to World Coordinates internally. 2013-05-17 18:12:26 +12:00
Paul Chote
d878c96343 Change Renderable to take centered positions. 2013-05-17 18:12:26 +12:00
Paul Chote
d103a187f6 Make the guts of Renderable private. 2013-05-17 18:12:26 +12:00
Paul Chote
7719ad1f2d Move Renderable into its own file. 2013-05-17 18:12:26 +12:00
Chris Forbes
cfcccb590d Merge pull request #3295 from reaperrr/patch-3
adding ImpactSounds to many weapons + other changes
2013-05-16 15:46:30 -07:00
Chris Forbes
8b4814e399 Merge pull request #3233 from ScottNZ/follow
Add unit following/guarding
2013-05-16 14:02:32 -07:00
Chris Forbes
3f1805c1ea Merge pull request #3192 from Mailaender/asset-browser
Created an Asset Browser to view and convert Sprites
2013-05-16 12:57:15 -07:00
Chris Forbes
56067e4d4f Merge pull request #3281 from Mailaender/sdl-openal-mirrors
Added OpenAL and SDL Windows dependency DLLs to mirrors
2013-05-16 12:55:31 -07:00
reaperrr
7e3f90ee1d sound and explosion changes
Explosion sounds have been noticeably absent from the RA mod, artillery weapons only used the weak kaboom12, most other weapons had no ImpactSound at all, making even larger battles sound 'empty'.

Now, explosive artillery weapons (155m, 8Inch, SubMissile) use art-exp1 as animation and kaboom22 as impact sound. Furthermore, most cannons and rockets now use kaboom12 as ImpactSound. In one or two cases kaboom15 is used instead. Furthermore, for consistency Trail: smokey was disabled on Dragon and ChronoTusk.
2013-05-16 21:10:54 +03:00
reaperrr
c71bdf32e1 adds artillery_explosion
Technically unnecessary, but using self_destruct on regular weapons in weapons.yaml might be a little confusing for modders. artillery_explosion is a more straight-forward label for art-exp1.
2013-05-16 20:52:19 +03:00
Scott_NZ
6e5d58379f Add unit guarding 2013-05-16 21:23:58 +12:00
Chris Forbes
a2a3def685 Merge pull request #3291 from reaperrr/patch-2
Adjusting infantry run animations to speed
2013-05-15 13:50:25 -07:00
reaperrr
01e6c14025 Adjusting infantry run animations to speed
I noticed that by default the run and prone-run animations are way too fast for the infantry movement speed. I used Tick values to fix this, taking into account individual speed. I used Tick: 80 for Speed: 5, 100 for speed 4 and 120 for speed 3. Some fine-tuning may be needed, but it already looks much better than before.
2013-05-15 23:43:20 +03:00
Matthias Mailänder
2d1bc7bac8 adapt asset browser for R8 files 2013-05-15 18:13:40 +02:00
Matthias Mailänder
6262aa846f wire up the import from PNG to SHP button
store everything in user directory to not junk up the game
and for file permissions on Mac/Linux when installed
2013-05-15 18:13:39 +02:00
Matthias Mailänder
8f822f6cad game asset browser UI polishing
- display file extension
- show total frame count
- dark background for preview
2013-05-15 18:13:39 +02:00
Matthias Mailänder
f14441d2f4 added MinimumThumbSize to ScrollPanelWidget
closes #2865
2013-05-15 18:13:39 +02:00
Matthias Mailänder
2762c245ee fix Makefile
OpenRA.Mods.RA.dll now depends on the Utility.exe
2013-05-15 18:13:39 +02:00
Matthias Mailänder
0c1b6f21b9 add a dump everything to PNG options for @xanax 2013-05-15 18:13:39 +02:00
Matthias Mailänder
7f40f59d85 added button to extract the selected SHP and convert it to PNG 2013-05-15 18:13:39 +02:00
Matthias Mailänder
6a6776754b added .mix file support for game asset browser 2013-05-15 18:13:39 +02:00
Matthias Mailänder
4a1ebb69c3 remove duplicate ra-desert bridge tiles 2013-05-15 18:13:39 +02:00
Matthias Mailänder
3ae61c5f8c added the game asset viewer to d2k mod 2013-05-15 18:13:38 +02:00
Matthias Mailänder
881fcf1191 added in-game SHP viewer with frame slider 2013-05-15 18:13:33 +02:00
Chris Forbes
ce021a4f62 Merge pull request #3283 from pchote/turret-rendering
Unify turret rendering traits
2013-05-15 03:30:17 -07:00
Chris Forbes
2207c391d6 Merge pull request #3265 from Mailaender/building-building-building
Avoid notification spam when the build palette is left-clicked
2013-05-15 03:27:54 -07:00
Chris Forbes
e97638ce86 Merge pull request #3282 from pchote/renderer-refactoring
Renderer refactoring - SheetBuilder
2013-05-15 03:26:16 -07:00
Paul Chote
f5d59fab22 Fix #2106.
The current tilesets only use only ~3% of the
available sheet space, so a future patch may want
to look into decreasing the terrain sheet size to
save some GPU memory.
2013-05-15 20:36:30 +12:00
Paul Chote
4ebe547a05 Allow SheetBuilder to generate 1/2/4 channel sheets.
This makes the SpriteFont RBGA sprite hack explicit,
and adds a DualIndexed option to be used by the voxel
renderer.
2013-05-15 20:18:41 +12:00
Paul Chote
28d4df355d Tidy Sprite. 2013-05-15 20:18:41 +12:00
Paul Chote
891158ca44 Allow SheetBuilder to throw an exception on sheet overflow.
This removes unnecessary checks from TerrainRenderer
and will be used in the voxel renderer.
2013-05-15 20:18:41 +12:00
Paul Chote
c13c989fe8 Allow sheet contents to be exported to bitmap. 2013-05-15 19:24:19 +12:00
Paul Chote
7d543abb92 Always store Sheet data as bytes. 2013-05-15 19:24:19 +12:00
Paul Chote
6dd62d7806 Fix Animation formatting (no code changes). 2013-05-15 19:24:18 +12:00
Paul Chote
d70a5aff6a Tidy TileSet formatting (no code changes). 2013-05-15 19:24:18 +12:00
Paul Chote
ccbfacec62 Tidy TerrainRenderer formatting (no code changes). 2013-05-15 19:24:18 +12:00
Paul Chote
cca784752b Make WithSpinner consistent with WithTurret. 2013-05-15 19:17:33 +12:00
Paul Chote
c91f0dfd2f Merge the 3 turret rendering traits into WithTurret. 2013-05-15 19:17:32 +12:00
Paul Chote
b7ea36b858 Merge pull request #3176 from Mailaender/travis-xbuild
Added xbuild to Travis configuration
2013-05-15 00:10:54 -07:00
Paul Chote
484b726373 Merge pull request #3253 from Mailaender/super-oil-derricks
Cleaned up the Red Alert map directory
2013-05-15 00:06:42 -07:00
Paul Chote
44336b1ea5 Merge pull request #3256 from Mailaender/debug-trait-removal
Removed all Debug traits
2013-05-15 00:05:44 -07:00
Paul Chote
63c71bf3f5 Merge pull request #3234 from Mailaender/ts-mix-filehashes
Added support for Tiberian Sun MIX filename hashes
2013-05-15 00:02:29 -07:00
Paul Chote
3500f4b3e3 Merge pull request #3193 from Mailaender/shp-ts
Added support for Tiberian Sun/Red Alert 2 SHP format
2013-05-14 22:29:16 -07:00
Chris Forbes
942946f1b1 Merge pull request #3266 from psydev/bleed
D2K - added forgotten_path map by Holloweye
2013-05-13 23:01:15 -07:00
Chris Forbes
e8db3c2e77 Merge pull request #3263 from Mailaender/alliance-checks
Removed inconstencies in alliance checks
2013-05-13 22:50:17 -07:00
Matthias Mailänder
c14dbb29c9 avoid notification spam when the build palette is left-clicked
fixes #2361
2013-05-13 23:43:37 +02:00
Matthias Mailänder
f05760b986 Don't apply palette modifiers on effects in C&C.
fixes #2778 unit veterancy symbol cloaking together with unit
2013-05-13 23:42:50 +02:00
Matthias Mailänder
0576937fd6 render powerdown indicator for observers 2013-05-13 23:42:50 +02:00
Matthias Mailänder
2c250ed700 fixes #3181 GPS dots not visble in spectator mode 2013-05-13 23:42:49 +02:00
Matthias Mailänder
95ec993134 Don't render unit ranks you are not supposed to see. 2013-05-13 23:42:49 +02:00
Matthias Mailänder
f4a4afbb69 make cash ticks consistent with per-player shroud and observers 2013-05-13 23:42:49 +02:00
Matthias Mailänder
05d187d327 consistent spy disguise radar color override in spectator mode 2013-05-13 23:42:49 +02:00
Matthias Mailänder
904c6b76b5 fixes #3178 invisible superpower charge bars in spectator mode 2013-05-13 23:42:49 +02:00
Matthias Mailänder
a4c69f0a74 try pulling OpenAL and SDL Windows libraries from mirrors 2013-05-13 23:06:47 +02:00
Chris Forbes
b301bc1d79 Merge pull request #3267 from Mailaender/ubuntu-travis
Tried to fix Travis CI problems
2013-05-13 04:20:02 -07:00
Chris Forbes
c9255a2873 Merge pull request #3276 from pchote/release-changelog
Update CHANGELOG for release-20130514.
2013-05-13 03:40:56 -07:00
Paul Chote
ca4e99993d Update CHANGELOG for release-20130514.
Thanks to @Mailaender and @psydev for collating
the changes, and to eyen from IRC for copy editing.
2013-05-13 22:31:19 +12:00
Scott_NZ
37fe6009ee Increase the health of OILB to 1000 and the amount of cash its CashTrickler brings in to 100 2013-05-13 00:18:09 +12:00
Matthias Mailänder
37069652c0 fix dependency installation for Travis CI
looks like the Ubuntu repositories don't update automatically
2013-05-12 07:37:39 +02:00
psydev
0c12dcb3c3 added forgotten_path map by Holloweye 2013-05-11 21:30:13 -07:00
Matthias Mailänder
a606ea4a80 Merge pull request #3264 from ScottNZ/sequences
Remove duplicate gnrl sequences definition
2013-05-11 05:37:45 -07:00
Scott_NZ
792d61ad8c Remove duplicate gnrl sequences definition 2013-05-12 00:35:53 +12:00
Matthias Mailänder
84d595bcde Merge pull request #3258 from pchote/drop-desync-fix
Revert "Players and bots surrender on disconnect."
2013-05-10 23:56:03 -07:00
Paul Chote
426467a38f Revert "Players and bots surrender on disconnect."
This reverts commit 500c24fbaf.
2013-05-11 18:34:16 +12:00
Matthias Mailänder
6aae5d2ad6 removed now redundant debug player-resource traits 2013-05-10 22:34:43 +02:00
Matthias Mailänder
e38aea276c removed now redundant debug aircraft traits 2013-05-10 22:32:05 +02:00
Matthias Mailänder
99d4d07cd5 removed now redundant debug auto-target traits 2013-05-10 22:31:54 +02:00
Matthias Mailänder
c75f758f8d deflated room-convergence because of the custom anti-rush rules 2013-05-10 19:23:02 +02:00
Matthias Mailänder
21775df1b8 deflated KOTH maps because of custom yaml rules
removed the mission building 3/4th scaling as it looked strange
2013-05-10 19:23:02 +02:00
Matthias Mailänder
0a49153dbf deflated ice woods because of custom creep building yaml rules 2013-05-10 19:23:01 +02:00
Matthias Mailänder
e10a5e591e deflated doughtnut-hole and stripped the abomb changes to diff 2013-05-10 19:23:01 +02:00
Matthias Mailänder
022aeec41a deflated center of attention redux 2
as it has custom oil derrick rules (although not busted)
2013-05-10 19:23:01 +02:00
Matthias Mailänder
a396d1e170 moved boomer test map into the performance benchmark mod 2013-05-10 19:22:42 +02:00
Matthias Mailänder
f7668f3b9d Made oil derricks remap to player colors on capture everywhere
by removing bogus custom yaml rules from some island maps
and enforcing the policy to extract all those oramap files.

fixes #3022
2013-05-10 18:49:28 +02:00
Matthias Mailänder
37f5b471fc removed strange "\"\\\"''\\\"\"" junk from black-gold map 2013-05-10 18:42:25 +02:00
Matthias Mailänder
956d68a84b removed custom yaml rules from bad-neighbors
They are redundant to the sniper/church stuff we already have.
Weapon rules had broken indentions which made this not work.
2013-05-10 18:32:21 +02:00
Matthias Mailänder
7d0b7d9617 Merge pull request #3240 from pchote/mixfile-streams
Be explicit about MixFile stream positions.
2013-05-10 04:12:08 -07:00
Matthias Mailänder
87986af197 Merge pull request #3251 from pchote/lobby-title-fixup
Lobby title fixup
2013-05-10 03:57:10 -07:00
Paul Chote
38f749ee47 Improve setting the lobby server title. 2013-05-10 22:47:32 +12:00
Paul Chote
41873d7cc5 Fixes fix for #3249. 2013-05-10 22:47:22 +12:00
Matthias Mailänder
d42f45825a Don't modify C&C options menu subtitle when opening the lobby.
fixes #3249
2013-05-10 13:19:50 +03:00
Matthias Mailänder
90dc6d3298 Merge pull request #3238 from pchote/local-pause-state
Remove local pause order lag delay
2013-05-10 03:07:08 -07:00
Matthias Mailänder
16decbf02b Merge pull request #3246 from psydev/cnc
cnc touch-ups
2013-05-10 02:58:01 -07:00
Matthias Mailänder
c2d0799595 Merge pull request #3243 from ScottNZ/balance
RA Balance (destructible mines; badr and mamooth and cruiser buff)
2013-05-10 02:55:17 -07:00
Scott_NZ
48010197f4 Make mines targetable and removable.
Let AP mines do damage against vehicles.
Let all mines do damage against friendly units.
2013-05-10 21:04:02 +12:00
Scott_NZ
8fe7f3f874 Increase badr and badr.bomber healths 2013-05-10 21:04:02 +12:00
Scott_NZ
57d66ed60d Increase CA ROT and speed. Increase its damage spread and accuracy. 2013-05-10 21:04:02 +12:00
Scott_NZ
198d6b2e9e Buff mammoth tank cannons and missile launchers 2013-05-10 21:04:02 +12:00
Matthias Mailänder
90ac648ff1 Merge pull request #3244 from pchote/bot-surrender
Improvements to player drop behavior
2013-05-10 01:44:55 -07:00
Paul Chote
818876a451 Promote oldest player to admin, not newest. 2013-05-10 20:31:20 +12:00
Paul Chote
500c24fbaf Players and bots surrender on disconnect. 2013-05-10 20:31:19 +12:00
Paul Chote
4a1698804f Rework server orders.
- Server messages now show as from "Server".
- Fixes #3224.
2013-05-10 20:31:19 +12:00
Chris Forbes
729088adda Merge pull request #3248 from pchote/player-color-ramps
Replace ColorRamp with HSLColor everywhere.
2013-05-10 00:41:26 -07:00
Matthias Mailänder
9a58d26321 fixed broken ingame stats for Dune 2000 mod 2013-05-10 10:37:32 +03:00
Paul Chote
656476991f Replace ColorRamp with HSLColor everywhere.
Fixes:
* Nuclear-purple color exploit.
* #3247.
* Removes a bunch of unnecessary color conversions every frame.

Caveats:
* The ramp range is now defined on the palette, so ramps can no longer be set per-player (may impact maps which define custom colors).
* It's no longer possible to perfectly recreate the original WW color ramps (I doubt we care).
* The old ColorRamp setting isn't migrated, so players will lose their color settings.
2013-05-10 19:23:30 +12:00
psydev
f74b5ea0d4 changed nuke launch sound
Someone complained that there was not good warning for the nuke. All you heard was the launch sound, which wasn't that noticeable and a bit like other sounds.
Now it says, "nuclear missile approaching".
2013-05-09 22:56:50 -07:00
psydev
cb8b0898d6 reduce construction yard cooldown to 3 seconds
While not crucial, the extra second kind of is annoying and gets in the way of gameplay.
2013-05-09 22:56:49 -07:00
Matthias Mailänder
0e624ad12f Merge pull request #3239 from chrisforbes/unhardcode-crate-drop
Un-hardcode crate drop actor names
2013-05-09 03:56:50 -07:00
Paul Chote
c3c5321e1d Predict local pause state to avoid order lag. Fixes #3223. 2013-05-09 22:42:55 +12:00
Paul Chote
8dab49fb95 Be explicit about MixFile stream positions. 2013-05-09 21:55:39 +12:00
Chris Forbes
7ac87dfdf8 Un-hardcode crate drop actor names 2013-05-09 21:04:22 +12:00
Matthias Mailänder
abcc30f0b7 Merge pull request #3229 from psydev/d2k-balance
D2K balance
2013-05-08 22:20:05 -07:00
psydev
7bbaab2e4a added support for main.mix (data files from original RA CD)
People who used the RA CD couldn't open D2K properly.
2013-05-08 15:09:04 -06:00
psydev
5e5818c34a Sardauker HP increased 80 -> 100
Sardauker are pretty dramatically underpowered, especially considering that they are a top-tier unit. Since they are slow, they need to be tough to withstand enemy fire before they get in range. Since they are $400, they are mostly a waste of money at the moment, rather than assault troopers.
2013-05-08 14:55:26 -06:00
psydev
89933b358f increase damage of siege tanks vs. turrets
For practical reasons, the siege tanks need a more powerful gun.
Currently, unit behavior is to not stay outside of turret range, but rather to walk into it before shooting. I don't think siege tank range should be increased any further, but this is a problem. 
Siege tanks should be good at defeating large clusters of enemy turrets, which are powerful and hard to break.
2013-05-08 14:53:17 -06:00
Matthias Mailänder
7fb85e7abb added support for Tiberian Sun MIX filename hashes
closes #3227
2013-05-08 21:08:24 +02:00
psydev
490230027c made tanks do 100% vs. light
tanks are a bit under-powered vs. quads at the moment. Quads are fast anti-vehicle/armor support units. They are supposed to keep their range to win, not go toe-to-toe.
2013-05-08 12:41:57 -06:00
psydev
c23dedbcb2 temporarily disabled Ordos Deviator
Currently the Deviator uses AttackLoyalty, which seems to only be able to take over units permanently. It should be temporary. Currently it seems overpowered, and should be disabled for now. 

If anyone disagrees, let me know.
2013-05-08 12:10:40 -06:00
psydev
c438534a4a deviator weapon fixed 2013-05-08 12:05:31 -06:00
psydev
8e9ee2654b siege tank weapon inc. vs light, 50% -> 75% 2013-05-08 11:02:52 -07:00
psydev
a1f12e9a2f siege tank turret offset changed
Now that the turret rotates, it should be changed so it looks less unnatural than if it were rotating on the center. It now looks as though it rotates on the base at the back.
2013-05-08 11:02:52 -07:00
psydev
30e953646d added larger revision of dune_boogie map 2013-05-08 11:02:52 -07:00
psydev
24bb086c7f Removed bib from repair bay
Hopefully no one objects to this. This removes the bib from the repair bay.
Rationale: to save space (it's 3x4, which is pretty sizable). It is a building you'll often want to build near the front line, so having it be very large limits whether you can put it on a little rock somewhere. Removing the bib also has the effect of distinguishing it from the starport. It doesn't look bad without the bib.
2013-05-08 11:02:51 -07:00
psydev
ef81d429f7 Reduce rocket tank's inaccuracy 2013-05-08 11:02:32 -07:00
psydev
357f974e49 minor: trike ROT +1 2013-05-08 11:02:32 -07:00
psydev
e1db583775 rocket tank rotation speed increased; +1 sight
since it's forward-facing and quite vulnerable, seems it should have some decent maneuverability so it doesn't get wasted so easily.
Increased sight range slightly.
2013-05-08 11:02:32 -07:00
psydev
a79d422d96 adjusted rocket tank
Rocket tank is a bit too good vs. armor and infantry.
It should be a generalist but its strength should lie in attacking buildings and light vehicles.

Speed increased a bit.
Damage vs. heavy reduced 80% -> 50%
Damage vs. buildings increased
Damage vs. infantry slightly reduced
2013-05-08 11:02:31 -07:00
psydev
bd3f7f7ded improved siegetank weapon vs. heavy armor & buildings
This will make it slightly more relevant on the battlefield. It shouldn't be excellent at fighting armor, since armor is what should kill it, but it shouldn't be totally helpless either.

damage vs. heavy increased 25% -> 50%
damage vs. wood increased 60% -> 80%
inaccuracy reduced 45 -> 40
speed increased ever so slightly.
2013-05-08 11:02:31 -07:00
psydev
1dc838beca Siege Tank has movable turreted
Siege tank is kind of useless. Given a moveable turret.
This unit is needed to break stalemates.
2013-05-08 11:02:30 -07:00
psydev
b94c20b2f5 reduced range of tower missile
Towers are too good right now and lead to stalemates. This will let them be outranged by 1 by siege tanks.
Added minimum range so that it can't hit the square next to it.
2013-05-08 11:02:30 -07:00
psydev
d41d6a73b7 reduced minimum crates to 0. 2013-05-08 11:02:29 -07:00
Matthias Mailänder
2d685ab07d added SHP(TS) support by @katzsmile 2013-05-05 19:19:16 +02:00
Paul Chote
67cb3c5cf7 Merge pull request #3143 from Mailaender/ai-basewalk
Allow the AI to base-walk without restrictions
2013-05-04 04:32:39 -07:00
Matthias Mailänder
f0e6ff8545 Merge pull request #3220 from pchote/remove-sequence-warnings
Remove sequence warnings for the stable release.
2013-05-04 04:26:03 -07:00
Matthias Mailänder
04674c5c01 Merge pull request #3219 from pchote/remove-server-pinger
Remove server pinging
2013-05-04 04:25:36 -07:00
Paul Chote
d091789206 Remove sequence warnings for the stable release. Fixes #3142. 2013-05-04 23:20:28 +12:00
Paul Chote
c0d50c2ac1 Remove server pinging. 2013-05-04 22:04:03 +12:00
Paul Chote
d7eac12d64 Merge pull request #3194 from Mailaender/ra-voice-cleanup
Removed Romanov ripped from RA2 and redundant voice definitions
2013-05-04 02:48:55 -07:00
Paul Chote
cba13bb535 Merge pull request #3203 from Mailaender/bogus-ai-settings
Removed some non-sense from the Red Alert AI configuration
2013-05-04 02:35:08 -07:00
Paul Chote
8bff53b6d6 Merge pull request #3218 from Mailaender/observer-stats-nre
Don't crash observing clients when allied tech centers get destroyed.
2013-05-04 02:33:16 -07:00
Paul Chote
c2722ebd5f Merge pull request #3217 from pchote/psydev-fixup
D2K / C&C updates
2013-05-04 02:22:44 -07:00
psydev
6caadfcd8a renamed sand_everywhere; added larger version 2013-05-04 21:11:59 +12:00
psydev
7e6f6aa842 re-added old nuke missile, with RA palette (fix) 2013-05-04 21:10:27 +12:00
psydev
53ff1ca723 general fix-ups. 2013-05-04 21:10:27 +12:00
psydev
e542c2abcc re-arranged explosions in sequences.yaml for ease 2013-05-04 21:10:27 +12:00
psydev
79ca7b4e9f added bigboom; made explosions better fits 2013-05-04 21:10:12 +12:00
Matthias Mailänder
94d9238ff9 fixes #3198 by catching the null references completely 2013-05-04 11:00:49 +02:00
psydev
a2382ce9b2 devastator gfx; & sonic weapons str. Fire fixed. 2013-05-04 20:59:45 +12:00
psydev
5ce9755071 switched back to RA explosions.
Until translucent effects are introduced, we should use the RA explosions,
which look better than what we currently have.
2013-05-04 20:59:45 +12:00
psydev
bfb8c30779 harvester speed 7 -> 6
Harv was a bit too fast. Tanks have been slowed, so it should be too.
2013-05-04 20:59:45 +12:00
psydev
1b0ebb3f94 made buildings require base provider (be in build radius)
Rationale:
Engineers right now can capture a building and then start building turrets in your base. Some might view this as legitimate but it is a pretty ridiculous strategy and makes game kind of unfun.
Part of why it's a problem is that turrets are quite powerful in this mod, and hard to kill.
The build radius is set to 30, which is very high, so it shouldn't be noticeable for most players in most games. But it will stop you from being able to build across the map.
2013-05-04 20:59:45 +12:00
psydev
776131d1ca fix Fremen to have rocket launcher, like in the original. 2013-05-04 20:59:45 +12:00
psydev
34e60b3223 made construction yard "base provider" (build radius) 2013-05-04 20:59:44 +12:00
psydev
0f1ebeba23 updated sand_everywhere map 2013-05-04 20:59:44 +12:00
psydev
c0a08fd7f9 added d2k map, sand_everywhere 2013-05-04 20:59:44 +12:00
psydev
f0205c738d added icon for stealth raider trike to bits 2013-05-04 20:59:44 +12:00
psydev
919cf76110 added stealth raider icon 2013-05-04 20:59:43 +12:00
psydev
88fb927fc4 reduce A.I. MSAM build production
they don't seem to know what it's for, and build a bit too many, (to the exclusion of other units sometimes, for some reason).
2013-05-04 20:59:43 +12:00
psydev
df9c4043a9 added Bialystok map; renamed bifurcation 2013-05-04 20:59:43 +12:00
Matthias Mailänder
d4b95ff40e Merge pull request #3209 from ScottNZ/log
Log unhandled exceptions
2013-05-03 23:01:58 -07:00
Matthias Mailänder
fb3ec2ff83 Merge pull request #3173 from ScottNZ/ui-layout
Improve RA main menu design
2013-05-03 22:58:43 -07:00
Matthias Mailänder
0f75679e0b removed Volkov entirely as more permission problems arised
- unknown source for weapon sounds
- icon borrowed from APB without asking for permission
2013-05-04 07:34:51 +02:00
Matthias Mailänder
24bb0fd922 Merge pull request #3215 from pchote/production-shroud-fix
Fix initial shroud reveal for newly produced units.
2013-05-03 22:26:25 -07:00
Paul Chote
55d5db0f02 Set produced unit position via an ActorInitializer. Fixes #3214. 2013-05-04 12:11:43 +12:00
Curtis Shmyr
0747b331d1 Merge pull request #3213 from TiriliPiitPiit/bleed
Added more ore to each player and created free space on the island on th...
2013-05-03 11:56:53 -07:00
Tirili
7c9fe3eda7 Added more ore to each player and created free space on the island on the map Nishnekolymsk 2013-05-03 19:03:56 +02:00
Chris Forbes
038cc6fc2f Merge pull request #3187 from psydev/d2k-balance
d2k balance changes
2013-05-03 03:38:50 -07:00
Scott_NZ
da0b4ecd3b Log unhandled exceptions 2013-05-02 23:45:05 +12:00
Chris Forbes
5877f72345 Merge pull request #3208 from pchote/mixfile-fixes
Fix mix header decryption.
2013-05-02 04:08:49 -07:00
Paul Chote
9a9dc7eab1 Clean up MixFile code. 2013-05-02 23:03:45 +12:00
Paul Chote
5af983a409 Fix bogus mixfile header decryption. Fixes #2176. 2013-05-02 21:01:58 +12:00
psydev
23025df697 nerf tower missile vs. infantry
Due to blast radius was too good at wiping out infantry before they got even close. 
Made it fire with longer burst delay.
2013-05-01 05:23:40 -07:00
Scott_NZ
d4cd05c2ea Improve RA main menu design 2013-05-01 22:08:28 +12:00
psydev
c18df57af9 slight reduction in harkonnen combat tank
To avoid the possibility of it being OP, reducing Hark. combat tank to 440, which divides into 11 tank shots.
2013-05-01 00:16:36 -07:00
psydev
d36caebecc reduced paratrooper cooldown from 280 -> 180 sec. 2013-04-30 19:18:28 -07:00
psydev
7e1c3a5f20 nerf towers
Very OP and make the game too static/ stalemated.
2013-04-30 17:19:23 -07:00
psydev
53502742a8 increase spread of tank shell
Right now they're too easily bogged down by infantry. 

Bazookas remain a strong counter for tanks.
2013-04-30 17:14:14 -07:00
Matthias Mailänder
9c97623257 Red Alert AI configuration
building >1 production buildings is bogus as it has no benefit
generic names that describe the build order not fake personality
2013-04-30 19:00:26 +02:00
psydev
0fcef9b18c Artillery shell buffed vs. concrete 2013-04-29 23:22:54 -07:00
psydev
5461d2d4aa fixed oversight from previous change to atreides tank gun 2013-04-29 23:20:41 -07:00
psydev
cfe55033d5 tank buffed vs. infantry 2013-04-29 23:19:14 -07:00
psydev
f9d5ea06f7 quad slightly slower 2013-04-29 23:15:24 -07:00
psydev
0c9c932435 Ordos tank slightly slower 2013-04-29 23:13:09 -07:00
psydev
87dd54c3c0 harkonnen combat tank slower, tougher 2013-04-29 23:11:49 -07:00
psydev
3c349da93b tank +25 HP, -> 350 2013-04-29 23:11:13 -07:00
psydev
cfc8d6422f Lower combat tank defualt speed
They are a bit fast, and the game is a bit fast.
2013-04-29 23:10:32 -07:00
Matthias Mailänder
7a89740ad6 removed RA ShipVoice which is identical to VehicleVoice 2013-04-29 18:23:59 +02:00
Matthias Mailänder
d76d53bee2 removed Volkov voices which is actually Romanov from RA2
fixes #3190
2013-04-29 18:23:53 +02:00
Matthias Mailänder
b595c7f435 Merge pull request #3191 from chrisforbes/allies02-bridge-fix
fixes #3185 incomplete bridge repair on allies02
2013-04-29 02:45:06 -07:00
Chris Forbes
51ce32a8bb fix incomplete bridge repair on allies02 2013-04-30 09:24:43 +12:00
psydev
9971bdfb66 change infantry default speeds
infantry was complained as being too fast. Agreed.
2013-04-28 15:56:35 -07:00
psydev
cb7cc8b293 d2k balance changes 2013-04-28 02:46:49 -07:00
Matthias Mailänder
52797e8b79 added a new d2k title font
from http://www.d2kplus.com/font.php
by http://forum.dune2k.com/user/2251-d2k-sardaukar/
2013-04-28 08:07:39 +02:00
Scott_NZ
6da0db0035 Redesign Allies 02 base. Fix fail condition in Allies 02. Rename MissionUtils infil trait. Create cameras in missions to let enemy units attack properly 2013-04-28 04:10:35 +12:00
Matthias Mailänder
3c4a68bfbc add xbuild to travis configuration
to check if we can still compile with MonoDevelop/Visual Studio
2013-04-27 15:51:07 +02:00
Matthias Mailänder
7f37080a87 Update OpenRA.Mods.RA.csproj
the not yet merged asset browser slipped through, sorry
2013-04-27 16:44:52 +03:00
Matthias Mailänder
b846b0b5d3 fixed ColorMixerWidget.cs(5,5): Error CS0227
Unsafe code requires the `unsafe' command line option to be specified
2013-04-27 16:43:43 +03:00
Paul Chote
46f2dd67d4 Merge pull request #3175 from Mailaender/ra-cleanup
Removed duplicate e8.shp and documented the Dune II SHP converter
2013-04-27 03:34:00 -07:00
Matthias Mailänder
0f3f77c52a e8.shp is a duplicate of gnrl.shp
used for both Volkov and Stavros
2013-04-27 12:22:50 +02:00
Matthias Mailänder
893eab0fb1 document the hidden Dune II converter command 2013-04-27 12:22:50 +02:00
Paul Chote
36a7d070a8 Merge pull request #3145 from Mailaender/harvy-never-let-go
Undock harvesters when refinery is destroyed
2013-04-27 03:14:00 -07:00
Matthias Mailänder
461cc347fc Merge pull request #3169 from pchote/colorpicker
New Colorpicker with graphical mixer
2013-04-27 03:12:53 -07:00
Paul Chote
1177402856 Merge pull request #3135 from ScottNZ/ui
Start moving towards saner RA widget logic
2013-04-27 03:09:59 -07:00
Paul Chote
de8f96abe3 Merge pull request #3141 from Mailaender/mechanic-wrench
Give the mechanic a wrench cursor icon instead of red-cross
2013-04-27 03:05:05 -07:00
Paul Chote
950b77bfdf Merge pull request #3171 from Mailaender/lobby-tooltip-nre
Fixed NullReferenceException for unknown IPs in Lobby Tooltip
2013-04-27 03:00:39 -07:00
Paul Chote
07916c422e Merge pull request #3172 from Mailaender/loadscreen-font-nre
Don't crash when the fonts are not yet loaded
2013-04-27 02:55:26 -07:00
Paul Chote
48cea2bd96 Merge pull request #3170 from Mailaender/d2k-weapons-nsis
Fixed d2k installation on Windows
2013-04-27 02:51:52 -07:00
Matthias Mailänder
b5e8b5426e fixed NullReferenceException for unknown IPs
closes #3167
2013-04-27 10:01:36 +02:00
Matthias Mailänder
7bd253d56b Don't crash when the fonts are not yet loaded
closes #3157
2013-04-27 09:52:53 +02:00
Matthias Mailänder
08ad22923a fix d2k installation on Windows
closes #3168
2013-04-27 08:59:41 +02:00
Paul Chote
70f705bdc7 Implement the new color picker. 2013-04-27 12:35:41 +12:00
Paul Chote
e240b9ca3d Add a hue selector widget. 2013-04-27 12:35:41 +12:00
Paul Chote
2c0b7d2111 Add a ColorMixer widget for selecting sat/lum. 2013-04-27 12:35:41 +12:00
Paul Chote
90ac642aa9 Split HSLColor out from ColorRamp. 2013-04-27 12:35:41 +12:00
Scott_NZ
5d4fa5eea9 Cache pause state and switch back to it when closing the ingame menu. Fix formatting fail in d2k mod.yaml 2013-04-26 18:13:34 +12:00
Scott_NZ
e332571102 Fix crash when clicking settings or music buttons in ingame menu 2013-04-26 13:52:53 +12:00
Matthias Mailänder
cf9fcdee60 separate music-player from main-menu yaml 2013-04-26 13:52:53 +12:00
Matthias Mailänder
4470d67617 fixed remove/hide main-menu when sub-menus are closed 2013-04-26 13:50:15 +12:00
Scott_NZ
3ce68d2f7d Fix NRE when leaving game through menu after observing 2013-04-26 13:50:15 +12:00
Scott_NZ
ca80ac2d1f Start moving towards saner RA widget logic. This switches players to observer mode after they have finished playing in RA/D2k and removes some legacy code. 2013-04-26 13:50:14 +12:00
Matthias Mailänder
7ec4bcad0e Merge pull request #3164 from pchote/lobby-tooltips
New/Improved lobby tooltips which show IP, admin status and explain ping.
2013-04-25 00:59:31 -07:00
Matthias Mailänder
508f6d4ae3 Merge pull request #3161 from ScottNZ/replay
More robust replay file creation
2013-04-25 00:44:46 -07:00
Paul Chote
45ff0645ba Add client tooltips showing Admin/IP/Latency. 2013-04-25 14:33:23 +12:00
Matthias Mailänder
91115d5ba3 save client IpAddress for later 2013-04-25 14:33:23 +12:00
Paul Chote
d21875d353 Adjust latency thresholds and add text description. 2013-04-25 14:33:22 +12:00
Paul Chote
fd58461d43 Rename Ping -> Latency. 2013-04-25 14:03:14 +12:00
Paul Chote
a1d2229a58 Remove legacy tooltip code. 2013-04-25 14:03:13 +12:00
Paul Chote
ba2704291a Implement new spawn tooltips in RA and d2k. 2013-04-25 14:03:13 +12:00
Matthias Mailänder
c7900b2cc0 Give the mechanic a wrench icon instead of red-cross
closes #3133

don't try to guess hard-coded cursors from weapon damage
2013-04-24 13:53:52 +02:00
Matthias Mailänder
e09a7f57f3 Undock harvesters when refinery is destroyed or not in world
fixes #2029
2013-04-24 13:42:02 +02:00
Paul Chote
a309511f9b Merge pull request #3074 from Mailaender/make-version
Attempt to unify versioning with downstream
2013-04-24 03:17:20 -07:00
Scott_NZ
cded77c176 More robust replay file creation 2013-04-24 01:39:59 +12:00
Chris Forbes
0c7b552471 Merge pull request #3158 from pchote/diy-pings
Rewrite ingame ping implementation.
2013-04-23 03:52:58 -07:00
Paul Chote
cc4559cae6 Remove obsolete Random Map button from d2k lobby. 2013-04-23 21:35:58 +12:00
Paul Chote
ed9d8fb7f7 Clean up lobby logic and visuals. 2013-04-23 21:35:57 +12:00
Paul Chote
9069d98365 Reimplement pinging via the orders channel. 2013-04-23 21:35:57 +12:00
Paul Chote
9f4b323287 Remove ICMP based pinger 2013-04-23 21:35:57 +12:00
Paul Chote
b52a8b27ff Fix assign teams dropdown position. 2013-04-23 21:35:57 +12:00
Matthias Mailänder
8fe21b4608 Merge pull request #3150 from cjshmyr/hotkey
Hotkey changes
2013-04-22 00:56:11 -07:00
Chris Forbes
0b7c70ef3c Merge pull request #3147 from Mailaender/demo-flash
Added missing target line for DemoAttack
2013-04-21 23:31:24 -07:00
Curtis Shmyr
ed68aef0e4 Move flamethrower and shock trooper BuildPaletteOrder values around 2013-04-21 17:42:35 -06:00
Curtis Shmyr
1f1b31008d Change soviet buildings BuildPaletteOrder to be consistent with allied buildings 2013-04-21 17:42:07 -06:00
Curtis Shmyr
3b8957a65e Remove alt key modifier from build palette hotkeys. Changed some hotkeys for units and buildings. 2013-04-21 17:28:12 -06:00
Matthias Mailänder
d2c1c8a629 Added missing target line for DemoAttack
fixes #3122
2013-04-21 19:36:30 +02:00
Matthias Mailänder
d08d3d6e23 allow the AI to base-walk without restrictions
fixes #2899
2013-04-21 16:36:25 +02:00
Chris Forbes
406b210958 Merge pull request #3140 from psydev/bleed
Tanks' ROF increased
2013-04-21 02:36:05 -07:00
psydev
4872330dce Tanks' ROF increased
Increased ROF of tanks. The guns of Light & Medium Tanks are a bit weak
relative to their role as tanks. They do less damage than bike rockets,
and do less damage against light vehicles than even the hum-vee. Changing
ROF should mitigate this a bit, even though their gun is still not that
powerful (e.g. compared to stealth tank, and even flame tank matched light
tank). The fact that their rivals are often moving fasts also complicates
the slower ROF.

The same proportion of damage was kept between light & medium tanks.
Mammoth Tank was left unchanged.
2013-04-21 02:13:18 -07:00
Matthias Mailänder
b4f14d2ba6 Merge pull request #3138 from chrisforbes/survival-fix
fix survival01 crash on start, closes #3131
2013-04-21 00:35:43 -07:00
Chris Forbes
a6ee60c352 fix survival01 crash on start 2013-04-21 19:31:52 +12:00
Chris Forbes
7f34f8da7a Merge pull request #3136 from Mailaender/smokey
Don't crash d2k when shooting at aircraft and don't hard-code the sprite in smoke trails.
2013-04-21 00:23:15 -07:00
Matthias Mailänder
322d010076 fix crash in d2k - the smoke sprite is currently undefined
it used an RA one before, was hidden in the source code
2013-04-21 08:42:13 +02:00
Matthias Mailänder
2bc38fd751 don't hard-code smokey.shp 2013-04-21 08:38:52 +02:00
ScottNZ
11852880e9 Merge pull request #3120 from Mailaender/classic-removal
Goodbye classic mods
2013-04-20 23:05:06 -07:00
Scott_NZ
992d1723f8 Move gdi01 and nod01 back to cnc 2013-04-21 17:59:33 +12:00
Chris Forbes
a13f9ea3eb Revert "Fix bogus pathability check."
This reverts commit 8676562d47.
2013-04-21 13:58:10 +12:00
Curtis Shmyr
f40fbaf35e Merge pull request #3134 from chrisforbes/load-time
avoid spurious re-indexing of maps just prior to shellmap load
2013-04-20 16:58:48 -07:00
Chris Forbes
d0fe25e022 Merge pull request #3000 from Mailaender/dynamic-orderlag
Display Ping of joining Clients in Lobby and use it to calculate OrderLatency
2013-04-20 16:57:00 -07:00
Chris Forbes
dbc8019365 Merge pull request #3130 from Mailaender/sequence-errors
Be more verbose about missing sequences and files
2013-04-20 16:56:25 -07:00
Chris Forbes
2f2d79fd97 Merge pull request #3111 from Mailaender/ra-building-artwork
Red Alert building artwork polishing
2013-04-20 16:56:15 -07:00
Chris Forbes
8cac132e9e Merge pull request #3132 from Mailaender/configurable-overlay
Per tileset configurable selection overlays
2013-04-20 16:55:52 -07:00
Chris Forbes
ab4990299a Merge pull request #3125 from Mailaender/chrome-modifiers
Disallow modifiers on the chrome palette
2013-04-20 16:55:29 -07:00
Chris Forbes
c3000e90ef Merge pull request #3124 from Mailaender/zombie-aircraft-fix
Don't try to return to base if already dead
2013-04-20 16:55:04 -07:00
Chris Forbes
5cead96550 Merge pull request #3114 from ScottNZ/mrj
Implementation of MRJ
2013-04-20 16:53:52 -07:00
Chris Forbes
ecae967386 Merge pull request #3129 from Mailaender/mixfile-duplicates
Added .mix filename to Exception if duplicate values are found
2013-04-20 16:53:38 -07:00
Chris Forbes
40f73a9289 Merge pull request #3128 from Mailaender/diplomacy-shroud
Fix Fragile Alliance button usability and Diplomacy Shroud problems
2013-04-20 16:53:08 -07:00
Chris Forbes
c86a17c170 Merge pull request #3127 from Mailaender/teamchat-nre
fix NullReferenceException when watching replays with team chat
2013-04-20 16:52:08 -07:00
Chris Forbes
8750f04f4c avoid spurious re-indexing of maps just prior to shellmap load 2013-04-21 11:38:24 +12:00
Matthias Mailänder
b818f85b38 per tileset configurable selection overlays
don't use a white one for more contrast on snow, closes #2050
2013-04-20 23:00:11 +02:00
Matthias Mailänder
a9cacbc16b Merge pull request #3118 from psydev/cncmap
C&C map updates
2013-04-20 13:08:43 -07:00
Matthias Mailänder
3649342317 be more verbose about missing sequences and files
as requested in #3039
2013-04-20 21:56:29 +02:00
Matthias Mailänder
6125f4f9d3 added .mix filename to Exception if duplicate values are found
to debug #2441
2013-04-20 19:46:31 +02:00
Matthias Mailänder
f6908e45d3 update the shroud for the player setting diplomatic stances
fixes #2942
2013-04-20 19:09:10 +02:00
Matthias Mailänder
7508b3f6e3 remove automagic behaivor for the fragile alliance button
it is not working well and I can't debug with bots with it
2013-04-20 18:42:54 +02:00
Matthias Mailänder
411a0ce8df fix NullReferenceException when watching replays with team chat
closes #3084
2013-04-20 17:54:39 +02:00
Matthias Mailänder
0c169bcfd3 added make version command
to quickly set the mods version to the git tag
or git-$hash if we are on a development version
2013-04-20 17:45:12 +02:00
Matthias Mailänder
53172d2aa3 remove more of Jes's paintjobs where I don't see the benefit
we want smaller installation packages
some alignment fixes made things worse
2013-04-20 16:09:24 +02:00
Matthias Mailänder
43997fda19 remove hackjob on the death hand missile
don't know why Jes did it
it now has the wrong palette applied and looks awful
2013-04-20 15:43:41 +02:00
Matthias Mailänder
32916ee8c5 remove unneccesary hack-jobs on d2k building icons
now that we have bibs back
2013-04-20 15:39:56 +02:00
Matthias Mailänder
478c54c187 disallow modifiers on the chrome palette
fixes #3123 when the build palette cycles on RA desert maps
2013-04-20 15:34:01 +02:00
Matthias Mailänder
6f681dfe37 don't try to return to base if already dead, fixes #2503 2013-04-20 14:45:28 +02:00
Matthias Mailänder
dc7b2c0f5d Merge pull request #3121 from chrisforbes/unlag
Faster response times for AutoTarget and Move orders.
2013-04-20 03:43:17 -07:00
Chris Forbes
9a65399fed unlag move order response 2013-04-20 21:34:03 +12:00
Chris Forbes
9b677107ec unlag autotarget response 2013-04-20 21:33:54 +12:00
Matthias Mailänder
c02791eb2e purge the classic mods from the source tree
they are unmaintained and no one wants to play them
2013-04-20 09:55:04 +02:00
Matthias Mailänder
2d77a46aec add documentation to crate spawner / dropper 2013-04-20 09:55:04 +02:00
psydev
df6dd52832 updated map, bifurcation 2013-04-20 00:31:38 -07:00
psydev
6a78ade36b updated map slippery_slopes (supports 8 players) 2013-04-19 23:44:26 -07:00
Matthias Mailänder
2b8efd9949 Merge pull request #3116 from psydev/cnc-balance
C&C anti-air balancing
2013-04-19 23:25:49 -07:00
Matthias Mailänder
24bb08f8a8 Merge pull request #3117 from chrisforbes/autotarget-params
move autotarget scan time params into AutoTargetInfo
2013-04-19 23:20:13 -07:00
psydev
58411bbaf7 Orca +1 (weaker missile), has slower reload
Reload period for orca inreased. Fully reloading is roughly equal to the amount of time it would take to go from the center of an 80x80 map to your home base, land, reload, and return to the center. (About 30 seconds). 

There is +1 rocket than before, because each rocket has been weakened. This makes the orca take longer to unleash its full payload.
2013-04-19 22:18:08 -07:00
psydev
884eb3bf89 Reducing orca damage 30 -> 25
Will reduce damage by rockets but inrease the amount of rockets from 5 -> 6. The result of this will be taking longer to do full damage of the volley.
2013-04-19 22:02:40 -07:00
psydev
735e437912 Made silos have double the capacity, cost more.
This is combined with slightly reducing the amount of tiberium stored in Refineries. Part of the reason for this is that refineries are targeted lots by ion cannons (one-shot kill) and nukes. Whenever this happens, you lose the money that's in them. By making a silo that stores more, you can store the tib farther away and keep a bit more of it safe.

The other part of the reason is to bring silos into the game as a somewhat strategic structure. By having more money, they are more capturable, because you can steal what's in them. It might also make sense to maybe airstrike them so that the opponent loses what money is in them.
The way to counteract this problem is to build more silos. They cost a bit more though (double) so that you have to think about how many you want.
2013-04-19 21:54:59 -07:00
psydev
00550afd98 SAM site's turret rotation speed increased
Shouldn't have to lose out because you can't turn your head fast enough.
2013-04-19 21:36:40 -07:00
psydev
b2b3959d95 APC gun buffed
APC fires more rapidly. Does same damage vs. ground units, but does much more damage vs. air units now.

APC ground damage vs. infantry changed because since the damage is low (15), strange rounding errors occur that make it do next to no damage.
2013-04-19 21:34:12 -07:00
psydev
ffe6b88986 TowerMissiles faster, fire more efficiently
Missile optimized to fire a 2-burst quickly and kill orcas, but still does same overall damage as before. Uses missiles more efficiently by having them do lower damage and firing more often. 
Spread increased from 6 -> 12 since it is too weak against infantry. Damage vs. infantry still low, but at least has some effect vs. groups of infantry.
Increased RangeLimit, instead of increasing missile speed, to keep the building's flavor.
2013-04-19 21:27:38 -07:00
Chris Forbes
adc36d13d9 Merge pull request #3098 from Mailaender/mono-nat-refactor
Separate UPnP from Game/Server into it's own class
2013-04-19 21:21:34 -07:00
Chris Forbes
b6de3b3991 move autotarget scan time params into AutoTargetInfo 2013-04-20 16:19:06 +12:00
psydev
5aacb1b95f slight optimization of turret
Made turret do less damage (50), and shooting more often. 50 divides well into apc/tank health (200,300,400). 80% damage is 40, which divides well into common vehicle HP (120,160).
Bullet speed increased for greater accuracy.
2013-04-19 19:47:38 -07:00
psydev
eac2b42fd3 SAM site buff -- more missiles, faster, less dmg,
SAM site receives a buff to counter orca spam.
Missiles now do half as much damage (30). This divides better into Orca's hitpoints (90), to avoid wasted missiles. Missiles fire ~3x as often. 
Missiles are faster. RangeLimit reduced to compensate.
2013-04-19 19:05:25 -07:00
psydev
540dda980b SAM site-increase speed of open/closing and Make.
Takes too long to make, because it's at ~80 tick like every other building.
Increased speed of closing as well as opening.
2013-04-19 19:00:05 -07:00
psydev
f6e092acb5 buffed Mobile SAM's patriot missile
Mobile SAMs are at risk of dying quickly, so it's better to have 2 missiles worth half the damage each, in the hopes you'll get more shots off. 
BurstDelay was lowered for this purpose, too.
Increased speed of missile, and adjusted RangeLimit to compensate.
2013-04-19 18:57:58 -07:00
psydev
d12566928d Mobile SAM receives speed & rotation boost
Mobile SAM is a bit sluggish. +1 speed does the trick.
Turret was a little slow, too. Important when you have to react fast.
2013-04-19 18:45:37 -07:00
psydev
88de950afb minor: humvee/buggy lose 5% vs. heavy & wood
In big numbers, the unit with the heavy machine gun could be a bit too powerful vs. buildings for their cost, or even armor at certain times. (Armor should be extremely resistant to machine gun fire, even in large amounts). Base raiding should favor recon bikes slightly, for cost effectiveness.
Nerf slightly.
2013-04-19 17:49:15 -07:00
psydev
cce71551fd reduced cost of APC and M-SAM to $600
The GDI APC and the Nod Mobile SAM Launcher are the premier anti-air units that are needed to defend each side from air attacks. Due to the problems of orca spam, they should be given a more prominent role. 
Currently the APC is $700 and the M-SAM $750. This might be reasonable against a small amount of vehicles, but anti-air units need to be able to deal with spam. So they will be reduced in cost so they can be bought cheaper. This is important for the M-SAM especially since it's a dedicated anti-air unit.

To avoid the GDI APC being too good, the damage vs. heavy armor will be reduced a bit more, so it cannot serve the role of "light tank". It will still be able to fight light vehicles well, however.
2013-04-19 15:13:50 -07:00
psydev
dec5c7dfe2 Mobile SAM's patriot missile buffed
To deal with orca spam problem:
-Mobile SAM missile fires a bit faster (Burst Delay of 1 sec. instead of 1.4 sec).
-Damage spread increased slightly from 14 -> 16, to deal with large concentrations of air units.
-Damage increased 55 -> 60, which divides as 2/3rds of an orca's HP. Important because Infantry rockets and Bike Rockets do 30 damage each, so one rocket + 1 patriot == kill.

SAM turret damage also increased 55 -> 60, for same reason.
2013-04-19 15:11:55 -07:00
psydev
81d5c89e6c APC gun damage reduced vs. heavy armor, infantry
Since the APC's cost was lowered to $600 to deal with orca spam better, its damage vs. heavy armor and infantry is being correspondingly lowered, so that it is not too good against those units (in terms of dollar-value, especially).

Keep in mind that APC is still good at crushing infantry.

Also removed "High" attribute from APC gun (but not from the AA version).
2013-04-19 15:09:49 -07:00
psydev
f35ff421d2 Orca nerf: reducing damage vs. heavy 20 dmg -> 15
Orca rockets will do 15 damage vs. heavy. Hopefully this will take some edge off orca spam. This will:
-Give anti-air APC more lasting power vs. orca, ensuring it can at least down some of them and get their money's worth.
-Mammoth tank will bet better able to survive a mass assault and return fire with its rockets to down some of them (and get better money's worth).
-Give advanced guard towers better ability to defend themselves against air assault. (ATWR has heavy armor and does good damage, but can die quickly against a large group of orcas).
-Give armored units in general more resilience vs. orcas so they aren't completely helpless and quickly annihilated. Maybe then they can reach their target better (e.g. a couple tanks charging an artillery position that is being defended by some orcas).

Damage vs. infantry also slightly reduced as as result (also 20 -> 15 dmg).
Orcas generally aren't a threat to infantry, but E3s should be able to do some credible damage, even if they are in a small group. Enough orca spam will kill a small group of infantry, unfortunately. Since Orca has no business attacking infantry anyway, this slight nerf won't hurt orcas.

(Note: The damage model was simplified a bit, so that it does 100% of 30 dmg instead of 75% of 40 damage, vs. light & wood.)
2013-04-19 14:06:13 -07:00
Scott_NZ
51b485dd2e Adjust MRJ tooltip description 2013-04-20 03:26:28 +12:00
Scott_NZ
f41b03cdfa Fix JamsRadar jamming allies 2013-04-20 03:05:47 +12:00
Scott_NZ
4d2ccb811a Add RenderJammerCircle 2013-04-20 03:05:47 +12:00
Scott_NZ
88b59d5033 Add missile jamming to MRJ 2013-04-20 03:05:47 +12:00
Scott_NZ
95b5e1856e Make MRJ jam radar 2013-04-20 03:05:47 +12:00
Matthias Mailänder
77d17ce761 added building husks for RA
refinery, construction yard and power-plants
made by Harisson
2013-04-19 12:10:13 +02:00
Matthias Mailänder
371888b886 remove redundant kennel SHP added by @ScottNZ accidentily
contains no artwork fixes/polishing
2013-04-19 11:47:37 +02:00
Matthias Mailänder
520bb19e44 fixes #2660 damaged silos placed by mappers using wrong sprites 2013-04-19 11:27:34 +02:00
Matthias Mailänder
713260a49f added more silo fillstep animations
made by Harisson
2013-04-19 11:19:30 +02:00
Matthias Mailänder
2c66e5352e added more frames to the RA weapon factory doors
smoother opening animation made by Harisson
2013-04-19 10:19:03 +02:00
Paul Chote
d735242cd0 Merge pull request #3110 from ScottNZ/renderer
Fixes #3104
2013-04-19 01:00:27 -07:00
Scott_NZ
2c4c7aa4c0 Fixes TerrainRenderer.Draw() causing a crash because of negative firstRow value 2013-04-19 19:09:29 +12:00
Matthias Mailänder
3ba5bc255e Merge pull request #3100 from dan9550/created-maps
A Drop Zone map for C&C
2013-04-18 23:42:53 -07:00
Matthias Mailänder
c640daba85 Merge pull request #3109 from psydev/cncmap
updated map, dead in motion (redux)
2013-04-18 23:39:24 -07:00
Matthias Mailänder
62962d1039 Merge pull request #3108 from psydev/d2k-balance
D2K--QuadRockets and Bazooka are no longer "high"
2013-04-18 23:38:53 -07:00
psydev
7231586e94 updated map, dead in motion (redux) 2013-04-18 20:10:00 -07:00
psydev
78b123deb4 QuadRockets and Bazooka are no longer "high"
Quad spam can be potentially very powerful. Gameplay-wise, one should be able to avoid their powerful missiles by hiding behind a building or a wall.
It doesn't necessarily make much sense that a vehicle low to the ground should be able to shoot over things perfectly. Same for infantry. 
The advantage of shooting high should be reserved for units like artillery, so you can put them behind walls or other obstacles. Makes gameplay more interesting and dynamic. 

TowerRockets will stay high.
2013-04-18 19:34:19 -07:00
Chris Forbes
fa76526d42 Merge pull request #3101 from psydev/patch-1
d2k-tanks get increased spread, 3 -> 6
2013-04-18 17:31:33 -07:00
psydev
75b86269cf added stealth trike to show up in crates 2013-04-18 16:47:54 -07:00
psydev
8178894234 tanks get buff vs. light armor
Tanks are a little under-performing vs vehicles. They should be able to dish out damage closer to as fast as light vehicles do to each other.
2013-04-18 16:44:34 -07:00
psydev
05e6581a4a increase turret strenght vs. vehicles a bit
gun tower should dispatch light vehicles as fast as the heavy.
turret got little buff vs. tanks since it's much weaker than gun.
2013-04-18 16:43:08 -07:00
Matthias Mailänder
ef20009310 1 net tick is 120 ms and good order latency should be 2-3
color code names in lobby accordingly
2013-04-18 23:46:26 +02:00
Chris Forbes
f87375422b Merge pull request #3103 from ScottNZ/missions
Add `Required` slot checking in lobby logic. Set up needed player slots as Required for missions
2013-04-18 14:34:00 -07:00
Chris Forbes
0f519cf747 Merge pull request #3093 from Mailaender/ralint-sequences
Added RALint check for missing sequence definitions and fixed them in d2k mod
2013-04-18 14:32:10 -07:00
Matthias Mailänder
d2a6781e7e set dynamic order lag when client with highest latency leaves
hide Ping again from the players, write it to server.log instead
just make everything silently work to not discriminate clients
2013-04-18 17:29:08 +02:00
Matthias Mailänder
f8e44b792f adjust order latency dynamically by client ping, closes #2990 2013-04-18 16:18:17 +02:00
Matthias Mailänder
7f835cf438 display ping when player joins lobby, closes #2124 2013-04-18 16:18:17 +02:00
Scott_NZ
493811c0d0 Add Required slot checking in lobby logic. Set up needed player slots as Required for missions 2013-04-19 00:16:13 +12:00
psydev
fafe723841 tanks get increased spread, 3 -> 6
Tanks get chewed up pretty good by bazookas, and dont do much damage to infantry. This will help a bit to hurt infantry that are clumped up in the same cell.
2013-04-18 01:47:24 -07:00
dan9550
e24608ff31 A Drop Zone map for C&C 2013-04-18 17:41:54 +10:00
Matthias Mailänder
ebe9805e5b separate UPnP from Game/Server into it's own class 2013-04-18 00:04:00 +02:00
Chris Forbes
1db4cb1867 Merge pull request #3096 from Mailaender/make-docs
Fixes Documentation.html indentions
2013-04-17 14:34:54 -07:00
Chris Forbes
47cef088c2 Merge pull request #3097 from Mailaender/disable-mono-nat
Don't try discover routers by default and expose setting to GUI
2013-04-17 14:34:36 -07:00
Matthias Mailänder
fc6918a67b don't try discover routers by default and expose settings to GUI
- added verbose NAT discovery checkbox to Debug settings
- removed useless longTickThreshold slider for additional space
2013-04-17 23:27:18 +02:00
Matthias Mailänder
9c331d1be5 add an extra tab to make docs output
to fix the indentions with non-GitHub-flavored Markdown
2013-04-17 22:44:45 +02:00
Matthias Mailänder
28299d28dc Merge pull request #3088 from psydev/bleed
C&C balancing
2013-04-17 06:19:32 -07:00
psydev
0b6d207810 updated map, no_escapism 2013-04-17 06:11:56 -07:00
psydev
12eff5141d reduced FIX cost from 600 to 500 2013-04-17 06:11:55 -07:00
psydev
8fcef92537 making SAM site open a bit faster 2013-04-17 06:11:55 -07:00
psydev
8611a48396 nerf guard tower vs. heavy armor; misc. slight
if people want to take out tanks, they should build a turret. Right now the guard tower hits as strong as a tank shell, roughly.
Reducing advanced tower's damage vs. infantry. Its focus should be more on vehicles. It still is ok vs. infantry with spread of 6, but not supposed to be infantry killer, per se.
Increasing inaccuracy slightly. (3 -> 5)
-reducing turretgun vs. infantry slightly
2013-04-17 06:11:54 -07:00
psydev
22b5217c9b nerf GDI turrets
It's really difficult to kill guard towers once they're up. The only reliable ways are to try to take out their power with airstrikes/orcas/etc. or use artillery from a distance. They are supposed to be tough but they are a bit too much.
Guard tower HP should be nerfed because they are wickedly hard to kill. Adv. tower's power should increase because they are annoying when sprawled everywhere and really hard to take out once established.
2013-04-17 06:11:54 -07:00
psydev
b406b1d2e0 sniper range inreased 5 -> 6
Nerfed sniper earlier from 7 -> 5.5. But since decimals dont mean jack in ORA, it's 5.
Since the sniper does cost 10x as much as infantry, and is a top tier unit, it should have some advantage with its sniper rifle in range to be useful on the battlefield. 5 just isn't enough.
2013-04-17 06:11:54 -07:00
psydev
396a82987e increas TakeCover crawl speed 50% -> 60%
Seems like taking cover is a liability much more than a protection. I think it's better if infantry get out of the way of artillery rather than slow down and stay in its way. It's frustrating watching your infantry die pointlessly.

Instead of this, a reasonable alternative might be to double-click orders for your infantry to force them back up.
2013-04-17 06:11:53 -07:00
psydev
e604ac44b2 mammoth missiles vs. infantry 30% -> 40%
mammoth should be vulnerable to infantry, but right now it's a bit too weak vs. infantry, given its cost.
2013-04-17 06:11:53 -07:00
psydev
8417d1d54a reduce conyard hp 1500 -> 1400
to guarantee ion + airstrike will kill it.
2013-04-17 06:11:52 -07:00
psydev
7e2faa89af artillery adjustments
nod artillery range decreased from 12 -> 11
mlrs vs. wood increased 25% -> 30% (it's very slow vs. buildings right now. Good but maybe too slow)
2013-04-17 06:11:52 -07:00
psydev
a27e14b984 decreasing crush evasion from 75% -> 60% 2013-04-17 06:11:51 -07:00
psydev
1c5d2a4a52 reducing Adjacent from 5 -> 4
buildings are too far apart these days.
2013-04-17 06:11:51 -07:00
Matthias Mailänder
43601cfb7e update the d2k missing content files readme text 2013-04-17 14:13:26 +02:00
Matthias Mailänder
c35e27e841 add missing d2k sequences
- removed some hidden ra fallbacks
- added waypoint/spawn for editor
2013-04-17 14:13:26 +02:00
Matthias Mailänder
2682dc8d83 added RALint check for missing sequence definitions
closes #2283
2013-04-17 14:13:21 +02:00
Matthias Mailänder
282268c2a0 Merge pull request #3086 from psydev/bleed
d2k: Ix research now requires Hi-tech-fac as pre-req
2013-04-17 00:23:05 -07:00
psydev
12814371b1 Ix research now requires Hi-tech-fac as pre-req 2013-04-16 17:26:25 -07:00
Chris Forbes
6fb1c4879a Merge pull request #3070 from Mailaender/d2k-assets-completion
Ripped the Dune 2000 assets completely and added some polishing
2013-04-16 12:15:24 -07:00
Chris Forbes
a23a1718f5 Merge pull request #3083 from psydev/cnc
APC gun was overpowered vs. heavy. Back at 30%
2013-04-16 12:15:05 -07:00
psydev
17478c858a APC gun was overpowered vs. heavy. Back at 30% 2013-04-16 04:49:02 -07:00
Matthias Mailänder
e17ca5a27c Merge pull request #3081 from psydev/cnc
added new map, The Hourglass, by Dan9550
2013-04-16 03:51:34 -07:00
Matthias Mailänder
3b8f31f992 Merge pull request #3080 from psydev/d2k
d2k updates
2013-04-16 03:49:03 -07:00
psydev
456b225c42 map updated & mcv speed 6 2013-04-16 03:10:58 -07:00
psydev
b688b268a0 added Brimstone map by sanedisruption 2013-04-16 03:03:46 -07:00
psydev
faa04e9788 added new map, The Hourglass, by Dan9550 2013-04-16 02:10:42 -07:00
psydev
ab5082a9cb updated dune_boogie.oramap 2013-04-16 01:27:32 -07:00
psydev
a66bcad133 changed tank speeds & rotations 2013-04-16 01:19:19 -07:00
psydev
810d995661 weapon balance stick
quad slightly buffed vs. wood
artillery buffed vs. wood
firedelay removed for artillery
rifle man vs. heavy reduced to 15%
2013-04-16 01:04:24 -07:00
psydev
f3e867c5c7 changed spice regeneration speed. 2013-04-16 00:58:14 -07:00
Matthias Mailänder
19d1211705 Merge pull request #3077 from psydev/bleed
@psydev's latest work on D2K
2013-04-16 00:31:30 -07:00
psydev
d4d627263a turret gun "high"=yes 2013-04-15 22:03:26 -07:00
psydev
ac5378e41a modified aircraft & airstrike + misc chgs 2013-04-15 22:01:43 -07:00
psydev
2304f3e6cc sped up air units 2013-04-15 21:45:52 -07:00
psydev
617d66a5f7 buffed devastator gun 2013-04-15 21:27:41 -07:00
psydev
53e0f52763 reduced atomic damage vs. heavy & concrete 2013-04-15 21:20:03 -07:00
psydev
7157cbdf49 reduced ordos tank spd 10 -> 9 2013-04-15 21:09:57 -07:00
psydev
939cd8a942 fixed devastator prerequisite 2013-04-15 21:09:07 -07:00
psydev
28c1075334 buff nuke some more 2013-04-15 21:04:44 -07:00
psydev
4b4a1a8b86 removed turret from burning turret husk
This way it's more clear that it's dead.
2013-04-15 20:56:01 -07:00
psydev
255ea6249a husk burn times shortened 2013-04-15 20:53:15 -07:00
psydev
b0f16b0de6 units do not detect cloaked by default anymore. 2013-04-15 20:45:14 -07:00
psydev
7f9b22a17f gave quad better scout range; reduced trike's. 2013-04-15 20:44:07 -07:00
psydev
66a3cae31c updated veh speeds on rock, sand, dunes. 2013-04-15 20:42:00 -07:00
psydev
086df23140 reduced trike, milssiletank & e1 dmg vs. wood 2013-04-15 20:30:21 -07:00
psydev
30e07e027d increased harvester & mcv HP 2013-04-15 20:18:47 -07:00
psydev
5f07988e97 removed "InitialStance: Defend"
If people want this, put it in the defaults.yaml.
Artillery units still have "Defend" as initial stance.
2013-04-15 20:16:37 -07:00
psydev
e25f3b7504 removed InitialStance: Defend from infantry 2013-04-15 20:13:47 -07:00
psydev
7b79ad92a3 added 7% odds cloak crate. Changed money crate 2013-04-15 20:02:06 -07:00
psydev
2b9cc149f9 changed price of hi-tech and ix-research 2013-04-15 19:41:33 -07:00
psydev
d0f261c6b9 changed missiletank to Hitech 2013-04-15 19:32:44 -07:00
psydev
e59a61a747 removed slowdown for starport. Infantry slow 3-> 2
Starport lack of slowdown is made up for the fact that no units can land (nor more ordered) until you get power back up again. 
Infantry slowdown reduced to 2.
2013-04-15 19:17:40 -07:00
psydev
7d81a1d814 removed prereqs for mcv in race*.yaml 2013-04-15 19:14:47 -07:00
psydev
745078945e changed palace to wood 2013-04-15 19:02:05 -07:00
psydev
df6d9a17f3 reduce artillery dmg. vs concrete 2013-04-15 18:58:57 -07:00
psydev
8199cf275e buff nuke 2013-04-15 18:55:35 -07:00
psydev
40376234a7 inc. palace detection range; outpost renders detec 2013-04-15 18:50:26 -07:00
psydev
b23a889a95 changed MCV pre-req to "repair" 2013-04-15 18:46:22 -07:00
psydev
9010bbacfb move over Stealth Trike in palette build order 2013-04-15 18:44:02 -07:00
psydev
5235004633 change palette build order 2013-04-15 18:42:45 -07:00
psydev
01b8579e59 changed palette build order 2013-04-15 18:40:46 -07:00
psydev
ae5e5b6309 reduced Repair cost 800 -> 500 2013-04-15 18:36:03 -07:00
psydev
6bfda746e9 added custom prereq: starport; radar detects cloak 2013-04-15 18:34:03 -07:00
psydev
bc1bd9b10d remove dependency for starport's quad & harv 2013-04-15 18:32:29 -07:00
psydev
b1b7e6b20f added "appear1" sound effect, for stealth trike 2013-04-15 18:18:14 -07:00
psydev
ddbd25d8cc Merge branch 'bleed' of https://github.com/psydev/OpenRA into bleed 2013-04-15 18:17:53 -07:00
psydev
8b79910749 added Stealth Raider Trike unit 2013-04-15 18:17:44 -07:00
psydev
e46498d77f increased raider trike cost & hp
Increased raider trike cost to differentiate it... (Been increasing its strength a bit). Raised HP a bit to compensate.
2013-04-15 18:04:20 -07:00
psydev
bc93081b98 ordos raider rike trike damage inreased vs heavy 2013-04-15 17:59:39 -07:00
psydev
20fb4353f5 quad refurbish; turretgun range increase
quad damage divided into two bursted missiles
quad designed to attack heavy armor now
quad range increased to 7 (but sight range only 6)
turretgun range increased to 7 to compensate
quad burst delay added.
2013-04-15 17:52:18 -07:00
psydev
25b731cb50 increased damage of trikes vs. heavy 10% to 20% 2013-04-15 17:37:27 -07:00
psydev
3bb1a27d6f mcv and harv hp increased 600 -> 700 2013-04-15 17:30:44 -07:00
psydev
5804e3908a Increased ROF of turrets 2013-04-15 17:28:38 -07:00
psydev
2bd9e23650 silo capacity inc. 1500 -> 2000 2013-04-15 17:22:26 -07:00
psydev
49d4c2e66f outpost cost reduced 1000 -> 700 2013-04-15 17:18:45 -07:00
psydev
e8c4e913a3 Merge branch 'bleed' of https://github.com/psydev/OpenRA into bleed 2013-04-15 17:14:37 -07:00
psydev
9ec49d8a2b refinery capacity reduced from 3000 -> 2000 2013-04-15 17:11:09 -07:00
psydev
6a2ce922b0 removed bib from silo 2013-04-15 17:10:24 -07:00
psydev
6baf7dbf24 missile tank HP lowered to 90 2013-04-15 17:09:03 -07:00
psydev
2c561b220c added FireDelay to artillery units 2013-04-15 17:05:26 -07:00
psydev
c776f8a1e2 rocket tank ROF inc. 2013-04-15 17:03:22 -07:00
psydev
79278c59a8 artillery-minrange=2, vs. wood=50% 2013-04-15 16:55:25 -07:00
psydev
1a816e73c3 Merge branch 'bleed' of https://github.com/psydev/OpenRA into bleed 2013-04-15 16:42:56 -07:00
psydev
f8771d8300 mcv.starport requires heavy -- harkonnen 2013-04-15 16:41:02 -07:00
psydev
57d812c78d mcv.starport requires heavy -- ordos 2013-04-15 16:40:33 -07:00
psydev
03861d3fbe mcv.starport requires heavy -- atreides 2013-04-15 16:39:59 -07:00
psydev
494481c7e5 changed missile artillery 2013-04-15 16:33:33 -07:00
psydev
de683ea9a2 changed artillery 2013-04-15 16:30:17 -07:00
psydev
655038fa2c e1 vs. light inc. 30% -> 40%
so they have snowball's chance in hell vs. trikes
2013-04-15 16:25:20 -07:00
psydev
91e5a8ba04 shroud removed! :) 2013-04-15 16:12:31 -07:00
psydev
ec50df79f7 Merge branch 'bleed' of https://github.com/psydev/OpenRA into bleed 2013-04-15 16:09:23 -07:00
psydev
bffdec2252 e1 vs. heavy 15% -> 20% 2013-04-15 16:08:16 -07:00
psydev
6e0ab1f955 increased mcv and harvester speed from 6 -> 7 2013-04-15 16:03:22 -07:00
psydev
8488a7980f lower power use of repair pad 2013-04-15 16:00:59 -07:00
psydev
a6238b2da0 change prereq of mcv 2013-04-15 15:59:50 -07:00
psydev
8b498d93b6 rocket turret visual range increased 2013-04-15 15:54:55 -07:00
psydev
4a26ad7c30 gun turret visual range increased 2013-04-15 15:52:34 -07:00
psydev
a2097b7640 fixed typo in queue build speed 2013-04-15 15:51:01 -07:00
psydev
1819be392d remove mcv prereq 2013-04-15 15:49:42 -07:00
psydev
cec2033274 remove prereqs for combat tank, mcv 2013-04-15 15:48:48 -07:00
psydev
5b199ce7ea removed prerequisites for combat tank, trike 2013-04-15 15:47:21 -07:00
Matthias Mailänder
58d9a2839a Merge pull request #3072 from ScottNZ/balance
RA balance
2013-04-15 09:28:24 -07:00
Scott_NZ
e6507b6acf Adjust ctnk prerequisites to atek,pdox. Let ctnk crush the same things normal tanks can. Adjust ctnk/ttnk tooltip descriptions 2013-04-16 03:52:58 +12:00
Scott_NZ
bd1995e89d Increased mammoth tank turret ROT from 1 to 2 2013-04-16 02:27:34 +12:00
Scott_NZ
86fc743862 Increased price of ctnk to 1350 2013-04-16 02:27:33 +12:00
Scott_NZ
6d0d7ca764 Buff mechanic repair from -10 to -13 2013-04-16 02:27:33 +12:00
Scott_NZ
8839d1f441 Buff medium tank 90MM damage from 30 to 40 2013-04-16 02:27:33 +12:00
Scott_NZ
f6955eabc1 Buff ctnk and ttnk HP values to 400 2013-04-16 02:27:33 +12:00
Matthias Mailänder
eee36c90b5 Merge pull request #3071 from psydev/bleed
Dune 2000 balancing
2013-04-15 05:58:15 -07:00
psydev
72553ae388 reduced tank & quad dmg. vs wood & concrete
buildings die too easily.
And turrets need to last longer against tanks, etc.
2013-04-15 05:55:15 -07:00
Matthias Mailänder
b7b8177b99 Merge pull request #3063 from pchote/repairable-bridges
Repairable bridges, closes #2619
2013-04-15 05:49:56 -07:00
psydev
ce26750051 remove high-tech as pre-requisite for Missile Tank 2013-04-15 05:47:22 -07:00
psydev
d47d541bba increase spread of turrets; gun dmg vs infantry 2013-04-15 05:44:49 -07:00
psydev
d08af21df2 increase turret sight/detection range 2013-04-15 05:41:15 -07:00
psydev
4e7807d6d4 make starport faster in exchange for costing more 2013-04-15 05:37:19 -07:00
psydev
96da2fbf9e fix combat tank to have no pre-reqs 2013-04-15 05:34:24 -07:00
psydev
8579f83e63 updated two maps, dune_boogie & dead_in_motion rdx 2013-04-15 05:30:19 -07:00
Paul Chote
921c7b4fb1 Add invisible repair zones to bridges. 2013-04-15 23:22:08 +12:00
Matthias Mailänder
59afc46ab5 separate ra chrome for better reusability in d2k 2013-04-15 13:11:42 +02:00
Matthias Mailänder
194f8b0dfc don't package the PhotoShop files 2013-04-15 13:11:42 +02:00
Matthias Mailänder
f71dbca8e7 removed blood splatter idle animation for d2k rifle infantry 2013-04-15 13:11:42 +02:00
Matthias Mailänder
4a2473a1a5 customisable icon size in build palette for d2k, fixes #2521 2013-04-15 13:11:42 +02:00
Matthias Mailänder
f80180509c added Jes suggestions on d2k R8 to SHP conversion
- windtrapzaps is actually the IX structure animation
- rpg, missile, missile2: frame order reversed like vehicles
2013-04-15 13:11:42 +02:00
Matthias Mailänder
18b457af37 overhauled d2k buttons and alternate splash by Sardaukar 2013-04-15 13:11:42 +02:00
Matthias Mailänder
a7ace54ecb BuildingCapture, ActorLost now use notifications.yaml
less redundancy, aggregates notification audio files
2013-04-15 13:11:41 +02:00
Matthias Mailänder
8fa1fc2345 mapped DATA.R8 completely, fixes #2341
d2k is now completely independened from RA MIX/SHP files
2013-04-15 13:11:35 +02:00
Paul Chote
08cf941fef Add BridgeHut and repair activities. 2013-04-15 23:11:21 +12:00
Paul Chote
115da5c770 Make bridges repairable. 2013-04-15 23:11:21 +12:00
Paul Chote
d3959d21ca Add a ParentActorInit for FreeActor spawns. 2013-04-15 23:11:20 +12:00
Paul Chote
4ca777597f Replace UnitTraitOrderTargeter with TargetTypeOrderTargeter.
This also makes naval buildings untargetable for c4 and demo trucks, as they don't make much sense.
2013-04-15 23:10:57 +12:00
Matthias Mailänder
7470189be1 Merge pull request #3066 from psydev/bleed
d2k: cleaning up weapons & pre-requisites
2013-04-15 03:29:45 -07:00
psydev
89fc587731 fix siege tank, combat, trike again 2013-04-15 03:24:07 -07:00
psydev
8b0cfaaeb1 fixed trikes, unit stats. 2013-04-15 03:07:25 -07:00
psydev
b4db72702c updated weapons with better values. 2013-04-15 02:57:55 -07:00
psydev
357b6a8e77 changed unit costs at starport; fix starport 2013-04-15 02:54:59 -07:00
psydev
2e31f9318c modified custom pre-requisites for buildings 2013-04-15 02:40:56 -07:00
Matthias Mailänder
234f32860e Merge pull request #3068 from twhitney11/twhitneyKeyboardScrollFix
Fixes #3049 Deselecting Edge Scroll Loses Ability to Use Arrow Scroll Too
2013-04-15 02:27:12 -07:00
Matthias Mailänder
b8e96b1957 Merge pull request #3069 from psydev/patch-1
fix artillery explode
2013-04-15 02:22:53 -07:00
Matthias Mailänder
ee43227fcf Merge pull request #3067 from ScottNZ/dog
Fixed attack dog voice
2013-04-15 02:20:25 -07:00
psydev
ad9aef635b fix artillery explode
For some reason artillery wasn't exploding. I had set it at 75% odds last time I edited it. Just making it explode again.
It really needs to explode. It only costs $600 and is pretty powerful. This is its drawback, to make it vulnerable if player bunches them up.
2013-04-15 00:31:59 -07:00
psydev
953bda65de changed cost of various structures.
money is limited, shouldnt be wasted on pointless things that take extra
time building for no reason. Like, power stations, barracks.
Some changes inspired by original dune 2000 stats. Other buildings left as
is, because we're not trying to copy the original game.
Light factory made super cheap to distinguish it from heavy factory. It
should make poor-man's units, relatively quickly. Things that sort of
suffice at countering better heavy units like tanks, while pursuing a
different strategy.
No buildings cost more than $2000, because it's not really necessary to
have things be that expensive (from what I can tell). It just wastes time
and cuts down possibilities for strategy by making certain things out of
reach and forcing everyone into similar strategies.
Research facilities that unlock units (outpost, high tech factory,
research facility) all ~1000.
Starport made 2000 so that it's not too cheap since it's good, but not
inaccessible as a mid-game strategy.
2013-04-14 23:34:28 -07:00
psydev
9728992997 re-ordered structures list 2013-04-14 23:27:19 -07:00
Tyler Whitney
881e8f705a Update ViewportScrollControllerWidget.cs
Moved Scroll() out of the if statement checking to see if edge scrolling was enabled thereby fixing bug introduced that stops keyboard from working if edge scrolling is not enabled.
2013-04-15 03:08:22 -03:00
Scott_NZ
306fc98917 Fixed attack dog voice 2013-04-15 16:03:01 +12:00
psydev
264ffcba32 Gave buildings except turrets AutoTargetIgnore
Doesn't really make much sense to auto-target buildings that are no
threat. Units should fire at units or turrets.
2013-04-14 17:38:02 -07:00
psydev
d1796a17d4 necessary fix for mod.yaml... was broken 2013-04-14 16:05:52 -07:00
psydev
dc5d7747df rename e3 weapon 'bazooka'; removing aa for now 2013-04-14 15:59:01 -07:00
psydev
a3458735fc cleaning up pre-requisites: refinery 2013-04-14 13:45:12 -07:00
psydev
24a09b1eb7 explosions added in weapons/ folder; defaults l8r 2013-04-14 13:42:06 -07:00
psydev
43dc5bbf70 added separate explosions.yaml for weapons 2013-04-14 13:37:40 -07:00
Paul Chote
e545865599 Add Selectable field to Selectable.
There are a bunch of bogus assumptions about
targetable actors being selectable. These aren't
easily fixed, so this add a Selectable field that
can be diabled for things we want to target, but
not select.
2013-04-15 08:06:52 +12:00
Paul Chote
e76c746b61 Rewrite Enter and related activities.
The unit will now path to the nearest adjacent cell, drag inside, do the inner activity, then (if still alive) drag back to its original
location.

This fixes:
 - Mismatch in logic between Enter and MoveAdjacentTo,
   which causes an infinite loop.
 - Building capturing failing from certain directions.
 - Being unable to enter buildings on unpathable tiles.
 - Units being stranded inside a building if the requirements
   for the inner order aren't met.
2013-04-15 08:05:37 +12:00
Paul Chote
8676562d47 Fix bogus pathability check.
This fixes units on pathable bridge tiles from
being killed on bridge death (they were failing
the check against themselves).
2013-04-15 08:04:44 +12:00
Paul Chote
a1313b518d Prevent multiple bridges spawning at the same location. 2013-04-15 08:04:25 +12:00
Matthias Mailänder
ff282eafa2 Merge pull request #3061 from psydev/bleed
fixed spice regen rate; rename some weapons to original names
2013-04-14 05:54:13 -07:00
psydev
3855c84e89 renaming some weapons to their original d2k names 2013-04-13 19:33:52 -07:00
psydev
e0697771a5 (reset spice bloom for now) & refinery tickrate 2013-04-13 19:31:28 -07:00
Chris Forbes
a35be26feb Merge pull request #3059 from cjshmyr/master
SHP updates
2013-04-13 19:30:29 -07:00
Chris Forbes
53a75ac794 Merge pull request #3060 from psydev/bleed
slight mod. harv's unload rate & display of $ amt.
2013-04-13 19:30:04 -07:00
psydev
03504c28f9 slight mod. harv's unload rate & display of $ amt. 2013-04-13 19:14:58 -07:00
Curtis Shmyr
7babb1b96c Added a faction superpower icon for armor airdrop 2013-04-13 20:06:44 -06:00
Curtis Shmyr
10ead15023 Update mech.shp to be the HIRES sprite 2013-04-13 20:03:23 -06:00
Matthias Mailänder
3df51ed601 Merge pull request #3058 from Mailaender/maintenance
Removed unneccessary dependencies from Travis configuration
2013-04-13 12:12:36 -07:00
Matthias Mailänder
4c4acde590 removed unneccessary dependencies from Travis configuration 2013-04-13 21:09:19 +02:00
Matthias Mailänder
711aa60562 Merge pull request #3057 from Mailaender/maintenance
Fixed some rpmlint warnings
2013-04-13 09:49:06 -07:00
Matthias Mailänder
50a6ed7d0e Merge pull request #3056 from psydev/bleed
d2k balance changes
2013-04-13 09:48:50 -07:00
psydev
7c062a7f45 removed bib from towers 2013-04-13 09:36:55 -07:00
psydev
22cf0c7de6 new map, dune_boogie 2013-04-13 09:13:23 -07:00
Matthias Mailänder
40ac4d52a2 remove executable bits from map.yaml files 2013-04-13 18:00:29 +02:00
Matthias Mailänder
7921bed1d7 remove duplicate SHP 2013-04-13 17:57:35 +02:00
psydev
fbfa209de9 d2k balance changes 2013-04-13 08:25:55 -07:00
Curtis Shmyr
f7f4170ba9 Merge pull request #3052 from chrisforbes/husk-render-order
render husks under other actors
2013-04-13 01:16:36 -07:00
Chris Forbes
e66ea6060f render husks under other actors 2013-04-13 20:04:23 +12:00
Chris Forbes
c9d5f42dce Merge pull request #2996 from Mailaender/serverbrowser-usability
Added filters and ping to server browser
2013-04-13 00:55:41 -07:00
Curtis Shmyr
51fa777018 Merge pull request #3050 from chrisforbes/bug-3042
fix enemies showing on minimap under fog
2013-04-13 00:54:39 -07:00
Curtis Shmyr
cbd8032acf Merge pull request #3051 from chrisforbes/fix-bogus-shroud-disable
fix bogus shroud disable
2013-04-13 00:43:38 -07:00
Curtis Shmyr
1e5e092aec Merge pull request #3044 from chrisforbes/mapchooser-random
move `random map` button in ra into mapchooser
2013-04-13 00:40:44 -07:00
Chris Forbes
73483877af fix bogus shroud disable
This code runs everywhere -- and so was clobbering every client's
RenderedPlayer to the player who was setting their cheat.
2013-04-13 19:35:33 +12:00
Chris Forbes
405975bd6e fix enemies showing on minimap under fog 2013-04-13 19:15:53 +12:00
Chris Forbes
3eed67c61b Merge pull request #2945 from bidifx/syncrep
fixes #2941 -  dump fields in syncreport
2013-04-12 12:10:48 -07:00
Matthias Mailänder
27aae11d9f Merge pull request #3048 from psydev/patch-1
making FIX cheaper, since no one uses it. Lower HP
2013-04-12 10:38:04 -07:00
psydev
a29d4759b6 making FIX cheaper, since no one uses it. Lower HP
Nobody uses repair bay, because it's not a pre-requisite for anything, and it's expensive. Reducing cost from $1200 to $600.
To compensate for its lower value, its HP are being lowered as well, from 800 to 400. Now it should be killable with an airstrike, which is about right. 

To anyone paying attention: there has been some discussion over whether repairs should be cheaper. I am agnostic on the issue for now. How about we see if people like the repair bay more now and consider using it, before making further balance changes? Open to discussion.
2013-04-12 10:28:53 -07:00
ScottNZ
4804b9d460 Merge pull request #3045 from psydev/patch-1
shortened conyard cooldown 5 -> 4 secs
2013-04-12 06:51:37 -07:00
psydev
eae10973c2 shortened conyard cooldown 5 -> 4 secs
The cooldown on the construction yard building is too damn long.
2013-04-12 05:26:33 -07:00
Matthias Mailänder
c9180aaf86 simplify the selection boxes and use existing checks 2013-04-12 12:17:31 +02:00
Chris Forbes
0dc6f33752 move random map button in ra into mapchooser 2013-04-12 21:48:36 +12:00
Matthias Mailänder
2cdeb112fe polish serverbrowser filters 2013-04-12 11:46:27 +02:00
Matthias Mailänder
43492b920d Ping.SendAsync to reduce UI freezing 2013-04-12 11:36:53 +02:00
Matthias Mailänder
1069a89332 made filters and ping button optional 2013-04-12 11:36:53 +02:00
Matthias Mailänder
2a9cfc6203 added game server pinging 2013-04-12 11:36:52 +02:00
Matthias Mailänder
5eff33cc65 added serverbrowser filters 2013-04-12 11:36:52 +02:00
Matthias Mailänder
b6d6757690 Merge pull request #3042 from chrisforbes/bug-3023
Fixes #3023 crash in ObserverShroudSelectorLogic if two players have the same name
2013-04-12 02:29:07 -07:00
Chris Forbes
829af80c95 fix crash in ObserverShroudSelectorLogic if two players have the same name 2013-04-12 21:24:06 +12:00
Scott_NZ
54a76070d5 Prevent Allies from destroying Soviet base in Desert Shellmap 2013-04-12 21:22:40 +12:00
Chris Forbes
b649b4b7bb Merge pull request #3020 from pchote/shroud-sanity
Refactor per-player shrouds.
2013-04-12 01:53:31 -07:00
Matthias Mailänder
4e33f26859 Merge pull request #3028 from Mailaender/nat-settings
Better name for automatic port forwarding and enabled by default if all pre-checks end well.
2013-04-12 01:22:15 -07:00
Matthias Mailänder
50b9d68c12 Merge pull request #3035 from psydev/patch-1
Making bridges indestructible for now.
2013-04-12 01:20:49 -07:00
Matthias Mailänder
e83f80d6be Merge pull request #3030 from Mailaender/shellmap-polish
Removed some annoyances from the RA temperat shellmap
2013-04-12 01:18:47 -07:00
Matthias Mailänder
25e33be52e Merge pull request #3029 from Mailaender/lintian-fix
Changes DEBIAN/md5sums permissions to 0644
2013-04-12 01:18:33 -07:00
Scott_NZ
e8ad630e9d Add unit production and other buildings to desert shellmap 2013-04-12 19:32:43 +12:00
Scott_NZ
f931706664 Rework centre of desert shellmap. Adjust unit balancing. 2013-04-12 18:24:59 +12:00
psydev
b292acfedb housekeeping: moved arty over some more in menu 2013-04-11 19:37:22 -07:00
psydev
82d99b4e98 fix Chinook "returning to base" problem
Chinook had "Re-arms at: HPAD" entered in its rules, even though it has no weapons. This is what caused it to return to base when you hit 'F' instead of land.
Now it lands again when you hit F. *phew* so happy :)
2013-04-11 14:52:38 -07:00
psydev
777cc626ce housekeeping: moveing artillery BuildPaletteOrder 2013-04-11 14:42:15 -07:00
psydev
a5e899999c Sniper range reduced from 7 -> 5.5
Sniper range of 7 seems ridiculous, since it's a one-shot kill, and you can build multiple. (I support building multiple). Surprised I never noticed this issue before.
The range in C&C 95 was 5.5. 
The ScanRadius is set to 5, which is probably why we haven't noticed any OP problems. 
It's also a bit ridiculous since the unit's sight radius is only 5.
2013-04-11 11:33:40 -07:00
psydev
b21e0f97d0 replaced all explosion numbers with names
Explosions all have a name description now instead of a vague number.
2013-04-11 08:41:41 -07:00
psydev
d8312c73a4 Making bridges indestructible for now.
Making bridges indestructible.
Rationale: 
-many maps don't work when bridges are destructible (most or all of the crossings are bridges)
-bridges will be repairable in the future. At this point, an engi can come and re-open it, but in the meantime, they shouldn't be destroyed.
-if someone wants to make a map with destructible bridges, they still can, by editing the .yaml themselves. This should be the default, though.




(FWIW, bridges were not destructible in C&C 1.)
2013-04-11 08:39:26 -07:00
Paul Chote
400ad49de0 Allow maps/mods to properly disable fog or shroud (or both). 2013-04-11 22:36:56 +12:00
Paul Chote
2c680a1831 Fix shroud for observers observing a player after win/loss. 2013-04-11 21:26:49 +12:00
Scott_NZ
c3ec29a14c More shellmap polish. Add another badger paradrop 2013-04-11 02:27:09 +12:00
Matthias Mailänder
821fe02fde polish the temperat shellmap a little
- silence the gun sound a bit
- remove the flickering mig
2013-04-10 15:53:57 +02:00
Matthias Mailänder
99ec55d793 fixes #2797 lintian claims that our package is bad 2013-04-10 15:17:26 +02:00
Matthias Mailänder
23ca044515 allowUPnP is a bad name for automatic port forwards
also check it by default if all those checks went well
2013-04-10 12:45:16 +02:00
Paul Chote
707c86fbbb Fix selection decorations being drawn behind fog. 2013-04-10 22:12:51 +12:00
Paul Chote
9b7bb53287 LocalPlayer.Shroud is never the right shroud. 2013-04-10 21:42:30 +12:00
Paul Chote
248e815d99 More shroud refactoring.
This introduces a hash on Shroud which ShroudRenderer
can observe, removing the need to explicitly twiddle
a dirty flag between objects.

Shroud disabling is now done via RenderPlayer, so
enabling the cheat or winning/losing will now give
vis equivalent to an observer.
2013-04-10 21:08:22 +12:00
Paul Chote
ca8dbce0ef Display selection decorations to allies & observers. 2013-04-10 19:37:04 +12:00
Paul Chote
c428cad70c Refactor per-player shrouds & fix shellmap shroud. 2013-04-10 19:36:03 +12:00
Scott_NZ
6fb6aba9fc Add chinook reinforcements to Desert Shellmap 2013-04-10 19:29:37 +12:00
Scott_NZ
9377a02a6a Add some more Desert Shellmap detail/polish 2013-04-10 19:29:37 +12:00
Chris Forbes
aae6394300 Merge pull request #2965 from ScottNZ/ui
Added support for draggable BackgroundWidgets
2013-04-09 19:31:11 -07:00
Chris Forbes
e2b3d68d8a Merge pull request #3018 from Mailaender/try-catch-mono-nat
Stop Mono.Nat from wreaking havoc for some people.
2013-04-09 14:46:58 -07:00
Chris Forbes
eee09319b6 Merge pull request #3015 from cjshmyr/master
Updated CHANGELOG
2013-04-09 14:30:59 -07:00
Matthias Mailänder
4bd9770126 Merge pull request #3014 from ScottNZ/shellmap
Additional shellmap for RA
2013-04-09 05:01:18 -07:00
Matthias Mailänder
3abe58c4ae more checks for NRE and setting to disable NAT discovery 2013-04-09 13:03:37 +02:00
Matthias Mailänder
1603485b33 catch everything NatUtility does so it does not crash anymore 2013-04-09 12:36:42 +02:00
Curtis Shmyr
654697dc03 Update CHANGELOG 2013-04-08 23:26:32 -06:00
Scott_NZ
5ff317a6b1 Shellmap polish 2013-04-09 16:58:24 +12:00
Scott_NZ
7436fd1613 Adjust medium tank spawn location 2013-04-09 16:58:24 +12:00
Scott_NZ
92efc64602 Add some awesome things to the new shellmap like Chronosphere/Iron Curtain usage and auto unloading of cargo 2013-04-09 16:58:24 +12:00
Scott_NZ
5c3923c4f5 Add civilian nudging for new shellmap 2013-04-09 16:58:24 +12:00
Scott_NZ
455dd98eec Add general attack code to shellmap 2013-04-09 16:58:23 +12:00
Scott_NZ
30ae1186d8 Stirred up the Shellmap water because Fix Open Areas doesn't work for desert water apparently 2013-04-09 16:58:23 +12:00
Scott_NZ
cd9a264f01 Shellmap: Add beginning paradrop and Tanya 2013-04-09 16:58:23 +12:00
Scott_NZ
a897c256c8 Shellmap: Add more Soviet buildings and improve paradrop 2013-04-09 16:58:23 +12:00
Scott_NZ
1e45a9899b Shellmap: Add Viewport movement, coastal attacks and so forth 2013-04-09 16:58:23 +12:00
Scott_NZ
3a66cd75b4 Add Desert Shellmap 2013-04-09 16:58:22 +12:00
Chris Forbes
66eff85aa4 Merge pull request #3003 from Mailaender/build-palette-hotkey-modifier
Resolve hotkey conflicts between build palette and world command widget once and for all
2013-04-08 15:27:53 -07:00
Chris Forbes
8f7819fb24 Merge pull request #3011 from Mailaender/cloaking
Render mines properly again and fix empty camo pillboxes in RA shellmap
2013-04-08 13:55:23 -07:00
Matthias Mailänder
58524a712d Merge pull request #3009 from ScottNZ/mtm-shroud
Fixes a couple of shroud issues
2013-04-08 10:45:46 -07:00
Matthias Mailänder
e7e74aac3c allow the cloak palette to stay empty and use it for mines 2013-04-08 19:29:55 +02:00
Matthias Mailänder
5ba899088c fix empty camo pillboxes in shellmap 2013-04-08 19:15:59 +02:00
Matthias Mailänder
505e3de0c4 Merge pull request #3007 from psydev/patch-1
shortened MSAM name. Tweak cloak time. Fixed desc's.
2013-04-08 08:15:09 -07:00
Matthias Mailänder
5911208553 Merge pull request #3010 from psydev/bleed
updated skull_valley: fixes + now 8-players
2013-04-08 08:11:55 -07:00
Scott_NZ
c173cfa771 Remove extra tab 2013-04-09 03:07:33 +12:00
Matthias Mailänder
1bbc74c910 Merge pull request #3008 from pchote/split-tabs-logic
Split multiple-production-queue widget logic into its own file
2013-04-08 08:06:34 -07:00
psydev
05b7596bfa updated skull_valley. Fixes, and now 8-players 2013-04-08 05:28:17 -07:00
Scott_NZ
f16edfcf98 Fix shroud bug in Monster Tank Madness 2013-04-09 00:18:21 +12:00
Scott_NZ
67fcdb5b91 Remove Shroud.Jank() and make all references to it call Shroud.Dirty() instead 2013-04-09 00:18:08 +12:00
psydev
3ad2689e38 set A.I. max silos to build == 1, to save space
Due to conyard build radius, unnecessary buildings should not be built.
Silo is not really needed, so capping to 1.
2013-04-08 04:36:20 -07:00
psydev
3cc6874da0 APC muzzle flash made single shot inst. of double 2013-04-08 04:20:41 -07:00
psydev
c810d0083a apc gun given recoil 2013-04-08 04:10:15 -07:00
Paul Chote
09efeed105 Use IsHighlighted for settings / ingame menu tabs. 2013-04-08 23:04:23 +12:00
Paul Chote
f368556b23 Merge tooltip support into Button and remove ToggleButton. 2013-04-08 23:01:21 +12:00
Paul Chote
eddc1fc0cf Remove duplication between ButtonWidget and ToggleButtonWidget. 2013-04-08 22:55:01 +12:00
Paul Chote
71999bdc52 Break production tabs logic into a separate file.
Also unhardcodes the production types.
2013-04-08 22:32:32 +12:00
psydev
415df59e20 shortened MSAM name. Tweak cloak time
Mobile SAM launcher name shortened. 
Stealth tank time increased 80 -> 90 until https://github.com/OpenRA/OpenRA/issues/2898 is addressed.
Shortened a few other names.
Fixed some descriptions.
2013-04-08 03:26:39 -07:00
Paul Chote
21833f34b0 Remove leftovers from moving cheats into options menu. 2013-04-08 21:45:45 +12:00
Matthias Mailänder
29ca520d89 Merge pull request #3006 from psydev/bleed
updated skull_valley map. Now supports 6 players.
2013-04-08 02:45:01 -07:00
Matthias Mailänder
f0e88b55f6 Merge pull request #3005 from pchote/observer-shroud
Implement observer shroud selector in C&C
2013-04-08 02:44:44 -07:00
Matthias Mailänder
a98cfd8445 Merge pull request #3004 from pchote/sidebar-mouse-interaction
C&C widget mouse event polish
2013-04-08 02:40:35 -07:00
psydev
fbf74a0758 updated skull_valley map. Now supports 6 players. 2013-04-08 02:39:16 -07:00
Matthias Mailänder
c421399e45 Merge pull request #2991 from pchote/sane-pause-logic
Fix pause logic and C&C cheats menu
2013-04-08 02:35:25 -07:00
Paul Chote
c52bd4bf82 Implement observer shroud selector in C&C. 2013-04-08 21:24:09 +12:00
Paul Chote
87c107c825 Increase default tooltip delay to 200ms. 2013-04-08 20:25:13 +12:00
Paul Chote
5580ad4663 Fix C&C sidebar cursor/world cursor interaction. Fixes #2989. 2013-04-08 20:16:09 +12:00
Matthias Mailänder
70b40a54be build palette hotkeys require ALT modifier to avoid conflicts
changed back the unit action hotkeys scatter / stance cycle
2013-04-08 09:37:54 +02:00
Chris Forbes
0cf4c7ccb9 Merge pull request #2993 from Mailaender/non-fatal-bad-nat-response
Fixes a crash when the discovered NAT device rejects fetching the current port mapping
2013-04-07 14:07:01 -07:00
Chris Forbes
a694d10d2f Merge pull request #2998 from Mailaender/lobby-crash
Don't crash when host leaves the lobby, fixes #2980
2013-04-07 13:14:53 -07:00
Matthias Mailänder
6b164672eb Don't crash when host leaves the lobby, fixes #2980 2013-04-07 21:00:27 +02:00
Matthias Mailänder
273a9869bf don't crash if the router does not want to talk to us 2013-04-07 17:20:26 +02:00
Sascha Biedermann
2fb12f755a added ToString() for OpenRA.Player 2013-04-07 17:01:55 +02:00
Sascha Biedermann
bed26c3dee fixes #2941 - dump fields in syncreport 2013-04-07 15:25:52 +02:00
Paul Chote
3968609a1e Move C&C cheats into a panel on options menu. 2013-04-08 00:29:20 +12:00
Paul Chote
76b206670a Make cheats logic robust against missing widgets.
Also removes force-desync stdout spam.
2013-04-07 23:41:31 +12:00
Paul Chote
a5ec473a59 [Sync] the world pause state. 2013-04-07 23:40:34 +12:00
Paul Chote
096d95f391 Fix bogus pause logic. 2013-04-07 23:38:52 +12:00
Curtis Shmyr
3272b6725e Merge pull request #2987 from chrisforbes/cloaked-mines
remove InvisibleToEnemy, use plain Cloak for mines
2013-04-06 22:27:12 -07:00
Curtis Shmyr
f2668b8831 Merge pull request #2986 from chrisforbes/autotarget-desync
fix desync in Cloak.IsVisible
2013-04-06 22:26:25 -07:00
Chris Forbes
b9ecfa1e9a make mines silent 2013-04-07 16:57:55 +12:00
Chris Forbes
ada26b9d12 make minelayers detectors 2013-04-07 16:18:59 +12:00
Chris Forbes
6675903eb9 remove InvisibleToEnemy, use plain Cloak for mines 2013-04-07 16:13:00 +12:00
Chris Forbes
3b95708811 fix desync in Cloak.IsVisible 2013-04-07 15:17:06 +12:00
Matthias Mailänder
ece611e5c8 Merge pull request #2979 from psydev/bleed
fixed error with rock_canyon map
2013-04-06 05:24:30 -07:00
Matthias Mailänder
ea512b30fb Update OpenRA.nsi
fixes SharpFont.*.dll" -> no files found
2013-04-06 15:24:01 +03:00
psydev
aa3b460724 fixed error with rock_canyon map 2013-04-06 05:21:56 -07:00
Matthias Mailänder
9c4c619bed Merge pull request #2978 from Mailaender/bombardment-islands-fix
Fixed missing cliff in bombardment islands
2013-04-06 05:00:17 -07:00
Matthias Mailänder
dbc9ae4fe0 Fixed missing cliff in bombardment islands
Missing cliff inserted into RA map bombardment islands.
2013-04-06 13:58:37 +02:00
Matthias Mailänder
b395e9ba7d Merge pull request #2976 from psydev/patch-2
update for cnc-classic -- updated explosions, more...
2013-04-06 04:53:53 -07:00
Matthias Mailänder
b2d885d268 Merge pull request #2403 from Mailaender/mono-nat
Use Mono.Nat for UPnP port forwarding.
2013-04-06 04:50:22 -07:00
Matthias Mailänder
0488903a15 enhanced UPnP discovery usability
- don't search for NATs forever, 5 seconds seem to be enough
- disable the UPnP checkbox if discovery failed
- no computer industry acronyms in user GUI
- don't remove port-forwarding twice, just once on shutdown
- user-configurable settings for debugging
2013-04-06 13:32:50 +02:00
psydev
cf4ed16cf6 Fixed some explosions, added comments
tidied up some stuff.
re-arranged order as well
2013-04-06 04:24:38 -07:00
psydev
263c5486c2 updated default unit explosions for helis, etc. 2013-04-06 04:18:09 -07:00
psydev
92c0a67255 removed faulty explosion for helis. (whoops.) 2013-04-06 04:15:41 -07:00
psydev
f546d867a6 updated HeliExplode's animation name 2013-04-06 04:14:03 -07:00
psydev
bb8922cc1a stealth tank cloak & crushes infantry
Until cloak issues is fixed (https://github.com/OpenRA/OpenRA/issues/2898), 90 seems a reasonable cloak delay.
Stealth tank now crushes infantry.
Cloak sound fixed.
2013-04-06 04:04:44 -07:00
psydev
f7a1e0edce pre-requisites fix 2013-04-06 03:58:17 -07:00
psydev
d16d736489 infantry detect cloaked; grenadierexplode fixed 2013-04-06 03:52:29 -07:00
psydev
ab72262d25 misc fixes; bluetiberium
apc is actually AttackFrontal
fixed palette order a bit
harvester harvests BlueTiberium instead of Blue Tiberium.
2013-04-06 03:38:29 -07:00
psydev
7a1ce8441c minor fixes
Silo moved to build queue. Last I checked, GivesBuildableArea didn't work with stuff produced from the support queue.
For whatever reason, you can build FIX in C&C Gold right away.
2013-04-06 03:25:47 -07:00
psydev
f741085b61 made crates close to original C&C values + misc.
Nuke powerproxy currently doesnt work so I set its shares to zero.
"allowmultiple" for support powers is broken, and should be fixed.
OpenRA doesn't yet have support for crates full of infantry.
2013-04-06 03:07:24 -07:00
Matthias Mailänder
dead3308e4 Merge pull request #2973 from psydev/patch-1
slowed down *make animations to 80-tick
2013-04-06 03:03:09 -07:00
psydev
c5d00c785e updated aircraft rules, as per nyerguds' rules.ini 2013-04-06 02:55:18 -07:00
psydev
c7e5c9a849 updated explosions -- now uses cnc mod's names 2013-04-06 02:40:32 -07:00
Matthias Mailänder
f6ce9a3f02 Merge pull request #2975 from Mailaender/cnc-classic-ui-fix
Don't save transparent pixel color to avoid UI glitches
2013-04-06 02:29:00 -07:00
Matthias Mailänder
8319a4d569 don't save transparent pixel color to avoid UI glitches 2013-04-06 11:24:28 +02:00
psydev
d4348b0ff0 hospital fan spins slower; make anims slower
Hospital fan runs at tick 100, which looks better and is what other buildings are.
Make animations for hosp, biolab and miss set to 80.
2013-04-06 02:17:32 -07:00
psydev
29135b1b65 slowed down *make animations to 80-tick
Animations were faster than they should be. Reduced to 80 tick. They look appropriate now and close to the original.
I made TMPL and FIX 60 because it looked more natural. TMPL is slow to begin with, but it looks ok at 80, too.
2013-04-06 01:55:54 -07:00
Matthias Mailänder
1ddc1eb64b Merge pull request #2972 from pchote/classic-fixups
Fix classic mods yaml
2013-04-06 01:48:39 -07:00
Paul Chote
c4a24dc536 Convert missed classic mod traits to world coords. 2013-04-06 21:40:26 +13:00
Matthias Mailänder
6236fb5531 Merge pull request #2971 from Mailaender/wiki-update
Separate wiki update into it's own script
2013-04-06 01:17:31 -07:00
Matthias Mailänder
aeb784628d Merge pull request #2952 from Mailaender/cursor-palette-refactor
Cursor Palette Refactor
2013-04-06 01:15:32 -07:00
Matthias Mailänder
5b0856f655 Merge pull request #2970 from psydev/bleed
added rock_canyon map. Removed delta dunes (old)
2013-04-06 01:13:04 -07:00
Matthias Mailänder
84746c97b8 Merge pull request #2933 from Mailaender/hotkey-conflicts
Hotkey usability and conflict resolution
2013-04-06 01:12:39 -07:00
Matthias Mailänder
b25e29173a Merge pull request #2968 from pchote/map-chooser
Map chooser polish & refactoring
2013-04-06 01:08:21 -07:00
Matthias Mailänder
da127f24d3 separate wiki update script 2013-04-06 09:54:04 +02:00
psydev
5041642f2e add rock_canyon and no_escapism maps 2013-04-05 23:47:16 -07:00
Matthias Mailänder
acc8cd1e5e fixes #2885 forgot to enable the cursor palette before drawing
split HardwarePalette.Update into two functions, closes #2847
2013-04-06 08:44:32 +02:00
Matthias Mailänder
6c6f5601d8 make PaletteTexture private and only use it for sprite renders 2013-04-06 08:44:32 +02:00
Paul Chote
aa97bbbea8 Fix viceroid selection group rendering (bug #2930). 2013-04-06 17:03:08 +13:00
Paul Chote
fe091487cc Fix C&C options menu fade effect. 2013-04-06 16:41:13 +13:00
psydev
58c1fba595 added rock_canyon map. Removed delta dunes (old) 2013-04-05 20:41:11 -07:00
Paul Chote
2cb634b8f5 New spawn selector tooltip for C&C. 2013-04-06 14:50:40 +13:00
Chris Forbes
99516fd2b9 Merge pull request #2957 from Mailaender/dedicated-bot-order-exploits
Don't misinterpret AI orders as an exploit on dedicated servers anymore.
2013-04-05 18:48:17 -07:00
Matthias Mailänder
819e48334e fixed #2540 AI orders misinterpreted as an exploit on dedicated 2013-04-05 18:49:15 +02:00
Paul Chote
0fb8878273 Tweak checkbox and map author label positions. 2013-04-06 03:20:41 +13:00
Paul Chote
d739b747de Only render the previews we can actually see.
This really should be fixed generally in ScrollPanelWidget,
but this is the most painful case.
2013-04-06 03:12:02 +13:00
Paul Chote
995b4c73d9 Force the runtime to prioritize the main thread and keep things smooth. 2013-04-06 02:59:34 +13:00
Paul Chote
4bc5d06c19 Minor map chooser polish tweaks. 2013-04-06 02:28:26 +13:00
Paul Chote
5e2e284cbf Add map type and author to lobby. 2013-04-06 01:52:16 +13:00
Paul Chote
9d74734ec5 Remove random map button from lobby. 2013-04-06 01:47:32 +13:00
Paul Chote
8f7940f969 Move threading into the preview generation. 2013-04-06 01:39:05 +13:00
Paul Chote
792405d789 Polish C&C map chooser layout. 2013-04-06 01:39:04 +13:00
Paul Chote
5423c400f7 Add game-type filter to C&C map chooser. 2013-04-06 01:39:04 +13:00
Paul Chote
c2cc4c2256 Add random map button to the C&C map chooser.
This also fixes issues relating to RunAfterTick
calls being run out of order - the downside being
that the list remains empty until the iteration
is complete. This will be fixed in a following patch.
2013-04-06 01:39:04 +13:00
Paul Chote
01248de66b Add ScrollPanel.ScrollToItem(). 2013-04-06 01:39:04 +13:00
Paul Chote
4907ea1f0c Center C&C map chooser panel. 2013-04-06 01:39:04 +13:00
Scott_NZ
083d59613a Better UPNP logging. Also fixes a compile error 2013-04-05 14:18:22 +02:00
Matthias Mailänder
989c23e632 use Mono.Nat for UPnP port forwarding
- might support more devices
- supports internal and external port mapping
- discover the device only once (at startup)
2013-04-05 14:18:15 +02:00
Matthias Mailänder
8f5fcc6e54 Merge pull request #2967 from psydev/changes
updated skull_valley map
2013-04-05 05:01:15 -07:00
psydev
994e7dc3dd updated skull_valley map. 2013-04-05 04:56:08 -07:00
psydev
d03143dc0e added new map, skull_valley. 2013-04-05 04:39:17 -07:00
ScottNZ
b22b7208ec Merge pull request #2954 from Mailaender/empty-superweapon-indicators
Don't render empty remaining tick bars for iron curtain / chrono
2013-04-05 02:34:20 -07:00
Matthias Mailänder
9996db7382 Merge pull request #2966 from Mailaender/cnc-cheats-crash
Fixes C&C cheats menu crash and adds more buttons to it's lobby
2013-04-05 02:16:46 -07:00
Matthias Mailänder
0ce8e85af4 Merge pull request #2961 from psydev/patch-2
construction yard HP reduced 2000 -> 1500
2013-04-05 02:15:33 -07:00
Matthias Mailänder
11c5aeec6a more widgets for the C&C lobby
- random map
- crates on/off
- assign teams
2013-04-05 10:30:06 +02:00
Scott_NZ
8d0a7b46ac Added support for draggable BackgroundWidgets 2013-04-05 21:19:18 +13:00
Matthias Mailänder
9c40fcec27 Hotfix: make the C&C cheat menu not crash 2013-04-05 10:06:14 +02:00
Matthias Mailänder
8ab817f466 Merge pull request #2953 from Mailaender/freetype-windows-fix
Use the correct FreeType DLL file name on Windows
2013-04-05 00:29:13 -07:00
psydev
770e1bbaac fixed error in slippery_slopes.oramap 2013-04-04 21:46:30 -07:00
psydev
514126cc41 Added two new maps. 2013-04-04 20:57:25 -07:00
psydev
9147b73b1f AI no longer builds FIX
To save space within conyard's build radius, AI will not build FIX, since it doesn't know how to use it, and it provides no pre-requisites.
2013-04-04 14:46:55 -07:00
psydev
7848702042 mcv odds w/o base 80%
-Odds of getting MCV in a crate w/o a conyard is 80%, so that people aren't tempted to sell their conyard at beginning.
-Changed Hard AI's limits of procs, barracks & factories, since AI has to work within the conyard's build radius and crowding is no good, because it prevents them from building all tech buildings.
2013-04-04 14:30:19 -07:00
psydev
2f4e2679eb orca ROF decreased. 10 -> 15
Orca missiles fire a bit slower, so that the unit cannot unload all its rockets in 2 seconds. Will give defenses a bit more time to respond before they die or before the orcas run away.
2013-04-04 14:08:36 -07:00
psydev
d49c344463 increased speed of TowerMissile; inc. burst delay
Increased speed of TowerMissile. At present it is very slow and not terribly effective vs. air units because they can quickly leave range before getting hit. Speed stats are same for E3 and RocketBike.
Burstdelay increased. This is to avoid wasted missiles on the same target that might get destroyed.
Rangelimit reduced from 40 to 30 to compensate for increased missile speed.
2013-04-04 14:05:27 -07:00
psydev
f7bbc7a23a construction yard HP reduced 2000 -> 1500
Now that MCV is buildable again, the conyard doesn't need to be the ultra-heavy armored bunker it has been. Now a nuke can almost kill it.
2013-04-04 13:50:27 -07:00
Chris Forbes
1745f5a100 Merge pull request #2955 from Mailaender/dead-actor-stances-fix
Don't perform keyboard orders on destroyed actors which crashes the game.
2013-04-04 13:42:56 -07:00
Matthias Mailänder
f4abe08863 fixes #2947 don't perform keyboard orders on destroyed actors 2013-04-04 19:24:30 +02:00
Matthias Mailänder
4a580c3780 don't render empty remaining tick bars for iron curtain / chrono 2013-04-04 19:14:49 +02:00
Matthias Mailänder
3511667609 fixes #2946 non-standard FreeType DLL P/Invoke on Windows 2013-04-04 18:50:28 +02:00
Matthias Mailänder
2fe20b13f1 Merge pull request #2948 from psydev/patch-1
balance stick - infantry, mammoth
2013-04-04 05:33:37 -07:00
psydev
380c849d91 orca, apache require ANYHQ instead of HQ
allows units unlocked by HQ to stay available as long as you have either advanced comm. center or temple of nod.
2013-04-04 04:33:18 -07:00
psydev
a879d6c033 APC gun does slightly more dmg; slower ROF
APC gun does 30 damage, so it can kill orca in 3 shots.
ROF lowered to compensate.
2013-04-04 04:23:21 -07:00
psydev
cb05244814 mammoth turret rotation 2 -> 3, matching tank rot.
A good idea to make mammoth able to rotate to face air units it wants to hit, faster.
2013-04-04 03:59:57 -07:00
psydev
d22764d3d3 infantry speed increased from 90% to 100%.
During playtesting it seemed like having infantry go at full speed on clear terrain was a good addition.
If it seems inappropriate for some infantry, can change it individually later for some units that might be too fast (e.g. flamethrowers and grenadiers, who travel at speed=5).
2013-04-04 03:57:04 -07:00
Matthias Mailänder
74ae8e0b09 Merge pull request #2943 from Mailaender/make-install-sharpfont-fix
Unbreak make install and SharpFont on Mac
2013-04-03 23:50:09 -07:00
Matthias Mailänder
e8c43eae92 fixes #2938 unbreak make install and SharpFont on Mac 2013-04-03 14:38:42 +02:00
Chris Forbes
270296f64b Merge pull request #2937 from Mailaender/paratrooper-shroud-glitch
Fixes paratroopers revealing shroud after death
2013-04-03 02:06:49 -07:00
Chris Forbes
c1427c1eaa Merge pull request #2936 from bidifx/syncrep
added "Force Desync" Cheat for debugging
2013-04-03 02:06:32 -07:00
Chris Forbes
99c89e5378 Merge pull request #2934 from Mailaender/observer-invisibility
Fixes cloaked units invisible to spectators
2013-04-03 02:06:21 -07:00
Chris Forbes
0cff898954 Merge pull request #2931 from Mailaender/missing-sound-exception
Throw specific exception on missing sound definitions
2013-04-03 02:05:55 -07:00
Chris Forbes
7bbac5659d Merge pull request #2935 from Mailaender/superweapon-cooldown
Added durationbar indicators for iron curtain and chronoshift
2013-04-03 01:53:40 -07:00
Matthias Mailänder
ffc241d170 Merge pull request #2928 from psydev/changes
new maps; orca trail changed; msam icon; blue tree.shp
2013-04-03 00:17:14 -07:00
Matthias Mailänder
dca73b2c7d fixes #2726 paratroopers revealing shroud after death 2013-04-03 00:15:19 +02:00
Sascha Biedermann
2982002397 added "Force Desync" Cheat for debugging 2013-04-02 23:38:36 +02:00
Matthias Mailänder
5ecd0edeb8 added durationbar indicator for chronoshift, closes #2287 2013-04-02 22:19:04 +02:00
Matthias Mailänder
03d203e64a added durationbar indicator for iron curtain, closes #2288 2013-04-02 22:18:40 +02:00
Chris Forbes
38578c7f99 Merge pull request #2475 from Mailaender/sharpfont
move from custom Tao.FreeType to SharpFont
2013-04-02 13:01:34 -07:00
Matthias Mailänder
75395de526 fixes #2918 cloaked units invisible to spectators 2013-04-02 20:43:31 +02:00
Matthias Mailänder
3a3503201b hotkey usability
resolve hotkey conflicts, fixes #2883
add/display existing in-game button hotkeys, fixes #2932
2013-04-02 17:29:20 +02:00
Matthias Mailänder
82b3126417 Merge pull request #2895 from Mailaender/editor-erazor
Added an eraser toolbar button to the map editor
2013-04-02 04:02:03 -07:00
Matthias Mailänder
63893e97e7 use SharpFont instead of custom Tao.FreeType 2013-04-02 12:46:25 +02:00
Matthias Mailänder
58bdfb90e3 Merge pull request #2896 from Mailaender/editor-ruler
Added switchable ruler markings to editor
2013-04-02 03:21:59 -07:00
Matthias Mailänder
3dfce53bf8 throw specific exception on missing sound definitions 2013-04-02 12:06:28 +02:00
Matthias Mailänder
7a143d94f9 added an eraser toolbar button
to erase with left-click as in image editing programs
2013-04-02 11:54:41 +02:00
psydev
c2a8da086f re-added maps 2013-04-02 02:41:32 -07:00
psydev
8c294022f4 maps renamed 2013-04-02 02:38:09 -07:00
Matthias Mailänder
a55a902ba5 added switchable ruler markings to editor 2013-04-02 11:16:02 +02:00
psydev
48f77f7117 removed the new icons that were unappealing 2013-04-02 01:10:17 -07:00
Chris Forbes
6a466bde38 Merge pull request #2897 from Mailaender/editor-zoom
Added toolbar buttons for pan and zoom to editor
2013-04-02 00:48:36 -07:00
Chris Forbes
864ae11233 Merge pull request #2894 from Mailaender/editor-cashcount
Added total cash count to editor status bar, closes #2884
2013-04-02 00:15:19 -07:00
Matthias Mailänder
c0fd62e410 Merge pull request #2927 from chrisforbes/bug-2921
fix #2921: crash when support power instance vanishes while tooltip is shown
2013-04-02 00:11:42 -07:00
Matthias Mailänder
26a510401a Merge pull request #2929 from chrisforbes/bug-2528
fix #2528 - crashy race in DemoTruck destruction
2013-04-02 00:09:02 -07:00
Chris Forbes
c62a7572a7 fix #2528 - crashy race in DemoTruck destruction 2013-04-02 19:39:15 +13:00
Matthias Mailänder
e82dd025f6 added toolbar buttons for pan and zoom 2013-04-02 08:37:51 +02:00
Chris Forbes
772efb98d4 fix #2921: crash when support power instance vanishes while tooltip is shown 2013-04-02 19:20:24 +13:00
psydev
21bdc6afa5 changed orca missile trail from smokey to fb4 2013-04-01 23:20:20 -07:00
psydev
2593bc0a72 added rocket trail, msam icon, blue-tree.shp 2013-04-01 23:11:34 -07:00
Chris Forbes
f556be975c Merge pull request #2917 from pchote/turret-cleanup
Remove Turret and PVecFloat cruft.
2013-04-01 23:06:15 -07:00
Chris Forbes
9ec47034ec Merge pull request #2925 from psydev/patch-2
fix - stealth tank, artillery; minor changes
2013-04-01 23:00:03 -07:00
Chris Forbes
32bafa1560 Merge pull request #2924 from ScottNZ/lobby
Fixes #2907
2013-04-01 22:58:53 -07:00
psydev
a3998f6f12 added new maps by psydev 2013-04-01 22:45:05 -07:00
psydev
d3c1831bc0 obelisk range +1
Seems like Obelisk is not used much and that it is underpowered. Could use +1 range.
Rationale: it uses tons of energy (150) and costs a lot ($1500), compared to ATWR (30 energy, $1000) which has a range of 8. (Obelisk is 7 at the moment).
Obelisk also is comparatively easily destroyed since its HP are lower. Since it's vulnerable to power outages and artillery, it seems a bit more range will help get better use out of it.
2013-04-01 17:39:22 -07:00
psydev
a765a1330a reduced cooldown time for ConYard to 5 secs.
8 seconds cooldown time for conyard seems unnecessary and a bit long. Reduced to 5 seconds. The build radius on its own will probably deal with most basewalking problems, so the cooldown time isn't as important. 
Increased Turret and Guard Tower's cloak detection range to 5. They need the range, especially since they are relatively easily destroyed by stealth tanks.
2013-04-01 17:35:07 -07:00
psydev
57012b9a6e blue tree now 1/2 green tree's regrowth speed
Blue tiberium tree was producing at 58% of green tiberium tree.
It seems a bit too good right now, so going to put it at 50%. (It has ~2x value of green)
2013-04-01 17:31:22 -07:00
psydev
7f752519bb fix - stealth tank, artillery
Someone changed stealth tank and it did not have HoldFire as initial stance anymore.
Apparently Explodes: does not use UnitExplode by default anymore? Fixed.
2013-04-01 17:29:00 -07:00
Scott_NZ
3123bebe33 Fixes #2907
Sort servers by players in the server browser
2013-04-02 12:50:21 +13:00
Scott_NZ
c0e3861891 Fix #2888
Only choose out of the selectable maps when pressing Random Map in the lobby
2013-04-02 12:36:02 +13:00
Matthias Mailänder
c68d939e4f Merge pull request #2823 from ihptru/auto-map-dl
Auto map downloading
2013-04-01 09:11:25 -07:00
Matthias Mailänder
c97e9c197f Merge pull request #2919 from Mailaender/fix-makefile
fixes #2913 make clean && make failing
2013-04-01 03:29:56 -07:00
Matthias Mailänder
08f213a952 Merge pull request #2915 from psydev/patch-1
mcv crate; cloak delay; AI... minor changes
2013-04-01 03:27:02 -07:00
Matthias Mailänder
de988e45a5 Merge pull request #2911 from chrisforbes/mcv-crate-bugfix
fix MCV crate not being given if normal SelectionShares was zero
2013-04-01 03:26:35 -07:00
Matthias Mailänder
43e6512049 fixes #2913 make clean && make failing 2013-04-01 10:12:10 +02:00
Paul Chote
819d315d56 Remove Turret and PVecFloat cruft. 2013-04-01 12:59:50 +13:00
Paul Chote
be250bca76 Rewrite ThrowsParticle using world coordinates.
The old dynamics were crazy, so this implements
a simpler model using a cubic lerp.
2013-04-01 12:59:49 +13:00
psydev
0976901326 orca balance
Orca has been shown in playtesting to be too good in large groups. Reducing HP to 90 so that bike rockets, e3 rockets can kill in 3 shots instead of 4.
Returning ammo to 5 again, because adding that extra rocket ended up making a much bigger difference than expected.
2013-03-31 15:09:48 -07:00
psydev
c390a4325a mcv crate; cloak delay; AI
MCV crate set to 0. This will be at the very least until there is a way to delay good units from showing up early game.
Cloak delay raised to 90 since it re-cloaks fast. This is because currently the stealth tank starts countdown while still in "attack mode", after the last missile was fired. Should be changed again to 1-2 seconds after  https://github.com/OpenRA/OpenRA/issues/2898 is implemented.
Added hard AI.
2013-03-31 15:06:23 -07:00
Matthias Mailänder
0695307730 Merge pull request #2914 from Mailaender/fake-fixes
Fix the bit-rotted tooltips of fake buildings
2013-03-31 14:43:39 -07:00
Matthias Mailänder
171c88cea9 fix the bit-rotted tooltips of fake buildings 2013-03-31 22:39:01 +02:00
Matthias Mailänder
91b633a126 Merge pull request #2908 from Mailaender/weap-door-fix
fixes #2679 RA war factory closes it's door prematurely
2013-03-31 04:52:24 -07:00
Matthias Mailänder
138c965a85 Merge pull request #2912 from psydev/patch-1
construction yard limit; balance stick
2013-03-31 04:52:12 -07:00
psydev
af2ed64c5c stealth tank range -1
Stealth tank range seems too high. It currently exceeds obelisk range. We won't be changing obelisk range until the FireDelay issue is fixed. https://github.com/OpenRA/OpenRA/issues/2710
2013-03-31 04:09:55 -07:00
psydev
b2772c1443 Gun & Guard tower detection range increased +1
The detection range for cloaked units for guard towers and guns is low (3). 
This is needed so that stealth tanks aren't too good at sneaking by everything.
2013-03-31 04:03:43 -07:00
psydev
2be1d68088 infantry pre-req change "HQ" to "ANYHQ"
tier-2 infantry can still be built as long as you have advanced communications center or temple of nod.
2013-03-31 03:48:54 -07:00
psydev
7414c00d63 changed pre-requisites from HQ to ANYHQ
Vehicles can still be built if communications center is destroyed, as long as player has either an advanced communications center or temple of nod.
2013-03-31 03:47:17 -07:00
Paul Chote
7b54bbf0b2 Convert RenderUnitSpinner -> RenderUnit + WithSpinner.
Also sets correct offsets for the units that use it.
2013-03-31 23:43:34 +13:00
psydev
e6c962cc6b Building adjacent value increased
Since the MCV position limits where you can build, it seems like the adjacent value should be relaxed. 
Pchote, scott, mailaender and I were playtesting the new build radius. We played with a value of 5 and it was good.
2013-03-31 03:42:30 -07:00
psydev
8ae723fec6 MCV no longer needs FIX to be built
MCV is more important now since buildings can only be built within its build range. If you need a repair bay first, it's too constrictive. This seems right.
2013-03-31 03:38:55 -07:00
psydev
b6a4f2f9c1 Orca, MLRS, mammoth balance stick
MLRS range reduced. People don't seem to like it's ultra-long range. Hopefully this is a good middle ground.
Orca range reduced -- there's some concern the orca is OP, especially against things designed to kill it (Bike, MSAM, ...). Reducing range will not nerf it but will allow vehicles to approach without getting instantly killed.
Mammoth missiles spread increased. Since mammoth is a top-tier unit, people think it shouldn't be easily killed and should be effective vs. everything. This should help a bit vs. infantry.
MLRS damage vs. wood reduced significantly, to slow down how fast they can destroy buildings.
MLRS damage vs. infantry slightly reduced. They are supposed to be good at killing incoming infantry groups, but they seem slightly too effective.
2013-03-31 03:36:58 -07:00
psydev
b7d6fa8a18 Nod gets mobile SAM launcher. MLRS & MCV speed
Nod now can use mobile SAM launcher. This is necessary because Orcas are powerful, esp. in large groups.
MLRS slowed down a bit, so it can't turn and run as swiftly.
MCV gets +1 speed since it will be moving more now.
2013-03-31 03:25:07 -07:00
psydev
3c03474fb6 construction yard -- make better range limit
Playtesting suggested we should increase the build radius from 10 to ~13/14.

Also changed pre-requisites so that "hq" pre-req is not "anyhq"
2013-03-31 03:15:38 -07:00
Paul Chote
800a9ff0c4 Convert SmokeTrailWhenDamaged to world coords. 2013-03-31 23:04:57 +13:00
Paul Chote
41dcb11030 Convert WithRotor to world coords. 2013-03-31 21:35:37 +13:00
Paul Chote
34a9675744 Remove unnecessary PPos.FromWPosHackZ() usage. 2013-03-31 21:35:30 +13:00
Chris Forbes
afa28dbc24 fix MCV crate not being given if normal SelectionShares was zero 2013-03-31 20:53:15 +13:00
Paul Chote
2f80cd5f92 Pass WorldRenderer to AnimationWithOffset.OffsetFunc. 2013-03-31 19:56:11 +13:00
Paul Chote
7c21459b48 Convert contrails to world coords. 2013-03-31 19:32:51 +13:00
Chris Forbes
01bf635e26 Merge pull request #2909 from psydev/patch-4
important fix -- apache shoots at air units again
2013-03-30 19:47:57 -07:00
psydev
c9fdb39854 fixed earlier mistake w/ mlrs HP
I made a mistake changing MLRS HP from 120 -> 115 in last patch. (I misread a unit stat and so the change didn't do the thing I thought, and had no purpose).

Returned to previous value of 120.
2013-03-30 13:54:01 -07:00
psydev
70c7522c98 bike rocket damage slightly tweaked++
Bike rocket damage increased to 30.
This lets it kill MLRS in 4 shots instead of 5. Important for the role the bike plays.
Kills Buggy in 4 shots instead of 5 as well. 
This helps to justify bike's cost of $500. Its primary job is to exploit open space with its speed to attack vulnerable units, e.g. go behind enemy lines and quickly kill artillery. 5 shots (3 volleys instead of 2) makes this far weaker in this role, and expensive to take the risk with.
2013-03-30 13:51:52 -07:00
psydev
eb3933f071 important fix -- apache shoots at air units again
Apache Helicopter wasn't shooting at air units. Now it does again.
2013-03-30 13:12:36 -07:00
Matthias Mailänder
48da405a39 fixes #2679 RA war factory closes the door prematurely 2013-03-30 20:41:40 +01:00
Matthias Mailänder
971ff431e0 Merge pull request #2905 from pchote/baserange
Add building range and structure placement rate limiting to C&C
2013-03-30 03:15:22 -07:00
Paul Chote
9127d0dcf4 Support a maximum building range (Fixes #2156).
This also implements support for a per-provider
cooldown between placing structures, allowing mods
with multiple structure queues to rate-limit
placement around a single provider.

An initial delay parameter is included to
support units that deploy into a base provider and
require an initial setup time (e.g. the Surveyor
unit from C&C TW).

The range and time restrictions are not applied to
walls as a balance choice.
2013-03-30 23:00:26 +13:00
Matthias Mailänder
65d80cfa08 Merge pull request #2904 from Mailaender/packaging-fixes
Packaging fixes
2013-03-30 02:56:22 -07:00
Paul Chote
4dc5c4a871 Fix BuildingInfo formatting. 2013-03-30 22:48:17 +13:00
Paul Chote
395df45a5a Revert unbuildable MCV and crate changes. 2013-03-30 22:48:17 +13:00
Matthias Mailänder
85c0f7fcbf added new fake target dependencies to PHONY 2013-03-30 10:45:40 +01:00
Chris Forbes
855d65d9af Merge pull request #2903 from ihptru/masterserver
fix #2792; Send Players: and Bots: to master server as different fields
2013-03-30 02:13:12 -07:00
Matthias Mailänder
c49aae1eba don't ship the tileset builder (yet), closes #2863 2013-03-30 10:01:04 +01:00
Matthias Mailänder
fa8efba1b9 fixes #2862
also more comfortable make clean && make all
2013-03-30 09:59:05 +01:00
Igor Popov
1bea6465c1 fix #2792; Send Players: and Bots: to master server as different fields 2013-03-30 12:37:21 +04:00
Matthias Mailänder
1ccd1cd1ac Merge pull request #2886 from Mailaender/community-icons
Added more cameos and showcase everything in developer mode
2013-03-30 00:59:17 -07:00
Matthias Mailänder
66d8bbb9b5 Merge pull request #2891 from psydev/patch-4
blossom trees: indestructible; blue slower
2013-03-30 00:58:21 -07:00
Matthias Mailänder
2fe75b322d Merge pull request #2879 from bidifx/chat
closes #2874: improved ingame chat
2013-03-30 00:40:47 -07:00
Matthias Mailänder
091bdac830 Merge pull request #2861 from Mailaender/version-mismatch-config
fully configurable version mismatch detection
2013-03-30 00:25:30 -07:00
Matthias Mailänder
260dd5e1fb Merge pull request #2887 from pchote/world-offsets
Replace Turret/Muzzle positioning code
2013-03-30 00:07:43 -07:00
Paul Chote
02898e8bbc Remove unnecessary trait lookup from DebugMuzzlePositions. 2013-03-30 17:05:22 +13:00
psydev
42b606ca3c weap/afld HP reduced; HQ adjustments
Weapons Factory & Nod Airstrip HP reduced greatly (to 1000), so that nuke can now destroy them (& Ion Cannon almost but not quite).
Advanced Communication Center's HP increased from 1000 to 1200, to give it some more breathing room vs. ion cannon strikes.
Added ANYHQ as a custom pre-requisite, so that the temple of nod and advanced communications center will also allow building of advanced units.
2013-03-29 17:31:10 -07:00
psydev
9405f47711 Ion Cannon buffed vs. heavy armor; revamped
Ion Cannon does more damage vs. heavy armor--supposed to be more effective vs. advanced guard towers & Obelisks.
It no longer uses the PerCell damage model because the amount of damage vs. buildings varied wildly. It now uses the standard model and works pretty well.
2013-03-29 17:00:19 -07:00
psydev
904b80076d Guard Tower gun buffed
There were complaints the Guard Tower was too weak. Generally, it's better if CNC is not a game of infantry spam. So it fires more often now. (ROF decreased from 40 to 30)
Its damage was increased from 45 to 50 because Flamethrowers were surviving with 1 HP, which is annoying.
2013-03-29 16:53:18 -07:00
psydev
63fe7ef540 increase nuke damage vs. heavy armor (ATWR)
Nuke damage vs. heavy armor increased, so that it can efficiently take out GDI advanced guard towers.
2013-03-29 16:36:47 -07:00
psydev
722fd9b59a blossom trees fix
removed -TargetableBuilding and -AutoTargetIgnore
2013-03-29 16:07:32 -07:00
psydev
f090941427 Mammoth Tank buff; balance stick for MLRS
Mammoth tank buffed, since people said it was too slow and died easily, e.g. dying too readily while approaching enemy through artillery fire.
-HP increased from 600 to 800. Seems justifiable since it's an expensive, slow-to-build, top-tier unit.
-Speed increased from 3 to 4; (C&C 95 default value, incidentally)
-Rotation reduced from 5 to 3 so that it has a flavor of slowness, and a vulnerability.

MLRS speed reduced from 8 to 7, so it's not uncatchable when retreating.
MLRS health reduced from 120 to 115 so Rocket Bike can kill it in 5 shots instead of 6.
MLRS InitialStance set to Defend, to help noobs avoid unintentionally bunching them up (and making them vulnerable to airstrikes, etc.) and to require less micro-management of their positions.
2013-03-29 15:24:53 -07:00
Matthias Mailänder
918f27575d added total cash count to editor status bar 2013-03-29 23:20:52 +01:00
psydev
51880db3c5 Harvester capacity & unload time changed
The carrying capacity of harvesters was increased from $525 to $700. (This is the original C&C 95 value).
Overall harvesting rates are roughly the same.
To keep overall harvesting rates the same, the amount of time spent unloading at the refinery was increased. 
The purpose of these changes is to:
- make blue tiberium harvesting from distant fields economically feasible by increasing carrying capacity
- make basewalking less necessary in order to take advantage of blue tiberium fields farther away, especially in early game.
- make harvesting from distant tiberium fields less penalizing. If you have more harvesters harvesting tiberium farther away, the unload time won't affect you as much as if you were harvesting closer by.
- make refineries more relevant and make the player build refineries to increase capacity, and not only relying on a fleet of harvesters. (A good idea anyway since Ion cannons can kill refineries, and you should have more than one).
- keep with flavor of C&C, where tiberium was a dangerous substance which had to be carefully unloaded, unlike ore from RA which was immediately dumped.
2013-03-29 15:07:56 -07:00
psydev
f89650c61c orca update; ammo increased 5 -> 6. heli sight++
Orca ammo reduced from 10 to 5, since 
Increased toal ammo from 5 to 6, since orcas seem to be a bit weak vs. tanks, flame tanks, etc.
Apache Helicopter & Orca sight range increased from 8 to 10. Seems good here, I wouldn't increase anymore, or they will be too good at scouting by themselves. Leaving it here requires using other units for their scouting value.
A-10 sight range increased from 8 to 12. This makes the airstrike better for scouting, and seems to make sense for an airplane. Since it's a superpower, won't be too powerful.
2013-03-29 14:40:36 -07:00
psydev
221279dc18 orca rockets -- fewer, more powerful (less spammy)
When you have multiple orca rockets firing at once, the screen fills with missiles and smokey trails. Reduced the number firing per second, but they do the same total damage, so balance remains unchanged.
Will change their trail shortly to something other than smokey.
Next commit will change their ammo load.
2013-03-29 14:34:06 -07:00
psydev
42f0dadd27 applying balance stick
Stealth Tank damage vs. wood nerfed; a few stnks could quickly uncloak and destroy a building, e.g. refinery. 
Guard tower slight buff, to kill E3 in 2 shots instead of 3, and E4/E5 in 4 shots instead of 5.
E3 rockets expire a bit sooner. They would continue on forever. Their range is still long, but now it's possible for some units to escape.
2013-03-29 14:30:23 -07:00
psydev
30dd2e3d2d blossom trees: indestructible; blue slower
Trees were made destructible; now they are indestructible.
Blue tiberium blossom trees regenerate slower than green tiberium. This keeps the green ones relevant in maps with both kinds of trees.
The blue ones produce at slightly over half speed, and slightly over 2x value, giving them a slight advantage. Blue's total value production rate is ~1.25x faster than green tib. blossom tree.
2013-03-29 14:21:58 -07:00
Paul Chote
5e74d3c54e Remove legacy turret/muzzle positioning code. 2013-03-29 22:04:21 +13:00
Paul Chote
491468b84f Convert ra-classic turrets/weapons to world coordinates. 2013-03-29 21:44:04 +13:00
Paul Chote
7c816f75d2 Convert ra turrets/weapons to world coordinates. 2013-03-29 21:44:04 +13:00
Matthias Mailänder
2f839f6b58 made Dune 2000 corrinno palace unbuildable again
was just for testing as the devmode build palette is too small
2013-03-29 09:39:35 +01:00
Matthias Mailänder
4ebaaf716d showcase everything we got icons for when dev cheats on 2013-03-29 09:23:52 +01:00
Paul Chote
0289fd543e Convert d2k turrets/weapons to world coordinates. 2013-03-29 20:50:10 +13:00
Paul Chote
b9793635c8 Convert cnc-classic turrets/weapons to world coordinates. 2013-03-29 20:50:10 +13:00
Matthias Mailänder
008b0cbab5 Added @Nyerguds TD Deluxe Cameo Pack 2013-03-29 08:44:10 +01:00
Paul Chote
67df893fc3 Convert C&C turrets/weapons to world coordinates. 2013-03-29 20:42:57 +13:00
Paul Chote
6a4caab023 Convert BIKE and HTNK to world coordinates. 2013-03-29 20:42:57 +13:00
Paul Chote
79d51f0ce2 Auto-detect offset coordinate type. 2013-03-29 20:42:57 +13:00
Paul Chote
0cff8b5b12 Add a debug visualization for muzzle positions. 2013-03-29 20:42:56 +13:00
Paul Chote
5bd34bda22 Support world coordinates for Prone offsets. 2013-03-29 20:42:56 +13:00
Paul Chote
bb6a1ed6e0 Introduce world offsets for turrets & armaments. 2013-03-29 20:42:56 +13:00
Paul Chote
27d852a425 Rename legacy offset coordinates on Turrets and Armaments. 2013-03-29 20:39:27 +13:00
Paul Chote
9e4bab07e5 Add conversions and helpers for world coordinates. 2013-03-29 20:39:27 +13:00
Paul Chote
724ea88c3b Add new "World Coordinate" types.
These types provide fixed-point representations of distances, angles,
positions, vectors, and rotations in 3d space.

WAngle (and WRot) represents 360 degrees in 1024 units.
WRange (and WPos, WVec) represents 1 cell in 1024 units.

Distance types in yaml can be written as <cell>c<subcell>, e.g. "4c512" for 4.5 cells.
2013-03-29 20:39:27 +13:00
Paul Chote
61959aa45b Fix TeslaZap to account for altitude. 2013-03-29 20:39:26 +13:00
Matthias Mailänder
d9efe82b5a added prison/tech center icon and build-up animation 2013-03-29 07:22:14 +01:00
Paul Chote
153d29a00f Fix LazerZap to account for altitude. 2013-03-29 19:04:25 +13:00
Paul Chote
0c78d59d88 Fix A* visualization in C&C. 2013-03-29 19:04:25 +13:00
Sascha Biedermann
54a59afde0 fixed typo 2013-03-28 23:57:46 +01:00
Sascha Biedermann
1eb7c62c62 closes #2874: improved ingame chat 2013-03-28 18:39:26 +01:00
Matthias Mailänder
b4a2489874 Merge pull request #2881 from Mailaender/start-game-cnc-classic-hotfix
Hotfix: C&C classic don't crash on game start
2013-03-28 09:36:17 -07:00
Matthias Mailänder
1a768c99ff Merge pull request #2876 from Mailaender/debug-traits
add the desync-debug traits to the actors of default mods
2013-03-28 09:34:45 -07:00
Matthias Mailänder
7eeac660b8 Merge pull request #2878 from Mailaender/indestructable-trees
Non-targetable Trees
2013-03-28 09:34:10 -07:00
Matthias Mailänder
5c095a7fe8 add missing StartGame notification to cnc-classic
empty value, fixes a crash
2013-03-28 17:31:42 +01:00
Matthias Mailänder
8d9f91a844 non-targetable trees, fixes #2875 and related regressions
makes them indestructable again except for super-weapons
2013-03-28 12:23:39 +01:00
Matthias Mailänder
10ba7ae1c3 add the desync-debug traits to the actors of default mods 2013-03-28 11:53:50 +01:00
Chris Forbes
db4f880d61 Merge pull request #2873 from bidifx/hotkeys
fixes #2866: allow Button.Key to be a delegate
2013-03-28 02:17:45 -07:00
Sascha Biedermann
467002a88b fixes #2866: added ButtonWidget.GetKey as delegate 2013-03-28 10:03:41 +01:00
Matthias Mailänder
37e0a189fb Update package-all.sh
OpenRA build server is running http://packages.ubuntu.com/precise/markdown which has a different name in /usr/bin compared to the http://software.opensuse.org/package/perl-Text-Markdown I have installed on my machine.
2013-03-28 09:02:43 +01:00
Matthias Mailänder
8fd02a4ce5 Merge pull request #2868 from Mailaender/desura-cleanup
Cleanup the Desura crap
2013-03-27 10:32:13 -07:00
Matthias Mailänder
4c1f671767 remove AUTO-GENERATED desura pre-launch wrapper scripts
*self-slap*
2013-03-27 18:22:48 +01:00
Matthias Mailänder
7720e20f81 Update openra.spec
build server seems to have an old version of rpmbuild which does not understand soft-dependencies
2013-03-27 13:50:11 +01:00
Matthias Mailänder
ebb3c4d938 Merge pull request #2860 from bidifx/ready-cb
hotfix for #2789, ready CheckBox
2013-03-27 05:29:51 -07:00
Sascha Biedermann
10c38d1339 hotfix for #2789, ready CheckBox 2013-03-27 12:58:43 +01:00
Matthias Mailänder
81dac5521f make the whole version mismatch mechanic user-configurable 2013-03-27 12:19:22 +01:00
Matthias Mailänder
8a13bc68ef add a dedicated server launch script 2013-03-27 12:01:17 +01:00
Matthias Mailänder
ba7310d0a0 Merge pull request #2859 from ihptru/bleed
fix #2193
2013-03-27 02:38:35 -07:00
Igor Popov
0bf79635ec fix #2193
the most common reason of "Operation is not valid due to the current state of the object"
2013-03-27 06:08:01 -03:00
Matthias Mailänder
9ca391c814 Merge pull request #2817 from Mailaender/radoc-update
Update RADOC
2013-03-27 01:51:52 -07:00
Matthias Mailänder
0a82bfe552 format TODO: uniformly to auto-generate task list in MonoDevelop 2013-03-27 09:45:17 +01:00
Matthias Mailänder
a682670b97 update developer commentary
for weapon traits, crates and palettes
clarify that you don't need to update the wiki page manually
2013-03-27 09:22:23 +01:00
Matthias Mailänder
fc1a3f9916 Merge pull request #2857 from Mailaender/fix-game-start-sound-nullreference-exception
Fix NullReferenceException for spectator mode
2013-03-27 00:14:39 -07:00
Matthias Mailänder
5927bce7b5 no country specific game start announcer voice
it will crash for spectators who have none
no mod supports it at the moment anyway
2013-03-27 08:11:12 +01:00
Matthias Mailänder
d153f3f74f Merge pull request #2855 from Mailaender/greenpeace
Don't burn down the forest in Allies04...
2013-03-26 15:45:14 -07:00
Matthias Mailänder
039589c739 let the soviets in allies04 not furiously attack mother nature
regression due to trees being destructible now
2013-03-26 23:40:03 +01:00
Matthias Mailänder
3f20415aff Merge pull request #2821 from Mailaender/ra-desert-palette-rotation-fix
fix RA Desert palette rotation regressions
2013-03-26 14:39:40 -07:00
Matthias Mailänder
e795ab9174 Merge pull request #2770 from pchote/turret-cleanup
Weapon / Turret refactoring
2013-03-26 14:38:56 -07:00
Matthias Mailänder
0ab57c9abc Merge pull request #2813 from Mailaender/desura
Desura compatibilty
2013-03-26 14:37:42 -07:00
Matthias Mailänder
c993140fe7 Merge pull request #2822 from Mailaender/shroud-selector
Added Shroud selector to spectator mode
2013-03-26 14:34:06 -07:00
Matthias Mailänder
715e7a010f Merge pull request #2845 from ihptru/bots
option to disable bots on server + disable bots on any dedicated server
2013-03-26 14:32:29 -07:00
Matthias Mailänder
328c81e07b Merge pull request #2848 from Mailaender/int-damage-modifier
Witch hunting against desyncs...
2013-03-26 14:30:27 -07:00
Matthias Mailänder
8509505c01 Merge pull request #2851 from Mailaender/editor-toolbar
Map Editor Beautification, fixes #2825
2013-03-26 14:29:54 -07:00
Matthias Mailänder
28f24cd03a Merge pull request #2801 from Mailaender/hotkey-cleanup
Remove inconsistencies that crash C&C mod
2013-03-26 14:28:49 -07:00
Matthias Mailänder
ead0da4161 Merge pull request #2844 from Mailaender/game-asset-download-crash-hotfix
Hotfix: Don't Crash on First-Start when Game Assets are missing
2013-03-26 14:27:20 -07:00
Matthias Mailänder
a3c0b1b9f6 Merge pull request #2814 from Mailaender/desync-debug
Yet Another Desync Debug Pull Request
2013-03-26 14:26:09 -07:00
Matthias Mailänder
ca2f48a439 Update lobby.yaml
it is also used for the single-player GUI
2013-03-26 22:24:16 +01:00
Matthias Mailänder
04a1b56e03 Merge pull request #2369 from ihptru/cnc-server-name
fix cnc menu/multiplayer titles overrides by server's title;
2013-03-26 14:23:06 -07:00
Matthias Mailänder
a0bd6f0d46 Map Editor beautification
- show full name + version of the loaded mod in titlebar
- added a help menu with useful links
- added icons to to the menu with tooltips
- added a toolbar to the editor, closes #2825
2013-03-26 15:42:44 +01:00
Matthias Mailänder
813faee4aa avoid unneccessary float calculations and conversions 2013-03-25 12:38:57 +01:00
Matthias Mailänder
851512a84e eliminate public CursorProvider.Palettes
don't hand over the cursor palette to the world renderer at all
still update worldrender palette (set and apply modifiers)
2013-03-25 06:30:39 +01:00
Matthias Mailänder
ba12aafd78 refactor cursor rendering
create a new cursor palette only once and not in WorldRenderer
move cusrsor sequence lookup and drawing to CursorProvider
2013-03-24 21:21:30 +01:00
Igor Popov
41d0860db4 option to disable bots on server + disable bots on any dedicated server due to #2540 2013-03-24 19:35:44 +04:00
Matthias Mailänder
227a7a61eb don't crash when trying to get the game assets on first start
wr is null at that stage
2013-03-24 15:16:49 +01:00
Matthias Mailänder
baacad8432 add Shroud selector to spectator mode, closes #2463 2013-03-24 10:42:58 +01:00
Chris Forbes
eb4f7a046f Merge pull request #2818 from Mailaender/diplomacy-renovation
Bring the Diplomacy menu back to life...
2013-03-24 01:07:20 -07:00
Chris Forbes
14468b4895 Merge pull request #2819 from Mailaender/game-start-sound
Battlecontrol initialized!
2013-03-24 00:49:04 -07:00
Matthias Mailänder
91442a0414 add a close button with hotkey to diplomacy widget 2013-03-24 08:37:38 +01:00
Paul Chote
0167bbfbaa Move weapon/turret definitions out of AttackBase.
Weapons are now defined with the Armament trait
and turret parameters live in Turreted.
This has the side effect of allowing any number
and distribution of weapons and turrets.
2013-03-24 11:58:45 +13:00
Matthias Mailänder
3e63751960 fix RA Desert palette rotation regressions 2013-03-23 22:13:35 +01:00
Igor Popov
10ec82d1bb give user info that new map has been downloaded (being in lobby). so he is not confused with the reason of black screen 2013-03-23 19:46:41 +04:00
Igor Popov
1005c0bc08 auto-map-downloading 2013-03-23 19:29:52 +04:00
Igor Popov
586723926a auto-map-downloading updated. (sync) 2013-03-23 19:27:53 +04:00
Matthias Mailänder
7f6eaf8d5e move order button hotkey logic to ingame chrome logic
removes power-down again from cnc mod as it is not wanted there
2013-03-23 09:47:35 +01:00
Matthias Mailänder
7e9c20df71 remove bashisms for extended portability 2013-03-22 23:42:54 +01:00
Matthias Mailänder
c00eee835f package .desktop files for map editor on Linux, too
move desura scripts into packaging sub-directory
2013-03-22 23:42:47 +01:00
Matthias Mailänder
0880c1241d fixes #2190 added announcer voice upon game start
Thanks to @Nyerguds for mixing this together for the RA mod!
2013-03-22 22:54:45 +01:00
Matthias Mailänder
6307e51991 put NextAutoTargetScanTime into syncreport.log 2013-03-22 19:19:16 +01:00
Matthias Mailänder
43bb75c135 sync carpet bombing 2013-03-22 19:19:16 +01:00
Matthias Mailänder
6cedc424ed dump the actor the unit tried to retiliate against to syncreport 2013-03-22 19:19:16 +01:00
Matthias Mailänder
15324b1f1a bring the Diplomacy menu back to life, but
- rename LockTeams to FragileAlliances to avoid confusion
- only allow it in Free-For-All, not Team games or Missions
- grey out non-functional buttons and disabled checkboxes
2013-03-22 18:34:52 +01:00
Matthias Mailänder
2d6200792d recommend Cg-Toolkit as soft dependency for Fedora/SUSE
it is in the non-free / RPMfusion repositories
2013-03-22 08:32:33 +01:00
Matthias Mailänder
28d740dfc3 Desura compatibility
- create launch scripts for Desura
- that access local installation launch scripts
- clean up /usr/* launch scripts created during make install
2013-03-22 08:32:33 +01:00
Chris Forbes
aa6f12f0a1 Merge pull request #2816 from ScottNZ/radoc
radoc tidy
2013-03-21 23:28:51 -07:00
Scott_NZ
a25aa23805 radoc tidy 2013-03-22 18:12:47 +13:00
Chris Forbes
9b1555d3a1 Merge pull request #2809 from bidifx/dblclick
double click on server to join
2013-03-21 10:54:22 -07:00
Sascha Biedermann
594e3c14e6 fixes #2799: double click on server to join 2013-03-21 18:14:57 +01:00
Chris Forbes
942cbb2fe2 Merge pull request #2808 from Mailaender/trait-documentation
Auto-Generated Trait Documentation
2013-03-20 17:31:18 -07:00
Chris Forbes
38f0d722c6 Merge pull request #2810 from bidifx/cancel-chat
cancel ingame-chat with esc
2013-03-20 17:18:18 -07:00
Sascha Biedermann
d53dcc859f fixes #2795: cancel chat with esc 2013-03-20 23:55:12 +01:00
Matthias Mailänder
65c9d4295b automatically update the wiki documentation each release 2013-03-20 23:27:53 +01:00
Matthias Mailänder
c731a7960e embed the previously manually edited outdated documentation
from https://github.com/OpenRA/OpenRA/wiki/Trait-Documentation
2013-03-20 21:20:27 +01:00
Sascha Biedermann
ed0e0a8a41 added Sascha Biedermann to AUTHORS 2013-03-20 20:48:02 +01:00
Chris Forbes
89228cd484 Merge pull request #2804 from bidifx/range-circle
added contrast to range circle
2013-03-20 11:06:41 -07:00
Sascha Biedermann
35f4230984 added contrast to range circle 2013-03-20 18:53:28 +01:00
Matthias Mailänder
8226fd21f9 ship a proper SDK for modders
including the OpenRA.TilesetBuilder.exe fixes #2316
and auto-generated trait documentation fixes #2437
compile Markdown to HTML for offline use
purge external files from the doc folder (moved to Wiki)
remove unused non-free Dune 2000 font
2013-03-20 17:04:38 +01:00
Chris Forbes
d0cf627b23 add --docs flag for utility 2013-03-20 15:12:58 +01:00
Matthias Mailänder
57d85e2c97 fixes #2785 don't crash when last player leaves game in cnc 2013-03-20 12:44:47 +01:00
Matthias Mailänder
e9602ca4e9 pull cnc sell/repair button hotkeys from settings 2013-03-20 12:06:51 +01:00
Matthias Mailänder
f0876828f4 fixes #2791 don't crash on powerdown hotkey when playing cnc 2013-03-20 11:54:15 +01:00
Matthias Mailänder
99c3272a81 add tab cycle key to setting GUI 2013-03-20 08:24:51 +01:00
Chris Forbes
7c31a8f28e Merge pull request #2789 from bidifx/lobby
update player list in lobby gracefully for better user experience
2013-03-19 12:26:51 -07:00
Chris Forbes
989dd7eef4 Merge pull request #2796 from Mailaender/attack-sync
Put attack traits into the syncreport.log
2013-03-19 12:26:21 -07:00
Chris Forbes
8c811ed21d Merge pull request #2798 from bidifx/contrail
smooth contrails
2013-03-19 12:24:50 -07:00
Sascha Biedermann
e562f8d2cc refactored Average method in PPos 2013-03-19 19:58:30 +01:00
Matthias Mailänder
c41ad3d600 put attack traits into the syncreport.log 2013-03-19 19:40:14 +01:00
Sascha Biedermann
021e1116b8 added moving average to contrails to smooth them when aircraft are circling 2013-03-19 18:41:36 +01:00
Sascha Biedermann
b6d09b8829 fixed child removal
fixed relayout on draw
refactored child remove/replace into ScrollPanelWidget
fixed scrolling on child remove
2013-03-19 17:39:07 +01:00
Chris Forbes
78f961f653 Merge pull request #2782 from ihptru/clear-master-list
fix #2780 ; Send state=3 to master server when it's not dedicated and ad...
2013-03-18 15:15:46 -07:00
Chris Forbes
3e787315d2 Merge pull request #2788 from psydev/patch-3
Flamethrower range reduced to 2.5
2013-03-18 15:12:58 -07:00
Sascha Biedermann
770d79da0b update player list in lobby gracefully for better user experience 2013-03-18 22:25:31 +01:00
psydev
0172c5e5ce Flamethrower range reduced to 2.5
Flamethrower seems OP, and flamethrower spam can dominate early game without much to counter it. Reduced range back to earlier levels (in C&C 95 it was 2).
2013-03-18 13:16:40 -07:00
ScottNZ
1fb2796ada Update cheats.yaml
We're an American game
2013-03-18 22:59:43 +13:00
Matthias Mailänder
46465da483 Merge pull request #2781 from ScottNZ/ui
Pause the game when users navigate to the options menu in SP mode
2013-03-17 04:00:33 -07:00
Igor Popov
751b6594a8 fix #2780 ; Send state=3 to master server when it's not dedicated and admin presses disconnect 2013-03-17 13:48:40 +04:00
Matthias Mailänder
ff04d0fa8f Merge pull request #2779 from psydev/patch-9
cnc infantry anims running ticks corrected and heli explosions added
2013-03-17 02:29:36 -07:00
psydev
ff983157a6 removed FlamethrowerExplode for now
Removed FlamethrowerExplode for now, until it is certain what the damage stats should be and the probability of exploding.
2013-03-17 01:57:52 -07:00
psydev
604854f22d added helicopter explosions; a10 hp boost
Helicopters get explosions, when they fall from the sky, and then when they collide with the ground (and do damage).
A-10 HP raised from a very small 60 to 150.
2013-03-17 01:35:51 -07:00
psydev
5381b1fbac added explosion for helicopters crashing on ground 2013-03-17 01:30:36 -07:00
Scott_NZ
2722fc5434 Pause the game when users navigate to the options menu in SP mode 2013-03-17 21:14:49 +13:00
psydev
5ac47b49ce Helicopters do HeliExplode when they die
Helicopters give off a nice explosion before falling to the ground.
2013-03-16 22:23:06 -07:00
psydev
acf779ace3 Flame Tank gets FlametankExplode when it dies
Flame Tank gets FlametankExplode when it dies (big explosion that hurts nearby units)
2013-03-16 22:20:42 -07:00
psydev
451c453442 added unit explosions for flametank, helis
added unit explosions for flametank, helis and flamethrower e4
changed GrenadierExplode and UnitExplodeSmall a bit
2013-03-16 22:17:30 -07:00
psydev
b8b258c6f9 construction yard does crane animation slower
when building other buildings, construction yard crane should go slower, at ~100 tick.
2013-03-16 21:56:35 -07:00
psydev
9fe429aeb8 infantry anims: running ticks corrected
I guess nobody noticed, but in CNC and RA, the legs of infantry move way too fast. It should be ~100 Tick.
2013-03-16 21:48:55 -07:00
Chris Forbes
86b55a6444 Merge pull request #2776 from psydev/patch-8
vehicles: MCV enabled; msam use patriot; shroud
2013-03-16 21:28:14 -07:00
psydev
5d564e2378 vehicles: MCV enabled; msam use patriot; shroud
MCV re-enabled. A construction yard build radius will be included in a later release to rein in basewalking.
Mobile SAM launcher's weapon is Patriot missile instead of HonestJohn.
Shroud reveal ranges on a few units adjusted
2013-03-16 21:19:00 -07:00
Chris Forbes
d54282be14 Merge pull request #2775 from psydev/patch-7
Adjustments for cnc
2013-03-16 21:01:04 -07:00
psydev
bb31654289 Tower adjustments
ATWR HP reduced from 800 to 600
ATWR power consumptions inreased from 20 to 30
Increased sight range of towers to match their range. 
Silo moved over in build queue
2013-03-16 20:47:21 -07:00
Chris Forbes
0680b06383 Merge pull request #2771 from Mailaender/bleed
add Valkirie to AUTHORS
2013-03-14 17:12:06 -07:00
Matthias Mailänder
2dd8426dec add @Valkirie to AUTHORS
he contributed the initial HackyAI extensions
2013-03-14 22:15:27 +01:00
Chris Forbes
b1eef4ec55 Merge pull request #2769 from Mailaender/bleed
Adds a Travis build check button to the repository frontpage
2013-03-14 11:40:14 -07:00
Chris Forbes
b36d83b7cd Merge pull request #2768 from Mailaender/bot-hotfixes
Fix Desync when Bots fire Super Weapons
2013-03-14 11:35:52 -07:00
Matthias Mailänder
75a1115685 add a Travis build check button 2013-03-14 12:40:26 +01:00
Matthias Mailänder
36e820308f AI support power activation needs to go through order manager
fixes a desync whenever it will do so only on the host

+island map AI which will only build navy / air force to test
it and have a suitable bot for those map types (fixes pathfinder
eating up all CPU because it can't reach you with ground units)
2013-03-14 10:48:36 +01:00
Matthias Mailänder
431961401f Merge pull request #2765 from BugraC/myPatch
I added myself to the Authors file
2013-03-13 00:46:51 -07:00
Bugra Cuhadaroglu
d6953b88ea I added myself the Authors.
Thank you very much guys!
2013-03-12 23:00:47 -04:00
Scott_NZ
6bbef8d33f Fix crash in CaptureActor.Tick when trying to capture a dead actor 2013-03-13 11:14:45 +13:00
Chris Forbes
e4806e4d39 Merge pull request #2761 from Mailaender/production-speedup-hotfix
Fixes #2753 ClassicProductionQueue related crashes
2013-03-12 11:35:58 -07:00
Matthias Mailänder
6d6664d930 make classic production queue speedup less error prone
- avoid float modifiers because of rounding errors and desync
- try not to crash when the last production building is gone
- don't do LINQ queries on selfsame buildings if not required
2013-03-12 12:49:16 +01:00
Matthias Mailänder
7676ef6a14 Merge pull request #2760 from ScottNZ/devmode
Make FACT buildable when "Build Everything" is turned on
2013-03-12 01:42:55 -07:00
Scott_NZ
712b29d233 Make FACT buildable when "Build Everything" is turned on 2013-03-12 21:13:21 +13:00
Matthias Mailänder
65455ee1ca Merge pull request #2556 from ihptru/maptitle
return mapTitle in ra and d2k lobby
2013-03-12 00:46:58 -07:00
Bugra Cuhadaroglu
0d86595ba8 Ranks not showing in Replay Viewer
This will fix the problem.
2013-03-12 12:37:26 +13:00
Matthias Mailänder
4ab2fa21eb Merge pull request #2756 from chrisforbes/master
Fix desync on win or lose
2013-03-11 14:43:03 -07:00
Chris Forbes
1f3710b90e Merge pull request #2757 from Mailaender/desktop-fix
Fix missing .desktop file in latest playtests
2013-03-11 14:20:42 -07:00
Matthias Mailänder
c8a457bdce simplify desktop file installation on Linux
the old Ubuntu build machine is unable to do it
2013-03-11 22:18:53 +01:00
Chris Forbes
67ca37326e fix desync on win/lose 2013-03-12 10:15:04 +13:00
Chris Forbes
2dd53e6d99 Merge pull request #2612 from Mailaender/burning-trees
Destructible trees for both CnC and RA mod
2013-03-11 13:16:49 -07:00
Chris Forbes
623fce3cdf Merge pull request #2754 from Mailaender/auto-target-desync-hotfix
Hotfix: Addresses Desync Issues in AutoTarget Trait
2013-03-11 13:08:10 -07:00
Matthias Mailänder
97d850e481 use integer math to calculate next auto-target scan-time
to combat random desync problem because of rounding problems
2013-03-11 14:02:28 +01:00
Bugra Cuhadaroglu
7cbc4a29bf Fix #2720 - Diagonal scrolling area in viewport corners are too small
I added two options, one is for EdgeScrollThreshold and the other one is
EdgeCornerScrollThreshold. You can modify these threshold as much as you
want.

[Squashed down into one commit -- chrisf]
2013-03-11 16:32:42 +13:00
Chris Forbes
9db06ca222 Merge pull request #2748 from BugraC/bleed
Csproj BuildEvents problem in both Linux and Windows
2013-03-10 19:23:26 -07:00
Chris Forbes
63e5ce2bc5 Merge pull request #2749 from Mailaender/chrome-yaml-fixes
Chrome yaml fixes
2013-03-10 19:23:09 -07:00
Matthias Mailänder
8bb1d83fb7 add new lobby buttons to d2k chrome as well 2013-03-11 03:18:02 +01:00
Matthias Mailänder
947c9d73ce add new developer cheats to cnc chrome
fixes a crash
2013-03-11 03:13:25 +01:00
Matthias Mailänder
66855072de update changelog for new playtest release 2013-03-11 02:53:32 +01:00
Bugra Cuhadaroglu
c145dc2379 Csproj BuildEvents problem in both Linux and Windows
I have found this error with the OpenRa.Mods.RA csproj: copy
"thirdparty/FuzzyLogicLibrary.dll" "$(SolutionDir)", this should be: cd
"$(SolutionDir)thirdparty/"
copy "FuzzyLogicLibrary.dll" "$(SolutionDir)" in two seperated codes,
this FuzzyLogicLibrary.dll copy error can be fixed in both Windows and
Linux environment
2013-03-10 21:17:54 -04:00
Chris Forbes
f2b7c2c2ad Merge pull request #2715 from xaionaro/bleed
Adapted to dpkg's "--instdir"-like options.
2013-03-10 18:13:31 -07:00
Chris Forbes
6bfeb12d33 Merge pull request #2747 from psydev/patch-6
added a blue tiberium blossom tree.
2013-03-10 18:13:05 -07:00
psydev
09bef2d4c2 Gave blue tiberium blossom a sequence; changed #2
Blossom tree has a sequence. 
There are two blossom trees in C&C, so I will use the first one (split2) for green tiberium and the 2nd one (split3) for blue tiberium. The old split3 still exists for backwards-compatibility, but will now show the split2 image. Only the blue tiberium blossom tree will show the split3 image.
2013-03-10 18:00:21 -07:00
psydev
53fec13183 added a blue tiberium blossom tree. 2013-03-10 17:55:54 -07:00
Chris Forbes
6427ad1cf9 Merge pull request #2683 from Mailaender/survival01
Survival01 by @NukemBro
2013-03-10 16:20:59 -07:00
Chris Forbes
c5d97fea69 Merge pull request #2738 from Mailaender/a-star
A-star debug overlay
2013-03-10 16:20:34 -07:00
Chris Forbes
7a41b10618 Merge pull request #2744 from ScottNZ/lobby
Add "Assign Teams" lobby drop down button
2013-03-10 16:20:19 -07:00
Chris Forbes
2032a7efa4 Merge pull request #2745 from Mailaender/more-settings
Add hidden settings to the GUI
2013-03-10 16:20:04 -07:00
Scott_NZ
bd292b56cf Ignore spectators when counting clients for the assignteams command 2013-03-11 01:20:08 +13:00
Scott_NZ
7af91f1747 Disable the button/order when there aren't enough clients to assign 2013-03-11 00:29:23 +13:00
Matthias Mailänder
17d032b190 destructible trees for both CnC and RA mod
- move DeadBuildingState to OpenRA.Mods.RA
- don't loop sequences with length > 1
2013-03-10 10:08:59 +01:00
Matthias Mailänder
9d6c8453fd add hidden MaxFPS settings to ra/d2k GUI 2013-03-10 09:42:05 +01:00
Matthias Mailänder
6bbe5f633c expose hidden Debug settings to ra/d2k GUI
- performance text switch
- performace text update rate
- AI debug messages
- trait report threshold ticks
2013-03-10 09:40:08 +01:00
Matthias Mailänder
ba8c9bb1b1 added hidden audio settings to ra/d2k GUI
- video volume
- map music (was shellmap music)
- sound engine
2013-03-10 09:34:15 +01:00
Scott_NZ
8c46b421de Add "Assign Teams" lobby drop down button 2013-03-10 20:46:29 +13:00
Matthias Mailänder
1a6a7da9c1 apply recent refactoring to quad renderer 2013-03-10 07:47:00 +01:00
James Dunne
d8c752ecb9 DebugOverlay improvements to only render inside viewing range. 2013-03-10 07:35:36 +01:00
James Dunne
7e913c4bb7 Lame attempts to improve A*. 2013-03-10 07:33:31 +01:00
Matthias Mailänder
2abde381a7 Exposed PathSearch.owner and removed Player argument from PathFinder functions. 2013-03-10 07:33:31 +01:00
Matthias Mailänder
493eb10b96 Now coloring A* cells by owning player color. Added checkbox to cheats menu. 2013-03-10 07:33:25 +01:00
Matthias Mailänder
7d0de5645f Added QuadRenderer to render shaded/colored quads. Added DebugOverlay to World to show A* bidi search cost per cell. 2013-03-10 07:32:35 +01:00
Matthias Mailänder
290310fbe8 Added Mission Survival01 mission 2013-03-10 07:28:21 +01:00
Chris Forbes
19e6a588b8 Merge pull request #2589 from Mailaender/travis
Travis CI support
2013-03-09 21:11:54 -08:00
Chris Forbes
b39f540e4b Merge pull request #2736 from Mailaender/better-bots
Better AI Bots
2013-03-09 21:11:29 -08:00
Chris Forbes
e45fc0079c Merge pull request #2729 from Mailaender/sync
Dump some more values into the debug log to investigate desyncs
2013-03-09 21:10:42 -08:00
Chris Forbes
25971bf98f Merge pull request #2725 from psydev/patch-5
defaults.yaml: unit speeds fix; husk burn; tanks explode small
2013-03-09 21:09:51 -08:00
Chris Forbes
3f273674f7 Merge pull request #2737 from Mailaender/shroud-sync
add Shroud, CreatesShroud and RevealsShroud to syncreport.log
2013-03-09 21:09:31 -08:00
Chris Forbes
da566f3648 Merge pull request #2731 from pchote/renderer-cleanup2
Renderer refactoring - Duplication
2013-03-09 21:08:34 -08:00
Chris Forbes
70e823f526 Merge pull request #2739 from Mailaender/shroud-dev-cheats
Additional Developer Shroud Cheats
2013-03-09 21:07:41 -08:00
Chris Forbes
0411b34bbd Merge pull request #2741 from Mailaender/classic-mods
Classic mods
2013-03-09 21:06:41 -08:00
Matthias Mailänder
49cfa21ddb separate spy disguise and infiltrate
- add thief to classic-ra & monster tank madness
- remove crude workarounds for allies04
2013-03-09 13:48:31 +01:00
Matthias Mailänder
7675a69cec add copy FuzzyLogicLibrary.dll to csproj files for msbuild 2013-03-08 19:27:11 +01:00
Matthias Mailänder
ca6cc3fbe1 add unused Red Alert actors for legacy map import
- thief
- chan
- general
- mobile radar jammer
2013-03-08 11:22:59 +01:00
Matthias Mailänder
455c66e2eb fix HPAD renaming in GDI01 2013-03-08 09:40:12 +01:00
Matthias Mailänder
de30f0a917 make fog of war rendering optional for classic mods 2013-03-08 09:40:12 +01:00
Matthias Mailänder
b16b171b1e cnc classic helis rearm at hpad and repair at fix
don't crash due to missing sequences for GDI/NOD hpads
2013-03-08 09:40:12 +01:00
Matthias Mailänder
804729deac remove line build feature for walls in classic mods 2013-03-08 09:40:12 +01:00
Matthias Mailänder
f3e0ff8758 fix #2709 CustomBuildTimeValue should not desync
remove redundant code by outsourcing raw build time calculation
2013-03-08 09:40:11 +01:00
Matthias Mailänder
e3fbd40278 added classic engineer capture rules 2013-03-08 09:40:11 +01:00
Matthias Mailänder
f2703dd65d apply recent palette refactoring changes to classic mods 2013-03-08 09:40:11 +01:00
Matthias Mailänder
2f917982fd add a quick RA classic loadscreen replacement to avoid confusion 2013-03-08 09:40:11 +01:00
Matthias Mailänder
f29238df6e add production queue speedup to classic mods 2013-03-08 09:40:11 +01:00
Matthias Mailänder
71b1cf9cb2 move Nod01 to cnc-classic mod; fix FMV, music; avoid menu crash 2013-03-08 09:40:11 +01:00
Dan9550
20737415fa started work on NOD_01 2013-03-08 09:40:11 +01:00
Matthias Mailänder
6e9ac71168 fix GDI01 FMV problems and gunboat crash
- show video not only the sound
- start the game after video playback
- don't crash after the win/loose movies are played
- don't crash when moving the gunboat
2013-03-08 09:40:11 +01:00
Cody Brittain
15032e3a40 Update mods/cnc-classic/rules/defaults.yaml
Fix a building explosion sound
2013-03-08 09:40:10 +01:00
Cody Brittain
eed8cf2cf0 Update mods/cnc-classic/mod.yaml
Update mod Name and Description
2013-03-08 09:40:10 +01:00
Cody Brittain
27235df950 Update mods/cnc-classic/rules/structures.yaml
Turret no longer buildable by GDI, Guard Tower no longer buildable by Nod
2013-03-08 09:40:10 +01:00
Cody Brittain
0902dcb7f3 Update mods/cnc-classic/rules/vehicles.yaml
Just a compromise
2013-03-08 09:40:10 +01:00
Cody Brittain
8bdcbe727f Update mods/cnc-classic/rules/system.yaml
Fix sound
2013-03-08 09:40:10 +01:00
Matthias Mailänder
e4a7e9716e Add contributers of cnc-classic 2013-03-08 09:40:10 +01:00
Matthias Mailänder
7052b72f48 remove roof from classic hover craft to fix rendering of cargo 2013-03-08 09:40:10 +01:00
Matthias Mailänder
3e5ee4dc1b add movement flash sequence to cnc-classic 2013-03-08 09:40:10 +01:00
Matthias Mailänder
190342a2c8 remove traits we don't need in cnc-classic 2013-03-08 09:40:10 +01:00
Matthias Mailänder
82568376a0 move GDI01 to classic mod and fix crash on startup 2013-03-08 09:40:10 +01:00
Matthias Mailänder
e47cc68ee2 fix RALint cnc-classic errors 2013-03-08 09:40:09 +01:00
Matthias Mailänder
d56bf2ee34 added a few explosion animations 2013-03-08 09:40:09 +01:00
psydev
07f0fcde33 created weapons.yaml
I'm can't remember what differences, if any, there are between cnc and cnc-classic for this file. I edited it ~6 months ago.
2013-03-08 09:40:09 +01:00
psydev
de3814dcd2 Create explosions.yaml
CNC Classic uses many different explosion types (imitating C&C Gold). Decided they should get their own file. 
Explosions are not perfect renditions of C&C Gold's (in particular, I have not estimated precisely how much damage they do to surrounding units). Graphics are mostly identical, though.
2013-03-08 09:40:09 +01:00
psydev
cc2440d0a2 added explosions.yaml to mod 2013-03-08 09:40:09 +01:00
psydev
3123f6672b replaced vehicles.yaml
Completely replaced vehicles.yaml. All values should correspond with C&C Gold. 
(Cost, HP, speed, armor type, vision, pre-reqs, explosion type...)
-Re-ordered units list from basic at the top to advanced at the bottom.
2013-03-08 09:40:09 +01:00
psydev
382997086d re-write defaults.yaml
Re-writing defaults.yaml to enter values from C&C Gold. 
Vehicles & tanks have a small explosion by default now.
2013-03-08 09:40:09 +01:00
psydev
43995ebb28 re-wrote structures.yaml
Structures should now have same values C&C Gold now. 
Helipad is not perfect (unit does not spawn in the center)
There may be issues with how the ion cannon does damage differently to weapons factory vs. airfield (also an issue in regular CNC fork).
List of buildings has been organized from basic to advanced, and in-game build menu has been changed to be more logical.
2013-03-08 09:40:09 +01:00
psydev
1725fdcf8a re-wrote infantry.yaml
Unit values are now same as C&C Gold, including new unit dependencies.
(vision range is approximate, due to rendering differences for sight range)
2013-03-08 09:40:09 +01:00
psydev
e0362f3c36 made some minor money changes (start, crate)
Starting money now 5000 instead of 10,000
Crates now give 2000 instead of 1000
Warning audio (low power, silos needed) 20 seconds instead of 10.
2013-03-08 09:40:08 +01:00
Matthias Mailänder
53fefa7c10 cnc-classic mod with ClassicProductionQueue and skin by Harisson 2013-03-08 09:40:08 +01:00
Matthias Mailänder
1d0ae1a39b move classic maps to classic mod 2013-03-08 09:40:08 +01:00
Dan9550
b6a3d1c2ae just tweaked a spawn point 2013-03-08 09:40:08 +01:00
Dan9550
11dcabae73 added maps converted from c&c and covert ops 2013-03-08 09:40:08 +01:00
Matthias Mailänder
d61cc913c0 don't hardcode the RALoadScreenImage 2013-03-08 09:40:08 +01:00
Matthias Mailänder
527790f962 move SpeedUp to ClassicProductionQueueInfo 2013-03-08 09:40:08 +01:00
Matthias Mailänder
ecd4ff68a4 speed up production if multiple buildings of the same type exist 2013-03-08 09:40:07 +01:00
Matthias Mailänder
d4ea8aad8d fix mysterious ralint problem in ra-classic weapon yaml 2013-03-08 09:40:07 +01:00
Matthias Mailänder
f44a14c81e added classic-ra dialog reskin & improved allies chrome by JOo 2013-03-08 09:40:07 +01:00
Matthias Mailänder
7caf2956d7 merge RA Classic 0.1 yaml rules by @Iran 2013-03-08 09:40:07 +01:00
Matthias Mailänder
7398914af9 add a classic allies chrome reskin prototype by JOo 2013-03-08 09:40:07 +01:00
Matthias Mailänder
fb82d554fa add contributers of ra-classic to AUTHORS 2013-03-08 09:40:02 +01:00
Paul Chote
8a53819f50 Redirect IShader calls via respective *Renderers. 2013-03-08 18:21:35 +13:00
Matthias Mailänder
58c3b52a1a add reset exploration developer cheat 2013-03-07 20:32:00 +01:00
Matthias Mailänder
4a26d3f36e fix AutoTarget sync
- ISync interface was missing
- UnitStance enum was unhashable
2013-03-07 13:00:41 +01:00
Paul Chote
21e8e3a78d Remove unnecessary duplication between renderers. 2013-03-08 00:07:26 +13:00
Matthias Mailänder
7bf00a766f add a stripped down ra-classic mod cloning the current ra rules 2013-03-07 11:25:42 +01:00
Matthias Mailänder
8f69ea9da6 added classic map pack converted by @dan9550 2013-03-07 11:25:41 +01:00
Matthias Mailänder
60923e3413 log panicking infantry to the syncreport.log 2013-03-07 08:33:02 +01:00
Matthias Mailänder
72841a51e6 add shroud, creates shroud and reveals shroud to syncreport 2013-03-06 16:05:31 +01:00
Matthias Mailänder
5d441d2591 add Vladimir Komarov to AUTHORS
he contributed the fuzzy-ai
2013-03-06 11:53:26 +01:00
Matthias Mailänder
b001c83bd5 backport rallypoint changes to ai update branch 2013-03-06 11:53:19 +01:00
Vladimir Komarov
b1afeb4408 fix comparing with null 2013-03-06 11:49:45 +01:00
Matthias Mailänder
f6d4b860ee husks are invalid targets 2013-03-06 11:49:45 +01:00
Matthias Mailänder
5d2b704608 fix Makefile, prepare FuzzyLogicLibrary for packaging 2013-03-06 11:49:45 +01:00
Matthias Mailänder
d0f61faf4a add generalized ai variables 2013-03-06 11:49:45 +01:00
Matthias Mailänder
0e1229e8d1 fix air 2013-03-06 11:49:45 +01:00
Matthias Mailänder
d785430db5 fix refinery production 2013-03-06 11:49:45 +01:00
Matthias Mailänder
59d0cff410 rename lists in HackyAI.cs and fix function 2013-03-06 11:49:40 +01:00
Matthias Mailänder
e0b7242f1b adding new ai functional 2013-03-06 11:17:02 +01:00
Matthias Mailänder
3f56e00173 Merge pull request #2721 from psydev/patch-1
weapons.yaml update for CNC
2013-03-05 10:59:03 -08:00
psydev
f8fd6681c8 fixed APC gun mistkae -- now shoots at air too 2013-03-04 09:01:10 -08:00
Matthias Mailänder
a02fddd1a0 log the nextScanTime for ChooseTarget in AutoTarget
for debugging purposes to investigate desyncs
2013-03-04 10:25:20 +01:00
Paul Chote
786c3b1f1a Rename uniform setters to avoid future ambiguity. 2013-03-04 19:06:42 +13:00
psydev
01cb3a40d7 scaled back tank firing rate a bit
Originally I increased the tank firing rate by 2x, but I think 1.5x makes more sense. (Now fairly comparable to RA values). Going to leave it here.
Reduced Artillery damage vs. wood from 75% to 50%.
Slight tweak to recon bike damage 
Slight tweak to Stealth Tank damage vs. heavy armor
2013-03-03 19:31:33 -08:00
Chris Forbes
8931a1f4c1 Merge pull request #2722 from psydev/patch-2
vehicles.yaml update; a few smaller updates.
2013-03-03 17:46:39 -08:00
Chris Forbes
daa8e087f3 Merge pull request #2724 from psydev/patch-4
system.yaml: blue tiberium fix; crate fix (no mcvs)
2013-03-03 17:46:21 -08:00
Matthias Mailänder
29e917ae88 division through cell size to coarse cell coordinate vector 2013-03-03 23:11:03 +01:00
Matthias Mailänder
ef36c446bd log projectile dest as it is affected by inaccuracy calc
want to debug if this is the source of problems
2013-03-03 22:31:23 +01:00
Matthias Mailänder
76644537e2 give the users some hints when crashing due to desync 2013-03-03 19:34:10 +01:00
psydev
db521dad74 unit speeds fix; husk burn; tanks explode small
Vehicle speeds adjusted, now 80% on clear, like tanks. Intended to coincide with speed changes here: https://github.com/OpenRA/OpenRA/pull/2722
Husks burn 10 seconds now instead of 40. More fitting for cnc.
Tanks UnitExplodeSmall now by default.
2013-03-03 05:41:04 -08:00
psydev
8b504bc4b1 blue tiberium fix. crate fix (no mcvs)
Blue tiberium now poisons infantry
Crates no longer provide MCVs
levelup crate removed
crate lifetime increased
2013-03-03 05:35:01 -08:00
psydev
7503de33a5 vehicles.yaml update
see https://github.com/OpenRA/OpenRA/pull/2671 for details and rationales
2013-03-03 05:27:44 -08:00
psydev
9df613ee27 weapons.yaml update for CNC
See https://github.com/OpenRA/OpenRA/pull/2655 for details and rationales.
2013-03-03 05:03:04 -08:00
Scott_NZ
2f3def3f86 Updated CHANGELOG 2013-03-04 01:08:55 +13:00
Chris Forbes
5426e2c831 Merge pull request #2718 from Mailaender/admin-indicator
remove admin indicator icon to avoid confusion/overlapping
2013-03-03 01:35:15 -08:00
Chris Forbes
38b2b6cb4e Merge pull request #2557 from ihptru/fix2480
fix #2480; Direct Connect to different mod causes crash (saying 'missing...
2013-03-02 13:45:28 -08:00
Chris Forbes
94415d9cfb Merge pull request #2717 from Mailaender/gems-terrain
fixes #2716
2013-03-02 13:37:06 -08:00
Chris Forbes
2fb822e1c1 Merge pull request #2719 from Mailaender/hotkeys
Additional Hotkeys
2013-03-02 13:35:38 -08:00
Matthias Mailänder
0978d21439 fix problems in MultiTapDetection 2013-03-02 16:52:59 +01:00
Matthias Mailänder
775b0409c4 don't hard-code the pause-key 2013-03-02 15:56:13 +01:00
Matthias Mailänder
1083f8cf55 double-tap 0-9: select and center the control group 2013-03-02 15:55:42 +01:00
Matthias Mailänder
4cf8f9a434 remove admin indicator icon to avoid confusion/overlapping
print admin names in bold text instead
2013-03-02 15:01:11 +01:00
Matthias Mailänder
6152fa2890 fixes #2716
Gems were non-pathable and therefore also uncollectible
2013-03-02 14:58:17 +01:00
Matthias Mailänder
c0a702a386 new hotkey to center your view on the current selection 2013-03-02 11:53:45 +01:00
xaionaro
a332f3189b Adapted to dpkg's "--instdir"-like options.
For example, this may be useful if it is used a lot of versions of openra on debian
2013-03-02 13:36:33 +04:00
Okunev Yu Dmitry
e042ec5f3f Merge pull request #1 from OpenRA/bleed
Bleed
2013-03-02 00:19:25 -08:00
Chris Forbes
336076c248 Merge pull request #2665 from Mailaender/pvecfloat-combat
Fix floating point inconsistencies to reduce desyncs
2013-03-02 00:01:53 -08:00
Chris Forbes
c21b60f555 Merge pull request #2675 from Mailaender/simple-hotkey-config
user-configurable hotkey via in-game settings
2013-03-02 00:01:01 -08:00
Chris Forbes
efd0d81dca Merge pull request #2714 from ScottNZ/lobby
Revert client colours to their preferred colours after the map is changed
2013-03-02 00:00:04 -08:00
Scott_NZ
63467cd000 Revert client colours to their preferred colours after the map is changed to a map which doesn't lock colours. 2013-03-02 16:18:09 +13:00
Chris Forbes
46f4685eec Merge pull request #2712 from Mailaender/gems-minimap-color
Render crystals in a different color on the mini-map
2013-03-01 15:06:07 -08:00
Chris Forbes
af3a5cf939 Merge pull request #2713 from pchote/parachute-fix
Fix crash when an opponent uses Paratroopers.
2013-03-01 14:41:23 -08:00
Paul Chote
fb0ce8c06a Fix crash when an opponent uses Paratroopers. 2013-03-02 10:09:38 +13:00
Matthias Mailänder
8358597fd2 render crystals in a different color on the mini-map 2013-03-01 21:06:09 +01:00
Matthias Mailänder
b31f830cb1 key config settings code cleanup
- move label and textfield widget lookup into SetupKeyBinding
- fix wonkey indentions
- remove explicit private in WorldCommandWidget
2013-03-01 19:13:21 +01:00
Chris Forbes
561d47a6a1 Merge pull request #2705 from Mailaender/low-power-gap-crashfix
Fix NullReferenceException in UnHideActor
2013-03-01 01:57:23 -08:00
Chris Forbes
b8b0111aa2 Merge pull request #2706 from Mailaender/cnc-proc-desync-fix
Remove custom build time for Tiberium refinery to fix desyncs
2013-03-01 01:54:51 -08:00
Chris Forbes
f204f25474 Merge pull request #2707 from Mailaender/cnc-lobby-crashfix
Fix #2663 Crash when displaying the spawn tooltip in cnc mod
2013-03-01 01:54:18 -08:00
Matthias Mailänder
47075e1cd0 generate random numbers as floats
as they get converted from double before use anyway
2013-03-01 10:53:41 +01:00
Matthias Mailänder
793dfa5748 don't convert cell size to float for bullet inaccuracy
change it back to int / int / float
from int / float / float
was int / int / float before
2013-03-01 10:49:51 +01:00
Matthias Mailänder
0b493bcb09 remove redundant int to int conversion in rendered circles 2013-03-01 10:48:28 +01:00
Matthias Mailänder
dd476bbf5c add the total number of values extracted from RNG to sync report 2013-03-01 10:48:28 +01:00
Matthias Mailänder
fc5350c9f8 fix #2663 crash when displaying the spawn tooltip in cnc
don't hard-code ra border chrome in shared lobbyutils
2013-03-01 10:30:41 +01:00
Matthias Mailänder
b2c867bf2b remove custom build time for tiberium refinery
- this can be enabled again in cnc-classic
- needs a fix as it causes desyncs
2013-03-01 10:10:26 +01:00
Matthias Mailänder
3d8d116106 fix NullReferenceException in UnHideActor 2013-03-01 10:07:33 +01:00
Matthias Mailänder
4b2f08f21f convert start to int2 as CellContaining() spit that out before 2013-02-28 21:59:18 +01:00
Matthias Mailänder
233088077b don't convert to float2 in ReturnToBase as it was int2 before 2013-02-28 21:59:18 +01:00
Matthias Mailänder
a59621910e avoid floating point operation with heli fly int coordinates 2013-02-28 21:59:18 +01:00
Matthias Mailänder
05b6b59dad use Combat.IsInRange instead of float2.WithinEpsilon for heli 2013-02-28 21:59:18 +01:00
Matthias Mailänder
2bc7570674 remove conditional compile left-over junk 2013-02-28 21:59:18 +01:00
Matthias Mailänder
0085ac130b use PVecFloat in Combat sub-routines 2013-02-28 21:59:18 +01:00
Chris Forbes
7e1ee0e2e5 fix #2661: desyncs with shroud/exploration cheats 2013-03-01 09:29:03 +13:00
Chris Forbes
6bd3de8ec8 Fixed #2696: Sequences: Allow stride to be specified.
This allows you to use just some of the frames of an animation
which has multiple facings.

For example, if you have an animation which has 8 facings, and 6 frames
of animation per facing, but you only want to show 3 of them, you can now do:

    Facings: 8
    Length: 3       # the number of frames in each facing to actually use
    Stride: 6       # the number of frames per facing present in the SHP

If Stride is not specified, it defaults to Length, which is the old behavior.
It is an error to specify a stride less than the length -- this would produce
overlapping facings, or weirder.
2013-02-28 09:08:41 +13:00
Chris Forbes
fab7f2c4b6 Merge pull request #2684 from xaionaro/bleed
fixed a issue with pinging Master-server
2013-02-27 11:50:18 -08:00
Chris Forbes
ea799e5735 Merge pull request #2701 from psydev/patch-49
[cnc] structure sequences tick-rates corrected
2013-02-27 11:49:37 -08:00
Chris Forbes
3ab4112631 Merge remote-tracking branch 'pchote/cleanup' 2013-02-28 08:45:47 +13:00
Scott_NZ
817e6f1ec1 Have Tanya not shoot her pistols at buildings, and have her shoot pistols at barrels instead of using C4 on them 2013-02-27 17:57:53 +13:00
Scott_NZ
81c8f0360f Let's not crash if WeaponInfo.Report[] is empty 2013-02-26 18:08:55 +13:00
psydev
bec29d81c5 cnc-structure sequences tickrate fixed
Strucutre animations were too fast in many cases. These values seem to match up correctly to C&C 95.

Obelisk - Have not yet fixed (will do so when I fix how it fires)
SAM site - Someone may later decide to speed up how fast it pops up, for gameplay purposes
2013-02-25 16:05:11 -08:00
Paul Chote
3a11aeb434 Cache PaletteReference in RenderSimple. 2013-02-26 09:35:41 +13:00
Paul Chote
dddec1ec61 Add INotifyOwnerChanged interface 2013-02-26 09:35:41 +13:00
Paul Chote
82426e0e45 Move Palette from ModData to WorldRenderer. 2013-02-26 09:35:41 +13:00
Paul Chote
3033eb8be0 Die with a helpful error if a palette doesn't exist. 2013-02-26 09:35:41 +13:00
Paul Chote
e9665cf9f3 Remove WorldRenderer.GetPaletteIndex. 2013-02-26 09:35:41 +13:00
Paul Chote
9bc743068a Remove WorldRenderer.GetPalette. 2013-02-26 09:35:41 +13:00
Paul Chote
72a9954491 Simplify PaletteReference interface. 2013-02-26 09:35:40 +13:00
Paul Chote
f2fe30a7bb Remove PaletteReference.FromName from TeslaZap. 2013-02-26 09:35:39 +13:00
Paul Chote
ce39c79477 Apply consistent formatting to PBOG (no code changes). 2013-02-26 09:32:16 +13:00
Paul Chote
6fc4807a10 Remove PaletteReference.FromName from PBOG. 2013-02-26 09:31:19 +13:00
Paul Chote
f890ea010e Pass WorldRenderer to RenderAsTerrain for palette lookup. 2013-02-26 09:24:43 +13:00
Paul Chote
5b360a7fe2 Use PaletteReferences in ShroudRenderer. 2013-02-26 09:24:43 +13:00
Paul Chote
55efd53ef7 Make RenderSimple.Palette protected. 2013-02-26 09:24:43 +13:00
Paul Chote
fa5cf96f40 Ditto for Corpse. 2013-02-26 09:24:43 +13:00
Paul Chote
e33c783fc1 Ditto for GpsDot. 2013-02-26 09:24:42 +13:00
Scott_NZ
1438030e82 Add mood haze effect for Allies 04 2013-02-26 00:10:03 +13:00
Scott_NZ
09e4d64f99 Fix Allies 02 warnings 2013-02-25 23:40:31 +13:00
Scott_NZ
b5bd6191c2 Don't crash (due to replay file being in use) if we have two instances of the game playing 2013-02-25 21:24:17 +13:00
Scott_NZ
e57de0ebce Allies 02 code maintenance. Add FreeActorInit so free harvesters with procs can be disabled etc 2013-02-25 21:24:17 +13:00
Scott_NZ
3bc9e7d2e4 Fix some playerstatistics related crashes for other mods 2013-02-25 21:24:17 +13:00
Scott_NZ
6b636b166c Check Crates setting in CrateSpawner too 2013-02-25 21:24:17 +13:00
Scott_NZ
026a86ba75 Add 'Crates' lobby checkbox and setting for enabling/disabling crate drops 2013-02-25 21:24:17 +13:00
Paul Chote
5a4bd14835 Ditto for RallyPoint. 2013-02-25 21:12:01 +13:00
Paul Chote
43159a0e05 Remove RepairIndicator dependence on target RenderSimple.
This also fixes the case where the building palette doesn't
match the indicator, and saves 2 trait lookups per tick.
2013-02-25 21:12:01 +13:00
Paul Chote
3380817865 Pass WorldRenderer to Render(). 2013-02-25 21:11:33 +13:00
Paul Chote
d6fcaafd78 Let parachute cargo render themselves.
This allows for tanks and other multi-sprite
actors to render correctly while dropping.
2013-02-25 21:10:16 +13:00
Paul Chote
0703f3f164 Extract auto-selection-size into its own interface. 2013-02-25 21:10:08 +13:00
Chris Forbes
a083554218 Merge pull request #2669 from Generalcamo/patch-7
Add support for Nyergud's Music Upgrade pack
2013-02-24 18:20:31 -08:00
Chris Forbes
c34c62ad42 Merge pull request #2672 from psydev/patch-48
[cnc] inftry detect cloaked in next tile(C&C orig)
2013-02-24 18:16:24 -08:00
Chris Forbes
fc3c091a48 Merge pull request #2670 from psydev/patch-47
[cnc] added names for explosions
2013-02-24 18:14:00 -08:00
Paul Chote
000a5eaa56 Pass WorldRenderer to IRenderModifiers and replace more palette lookups. 2013-02-24 15:45:03 +13:00
Paul Chote
48d713aafd Pass a PaletteReference to RenderPreview. 2013-02-24 15:43:20 +13:00
Paul Chote
885eec7444 Move effects to WorldRenderer palette lookup. 2013-02-24 15:43:20 +13:00
Paul Chote
95871e6cc1 Add a cache of PaletteReferences to WorldRenderer.
I don't expect any perf improvements by using this
cache, as you're simply moving the row lookup from
render-time to fetch-time. However, this is a
cleaner abstraction, and allows us to fail early
if the palette doesn't exist.
2013-02-24 15:43:19 +13:00
Paul Chote
f0ba0ce2e8 Wrap palette references with a PaletteRef object. 2013-02-24 15:43:15 +13:00
Paul Chote
a166815348 Remove duplication between world/chrome shaders. 2013-02-23 09:53:46 +13:00
Paul Chote
35a149ea87 Apply consistent formatting to Renderer (no code changes). 2013-02-23 09:46:16 +13:00
Paul Chote
0287993c31 Add bitmap export to palette (for debugging). 2013-02-22 17:11:18 +13:00
Paul Chote
2d10f6b739 Remove unnecessary indirection from palette creation. 2013-02-22 17:06:29 +13:00
Paul Chote
db7887687b Remove hardcoded list of palette mod exclusions. 2013-02-22 15:04:41 +13:00
Paul Chote
f593807617 Rework color picker palette modification.
The old method had the lobby code dig around inside
the palette modification machinery, which was a giant
hack preventing necessary streamlining.
2013-02-22 15:04:41 +13:00
Chris Forbes
6da02b7b92 Merge pull request #2662 from psydev/patch-40
[cnc] Obelisk AutoTargeted, airstrike cooldown, +misc.
2013-02-20 12:24:57 -08:00
xaionaro
86c99c47c9 https://github.com/OpenRA/OpenRA/issues/2564
fixed a issue with pinging Master-server

Sometimes initial TickCount is less than zero, so (Environment.TickCount - lastPing) can be less than "MasterPingInterval * 1000". That's why PingMasterServer() is not calling for a long time until somebody connected.
2013-02-13 20:51:37 +04:00
Scott_NZ
3b3e39b375 Don't allow MCV/FACT to be sold
This is almost always done to exploit the `free mcv` logic in the crates.
2013-02-13 15:25:47 +13:00
Scott_NZ
4b3feed324 Make a lack of random map yaml be non-fatal 2013-02-12 22:47:34 +13:00
Scott_NZ
57dd8bb91e Add Random Map lobby button 2013-02-12 22:21:34 +13:00
Scott_NZ
34b1f90200 Anti-basewalk balance adjustments. Includes moving fact over to wood and giving it 500 more health, increasing superweapon healths and moving mslo to wood, moving pbox to heavy 2013-02-11 18:00:30 +13:00
Scott_NZ
128e2c9e1f Add objectives to MonsterTankMadness 2013-02-11 00:54:53 +13:00
psydev
d0669823a2 changing name of big_poof, for consistency
Changed "big_poof" to simply "poof". 

The word "big" will only appear if there are small, medium and large versions of the explosion.
Otherwise, it will just be "explosion" and "small_explosion".
2013-02-09 15:26:41 -08:00
Matthias Mailänder
1f99b1ec8e make hotkey user-configurable via in-game settings 2013-02-09 14:08:36 +01:00
Scott_NZ
2c5eeb551e Adjust MonsterTankMadnessScript super tank movement times 2013-02-09 12:19:41 +13:00
Scott_NZ
54906702bd Fix alliedBaseProc unused variable warning 2013-02-09 12:19:41 +13:00
Scott_NZ
ec56311a3d Fix victory on start of MMM 2013-02-09 12:19:41 +13:00
Scott_NZ
cdd09ea24f Finish early version of Monster Tank Madness 2013-02-09 12:19:40 +13:00
Scott_NZ
1ecdbc1d90 Fix spyvoice/reveal range for truk.hijackable in Allies 04 2013-02-09 12:19:40 +13:00
Scott_NZ
b1a5195c51 Let's not fail right at the beginning, count units too ;) 2013-02-09 12:19:40 +13:00
Scott_NZ
03f03ff501 More MonsterTankMadness work. Add routines for super tanks, civilian evacuees, proving grounds camera, base transfer, Demitri extraction 2013-02-09 12:19:40 +13:00
Scott_NZ
3c5967a623 Add ore capping to MissionUtils. Add world.CreateActor extension in MissionUtils. 2013-02-09 12:19:40 +13:00
Scott_NZ
9013e8376c Start work on Monster Tank Madness mission 2013-02-09 12:19:40 +13:00
Scott_NZ
9b5b054297 Add delphi. Have einstein/delphi panic 2013-02-09 12:19:39 +13:00
Scott_NZ
4e161f0c91 Change V19 tooltip to Oil Pump 2013-02-09 12:19:39 +13:00
Scott_NZ
6bbd54ab93 Put e1 inside the soviet 01 classic pillboxes. Add check for mission complete 2013-02-09 12:19:39 +13:00
Scott_NZ
87190762d1 Add V19 civilian building 2013-02-09 12:19:39 +13:00
Scott_NZ
f4da36065f Add ability to have randomised reports for weapons 2013-02-09 12:19:39 +13:00
Scott_NZ
e71135b511 Better error messages when merging duplicate yaml 2013-02-09 12:17:16 +13:00
psydev
dfc880807e [cnc] Airstrike cooldown 3 mins. (from 4). tweaks.
Air Strike cooldown time reduced from 4 minutes to 3. (Ion Cannon is 3). [games are short in CNC, and waiting 4 minutes for your first airstrike is a long time.]
HQ's hitpoints reduced to 750, so it can be nuked in one shot. (but not Ion Cannon'd) 
Airfield HP reduced to 1500, so Ion + Airstrike can destroy it. (For some reason, it doesn't die as easily as Weapons Factory, despite having the same HP)
2013-02-06 16:06:47 -08:00
psydev
d12853ddf7 [cnc] inftry detect cloaked in next tile(C&C orig)
Infantry can detect cloaked units in the next tile. This behaviour was in the original C&C Gold.
(Even though it says range=2, it is actually just in the next tile)

Fixed GrenadierExplode.
2013-02-06 14:20:09 -08:00
psydev
f1019ab332 [cnc] added names for explosions
Easier-to-understand names for explosions, which can be used in the future. Can phase out old names/numbers slowly.
Also included some explosions from the C&C Content which were not in use and did not have names.
2013-02-06 12:21:04 -08:00
Cody Brittain
96d1f8d83b Update mods/cnc/mod.yaml
Add support for Nyergud's Music Upgrade Pack
2013-02-06 08:35:27 -05:00
psydev
c4fc0e57b3 [cnc] Obelisk now AutoTargeted by units, etc.
Obelisk of light was missing "-AutoTargetIgnore". All the guard towers have it, but for some reason the Obelisk didn't.
2013-02-04 18:39:26 -08:00
Chris Forbes
6403c5e6af Fixed #2651: Units not in world should not be added to the attack force
Otherwise, a pillbox's e1 passenger is counted as part of the attack
force and ends up jamming HackyAI's attack logic until it is destroyed.
2013-02-05 07:09:05 +13:00
Scott_NZ
b3fbafad59 Use Action<bool> for objective delegate type 2013-02-03 14:27:43 +13:00
Scott_NZ
7594c4eab2 Clamp reveal range to 0-50 in PlayerStatistics to stop crashes for actors with reveal ranges > 50 2013-02-03 14:27:43 +13:00
Scott_NZ
4163f1d6b0 Clean up Allies 04 yaml. Adjust hero spy reveal range from 5 to 6. Add TRUK as buildable unit 2013-02-03 14:27:43 +13:00
Scott_NZ
ea716200a7 Allies 04: Fix multiple waves of spies being able to infiltrate the lab 2013-02-03 14:27:43 +13:00
Kenny
2bd9b7a640 Enabling mobile gap generators. 2013-01-31 16:57:04 +13:00
Kenny
4f670d516d Shroud creators now only temporarily block explored shroud.
On powerdown or removal from the game, any previously explored terrain will become visible once again.
2013-01-31 16:57:04 +13:00
Matthias Mailänder
f5835244c7 use markdown for readme and contributing guidelines
- https://github.com/github/markup
- https://github.com/blog/1184-contributing-guidelines
2013-01-31 16:32:46 +13:00
psydev
b00b1c36bc Helipad reduced to $1000. Palette order fixed.
Helipad price reduced to $1000. Should make helicopter transports more accessible. Should also make having a few "support helis" flying around a more viable strategy, for non-standard builds.
Fixed palette order to be better grouped and in more progressive order. 
Re-arranged document so that it's sorted better.
2013-01-31 16:30:48 +13:00
psydev
b2ddc6cfd8 [CNC] Chinook priced reduced to $750
Halved Chinook price, $1500 to $750.
Infantry should be a more feasible strategy, and transporting them quickly will make them more usable.
This should be good for Nod especially since they don't have APCs.
2013-01-31 16:29:52 +13:00
Matthias Mailänder
0d6dbdc58b increment debian copyright year 2013-01-31 16:28:14 +13:00
Matthias Mailänder
78baf76ae1 adhere to SPDX for RPM 2013-01-31 16:28:14 +13:00
Matthias Mailänder
43c43e25c4 adhere to opendesktop menu-spec
Version= is the version of the .desktop file specification!
2013-01-31 16:28:14 +13:00
Cody Brittain
32daf025ab cnc: Update cloaking, building destroyed sounds
- Use trans1.aud as the cloak sound, on both STNK and cloak
  given from crates

- Use crumble.aud rather than xplobig4.aud for building destruction
2013-01-31 16:23:03 +13:00
ScottNZ
750bdb7bba Update CHANGELOG
Some typos/wording issues fixed
2013-01-28 19:47:31 +13:00
Scott_NZ
8a796416a4 Remove AutoTargetIgnore for stek after Einstein is freed 2013-01-28 00:33:09 +13:00
Scott_NZ
691e6cf9e8 Have the Soviets build infantry after Einstein is found. Remove jeep cargo limit 2013-01-28 00:33:08 +13:00
Scott_NZ
de208e7a2f Fix nonworking attack code in Allies 01 2013-01-28 00:33:08 +13:00
Scott_NZ
63a72c5d28 Remove unused variable 2013-01-28 00:33:08 +13:00
Scott_NZ
b6b4b89008 Refactor cash code in Allies campaign. Adjust starting cash to 10000 in SP Allies 03 2013-01-28 00:33:08 +13:00
Scott_NZ
0b65735d86 Make the LSTs unbuildable 2013-01-28 00:33:07 +13:00
Scott_NZ
44215ae6f1 Add new trait interface INotifyTransformed and use it in Allies 04 to make the transport remove its cargo capacity after it unloads its passengers 2013-01-28 00:33:07 +13:00
Scott_NZ
fba5b80980 Allies 04: Add more town stuff. Remove leftover hind stuff. Only have patrol 3 on hard difficulty 2013-01-28 00:33:07 +13:00
Scott_NZ
3f6af59612 Add AutoTargetIgnore for the new bridges 2013-01-28 00:33:07 +13:00
Scott_NZ
693a622322 Fix Soviets not attacking town properly. Remove hind patrol. 2013-01-28 00:33:07 +13:00
Scott_NZ
60e9d3f660 Add c3 civilian, made by JOo 2013-01-28 00:33:06 +13:00
Scott_NZ
1d40858f70 Have the Soviets attack the town in Allies 04 2013-01-28 00:33:06 +13:00
Scott_NZ
5188529ff6 Allies 04: Adjust one of the patrol routes 2013-01-28 00:33:06 +13:00
Scott_NZ
2079db79f7 Allies 04: Hack in a fix to stop player hero spies infiltrating buildings they shouldn't 2013-01-28 00:33:05 +13:00
Scott_NZ
d73eec068f Fix some bad Allies 01 bounty yaml 2013-01-28 00:33:05 +13:00
Scott_NZ
8a32e5761c Change map player clientindex to 0 2013-01-28 00:33:05 +13:00
Scott_NZ
12e1a531fe Tidy campaign stuff 2013-01-28 00:33:05 +13:00
Scott_NZ
32830da3c2 Remove bounties from things in Allies 01 2013-01-28 00:33:05 +13:00
Scott_NZ
9f47e75492 Allies 01: only set eligible units to defensive stance 2013-01-28 00:33:04 +13:00
Scott_NZ
e975681c16 Add more time to complete Allies 04 - the bridge destruction makes the mission more difficult 2013-01-28 00:33:04 +13:00
Scott_NZ
a968d296bb Remove v01.sniper from Allies 04 2013-01-28 00:33:04 +13:00
Scott_NZ
031240ffc1 Campaign: reduce failed/accomplished code duplication 2013-01-28 00:33:04 +13:00
Scott_NZ
dfc4b07b1a Campaign: Don't rely on world.issueorder anymore 2013-01-28 00:33:04 +13:00
Scott_NZ
63241dbf69 Allies 04. Make the v01.sniper trivial so players can ignore it. 2013-01-28 00:33:03 +13:00
Scott_NZ
5b7523b9e0 Allies 04: Make Soviets sell buildings when they are low on health. Have the bridge be destroyed by a Soviet tank 2013-01-28 00:33:03 +13:00
Matthias Mailänder
4b228a71ef Update CHANGELOG
- Dune 2000
- Editor/Remapping
- GUI improvements by Carko
- More verbose about Volkov changes
- Preparations for i18n
2013-01-27 12:17:20 +01:00
Matthias Mailänder
0f864c3192 treat compiler warnings as errors 2013-01-18 00:23:50 +01:00
Matthias Mailänder
e475d0d0b9 Added travis script 2013-01-18 00:23:19 +01:00
Cody Brittain
1635ace182 Update CHANGELOG
Just a couple things added
2013-01-18 11:09:26 +13:00
Matthias Mailänder
b4e3ce5de6 fix make for mono 3
error CS1902: Invalid debug option `+'.
Valid options are `full' or `pdbonly'
2013-01-18 11:08:10 +13:00
Carko
50ceb7c4dd Fixed the asynchronous map loading behavior when changing filter 2013-01-18 11:00:56 +13:00
Carko
4395a04d57 Asynchronous loading of map previews in the map chooser dialog 2013-01-18 11:00:56 +13:00
Matthias Mailänder
c5313375f0 pull mouse button preference from global property 2013-01-18 10:57:41 +13:00
Matthias Mailänder
2503ddfde4 let Chronotank/Minelayer accept left-click-orders 2013-01-18 10:57:41 +13:00
Matthias Mailänder
b356cca528 improve the classic mouse behaivor
- don't require to deselect units to change selection
- fix issue with broken building placement on right-click orders
- don't select enemy units when left-click attacking
- build palette won't interfere with unit orders anymore
2013-01-18 10:57:41 +13:00
Matthias Mailänder
d52394bb47 add classic left-click orders 2013-01-18 10:57:40 +13:00
Scott_NZ
1da2d89ced Only play movies in Allies 01 and Soviet 01 Classic if there's one client 2013-01-15 17:43:39 +13:00
ScottNZ
a88a7d9834 Update CHANGELOG 2013-01-13 16:06:05 +13:00
Scott_NZ
9507fde91d Fix untargetable barrel in Soviet 01 2013-01-13 00:24:28 +13:00
Scott_NZ
742a27158a Make oil derricks repairable by engineers 2013-01-12 18:55:59 +13:00
Scott_NZ
5ed383e3e2 Change mech hotkey to c 2013-01-12 18:35:01 +13:00
Scott_NZ
1679837e46 Fix mechanic being able to repair infantry. Adjust mechanic repair damage from 20 to 10 2013-01-11 17:17:14 +13:00
Scott_NZ
eb3685fe67 Fix a lack of difficulty dropdown yaml in other mods (d2k/cnc) causing crashes 2013-01-09 21:50:20 +13:00
Carko
50f8465d1e Removed mouse capture while composing text in chat (fixes #2486) 2013-01-09 16:47:39 +13:00
Cody Brittain
5502864a1f Update mods/ra/music.yaml
Mud no longer crashes: Bring it back in.
2013-01-09 07:56:30 +13:00
Carko
d572e59d2e Checking for build prerequisites before showing them in a tooltip 2013-01-09 07:54:01 +13:00
Carko
e313bbfb31 Added a build limit of 1 to Tanya and Volkov
Added the build limit of 1 to MSLO
2013-01-09 07:54:01 +13:00
Carko
a51c5fd9ca Added Buildable->BuildLimit option to limit the number of actors a player can build of the type 2013-01-09 07:54:01 +13:00
Sam Hegarty
0c104cfc3a Add a 'Shutting down' state to the gameserver.
Tell the masterserver about it, so it can quickly remove games
from the list when they are finished, rather than waiting for the
5 minute TTL to expire.
2013-01-08 23:02:28 +13:00
Chris Forbes
3a77082c66 silence warnings in allies03/04 2013-01-08 22:54:38 +13:00
Scott_NZ
975e4db452 Change facing of the 2 guarding heavy tanks in Allies 04 2013-01-08 22:44:10 +13:00
Scott_NZ
d92f184bc9 Add civilian movement and balance changes in Allies 04 2013-01-08 22:44:10 +13:00
Scott_NZ
2eea5cc3b2 Give SAM sites turret facings in Allies 04 2013-01-08 22:44:09 +13:00
Scott_NZ
0e8cb14099 Allies 04: Give money to players after they receive mcvs 2013-01-08 22:44:09 +13:00
Scott_NZ
1ec3b2ffe2 Fix whitespace in objectives 2013-01-08 22:44:09 +13:00
Scott_NZ
c836d69385 Add easy mode to Allies 01 which is like the classic mission 2013-01-08 22:44:09 +13:00
Scott_NZ
11c45e4388 Start unbreaking ScaredyCat 2013-01-08 22:44:08 +13:00
Scott_NZ
3b9fac9c84 Prevent warning in Allies 04 code 2013-01-08 22:44:08 +13:00
Scott_NZ
185558985e Have civilians come out of disturbed buildings 2013-01-08 22:44:08 +13:00
Scott_NZ
e3d25f6fed Give MISS a tooltip 2013-01-08 22:44:07 +13:00
Scott_NZ
200071e713 Add reinforcements paradrops 2013-01-08 22:44:07 +13:00
Scott_NZ
bdb7bb97cd Split long objective strings over several lines 2013-01-08 22:44:07 +13:00
Scott_NZ
82809f27f7 Reduce mission music code duplication 2013-01-08 22:44:06 +13:00
Scott_NZ
c8e84b3a11 Add license notice 2013-01-08 22:44:06 +13:00
Scott_NZ
9581f07242 Add first version of Soviet 01 classic 2013-01-08 22:44:06 +13:00
Scott_NZ
411aedafa0 Setup c3-c10 placeholder civilians. 2013-01-08 22:44:05 +13:00
Scott_NZ
f7f307c3bf LegacyMapImporter: Remove Italy as it's a bogus country. Change Germany to black. Collapse some duplicate cases. 2013-01-08 22:44:05 +13:00
Scott_NZ
c10df031bd Convert classic waypoints to waypoint not mpspawn 2013-01-08 22:44:05 +13:00
Scott_NZ
a56228aba1 Add Italy country 2013-01-08 22:44:05 +13:00
Scott_NZ
1b09544314 Default to allies for neutral in ra, gdi in cnc 2013-01-08 22:44:04 +13:00
Scott_NZ
2dc18594a2 Handle RA with GoodGuy/BadGuy players 2013-01-08 22:44:04 +13:00
Scott_NZ
baa7a58a10 Don't blow up if classic maps have Multi{0} in them either 2013-01-08 22:44:04 +13:00
Scott_NZ
bb5212d2bb Fix classic SP maps failing to import into the editor 2013-01-08 22:44:03 +13:00
Scott_NZ
38db7d1e50 Make the Soviets repair their buildings in Allies 04 2013-01-08 22:44:03 +13:00
Scott_NZ
3371085da0 Move viewport to reinforcements location after infiltration 2013-01-08 22:44:03 +13:00
Scott_NZ
5c688370ed Add difficulty options to Allies 04 2013-01-08 22:44:03 +13:00
Scott_NZ
ab01722d96 Clean up the patrol code 2013-01-08 22:44:02 +13:00
Scott_NZ
ae5cb9864a Adjust timer text 2013-01-08 22:44:02 +13:00
Scott_NZ
43e5838555 Adjusted wording of objectives 2013-01-08 22:44:02 +13:00
Scott_NZ
cf8b02de26 Add 25 min countdown timer for destroying the enemy base. 2013-01-08 22:44:01 +13:00
Scott_NZ
d3ede583c2 Make OILB trivial too 2013-01-08 22:44:01 +13:00
Scott_NZ
cda871d2eb Add missing colon 2013-01-08 22:44:01 +13:00
Scott_NZ
2ea3b77b7a Create new actors so the effects aren't carried over to built units in Allies 04. Make yak buildable by Allies again in Allies 02. Make STEK autotargetignore in Allies 01. Make MISS autotargetignore in Allies 04. 2013-01-08 22:44:00 +13:00
Scott_NZ
3ab04e4c30 Fix crash with patrols. Add more room for the Allied base 2013-01-08 22:44:00 +13:00
Scott_NZ
3b2190d720 Fixed the supply truck not being able to carry 2 passengers 2013-01-08 22:44:00 +13:00
Scott_NZ
b3691dcce9 Add base guard, hind and second objective 2013-01-08 22:44:00 +13:00
Scott_NZ
722bc00c9b Add checkpoint at the large base 2013-01-08 22:43:59 +13:00
Scott_NZ
fe07da8634 Give control of the hijacked vehicle to another passenger if the driver leaves 2013-01-08 22:43:59 +13:00
Scott_NZ
54feab66e0 Add hijackable truck to Allies 04 2013-01-08 22:43:59 +13:00
Scott_NZ
fda897c69e Add more patrols 2013-01-08 22:43:58 +13:00
Scott_NZ
31d3616b8d Actually add the Allies 04 script. Also we have dog patrols now 2013-01-08 22:43:58 +13:00
Scott_NZ
eb6bab36a0 Begin Allies 04 script 2013-01-08 22:43:58 +13:00
Scott_NZ
81f9798307 More mapping of Allies 04 2013-01-08 22:43:58 +13:00
Scott_NZ
d1dafd5782 More Allies 04 mapping 2013-01-08 22:43:57 +13:00
Scott_NZ
799a2ea541 Fixed difficulty code indentation 2013-01-08 22:43:57 +13:00
Scott_NZ
4b2e45bbae Refactor default difficulty setting into its own method 2013-01-08 22:43:57 +13:00
Scott_NZ
32721ac8cb Reposition info widgets/countdown timer widgets in centre top of vp 2013-01-08 22:43:56 +13:00
Scott_NZ
6871d2ed37 Have paradrops and mammoths come sooner if we're on hard difficulty 2013-01-08 22:43:56 +13:00
Scott_NZ
bdfa6f6ecc Slight refactor 2013-01-08 22:43:56 +13:00
Scott_NZ
c59fbd5f9d Adjust Allies 03 difficulties 2013-01-08 22:43:56 +13:00
Scott_NZ
54916cc548 Add Easy difficulty to Allies 03 2013-01-08 22:43:55 +13:00
Scott_NZ
3ff3ed39fb Fix slight logic error with difficulty 2013-01-08 22:43:55 +13:00
Scott_NZ
a8dbedd486 Fix default difficulty not being serialised 2013-01-08 22:43:55 +13:00
Scott_NZ
988a68dae5 Attempt to fix NRE that hamb got 2013-01-08 22:43:55 +13:00
Scott_NZ
9a9c5911a6 Hard difficulty for allies 03 2013-01-08 22:43:54 +13:00
Scott_NZ
bfb07e9948 Add support for mission difficulties 2013-01-08 22:43:54 +13:00
Scott_NZ
dda4e2c33a Add objective for MGG 2013-01-08 22:42:50 +13:00
Scott_NZ
05e143662d Make Allies 02 easier in SP mode 2013-01-08 22:42:50 +13:00
Scott_NZ
9e2f15bde4 Allies 03 code cleanup 2013-01-08 22:42:50 +13:00
Scott_NZ
8f90423793 Update units evacuated immediately in Allies 03 2013-01-08 22:42:50 +13:00
Scott_NZ
eecc002236 More balancing improvements to Allies 03: remove arty, agun, reduce number of yaks and paradrops 2013-01-08 22:42:49 +13:00
Scott_NZ
4167d3291a Offset MGG husk spinner 2013-01-08 22:42:49 +13:00
Scott_NZ
3be6229cf2 Add MGG husk 2013-01-08 22:42:49 +13:00
Scott_NZ
5f693945f0 Take all ore/cash from Allies 01 player 2013-01-08 22:42:49 +13:00
Scott_NZ
82f478716c Add AutoTargetIgnore to barrels 2013-01-08 22:42:48 +13:00
Scott_NZ
6544069aa2 More Allies 03 balancing adjustments 2013-01-08 22:42:48 +13:00
Scott_NZ
8486a4fbae Adjust Allies 03 balancing 2013-01-08 22:42:48 +13:00
Scott_NZ
edd1138556 Use classic RA country colours in missions 2013-01-08 22:42:48 +13:00
Scott_NZ
14ed3ae816 Add paradropping at endgame in Allies 03 2013-01-08 22:42:47 +13:00
Scott_NZ
d5db9e88d4 Put bridge across water 2013-01-08 22:42:47 +13:00
Scott_NZ
f0a4fa7712 Add more airfields to destroy in Allies 03, and have reinforcements in Allies 02 and Allies 03 come in gradually. 2013-01-08 22:42:47 +13:00
Scott_NZ
1f92768193 Remove FirstUnshroudedOrDefault from MissionUtils.cs 2013-01-08 22:42:46 +13:00
Scott_NZ
ccfcf0a1ee Have the minimum difference between attack frames in Allies 03 be lower for 2 players 2013-01-08 22:42:46 +13:00
Scott_NZ
51626bf0db Outlined Allies 04 map 2013-01-08 22:42:46 +13:00
Scott_NZ
be6da2452a Change Allies map types to Campaign 2013-01-08 22:42:46 +13:00
Scott_NZ
ec423db4e5 Don't hog the CPU trying to path to the enemy base in Allies 03, to line up with Allies 02 2013-01-08 22:42:45 +13:00
Scott_NZ
4c7f215559 Rename 'economic' to 'economy' in stats panel 2013-01-08 22:42:45 +13:00
Scott_NZ
0f9da06309 Have graph lines not draw over the axes 2013-01-08 22:42:45 +13:00
Scott_NZ
4ce6cabc46 Better numbers for the LineGraph y axis 2013-01-08 22:42:45 +13:00
Scott_NZ
b2b13b98b7 Use a default max value of 5000 on the line graph if it's too low 2013-01-08 22:42:44 +13:00
Scott_NZ
4c729ca5ed Refactored GraphWidget to LineGraphWidget 2013-01-08 22:42:44 +13:00
Scott_NZ
a78f8865b8 Moved the graph widget into OpenRA.Game - it doesn't really have any dependencies on the RA mod 2013-01-08 22:42:44 +13:00
Scott_NZ
d5b37d4343 Cleanup, refactoring of stats graph widget. 2013-01-08 22:42:44 +13:00
Scott_NZ
e424883857 Improve graph. Add things like scales/axis labelling. 2013-01-08 22:42:43 +13:00
Scott_NZ
b6e8c9c9ea Start implementing graphs for the stats panel 2013-01-08 22:42:43 +13:00
Scott_NZ
ed9bb72dbe Add more things to the Combat tab 2013-01-08 22:42:43 +13:00
Scott_NZ
9753808936 Renamed OrderCounter to PlayerStatistics. Simplify income to simply earned/min. 2013-01-08 22:42:43 +13:00
Scott_NZ
82fdbc4bc6 Move OrderCounter into Orders subnamespace 2013-01-08 22:42:42 +13:00
Scott_NZ
d7f3b81e4c Add Map Control statistic 2013-01-08 22:42:42 +13:00
Scott_NZ
36f349ecba Add Order counter for rough APM estimation. Rename Support to Production and move the production icons there 2013-01-08 22:42:42 +13:00
Scott_NZ
30a374b9e9 Add total earned/spent tracking 2013-01-08 22:42:42 +13:00
Scott_NZ
2a0b9a8596 Display support powers 2013-01-08 22:42:41 +13:00
Scott_NZ
9a9324946f Add dropdown for economic information 2013-01-08 22:42:41 +13:00
Scott_NZ
babf1556e3 Refactor the stats YAML and logic to more easily support swapping in data 2013-01-08 22:42:41 +13:00
Scott_NZ
bb1c87b084 Add clocks and text overlays for the production icons 2013-01-08 22:42:41 +13:00
Scott_NZ
1c584fb158 Consolidate the production icons into a single widget. Add income tracking for players. 2013-01-08 22:42:40 +13:00
Scott_NZ
83e1855919 Add indication of what players are building 2013-01-08 22:42:40 +13:00
Scott_NZ
4bc04769ec Subscribe to click event directly in the setup method 2013-01-08 22:42:40 +13:00
Scott_NZ
178358c29a Fixed Stats panel player selection silliness 2013-01-08 22:42:40 +13:00
Scott_NZ
42b16f74a1 Slightly adjust the width of the templates 2013-01-08 22:42:39 +13:00
Scott_NZ
9b493ad9e7 Remove unused usings 2013-01-08 22:42:39 +13:00
Scott_NZ
d7d5baae0e Add an observer stats panel 2013-01-08 22:42:39 +13:00
Scott_NZ
a8e434b74d Add radar for spectators 2013-01-08 22:42:39 +13:00
Scott_NZ
07d5ba8405 Remove Soviet econ hacks and power checks in Allies 02. 2013-01-08 22:42:39 +13:00
Scott_NZ
a5141f9908 proc.nofreeactor was causing harv to not unload properly. Just spawn a normal proc after we've changed the owner of the Allied base. 2013-01-08 22:42:38 +13:00
Scott_NZ
d15fb82b08 Allies 02 SP mode bug fixes 2013-01-08 22:42:38 +13:00
Scott_NZ
947b27a227 Make Allies 02 work in SP mode 2013-01-08 22:42:38 +13:00
Scott_NZ
b49110bf5c Ignore spies if they are disguised in Allies 03 2013-01-08 22:42:38 +13:00
Scott_NZ
8578958e40 Difficulty/balance changes 2013-01-08 22:42:37 +13:00
Scott_NZ
65e78ca8b0 Additional ore mines 2013-01-08 22:42:37 +13:00
Scott_NZ
608bf9ada1 Have the mggs come offmap, we don't want the player building too many. 2013-01-08 22:42:37 +13:00
Scott_NZ
4373831317 Remove econ hacks in Allies 03 and have the Soviets actually build their yaks. 2013-01-08 22:42:37 +13:00
Scott_NZ
aa78d63d72 Increased minimum attack increment 2013-01-08 22:42:36 +13:00
Scott_NZ
400d94caba Give the Soviets a Soviet construction yard in case the Allies lose theirs - they can capture this as a last resort. Make yaks buildable by Allies if they capture the Airfield buildings. 2013-01-08 22:42:36 +13:00
Scott_NZ
1660c4fe7c Reduce some code duplication 2013-01-08 22:42:36 +13:00
Scott_NZ
e643f12371 Attempted fix for Allies 03 crash (#2471) 2013-01-08 22:42:36 +13:00
Scott_NZ
339c0bc520 Fix weird plane spawn/management logic. Have Soviets ignore units that are concealed by gap generators 2013-01-08 22:42:36 +13:00
Scott_NZ
e15c240a8f Remove some old noise from the map 2013-01-08 22:42:35 +13:00
Scott_NZ
7bd66c2560 Render the shroud range circle for mgg 2013-01-08 22:42:35 +13:00
Scott_NZ
1f8fd404e5 Much better yak management. Map improvements. 2013-01-08 22:42:35 +13:00
Scott_NZ
93e951eb75 Added mobile gap generator. It is currently unbuildable and it does not generate shroud - this requires some additional shroud work since you can paint shroud across the map by moving it. 2013-01-08 22:42:35 +13:00
Scott_NZ
c52cd77c4c Add mechanic 2013-01-08 22:42:34 +13:00
Scott_NZ
0da911c9f8 Delete mods/d2k/bits/turret1.aud (not mods/d2k/bits/TURRET1.aud). This old, unused file was causing oddities for users with NTFS since we had two different files in the repository with filenames that differ only by case, and NTFS has case-insensitive filenames. 2013-01-08 22:42:34 +13:00
Igor Popov
395aa0fc10 dedicated: never let Bot become an admin 2013-01-08 22:34:03 +13:00
Carko
e10920d4ea Added the spawnpoint map tooltip that displays players name in the lobby (closes #2024) 2013-01-08 22:22:25 +13:00
Carko
914afa2dee Removed StringSplitOptions.RemoveEmptyEntries when counting wrapped text lines 2013-01-08 22:11:56 +13:00
Carko
ca1e0b4c48 Added word wrapping to in-game chat (fixes #2093) 2013-01-08 22:11:56 +13:00
Carko
70cf48dcaf Added a power bin tooltip that shows provided and drained power 2013-01-08 22:08:12 +13:00
Igor Popov
68130c85f3 fix #2453; MOTD for lobby (to be fetched from file); different motd for each mod 2013-01-08 21:57:25 +13:00
Chris Forbes
d0aea18b3e Added new map: "Bad Neighbors" from Nukem 2013-01-08 21:57:09 +13:00
Curtis Shmyr
ac301b22e2 Editor - Template categories are now ordered by whats specified in the tileset yaml 2013-01-08 20:11:22 +13:00
Curtis Shmyr
b56125fa39 Added terrain category types to RA Snow tileset 2013-01-08 20:11:22 +13:00
Curtis Shmyr
b362ddac15 Fixed terrain categories for two river tiles in RA Temperat 2013-01-08 20:11:22 +13:00
Curtis Shmyr
5f2aa810b1 Add terrain category types to RA desert tileset 2013-01-08 20:11:22 +13:00
Curtis Shmyr
189a6c337e Fix Water Cliff terrain types in temperate / desert tilesets 2013-01-08 20:11:22 +13:00
Curtis Shmyr
9c552839ea update CHANGELOG 2013-01-08 20:11:22 +13:00
Curtis Shmyr
79aa7901cf Added RA map: ghost town 2013-01-08 20:11:22 +13:00
Igor Popov
ad2dbffe75 fix #2480; Direct Connect to different mod causes crash (saying 'missing map') 2013-01-07 00:27:45 +04:00
Igor Popov
3b77b04b95 return mapTitle in ra and d2k lobby 2013-01-06 23:25:24 +04:00
Carko
88959b2e6c Changed scroll velocity in the map chooser to be better suited for mouse scrolling 2013-01-03 11:37:59 +13:00
Carko
f256742a0d Fixed repairing landed airplanes (most likely #2365)
When an airplane was landed and ordered to another airstrip or service depot, the aproach distance was not properly calculated since it was not taken into effect that its current altitude is zero.
2013-01-03 11:36:11 +13:00
Chris Forbes
22e2d3d0f4 Merge pull request #2507 from Lookingglass/per-player-shrouds
Per-player shrouds
2012-12-22 12:26:40 -08:00
Chris Forbes
3eed137117 Merge pull request #2526 from Mailaender/strings
made all in-game strings customisable via .yaml files
2012-12-22 12:25:33 -08:00
Chris Forbes
e28be10dd4 Merge pull request #2525 from Mailaender/custom-tech
don't hardcode custom prerequisites anymore
2012-12-22 12:25:03 -08:00
Chris Forbes
90361cb631 Merge pull request #2524 from hunnybunny95/patch-1
Fixed airfield name.
2012-12-22 12:24:42 -08:00
Matthias Mailänder
c3b959846c customisable Ready/Hold text for CnC mod
make those strings also translatable
2012-12-22 19:21:05 +01:00
Matthias Mailänder
39884e16fa customisable text printed on RA support power icons 2012-12-22 18:59:45 +01:00
Matthias Mailänder
f107f8a87b expose strings from build palette widget to chrome yaml
prepare for localisation efforts
2012-12-22 18:25:18 +01:00
Matthias Mailänder
8246b2f35f don't hardcode custom prerequisites anymore
to make those strings translatable
2012-12-22 17:42:57 +01:00
hunnybunny95
f13d12acec Fixed airfield name.
The name of the airfield was airstrip... which is wrong since the icon says airfield whilte the building is called airstrip... its even called AFLD in the code so... just a simple fix :)
2012-12-21 21:57:19 +01:00
Kenny
4090be72d4 Adding Shroud trait to CNC / D2K mods 2012-12-16 20:00:17 -08:00
Chris Forbes
90d30005f6 Merge pull request #2498 from Mailaender/volkov
make Volkov a true Cyborg
2012-12-16 18:16:39 -08:00
Chris Forbes
7c968a8f88 Merge pull request #2509 from Lookingglass/lg-maps
Three new 5-player RA maps
2012-12-16 12:35:04 -08:00
Kenny
e4ab86e6f9 Three new 5-player RA maps:
- The White Pentagon - snow based land/water map with minimal obstructions.
- Black Gold - Resource starved map with each starting position receiving 8 oil derricks.
- Texas Sea - Similar to Black Gold, but every starting position is on a tiny island.
2012-12-13 15:39:14 -08:00
Kenny
f41fb32d60 Introducing per-player shrouds.
- Each player has their own shroud and their visibility does not extend outside of the shroud. 
- Units and buildings can no longer target other units outside of their visibility. Buildings can still be targetted if they have been explored.
- GPS will provide visibility in the fog-of-war.
- Spies that infiltrate radar domes will gain their victim's exploration and reset it on all clients (if the victim does not have GPS)
2012-12-13 15:16:56 -08:00
Matthias Mailänder
5249a17d48 d2k: add Tuck's Sietch remake
by DraLUSAD from
http://www.sleipnirstuff.com/forum/viewtopic.php?f=83&t=16009
2012-12-12 09:46:26 +13:00
Matthias Mailänder
99256bcad0 cnc: fix wrong civilian field remapping at least in-game
the editor hack is RA specific
2012-12-12 09:43:45 +13:00
Matthias Mailänder
f402c37b14 Don't remap civilian buildings/fields in-game.
V16 field was mostly affected because it consists mostly of remapped colors.
2012-12-12 09:43:45 +13:00
Matthias Mailänder
494ab2db4d add @Generalcamo to AUTHORS
original Volkov contribution came from
http://content.open-ra.org/index.php?p=detail&table=units&id=132
2012-12-10 23:12:49 +01:00
Matthias Mailänder
5d4160bc82 make Volkov a true Cyborg
- Added new Armor value: Cybernetic
- Use sounds/graphics from DE censored version
- Heals near repair pad (instead of hospital)
- Medic can't heal him
- Dogs can't eat him
- Tanks need to attempts to crush him
- +25% HP (now same factor as 4tnk:1tnk compared to e1)
2012-12-10 16:42:43 +01:00
Chris Forbes
b9194e4305 d2k: fix crash on attackmove medic 2012-12-04 11:39:37 +13:00
Chris Forbes
8ab1fbe83a Merge pull request #2482 from reaperrr/patch-1
Update mods/cnc/music.yaml
2012-12-03 13:11:11 -08:00
Matthias Mailänder
96a088f998 merge Dune 2000 "Rounded Edges" mod
Changes include:
 - bibs have been removed
 - building offset and selection boxes adapted
 - units and turrets leave husks
 - siege tank barrel won't rotate anymore
 - AI capable of building all units using all queues
 - bullet traces
 - windtrap animations
 - unit balance (mix of Dune II, Dune 2000 and Red Alert)
 - repair pad animation
 - no more obsessive "silos needed"
 - defense building queue → heavy armor queue
 - medics (using thumper graphics)
 - no buildable aircrafts anymore
 - harvesting has been slowed down
2012-12-04 10:08:14 +13:00
Matthias Mailänder
7d4399d7cc fixes #2481
Don't save in system pathes because UNIX needs root and shipped maps
should not be changed. Use $HOME/maps/$MOD instead.
2012-12-04 10:06:42 +13:00
Matthias Mailänder
107c37f33d RA: Snow craters fix by MrFlibble
Small graphical patch fixing some snow craters and scorch marks
2012-12-04 10:05:31 +13:00
Matthias Mailänder
88949024e6 RA: add shadow to supply truck
copied from the demolition truck
2012-12-04 10:04:12 +13:00
Matthias Mailänder
aad0b3d2d8 fixed wrong palette remapping for neutral buildings in editor
for TEMPERAT (fields) and DESERT (buildings, trees, rocks)
2012-11-26 12:21:50 +01:00
Matthias Mailänder
4e0e53c714 Merge pull request #8 from cjshmyr/desert
RA Desert patches by Curtis
2012-11-26 01:04:53 -08:00
Curtis Shmyr
87a2817234 RA Desert - Use ExcludeTileset instead of RequiresTileset for specific tileset actors (looks cleaner) 2012-11-25 18:16:08 -07:00
Curtis Shmyr
f3e796e972 RA Desert - Removed fenc.des which was another barbed wire shp 2012-11-25 17:33:29 -07:00
Curtis Shmyr
7d5a843684 RA Desert - Added a missing shrub. Added building yaml definitions. Hide Temperate and Snow actors from Desert tileset editor. 2012-11-25 17:30:19 -07:00
Matthias Mailänder
f914929eb7 Merge pull request #7 from cjshmyr/desert
Add patches by Curtis:
- fixes desert shorelines
- found missing wc13.des
- remove ice redundancy in sequences.yaml
2012-11-25 09:09:24 -08:00
Curtis Shmyr
8f7b776556 Desert tileset - use proper wc13.des tile 2012-11-21 20:51:33 -07:00
reaperrr
aeaa58a01b Update mods/cnc/music.yaml
'I Am' was the name of the band that made this song (with Mr. Klepacki on drums), the track is actually called Destructible Times. Also brought titles of Warfare/Full Stop as well as Heavy Gear/Demolition in line with other double-named tracks.
2012-11-22 00:21:41 +01:00
Curtis Shmyr
4dacd3be26 Fix up shoreline pieces to have beach terrain types (for water transport use) 2012-11-20 21:21:31 -07:00
Curtis Shmyr
05929bdfe9 Remove extra sequence entries for ice01 ice02 ice03 ice04 ice05 2012-11-20 21:14:52 -07:00
Matthias Mailänder
0690041347 fix most of the palette issues with RA desert in OpenRA.Editor
TODO: use the palette as defined in YAML;
defaults are wrong for DESERT rocks, trees, walls and ore mine
2012-11-19 14:53:25 +01:00
Matthias Mailänder
842fd8b4e5 update VS project file 2012-11-17 13:16:34 +01:00
Matthias Mailänder
7a89e3d67a added DESERT rocks 2012-11-17 13:16:26 +01:00
Matthias Mailänder
5ecc6224b0 add bridges to DESERT 2012-11-17 13:15:16 +01:00
Matthias Mailänder
f5c592291c add Harisson to AUTHORS 2012-11-17 13:15:16 +01:00
Matthias Mailänder
7f229a3fde add ice sequences, fixes related crash 2012-11-17 13:15:16 +01:00
Matthias Mailänder
c859fb1186 fix the remaining issues with the ra desert terrain
- extract mix file as it is easier to work with SHPs
- light palette rotator now excludes terrain palette
- water palette rotator now excludes player palette
- use wire fence, sand bags and brick wall from cnc
- draw ressources with player palette (workaround)
- delete all test maps
2012-11-17 13:15:16 +01:00
Matthias Mailänder
6dceb30632 add 2 testmaps for desert tileset 2012-11-17 13:15:16 +01:00
Matthias Mailänder
f3dc31be40 add PlayerPaletteFromCurrentTileset and desert tileset for RA
some things left to do:
ore, walls and silo/hbox need some work
2012-11-17 13:15:06 +01:00
Matthias Mailänder
a2f5ffd59e made WaterPaletteRotation more configurable
Base is now configurable per terrain
ExcludePalettes is now exposed to yaml
2012-11-17 13:13:32 +01:00
hunnybunny95
a2c66a32b0 Fixed hotkeys for aircraft 2012-11-16 04:47:50 +01:00
hunnybunny95
72139675ac Fixed hotkeys for vehicles 2012-11-16 04:46:00 +01:00
hunnybunny95
2b57f04dc0 Fixed hotkeys for ships 2012-11-16 04:45:15 +01:00
hunnybunny95
15e09fa83b Fixed hotkeys for infantry 2012-11-16 04:44:34 +01:00
Sunny Sproket
55ee1d41f3 Added "room-convergence" map 2012-11-13 09:38:26 +13:00
Matthias Mailänder
2e7908366a fixes #2465
gpsdot.shp shadow uses index 3
2012-11-13 09:26:59 +13:00
Chris Forbes
6ab4fda9a6 Balanced "Bombardment Islands" map (from czech army) 2012-11-13 09:26:59 +13:00
Curtis Shmyr
a5ba41cae8 Make ctnks missiles explode a bit sooner (still reaching their target) 2012-11-10 19:53:10 -07:00
Curtis Shmyr
5e9cdad044 No more sound attentuation for PlayNotification - fixes #2466 2012-11-10 19:52:21 -07:00
Curtis Shmyr
c14de26c07 Actually fixed RA map bomber-john 2012-11-04 10:27:45 -07:00
Curtis Shmyr
e5f506c81d update CHANGELOG 2012-11-03 23:06:27 -06:00
Curtis Shmyr
4160f08c6c Fix bomber-john RA map crash #2439 2012-11-03 22:53:11 -06:00
Curtis Shmyr
4ad0d1682e Improve ctnk health and damage vs heavy armor, reduce damage vs inf 2012-11-04 17:47:03 +13:00
NukemBro
8fb4fc9a14 Re-add RA map Chaos Canyon now with proper cordon - fixes #2432 2012-11-04 17:47:03 +13:00
Curtis Shmyr
5a0187e1db Temporarily drop RA map chaos canyon 2012-11-04 17:47:03 +13:00
Curtis Shmyr
7f5141c338 #2447 - Disguised spies are now hidden under GPS 2012-11-04 17:47:03 +13:00
Iran
354cabf8d1 -- add ice tile entries to sequences.yaml
fixes crashes on maps using these ice tiles.
2012-11-04 17:47:03 +13:00
Scott_NZ
fd734c8553 Improve the Soviet attacks more 2012-11-04 16:20:46 +13:00
Scott_NZ
9238de6a47 Add airbase and airbase secondary objective. Improve Soviet attacks. Enable players to capture sam sites as well as destroy them to complete the objective in Allies 02 2012-11-03 21:41:46 +13:00
Scott_NZ
b2c5f488a7 Rename Evacuees player to Allies. Make AA gun buildable. 2012-11-03 13:33:38 +13:00
Scott_NZ
c634867cdd Reduce threshold, unused variables 2012-11-03 13:33:38 +13:00
Scott_NZ
d7f2273788 Increase duration between spawn for SP 2012-11-03 13:33:38 +13:00
Scott_NZ
5c1a982fdd Remove evacuee buildings to stop the players building on the other side of the map 2012-11-03 13:33:38 +13:00
Scott_NZ
0300a67da8 The Allies 02 Soviet reinforcements at 16 minutes are a bit too insane 2012-11-03 13:33:37 +13:00
Scott_NZ
862dfb3275 Improvements to map layout 2012-11-03 13:33:37 +13:00
Scott_NZ
03121ed826 Add yak strafing, support for SP as well as MP, additional Soviet spawn point 2012-11-03 13:33:37 +13:00
Scott_NZ
0cdff00cb6 First version of Allies 03 2012-11-03 13:33:36 +13:00
Scott_NZ
787facec65 Allies02: Make Allied infantry buildable by the Allies1 player when they capture the Soviet barracks. Remove ctnk from the build menu 2012-11-03 13:33:36 +13:00
Scott_NZ
44d63b9103 Barrels were not scorching the terrain 2012-11-03 13:33:36 +13:00
Scott_NZ
49571fc78a Increase deaths threshold to 200 2012-11-03 13:33:35 +13:00
Scott_NZ
60569bc97c Fix open areas for allies maps 2012-11-03 13:33:35 +13:00
Chris Forbes
b37510c30e nerf dtrk speed from 8 to 6 2012-10-23 19:26:51 +13:00
Kenny
343b7bf3e1 Increasing cost to $2500 as well as reducing armor to 50 hit points. 2012-10-22 14:42:36 +13:00
Curtis Shmyr
7a2423a742 Fix #2449 - ctnk line of sight improved 2012-10-21 16:50:01 -06:00
Curtis Shmyr
57dfc739c6 Fix #2433 - crash when ctnk order generator was active if ctnk dies 2012-10-21 16:46:58 -06:00
Curtis Shmyr
f3d4b6541c Fixed ctnk desync #2448 2012-10-21 15:43:30 -06:00
Curtis Shmyr
d1c20d6c72 Fix #2434 and #2442 2012-10-21 14:55:25 -06:00
Curtis Shmyr
e4beb8236e Update CHANGELOG 2012-10-20 12:28:45 -06:00
Chris Forbes
7574124ff0 added forest-path map for tournament 2012-10-19 11:56:39 +13:00
Scott_NZ
e1cb4d60c4 Fix crash when spectators are present 2012-10-15 16:28:38 +13:00
Igor Popov
1d62329969 fix #2425; Bots should be removed when switching to a map which doesn't allow them 2012-10-15 08:17:04 +13:00
Curtis Shmyr
36813ff52f Fix chronotank's missiles from exploding too soon 2012-10-13 17:31:12 -06:00
Curtis Shmyr
267141749d Chronotank charge pips down from 5->2, pips are blue and jump radius is blue 2012-10-13 16:50:11 -06:00
Curtis Shmyr
edd41c5be1 Chronotank jump cooldown lowered from 60 seconds to 30 2012-10-13 16:50:10 -06:00
Curtis Shmyr
5dc0439173 Fix flak truck description 2012-10-13 16:50:10 -06:00
Curtis Shmyr
4dbee1c0e3 Lower cost of TTNK (1500->1350) and update description to reflect current balance 2012-10-13 16:50:09 -06:00
Curtis Shmyr
76baba89c1 Retune chronotank's weapons to match its description 2012-10-13 16:50:08 -06:00
Curtis Shmyr
5da96941e1 Fix demo truck description 2012-10-13 16:50:07 -06:00
Curtis Shmyr
c2ec8cd372 Fix Volkov's description 2012-10-13 16:50:06 -06:00
Chris Forbes
b73a0a9720 fix off-by-one in new tile query 2012-10-14 10:07:08 +13:00
Chris Forbes
6f3b21616f fix warnings in allies scripts 2012-10-13 14:31:45 +13:00
Chris Forbes
1792f16929 Merge remote-tracking branch 'scott/allies' 2012-10-13 13:52:21 +13:00
Chris Forbes
8dfd02e69e fix HackyAI's husk fetish 2012-10-13 13:45:35 +13:00
Chris Forbes
c8b1c1b999 tidy slightly in idle harv handler 2012-10-13 13:42:34 +13:00
Curtis Shmyr
da9422824a Trans heli now costs 900, increased health, increased cargo count to 8 2012-10-13 13:30:36 +13:00
Chris Forbes
403b51ca4b remove duplication in Mobile 2012-10-13 12:55:51 +13:00
Chris Forbes
3fad0983b9 simplify Mobile using new ordering from FindTilesInCircle 2012-10-13 12:55:51 +13:00
Chris Forbes
bbab5237d1 get rid of crazy wasted work in HackyAI 2012-10-13 12:55:51 +13:00
Chris Forbes
699838332d Order results from FindTilesInCircle by distance 2012-10-13 12:55:51 +13:00
Chris Forbes
6e237b53e1 remove unused trait lookup in ChronoshiftDeploy.ResolveOrder 2012-10-13 11:43:06 +13:00
Curtis Shmyr
36990601db Remove extra newline on Volkov's description 2012-10-13 11:38:00 +13:00
Curtis Shmyr
82f9549f01 Improve mammoth tank tusk turn rate (5->10) 2012-10-13 11:37:55 +13:00
Curtis Shmyr
656503c0c5 Increase range of Tanya's colt45 from 5.75 to 7 2012-10-13 11:37:52 +13:00
Curtis Shmyr
83fc70f415 Added Chrono Tank to Allies 2012-10-13 11:37:46 +13:00
Scott_NZ
bd8ba636c9 Shift v2s to 4 minutes; improve the additional units code 2012-10-12 20:59:35 +13:00
Scott_NZ
6eb2f2bffe Don't hard code 100 into the objectives string 2012-10-12 16:06:43 +13:00
Scott_NZ
d9a6cc6b1c Should be greater than or equal to when comparing with death threshold 2012-10-11 22:57:19 +13:00
Scott_NZ
8c3aabb215 Support for updating objectives without flashing the objectives button. Added a secondary objective: lose fewer than 100 units. 2012-10-11 22:55:02 +13:00
Scott_NZ
d44d9f67f2 Promote the 'MainPresence' objective to primary. 2012-10-11 22:36:40 +13:00
Scott_NZ
8f8800803b Make the Soviet V2s buildable immediately. Fix the Soviet reinforcements not arriving properly. Remove the Soviet reinforcements timer. Rework the bottom left of the map. 2012-10-11 22:35:13 +13:00
Scott_NZ
52007b6277 Move the timer positions 2012-10-09 20:56:11 +13:00
Scott_NZ
795008011e Explosive barrel explosions now cascade with a small delay between each explosion. 2012-10-09 01:51:25 +13:00
Scott_NZ
ec6b8646e9 Improve barrel explosions in Allies 01 by increasing the explosion damage and the health of the power plants/oil derrick. 2012-10-09 00:25:49 +13:00
Scott_NZ
40206f8280 Improved control over the 'final' Soviet wave 2012-10-08 23:34:38 +13:00
Scott_NZ
887a9e7c9c Make medic/spy available to the Allies1 player 2012-10-08 23:34:02 +13:00
Scott_NZ
e4218ede41 Improve the Soviet base, and rebalance the power. 2012-10-08 21:16:30 +13:00
Scott_NZ
f4d0f80cd3 Increase the difficulty of the final wave and shift some of the Soviet power plants around 2012-10-08 20:51:03 +13:00
Scott_NZ
8661fb6b8d Add final attack for Soviets 2012-10-08 19:39:18 +13:00
Scott_NZ
c212095a40 Improve the stability of CountdownTimer 2012-10-08 17:16:42 +13:00
Chris Forbes
f337c7fb40 fix 2422; tesla ignoring weapon offset 2012-10-07 19:23:50 +13:00
Scott_NZ
073a8ee079 Sync up the countdown timer and the objectives button flash with the game speed 2012-10-05 22:03:35 +13:00
Scott_NZ
a4b01cf114 Improved the Allies 02 map layout 2012-10-05 22:02:51 +13:00
Scott_NZ
cba069a039 Improve the effectiveness of the parabombs 2012-10-05 16:23:58 +13:00
Scott_NZ
bf4829205c Have the parabomber come from a different direction. Have the Soviet tanks go straight for the enemy base structures. 2012-10-04 23:59:33 +13:00
Scott_NZ
328dce26ba Add some dogs around the Soviet base to make it harder to use spies 2012-10-04 22:57:34 +13:00
Scott_NZ
0524708e05 Add Yak harrassment 2012-10-02 21:52:45 +13:00
Scott_NZ
7e376330d0 Have the reinforcements money come in as supply trucks instead 2012-10-02 21:52:45 +13:00
Scott_NZ
762db8b304 Have the countdown timer flash in the last 10 seconds, and increase the money amount when reinforcements arrive 2012-10-02 21:52:44 +13:00
Scott_NZ
37479b3cfd Tank wave at 11 minutes, just before the reinforcements arrive 2012-10-02 21:52:44 +13:00
Scott_NZ
07c2330245 Add 2 additional paradrop badgers to the paradrop attack, and a parabomb attack 2012-10-02 21:52:44 +13:00
Scott_NZ
0c6daf191c Add button highlighting/glow effect, to be used for the objective button when the objectives update 2012-10-02 21:52:43 +13:00
Scott_NZ
b897579a20 Send the waves instantly 2012-10-02 21:52:43 +13:00
Scott_NZ
fcc0bcf438 Improve the Soviet attack routines for Allies 01 2012-10-02 21:52:43 +13:00
Scott_NZ
0cd258f24f Dynamically position the timer so that it isn't cut off 2012-10-02 21:52:43 +13:00
Scott_NZ
43e99bf9f5 Add heal animation for the heal crate 2012-10-02 21:52:42 +13:00
Scott_NZ
83d10ba838 Add mission objectives logic/backend 2012-10-02 21:52:42 +13:00
Scott_NZ
48997725c3 Don't let tran reveal shroud 2012-10-02 21:52:42 +13:00
Scott_NZ
631f899f18 Begin work on objectives UI 2012-10-02 21:52:42 +13:00
Scott_NZ
2a4a9d778f Redo some of the fencing near the Soviet base 2012-10-02 21:52:41 +13:00
Scott_NZ
2e2b4d04db Small map/behaviour adjustments 2012-10-02 21:52:41 +13:00
Scott_NZ
deede92fbc Update objective code for Einstein helicopter, avoid race condition with checking if allies2 has been killed 2012-10-02 21:52:41 +13:00
Scott_NZ
e3b2e84792 Focus on the town more; create additional crash site there and and move Einstein there for players to save. 2012-10-02 21:52:41 +13:00
Scott_NZ
e07d55f5f4 Open up the rear of the Soviet base for infiltration by the allies1 player. 2012-10-02 21:52:40 +13:00
Scott_NZ
1803b412c3 Convert Allies 02 over to enum objectives 2012-10-02 21:52:40 +13:00
Scott_NZ
8dd7bfdb67 Move the objective flag stuff to MissionUtils 2012-10-02 21:52:40 +13:00
Scott_NZ
d1400ab4fa Set the enum values explicitly 2012-10-02 21:52:40 +13:00
Scott_NZ
67c40f3119 Use enum-based objectives for Allies 01 2012-10-02 21:52:39 +13:00
Scott_NZ
68d0201538 Add more utils to MissionUtils. Extract Allies 02 countdown timer to its own class file 2012-10-02 21:52:39 +13:00
Scott_NZ
d30d3ed05a Create MissionUtils.cs for shared mission code 2012-10-02 21:52:39 +13:00
Scott_NZ
43f2895eb8 Put reinf ticks back to 12 minutes 2012-10-02 21:52:39 +13:00
Scott_NZ
185e3cffb4 Repackage maps 2012-10-02 21:52:38 +13:00
Scott_NZ
d68196a3b0 Fixed some constant naming 2012-10-02 21:52:38 +13:00
Scott_NZ
4551302c09 Reduce Tanya's and Einstein's weights to 0 so they can still board chinook helicopters if they are full 2012-10-02 21:52:38 +13:00
Scott_NZ
56f36e45db New crate type 'HealUnitsCrateAction' which heals all of the units that the collecting player has. Very rare. New 'ContainsCrate' trait which goes along with this - could be used to hide crates inside churches for example like in the original RA missions. 2012-10-02 21:52:38 +13:00
Scott_NZ
8fabf1504a Add a nearEnough field for RallyPoints (to be used as an argument for their AttackMove activities) so the Soviets don't get stuck on their rally point, and scatter the units a bit before they attack 2012-10-02 21:52:37 +13:00
Scott_NZ
fd96d08ce8 Smoke effect for the chinook husk 2012-10-02 21:52:37 +13:00
Scott_NZ
0e801f9d3a Rework bottom right of Allies 2 map: add more space, more Soviet soldiers, put the captive Engineer outside. Move the southern Soviet outpost up to where the second SAM site is. Move the Soviet rally point up a bit. 2012-10-02 21:52:37 +13:00
Scott_NZ
e5ab56e843 Rework bottom right of the Allies 02 map, move captive Engineer outside. Set Tanya's stance to ReturnFire so attack-move works. 2012-10-02 21:52:37 +13:00
Scott_NZ
ff0ad9cb41 Set fcom tooltip to Forward Command 2012-10-02 21:52:36 +13:00
Chris Forbes
3e81a4bd70 remove PowerBarWidget entirely 2012-09-25 19:51:03 +12:00
Chris Forbes
84f7aa56e1 make ResourceBarWidget generic 2012-09-25 19:44:20 +12:00
Chris Forbes
c42f270ce0 move all databinding for the silobar into ui logic 2012-09-25 19:39:33 +12:00
Chris Forbes
af31ae4931 tidy up SiloBarWidget to be almost completely independent of ore 2012-09-25 19:27:33 +12:00
Chris Forbes
8b6308d3a2 reduce differences between PowerBarWidget and SiloBarWidget 2012-09-25 18:56:24 +12:00
Chris Forbes
6ecc4c18dc fixed 2036 -- add targetlines for defenses 2012-09-25 18:42:36 +12:00
Chris Forbes
56557b8766 convert dtrk to use MiniNuke 2012-09-24 21:07:16 +12:00
Chris Forbes
83ba80f4c9 add MiniNuke weapon for dtrk 2012-09-24 21:06:49 +12:00
Chris Forbes
65227c3c09 remove nuke crate 2012-09-24 21:03:33 +12:00
Chris Forbes
1b5474f377 retune nuke 2012-09-24 21:02:22 +12:00
Chris Forbes
38b5e2f7ca set up demo truck to explode on chronoshift 2012-09-24 20:36:03 +12:00
Chris Forbes
0ff3c56d4f add Chronoshiftable:ExplodeInstead option 2012-09-24 20:34:54 +12:00
Chris Forbes
4888732fb7 fix reversed ordernames in DemoTruck 2012-09-24 20:24:35 +12:00
Chris Forbes
3079e2b488 fixed Explodes dep on demotruck 2012-09-24 20:22:36 +12:00
Curtis Shmyr
34d96878b8 Added demo truck to soviet's arensal; still problems to fix 2012-09-24 20:08:56 +12:00
Chris Forbes
61e548151b clear queue-per-building production queue on mcv repack 2012-09-23 18:00:06 +12:00
Chris Forbes
7cc7dcc559 add INotifyTransform hook for just before something transforms 2012-09-23 17:58:53 +12:00
Chris Forbes
757c9ca63c Fixed 2387 - dont shade possible build items in cnc just because something else is building 2012-09-23 17:45:13 +12:00
Chris Forbes
5cb86f8937 repair cost for units is always at least 1 per tick 2012-09-23 17:38:23 +12:00
Chris Forbes
cd1a29f1ea repair cost is always at least 1 per tick 2012-09-23 17:37:35 +12:00
Igor Popov
79b4765d9f fix: port in Direct Connect was dumped to default by force 2012-09-23 17:27:19 +12:00
Igor Popov
05e9dcd5ce dedicated: load another initial map if current key is not present in dictionary 2012-09-23 17:20:47 +12:00
Igor Popov
4c915ce8fe dedicated: configurable MOTD 2012-09-23 17:20:47 +12:00
Igor Popov
5d5fe3f5a1 dedicated: proper reason why DEV_VERSION is kicked. 2012-09-23 17:20:46 +12:00
Igor Popov
5bacf69445 dedicated: cleaner 2012-09-23 17:20:46 +12:00
Igor Popov
0a858ac353 cleaner 2012-09-23 17:20:46 +12:00
Igor Popov
b7258e61f3 remove bogus comment 2012-09-23 17:20:46 +12:00
Igor Popov
bd45ffa022 dedicated: start a new server instance once previous game is finished (configurable) 2012-09-23 17:20:46 +12:00
Igor Popov
b45f9568d0 dedicated: force tell master server if amount of clients is 0 2012-09-23 17:20:46 +12:00
Igor Popov
f8290b8a7e dedicated: handle admin 2012-09-23 17:20:46 +12:00
Igor Popov
21b002ce22 dedicated: drop DEV_VERSION 2012-09-23 17:20:45 +12:00
Igor Popov
1fbd8f6cc6 dedicated: null SoundEngine 2012-09-23 17:20:45 +12:00
Igor Popov
2798f0d841 dedicated: handle non-existing map 2012-09-23 17:20:45 +12:00
Igor Popov
bf73cdbd01 basic dedicated server support 2012-09-23 17:20:45 +12:00
Chris Forbes
03229eca0c remove sounds from sniper cloak/uncloak; enable uncloak-on-move for sniper. 2012-09-23 17:17:07 +12:00
Chris Forbes
489fdc1893 add CloakInfo.UncloakOnMove option 2012-09-23 17:15:16 +12:00
Chris Forbes
e2b2082660 fix armor types on war factory and airfield 2012-09-20 10:14:44 +12:00
Chris Forbes
5ab2e2b225 adjust building prices 2012-09-20 10:13:14 +12:00
Chris Forbes
caa58e46c3 buff 4tank self-heal; nerf turret rotation 2012-09-19 17:35:06 +12:00
Chris Forbes
e9f4338852 remove vestigial mods/*/packages handling from installer 2012-09-16 14:13:24 +12:00
Scott_NZ
f146cedad5 Improve the thresholds a bit 2012-09-16 12:27:33 +12:00
Scott_NZ
cc449f81f8 Describe the map size in words 2012-09-16 12:27:33 +12:00
Chris Forbes
085e29d22b dead things are no longer valid targets 2012-09-16 11:24:36 +12:00
Chris Forbes
f8427fa242 refuse to start the game unless required slots are full. 2012-09-16 11:05:00 +12:00
Chris Forbes
eb9b6a3842 propagate Required flag to Slot 2012-09-16 10:58:48 +12:00
Chris Forbes
43fc1219f0 add Required field to PlayerReference 2012-09-16 10:51:49 +12:00
Igor Popov
1469620831 new interior map by sunny_s: room-warzone 2012-09-16 10:43:40 +12:00
Chris Forbes
036997a7a0 update authors file 2012-09-16 10:17:51 +12:00
Kyrre Soerensen
b4d9c40dc8 maps: Replace Baywatch with Hasselhoff (better ore distribution)
Signed-off-by: Kyrre Soerensen <kyrre@ksorensen.net>
2012-09-16 10:14:32 +12:00
Chris Forbes
62257459fd fix NRE in ReturnToBase bailout if no suitable building is found 2012-09-14 23:20:39 +12:00
Chris Forbes
ea641f081f use ChooseAirfield in ReturnToBase.Tick bailout 2012-09-14 23:20:18 +12:00
Chris Forbes
a641c7a87d add parameter to ReturnToBase.ChooseAirfield for whether the building must be unreserved 2012-09-14 23:14:02 +12:00
Chris Forbes
605a1eacf6 fix Gl renderer; texture binding was totally busted 2012-09-13 08:14:21 +12:00
Chris Forbes
da3adf4f8e fix bogus extra death sounds in ra VolkovVoice 2012-09-13 07:35:25 +12:00
Chris Forbes
8680405b68 show no-deploy cursor if locked 2012-09-13 07:27:15 +12:00
Chris Forbes
5ad2d1892f take lock in DeployTransform if we're a building 2012-09-13 07:25:39 +12:00
Chris Forbes
b723e350c8 remove spurious interlock in Sell 2012-09-13 07:16:04 +12:00
Chris Forbes
0b665bc35b move counter-capture logic down into Capturable; remove spurious interlock on CaptureInProgress 2012-09-13 07:14:56 +12:00
Chris Forbes
c012ea90dd get rid of capturing lock in Sellable 2012-09-13 07:10:28 +12:00
Chris Forbes
b0b0fac847 get rid of Sellable.Selling state 2012-09-13 07:09:44 +12:00
Chris Forbes
c253e59c57 take lock while capture in progress 2012-09-13 07:08:02 +12:00
Chris Forbes
952e277d35 take lock in Sellable.ResolveOrder 2012-09-13 07:05:58 +12:00
Chris Forbes
f984934270 add Building.Locked, and Lock()/Unlock() conveniences 2012-09-13 07:05:58 +12:00
Chris Forbes
fb58840cea ignore spectators for readiness check 2012-09-04 11:24:59 +12:00
Chris Forbes
3d8dc80f03 complain about junk values like the recent volkov breakage 2012-09-04 10:55:26 +12:00
Chris Forbes
d970195394 fix bogus armor definition for Volkov 2012-09-03 09:26:27 +12:00
Scott_NZ
c33c9e9f69 Fixes #2386 (Add map size to map list) 2012-08-28 16:18:15 +12:00
Chris Forbes
6d3a932453 Revert "Removed the "tip" jutting out of 3 buildings, so they are rectangular instead of awkwardly shaped."
This reverts commit 22bddf9645.
2012-08-25 15:32:29 +12:00
Scott_NZ
622650785c Set Allied units to defensive stance in Allies 01 2012-08-25 15:20:59 +12:00
Scott_NZ
362dc8128e Don't crash and burn if vqa files aren't found 2012-08-25 15:20:58 +12:00
Scott_NZ
f8e73afbee Improve the music-playing code - crash prevention and some polish 2012-08-25 15:20:58 +12:00
Scott_NZ
dbbe026b88 Actually fix the desync issues 2012-08-25 15:20:58 +12:00
Scott_NZ
4b36a9bf7f Fix desync issues 2012-08-25 15:20:58 +12:00
Matthias Mailänder
70a5333b40 fixes #2363
typo leading to a crash when clicking a disabled tab
2012-08-22 12:40:38 +12:00
Igor Popov
e8359b08c6 change IsAdmin indicator to d2k like 2012-08-22 12:38:10 +12:00
Scott_NZ
cebc0b66a5 Make the Viewport code easier to follow 2012-08-20 20:45:56 +12:00
Scott_NZ
6ac86cbc1a Fix UnitsNearActor basing itself off the Soviet WP, instead of the actual actor. Move the power code to the unit building method so the Soviets don't build units completely, even if they have enough money. 2012-08-20 20:45:54 +12:00
Curtis Shmyr
60ceb800e1 Remove contrails from pbox vulcan - was not working as intended 2012-08-20 15:06:36 +12:00
Igor Popov
5f47b7b7fc add 3v3 d2k map by Combine; add 2 ra maps by Holloweye (conquest + minigame) 2012-08-20 13:54:11 +12:00
Scott_NZ
7e2866714c Overhaul Soviet base 2012-08-20 03:32:09 +12:00
Scott_NZ
7e8313b808 Add music to Allies 02 2012-08-19 17:19:45 +12:00
Scott_NZ
bfd28abb70 FMV videos for Allies 01, also adjust music to play a random track 2012-08-19 17:00:03 +12:00
Scott_NZ
1afc0cbfce Remove fast unit production for Soviets, this is too overwhelming 2012-08-19 13:05:05 +12:00
Scott_NZ
82bcd19d2e Fix crash when Media.PlayFMVFullscreen is called 2012-08-19 12:56:12 +12:00
Scott_NZ
49049a715b Give allies base more reinforcements after 12 mins 2012-08-19 12:55:38 +12:00
Scott_NZ
3114a5b85e Add Soviet apc/flamer rush after 7 minutes 2012-08-18 17:26:18 +12:00
Scott_NZ
222f17a586 Minor refactor 2012-08-18 01:45:05 +12:00
Scott_NZ
91027e9961 Use FirstOrDefault when getting closest building 2012-08-18 00:01:35 +12:00
Scott_NZ
a06a7a8ccb Replace arty with fix/2tnk 2012-08-18 00:00:44 +12:00
Scott_NZ
a8bae22dd3 Give arty back so the allies stand a chance 2012-08-17 23:27:19 +12:00
Scott_NZ
daa89f52b6 Add lethal Soviet attacks and increase heavy tank production 2012-08-17 23:13:35 +12:00
Scott_NZ
22c1059904 Rework water area near the town 2012-08-17 20:28:05 +12:00
Scott_NZ
c0138966e7 Rework Allied base a bit 2012-08-17 20:02:39 +12:00
Scott_NZ
0f14263b82 Make walls not contribute to allied building check 2012-08-17 17:48:47 +12:00
Scott_NZ
dfc6304efa Increase the difficulty 2012-08-17 17:31:18 +12:00
Igor Popov
99a8aa6868 spelling fix 2012-08-17 00:35:51 +04:00
Igor Popov
983fc1a7b6 fix cnc menu/multiplayer titles overrides by server's title; 2012-08-16 21:22:10 +04:00
Scott_NZ
632d717af8 Fix HeliLand constructor 2012-08-16 22:04:10 +12:00
Scott_NZ
a74a3aa3b5 Disable bots 2012-08-16 21:47:22 +12:00
Scott_NZ
c90c351692 Spaces in csproj 2012-08-16 21:47:21 +12:00
Scott_NZ
5612a57842 and some more 2012-08-16 21:47:20 +12:00
Scott_NZ
6e3c8c9745 Fix some old VS-induced nastiess 2012-08-16 21:47:19 +12:00
Scott_NZ
0920c67017 Require ra mod, pack allies 02 2012-08-16 21:47:18 +12:00
Scott_NZ
1ed0d80348 Fix static readonly field capitalisation conventions 2012-08-16 21:47:17 +12:00
Scott_NZ
c41fcb15b0 Fail Allies01/Allies02 if the extraction helicopter is destroyed 2012-08-16 21:47:16 +12:00
Scott_NZ
6c79b454bf Improve Allies base 2012-08-16 21:47:16 +12:00
Scott_NZ
610e40b8d6 Give Allies2 player some cash when they receive reinforcements 2012-08-16 21:47:15 +12:00
Scott_NZ
5038018aa5 Give the Soviets money as they need it. 2012-08-16 21:47:14 +12:00
Scott_NZ
cce12e781f Kill the allied players if they fail the mission. Also fail the mission if the Allies2 player loses all of their buildings. 2012-08-16 21:47:13 +12:00
Scott_NZ
245de3abcb Making HBOX unbuildable was crashing the game 2012-08-16 21:47:12 +12:00
Scott_NZ
11f9fa1942 Some code polish 2012-08-16 21:47:11 +12:00
Scott_NZ
85fa7eb8c4 Modify tech tree, disable bots 2012-08-16 21:47:10 +12:00
Scott_NZ
62d7168d41 Make the mission not unwinnable if Einstein can't cross the bridge because it is destroyed 2012-08-16 21:47:09 +12:00
Scott_NZ
2a053daa2e Add Soviet attacks, scrap chinook timer since we might have pathing issues if Tanya is on the island and we have off-map attacks. Counter this by bringing back reinforcements timer 2012-08-16 21:47:09 +12:00
Scott_NZ
21a903fe2d Remove an ai activation check, we want it to always activate even if the host is a spectator 2012-08-16 21:47:08 +12:00
Scott_NZ
83fc546fbe Reposition Soviet barracks/kennel 2012-08-16 21:47:07 +12:00
Scott_NZ
f648223c39 Improve the deploy routine so that baseCenter is still set even if the mcv is a fact 2012-08-16 21:47:06 +12:00
Scott_NZ
583c3f9a64 Produce dogs, adjust allied building positions 2012-08-16 21:47:05 +12:00
Scott_NZ
0d9c78670e Basic Soviet AI. This is flawed right now as it will just charge all of its starting units towards Tanya 2012-08-16 21:47:04 +12:00
Scott_NZ
32a37d8c0f Stop the hacky AI unpacking the fact into a mcv if it starts with a fact instead of a mcv 2012-08-16 21:47:03 +12:00
Scott_NZ
168ff6dc82 Remove "timer started" conflict 2012-08-16 21:47:03 +12:00
Scott_NZ
03f904155e Reinforcements voice with chopper extraction 2012-08-16 21:47:02 +12:00
Scott_NZ
f479f9a32d Have reinforcements come immediately.. 2012-08-16 21:47:01 +12:00
Scott_NZ
bdbb9d2a9f Add oil facility outside allies2 2012-08-16 21:47:00 +12:00
Scott_NZ
e3ae0ceae3 Add some more map detail 2012-08-16 21:46:59 +12:00
Scott_NZ
34ea82e267 Improved Soviet base layout further 2012-08-16 21:46:58 +12:00
Scott_NZ
fe7e016e33 Improved layout of Soviet base 2012-08-16 21:46:57 +12:00
Scott_NZ
f901355bef Make tran unselectable 2012-08-16 21:46:56 +12:00
Scott_NZ
60fb45c909 Move the sam site around to make a new outpost on the top left, add engineer rescue 2012-08-16 21:46:56 +12:00
Scott_NZ
9ccfb2c322 Make the mission actually winnable 2012-08-16 21:46:55 +12:00
Scott_NZ
0c9f39df78 Clean up allies01/allies02 code by storing world object 2012-08-16 21:46:54 +12:00
Scott_NZ
7fffb71ac4 Clean up timer code, add chinook extraction of Einstein 2012-08-16 21:46:53 +12:00
Scott_NZ
bf0cee9057 Redo outpost: move it into the town and put a miss in the old position. The player can rescue engineers from miss to capture the outpost. 2012-08-16 21:46:52 +12:00
Scott_NZ
55b17f70a8 Adjust to 6 mins 2012-08-16 21:46:51 +12:00
Scott_NZ
c9318cd2dd Chinook timer 2012-08-16 21:46:50 +12:00
Scott_NZ
ffd2588f50 Improved the soviet base 2012-08-16 21:46:49 +12:00
Scott_NZ
c3b9b37122 Bit of cleanup, add position parameter 2012-08-16 21:46:48 +12:00
Scott_NZ
a30d82b333 Convert timer actions to be properties 2012-08-16 21:46:47 +12:00
Scott_NZ
81e2c1d2d7 Implement basic reinforcements for allies2 2012-08-16 21:46:46 +12:00
Scott_NZ
5f2ffc0508 Clean up the timer widget code 2012-08-16 21:46:45 +12:00
Scott_NZ
00297b607b Add drawing widget for reinforcements 2012-08-16 21:46:45 +12:00
Scott_NZ
1c702048a1 Make allies 01 less loud 2012-08-16 21:46:44 +12:00
Scott_NZ
fdd356c2e7 Improve allied base, stop tanya autotargeting 2012-08-16 21:46:43 +12:00
Scott_NZ
1e64a63fa4 Have the starting camera viewport position be determined by the local player 2012-08-16 21:46:42 +12:00
Scott_NZ
05f079758a Begin building basic Allies 02 framework 2012-08-16 21:46:41 +12:00
Scott_NZ
b220bbeda2 Wire up SAM 4 2012-08-16 21:46:40 +12:00
Scott_NZ
0a358a8846 Soviet base: construction yard, sam site, silos 2012-08-16 21:46:39 +12:00
Scott_NZ
ed43c1b482 Modified the bridge to stop crossing with sea units, and opened up the mountain for an alternative route to the Soviet outpost 2012-08-16 21:46:39 +12:00
Scott_NZ
c505954b07 bleh, tabify 2012-08-16 21:46:38 +12:00
Scott_NZ
d5279d123f Start work on Allies 02 script, reveal sam site locations 2012-08-16 21:46:37 +12:00
Scott_NZ
9be501fc3d Improve the objective text in Allies 01 - Einstein/Tanya can't be killed 2012-08-16 21:46:36 +12:00
Scott_NZ
1721d7e025 Add Kennel to allies 02 2012-08-16 21:46:35 +12:00
Scott_NZ
881484d06a Some allies 02 map work - add sub pen and rework the Soviet base a bit 2012-08-16 21:46:34 +12:00
Scott_NZ
537cfb8fd3 Add Kennel to Allies 01 2012-08-16 21:46:33 +12:00
Scott_NZ
41f1ea36fe Add Kennel structure 2012-08-16 21:46:32 +12:00
Scott_NZ
486d340028 Bridges 2012-08-16 21:46:32 +12:00
Scott_NZ
e2bbd22144 Add allies-02 map yaml/bin 2012-08-16 21:46:31 +12:00
Scott_NZ
43d0363a55 Formatting improvements from Husk/Allies01 2012-08-16 21:46:30 +12:00
NukemBro
b253de508b Added new RA map: Chaos Canyon 2012-08-16 09:34:24 +12:00
Chris Forbes
1da82aeba9 slow sniper rof to 70 2012-08-16 09:30:03 +12:00
Chris Forbes
db4d6aaf22 sniper requires dome 2012-08-15 21:55:18 +12:00
Matthias Mailänder
5ea86873c6 fixes #2360, fixes #2227
use notifications.yaml for biolab production queue (crash fix)
remove bio prerequisite for visceroid (won't work after capture)
2012-08-15 08:52:03 +12:00
Chris Forbes
0f126fd630 tidy in defaults.yaml 2012-08-15 08:51:15 +12:00
Chris Forbes
ecc2a7241f fix case on WastedAfterwards 2012-08-15 08:51:14 +12:00
Matthias Mailänder
fbf68db0c0 change some d2k weapon sounds 2012-08-15 08:51:12 +12:00
Matthias Mailänder
9ce8c90d25 added Harissons high-quality temperate terrain expansion
new brigdes, fjords, debris, cliffs
2012-08-15 08:51:01 +12:00
Matthias Mailänder
affa9ca336 revert CaptureActor.Range, PascalCase conventions, compatibilty
the hardcoded Range=3 was crap for smaller/bigger buildings
try not to break TransformOnCapture as it is used for cnc husks
2012-08-15 08:49:49 +12:00
Chris Forbes
3a1c4d1e6f sniper is soviet-only; use initial stance correctly 2012-08-15 08:49:20 +12:00
Matthias Mailänder
45fbecbcd0 sniper can go into pillbox and garrision church 2012-08-15 08:49:16 +12:00
Matthias Mailänder
02f28f54c7 add sniper to ra 2012-08-15 08:49:12 +12:00
Matthias Mailänder
81f035904e remove TODO list, use bug-tracker 2012-08-15 08:48:48 +12:00
Matthias Mailänder
8e2d712688 fix cnc snow theatre crash 2012-08-14 11:01:36 +12:00
Matthias Mailänder
29b63bc3c0 add hospital and biolab sequences 2012-08-14 11:01:34 +12:00
Matthias Mailänder
d98cdd5331 new d2k map: Venac ditch by Combine
http://content.open-ra.org/?p=detail&table=maps&id=635
2012-08-14 11:01:18 +12:00
Matthias Mailänder
94905afa3c better cropped volkov icon, thanks to BaronOfStuff 2012-08-14 10:45:09 +12:00
Matthias Mailänder
a659892227 added emperor palace icon, thanks to D2k Sardaukar and Grand Leo 2012-08-14 10:44:51 +12:00
Chris Forbes
82eddfdf98 #2354 fixed - multiple collection of crates 2012-08-09 10:25:45 +12:00
Chris Forbes
063191b09e fix #2353 - missing dep between d2k and cnc mods broke parallel make 2012-08-08 07:36:49 +12:00
Curtis Shmyr
3fc6f62aea Conflicts:
OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs
2012-07-31 09:20:22 +12:00
Scott_NZ
48f934f188 Set up tran husks, and stop husk placement causing crashes 2012-07-31 09:12:22 +12:00
psydev
192af5d60f Tank shells do 100% vs. armor again. Buff turret. MRLS fixed.
Conflicts:

	mods/cnc/weapons.yaml
2012-07-31 09:10:32 +12:00
psydev
53a7b0987b Fixed structure build menus
Made the building menu more logical. Rows according to tech tree. 

power / refinery / silos       0/10/15
barracks / outpost / starport    20/30/40
light factory / heavy factory / repair bay   50/60/70
high-tech factory / ix tech center / palace    80/90/100

If you want to move silos to the Defense queue, then I would re-arrange it slightly.
2012-07-31 08:24:54 +12:00
psydev
a3897dbc15 Sonic tank moved to end of build menu (100)
Sonic tank moved to bottom of vehicle build menu (set palette order to 100)
2012-07-31 08:23:08 +12:00
Chris Forbes
55651738a7 add heli crash shps 2012-07-30 09:22:36 +12:00
psydev
22bddf9645 Removed the "tip" jutting out of 3 buildings, so they are rectangular instead of awkwardly shaped.
- heavy factory
- high tech factory
- ix research center
2012-07-25 08:58:18 +12:00
psydev
2a37e6233e Added "AutoTargetIgnore:" to ^Building: 2012-07-25 08:57:50 +12:00
Matthias Mailänder
c1722e1270 remove broken sandworm and thumper, fixes #2332 2012-07-25 08:57:05 +12:00
Matthias Mailänder
95c27ef943 deviatortank should require tech building 2012-07-25 08:57:01 +12:00
Matthias Mailänder
3aafde7e18 slower infantry feet animation 2012-07-25 08:56:54 +12:00
Matthias Mailänder
85678de9f0 made silos more flexible for d2k mod 2012-07-24 08:29:18 +12:00
Matthias Mailänder
bda4bfa4f3 d2k: tooltip for $ icon is now starport instead of ship 2012-07-23 09:34:16 +12:00
Matthias Mailänder
481624e3f0 fixed d2k crash: Unit pips does not have a sequence pip-red 2012-07-23 09:34:06 +12:00
ew07002
d1f12ff801 Add some usability features to the TilesetBuilder
- title bar shows tile position (x, y and tile nr (from left top))
 - make 'overlays' button a toggle button and properly sync state with
   tileset surface
 - add export option for 'Template CellID <-> tile number' mapping
 - overlay pen color is now white (todo: make configurable)
2012-07-23 09:33:57 +12:00
Matthias Mailänder
eae482d413 tweak d2k aircrafts a little 2012-07-23 09:33:53 +12:00
Matthias Mailänder
abd774d017 d2k: faster aircrafts, slower trikes, concrete buildings
avoid capturing light buildings by deviator weapon
2012-07-23 09:33:51 +12:00
Matthias Mailänder
f2c630731e added some files from content.open-ra.org, fixes #2182
adds Volkov with some minor changes (no C4, range fixes)
adds soviet forward command center build animation
adds icon for mines (not visible in-game yet)
2012-07-23 09:33:46 +12:00
Matthias Mailänder
3e3977776d fixes #2322 (stuck units when leaving repair pad)
by adding bibs and defining a sane default rallypoint exit cell
2012-07-21 00:01:26 +02:00
Matthias Mailänder
36fbddbb5c fix d2k production queues
ClassicProductionQueue gets support for new notification system
d2k now uses the ClassicProductionQueue system to avoid spamming
Starport has cheaper threshold prices
adds a new production queue but has long delivery times
also no starport price fluctuation to improve balancing
2012-07-20 23:05:28 +02:00
Matthias Mailänder
e33d988301 d2k UI reskinning complete, thanks to @JOoGraphics 2012-07-20 20:00:09 +02:00
Matthias Mailänder
a55167c9ac another d2k loadscreen made by @katzsmile 2012-07-19 23:16:05 +02:00
Matthias Mailänder
d0a4555a1f new admin icon that does fit and some more icons for the future 2012-07-19 21:37:24 +02:00
Matthias Mailänder
4724ac6b00 experimenting with concrete plates
pretty useless at the moment, removed by default
2012-07-19 20:08:59 +02:00
Matthias Mailänder
d998367d35 d2k UI improvements by @JOoGraphics 2012-07-19 17:56:41 +02:00
Matthias Mailänder
0e9e7d0a9d added http://dunefont.co.nr/ to artsrc
maybe used for logos, splashscreens or menus later
2012-07-18 22:08:46 +02:00
Matthias Mailänder
5e1e5903d6 reworked d2k dialog UI, thanks to @JOoGraphics 2012-07-18 19:11:06 +02:00
Matthias Mailänder
25fae5d109 fixed d2k harvester dock animation 2012-07-17 22:03:30 +02:00
Matthias Mailänder
44b8630c71 support reversed remapping for d2k 2012-07-17 17:01:37 +02:00
Matthias Mailänder
6204bfcabf added hospital/bio lab to RA 2012-07-17 14:18:10 +02:00
Matthias Mailänder
1355a9f837 added extra d2k buildings for creeps/neutral
new SHPs, needs update for d2k-packages.zip
2012-07-17 14:02:22 +02:00
Matthias Mailänder
db8f22cdbf d2k harvester unload a little less ugly, RALint fixes
frames were swapped, offset and turnaround still wrong
remember: this changes unload.shp (copy to dl-mirrors)
2012-07-16 22:23:56 +02:00
Matthias Mailänder
860ec9d85f added passenger seat to trike/raider 2012-07-16 21:11:27 +02:00
Matthias Mailänder
5f2f25b758 added d2k superweapons, fixed c4/nuke cursor 2012-07-16 21:02:55 +02:00
Matthias Mailänder
3728685c67 fixed UPnP more crashes
proper timeout: does not crash/lag if no UPnP devices are found
close all ports, sockets, responses after they have been used
so it does not crash when port forwarding for the 2nd time
put all exceptions logs into OpenRA sourcecode
2012-07-15 22:31:02 +02:00
Matthias Mailänder
5e6b8deec1 remove ugly test map again 2012-07-15 18:39:48 +02:00
Matthias Mailänder
21f2b0df43 fixed a crash when siege tanks are built 2012-07-15 18:39:17 +02:00
Chris Forbes
2100484598 fix name of the-duell map for d2k; space breaks rpm build 2012-07-15 12:40:58 +12:00
James Dunne
ba1a36f26e Units heading in generally opposite directions are now considered blockers; this fixes pathing deadlocks. 2012-07-05 23:53:31 -05:00
James Dunne
9c9a16d80e Path planning no longer considers moving friendly units as blockers. 2012-07-05 23:52:34 -05:00
Chris Forbes
3d8e215598 Merge pull request #2296 from ScottNZ/bleed
Allies 01 fixes
2012-07-05 20:06:44 -07:00
James Dunne
ce806fdbe6 Prevent too many instances of a single sound starting at once in an absolute location and attenuate volume of new sounds based on number active sounds already playing. 2012-07-06 14:41:24 +12:00
Matthias Mailänder
208a3a47fe don't crash when sound rules are not loaded
e.g. when trying to get the gamefiles
2012-07-06 14:37:24 +12:00
Matthias Mailänder
f0708ecfb2 cut out the black tile 2012-07-06 14:37:17 +12:00
Matthias Mailänder
653d72086c A10 crash site to terrain
it is not transparent and will look wrong in desert/winter
2012-07-06 14:37:14 +12:00
Matthias Mailänder
9258ba3ec7 new spice shp with 20 densities
hopefully nicer looking spices tiles
and less insane growth rate
avoided edge tiles because of #2247
2012-07-06 14:36:56 +12:00
Matthias Mailänder
d851c5646e a10cr dimensions fixed 2012-07-06 14:36:52 +12:00
Matthias Mailänder
ac0d3779f1 added @Nyerguds awesome cnc A10 crash site
ripped from a Westwood beta screenshot
2012-07-06 14:36:49 +12:00
Matthias Mailänder
9a0d62dc85 removed pyle again (no changes) 2012-07-06 14:36:44 +12:00
James Dunne
59e1703b41 Added mouse-wheel support for flipping tabs in build palette. 2012-07-06 14:32:26 +12:00
James Dunne
e49a439c79 You win chrisf =P 2012-07-03 19:05:46 -05:00
James Dunne
b2e9085371 More detailed exception reporting on crash. 2012-07-03 15:37:37 -05:00
Matthias Mailänder
8cea309ec6 more SHP fixes by Nyerguds
- The SSM Launcher (mlrs.shp) was updated because the very last
  turret frame without missiles had messed up house colours
- buildings that showed remap color instead of real yellow:
* Civilian Oil Derrick (Made correct remap for v19.shp)
* Advanced Communications Center (shadow under the big dish
  turned to remap, in both eye.shp and eyemake.shp)
* Tiberium Silo (random remap pixels in the collapse frame
  of silo.shp, and the entire lower right edge on silomake.shp)
* Barracks (remap pixels showing up in the
  normally gray buildup on pylemake.shp)
2012-07-03 09:21:54 +12:00
Matthias Mailänder
a59dfa555c map clear radar color for interior to black 2012-07-03 09:21:54 +12:00
Matthias Mailänder
e22126ca02 added ice floes to ra 2012-07-03 09:21:54 +12:00
Matthias Mailänder
867f112dfe base cnc snow on temperat to remove snowy greenland tiles 2012-07-03 09:21:54 +12:00
Matthias Mailänder
24e6e23000 fixed building dimensions as d2k now has bibs 2012-07-03 09:21:54 +12:00
Matthias Mailänder
498adc86a9 add bibs for d2k
copy & paste with gimp and OpenRA.Utility
2012-07-03 09:21:54 +12:00
Matthias Mailänder
a20d1c95c8 noticable SHP fixes from C&C 1.06c rev3
including a snow theatre now fixed with few backfalls to winter
hand of nod with logo (like in the beta)
fence fixes (one frame did not fit to the rest)
factory retains the shadow of the make animation
nicer ion cannon icon from a westwood render
2012-07-03 09:21:54 +12:00
ScottNZ
4a101cf1b1 Convert line endings 2012-07-02 16:19:57 +12:00
ScottNZ
583b11a2b2 Remove bad/duplicate UnloadCargo line 2012-07-02 14:03:26 +12:00
ScottNZ
b3c5137add Merge 2012-07-02 13:46:28 +12:00
Chris Forbes
3dc39b2c9d fixed #2167 -- silly inconsistency between InfDeath and dieN sequence numbering 2012-07-02 09:42:20 +12:00
ScottNZ
5897a44fc5 Remove unneeded barrel YAML overrides 2012-07-02 04:22:23 +12:00
ScottNZ
8b0f15f80b Bring Soviet patrol back a bit 2012-07-02 04:21:10 +12:00
ScottNZ
1262cf0f29 Bit of cleanup 2012-07-02 03:54:55 +12:00
ScottNZ
b74e63f42d Drain Soviet resources so the ore truck doesn't stay at the refinery 2012-07-01 20:30:25 +12:00
Matthias Mailänder
e89ee2c131 new AttackLoyalty, range and stay alive option for Capture
AttackLoyalty for d2k Deviator which captures units
also shooting a fake missile (see issue #2251)

CaptureActor now supports Generals styles gameplay
but is disabled by default (see issue #2274)
fixes the annoyance that engineers will not take
the shortest root to the building by the way

removing ProvidesCustomPrerequisite because it's
tooltip messages relies on hardcoded hacks
2012-07-01 20:26:25 +12:00
Chris Forbes
c2321e3eea fixed #2284 - crash in upnp when device found but it doesnt want to talk upnp 2012-07-01 20:14:14 +12:00
Matthias Mailänder
22a49ba7c6 added HarvesterAttackNotifier.cs to .csproj
Conflicts:
	mods/d2k/rules/system.yaml
2012-07-01 20:00:57 +12:00
Chris Forbes
4d614e9122 include d2k mod in official packages 2012-07-01 20:00:12 +12:00
Chris Forbes
e0069fd62a make UnloadCargo.unloadAll configurable; go back to all by default 2012-07-01 19:45:31 +12:00
Matthias Mailänder
c75c72b525 made palette shadowindex configurable 2012-07-01 19:37:57 +12:00
Chris Forbes
007b2c5434 make click-without-drag feel better in editor 2012-07-01 18:37:46 +12:00
Chris Forbes
b8a932a084 try to make selection feel better 2012-07-01 18:31:46 +12:00
Curtis Shmyr
61c3932340 Selection tool / copy paste for editor 2012-07-01 18:23:46 +12:00
Chris Forbes
c2029e9d5c fixed #2166 - filtering of passengers to show with RenderCargo 2012-07-01 18:22:19 +12:00
Chris Forbes
d0548d6766 Drop EvaAlerts from OpenRA.Game.csproj 2012-07-01 18:10:17 +12:00
Chris Forbes
5a40c5df03 tidy health transfer 2012-07-01 18:08:10 +12:00
Matthias Mailänder
f5ba36a735 Unload only 1 cargo per mouseclick, for more control 2012-07-01 18:07:33 +12:00
Matthias Mailänder
efe2f2e043 UnloadCargo rallypoint fixes #2016 2012-07-01 18:07:05 +12:00
Matthias Mailänder
6681382819 unclock factory exits 2012-07-01 14:53:45 +12:00
Matthias Mailänder
7a578a0679 notifications (formerly EVAalerts) centralized and race specific
outsourced into notifications.yaml
triggered with PlayNotification(...)

(v2: less redundant code for PlayVoice/Notifications)

added harvester under attack and battlecontrol terminated
2012-07-01 14:39:30 +12:00
Chris Forbes
5fee165692 fixed #2289 - missing chrono effects on return 2012-07-01 14:24:49 +12:00
Chris Forbes
0a4669b925 Add SimpleTeleport for non-chrono jumps (used in scripts etc) 2012-07-01 14:05:21 +12:00
Chris Forbes
109546d20f fixed #2286 - chrono kills passengers on return too 2012-07-01 13:31:04 +12:00
James Dunne
f5c606266d Fixed shift-tab keyboard shortcut in build palette. 2012-07-01 13:08:00 +12:00
ScottNZ
facf958bae Move towards extraction LZ if einstein isn't in the world. 2012-07-01 13:02:23 +12:00
Matthias Mailänder
480db8be42 non-capturable hospital with heal-zone
will heal engineer, capturing it is useless;
heal-zone makes less sense, but it looks nicer
(otherwise infantry drawn on top of the building)
2012-07-01 13:02:23 +12:00
James Dunne
7c4e32bd94 Applied ToDictionaryWithConflictLog to MixFile reader. 2012-07-01 13:01:54 +12:00
James Dunne
854a9c4eb7 Added new ToDictionaryWithConflictLog to help diagnose ToDictionary bombs. 2012-07-01 13:01:24 +12:00
ScottNZ
cbb0b17c31 Add AutoTargetIgnore for stek 2012-07-01 12:52:36 +12:00
Chris Forbes
f2ab8a8541 generalize rough cursor to be customizable for any terrain type 2012-07-01 12:49:14 +12:00
Matthias Mailänder
63d21eac8c arrakis tileset categorized for editor
thanks to CombineCnR
2012-07-01 12:41:29 +12:00
Matthias Mailänder
579ff04f68 fixes #2253
rough mouse-cursor for infantry-only areas
blue move cursor for d2k rally points
2012-07-01 12:41:23 +12:00
ScottNZ
18d75feb15 Adjust the patrol starting position 2012-07-01 12:14:12 +12:00
James Dunne
11da96fe22 Fix for #2277: Failing to load sounds/music should never crash. 2012-07-01 09:11:27 +12:00
Chris Forbes
9201b1cced fixed #2198 - crates are collected when landing on top of a unit 2012-07-01 09:04:49 +12:00
ScottNZ
e02397da3e Use Sound.PlayMusic for Hell March 2012-07-01 03:47:08 +12:00
ScottNZ
6014f648f4 Add e1, dog, e1 soviet patrol 2012-07-01 03:29:05 +12:00
ScottNZ
2c55a008f1 Reduced cruiser range from 32 to 25 to reduce risk of friendly fire. Increased barrel hitpoints. Removed jeep cargo ability as a workaround for Einstein being removed from the game world and Soviet forces not attacking. 2012-06-30 23:33:09 +12:00
ScottNZ
b9be918b6c Remove some code noise and improved the chinook cargo check 2012-06-30 23:27:14 +12:00
ScottNZ
781cbc00d3 Make Einstein run out of the building when he appears. 2012-06-30 20:27:39 +12:00
Chris Forbes
b9365a149f remove old crates list 2012-06-30 17:06:15 +12:00
James Dunne
1d4f1c657f Fix for crash after selling all refineries. 2012-06-30 16:37:50 +12:00
James Dunne
9a66d7b530 Harvesters will return to ordered-to location if told to harvest a specific cell while full after delivery instead of the last successfully harvested cell which may be far away. 2012-06-30 16:37:50 +12:00
Chris Forbes
3a87b934a6 fixed #2257 - reenable PrimaryBuilding support for afld/hpad 2012-06-30 16:10:13 +12:00
Chris Forbes
9845d0e035 fixed #2260 - spec chat should use contrast 2012-06-30 16:05:33 +12:00
James Dunne
3754e791e5 Fix for null ref exception after refinery is sold. 2012-06-29 22:55:45 -05:00
James Dunne
643154de15 Harvesters obey player when told to stop or move somewhere else. 2012-06-29 22:38:24 -05:00
ScottNZ
af8b29aee5 Map polishing: removed mpspawn. Removed unneeded YAML. 3tnk now starts facing north. Changed soldier next to barrels from e1 to e2. Adjusted the player colour to a lighter blue. Adjusted the chinook despawn location. e2 now always explode when they die to make the barrel chain reaction reliable. Reduced HP of barrels also. 2012-06-29 09:09:39 +12:00
ScottNZ
36c0ec753d Move viewport to where the player starts 2012-06-29 09:09:39 +12:00
Matthias Mailänder
9115fc4397 fixes #2157
Tooltip descriptions now showup in CnC.
2012-06-29 09:06:15 +12:00
Matthias Mailänder
0d59a4dcd7 fixes #2005
Don't save floats in settings.yaml using country-specific
decimal separators which can be misunderstood as
group seperators which will put values out-of-range.
2012-06-29 09:00:28 +12:00
Chris Forbes
e0c3c53c00 fix up music error 2012-06-29 09:00:28 +12:00
Generalcamo
11654cc893 More Strings Corrected.
Some tracks are missing, however I don't know the file name of those.
2012-06-29 08:45:45 +12:00
Generalcamo
bb85ea75e4 More Strings Corrected. I notice a few Counterstrike tracks are missing, they might be in the aftermath file though. Will check. 2012-06-29 08:45:44 +12:00
Generalcamo
2450576dbe Once Again, corrected strings. Also added a track 2012-06-29 08:45:44 +12:00
Generalcamo
dd81b6d872 Corrected Music Strings, added a voiced track
The music strings have been taken from Frank Klepacki's Website and the CD. In some cases, I have added parenthesis to show the names that many people give them
2012-06-29 08:45:44 +12:00
James Dunne
3160034d66 Now checking AcceptsSmudgeType for all cells to smudge and picking appropriate SmudgeLayer to render with. 2012-06-27 23:54:49 -05:00
James Dunne
d0d3813173 Water will not be smudged/scorched any more from nukes. All resources in range of nuke are destroyed now, not just the ones on the edge of the circle. 2012-06-27 22:56:48 -05:00
James Dunne
2ff4a76955 Fixed zombie aircraft flying around after being told to fall to earth. 2012-06-27 22:02:29 -05:00
Matthias Mailänder
9626ed356c fixed crash when mod not found, don't save broken settings
default mod is Red Alert
2012-06-28 13:10:41 +12:00
Matthias Mailänder
5ecf8d3b7f added real allyrepair, fixed flagfly shadow 2012-06-28 13:10:41 +12:00
Matthias Mailänder
8041b17032 fixed turret facing order, added rocket turret 2012-06-28 13:10:41 +12:00
Matthias Mailänder
b9cda8fcca relative altitude for carryall cargo 2012-06-28 13:10:41 +12:00
Matthias Mailänder
ed6a625c69 nonstandard build time value for a cnc classic mod fixes #2164
remove the testcase in structures.yaml if unwanted for cnc mod
2012-06-28 13:10:41 +12:00
Matthias Mailänder
d498ff1085 +RenderBuildingSeparateTurret 2012-06-28 13:10:40 +12:00
James Dunne
f8a0dd59b7 Fixed null reference bug. 2012-06-27 18:38:12 -05:00
James Dunne
8e602104af Harvesters - made search radius configurable for both initial search from proc and search from harvest location. 2012-06-27 18:00:42 -05:00
James Dunne
aac78773f4 Upgraded to VS2010 2012-06-26 20:39:56 -05:00
Matthias Mailänder
d3915ad291 string AcceptsSmudgeType replaces boolean AcceptSmudge
because Dune 2000 has different craters for rock and sand
2012-06-27 13:19:52 +12:00
Matthias Mailänder
b61e4a6083 don't mount unneeded RA game files
voices and tilesets already completely replaced
2012-06-27 13:19:52 +12:00
Matthias Mailänder
5318380bfa auto-restart the game after getting the game-files 2012-06-27 13:19:52 +12:00
Matthias Mailänder
a64629f1c5 remove ready/hold/group pip from BuildPaletteWidget
and render as text instead
2012-06-27 13:19:52 +12:00
Matthias Mailänder
5231da1ea3 READY/ON HOLD as DrawText instead of SHP 2012-06-27 13:13:55 +12:00
Chris Forbes
aa06751de5 categorize the rest of the temperat tileset 2012-06-26 20:12:01 +12:00
Chris Forbes
f10eb9e082 add category headers in editor 2012-06-26 19:58:04 +12:00
Chris Forbes
9966b4efd1 group tiles by category 2012-06-26 19:33:11 +12:00
Chris Forbes
0ec3e8b227 add Category to tileset entries 2012-06-26 19:33:02 +12:00
Chris Forbes
984a498ed2 Finish fixing #2136 2012-06-26 19:24:59 +12:00
Igor Popov
c122e6f54d indicate-admin: implementation (ra) 2012-06-26 18:58:31 +12:00
Chris Forbes
1924cc71f1 fix canceling of WaitFor 2012-06-26 11:48:15 +12:00
Chris Forbes
220473bf74 remove duplication in UOG 2012-06-26 11:31:13 +12:00
James Dunne
4373f577d8 Added ResourceClaimLayer trait to World for cnc and d2k. 2012-06-24 21:41:16 -05:00
James Dunne
2f773e49ef Fixed null ref exception while playing cnc. 2012-06-24 21:41:16 -05:00
James Dunne
03ec1f08cf Made ResourceClaimLayer trait optional on World actor to fix cnc and d2k. 2012-06-24 21:41:16 -05:00
James Dunne
a0f9f98b1c Removed unnecessary mobile local. 2012-06-24 21:00:25 -05:00
James Dunne
b59a0e8c0d Fixed harvesters for AI to search the entire map when no more resources nearby. 2012-06-24 20:26:01 -05:00
James Dunne
1fa70d259f Removed INudge in favor of INotifyBlockingMove. 2012-06-24 20:26:01 -05:00
James Dunne
1f0da42a15 Refineries now show which harvesters are linked by holding down ALT key. 2012-06-24 20:26:01 -05:00
James Dunne
845379e577 Harvesters no longer block each other during low-ore contention and wait for a random amount of time while idle to search for more resources. 2012-06-24 20:26:00 -05:00
James Dunne
80123b6aa4 Many harvester behavior improvements; summary below.
Implemented Harvester territory marking with a simple resource claim system in ResourceClaimLayer trait added to World.
Added customCost for PathSearch to support new Harvester search preferences.
Explicit delivery order forces harvester to always deliver to that refinery.
Explicit harvest order frees harvester from forced delivery refinery and allows for auto-balancing.
Harvesters auto-balance refinery choice such that no more than 3 harvesters are linked to any one refinery at a time.
Harvesters try very hard to not block the refinery dock location.
Harvesters try to avoid enemy territory when searching for resources.
Group-select harvest order intelligently disperses harvesters around the order location.
Fixed PathFinder caching to not be a sliding window. This is a correctness issue. Sliding window causes no-route paths to be cached permanently in tight move loops and doesn't allow eventual progress to be made. This may have negative performance implications.
2012-06-24 20:26:00 -05:00
Matthias Mailänder
1aafc9f726 fix utilty remap, remapped flag/poweroff to d2k.pal 2012-06-25 10:21:39 +12:00
Chris Forbes
8607575e2b Merge remote-tracking branch 'matt/patch-2' 2012-06-25 09:52:24 +12:00
Chris Forbes
162c386bdd Merge remote-tracking branch 'matt/bleed' 2012-06-25 09:40:22 +12:00
Chris Forbes
445e5ec84b fix #2215 - add shadow.shp based on RA but with proper size for d2k 2012-06-25 09:27:39 +12:00
Matthias Mailänder
54c35e3721 fixed some selection boxes 2012-06-25 09:07:44 +12:00
Chris Forbes
a2b92d0fe4 Merge commit 'matt/dune^'
Conflicts:
	.gitignore
	mods/d2k/rules/system.yaml
2012-06-25 09:05:49 +12:00
Chris Forbes
2ed12f1d95 Merge remote-tracking branch 'scott/bleed'
Conflicts:
	OpenRA.Mods.RA/Missions/Allies01Script.cs
2012-06-25 08:45:16 +12:00
James Dunne
fe5bcdeab9 Fix for PaletteFormat break in Editor. 2012-06-24 13:58:49 -05:00
ScottNZ
9c6bc45f8f Fix whitespace 2012-06-25 05:34:06 +12:00
ScottNZ
2cc749118f Make it more overwhelming at the fifth wave and each wave after that 2012-06-25 05:19:25 +12:00
ScottNZ
331388bfe8 Merge pull request #1 from Mailaender/patch-5
Added Prof. Einstein sequences and rules
2012-06-24 09:31:38 -07:00
Matthias Mailänder
079a52ee65 added Einstein 2012-06-24 19:27:05 +03:00
Matthias Mailänder
5b470650b7 added Einstein 2012-06-24 19:26:03 +03:00
Matthias Mailänder
380875ad3e added Einstein 2012-06-24 19:24:26 +03:00
Matthias Mailänder
79976a4bfe transpose infantry/ornithocopter 2012-06-24 15:48:11 +02:00
Matthias Mailänder
769b5d7dc6 fixed OpenRA.Utility --remap
now uses the mod parameter again
2012-06-24 12:32:52 +02:00
Matthias Mailänder
2a95c5f668 fix PlayerColorPalette in Editor 2012-06-24 11:56:52 +02:00
Chris Forbes
1bf649d27d Merge remote-tracking branch 'matt/bleed' 2012-06-24 21:34:37 +12:00
ScottNZ
bda92f3898 Only send the heavy tank on the last wave, this is the first mission after all 2012-06-24 21:28:46 +12:00
Matthias Mailänder
7220025a62 make orni flap slower 2012-06-24 11:21:50 +02:00
Matthias Mailänder
0b6eda0815 replaced RA sounds by Dune 2000 ones 2012-06-23 16:00:20 +02:00
Matthias Mailänder
e70e778775 make ornithocopter flap (broken)
needs frame resorting similiar to the infantry
2012-06-23 14:20:34 +02:00
ScottNZ
7fb659bd3a Make the mission a bit harder - add a heavy tank to each wave 2012-06-23 20:41:43 +12:00
Matthias Mailänder
b109436cc3 race specific BaseAttackNotifier 2012-06-22 18:21:29 +02:00
ScottNZ
6ba0c448c8 Remove killing of player when they fail the mission, this is more fun and it's also really loud when all the units die at once 2012-06-22 15:27:07 +12:00
ScottNZ
ed5ff9cd31 Bleep when objective shown 2012-06-22 13:39:36 +12:00
ScottNZ
1146790dc1 Reworked the left side of the map to make it useful, and moved one of the spawnpoints there. 2012-06-22 13:07:24 +12:00
James Dunne
cf1d4d0efb Fixed radar click position - was not respecting zoom setting for emulating the mouse coordinate. 2012-06-21 19:41:23 -05:00
James Dunne
b127ae8027 Added sub-pixel position/vector types.
Updated Sync code to handle new sub-pixel types.
2012-06-21 19:41:12 -05:00
James Dunne
9c49143534 New types for cell and pixel coordinate position/vectors. 2012-06-21 15:36:59 -05:00
Matthias Mailänder
6bc3249685 voices now support prefixes
required for d2k
2012-06-21 15:31:12 +02:00
ScottNZ
3ab197f400 Buff the Allies a bit - give them some riflemen. 2012-06-21 23:34:34 +12:00
ScottNZ
9ff69b7946 Add EVA voices
Use new WaitFor when waiting for Einstein
Have a small delay before the Soviets counterattack
Have the Soviets Attack-Move towards Einstein during the counterattack, this makes them much more damaging
Spawn the signal flare only after Einstein has been spawned, also add EVA voice for this
2012-06-21 22:53:20 +12:00
Chris Forbes
0b98a8ce5e Merge remote-tracking branch 'scott/bleed' 2012-06-21 11:54:54 +12:00
James Dunne
2e26047b23 Added myself to AUTHORS. 2012-06-20 18:20:26 -05:00
Chris Forbes
2cdd1f7376 fix #2126 - crash on spawning a corpse for an actor which has already been destroyed 2012-06-21 09:50:02 +12:00
Matthias Mailänder
033dd10192 git ignore some KDE crap 2012-06-20 23:46:53 +02:00
Matthias Mailänder
9f5a8512d2 race specific ProductionQueue audio 2012-06-20 23:40:08 +02:00
Chris Forbes
5c4e49cc3f fix #2196 - crash when cycling stances while a unit dies 2012-06-21 09:33:47 +12:00
James Dunne
8eb4782a49 Fixed socket code constantly throwing exceptions about non-blocking. 2012-06-21 09:29:02 +12:00
Chris Forbes
99eb3b046d fix #2239 - add WaitFor(predicate) 2012-06-21 09:26:05 +12:00
Matthias Mailänder
ac0389d04f race specific notifications/mcv-crate 2012-06-20 21:35:23 +02:00
Matthias Mailänder
6929ed024a added harvester unload, thumper which spawns sandworms
worm won't attack, dogjaw is stupid and moving mine did not work
2012-06-20 16:57:09 +02:00
Matthias Mailänder
f4cb798c8b small code optimisations as suggested 2012-06-20 09:51:00 +02:00
ScottNZ
8f6b8b75bc Remove redundant call to InternalName when mission failed 2012-06-20 18:17:13 +12:00
ScottNZ
cb3daab5fa Tabify lines 2012-06-20 17:48:03 +12:00
James Dunne
4d16ca238c Fixed broken Install from CD code in RA. 2012-06-20 09:47:19 +12:00
Matthias Mailänder
84d623397b made PaletteFormat configurable
as suggested in issue #2219
2012-06-19 21:36:10 +02:00
Matthias Mailänder
26b75f406f new settings Transparent for cursors.yaml 2012-06-19 07:43:06 +02:00
ScottNZ
b30e4ab432 Use SharedRandom to stop desync 2012-06-19 14:43:11 +12:00
ScottNZ
b0e10c9ada Don't need lzRange 2012-06-19 12:57:45 +12:00
Matthias Mailänder
c6a1031ab7 fix cnc palette issues
cursor not supporting transparency which is only needed for d2k
2012-06-18 17:44:03 +02:00
Matthias Mailänder
7cbed30dc6 fix cnc palette issues
cursor not supporting transparency; wrong icon, fx palette
2012-06-18 17:40:22 +02:00
Matthias Mailänder
ce0099f5d2 fix settings for d2k and cnc
no UPnP for CnC singleplayer skirmishes, use RA chromes at D2k
2012-06-18 17:07:56 +02:00
Matthias Mailänder
45a5e317c0 Merge remote-tracking branch 'openra/bleed' into bleed 2012-06-18 16:38:17 +02:00
ScottNZ
11ddd88d60 Remove more unneeded code, use CallFunc activity to make Tanya laugh when she disembarks. 2012-06-19 01:45:46 +12:00
ScottNZ
ce05b8dfec Use IsInMap & IsInWorld to detect whether Einstein has been saved 2012-06-19 01:27:42 +12:00
ScottNZ
f5d397030c Remove unneeded UnitsNearExtractionLZ code 2012-06-19 01:19:09 +12:00
ScottNZ
874799c2c3 Made Soviet attack waves a bit saner 2012-06-19 01:04:18 +12:00
ScottNZ
20af089fcd Added Allies 01 SP map and Allies01Script.cs 2012-06-18 22:13:24 +12:00
unknown
21ab0b461c Added straightforward hover behavior for all units. Give a unit a nonzero Altitude: in its Mobile: block and the WithShadow: trait to make it hover. 2012-06-18 20:53:38 +12:00
Chris Forbes
7af0e64708 allow --transpose to do multiple operations in one pass 2012-06-18 20:38:37 +12:00
Matthias Mailänder
527c6dc36b "repair" infantry at hospital 2012-06-18 03:30:53 +03:00
Matthias Mailänder
8831a93375 make the hospital become a repairunit (for infantry) 2012-06-18 03:29:17 +03:00
Matthias Mailänder
677efcbced add notifications 2012-06-18 02:18:01 +02:00
Chris Forbes
4f1a7ff5fb add --transpose option to utility 2012-06-18 11:22:24 +12:00
Matthias Mailänder
c9edf7d0dc added Renderer Dropdown in RA Settings 2012-06-18 09:30:52 +12:00
Chris Forbes
d64ecac74e Merge pull request #2223 from Mailaender/dune
Latest updates from the Dune 2000 mod
2012-06-16 22:30:00 -07:00
Matthias Mailänder
c804be6f01 fix passable edges in Cliff terrain tiles
made all special units equally expensive, found harvester unload
2012-06-16 21:19:46 +02:00
Matthias Mailänder
959875c709 added special infantry, fixed UI, added new map 2012-06-16 14:17:35 +02:00
Igor Popov
4d94cb5593 2 maps: Bomber John(minigame->new); Free Coasts(conquest->replace) 2012-06-16 14:46:32 +12:00
Matthias Mailänder
c1fb5dd5f5 added engineer, bazooka 2012-06-15 22:43:03 +02:00
Matthias Mailänder
db0e1eabc7 replace RA conyard with D2k carryall for colorpicker 2012-06-15 17:03:40 +02:00
Matthias Mailänder
801ff5cc17 make cursor always transparent, fix Arrakis tileset
transparency bugs some cnc cursors, slice BLOXBASE better
2012-06-15 11:06:59 +02:00
Chris Forbes
94f7f1c473 clean up game timeout 2012-06-15 15:14:56 +12:00
Chris Forbes
9862b8ccee remove sequence save junk 2012-06-15 15:06:52 +12:00
Matthias Mailänder
722c7a5f7d +resampled sounds, readded and completed Arrakis tileset
all tilesets combined into one without redundancy
2012-06-14 21:09:44 +02:00
Matthias Mailänder
72d038e04e fixes mouse cursor not being transparent 2012-06-11 23:28:42 +02:00
Matthias Mailänder
b83188d435 add the first Sounds
manually resampled to 16 bit 22050 Hz and converted to AUD
2012-06-11 21:19:40 +02:00
Matthias Mailänder
f9cbd1bbbf experimenting with auto-downloader, sandworm 2012-06-10 21:13:40 +02:00
Curtis Shmyr
4e88166673 Added two new RA maps by Tirili: Ice Woods & Nishnekolymsk 2012-06-10 12:56:24 -06:00
Chris Forbes
f3d68f4944 remove some junk ai profiles 2012-06-10 19:52:25 +12:00
Chris Forbes
3827a5436a #2191 fixed -- custom OGs canceled on win/lose 2012-06-10 17:17:38 +12:00
Igor Popov
4a7417347a fix #2199; Game Timer (min 10 seconds) 2012-06-10 17:08:49 +12:00
Matthias Mailänder
dc6b286d25 remove unneccessary dependencies, make SendTo less spammy 2012-06-10 16:46:19 +12:00
Matthias Mailänder
aa36a56b27 UPnP source code fixes
as suggested by Chris Forbes
2012-06-10 16:46:19 +12:00
Chris Forbes
a831e72fa2 Merge remote-tracking branch 'tuc/simplepause' 2012-06-10 16:35:41 +12:00
Matthias Mailänder
b96158adcb new AI with optimized build order
Eisenhower builds less refineries, more units and techs faster
2012-06-10 16:34:31 +12:00
Chris Forbes
5414875d00 update .gitignore; remove spurious mono file 2012-06-10 16:32:02 +12:00
Chris Forbes
fd4b10c6bd Merge remote-tracking branch 'matt/dune' 2012-06-10 16:27:19 +12:00
Matthias Mailänder
d110b45679 added install rules for d2k mod, fixes carryall landing 2012-06-09 22:46:13 +02:00
Matthias Mailänder
22e0828566 fixing BLOXBASE problems
t264 not found and BASE.tsx gets deleted too early
2012-06-09 20:57:22 +02:00
Matthias Mailänder
c3052d863a tsbuilder is required for mod_d2k
adding it to core
2012-06-09 20:39:06 +02:00
Matthias Mailänder
0b4455515d added utility reference to Makefile for d2k mod 2012-06-09 20:33:50 +02:00
Matthias Mailänder
4ed74c6cc0 adding in-game GUI gamefile extractor/converter
also fixing EOL for TilesetBuilder with monoDevelop
2012-06-09 19:53:59 +02:00
Matthias Mailänder
ebf64f67cf updated BLOXBAT terrain 2012-06-09 11:43:39 +02:00
Matthias Mailänder
b16849768d adding chrome/settings.yaml
was in gitignore
2012-06-08 21:07:20 +02:00
Matthias Mailänder
f140c6ec9c added TilesetBuilder command line, added Tileset extractor
removing all copyrighted raw tileset files
2012-06-08 19:31:10 +02:00
Matthias Mailänder
8f1d06ff31 added TilesetBuilder2 and fixed it for Dune 2000
does not support TerrainTypes other than "clear" yet
2012-06-07 19:22:45 +02:00
Igor Popov
3f0fafb380 Add banlist (Server.Ban settings item) support to game servers 2012-06-07 12:14:26 +12:00
Remco van der Zon
84124de79d Game can now be paused by pressing f3 as well. 2012-06-06 11:22:46 +02:00
Remco van der Zon
8ad4e08651 Unit order client != null check fixed (int != null -> always true!) .
Removed if-else branch in favour of sugar construct a?b:c.

Note: One should (at least) consider to move var client = ... to the
start of the switch construct. 4 branches of this switch are using this.
(DRY)
2012-06-06 10:54:21 +02:00
Remco van der Zon
8f981977e0 TimeWidget does not collide anymore with koth layout.
Screen resolution should be 1024x786+
2012-06-06 10:47:13 +02:00
Matthias Mailänder
676210422f added spice bloom
indestructable, seeds ressources like mine or blossom tree
2012-06-05 19:50:44 +02:00
Matthias Mailänder
749301899e added smudge
palette problems and engine does not care for terrain type
2012-06-05 18:14:17 +02:00
Chris Forbes
1bb1e00a0d fix #2195 - barrels should not be capturable or sellable 2012-06-05 19:41:30 +12:00
Matthias Mailänder
83ee6b758e fix CD rip logic a little
will still fail on setup.z
2012-06-02 21:17:42 +02:00
Matthias Mailänder
accaf027fe added (broken) content installer, moved instruction to GUI
still depends on the hacky bash script and CD extractor crashes
2012-06-02 17:46:31 +02:00
Matthias Mailänder
9b1e798b35 added spice as a ressource
still needs work though
2012-06-02 15:36:31 +02:00
Matthias Mailänder
cffaabb3bf added d2k mouse pointer, fixed aircrafts 2012-06-02 11:41:18 +02:00
Matthias Mailänder
5ab5bc9f7c removed need to define Harvester/BaseBuildingUnit manually 2012-05-28 23:36:46 +02:00
Matthias Mailänder
d9c4aada8a updated the README
so people can try this on their own
2012-05-28 20:29:15 +02:00
Matthias Mailänder
27fa99852b add D2k crates, started fixing infantry
infantry directions are correct, but movement is still wrong
2012-05-28 20:14:56 +02:00
Matthias Mailänder
ec7795fa99 added more Dune 2000 EVA voices
currently Atreides only
2012-05-28 14:00:43 +02:00
Matthias Mailänder
8e74df6155 fixing RALint.exe d2k and ordos missing defense buildings 2012-05-28 10:37:10 +02:00
Matthias Mailänder
4984d07960 made HackyAI more flexible for Dune 2000 mod 2012-05-28 10:36:17 +02:00
Matthias Mailänder
2a312911cb fixes repair pad
and update TODO
2012-05-27 18:28:52 +02:00
Matthias Mailänder
a20e30312e added Ordos 2012-05-27 15:17:03 +02:00
Matthias Mailänder
e0e1011d30 added Harkonnen 2012-05-27 12:45:35 +02:00
Matthias Mailänder
1fcf044980 added flags, worked on the UI
looks crappy, needs someone who is good at this
2012-05-27 10:40:08 +02:00
Matthias Mailänder
2287f1f662 inherit units that differ only slightly for each faction 2012-05-26 20:20:01 +02:00
Matthias Mailänder
ffbc76919e make Dune 2000 an independent mod
Arrakis tileset now loads properly
2012-05-26 18:13:51 +02:00
Matthias Mailänder
083952a531 added Dune 2000 music, voices 2012-05-26 13:06:02 +02:00
Curtis Shmyr
bd29d382c7 fix #2080 - added option to toggle shellmap in CNC 2012-05-26 18:40:55 +12:00
Curtis Shmyr
8df09da816 Spy - add voice when sending infiltrate order 2012-05-26 18:40:55 +12:00
Curtis Shmyr
4778ef803e Spy - don't reset exploration if team has GPS 2012-05-26 18:40:55 +12:00
Curtis Shmyr
37f91542a9 Change cargo ownership when capturing actors with cargo 2012-05-26 18:40:55 +12:00
Curtis Shmyr
e1907364e6 Fix #2086 - don't let player capture if that same player (or friendly ally) is already capturing 2012-05-26 18:40:55 +12:00
Matthias Mailänder
7f48a242db fixed refinery, factories
a little hacky though
2012-05-25 22:27:26 +02:00
Matthias Mailänder
4362a215d9 fixed wall, silo; add ornithocopter, sonic tank, infantry
orni does not flap, no sonic wave weapon, infantry frames broken
2012-05-25 17:46:58 +02:00
Matthias Mailänder
72b2e03dd0 added tech buildings, repair pad, startport, tanks 2012-05-24 16:26:38 +02:00
Matthias Mailänder
f7c1eb2933 +heavy factory, radar outpost, brick wall 2012-05-23 20:04:45 +02:00
psydev
5dd46b1b16 Give Mammoth 8-sec. cooldown for heal, like in RA. 2012-05-23 09:35:34 +12:00
Matthias Mailänder
68a731ed5e fixing MCV facings and flickering bug 2012-05-22 23:19:05 +02:00
Matthias Mailänder
4c667be946 fixed vehicles driving backwards
also fixed the bazooka for quad
2012-05-22 22:17:48 +02:00
Matthias Mailänder
66f82c6c2a added harvester, trike/quad now working, fixed mod inheritances
RenderCargo: works, moved R8Reader to Utility namespace
2012-05-22 21:02:25 +02:00
Chris Forbes
ff32864b47 #2160 fixed - RenderCargo support for relative altitude 2012-05-22 19:42:51 +12:00
Chris Forbes
e9656795a2 RenderCargo depends on IMove on the containing actor 2012-05-22 19:24:53 +12:00
Chris Forbes
3fbb81b4fc remove more spurious trait lookups in RenderCargo 2012-05-22 19:19:49 +12:00
Chris Forbes
442138e1f8 clean up spurious trait lookup in RenderCargo 2012-05-22 19:18:28 +12:00
Chris Forbes
2d39b1dfac #2089 fixed - Explodes filtering on InfDeath 2012-05-22 19:14:25 +12:00
Chris Forbes
3b704e25fa #2159 fixed -- missiles lose guidance and run out their remaining fuel if the target dies 2012-05-22 19:01:49 +12:00
Chris Forbes
c068be453a #2119 fixed - better error message for multiple definitions of the same yaml field 2012-05-22 18:17:03 +12:00
Chris Forbes
6f8f940f31 #2130 fixed -- #comments can be used at the end of any lines 2012-05-22 18:05:04 +12:00
Chris Forbes
c000640928 remove dead function from LobbyLogic 2012-05-22 17:42:19 +12:00
earthpig
059347af40 bots (once again) build pillboxes. 2012-05-22 17:20:23 +12:00
earthpig
f0001856bc To go along with introducing the 'cloaked hbox', ensure that the cloak is disabled if at low power. 2012-05-22 17:18:54 +12:00
earthpig
8c218b67ab Bring back hbox, with both the new garrison stuff and with stealth until firing. 2012-05-22 17:18:26 +12:00
Matthias Mailänder
5426a5fd3c put d2k mod stuff into it's own branch 2012-05-20 15:50:39 +02:00
psydev
d1241c438a Helicopters targetable when landed 2012-05-18 10:45:39 +12:00
Chris Forbes
bc7aa9a491 make Health.MaxHP not readonly; some people want to frob it at runtime 2012-05-17 10:04:06 +12:00
Remco van der Zon
ae94d7ecc7 Chat-text displayed when the game is paused and unpaused.
: The game is (un-)paused by <PLAYERNAME>
2012-05-16 19:11:46 +02:00
Remco van der Zon
7e1986ecbc Timer shows text "(paused)" when game is in pause. 2012-05-16 19:04:43 +02:00
Remco van der Zon
a07697be03 Pause the game option.
Game is paused when PAUSE on the keyboard has been hit. It can also be unpaused this way.
2012-05-16 17:35:10 +02:00
Remco van der Zon
b99e664726 A Game-tick can execute viewport.Tick itself,
removed this dependency from World.
2012-05-10 19:54:57 +02:00
psydev
881b4ba277 cnc - changed various unit speeds; gave increased sight to MCV and MSAM. 2012-05-07 07:42:48 +12:00
psydev
3058bfbc17 cnc - updated several building hitpoints 2012-05-07 07:42:48 +12:00
Remco van der Zon
8a08365666 Fixed bug in cash ticks, normal settings.
No sound was heared when repairing buildings or on low power.
Fixed.
2012-05-07 07:42:48 +12:00
Remco van der Zon
6c96a106e7 Red Alert CashTicks
Three options for cash ticks:
Extreme: current behavoir (every cash countdown tick is heard)
Normal: RedAlert countdown style (only one cash countdown tick every ~1 or 2 seconds)
Disabled: No cash tickdown or tickup is heard.

Thanks to Tirili for hints on the settings system.
2012-05-06 20:03:09 +12:00
psydev
6291c8396b cnc - add new explosion: chemball 2012-05-06 19:59:53 +12:00
psydev
79afa07118 cnc - made helicopter selection bounds a bit smaller 2012-05-06 19:58:13 +12:00
Chris Forbes
0e43043a33 cnc: fix crash loading yaml for ArtilleryShell.ContrailLength 2012-05-06 11:27:03 +12:00
psydev
c06fc02915 Changed production menu hotkeys from YUIOP to QWERT (what they are in C&C3). It's more ergonomic and close to the other command keys like A, S, Z, F. It is hard to use the YUIOP keys, because they're too far, even though they are very efficient.
The QWERT setup is a good way to run a menu. I think should reserve them for that and use other keys for unit commands.
2012-05-04 17:11:09 +12:00
psydev
8badbb3d60 Re-ordering the build menu a bit. Seems like guard tower should go before gun turret since it's more basic, cheaper and more often used. 2012-05-04 16:54:45 +12:00
psydev
57283b4a80 Increase range, cost and a modified damage on the MRLS (up vs. light armor, down vs. wood; 2 more bursts). Inaccuracy doubled from 30 to 60. Also increased MinRange from 2 to 4, and added burst delay while increasing rate of fire slightly (burst delay will add 24 to the rate of fire value, making it 70). Justification for these changes is to help fight against recon bike spam and stealth tank spam.
Increase APC gun damage from 6 to 12 (is currently pathetic against helis)

misc:
Made Artillery shell explosion appear bigger
Added contrail to Artillery shell
2012-05-04 16:54:36 +12:00
earthpig
d9992eea6a cnc - Increase rocket launcher cost from 800 to 1200 to reflect changes in range. 2012-05-04 16:51:52 +12:00
earthpig
c8c4507acf Few things with Zhukov AI. 2012-05-01 14:51:21 -07:00
psydev
5a37c84a8b improve chem warrior, flamethrower, grenadier and napalm drop 2012-05-02 09:10:53 +12:00
Chris Forbes
63898820f1 ra: drop mjolnir-1 map 2012-05-02 09:08:28 +12:00
psydev
63359e156c Increasing speed of flamethrowers and grenadiers 2012-05-02 09:01:26 +12:00
psydev
d683d69f3c Increase A-10 speed from 25 to 40 2012-05-02 09:01:05 +12:00
Chris Forbes
609d5bd611 ra: fix Flame Turret -> Flame Tower in unit name 2012-05-02 08:32:43 +12:00
psydev
0b894d3b31 Make silo first item in support/defense queue. 2012-05-02 08:30:38 +12:00
psydev
3a838a05cd Remove bib from HPAD 2012-05-02 08:29:06 +12:00
psydev
0a0b136b80 See ground beneath A-10 airstrike's flightpath 2012-05-02 08:27:26 +12:00
psydev
82549c6407 Increase Chinook capacity to 10 2012-05-02 08:26:27 +12:00
Chris Forbes
d737930bb0 #2076 fixed - missing widget id for WICW 2012-05-01 19:59:48 +12:00
Curtis Shmyr
dad67713fb Fix recent break in SupportPowerManager 2012-04-30 16:35:56 -06:00
psydev
a1082152a4 Urgent! Include in this release (fixes non-targeting of defensive towers/turrets). I made units no longer target ordinary buildings, but forgot to re-include targeting of the structures that shoot at you. 2012-05-01 07:26:06 +12:00
psydev
9f729b0c45 Made Chem Warriors walk through tiberium instead of around it and reduced their penalty for running through it to what would normally be "rough" terrain (80% instead of 70%).
Gave Commando Red Pip while passenger in APC/helicopter (can we get a more distinct color for engineer? Bright yellow or orange that contrasts from regular green, and/or pale blue).
Increased Commando shroud reveal to 6, since that will equal what 5 ought to be (infantry and vehicles have differences in sight range even when they have the same value, it seems http://i.imgur.com/Z6nWG.jpg)
2012-04-30 22:15:21 +12:00
psydev
ee7d8659d5 Removed bib from repair bay, to make it like the one from Red Alert.
Increased sight range of Construction Yard to 10.
2012-04-30 22:14:23 +12:00
psydev
4448c3e51b cnc: various balance changes, part 2
Infantry sight range +1 -- it seems that they have lower sight range than vehicles for some reason. See http://i.imgur.com/Z6nWG.jpg for infantry and vehicle, both with RevealsShroud: 5, but vehicle sees further. So, effectively 5 for infantry becomes 4, which seems reasonable.
Reduced probability of SpawnViceroid from 10% to 2%. 2% will still happen often enough if Chem Warriors are used predominantly, but with 10%, units were constantly turning to Viceroids, which was a pain. You could also send 10 infantry to opponent's tib field in early game and spawn a viceroid and kill their harvester or harass them.
Turned off units auto-targeting regular buildings, because often will attack silo over an obelisk or enemy unit. Auto-target should remain on for defensive towers/turrets, though.
2012-04-30 22:07:48 +12:00
psydev
174e925e5a cnc: various balance changes
As usual I'm trying to be conservative and only apply what I feel is suitable / minimally necessary.
Weapons:
Biggest change: Increased artillery range from 6 to 12, added contrail to bullet and changed impact sound to default C&C. Minimum range 2 given.
Napalm is currently very ineffective; increased spread to 20 range to make more likely to kill targets, ROF slightly increased
MRLS rocket ranged increased from 8 to 12, with minimum range 2.
Guard tower range increased from 4 to 5 (Pillbox is 6, for comparison) and damage increased from 20 to 40.
Grenadier death explosion reduced in damage from 25-10 and in blast radius.
2012-04-30 22:07:32 +12:00
earthpig
e7a8cdf951 Normal AI: Gone.
Zhukov AI: Bit of a turtle, but sends large attacks with arty/v2.
Rommel AI: Modified Hard AI.
2012-04-30 21:51:46 +12:00
Curtis Shmyr
45f5c054d5 Fix #2070; cannot sell when building is being captured 2012-04-30 21:37:09 +12:00
psydev
15dcd6a9f6 Harvester armor heavy 2012-04-30 21:35:35 +12:00
Chris Forbes
9c86196b16 fix crash in ChooseBuildTabOnSelect in replay 2012-04-30 21:32:57 +12:00
Curtis Shmyr
9185dc65d5 Initial pbox pax changes 2012-04-30 21:18:10 +12:00
Chris Forbes
e0bfa287ee new flamer integrated 2012-04-30 21:13:15 +12:00
Chris Forbes
80f142c8ea flamer that doesnt suck 2012-04-30 20:51:10 +12:00
Chris Forbes
7050fbc6e1 add napalm1 SHP and wiring in ra/sequences 2012-04-30 20:38:42 +12:00
Chris Forbes
2c938bc305 add sniper SHP 2012-04-30 20:33:36 +12:00
Chris Forbes
cd6bfb1b9a add better flame projectile SHP 2012-04-30 20:33:21 +12:00
Chris Forbes
11b253e4c3 add gate SHPs 2012-04-30 20:33:03 +12:00
earthpig
d625e2624a Fixed #2010 - arty in line now only has only 75% chance of exploding
When an arty in a group of them dies, each individual arty only has a 75% chance of perpetuating the genocide of arty.... so usually, it'll stop before killing your whole line but not before seriously hurting it.
2012-04-29 19:20:46 +12:00
earthpig
a544bc966b #2048 fixed: make AI behavior more varied 2012-04-29 19:15:55 +12:00
psydev
9a3aae6586 cnc: change AI to not be totally useless 2012-04-29 10:56:47 +12:00
psydev
390e607e66 cnc: remove nuke crate 2012-04-29 10:55:46 +12:00
psydev
22b18f99db cnc: remove hide-map crate 2012-04-29 10:54:51 +12:00
Chris Forbes
c30d46c014 #2051 fixed -- Widget.Get() throws by default 2012-04-27 19:39:07 +12:00
Chris Forbes
5d1a071287 fix crash in colorpicker 2012-04-26 21:42:07 +12:00
Chris Forbes
16e00c1f12 shimmering cloak in cnc 2012-04-25 22:24:38 +12:00
Chris Forbes
87271a0a56 make cloak palette configurable 2012-04-25 21:45:38 +12:00
Chris Forbes
dadc496c19 beef up OpenRA.FileFormats.Set a little; use it in CncMenuPaletteEffect rather than making new List<string> every frame 2012-04-25 21:43:00 +12:00
Chris Forbes
a0940e7ae5 unify water palette rotation 2012-04-25 21:32:33 +12:00
Chris Forbes
ca1fbb187b misc whitespace tidyups 2012-04-25 21:31:27 +12:00
Chris Forbes
89025a3042 make attackmove on spawn work properly for things that cant attackmove 2012-04-25 21:11:31 +12:00
earthpig
49f3f740e3 New units now AttackMove to their designated rally point. 2012-04-25 20:52:51 +12:00
Chris Forbes
4b4bbdf626 fix recent breakage in support powers 2012-04-25 01:58:37 +12:00
Chris Forbes
cebf908bb2 Fixed #2041 -- Force attack always targeted ground
Revert "Force attacks always go through, regardless of what is beneath them."

This reverts commit b2c72d6990.
2012-04-25 00:22:07 +12:00
Chris Forbes
75c105cb85 fix right edge of cheats close button 2012-04-25 00:06:48 +12:00
Chris Forbes
6669a66292 #2028 fixed - observer and dead map in cnc works again 2012-04-24 20:29:46 +12:00
Chris Forbes
6e3aa46008 #2039 fixed - add Sound.Engine config item, default is "AL" for OpenAL sound engine; "Null" gives you no sound 2012-04-24 20:23:41 +12:00
Chris Forbes
84a50e8e86 unify cheats panels 2012-04-24 20:04:21 +12:00
Chris Forbes
6559d8d8bc fix cnc direct connect panel 2012-04-24 19:47:04 +12:00
Chris Forbes
926686beff fix cnc cheats panel 2012-04-24 19:44:06 +12:00
Chris Forbes
6ab171af8b #2027 fixed - allow custom starting units for each faction 2012-04-24 19:29:53 +12:00
Chris Forbes
c4916bd997 #2038 fixed - add shadow to crates on the ground 2012-04-24 19:17:41 +12:00
Chris Forbes
f86332fd99 change pillbox hotkey to p 2012-04-20 14:41:45 +12:00
Chris Forbes
8d843cd8ad dropped map No Fly Zone 2012-04-19 11:04:51 +12:00
Chris Forbes
0904ac3a70 remove spurious trait lookup 2012-04-13 13:32:59 +12:00
Chris Forbes
8488223eee fix misspelling of Received 2012-04-13 13:28:31 +12:00
Chris Forbes
da3ba159db make failure of a lintpass nonfatal 2012-04-13 12:47:42 +12:00
Chris Forbes
3e0f52db1a fix cnc chrome yaml issues 2012-04-09 13:10:40 +12:00
Chris Forbes
062c49dac3 fix bogus widget id setup for resolution picker 2012-04-09 13:10:40 +12:00
Chris Forbes
533f9044cc strip redundant Id: elements from chrome yaml 2012-04-09 13:10:40 +12:00
Chris Forbes
b9eb3a0ad0 Patch widget loader to convert @key into Id member of widgets 2012-04-09 13:10:40 +12:00
Chris Forbes
dbd09ea843 Add building infiltrated sound to owner of spy on infiltrate 2012-04-09 10:33:39 +12:00
Chris Forbes
a4e1915aff warn the lobby when a client joins with DEV_VERSION 2012-04-09 09:40:22 +12:00
Chris Forbes
9d2833fc2b fix spelling error in comment 2012-04-09 09:39:57 +12:00
Chris Forbes
ab4c21f80c fix crash in server in StartGame if there are unvalidated connections 2012-04-09 09:18:54 +12:00
Chris Forbes
f7fea5ffce fix spelling error in Crate* comments 2012-04-07 11:06:26 +12:00
Chris Forbes
87e9a69ae0 fixed #2001: passengers shooting while in transports 2012-04-07 11:05:59 +12:00
Chris Forbes
25fb2a7be3 tidy 2012-04-07 10:29:25 +12:00
Chris Forbes
10c1b996ed tidy up disabled handling 2012-04-06 19:34:43 +12:00
Nukem
aa21ddaa4d Added new RA map: Tainted Peak 2012-04-06 18:36:50 +12:00
Chris Forbes
eab0e7ddf9 add range circle for gap generator 2012-04-06 18:35:04 +12:00
Curtis Shmyr
891cba456b give Gap Generator to allies 2012-04-06 18:23:30 +12:00
Chris Forbes
beb6b01796 show cashticks for DonateSupplies in spec 2012-04-06 18:14:58 +12:00
Chris Forbes
a52af4843e add cashtick for InfiltrateForCash 2012-04-06 18:14:11 +12:00
Chris Forbes
8dec48fee3 add spy reward for infiltrating refinery 2012-04-06 18:07:39 +12:00
Chris Forbes
b081103866 add infiltrate for exploration(reset) ability 2012-04-06 17:47:17 +12:00
Chris Forbes
4a76e2ad33 slight tidy in InfiltrateForSupportPower 2012-04-06 17:36:39 +12:00
Chris Forbes
b39eeddb45 adjust priority of Spy actions to prefer disguise/infiltrate when they match 2012-04-06 16:37:12 +12:00
Chris Forbes
7d4186c236 add SilencedPPK weapon for spy 2012-04-06 16:27:04 +12:00
Chris Forbes
01a724d632 only allow SpyInfiltrate/Disguise orders on Spy when not doing ForceAttack 2012-04-06 16:13:33 +12:00
Chris Forbes
ca1549df2a allow forceattack to be allowed/banned on UnitOrderTargeter 2012-04-06 16:05:35 +12:00
hasufell
0ae8e41612 add music themes which are available on cd-content 2012-04-06 14:47:04 +12:00
Curtis Shmyr
bc8c433a72 Modified Capturable to have a capture time; fixes #2002 2012-04-06 14:47:04 +12:00
Chris Forbes
7187b14459 drop Daejeon map 2012-04-03 16:21:19 +12:00
Chris Forbes
07d25d97ab fix missing escape keybinds in ra 2012-04-03 09:54:40 +12:00
Chris Forbes
4d5f89909e tanya is only available to allies 2012-04-03 09:54:29 +12:00
Chris Forbes
60fa61840d Spy drops disguise on attacking 2012-04-02 13:28:58 +12:00
Curtis Shmyr
499234e5dd Fixed #1321; no main menu after lobby disconnect/failed retry 2012-04-02 10:13:17 +12:00
hasufell
1010276cd5 make paths modifiable, fix broken install-rules, fix INSTALL 2012-04-02 09:21:51 +12:00
Curtis Shmyr
fdef80c53a Modify Cargo trait to support initial passengers 2012-03-23 15:16:48 +13:00
Kenny Hoxworth
22d3709967 Allow the targeting of water tiles by default. This still doesn't allow targeting of underwater, which is they way it should be. Now ground based units will be allowed to force-attack water tiles. 2012-03-23 10:07:11 +13:00
Kenny Hoxworth
b2c72d6990 Force attacks always go through, regardless of what is beneath them. 2012-03-23 10:06:59 +13:00
Chris Forbes
6f688275c5 include source location when complaining about bad miniyaml indents 2012-03-16 18:43:41 +13:00
Chris Forbes
5b8334b26d drop ILogicWithInit, no longer used 2012-03-16 18:43:41 +13:00
Chris Forbes
23ea8493ba fix crash in cnc replay viewing with radar 2012-03-16 18:43:40 +13:00
Chris Forbes
cc9dbd43c3 fix permissions on apc turrets 2012-03-13 09:11:35 +13:00
Chris Forbes
8308f82926 use the correct user for deployment 2012-03-04 13:08:50 +13:00
Chris Forbes
11f322a758 Fix smoke being triggered by healing as well as damage 2012-03-04 12:54:35 +13:00
Chris Forbes
6376615781 make 4tnk use damage cooldown for heal 2012-03-04 12:44:44 +13:00
Chris Forbes
f4b302e01a add support for damage cooldown on SelfHealing 2012-03-04 12:39:46 +13:00
Chris Forbes
703d6648d7 fix C2 ProximityCaptor sillyness 2012-03-04 12:31:02 +13:00
Curtis Shmyr
f19807f0ca Changed TTNK cost to 1500, hit points to 150 2012-03-03 16:18:11 -07:00
Curtis Shmyr
a523510922 Changed E4 (flamethrower) build prerequisite to FTUR 2012-03-03 16:12:13 -07:00
Chris Forbes
47194fab71 Add defend stance support for turreted units 2012-03-04 11:42:21 +13:00
Chris Forbes
75e32c0573 don't fetch IFacing unless we actually need it, in Attack 2012-03-04 11:17:46 +13:00
Chris Forbes
38b5a8d4f8 Fix #1327 - div/0 in Drag with extreme movement speeds 2012-03-03 18:17:21 +13:00
wuschel
522c88dcda Added map by wuschel: Ares National Park 2012-03-03 18:07:47 +13:00
Curtis Shmyr
3375a5de51 Oil derricks are not required to be destroyed when eliminating a player 2012-03-03 18:07:29 +13:00
Chris Forbes
68933880b9 Fix #1349 - Add configurable threshold for RepairableNear, default is 4 cells. 2012-03-03 18:05:31 +13:00
Chris Forbes
469a393585 give RepairableNear access to its info 2012-03-03 18:01:50 +13:00
Chris Forbes
be1fdbdd56 Fix #1348 -- Tesla Coils now support Stop (S) order 2012-03-03 17:44:41 +13:00
Curtis Shmyr
2972728b5e Ctrl-Shift-numkey performs unit grouping into existing groups 2012-02-19 08:47:43 +13:00
Sam Hegarty
78ba76250d Remove dependency on mesa-dri-drivers-experimental for the rpm package
- this package is no longer available in recent releases of Fedora
      and shouldn't be REQUIRED anymore.
2012-02-17 19:58:18 +13:00
Curtis Shmyr
603014b163 Added 3 maps by wuschel: Poseidon, Ares and Apollo 2012-02-13 09:11:54 +13:00
Nukem
6b85518b74 Added new map by Nukem: Breaking Point 2012-02-13 09:11:54 +13:00
Blarget2
d3578273db Added new map by Blarget2: Temperal 2012-02-13 09:11:54 +13:00
Curtis Shmyr
54f3c76da8 Removed random sbag in Mjolnir-2 2012-02-13 09:11:54 +13:00
Curtis Shmyr
95b908b234 Fixed bug where bots weren't given proper client index 2012-02-13 09:11:54 +13:00
Curtis Shmyr
3b94728869 Reduced amount of mines MNLY.AT carries from 5 to 3 2012-02-13 09:11:32 +13:00
Curtis Shmyr
b8b9d34404 Aircraft can use friendly service depots/airfields/helipads 2012-02-13 09:11:32 +13:00
Chris Forbes
a5cfc20e0b dont reinvent base64 decoding 2012-02-13 09:10:01 +13:00
Chris Forbes
3cf09e656f Add support for negative prerequisites (#1323) 2012-02-13 09:10:01 +13:00
Chris Forbes
1f8859f26b remove useless TUtil type alias from IronCurtainPower 2012-02-13 09:10:01 +13:00
Chris Forbes
6555bc9dbc use curl instead of wget 2012-02-13 09:10:01 +13:00
Chris Forbes
49fb0228fa fix upload script to use scp rather than ftp; ftp no longer available on the webserver 2012-02-13 09:10:00 +13:00
Nikita Tsukanov
ad29926391 Removed Connection.PlayerIndex == 0 checks if favor of Session.Player.IsAdmin 2012-01-09 15:37:55 +04:00
Chris Forbes
85293a482e remove spurious allowMovement parameter from ScanAndAttack 2012-01-07 20:33:56 +13:00
Chris Forbes
6315864f84 add Defend unit stance 2012-01-07 20:33:56 +13:00
Chris Forbes
c169bc3c51 fix #1320 bogus use of Game.CosmeticRandom from server thread 2012-01-07 20:33:56 +13:00
Chris Forbes
1de3db0903 Don't take a NRE in GiveUnitCrateAction.GetSuitableCells if not Mobile 2012-01-07 20:33:56 +13:00
Chris Forbes
965fe88755 #1284 fixed; don't show spawnpoints on serverbrowser thumbnails 2011-12-31 11:32:59 +13:00
Chris Forbes
809b716d0d tidy silly Enum.GetValues type nonsense 2011-12-31 11:02:38 +13:00
Chris Forbes
004c59d273 sort the serverlist by whether we can join the game 2011-12-31 10:58:31 +13:00
Chris Forbes
c34b254fd8 stop repairing a building if we don't like its owner (fixes interaction with capture) 2011-12-31 10:50:18 +13:00
Chris Forbes
0d25b6b5c9 use spacebar to go to last attack event 2011-12-31 10:48:30 +13:00
Chris Forbes
85eeb8b819 tidy 2011-12-28 08:16:51 +13:00
Chris Forbes
e84d90fc3a more general tidying 2011-12-28 08:13:36 +13:00
Chris Forbes
418b8d40f9 improve TraitDictionary error messages 2011-12-28 08:02:09 +13:00
Chris Forbes
9581595a3d remove spurious null checks in Shroud -- all actors have an owner, always. 2011-12-27 21:53:31 +13:00
Chris Forbes
0aa7ba6bd4 remove sillyness in DelayedAction.CompareTo 2011-12-27 21:48:42 +13:00
Chris Forbes
2793d1076a clean up inconsistency in InvisibleToEnemy 2011-12-27 21:23:25 +13:00
Chris Forbes
d57dfd1997 tidy 2011-12-27 21:23:25 +13:00
Chris Forbes
f8122047b6 ShpLoader is no longer IEnumerable 2011-12-27 18:10:52 +13:00
Chris Forbes
d115c6305c general tidying in ShpReader 2011-12-27 18:02:32 +13:00
Chris Forbes
f63cdf37d7 tidy usings in Graphics.Util 2011-12-27 14:53:18 +13:00
Chris Forbes
dd88a1269a move MakeArray to FileFormats.Exts 2011-12-27 14:52:11 +13:00
Chris Forbes
523183431b remove some duplication and dead code 2011-12-27 14:48:10 +13:00
Chris Forbes
132c678594 add --remap cmdlet to OpenRA Utility, remaps between ra/cnc/etc palettes. 2011-12-27 11:48:22 +13:00
Chris Forbes
f8127ab9df don't start writing replays until gamestart 2011-12-24 21:07:53 +13:00
Chris Forbes
d61055af8f work toward deferrable start of replay saving 2011-12-24 20:39:33 +13:00
Chris Forbes
4e6ff7616c tidy in FileSystem 2011-12-24 19:41:45 +13:00
Chris Forbes
f2dd5eb0a3 simplify UOG 2011-12-24 12:19:59 +13:00
Chris Forbes
f7e35899cf tidy ReplayConnection 2011-12-24 10:11:31 +13:00
Chris Forbes
727b897994 split ReplayRecorderConnection out into its own file 2011-12-24 10:05:14 +13:00
Chris Forbes
8029973e33 cull RA maps Paramount and Pandemonium, not played enough 2011-12-23 18:30:26 +13:00
Chris Forbes
bd4345c2d0 tidy in UnitOrders 2011-12-23 16:57:24 +13:00
Chris Forbes
4bcd19f57c remove bogus SurrenderOnDisconnect feature 2011-12-23 16:46:40 +13:00
Chris Forbes
bc38e99495 add base attack notification support to cnc 2011-12-23 16:43:10 +13:00
Chris Forbes
c1e6e3f9b9 don't announce self-damage 2011-12-23 16:41:29 +13:00
Chris Forbes
480c35ab58 add base attack notification 2011-12-23 16:31:29 +13:00
Chris Forbes
fdafb9d411 fix broken capitalization of variantExt 2011-12-19 14:40:05 +13:00
Chris Forbes
23a9e0503d don't crash on missing voice phrases 2011-12-19 14:39:00 +13:00
alzeih
aa9dd73fe5 Fix #1236 - Aircraft with full health landing on FIX costs the player money
Note: still allows a plane on full health to land on FIX.
2011-12-14 00:01:58 +13:00
alzeih
1b0724719d Make LineRenderer understand Zoom internally 2011-12-13 23:58:39 +13:00
alzeih
c8ae6127f3 Fix #1128 - Use Line Width support in LaserZap 2011-12-13 23:58:34 +13:00
Chris Forbes
40029c6688 use string.F() extension method everywhere possible; fix various small issues in error messages 2011-12-13 23:57:23 +13:00
Chris Forbes
af3d00836a remove spurious Clone() from TooltipContainerWidget; all it did was make the error message *worse* 2011-12-13 23:48:32 +13:00
Chris Forbes
bf5be88c75 rename Ui.RootWidget to just Ui.Root 2011-12-13 23:46:58 +13:00
Chris Forbes
58f6816d84 convert silly DoXXX names to just XXX 2011-12-13 23:44:40 +13:00
Chris Forbes
ed429a3b30 split Widget static bits into Ui static class 2011-12-13 23:38:59 +13:00
Chris Forbes
83055f0a17 convert RootWidget prop back to field, now that it has trivial get/set 2011-12-13 22:30:51 +13:00
Chris Forbes
dd55c0ad93 remove spurious parens on return 2011-12-13 22:27:10 +13:00
alzeih
1bea7e3286 Fix #1297 - CNC server browser status text placement is wrong 2011-12-13 22:09:59 +13:00
alzeih
b508f7c300 Fix #1269 - Transport Helicopter Loading while in the Air
Note that weight is now checked for cargo (this might break things)
2011-12-13 12:38:39 +13:00
Chris Forbes
7e590b05c1 fix broken 'burn' sequence for snow t11 2011-12-13 12:28:15 +13:00
Chris Forbes
6c027372ab fix naming of event handlers in editor 2011-12-10 09:08:31 +13:00
Chris Forbes
6bac11f071 fix formatting in editor.Form1 2011-12-10 09:08:31 +13:00
Chris Forbes
87a420623b tidy FileSystem.Exists 2011-12-10 09:08:31 +13:00
Chris Forbes
1e4f1a9f19 remove duplication in FileSystem.Open[WithExts] 2011-12-10 09:08:31 +13:00
Chris Forbes
410cad6f1e use priority correctly in FileSystem.OpenWithExts 2011-12-09 22:16:20 +13:00
Chris Forbes
69a869a44d fix empty array init style in Manifest 2011-12-09 22:08:25 +13:00
Chris Forbes
de88cb33f3 fix indent in Manifest 2011-12-09 22:07:15 +13:00
Chris Forbes
5ea756506b update comment in map save 2011-12-09 22:03:53 +13:00
Chris Forbes
fb1b7ac706 remove useless comments around actor loading 2011-12-09 22:02:07 +13:00
Chris Forbes
3003e49277 remove spurious extra FieldLoader.Load() call in Map.cs 2011-12-09 21:58:57 +13:00
Chris Forbes
a7c3052243 remove some silly duplication in Map.cs 2011-12-09 21:54:04 +13:00
Chris Forbes
c3a6674da0 fix bogus sequences in cnc 2011-12-09 20:28:26 +13:00
Chris Forbes
9d6094f798 fix bogus 'burn' sequence for t15 2011-12-08 13:05:32 +13:00
Chris Forbes
2747fadd96 #657 give a useful error message when a sequence references frames outside the range that actually exist 2011-12-03 19:23:14 +13:00
Chris Forbes
66c59add94 write RadarWidget transforms sanely 2011-12-03 11:38:09 +13:00
Chris Forbes
4610461a81 fix naming convention in RadarWidget 2011-12-03 11:29:27 +13:00
Chris Forbes
c1cbe0f0f5 Simplify some of the mess in RadarBinWidget 2011-12-03 11:28:42 +13:00
Chris Forbes
a566a372f5 (2/2) #1210 Remove QueueResupplyActivities entirely, just queue ResupplyAircraft 2011-12-03 10:16:10 +13:00
Chris Forbes
7b06e39390 (1/2) #1210 Untangling QueueResupplyActivities 2011-12-03 10:16:10 +13:00
Chris Forbes
b8c4ff8668 tidy GetTargetQueue 2011-11-29 11:46:57 +13:00
Chris Forbes
3d25e59e9e update AUTHORS 2011-11-29 10:13:17 +13:00
Chris Forbes
1df572e6ee tidy in MasterServerPinger 2011-11-29 10:01:55 +13:00
Kenny Hoxworth
98d4af18a4 Don't cancel the FlyAttack activity if the activity has already been canceled. The Tick routine calls Cancel() on FlyAttack, which removes any NextActivity that may have been set by an outside listener. This is the case with a rare bug causing planes to be killed, removed from the playable game, but still existing in the game world. 2011-11-29 08:57:04 +13:00
Matthew Bowra-Dean
0f97466a75 Remove spurious .swp file 2011-11-28 09:19:46 +13:00
Chris Forbes
58a6c01c3b add framelimiter as per Joseph_Vissarion's patch 2011-11-26 16:17:34 +13:00
Chris Forbes
8bdab6a5f2 tidy in Settings 2011-11-26 15:54:43 +13:00
Mark Olson
f043aa6366 DISCONNECT should use a LeaveGame'ish method.
It should be moved out of IngameChromeLogic, but I don't know where to..
2011-11-25 18:03:12 +13:00
Mark Olson
8933b201f1 Add buttons to Observe or Leave after a user's game ends. 2011-11-25 18:03:04 +13:00
Mark Olson
2bb968d0d3 Hide Chrome once we have Won or Lost 2011-11-25 18:01:34 +13:00
Raymond Martineau
bf222425fc Fix bug #1271 2011-11-25 17:49:05 +13:00
Chris Forbes
0ea9e06c22 remove spurious parameter from ScanAndAttack 2011-11-25 17:41:19 +13:00
Chris Forbes
54e8266e37 tidy AttackOrderTargeter 2011-11-25 17:38:58 +13:00
Chris Forbes
2679e91b03 remove duplication in cnc order button wiring 2011-11-25 17:22:22 +13:00
Chris Forbes
2462902d8b remove some duplication in binding order buttons 2011-11-25 15:12:04 +13:00
Chris Forbes
55f811faf5 remove some duplication in global order OGs 2011-11-25 15:11:49 +13:00
Chris Forbes
45c41b6696 allow building repair always 2011-11-24 15:23:08 +13:00
1565 changed files with 114701 additions and 33618 deletions

16
.editorconfig Normal file
View File

@@ -0,0 +1,16 @@
; Top-most http://editorconfig.org/ file
root = true
; Unix-style newlines
[*]
end_of_line = LF
; 4-column tab indentation
[*.cs]
indent_style = tab
indent_size = 4
; 4-column tab indentation
[*.yaml]
indent_style = tab
indent_size = 4

10
.gitattributes vendored Normal file
View File

@@ -0,0 +1,10 @@
# Enforce LF normalization on Windows
* text=lf
# Custom for Visual Studio
*.cs diff=csharp
*.sln merge=union
*.csproj merge=union
*.vbproj merge=union
*.fsproj merge=union
*.dbproj merge=union

30
.gitignore vendored
View File

@@ -10,11 +10,12 @@ obj
*.manifest
mods/*/*.dll
# Red Alert binary files
mods/*/packages/*.[mM][iI][xX]
# ReSharper crap
_ReSharper.*/
#binary stuff
/*.dll
/*.dll.config
*.pdb
*.mdb
*.exe
@@ -22,9 +23,15 @@ mods/*/packages/*.[mM][iI][xX]
# backup files by various editors
*~
*.orig
\#*
.*.sw?
# dependency DLLs (different for every platform!)
cg.dll
cgGL.dll
freetype6.dll
zlib1.dll
SDL.dll
/OpenRa.Gl.dll
@@ -32,8 +39,6 @@ cgGL.dll
*.pidb
*.userprefs
packaging/windows/*.exe
# osx crap
.DS_Store
@@ -49,12 +54,15 @@ OpenRA.Launcher.Mac/build/
OpenRA.Launcher.Mac/OpenRA.xcodeproj/*.pbxuser
OpenRA.Launcher.Mac/OpenRA.xcodeproj/*.perspectivev3
OpenRA.Launcher.Mac/OpenRA.xcodeproj/*.mode1v3
*.config
*.resources
# other crap
Logs/
Replays/
settings.yaml
\#*
.*.sw?
# KDE crap
*.kate-swp
*.directory
# auto-generated documentation
DOCUMENTATION.md
*.html
# StyleCop
*.Cache

BIN
.swp

Binary file not shown.

23
.travis.yml Normal file
View File

@@ -0,0 +1,23 @@
# Travis-CI Build for OpenRA
# see travis-ci.org for details
# Mono/.NET are not officially supported. The following is a workaround.
language: c
# Make sure build dependencies are installed.
install:
- sudo apt-get update && sudo apt-get install mono-gmcs cli-common-dev libgl1-mesa-dev libsdl1.2-dev libopenal-dev
# Run the build script which will automatically call RALint and ensure that the IDE project files are still valid.
script:
- make all
- xbuild
# Only watch the development branch.
branches:
only:
- bleed
# Notify developers when build passed/failed.
notifications:
irc: "irc.freenode.net#openra"

98
AUTHORS
View File

@@ -1,34 +1,74 @@
AUTHORS
OpenRA wouldn't be where it is today without the
hard work of many contributors.
The OpenRA developers are:
* Alli Witheford (alzeih)
* Caleb Anderson (RobotCaleb)
* Chris Forbes (chrisf)
* Curtis Shmyr (hamb)
* Daniel Hernandez (Mancano)
* Matthew Bowra-Dean (beedee)
* Mike Bundy (kehaar)
* Chris Forbes (chrisf)
* Curtis Shmyr (hamb)
* Paul Chote (pchote)
* Matthias Mailänder (Mailaender)
* ScottNZ
Previous developers included:
* Alli Witheford (alzeih)
* Caleb Anderson (RobotCaleb)
* Daniel Hernandez (Mancano)
* Megan Bowra-Dean (beedee)
* Mike Bundy (kehaar)
* Robert Pepperell (ytinasni)
Also thanks to:
* Andrew Riedi
* Bellator
* Christer Ulfsparre (Holloweye)
* Erasmus Schroder (rasco)
* Igor Popov (ihptru)
* Jeff Harris (jeff_1amstudios)
* Joakim Lindberg (booom3)
* Max Ugrumov (katzsmile)
* Lawrence Wang
* Matthew Gatland (mgatland)
* Max621
* Nukem
* Paolo Chiodi (paolochiodi)
* Paul Dovydaitis (pdovy)
* Ragequit
* Tim Mylemans (gecko)
* Riderr3
* Raymond Martineau
* Akseli Virtanen (RAGEQUIT)
* Andrew Perkins
* Andrew Riedi
* Andrew Aldridge (i80and)
* Andreas Beck (baxtor)
* Barnaby Smith (mvi)
* Bellator
* Bugra Cuhadaroglu (BugraC)
* Christer Ulfsparre (Holloweye)
* Cody Brittain (Generalcamo)
* D2k Sardaukar
* Daniel Derejvanik (Harisson)
* Danny (Dan9550)
* Erasmus Schroder (rasco)
* Frank Razenberg (zzattack)
* Igor Popov (ihptru)
* Iran
* James Dunne (jsd)
* Jeff Harris (jeff_1amstudios)
* Jes
* Joakim Lindberg (booom3)
* JOo
* Kenny Hoxworth (hoxworth)
* Krishnakanth Mallik
* Kyrre Soerensen (zypres)
* Lawrence Wang
* Lesueur Benjamin (Valkirie)
* Mark Olson (markolson)
* Matthew Gatland (mgatland)
* Maarten Meuris (Nyerguds)
* Max Ugrumov (katzsmile)
* Max621
* Nukem
* Olaf van der Spek
* Paolo Chiodi (paolochiodi)
* Paul Dovydaitis (pdovy)
* Psydev
* Raymond Martineau (mart0258)
* Reaperrr
* Riderr3
* Sascha Biedermann (bidifx)
* Tim Mylemans (gecko)
* Tirili
* Tristan Keating (Kilkakon)
* Vladimir Komarov (VrKomarov)
* Wuschel
Finally, special thanks goes to the original teams
at Westwood Studios and EA for creating the classic
games that inspired the creation of OpenRA.
Red Alert, Command and Conquer, and related
trademarks belong to Electronic Arts Inc. and are
used without permission.
Past developers included:
* Paul Chote (pchote)
* Robert Pepperell (ytinasni)

1312
CHANGELOG

File diff suppressed because it is too large Load Diff

19
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,19 @@
# OpenRA Contributing Guidelines
## Bug reports
* Have you read the [FAQ](https://github.com/OpenRA/OpenRA/wiki/FAQ)?
* Add the appropriate log files on crashes.
* Please be specific on how to reproduce the problem.
## Patches
* [Coding standard](https://github.com/OpenRA/OpenRA/wiki/Coding-Standard)
* [Branches and Releases](https://github.com/OpenRA/OpenRA/wiki/Branches-and-Releases)
* [Licensing](http://www.gnu.org/licenses/quick-guide-gplv3.html)
Please `git rebase` to the latest revision of the bleed branch.
Don't forget to add youself to [AUTHORS](https://github.com/OpenRA/OpenRA/blob/bleed/AUTHORS).
While your pull-request is in review it will be helpful if you join [IRC](irc://chat.freenode.net/openra) to discuss the changes.

BIN
Dune2k.ttf Normal file

Binary file not shown.

20
INSTALL
View File

@@ -41,23 +41,19 @@ UBUNTU (substitute comparable packages for other linux distros):
OpenRA does not work with some older versions of Compiz. On affected systems, disable desktop effects before playing. This is fixed in Ubuntu Natty and later.
You will additionally need to copy the third party dependencies (.dll and .config) from the
thirdparty and thirdparty/Tao directories into the game root:
cp -v thirdparty/*.dll thirdparty/Tao/* .
Alternatively, the dlls can be installed into your system GAC. This is not
The following dlls can also be installed into your system GAC. This is not
recommended because we ship a custom Tao.FreeType that can conflict with
other applications that use Tao:
gacutil -i thirdparty/Tao/Tao.Cg.dll
gacutil -i thirdparty/Tao/Tao.OpenGl.dll
gacutil -i thirdparty/Tao/Tao.OpenAl.dll
gacutil -i thirdparty/Tao/Tao.Sdl.dll
gacutil -i thirdparty/Tao/Tao.FreeType.dll
gacutil -i thirdparty/ICSharpCode.SharpZipLib.dll
gacutil -i Tao.Cg.dll
gacutil -i Tao.OpenGl.dll
gacutil -i Tao.OpenAl.dll
gacutil -i Tao.Sdl.dll
gacutil -i Tao.FreeType.dll
gacutil -i ICSharpCode.SharpZipLib.dll
To compile OpenRA, run `make' from the command line.
To install run 'make install'.
Run the game with `mono OpenRA.Game.exe Game.Mods=ra` for Red Alert
or `mono OpenRA.Game.exe Game.Mods=cnc` for Command & Conquer

300
Makefile
View File

@@ -1,22 +1,69 @@
############################# INSTRUCTIONS #############################
#
# to compile, run:
# make
#
# to compile with development tools, run:
# make all
#
# to install, run:
# make [prefix=/foo] [bindir=/bar/bin] install
#
# to install with development tools, run:
# make [prefix=/foo] [bindir=/bar/bin] install-all
#
# to uninstall, run:
# make uninstall
#
# for help, run:
# make help
#
# to start the game, run:
# openra
############################## TOOLCHAIN ###############################
#
CSC = gmcs
CSFLAGS = -nologo -warn:4 -debug:+ -debug:full -optimize- -codepage:utf8 -unsafe
CSFLAGS = -nologo -warn:4 -debug:full -optimize- -codepage:utf8 -unsafe -warnaserror
DEFINE = DEBUG;TRACE
COMMON_LIBS = System.dll System.Core.dll System.Drawing.dll System.Xml.dll thirdparty/ICSharpCode.SharpZipLib.dll
PHONY = core tools package all mods clean distclean
COMMON_LIBS = System.dll System.Core.dll System.Drawing.dll System.Xml.dll thirdparty/ICSharpCode.SharpZipLib.dll thirdparty/FuzzyLogicLibrary.dll thirdparty/Mono.Nat.dll
.SUFFIXES:
core: game renderers mod_ra mod_cnc utility
tools: editor ralint tsbuild
package: core editor
mods: mod_ra mod_cnc
all: core tools
clean:
@-rm -f *.exe *.dll *.mdb mods/**/*.dll mods/**/*.mdb *.resources
distclean: clean
######################### UTILITIES/SETTINGS ###########################
#
# install locations
prefix ?= /usr/local
datarootdir ?= $(prefix)/share
datadir ?= $(datarootdir)
bindir ?= $(prefix)/bin
BIN_INSTALL_DIR = $(DESTDIR)$(bindir)
DATA_INSTALL_DIR = $(DESTDIR)$(datadir)/openra
# install tools
RM = rm
RM_R = $(RM) -r
RM_F = $(RM) -f
CP = cp
CP_R = $(CP) -r
INSTALL = install
INSTALL_DIR = $(INSTALL) -d
INSTALL_PROGRAM = $(INSTALL) -m755
INSTALL_DATA = $(INSTALL) -m644
# program targets
CORE = fileformats rcg rgl rsdl rnull game utility
TOOLS = editor tsbuild ralint
VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
######################## PROGRAM TARGET RULES ##########################
#
# Core binaries
#
fileformats_SRCS := $(shell find OpenRA.FileFormats/ -iname '*.cs')
fileformats_TARGET = OpenRA.FileFormats.dll
fileformats_KIND = library
@@ -27,16 +74,14 @@ fileformats: $(fileformats_TARGET)
game_SRCS := $(shell find OpenRA.Game/ -iname '*.cs')
game_TARGET = OpenRA.Game.exe
game_KIND = winexe
game_DEPS = $(fileformats_TARGET)
game_DEPS = $(fileformats_TARGET)
game_LIBS = $(COMMON_LIBS) System.Windows.Forms.dll $(game_DEPS) \
thirdparty/Tao/Tao.OpenAl.dll thirdparty/Tao/Tao.FreeType.dll
thirdparty/Tao/Tao.OpenAl.dll thirdparty/SharpFont.dll
game_FLAGS = -win32icon:OpenRA.Game/OpenRA.ico
PROGRAMS += game
game: $(game_TARGET)
#
# Renderer dlls
#
rsdl_SRCS := $(shell find OpenRA.Renderer.SdlCommon/ -iname '*.cs')
rsdl_TARGET = OpenRA.Renderer.SdlCommon.dll
rsdl_KIND = library
@@ -70,19 +115,18 @@ rnull_LIBS = $(COMMON_LIBS) System.Windows.Forms.dll \
PROGRAMS += rcg rgl rnull rsdl
renderers: $(rcg_TARGET) $(rgl_TARGET) $(rnull_TARGET) $(rsdl_TARGET)
#
# Official Mods
#
# Red Alert
##### Official Mods #####
STD_MOD_LIBS = $(fileformats_TARGET) $(game_TARGET)
STD_MOD_DEPS = $(STD_MOD_LIBS) $(ralint_TARGET)
# Red Alert
mod_ra_SRCS := $(shell find OpenRA.Mods.RA/ -iname '*.cs')
mod_ra_TARGET = mods/ra/OpenRA.Mods.RA.dll
mod_ra_KIND = library
mod_ra_DEPS = $(STD_MOD_DEPS)
mod_ra_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS)
mod_ra_DEPS = $(STD_MOD_DEPS) $(utility_TARGET)
mod_ra_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(utility_TARGET)
mod_ra_EXTRA_CMDS = mono --debug RALint.exe ra
PROGRAMS += mod_ra
mod_ra: $(mod_ra_TARGET)
@@ -97,9 +141,19 @@ mod_cnc_EXTRA_CMDS = mono --debug RALint.exe cnc
PROGRAMS += mod_cnc
mod_cnc: $(mod_cnc_TARGET)
#
# Tools
#
# Dune 2000
mod_d2k_SRCS := $(shell find OpenRA.Mods.D2k/ -iname '*.cs')
mod_d2k_TARGET = mods/d2k/OpenRA.Mods.D2k.dll
mod_d2k_KIND = library
mod_d2k_DEPS = $(STD_MOD_DEPS) $(mod_ra_TARGET) $(mod_cnc_TARGET) $(utility_TARGET)
mod_d2k_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_ra_TARGET) $(utility_TARGET)
mod_d2k_EXTRA_CMDS = mono --debug RALint.exe d2k
PROGRAMS += mod_d2k
mod_d2k: $(mod_d2k_TARGET)
##### Tools #####
# Map Editor
editor_SRCS := $(shell find OpenRA.Editor/ -iname '*.cs')
editor_TARGET = OpenRA.Editor.exe
@@ -127,23 +181,22 @@ ralint: $(ralint_TARGET)
# Builds and exports tilesets from a bitmap
tsbuild_SRCS := $(shell find OpenRA.TilesetBuilder/ -iname '*.cs')
tsbuild_TARGET = TilesetBuilder.exe
tsbuild_TARGET = OpenRA.TilesetBuilder.exe
tsbuild_KIND = winexe
tsbuild_DEPS = $(fileformats_TARGET) $(game_TARGET)
tsbuild_LIBS = $(COMMON_LIBS) $(tsbuild_DEPS) System.Windows.Forms.dll
tsbuild_EXTRA = -resource:OpenRA.TilesetBuilder.Form1.resources
tsbuild_EXTRA = -resource:OpenRA.TilesetBuilder.frmBuilder.resources -resource:OpenRA.TilesetBuilder.frmNew.resources -resource:OpenRA.TilesetBuilder.Surface.resources
PROGRAMS += tsbuild
OpenRA.TilesetBuilder.Form1.resources:
resgen2 OpenRA.TilesetBuilder/Form1.resx OpenRA.TilesetBuilder.Form1.resources 1> /dev/null
tsbuild: OpenRA.TilesetBuilder.Form1.resources $(tsbuild_TARGET)
OpenRA.TilesetBuilder.frmBuilder.resources:
resgen2 OpenRA.TilesetBuilder/frmBuilder.resx OpenRA.TilesetBuilder.frmBuilder.resources 1> /dev/null
OpenRA.TilesetBuilder.frmNew.resources:
resgen2 OpenRA.TilesetBuilder/frmNew.resx OpenRA.TilesetBuilder.frmNew.resources 1> /dev/null
OpenRA.TilesetBuilder.Surface.resources:
resgen2 OpenRA.TilesetBuilder/Surface.resx OpenRA.TilesetBuilder.Surface.resources 1> /dev/null
tsbuild: OpenRA.TilesetBuilder.frmBuilder.resources OpenRA.TilesetBuilder.frmNew.resources OpenRA.TilesetBuilder.Surface.resources $(tsbuild_TARGET)
#
# Launchers / Utilities
#
# Patches binary headers to work around a mono bug
fixheader.exe: packaging/fixheader.cs
@echo CSC fixheader.exe
@$(CSC) packaging/fixheader.cs $(CSFLAGS) -out:fixheader.exe -t:exe $(COMMON_LIBS:%=-r:%)
##### Launchers / Utilities #####
# Backend for the launcher apps - queries game/mod info and applies actions to an install
utility_SRCS := $(shell find OpenRA.Utility/ -iname '*.cs')
@@ -154,11 +207,13 @@ utility_LIBS = $(COMMON_LIBS) $(utility_DEPS) thirdparty/ICSharpCode.Shar
PROGRAMS += utility
utility: $(utility_TARGET)
.PHONY: $(PHONY) $(PROGRAMS)
#
# Patches binary headers to work around a mono bug
fixheader.exe: packaging/fixheader.cs
@echo CSC fixheader.exe
@$(CSC) packaging/fixheader.cs $(CSFLAGS) -out:fixheader.exe -t:exe $(COMMON_LIBS:%=-r:%)
# Generate build rules for each target defined above in PROGRAMS
#
define BUILD_ASSEMBLY
$$($(1)_TARGET): $$($(1)_SRCS) Makefile $$($(1)_DEPS) fixheader.exe
@@ -177,58 +232,129 @@ endef
$(foreach prog,$(PROGRAMS),$(eval $(call BUILD_ASSEMBLY,$(prog))))
########################## MAKE/INSTALL RULES ##########################
#
# Install / Uninstall for *nix
#
prefix = /usr/local
datarootdir = $(prefix)/share
datadir = $(datarootdir)
bindir = $(prefix)/bin
BIN_INSTALL_DIR = $(DESTDIR)$(bindir)
INSTALL_DIR = $(DESTDIR)$(datadir)/openra
INSTALL = install
INSTALL_PROGRAM = $(INSTALL)
CORE = fileformats rcg rgl rsdl rnull game editor utility
default: dependencies core
install: all
@-echo "Installing OpenRA to $(INSTALL_DIR)"
@$(INSTALL_PROGRAM) -d $(INSTALL_DIR)
@$(INSTALL_PROGRAM) $(foreach prog,$(CORE),$($(prog)_TARGET)) $(INSTALL_DIR)
@$(INSTALL_PROGRAM) -d $(INSTALL_DIR)/mods/cnc
@$(INSTALL_PROGRAM) $(mod_cnc_TARGET) $(INSTALL_DIR)/mods/cnc
core: game renderers mods utility tsbuild
@-cp $(foreach f,$(shell ls mods/cnc --hide=*.dll),mods/cnc/$(f)) $(INSTALL_DIR)/mods/cnc
@cp -r mods/cnc/maps $(INSTALL_DIR)/mods/cnc
@cp -r mods/cnc/chrome $(INSTALL_DIR)/mods/cnc
@cp -r mods/cnc/bits $(INSTALL_DIR)/mods/cnc
@cp -r mods/cnc/rules $(INSTALL_DIR)/mods/cnc
@cp -r mods/cnc/sequences $(INSTALL_DIR)/mods/cnc
@cp -r mods/cnc/tilesets $(INSTALL_DIR)/mods/cnc
@cp -r mods/cnc/uibits $(INSTALL_DIR)/mods/cnc
@$(INSTALL_PROGRAM) -d $(INSTALL_DIR)/mods/ra
@$(INSTALL_PROGRAM) $(mod_ra_TARGET) $(INSTALL_DIR)/mods/ra
tools: editor tsbuild ralint
@-cp $(foreach f,$(shell ls mods/ra --hide=*.dll),mods/ra/$(f)) $(INSTALL_DIR)/mods/ra
@cp -r mods/ra/maps $(INSTALL_DIR)/mods/ra
@cp -r mods/ra/bits $(INSTALL_DIR)/mods/ra
@cp -r mods/ra/chrome $(INSTALL_DIR)/mods/ra
@cp -r mods/ra/rules $(INSTALL_DIR)/mods/ra
@cp -r mods/ra/tilesets $(INSTALL_DIR)/mods/ra
@cp -r mods/ra/uibits $(INSTALL_DIR)/mods/ra
package: dependencies core editor docs version
@cp -r glsl $(INSTALL_DIR)
@cp -r cg $(INSTALL_DIR)
@cp *.ttf $(INSTALL_DIR)
@cp --parents -r thirdparty/Tao $(INSTALL_DIR)
@$(INSTALL_PROGRAM) thirdparty/ICSharpCode.SharpZipLib.dll $(INSTALL_DIR)
mods: mod_ra mod_cnc mod_d2k
@echo "#!/bin/sh" > openra
@echo "cd "$(datadir)"/openra" >> openra
@echo "mono "$(datadir)"/openra/OpenRA.Game.exe \"$$""@\"" >> openra
all: dependencies core tools
@$(INSTALL_PROGRAM) -d $(BIN_INSTALL_DIR)
@$(INSTALL_PROGRAM) -m +rx openra $(BIN_INSTALL_DIR)
clean:
@-$(RM_F) *.exe *.dll *.mdb mods/**/*.dll mods/**/*.mdb *.resources
distclean: clean
dependencies:
@ $(CP_R) thirdparty/*.dl* .
@ $(CP_R) thirdparty/Tao/* .
version: mods/ra/mod.yaml mods/cnc/mod.yaml mods/d2k/mod.yaml
@for i in $? ; do \
awk '{sub("Version:.*$$","Version: $(VERSION)"); print $0}' $${i} > $${i}.tmp && \
mv -f $${i}.tmp $${i} ; \
done
# Documentation (d2k depends on all mod libraries)
docs: utility
@mono --debug OpenRA.Utility.exe --docs d2k > DOCUMENTATION.md
install: install-core
install-all: install-core install-tools
install-core: default
@-echo "Installing OpenRA to $(DATA_INSTALL_DIR)"
@$(INSTALL_DIR) "$(DATA_INSTALL_DIR)"
@$(INSTALL_PROGRAM) $(foreach prog,$(CORE),$($(prog)_TARGET)) "$(DATA_INSTALL_DIR)"
@$(INSTALL_DIR) "$(DATA_INSTALL_DIR)/mods"
@$(CP_R) mods/cnc "$(DATA_INSTALL_DIR)/mods/"
@$(INSTALL_PROGRAM) $(mod_cnc_TARGET) "$(DATA_INSTALL_DIR)/mods/cnc"
@$(CP_R) mods/ra "$(DATA_INSTALL_DIR)/mods/"
@$(INSTALL_PROGRAM) $(mod_ra_TARGET) "$(DATA_INSTALL_DIR)/mods/ra"
@$(CP_R) mods/d2k "$(DATA_INSTALL_DIR)/mods/"
@$(INSTALL_PROGRAM) $(mod_d2k_TARGET) "$(DATA_INSTALL_DIR)/mods/d2k"
@$(INSTALL_DATA) "global mix database.dat" "$(DATA_INSTALL_DIR)/global mix database.dat"
@$(INSTALL_DATA) AUTHORS "$(DATA_INSTALL_DIR)/AUTHORS"
@$(CP_R) glsl "$(DATA_INSTALL_DIR)"
@$(CP_R) cg "$(DATA_INSTALL_DIR)"
@$(CP) *.ttf "$(DATA_INSTALL_DIR)"
@$(CP) thirdparty/Tao/* "$(DATA_INSTALL_DIR)"
@$(INSTALL_PROGRAM) thirdparty/ICSharpCode.SharpZipLib.dll "$(DATA_INSTALL_DIR)"
@$(INSTALL_PROGRAM) thirdparty/FuzzyLogicLibrary.dll "$(DATA_INSTALL_DIR)"
@$(INSTALL_PROGRAM) thirdparty/SharpFont.dll "$(DATA_INSTALL_DIR)"
@$(CP) thirdparty/SharpFont.dll.config "$(DATA_INSTALL_DIR)"
@$(INSTALL_PROGRAM) thirdparty/Mono.Nat.dll "$(DATA_INSTALL_DIR)"
@echo "#!/bin/sh" > openra
@echo 'BINDIR=$$(dirname $$(readlink -f $$0))' >> openra
@echo 'ROOTDIR="$${BINDIR%'"$(bindir)"'}"' >> openra
@echo 'DATADIR="$${ROOTDIR}/'"$(datadir)"'"' >> openra
@echo 'cd "$${DATADIR}/openra"' >> openra
@echo 'exec mono OpenRA.Game.exe "$$@"' >> openra
@$(INSTALL_DIR) "$(BIN_INSTALL_DIR)"
@$(INSTALL_PROGRAM) -m +rx openra "$(BIN_INSTALL_DIR)"
@-$(RM) openra
install-tools: tools
@-echo "Installing OpenRA tools to $(DATA_INSTALL_DIR)"
@$(INSTALL_DIR) "$(DATA_INSTALL_DIR)"
@$(INSTALL_PROGRAM) $(foreach prog,$(TOOLS),$($(prog)_TARGET)) "$(DATA_INSTALL_DIR)"
@echo "#!/bin/sh" > openra-editor
@echo 'BINDIR=$$(dirname $$(readlink -f $$0))' >> openra-editor
@echo 'ROOTDIR="$${BINDIR%'"$(bindir)"'}"' >> openra-editor
@echo 'DATADIR="$${ROOTDIR}/'"$(datadir)"'"' >> openra-editor
@echo 'cd "$${DATADIR}/openra"' >> openra-editor
@echo 'exec mono OpenRA.Editor.exe "$$@"' >> openra-editor
@$(INSTALL_DIR) "$(BIN_INSTALL_DIR)"
@$(INSTALL_PROGRAM) -m +rx openra-editor "$(BIN_INSTALL_DIR)"
@-$(RM) openra-editor
uninstall:
@-rm -r $(INSTALL_DIR)
@-rm $(DESTDIR)$(bindir)/openra
@-$(RM_R) "$(DATA_INSTALL_DIR)"
@-$(RM_F) "$(BIN_INSTALL_DIR)/openra"
@-$(RM_F) "$(BIN_INSTALL_DIR)/openra-editor"
help:
@echo to compile, run:
@echo \ \ make
@echo
@echo to compile with development tools, run:
@echo \ \ make all
@echo
@echo to install, run:
@echo \ \ make \[prefix=/foo\] \[bindir=/bar/bin\] install
@echo
@echo to install with development tools, run:
@echo \ \ make \[prefix=/foo\] \[bindir=/bar/bin\] install-all
@echo
@echo to uninstall, run:
@echo \ \ make uninstall
@echo
@echo to start the game, run:
@echo \ \ openra
########################### MAKEFILE SETTINGS ##########################
#
.DEFAULT_GOAL := default
.SUFFIXES:
.PHONY: core tools package all mods clean distclean dependencies version $(PROGRAMS)

View File

@@ -39,7 +39,7 @@ namespace OpenRA.Editor
for (var u = 0; u < template.Size.X; u++)
for (var v = 0; v < template.Size.Y; v++)
{
if (surface.Map.IsInMap(new int2(u, v) + pos))
if (surface.Map.IsInMap(new CVec(u, v) + pos))
{
var z = u + v * template.Size.X;
if (tile.TileBitmapBytes[z] != null)
@@ -69,17 +69,17 @@ namespace OpenRA.Editor
Brush.Bitmap.Height * surface.Zoom);
}
void FloodFillWithBrush(Surface s, int2 pos)
void FloodFillWithBrush(Surface s, CPos pos)
{
var queue = new Queue<int2>();
var queue = new Queue<CPos>();
var replace = s.Map.MapTiles.Value[pos.X, pos.Y];
var touched = new bool[s.Map.MapSize.X, s.Map.MapSize.Y];
Action<int, int> MaybeEnqueue = (x, y) =>
Action<int, int> maybeEnqueue = (x, y) =>
{
if (s.Map.IsInMap(x, y) && !touched[x, y])
{
queue.Enqueue(new int2(x, y));
queue.Enqueue(new CPos(x, y));
touched[x, y] = true;
}
};
@@ -91,25 +91,25 @@ namespace OpenRA.Editor
if (!s.Map.MapTiles.Value[p.X, p.Y].Equals(replace))
continue;
var a = FindEdge(s, p, new int2(-1, 0), replace);
var b = FindEdge(s, p, new int2(1, 0), replace);
var a = FindEdge(s, p, new CVec(-1, 0), replace);
var b = FindEdge(s, p, new CVec(1, 0), replace);
for (var x = a.X; x <= b.X; x++)
{
s.Map.MapTiles.Value[x, p.Y] = new TileReference<ushort, byte> { type = Brush.N, index = (byte)0 };
if (s.Map.MapTiles.Value[x, p.Y - 1].Equals(replace))
MaybeEnqueue(x, p.Y - 1);
maybeEnqueue(x, p.Y - 1);
if (s.Map.MapTiles.Value[x, p.Y + 1].Equals(replace))
MaybeEnqueue(x, p.Y + 1);
maybeEnqueue(x, p.Y + 1);
}
}
/* todo: optimize */
/* TODO: optimize */
foreach (var ch in s.Chunks.Values) ch.Dispose();
s.Chunks.Clear();
}
int2 FindEdge(Surface s, int2 p, int2 d, TileReference<ushort, byte> replace)
CPos FindEdge(Surface s, CPos p, CVec d, TileReference<ushort, byte> replace)
{
for (; ; )
{

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -42,14 +42,17 @@ namespace OpenRA.Editor
tilePalette.ResumeLayout();
actorPalette.ResumeLayout();
resourcePalette.ResumeLayout();
surface1.Bind(null, null, null);
surface1.Bind(null, null, null, null);
pmMiniMap.Image = null;
currentMod = toolStripComboBox1.SelectedItem as string;
Text = "OpenRA Editor (mod:{0})".F(currentMod);
Game.modData = new ModData(currentMod);
FileSystem.LoadFromManifest(Game.modData.Manifest);
Rules.LoadRules(Game.modData.Manifest, new Map());
var mod = Game.modData.Manifest.Mods[0];
Text = "{0} Mod Version: {1} - OpenRA Editor".F(Mod.AllMods[mod].Title, Mod.AllMods[mod].Version);
loadedMapName = null;
};
@@ -67,6 +70,7 @@ namespace OpenRA.Editor
{
MakeDirty();
pmMiniMap.Image = Minimap.AddStaticResources(surface1.Map, Minimap.TerrainBitmap(surface1.Map, true));
cashToolStripStatusLabel.Text = CalculateTotalResource().ToString();
}
void ActorDoubleClicked(KeyValuePair<string,ActorReference> kv)
@@ -116,6 +120,8 @@ namespace OpenRA.Editor
map.MakeDefaultPlayers();
PrepareMapResources(Game.modData.Manifest, map);
//Calculate total net worth of resources in cash
cashToolStripStatusLabel.Text = CalculateTotalResource().ToString();
dirty = false;
}
@@ -138,38 +144,67 @@ namespace OpenRA.Editor
Rules.LoadRules(manifest, map);
tileset = Rules.TileSets[map.Tileset];
tileset.LoadTiles();
var palette = new Palette(FileSystem.Open(tileset.Palette), true);
int[] ShadowIndex = { 3, 4 };
var palette = new Palette(FileSystem.Open(tileset.Palette), ShadowIndex);
surface1.Bind(map, tileset, palette);
// required for desert terrain in RA
var playerPalette = tileset.PlayerPalette ?? tileset.Palette;
var PlayerPalette = new Palette(FileSystem.Open(playerPalette), ShadowIndex);
surface1.Bind(map, tileset, palette, PlayerPalette);
// construct the palette of tiles
var palettes = new[] { tilePalette, actorPalette, resourcePalette };
foreach (var p in palettes) { p.Visible = false; p.SuspendLayout(); }
foreach (var t in tileset.Templates)
string[] templateOrder = tileset.EditorTemplateOrder ?? new string[]{};
foreach (var tc in tileset.Templates.GroupBy(t => t.Value.Category).OrderBy(t => templateOrder.ToList().IndexOf(t.Key)))
{
try
var category = tc.Key ?? "(Uncategorized)";
var categoryHeader = new Label
{
var bitmap = tileset.RenderTemplate((ushort)t.Key, palette);
var ibox = new PictureBox
BackColor = SystemColors.Highlight,
ForeColor = SystemColors.HighlightText,
Text = category,
AutoSize = false,
Height = 24,
TextAlign = ContentAlignment.MiddleLeft,
Width = tilePalette.ClientSize.Width,
};
// hook this manually, anchoring inside FlowLayoutPanel is flaky.
tilePalette.Resize += (_,e) => categoryHeader.Width = tilePalette.ClientSize.Width;
if (tilePalette.Controls.Count > 0)
tilePalette.SetFlowBreak(
tilePalette.Controls[tilePalette.Controls.Count - 1], true);
tilePalette.Controls.Add(categoryHeader);
foreach( var t in tc )
{
try
{
Image = bitmap,
Width = bitmap.Width / 2,
Height = bitmap.Height / 2,
SizeMode = PictureBoxSizeMode.StretchImage
};
var brushTemplate = new BrushTemplate { Bitmap = bitmap, N = t.Key };
ibox.Click += (_, e) => surface1.SetTool(new BrushTool(brushTemplate));
var template = t.Value;
tilePalette.Controls.Add(ibox);
tt.SetToolTip(ibox,
"{1}:{0} ({2}x{3})".F(
template.Image,
template.Id,
template.Size.X,
template.Size.Y));
var bitmap = tileset.RenderTemplate((ushort)t.Key, palette);
var ibox = new PictureBox
{
Image = bitmap,
Width = bitmap.Width / 2,
Height = bitmap.Height / 2,
SizeMode = PictureBoxSizeMode.StretchImage
};
var brushTemplate = new BrushTemplate { Bitmap = bitmap, N = t.Key };
ibox.Click += (_, e) => surface1.SetTool(new BrushTool(brushTemplate));
var template = t.Value;
tilePalette.Controls.Add(ibox);
tt.SetToolTip(ibox,
"{1}:{0} ({2}x{3})".F(
template.Image,
template.Id,
template.Size.X,
template.Size.Y));
}
catch { }
}
catch { }
}
var actorTemplates = new List<ActorTemplate>();
@@ -187,7 +222,13 @@ namespace OpenRA.Editor
if (etf != null && etf.RequireTilesets != null
&& !etf.RequireTilesets.Contains(tileset.Id)) continue;
var template = RenderUtils.RenderActor(info, tileset, palette);
var TemplatePalette = PlayerPalette;
var rsi = info.Traits.GetOrDefault<RenderSimpleInfo>();
// exception for desert buildings
if (rsi != null && rsi.Palette != null && rsi.Palette.Contains("terrain"))
TemplatePalette = palette;
var template = RenderUtils.RenderActor(info, tileset, TemplatePalette);
var ibox = new PictureBox
{
Image = template.Bitmap,
@@ -218,7 +259,7 @@ namespace OpenRA.Editor
{
try
{
var template = RenderUtils.RenderResourceType(a, tileset.Extensions, palette);
var template = RenderUtils.RenderResourceType(a, tileset.Extensions, PlayerPalette);
var ibox = new PictureBox
{
Image = template.Bitmap,
@@ -255,10 +296,13 @@ namespace OpenRA.Editor
pmMiniMap.Image = Minimap.AddStaticResources(surface1.Map, Minimap.TerrainBitmap(surface1.Map, true));
propertiesToolStripMenuItem.Enabled = true;
toolStripMenuItemProperties.Enabled = true;
resizeToolStripMenuItem.Enabled = true;
toolStripMenuItemResize.Enabled = true;
saveToolStripMenuItem.Enabled = true;
toolStripMenuItemSave.Enabled = true;
saveAsToolStripMenuItem.Enabled = true;
mnuMinimapToPNG.Enabled = true; // todo: what is this VB naming bullshit doing here?
mnuMinimapToPNG.Enabled = true; // TODO: what is this VB naming bullshit doing here?
PopulateActorOwnerChooser();
}
@@ -286,14 +330,14 @@ namespace OpenRA.Editor
return;
surface1.Map.ResizeCordon((int)rd.cordonLeft.Value,
(int)rd.cordonTop.Value,
(int)rd.cordonRight.Value,
(int)rd.cordonBottom.Value);
(int)rd.cordonTop.Value,
(int)rd.cordonRight.Value,
(int)rd.cordonBottom.Value);
if ((int)rd.width.Value != surface1.Map.MapSize.X || (int)rd.height.Value != surface1.Map.MapSize.Y)
{
surface1.Map.Resize((int)rd.width.Value, (int)rd.height.Value);
surface1.Bind(surface1.Map, surface1.TileSet, surface1.Palette); // rebind it to invalidate all caches
surface1.Bind(surface1.Map, surface1.TileSet, surface1.Palette, surface1.PlayerPalette); // rebind it to invalidate all caches
}
surface1.Invalidate();
@@ -362,6 +406,7 @@ namespace OpenRA.Editor
map.ResizeCordon((int)nmd.cordonLeft.Value, (int)nmd.cordonTop.Value,
(int)nmd.cordonRight.Value, (int)nmd.cordonBottom.Value);
map.Players.Clear();
map.MakeDefaultPlayers();
NewMap(map);
@@ -458,12 +503,14 @@ namespace OpenRA.Editor
void ShowActorNamesClicked(object sender, EventArgs e)
{
showActorNamesToolStripMenuItem.Checked ^= true;
toolStripMenuItemShowActorNames.Checked ^= true;
surface1.ShowActorNames = showActorNamesToolStripMenuItem.Checked;
}
void ShowGridClicked(object sender, EventArgs e)
{
showGridToolStripMenuItem.Checked ^= true;
toolStripMenuItemShowGrid.Checked ^= true;
surface1.ShowGrid = showGridToolStripMenuItem.Checked;
surface1.Chunks.Clear();
}
@@ -491,6 +538,7 @@ namespace OpenRA.Editor
void SetupDefaultPlayers(object sender, EventArgs e)
{
dirty = true;
surface1.Map.Players.Clear();
surface1.Map.MakeDefaultPlayers();
surface1.Chunks.Clear();
@@ -499,7 +547,7 @@ namespace OpenRA.Editor
PopulateActorOwnerChooser();
}
void onDrawPlayerItem(object sender, DrawItemEventArgs e)
void DrawPlayerListItem(object sender, DrawItemEventArgs e)
{
// color block
var player = e.Index >= 0 ? (PlayerReference)(sender as ComboBox).Items[e.Index] : null;
@@ -510,17 +558,203 @@ namespace OpenRA.Editor
if (player == null)
return;
var color = player.ColorRamp.GetColor(0);
var color = player.Color.RGB;
using( var brush = new SolidBrush(color) )
e.Graphics.FillRectangle( brush, e.Bounds.Left + 2, e.Bounds.Top + 2, e.Bounds.Height + 6, e.Bounds.Height - 4 );
using( var foreBrush = new SolidBrush(e.ForeColor) )
e.Graphics.DrawString( player.Name, e.Font, foreBrush, e.Bounds.Left + e.Bounds.Height + 12, e.Bounds.Top );
}
void onSelectOwner(object sender, EventArgs e)
void OnSelectedPlayerChanged(object sender, EventArgs e)
{
var player = actorOwnerChooser.SelectedItem as PlayerReference;
surface1.NewActorOwner = player.Name;
}
private void copySelectionToolStripMenuItemClick(object sender, EventArgs e)
{
surface1.CopySelection();
}
private void openRAWebsiteToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://www.open-ra.org");
}
private void openRAResourcesToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://content.open-ra.org");
}
private void wikiDocumentationToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA/wiki");
}
private void discussionForumsToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://www.sleipnirstuff.com/forum/viewforum.php?f=80");
}
private void issueTrackerToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA/issues");
}
private void developerBountiesToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.bountysource.com/#repos/OpenRA/OpenRA");
}
private void sourceCodeToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA");
}
private void aboutToolStripMenuItemClick(object sender, EventArgs e)
{
MessageBox.Show("OpenRA and OpenRA Editor are Free/Libre Open Source Software released under the GNU General Public License version 3. See AUTHORS and COPYING for details.",
"About",
MessageBoxButtons.OK,
MessageBoxIcon.Asterisk);
}
private void helpToolStripButton_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA/wiki/Mapping");
}
private void toolStripMenuItemNewClick(object sender, EventArgs e)
{
NewClicked(sender, e);
}
private void toolStripMenuItemOpenClick(object sender, EventArgs e)
{
OpenClicked(sender, e);
}
private void toolStripMenuItemSaveClick(object sender, EventArgs e)
{
SaveClicked(sender, e);
}
private void toolStripMenuItemPropertiesClick(object sender, EventArgs e)
{
PropertiesClicked(sender, e);
}
private void toolStripMenuItemResizeClick(object sender, EventArgs e)
{
ResizeClicked(sender, e);
}
private void toolStripMenuItemShowActorNamesClick(object sender, EventArgs e)
{
ShowActorNamesClicked(sender, e);
}
private void toolStripMenuItemFixOpenAreasClick(object sender, EventArgs e)
{
FixOpenAreas(sender, e);
}
private void toolStripMenuItemSetupDefaultPlayersClick(object sender, EventArgs e)
{
SetupDefaultPlayers(sender, e);
}
private void toolStripMenuItemCopySelectionClick(object sender, EventArgs e)
{
copySelectionToolStripMenuItemClick(sender, e);
}
private void toolStripMenuItemShowGridClick(object sender, EventArgs e)
{
ShowGridClicked(sender, e);
}
public int CalculateTotalResource()
{
int TotalResource = 0;
for(int i = 0; i < surface1.Map.MapSize.X; i++)
for (int j = 0; j < surface1.Map.MapSize.Y; j++)
{
if (surface1.Map.MapResources.Value[i, j].type != 0)
TotalResource += GetResourceValue(i, j);
}
return TotalResource;
}
int GetAdjecentCellsWith(int ResourceType, int x, int y)
{
int sum = 0;
for (var u = -1; u < 2; u++)
for (var v = -1; v < 2; v++)
{
if (!surface1.Map.IsInMap(new CPos(x + u, y + v)))
continue;
if (surface1.Map.MapResources.Value[x + u, y + v].type == ResourceType)
++sum;
}
return sum;
}
int GetResourceValue(int x, int y)
{
int ImageLength = 0;
int type = surface1.Map.MapResources.Value[x, y].type;
var template = surface1.ResourceTemplates.Where(a => a.Value.Info.ResourceType == type).FirstOrDefault().Value;
if (type == 1)
ImageLength = 12;
else if (type == 2)
ImageLength = 3;
int density = (GetAdjecentCellsWith(type ,x , y) * ImageLength - 1) / 9;
int value = template.Info.ValuePerUnit;
return (density) * value;
}
void zoomInToolStripButtonClick(object sender, System.EventArgs e)
{
if (surface1.Map == null) return;
surface1.Zoom /= .75f;
surface1.Invalidate();
}
void zoomOutToolStripButtonClick(object sender, System.EventArgs e)
{
if (surface1.Map == null) return;
surface1.Zoom *= .75f;
surface1.Invalidate();
}
void panToolStripButtonClick(object sender, System.EventArgs e)
{
panToolStripButton.Checked ^= true;
surface1.IsPanning = panToolStripButton.Checked;
}
void showRulerToolStripMenuItemClick(object sender, EventArgs e)
{
showRulerToolStripMenuItem.Checked ^= true;
showRulerToolStripItem.Checked ^= true;
surface1.ShowRuler = showRulerToolStripMenuItem.Checked;
surface1.Chunks.Clear();
}
void showRulerToolStripItemClick(object sender, System.EventArgs e)
{
showRulerToolStripMenuItemClick(sender, e);
}
void EraserToolStripButtonClick(object sender, System.EventArgs e)
{
eraserToolStripButton.Checked ^= true;
surface1.IsErasing = eraserToolStripButton.Checked;
}
}
}

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
@@ -120,58 +120,292 @@
<metadata name="tt.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>76, 17</value>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>429, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="toolStripMenuItemNew.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHPSURBVDhPpZFNTxNRFIb7W1y4NZpI4k/QrRs3rjSu/QMk
NjHGYCFgYYIWsaJidAKoUWqEgFiwGjE2ERREKEOZZtpa23H6OWX6OHN7CQaxNfFNTm5Oct7nnvten6fN
6AV+rPixM/2sTRzGNgKYGz0kF/2IgXayNIXNF8fADJB8fcY9e0lMHqGw3v1vAO9mLAXqMSx9zD2jot/6
cg3l3qSogbvPWViMHwxcVQ+hzZ6maEzgUKCcfSZ6faqDXV0PP6Xj1PmDIWIDMwjVWQHxNhF94ba0Q8/Q
OC8XlgRk/v0+iLU1SCJyFCfdSerNWdcYFBnUjLC0Q9fgQ2HeLWltSotdbP5C6gr6zAkSKzcoa32k435p
B6fR4NbYPENq9E/A7+odfiwte3K9VGp1cmaZ8VerHD957u+AwE1V2vZUtXfIWxW2Mz9Rp5dbA64OPJC2
puz6DmaxRuq7xddkjtHIx9aAy30j0up+huNglWoYuSLftvPE19LcefK2NeBS97AwO06DUsUmky+RSBX4
tJ4ltqQTejTXGtDZFXJDa1CpNkPTDJPPG1neLevMfNBQ7k+3B3iheWl7gXlvDrtrh9Q5lNEpgiOR9k/w
BtqVHP9f+Xy/AI/l932QyhfPAAAAAElFTkSuQmCC
</value>
</data>
<data name="toolStripMenuItemOpen.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACeUlE
QVQ4T6WSWUiUURiG/4suurJIjUIwskQsEAMjqosQpUVNKbdCSRPKrQVDMddmXEedGdcpFXNGnUYdrSzF
sEIoFInQcqHE1CwoKsXUUMnt6XfEye0munjgnO+c9+HjO0cA/osNi2tJLdA6SXN13MwoI12lJ06uiV8+
W3d5IwIjVXiGKvwX11djSs2TRFlUito7ILIAoVab7SvCWhqrZYq1omXC4gpPe4Ur8AjNMQjo69IwPVZj
4PeojtlhNfoyBXXalKSNBJ5hSjxCcnELzkeoKVcyNVq5Kjz/rZDZnggqSzOoKEpDXZBEcU4id+Sx5Mui
RcdfmVClyWLqh8YYXhDD9MVCT/CGrBPcK5Hx62uxMdxUm2XgiT6Tep2MhxVp6NXJ6IqllKlucTc3niJl
LKqsGINMqChOY+JTnqHtwRYJdZVK5gelMJSymo9ibSAOeiPhXTid1T5cD3IvF9SqZMb7M+CznEdVCtqe
ypcurWz9bQC0ezHX6sr0M0c+lNtx5cKJcVGwXyjJlfDzvZSh1gTqdHIWBiTQHbIU7AwSg+eYa3Nnuvk4
E41HGak9gDTUmvPOZjmGGRQqExjpiuG+NouOl2InvRGi4BJ0+LPw6gwzL04x2XSM0ToHvlfZ0p66FT9X
KxxsTGwMAlVmLN3NiTzQZkJ/IrwR233tzUyLG5PPHRmrP8Sw3o4vmr30yE2RBO/Bfp9Fg/EV8tKjqSnL
oOdxGO3ZgpE2+SaaZZtpSNpCdbw56mgLbt/YhZ/L7oVD9pYuRkF2ShTZksukxwQSd813cbJc9HHm7MnD
OB2x46CdNbZWFljuNGP7NhN2mJqIuRX/YOXm30H4A70P0TsBWkcYAAAAAElFTkSuQmCC
</value>
</data>
<data name="toolStripMenuItemSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACPklE
QVQ4T6WS70uTURTH9y/03jdBL3prU2O4FqvBU66hLB2GFtKvJ9Isfy3TJEXLVHT5A7QVLp20Wk3CiUb+
AH8gJmIsJSs1l7TEoabYRDD4ds99dI9Le1MHzvPi3OfzufeeexQA/iv5p7MjAEp32xpaXat45lhGc5Mf
j6zzqKv9BkuVF/dLZ1BU+Bn5eR+Qkz2OG9c9DN0SENjbA9TWbFDxr7G+sQl9Yi/OJL7iyUISuF6ucEF5
2Q8q7hkE+5fXcdT4GkqlCFOCk8qSwPF0iQuKCr9TcVdsw198K4gwuJF3axanjS20JAlsjQtccNM8TcWQ
2Am/n/LjoOBCZsYk4mJttCwJGup9XJB+bZyKwfgTHvL4EKZ1QBRHYTBY6RdJUFM9xwXi5VEq8tgL7hn5
in3RTUg+24+YmDr6TRJUlM+iuwvsKYGUC29hOjfIu00NozvTsWlnCe5DvOkNBMEiC0qKp9DuBpsBoMX+
i737T5TeW+RNpYbRndNSPUH4VFwbdLoyWXA7fxLO58AT2yYbnAD0SRkhaTxvRtLVAgmOZfBJJ7TaYllg
zplgMFD9IMB3JkjBliLUAsY+LWBiZhFi9l0c17dyWH3MDo2mQBbQWFofInhsEhB8JbcSH71L8M6vIuuO
BZFaO4ObEXnkMdTRubIgLfUdu/cahw/onNh/SMCL9gG4u4bQ3TeCweExnDCYoNQ0IorB4aoGqFSZIYL4
SxcH+HjShNGQ0DvTU1G3qWF0Z9qVkuDDUemy4N8Tit/kKu4LI/ykxwAAAABJRU5ErkJggg==
</value>
</data>
<data name="toolStripMenuItemProperties.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAAB/klE
QVQ4T6WQ30tTUQDHz39QD0UQRlAPIkgPxh6yhCRCykGBL0WZjOytLKdl7KGHJmFYtAjH7uUWy3XvMswf
d3Ou8MdWils1ggZCRQ43lbbAwYpB4vbtnDMzrrsMw4cvB87h8/l+OQTAlqJ7ydL/7MEhGvQ9vQdZ6oLT
boVouwV7t4XFIvkFKMGB0nB23rqeX187kPl0CR/VJi5hsBh9VBo2nzuqgdPh0/gxeRhJXwWs8g3cDDSC
uH0fwKKMvIMyNI6/8DVTPT/bzh7RwAtqOWZdZWjpacZlbwOIMvIe+XweqdSCBo5HLLhqMnK4tfE4YmoV
QsIeeLp240rDXpzpPIXmfiOI7AlzAYMXo3c4PO4fpOdJzAVNXMImHyzfierK7TBU7ELlvh0Pj7XXwOSu
B+kdnsFqLo9kMo7O6xeQSMSQpZ8RDr3hktm+A6gz7IfgGoThxEX6UvgrKjAbb9eCOIemObAx6ZUcpqeC
MJ+vRWQug0B0WSNgoZJt5MnA22L4dw6LmRV8/p6l8E8Oq6FUkYCFSC8CHJKUUThcPg7bJA/uCyq6HcPr
kSeW9AXC84l/zXQ2a/7CmwuzWbNCYdGb0Bc4lLHCAtkPR6+Pw7bHdIGoXWB7GdMX2OXXtHkVS6w5WWie
XGtms0VvnMN33d/0BT2uV/xhsykSbLz4v4D8ATko6xzt+1ySAAAAAElFTkSuQmCC
</value>
</data>
<data name="toolStripMenuItemResize.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAH3SURBVDhPrZJfSFNxFMf3rBk+iIH2oOCTIAlZSGCQPqgIqQ/5tHQpPiikBpIpCnuxYkWCokQg
qDcoNYZETZAhbII0dh92DdPNvJuj4f7epWa2vOvrzg/u8uqQkA4cztPn8/uee4/mv5RxgQfN2Xkbm9zc
EpujUyY2+w0TbJ5ZBL/9sAyCx2cWMcqZYHj5Dv3PJsF/FjE8aUZrH4eWXg7Njzjoeqb+ShU4/iee7MO4
jIB0gPsDI9B2PIYkScmORCK4Vt2iTkUvH4djhzI2fbsJeBC88EUl8Hg8aoESW1bg3zKiP2JY2/qO27pe
VGu7k3A4HIbL5TqdYIybZ/DPXzLCuwcQt/exIkZR0dAF3rHKYhMcDAbhcDjUAoKfvzJC2ovhayL2+tYO
hM0o+PUIbta349adDgYGAgH4/X7Y7fbTCfQvOHTqx9DY9QS19/oSL3eirK4NlwrKMD1nZqDX62UpLBaL
WqAfeo3VjW9oevAUn/gV1Nx9iGW7wCQEp2cXsSmKIhOkTNBjMLI9lV1DoVAysvG9GWlZheCmPyIzrzy1
gI6EvrIiIQHt7fP54Ha78WbWhAvZV5CRW5paQBd2/Fed7Mz8CmTkXMfFyzdSC+g86WU6EqfTCUEQYLPZ
YLVaGXCyr1bq1AK6bbL+SxeXa1FS1awWnK80miNVQhp+0k4xYAAAAABJRU5ErkJggg==
</value>
</data>
<data name="toolStripMenuItemShowActorNames.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAGOSURBVDhPY/j//z9FGKsgKRirIAiHFm92CyjctB+bHDLGKgjCGa37/gcWbvzftvBaCDZ5GMYq
6Je/XtQ3d81/35x1/23j5r7FpgaGsQq6Zaya7Zi8fLZFzML/xgH9QNznj00dCGMVdExa9sUqdqGoWdi0
00b+ff8N/LpvYFMHwhgCrmlLE+1iF54AsU3DZ7mZhE79r+fT+U/Pp8MFXS0IYwg4Ji68ahk1WwvGNw6d
/ApowH9dz9ZdyOpgGIXjEDdX2Sp61n/DgP4Let7tVw38+67q+fV+0fFs/a9knfNX0SpLBVk9CKNwbGNm
bwT6e5+6fZGJik2ulaZThZWmW6OWpmvDfxWbApAhG5HVgzCcYRczg9s4ZNoXTecKUWQFIKzuWDEFaPt/
BYsMjCgFExbh06SMgiZt13St+eoQUvoSWYGyXUmEvFnSf2WgC1RsC/4rWqR/UDBL44bJgwl9v25RoGYt
JatMLXmTBHgAgrCSTYGoLFBMUjtQS1zTV0tSJ0hL1jgB1QBKMFZB4vF/BgBJP5kepjxMJgAAAABJRU5E
rkJggg==
</value>
</data>
<data name="toolStripMenuItemShowGrid.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAFYSURBVDhPY6AqyJt9/z+UyZA1/TacHd93Cc4OaTwJZ2MAZAPSJt+Es2M6z8PZAbVHMQ0AaQTh
7Bn3/mcAbU6fcuN/ysSr/xOBNsd2nfsf0Xr6P8hmkGafyoP/PUr3/ncp3I5pUNZUhLNBmqFMhpDm43C2
R+luTI0wALIZykRxdmDtETjbpXAnpgEgZ2cgORukOaId5OzjQGcfBjvbDeTsgu3/7XK3/rfJ3PjfMm0d
pkEozgZqhjJRnA3SDGViAlCAQZnA0D4MZzshOdsifS2mAfE9VyDOBoc2wtkgm0F+dsje+t86c9N/89R1
/02TVv03jF/x3yB6KaZByKEN8jOUieJskGYoExMEITkbObSRA0wvBpvNcGfvBycSkJ8doKFtDtRskrQa
7Gy96GX/daIW/9eKWAjGUO0IgBLa2QhnG8Uvh7OxaoQBZGdbpCJCG9nZeA0gHTAwAACOffGU2o3WzAAA
AABJRU5ErkJggg==
</value>
</data>
<data name="zoomIntoolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIiSURBVDhPpY/ta5JRGIct+hP61Oe+RR+KWBBB4cAg02ea
ewmKIEzWinIu2yDqUamslrS114qZ01m0Wol7oWXlxFVrmq5yzUk5lmyG6Zz6qKiLXz5qH3KjUbvgPodz
c37XOTeDhiTNG6a/+NhDI7Y77boB69X23mnxpc65843aVxqDi5u79DeGLU5Zm8Yw8fTZWNJk+wyTy4tO
oxXnmvTgC8lg+Snl4cLV5VSdvLapSW1499Ji/xmgEphPpOCNJuAIUDC65iBTD4JVUZ9mCWo3FyJ/YrI6
1PcMwzHfj0VQ6QwiqQyybUyF4jDPRNBjm0f1ZTV2888o8okiWjXGyaFRJwLxFGLpJVCZpZzAE0rA4l3E
Q2cQF7Qj2MkTh/OJImrlHRj1+OCNJHPB4tKP+6G4b8cegYQ+L0d2s/trz4v3sH+nMLWQgCecF73+FkX/
ZBBdVh8krYMoYdc48okiSJVO29Dcl3w+E4VlNpataE5gdIegs/mh7PuEyrpb4B0VUflEESLy9kaeUBFp
fGRB74cgnnxcwIPs3Oq3flw3unFM3g1mhQT6FuHKI9AcPHGFxTkijx+Xd+Gi1px9dQJ1bQM4JG3BXsFp
NMsIhN3KVSTVym0Nqsd3meXSsRK2OFZaVY/Kmhuz+w/skzJ3bMWbji2rS1ZgHb1wyjh8oozz35Ica5KQ
JGM9vf+W9Ku246yo9N9/QUMQxC6C4IxzuWxeobUWGIxfeWNbk9TvsLwAAAAASUVORK5CYII=
</value>
</data>
<data name="zoomOutToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIpSURBVDhPpY/da5JhGMYt+hM66riz6KCIBREUDgwyfedy
H0ERhMlaUc5lG0S9KpXVkrb2WTFzOotWK3EftKycuGpN07Vcc1KOJZthfsyvV9TF1et4OxBHo/aD+3m4
H+7reu6LlYckLZtmv/q5w6P2ex36Qdv1jr5ZyZWuhYtNujdao5u/MvQ3RqwuebvWOPn8xXjabP8Cs9uH
LpMNF5oNKBeRoYozqqPMaDHVp29sadYYP7y2On4FkxQWqQx8cQrOYBIm9wLkmiFwKhuyHGHdVkZSiNnm
1DwwjiT8P5eQzOYQy+QQTGUxE07BMhdDr30RNVc12Ft+TslICmnTmqaHx1y0KINEdhnJ3DIiVA7eMAWr
bwmPXSFc0o1it0ASZSSF1Ck6Meb1wxdLg26LyjARgPKhA/uE0nxfjPx2z7feVx/h+JHETISCN5rGFJ3/
7fc4BqZD6Lb5IW0bQgm31slICiHVel1jS3/65Vwc1vkEXXGY6dVNnjD09gBU/Z9RVX8HguPiJCMpREze
3SwQKWNNT6zo+xTCs6kIHtG5Ne8DuGny4ISiB+xKKQytotUj5Dl86hqHd0yROqnoxmWdhf51EvXtgzgi
a8V+4Vm0yAlEPao1TGpUOxrVT++zK2TjJVxJorS6AVW1t+YPHjogY+/ajned29Y2WYUN+YNXxisnynj/
bbLCukxIkrUxf/8xGVDvxHlx6b9vkYcgiD0EwZvg87kC5mk9sFi/AU2lZoSWJFHPAAAAAElFTkSuQmCC
</value>
</data>
<data name="panToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEQSURBVDhPpZE/DoJgDMWBydHR0SMY7sARSBg5AiO34Agc
g4mZkZGRxYQ4KCRGiSz1tRTiHxSMv6Sh9Ot7XynGF1amadZ4XhBrqcxhWdZeRSxukiShPM8JeYwaIT6b
sbBtWyqKgmB0QIkGhlzNziJ4BQenKIqITfDaIUTEvOY8meu6nLuIkRWiq6qK2Ai5St4NHMcRk6lpKAiC
cQrVPOWDuCxLqbPoadvIG+2dhA2YOI55goa/fdy2mkjDHL7vS8jy6rqWopqM435DL9sanudRmqZaXgb/
aohviB7btmmYYglhGEqoXNj8YoJ+3v5WlA/slphkWcYG117yzqwJln5EX9i3TyMmn8A5376Rzv8xjDs1
5wrrvlLxhgAAAABJRU5ErkJggg==
</value>
</data>
<data name="showRulerToolStripItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAEiSURBVDhPvVO7TgJBFN2fovAHNDb+gLGywsbCxoTOxF/wgaLGRPGJNUEeglBaaKExWhF8E1kh
Cwsyxzl3d83Gip3Ck5zMvTtzz97cOWPtnFVBbmcusXVaEaZOytg8vsDGUUmYPCxi/aCAtXReuLp/jpW9
HCyCxWHML6X8yEP/G2i7wEcHqH8C96/AdQOITc56AvxzAMdxMD696GfAYAgeQlMXN1rAw5uX5+9CAmyZ
YDE5NhWXnAffW11Zb1+GstYeve/ZvwILy7uYmEno4jnZGJUiwIGF8bsxKjjtADqNLsBrCmDbjrmADs06
oEmUUuj19T033egCdJg7UPjqGc6A1gycdvOkzAToNB2adcCH8WwDV3WI0yIL8FWxKEx/6z9gWT/PHGlW
lc2EywAAAABJRU5ErkJggg==
</value>
</data>
<data name="toolStripMenuItemFixOpenAreas.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAE/SURBVDhPY0ACokCsBaVhAJsYVsBvbGzsD6T/Q2l+HGI4gTwQ/wcBEA3lYxMDGQKjUQAxLpDH
ogYFIJsOY8MwjI/uIjAABRBMEQjg8jt2cSAnC00Qp01AAJOHGQoG6IpxugCIMTRjcwEIoCvGZSgYoIcB
NiBv6q79v3Rmwv+0Pv//EU32Xzwr9GqgcnCAbisIgMViGzz6G1cn/t9yZer/C892/e/fnfU/vF/3v3m2
ZA9EGVAhFifCxWLanH9uvDzh/8Zrk8Dh1bMn9X//nnSQAd+B8mAAshksCaKhfLiYT7Xh/21X5oDZMLDp
0lSQASC1YIDXBRbZ0j+7dyX9b9+VANbcvjMB7AKzLIkfQHk4wBkGJqni3cE9Gv97d6WAbQbRIL5xivhU
iDIiANC5HUD8CeRsoM1fjJPFJzEwMDAAAD8wxIeEhxEyAAAAAElFTkSuQmCC
</value>
</data>
<data name="toolStripMenuItemSetupDefaultPlayers.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAD0SURBVDhPY0AD/9FoogEuDaQZdCzROe5YsvOJwwnODw7EO1S7KomLQaXwArAtIM33WrNef1ra
/f9NT/7/U/H2X9f6mXeCVRDjEpDNIM0/N876/3FS8f9byTb/Fzhp34ZK4wVg00HOBtkM0vyiKvT/1WDN
/z3G8q/AKohxAcjPIGeDbAZpXmch9mteYfb/Gct2EhWQ/0EBBvIzyNkgm8t8A/9X10/6DwLEGoICXCKK
/vfP2fr/2p1nJBkCUwSmHUMLwIZcv/ucJENQAMyQG3coMMQprBBsyO17T8k3xNgj+b9rZBF1DAFhqBDp
AGQIlEkNwMAAAP7JtzLCVbRNAAAAAElFTkSuQmCC
</value>
</data>
<data name="eraserToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAD2SURBVDhPY6ApmLlqNz+Irmqd/H/aqpP/S3s2/W+etuM/
SKy8YxVYDidA1gwDv37/+X/i4sP/xR1rwYbgBNg0//z15/+9px/+3370HmxI7cQN2A3Bpfn1+29wA0Ag
o2YmpgHEam6buvm/V1wVqgGkaMYwgCLNMECqZpe0crClYACKYxggWTMIzFx7+v/zN1/+P3z+8f+7j99J
0wwCzTN2/992+Ob/tXuv/j9w5j5Q8zu45saJy/FrhoGs+nn/SzsW/58FdM3s9Wf+L9l8/P+MZTuxBxg6
SCufCTc5Jq/tf0r5hP9xhZ0gjcRgBAhN68DtRNoABgYAAoqNFseCkuMAAAAASUVORK5CYII=
</value>
</data>
<data name="toolStripMenuItemCopySelection.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAJVSURBVDhPpZPdS5NhGMZ3LKJ/gzsrHg3sIFsm5A46cC3ImmnWOy0/lrMtpdbct5tbH5Op6eZH
6lrvtOYqTTdxrUyCTgoKlSwiAjHICAOro7VdPe+7aRSyhC64eeDhvn73/b4Xj+BvRcc8WRPDphKnUYG2
iwxam07AY6sqsTVXZKVa0itypyeHQrD63LhZ1MxVTqolvSZZF5ke7dwKQFIt6RUYvJLD9tm3AmxvA2rO
uO+1iv0ey6a52yIX0zMj1fJvsb02srEFB7Coy7a3/obYXjsPSLzVQlt3GNp6aXrAk4nBzEf3+oWRQA8J
+ztIcOiq1N/rQGKpCecZMTrN9VK2x0R8XQbi7dAJh10tmSmrQPD4bl/2s7CXmR0fBI0Q4ZEOTPraMe67
huCAA4EbbRj1tIJ1m0EBoADc6tIzbrs6CaFTc7ncvy3PAGtzfCW+zCL+OYqfn2YQ+xhCfDWyeb8yH8B1
ayOc+hohD5hiXYVc7rx5qRnxhUboa/OhO50HrXwnWqoJjA17EV9UIfayHu8eHIW+4QgMytLkfxkbsBfe
9lgRW5nC+sMSrE0dwPe5UhgUeyhoN3RnduHHUxnWoxJ8DRXjVX8+lBVFUJ0sTgL8bksul/nyCx/mhwqw
eHM/PkSq8H66EsrjO/AmKMHrETEWvCLeHGrLg0ImwtmyfclP8HWbsv1uU3W7vg4ODcOXjT4gmj2/qqb2
EJrkB3GuspifzJnV5QWM4pjodxKdZmWmU1cjvHypitgvnCIUQMwqGaEAoqmREAogFEAayosIN/kP8/9J
IPgFAlSB3U6URz4AAAAASUVORK5CYII=
</value>
</data>
<data name="QuickhelpToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIVSURBVDhPtVJNaxNRFM1PyE+Yn1AUXLjK0uWgDWQZwUUX
KsGFBEEcCkIwqBEpGiydsSo2kupsasdo7Yi2toh0sFZjG5JpiZo20/TpVOmH5njvm8BYahEXHji8+968
c+55l4n8F0zM+rhVWkHmdg29A/PoK1Yw8uIjOp/3xpvqBgrjLeilZbjNLXxZ34bwt6jexMVCGRndQenl
0p+NWHzPXoP3rQ3bAbQhQM0E5Np2BKprbZzrm8TIs8puE+68+r0NwwZiacCwALEBCVcAqet8JlAjk1PZ
JzsNJt6u4+FMS3ZmMV9mmFNAMhesbBZLC6oFdOsd8oVXocmdx018Ej9k1FgqiJ0zgS6qlR6BVI4iEFRN
IJlxMF/1cfTMcGiQvbskB6ZqgairJ6BCTJKYu9tlAUW1oSRsNDwfB+JXQ4PzN6s07W0ZPxDS5aSgJEFn
06Y9CaOqSauJRvMr9qmXQ4P8/RoWvU16eyBUEq5kbigwiKoOMTBQ0zbKlTq6TxihwejkZ1iOJwfEwmiC
BQ49yaW50J7Fh0xJw3IxbM3hwo2x0ICRHZzFgveTunYERK5lgo5YMxx8WPFw5Li+U8wYm66jNz+Naov+
Beqiao58N5NrPluoryJO0QeKU7sNGKPPazh9aRzGo/eYmVvEMk270fTlmzl2N3XW9xL/jv7iaxw7+wAH
E9ew//AVxE8OItv/9O/Cf0ck8gud2vKswuxNZgAAAABJRU5ErkJggg==
</value>
</data>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>198, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="newToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHNSURBVDhPjZNdTxNREIb5LV54azSRxJ8gt95445XGa/8A
CU0MMVgIWNmgRSioGN0AapQaISAWrEaITQTkQyhL2WbbWtt1+7ll+7h7SDdBocskk3Mm58xzZt7JaWmx
bTdyk9/rPsz0fbYmz2JqfvSdHhJLPpxzTzMUid13F0D3k/h41V57iU+dI7/dfTqA8zKGBLUohjpurxER
7/24i/RkSnj/47csLsWOB27IZ1DmrlDQJrHIU8q8EbE63UrD7oVe09p243iIqEAPQGVOQJxKRJwfdgE9
gxO8X1wRkIWv/1Ri7A0QD5/HSrWT/HTNTgwIDapayAV0DTwXyQ0/IqwSvXU4hWQn6uwl4usPKCl9pGI+
F2DV6zwaX2BQjgjIiZPpHXrpJjU2di7lao2sXmLiwwYXL18/GeB/KP8HqJgH5Iwy++k/yDOrzQF3+p8d
AZi1A/RCleQvg81ElrHwt+aA232jLqBmWRjFKlq2wM/9HLGtFCOvPjcHdHQPCYBl1SmWTdK5IvFknu/b
GaIrKsEX880B7V1B6rZq5cqhaIqms7aT4cuqyuyygvR0xhvgiOao7Qjm9Byyyw7K80hj0wRGw94tOGPy
cs8fetoLfwGP5fd9L1vD4gAAAABJRU5ErkJggg==
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHPSURBVDhPpZFNTxNRFIb7W1y4NZpI4k/QrRs3rjSu/QMk
NjHGYCFgYYIWsaJidAKoUWqEgFiwGjE2ERREKEOZZtpa23H6OWX6OHN7CQaxNfFNTm5Oct7nnvten6fN
6AV+rPixM/2sTRzGNgKYGz0kF/2IgXayNIXNF8fADJB8fcY9e0lMHqGw3v1vAO9mLAXqMSx9zD2jot/6
cg3l3qSogbvPWViMHwxcVQ+hzZ6maEzgUKCcfSZ6faqDXV0PP6Xj1PmDIWIDMwjVWQHxNhF94ba0Q8/Q
OC8XlgRk/v0+iLU1SCJyFCfdSerNWdcYFBnUjLC0Q9fgQ2HeLWltSotdbP5C6gr6zAkSKzcoa32k435p
B6fR4NbYPENq9E/A7+odfiwte3K9VGp1cmaZ8VerHD957u+AwE1V2vZUtXfIWxW2Mz9Rp5dbA64OPJC2
puz6DmaxRuq7xddkjtHIx9aAy30j0up+huNglWoYuSLftvPE19LcefK2NeBS97AwO06DUsUmky+RSBX4
tJ4ltqQTejTXGtDZFXJDa1CpNkPTDJPPG1neLevMfNBQ7k+3B3iheWl7gXlvDrtrh9Q5lNEpgiOR9k/w
BtqVHP9f+Xy/AI/l932QyhfPAAAAAElFTkSuQmCC
</value>
</data>
<data name="openToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACeklE
QVQ4T6WTWUiUURiG/4suurJIjUIwskQsEANDqosQpUVNKbdCSRPKrQVDMddmXEedGdcpFXNGnUYdrSzF
sEIoFInQcqHE1CwoKsXUUMnt6Z+RLMtA8OK5OZz3Oe/5OEcAhPWwpnBaodZZmqfjWmY5GSo98XJNwq9D
1yQIilLhFaYIMIQuxZaZJ4uy6FS1T2BUIUKdNsdPhL9pqpEp/ne18PiiE94RCjzDco0C+rs1zIzXGvkx
pmNuRI2+XEG9NjV5NYlXuBLP0DzcQwoQaiuUTI9VrQgvfC5irjeSqrJMKovTURcmU5KbxE15HAWyGNH5
e/BCtSab6a+a5ZMXxTD9cdAbsir/CG6Xyvj+qcRY2xBurss28lCfRYNOxr3KdPTqFHQlUspV17mVl0Cx
Mg5VdqyxjVBZks7k+3wMtYdaJdRXKVkYksJw6kreiWuD8dAXBa8j6Krx5UqwR4WgVqUwMZAJH+Tcr1bQ
/ki+tOnPK7wKhA5v5tvcmHnsxNsKOy6ePTohCvYKpXkSvr2RMtyWSL1OzuKgBHpClwRdwWLwNPPtHsy0
HGGy6RCjdfuQhllzxsUs1zBMoUiZyGh3LHe02XQ+E5v0RYqC89AZwOLzk8w+Pc5U82HG6h34Um1LR9pm
/N2scLAxsTEKVFlx9LQkcVebBQNJ8FKs+8KH2VZ3pp44Md7gyIjejo+a3fTKTZGE7MJ+j0Xj8lPOz4ih
tjyT3gfhdOQIy7TLN9Ai20hj8iZqEsxRx1hw4+oO/F13LjraW7ouC3JSo8mRXCAjNoj4y36GyXLO14VT
xw7gfNCO/XbW2FpZYLndjK1bTNhmarLyIa3nKxuyPwG9D9E7Fbto+QAAAABJRU5ErkJggg==
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACeUlE
QVQ4T6WSWUiUURiG/4suurJIjUIwskQsEAMjqosQpUVNKbdCSRPKrQVDMddmXEedGdcpFXNGnUYdrSzF
sEIoFInQcqHE1CwoKsXUUMnt6XfEye0munjgnO+c9+HjO0cA/osNi2tJLdA6SXN13MwoI12lJ06uiV8+
W3d5IwIjVXiGKvwX11djSs2TRFlUito7ILIAoVab7SvCWhqrZYq1omXC4gpPe4Ur8AjNMQjo69IwPVZj
4PeojtlhNfoyBXXalKSNBJ5hSjxCcnELzkeoKVcyNVq5Kjz/rZDZnggqSzOoKEpDXZBEcU4id+Sx5Mui
RcdfmVClyWLqh8YYXhDD9MVCT/CGrBPcK5Hx62uxMdxUm2XgiT6Tep2MhxVp6NXJ6IqllKlucTc3niJl
LKqsGINMqChOY+JTnqHtwRYJdZVK5gelMJSymo9ibSAOeiPhXTid1T5cD3IvF9SqZMb7M+CznEdVCtqe
ypcurWz9bQC0ezHX6sr0M0c+lNtx5cKJcVGwXyjJlfDzvZSh1gTqdHIWBiTQHbIU7AwSg+eYa3Nnuvk4
E41HGak9gDTUmvPOZjmGGRQqExjpiuG+NouOl2InvRGi4BJ0+LPw6gwzL04x2XSM0ToHvlfZ0p66FT9X
KxxsTGwMAlVmLN3NiTzQZkJ/IrwR233tzUyLG5PPHRmrP8Sw3o4vmr30yE2RBO/Bfp9Fg/EV8tKjqSnL
oOdxGO3ZgpE2+SaaZZtpSNpCdbw56mgLbt/YhZ/L7oVD9pYuRkF2ShTZksukxwQSd813cbJc9HHm7MnD
OB2x46CdNbZWFljuNGP7NhN2mJqIuRX/YOXm30H4A70P0TsBWkcYAAAAAElFTkSuQmCC
</value>
</data>
<data name="saveToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACMklE
QVQ4T6WT3UuTcRTH9y90303QRbc1NYZrMRs86hzKsmFoIb09kqZpunxJUqxMxZYvkK1w6sTlahJOKvIF
TJEUMZaSlZkrWuJQU3QiGHz7nZ+wn0vrQh84Nw98Puc553wfBQDFXorDL18EQOXuXEGHaxlPHItoafbj
kXUW9XU/YLnnxd3yaZSWfEZR4Qfk5Y7japaHoVBwAYF9vUBd7Tq9/Oeztr4BfVIfTic95xUUuJ4tcUFl
xa//wv7FNRw3voJSKcN0yikEjrYFLigt+bmjgDoT/NW3hDCDG4UFMzhpbBUCW+McF1w3f9km2Aq/n/Lj
kORCTvYkEuJtQtDwwMcFmVfGQwR/w0MeH/ZrHZDlURgMViGorfnOBfKl0aBgJ7h35Bv2RTYj5cwbxMbW
C0FV5Qx6usFOCaSeH4bp7CDfNi2MZqbPps6bcD8STa8hSRYhuFU2hS43WAaAVvtvdvdVlN+Z50ulhdHM
GemeIByX0AmdrkIIbhRNwtkONNk2WHAC0Cdnh5TxnBnJl4t557h4Bsc4odWWCYE5b4LBQM39AO9MAgXL
WJhawtinOUxMz0POvY0T+g4Oq6Ps0GiKhYBiaX2I4GeTgOC0/Gp89C7AO7uMazctCNfaGdyC8GOPoY7M
F4KM9Hds7hU+80GdEweOSHjaNQB39xB6+kcw+HYM0QYTlJpGRDD4sKoBKlVOiCDx4oUBHk9KGIWE7kyn
om3Twmhm6kpF8NGITCGgn2K39QfkKu4LIHJHnwAAAABJRU5ErkJggg==
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACPklE
QVQ4T6WS70uTURTH9y/03jdBL3prU2O4FqvBU66hLB2GFtKvJ9Isfy3TJEXLVHT5A7QVLp20Wk3CiUb+
AH8gJmIsJSs1l7TEoabYRDD4ds99dI9Le1MHzvPi3OfzufeeexQA/iv5p7MjAEp32xpaXat45lhGc5Mf
j6zzqKv9BkuVF/dLZ1BU+Bn5eR+Qkz2OG9c9DN0SENjbA9TWbFDxr7G+sQl9Yi/OJL7iyUISuF6ucEF5
2Q8q7hkE+5fXcdT4GkqlCFOCk8qSwPF0iQuKCr9TcVdsw198K4gwuJF3axanjS20JAlsjQtccNM8TcWQ
2Am/n/LjoOBCZsYk4mJttCwJGup9XJB+bZyKwfgTHvL4EKZ1QBRHYTBY6RdJUFM9xwXi5VEq8tgL7hn5
in3RTUg+24+YmDr6TRJUlM+iuwvsKYGUC29hOjfIu00NozvTsWlnCe5DvOkNBMEiC0qKp9DuBpsBoMX+
i737T5TeW+RNpYbRndNSPUH4VFwbdLoyWXA7fxLO58AT2yYbnAD0SRkhaTxvRtLVAgmOZfBJJ7TaYllg
zplgMFD9IMB3JkjBliLUAsY+LWBiZhFi9l0c17dyWH3MDo2mQBbQWFofInhsEhB8JbcSH71L8M6vIuuO
BZFaO4ObEXnkMdTRubIgLfUdu/cahw/onNh/SMCL9gG4u4bQ3TeCweExnDCYoNQ0IorB4aoGqFSZIYL4
SxcH+HjShNGQ0DvTU1G3qWF0Z9qVkuDDUemy4N8Tit/kKu4LI/ykxwAAAABJRU5ErkJggg==
</value>
</data>
<data name="saveAsToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABh0RVh0U29m
dHdhcmUAUGFpbnQuTkVUIHYyLjY0giIQKQAAAuxJREFUOE+Vk2lIlFEUho/1x6XUSiVBgqQQosgy0VRy
NxlcskSlQsUkcpd0bFxScy3Lbai0UMfGHJdRc5/QwEpaQFBrSEz9kUtqbqWmlYRv1+v8KPpTLxw4fPc+
z+Xcy0f/Eze3gwQMkDgxjRCfAAQFqVb+Id7exrS6GkNpWQepIE/447m4EIiKmueLivYVamtdpZbmZWpv
X6SmxgWqrZmlCuk0lZVOUGGBkmSyDjIzUyOFwguACPniTFSlpmdxmBXaWlfQ+GgJDQ2fUV01h3LJNIqL
PuK2eAw5Nz4gJaUBnZ0uDE5AT48fdHS3iIFmYqd+3TgZDfXreNK5xjb8ndHxl+jqcmedCP39PjAy0ryq
VIaSQGBPVF+3yOoL6uRraG5a2iR+y8zsLORyU9aJWIXA0NAEG2Nra2/j45OscoEqH86jtuY7ams/cWgj
6+vsvge7mXgDToTyjSf0d+/DWb82LtDS0uc8ScpmqLRkms29Aql0bJNm6VM+Q+NNC9YJ0dvrAQdXZ9id
6oafr1wlMOA83SuepKK7E6h4sASJZGiTZsnOy0L1FRNMFVnhpLMZEot6YOr6GGe8pH8KxIUTlHtrFK9f
AXn5U7C0a4O5Yyf09sexjYasDLD1qAR7beUICngBgeAeF2hqqkZgT0SZGSNQtIO9BFBasob83EVkZ01D
KBxGdNQAoiP6cP7cU7ifVsDFRawS6HGerqWOUFLiILtE4H4xEBxRjsO2DjB39kRIQjYikzPhcyENbh4d
cBLUw94+hws0NHZxnuJF70kY+w6SMiA35xvCYuqxfaceDhxzwPJPYHxuBb7B12FlL4e1oww2JzJUgp2c
p5jLAxQV+ZafHh47hkOOIoSLklBS04Lh0UkMjgzB0T0MR6xlMLORwtIqmQvU1XdwniLC+ig8tN85IqwH
3j6NsHMpREBgBS5eqkRgYAn8/e/A2iYOVjbpOM5gS4sYlUCX86Srs4f9ovzbP8fY2InU1LawjugX1Iz1
h1pVBKcAAAAASUVORK5CYII=
</value>
</data>
<data name="cCRedAlertMapToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -221,85 +455,382 @@
XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS
fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+
tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/
6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAN5JREFUOE+FUwEOAyEI
8+k+7X7GoFBWmZdtISYgtS3csrXsFtvzf2Mv8/8d4Hkec2SLM+IHzJsjdwVAcxQrtl8OsDgBxPMGgKJG
SQkwMlI2zSCS+cuL0YCceHEDAcBbM6gTQOhDDpnBxHqVOsmgdYvmfCxk7q+JpDZN4yQOJhOAOtmslGna
MYE3AN2HeBEmyvhYZ44mL5rRXkijgoAZAA3nCVBzbzM5vuE8x8xmbGIzqE1LkNwHOO2RZmZOjQYTjoWF
g/YYr+qn2QBQSl2ofL8oC6Wb2hIOM8WD+bXOex/mMAFDkP1eQgAAAABJRU5ErkJggg==
6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAANZJREFUOE+NUAkOwyAM
4+k8rT9jthMHyqJpSG4gPkgZa4zVYf6DCXtnJp7nWdioEp2ZtQ2QGXUkKEajTFXJ22SIPMEewCCG3NNU
AA+xQqibD05inq8QBUio9TZzggrwNOxBoz2gABtFpMC3yWhzIvpzB1jMqtszRI+ZIdS1AWpwkyhhE/Iz
4ATF5ySewBx74gEFVAiIL1Hud3+pvgPQKGGKbTAfHNc27wCAxC3UfwLxDtGj2ZMR8QYHYTKCNmywFp89
gUyJIi6YP0OkKyIBpiDx3UvEeawP5jABQ7IsMkAAAAAASUVORK5CYII=
</value>
</data>
<data name="bitmapToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<data name="toolStripMenuItem1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACR0lE
QVQ4T6WTXUiTARSGdxkRRBdB0IUREV1EKRFEYYuQAklL8sKQfphUoJSUWJbLxAVZWqyBio5WajorM1PL
xExUlLQfbU5n0lygRerMP/qxOZ92vpjfCKLAi3P5Puc957xHA2gWUoo49147gWUqbSPrdjOXChrQm56S
lFVFvKEcXaqV2OQiohMt7Esw+6Ro5gGeWfhbff0BY9NzDI3N0f/JS6fLy7rd6f8HcNsdOI6EYD8cjK3V
roiLawdYu+vivwHSWcQM1THz/DQv96+ixeHlVvU71oQFAGTmP+37bdsPBf8WZ4fRFhVEXdcsBQ9srN6Z
pjqQhQUCAmcW29JZxA8fvaWyY5YcawdBOy6oANm2H9A3MMypDLNS7b1flJnFtnQWcVmrB2NhMytD9SpA
TiUA5+CYInQOjWPrH2V7RBzmijdo9x5VKr+yj6ImD9nmelZsS1UBcme/+OPIJIOfv/Gi201ZXQ/hMfFU
Peuktqnbd3QN+U/cXM6tYfmW8ypAQiKdh91TTE7PYHNOYKl6z916F3m+eSNjT1B4vxHjzWoFYrhRwbLN
51SAJOynx8vo5Ay9rimKHzu5XtJDpuU1WZY2Eg1WgrXRJOpNxKdcUyBLN6WoAInnyPh3XvW6KW/4MC9O
z2ki+Wo1CWklROkMCiT8wEm0kXEsCTmrAiTbDtcEpTVdZOS1oDfWk5xZ6RPeQZeUR8zxK0Qe1BO65xjr
t0YotXhjAEAeQ7It8ZSESUjkznIq2bYsTGYW29JZxIs2nFEdLOSdfwFwpvLxRKIY2AAAAABJRU5ErkJg
gg==
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALOSURBVDhPfZPdS1NhHMdPWKREEhWE3fRXFBHUXS9ahnZV
kV2UvVx5UUQXZmnLJc5ZvmRN2YVhdBGsFxqjFU4jaIavIxWNHXWbb2c7U7c8m+n2yfO00hX0gS8858fv
931+z3N+j7SeJEn6An00f2nG2mul4kMF123XufbiGk0dTYwHx4n/iJNKT2dqYYr6z/W0DbahLCusJFaE
dHTj7oluDG8MmB1mIlok3USJKhhdRnzffaLgf7i+umh0NKZ3Yuo0IUfkVMoa7XI7tiFb6mu1k2SSxI8E
9q63XHpySXQojcyO0NxjSaWsoWoqe2r3kFGWgf2bPRWFaDSKFtE4Yz6NZ8KDZHbVIMf/3V3nmecZUqnE
1sqtdIx3iFgsFmNOncM94CavMhdJv+XfJJIJtBWN+HJcSL+8hq4GNpVuIseU88ckqATxjfs4db8QqaCu
QAR1+qf72f9oP3ste4X2WfZxoOUA2cZs0cmWu1twjDpYnF8kPBOm5EkJ0nFTHrGlmDBwB9zsMu5ie/V2
dlTvYGf1TnbX7CazMhPptsSGWxuwdFmIhqOEJlVKHq8anDIX0jncKQxiyzFGw6N4w16hycgkLT0tZN3J
YnP5Zp4OPIVlCAQC9Hr6KKotQjLY7nKj7YYw+Bun18m2e9vYWLaR1v5WEdPPPzE2wav2l+Qb85G8s14O
lR3Er/pJJBJCOtPRabIrV89+U8LabdXHkVAohCzL+L1+Lj64gOlV9a9humK5TJWtSvyihYUFtEWNpfgS
5e3l1H6qhfjqzsEg8pjM2Lcxnjuec7Ti8NpIq1GVs3VnqH9TjzavMReaIxwMoyoqISVEwB8Qbfu8Pl67
XnOk4ggfhzrT38Ps/CznG89T3FCM0/2OweFBpv0zKH5FrJ2fnJRaS8k1HMPe8za9eD3vPe+52nyVogfn
yDecIK88l5P38iluKqbO/pBgJLiuWJJ+AqhM3amQCvIQAAAAAElFTkSuQmCC
</value>
</data>
<data name="mnuMinimapToPNG.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACR0lE
QVQ4T6WTXUiTARSGdxkRRBdB0IUREV1EKRFEYYuQAklL8sKQfphUoJSUWJbLxAVZWqyBio5WajorM1PL
xExUlLQfbU5n0lygRerMP/qxOZ92vpjfCKLAi3P5Puc957xHA2gWUoo49147gWUqbSPrdjOXChrQm56S
lFVFvKEcXaqV2OQiohMt7Esw+6Ro5gGeWfhbff0BY9NzDI3N0f/JS6fLy7rd6f8HcNsdOI6EYD8cjK3V
roiLawdYu+vivwHSWcQM1THz/DQv96+ixeHlVvU71oQFAGTmP+37bdsPBf8WZ4fRFhVEXdcsBQ9srN6Z
pjqQhQUCAmcW29JZxA8fvaWyY5YcawdBOy6oANm2H9A3MMypDLNS7b1flJnFtnQWcVmrB2NhMytD9SpA
TiUA5+CYInQOjWPrH2V7RBzmijdo9x5VKr+yj6ImD9nmelZsS1UBcme/+OPIJIOfv/Gi201ZXQ/hMfFU
Peuktqnbd3QN+U/cXM6tYfmW8ypAQiKdh91TTE7PYHNOYKl6z916F3m+eSNjT1B4vxHjzWoFYrhRwbLN
51SAJOynx8vo5Ay9rimKHzu5XtJDpuU1WZY2Eg1WgrXRJOpNxKdcUyBLN6WoAInnyPh3XvW6KW/4MC9O
z2ki+Wo1CWklROkMCiT8wEm0kXEsCTmrAiTbDtcEpTVdZOS1oDfWk5xZ6RPeQZeUR8zxK0Qe1BO65xjr
t0YotXhjAEAeQ7It8ZSESUjkznIq2bYsTGYW29JZxIs2nFEdLOSdfwFwpvLxRKIY2AAAAABJRU5ErkJg
gg==
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsNAAALDQHtB8AsAAAB+UlE
QVQ4T6WRX0hTYRjGve0iiAq6CovsphHWRaXrogshbEIgiEzbjFLQq266WZG76I8kRIRtIZJhW2NOq5Ga
uTkbrmZzf2gyTY8ipIwlYkJIIZP563xHZhtbF9YDz3l53vO9v/N93ykA/svKo883w5vRaZzeKV6NxOh1
R+keimB7G8TaF6DL6afzpY+OHi/tdg9PbG5M1iF5NAOwU53WNIiyBRBfFvpmbGJeX0bk3FFsxQdgc/OP
ZYnya30Dly+aDegdnhCBGV0ZX8+r8JwppPXIbqWXqeRGisTKmnwEVzbAPhgWgeGSw4yWHsJyfD/Gwl1K
b3ZZwuxro8nRwE2rAU90TDl/FkBclNBT1T7aj+1VhtOA+wN36ZFsNIcMXLbrqL1VqwBOXagXr7cAz15/
ECGvah5Wc3u8GV3/JSpM5aj1pbmADsd7EfKq7o6Oxu56Kswa1DfOojVocwHiv6aVkq/aE17F5Iyznkzx
6YufymsXOVFVTPX1KryxAOYXrmzAY8s7EbaHVXUhtMYwLc8l1n4mFS8u/WBqfoXI9FLuDtIAMVxUE+SR
I4W6McRJ/QAtXRJzi6vMLnwnKi3z8XMcsT4vYI/Gz9V7KXkHkxRVDnKw3ELJlX7cgThjEwnGYwlGggt/
B4ia6TbZDzqze2nnAERjp94G/Lsp+A2CB/zdurHUfAAAAABJRU5ErkJggg==
</value>
</data>
<data name="fullMapRenderToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsNAAALDQHtB8AsAAACRElE
QVQ4T6WTXUiTcRSHdxkRRBdB0IUREV1ETSKIwoyQAsmV5IUhfaBUoJSUWJbLxAVZWixBRUcrNT8qM1PL
hpmoKGkf2pzOpLlAi9QtndKHzfm084a9uzCKujjv1Z7n/M85v2mA/yrlk3eng8DKKWsn62YLFwob0ec8
JimrhnhDJbGp5cQkFxOVaGZPgsmPBgi8M/y2Pn8D99Qsw+5ZBj746HL6WLMz/e8ELpsd+6FgbAe1WNts
ClxSP8jqHef/LJDOAjNsYfrpSZ7vXUGr3ceN2jesCgsQyMzzwfJs2wHtTzg7jPbIICzdMxTes7Jye5oq
kIXNB8vM8mzpLPD9B6+p7pwht7yToG3nVIFsew7uHxzhRIZJqY6+T8rM8mzpLHBFmxdjUQvLQ/SqQE4l
sGPIrYCO4XGsA2NsjYjDVPWK0N2HlSqo7qe42Uu2qYFlW1JVgdx5Dn4/6mHo4xee9biosPQSHh1PzZMu
6pt7/L/WUPDIxcW8OpZuOqsKJCQCj7gm8UxNY3VMYK55y+0GJ/n+eXUxxyi624Txeq0iMVyrYsnGM6pA
Evbd62PMM02fc5KShw6ulvaSaX5JlrmdREM52tAoEvU5xKdcUSSLN6SoAonn6PhXXvS5qGx89wtOz20m
+XItCWmlRMYaFEn4vuOE6uJYFHxaFUi27c4Jyuq6ychvRW9sIDmz2g/eIjYpn+ijl9Dt1xOy6whrN0co
tXB9gED+GJJtiackTEIid5ZTybZlYTKzPFs6C7xg3SlV8O+F5gdwpvLxKZ4mxAAAAABJRU5ErkJggg==
</value>
</data>
<data name="mnuExport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALTSURBVDhPdZJbbIthGMd77caFuHDhRkhwIdwhEXHIIhO2
kDiFTIYEsYkhs5DIxIYYY6fuvAljmaHWnbANOxjbugN2ajtVrbZbv21fuyrr168/XzunCv+b932f5/n9
87zP+6r+VoPOQa7WiLraQnaVjUtlQ1wr66auVc+Pkv+r+ImZu60Oeq3fGP8iMenxM+72obeI3Kl9S0p+
4/9NMqpM9FvdSHKAQIAwBY+SX8bqEDmSXE7pw9fhRvm1Jro+uRUwnBz4IPDR5gqLu1wiW4/k8PzN8G+T
vJqBsCJZ2XcP2Vm5t5K1sQ8x212huCTJ+Ka99PYb2LD/xoxBTmUPRqsYKggq6NNncBAVX8fSqCou5HUy
6f76IwuiKPJlSiAhtZzM289RXSx4gV+WQ8lgF4MmgV2J9SyMvE/SzTY+j7kYm/Rid3qwCx48nikE5ygF
5Q0cPHcb1anrT3+1b7RMEJ1QxfIdWjYfq2dHopbdSbVsP11NZJyGTUcrlUEKiBNjNDV3setEIar4K3VM
+/whg1dvrSzeXsqKnRo2x9Wy5kAFS5Tzoqhi5kXkM2ddBgazA9eEg5dtOrbF5aGKPn6L98qdgwoa1bQZ
WLbzFnPXqzmT9RLdoJ22PiuNHWaausyMCU5sVjP3NE3sSShClaxupPhRR8jgp6pb9MyPVLMgIpsiTS8+
n0xAmZPk+4btswWbxcTJlDJS8+pnXuJYigZxyhuC/X4ptGpbDMxelcas1WkMm0bxelwKbGVwSE9TSwdb
lL8QgoPKvNNMcnYNsiwhTc9MmoCfksc9ZJW34xQE7ApsNI7wolXH7uNqKup04b8xPqWCc9cf4By18dUz
zpQo4HWP454YxWFT2lbu/a5/gENnC7la9Cwc/qnD5++xISady7laml91MzJiRD+sp72zl/TCx2zcn861
koZ/w38qvbSRfadLWK+YRcTeJCaplMS0R/8AVarvzz+nF884LWEAAAAASUVORK5CYII=
</value>
</data>
<data name="exitToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMVSURBVDhPZZOLT9N3FMX7vy1ZhiKttEh5zrpWJjgjsFF0
bGN0gmFzD7PF6AAlbDHLQghzBYuOltLW0lJmqVBaZ1sBBcOjtOIqfX12W0ic4SS//B753XPPufd8Ff9H
bm+Pbf88kf5BQj29BL+6jP9iJ/PfXGXN8YBcOs3Br4eRz+V4Zh4n9vUV4kODJAZvEv/uB5bbO/DpGrDV
6gkP3SafzR4mKXSOXO9jo+9n8gszsOgF8yiZH6+xefELYudaWdCfwX6iDs9nJtIvd98mWRkeYetmPzwP
8jrg4NXwbdLyvmPqZrXVyOIHHzJTUY2v/hQ2dRWezm7I5/dJ4otLRLp7IOrnpdeGX57npChmNLL6sZFA
7UlcJw087P0eh+40zspaLMc0REfu7BOEbgywLR1zITfRaz+xEQiSiMbwftSC44iKaW09a1MOCgjd+oUp
VQW2ci2T+sZ9KzMt7aT++B0mRkj2XyflEf8iL/n4H9xtn7JudxaLE745/I3ncGq0RRt3VdriZhTuhrNk
xW9u4AZxUxdPm1tZHx4lK4PNZ3PkpXjDZufvej0z0t0lFooE5VVECjZc7zeQ6Opmp8vE6idGHqqrcdXo
2AmHi52zmQy+C59je6cEz4kanHJNHhA8kUYK55nzPG5qZqWljUDdKZzVOqKSh4z4Sy4Eye7KPbbMbEcn
thKZiaaK+zKDcWUlkVEziqWBIZFVz5Khkfnzbaw9kBwINu5PMler48m3V8m92iW1HSfcd0sGWImlTMNd
TQ1bjxZR/Lv+AmudAY+QhEw9ZBIJNq1TzMr63EdVuI8oCX55Sb7v8MLh5J5SzZ/vleHpMJHbO4j2iuUv
JkrL8er0BCS6XgmOU1mBW1uHS63FXqZmVjLhPN3EWOlxxtU1bM7536Qxm0oR/vU3xkqUTMrPdimarqzG
XlHFlKzNqhbZosZcUsadUjXLYxOHz0SB5JnVjs1wViSqJG3lTIgKixCajx5n9N1jWA1NPLdNk5PNHJS9
jUKA0skkq/es+C5fYbq5HUfLBWYv9fLUbOH15tabM1CEQvEf0mmgVGzBvO0AAAAASUVORK5CYII=
</value>
</data>
<data name="propertiesToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACCklE
QVQ4T6WT30tTUQDHz39QD0UQSpAPIkgPyR60AiUiyoGBL4qZjOyt0tZP9tBDk1AsXIhj93ILdd27DPPH
3VwrUrdK2ioJHAgVOdoPaQsarBg43L6ec+akuRsEPnw5D4fP5/vlXg4BQHaSf8LjjwdqaTA2cg+y1Ith
qxmi5Tas/SYWk+QRoPgmtNsLcPq7GYX8+XoTqaUL+KR2cAmDxeBgqeBv2NhWzwUFOBk4g5/zRxB3V8Es
38AtbzuIw/0RLMrMeyhTs2CzGdRtaOTn1dajvLkAR9VKLNvLcHmoExddzSDKzAfkcjkkEtEiOLxoQpdB
z+Er7ScQUg/DL5TD2bsfl5oPoKWnCZ3jehDZGeAC1hwL3uXNs55Jep7Gis/AJWxyTeVe1FXvhq5qH6oP
7nlw/NoxGByNIKPT77CezSEeD6Pn+jlEIiGk6X8N+F9zyfLYIZzUVUCwT0J36jy9yX83KjDq7zSADE8t
cGB7kpksFt76YDzbgMWVFLzBX0WCTcku8mjiTSm8lkUslcHnH2kK/+aw6k+UCJiESE+9XCApz2Gzu5Gk
sEVy4r6got82vRV5blVbIDyZ21rAZrPmL7w5P5s1KxQWXRFtgU15lV8ge2AbdXPY8pAuEIsXWJ6FtAVW
+SWSmXWssuZ4vnl+s5nNFl1hMLjP8U1bMGR/wS/+N9tf7o6eMpNtADko6xybtEXLAAAAAElFTkSuQmCC
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAAB/klE
QVQ4T6WQ30tTUQDHz39QD0UQRlAPIkgPxh6yhCRCykGBL0WZjOytLKdl7KGHJmFYtAjH7uUWy3XvMswf
d3Ou8MdWils1ggZCRQ43lbbAwYpB4vbtnDMzrrsMw4cvB87h8/l+OQTAlqJ7ydL/7MEhGvQ9vQdZ6oLT
boVouwV7t4XFIvkFKMGB0nB23rqeX187kPl0CR/VJi5hsBh9VBo2nzuqgdPh0/gxeRhJXwWs8g3cDDSC
uH0fwKKMvIMyNI6/8DVTPT/bzh7RwAtqOWZdZWjpacZlbwOIMvIe+XweqdSCBo5HLLhqMnK4tfE4YmoV
QsIeeLp240rDXpzpPIXmfiOI7AlzAYMXo3c4PO4fpOdJzAVNXMImHyzfierK7TBU7ELlvh0Pj7XXwOSu
B+kdnsFqLo9kMo7O6xeQSMSQpZ8RDr3hktm+A6gz7IfgGoThxEX6UvgrKjAbb9eCOIemObAx6ZUcpqeC
MJ+vRWQug0B0WSNgoZJt5MnA22L4dw6LmRV8/p6l8E8Oq6FUkYCFSC8CHJKUUThcPg7bJA/uCyq6HcPr
kSeW9AXC84l/zXQ2a/7CmwuzWbNCYdGb0Bc4lLHCAtkPR6+Pw7bHdIGoXWB7GdMX2OXXtHkVS6w5WWie
XGtms0VvnMN33d/0BT2uV/xhsykSbLz4v4D8ATko6xzt+1ySAAAAAElFTkSuQmCC
</value>
</data>
<data name="resizeToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAADLklE
QVQ4T3WS60/ScRjFf39CL3rR1ovurduWbbU2t7ZqdlkXt7Lrym6O1VoXcdYqQ54wKlGxABE1CzWF0nIm
lZcoTbyUNJFIzDJSJK+E0qy8wInvz+i2erazfd+cz3m+zw4nTS+FLOeZNim3Vp6UU5sqvf5MSZqnyjhV
pfKUvEx54kqp8rCkWHVQVKSJPHtbs+tUgSYiOicVAMfEqfR1dVFCGSqrX94cHQeN/aXhbyD3Zz91uf3U
9tFHTQ4fzVtH9BOQVdKcW2F6/eKkWA1zcxu6vUAQMmCzk/3AErLtDyFrrY035z16T3PXin8B5LfqZE6P
HyZzKw5FX+Yh4XtjwZKZGV3lNPIkhhojplON3Uc3S9/Q7LDfADKtKYklMsgTkwV7joixKHQr2Nq2fSET
5uQwqtsyjcot45R510ozV8f/2iAhsyolCNh9WIyFoRGYHbIGfYN+SVd7Nznzk8ll0FLzKxdZO3xkaOjG
GYUxcIIfRxSlPU4N/rn1fS8JJVlU1WCT3npggVLfAIWuHjJtNRIyjIhTPEKM7D6OSop4RcXpwZ2Wl11l
gHanmze/c36ioc8jyRlFjSzljxl2daI9Pwuv1Cnw9PRjZeQ1cCcSS68Fza6+IXL2fCG7w0ssmc3o2IR8
gbc1PQU9NUp48sNRcUyAkPBL4AIlUbLk3gEvS6YXrW6p0dx9UZ5n4gHjzBmYAAPPYwRwazeiMXYWqjcs
wLSVInAHRYWq0TEf9Q+NUEsg+fr9t2nF1U71leyqn+u3vPuIl2298HZ2wnxkO5q2LYOtxoKpK86D23tW
r+7zfCVzywAVGT/QVV2LvNDo0Eo0j3mAtbUTiRnFOJ94Axp9LfIKK5Ctq0RDmw9TQuPAsW7bHYNUYLCQ
JL2GRAqjtMDYwV+8wzUAWeY9eIfHYW0fxNodxyGWZeOSPBvzl27C5OXnwG0T5irmr79wgdWTNYyVJFL8
kAeo8wyBA/rx2jGErBIH0nXPsWmPEHcM9YgURGPS0jMTZfiXGKDfM4Y0fVOgA/UgRQWECTpExaqxUyDF
wuUbJjb4H0AQfxtrDqiweLMUc8LEmLEqnv9zUMzM9B1/cM83lepxTAAAAABJRU5ErkJggg==
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAH3SURBVDhPrZJfSFNxFMf3rBk+iIH2oOCTIAlZSGCQPqgIqQ/5tHQpPiikBpIpCnuxYkWCokQg
qDcoNYZETZAhbII0dh92DdPNvJuj4f7epWa2vOvrzg/u8uqQkA4cztPn8/uee4/mv5RxgQfN2Xkbm9zc
EpujUyY2+w0TbJ5ZBL/9sAyCx2cWMcqZYHj5Dv3PJsF/FjE8aUZrH4eWXg7Njzjoeqb+ShU4/iee7MO4
jIB0gPsDI9B2PIYkScmORCK4Vt2iTkUvH4djhzI2fbsJeBC88EUl8Hg8aoESW1bg3zKiP2JY2/qO27pe
VGu7k3A4HIbL5TqdYIybZ/DPXzLCuwcQt/exIkZR0dAF3rHKYhMcDAbhcDjUAoKfvzJC2ovhayL2+tYO
hM0o+PUIbta349adDgYGAgH4/X7Y7fbTCfQvOHTqx9DY9QS19/oSL3eirK4NlwrKMD1nZqDX62UpLBaL
WqAfeo3VjW9oevAUn/gV1Nx9iGW7wCQEp2cXsSmKIhOkTNBjMLI9lV1DoVAysvG9GWlZheCmPyIzrzy1
gI6EvrIiIQHt7fP54Ha78WbWhAvZV5CRW5paQBd2/Fed7Mz8CmTkXMfFyzdSC+g86WU6EqfTCUEQYLPZ
YLVaGXCyr1bq1AK6bbL+SxeXa1FS1awWnK80miNVQhp+0k4xYAAAAABJRU5ErkJggg==
</value>
</data>
<data name="showActorNamesToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAGOSURBVDhPY/j//z9FGKsgKRirIAiHFm92CyjctB+bHDLGKgjCGa37/gcWbvzftvBaCDZ5GMYq
6Je/XtQ3d81/35x1/23j5r7FpgaGsQq6Zaya7Zi8fLZFzML/xgH9QNznj00dCGMVdExa9sUqdqGoWdi0
00b+ff8N/LpvYFMHwhgCrmlLE+1iF54AsU3DZ7mZhE79r+fT+U/Pp8MFXS0IYwg4Ji68ahk1WwvGNw6d
/ApowH9dz9ZdyOpgGIXjEDdX2Sp61n/DgP4Let7tVw38+67q+fV+0fFs/a9knfNX0SpLBVk9CKNwbGNm
bwT6e5+6fZGJik2ulaZThZWmW6OWpmvDfxWbApAhG5HVgzCcYRczg9s4ZNoXTecKUWQFIKzuWDEFaPt/
BYsMjCgFExbh06SMgiZt13St+eoQUvoSWYGyXUmEvFnSf2WgC1RsC/4rWqR/UDBL44bJgwl9v25RoGYt
JatMLXmTBHgAgrCSTYGoLFBMUjtQS1zTV0tSJ0hL1jgB1QBKMFZB4vF/BgBJP5kepjxMJgAAAABJRU5E
rkJggg==
</value>
</data>
<data name="showGridToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAFYSURBVDhPY6AqyJt9/z+UyZA1/TacHd93Cc4OaTwJZ2MAZAPSJt+Es2M6z8PZAbVHMQ0AaQTh
7Bn3/mcAbU6fcuN/ysSr/xOBNsd2nfsf0Xr6P8hmkGafyoP/PUr3/ncp3I5pUNZUhLNBmqFMhpDm43C2
R+luTI0wALIZykRxdmDtETjbpXAnpgEgZ2cgORukOaId5OzjQGcfBjvbDeTsgu3/7XK3/rfJ3PjfMm0d
pkEozgZqhjJRnA3SDGViAlCAQZnA0D4MZzshOdsifS2mAfE9VyDOBoc2wtkgm0F+dsje+t86c9N/89R1
/02TVv03jF/x3yB6KaZByKEN8jOUieJskGYoExMEITkbObSRA0wvBpvNcGfvBycSkJ8doKFtDtRskrQa
7Gy96GX/daIW/9eKWAjGUO0IgBLa2QhnG8Uvh7OxaoQBZGdbpCJCG9nZeA0gHTAwAACOffGU2o3WzAAA
AABJRU5ErkJggg==
</value>
</data>
<data name="showRulerToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAEiSURBVDhPvVO7TgJBFN2fovAHNDb+gLGywsbCxoTOxF/wgaLGRPGJNUEeglBaaKExWhF8E1kh
Cwsyxzl3d83Gip3Ck5zMvTtzz97cOWPtnFVBbmcusXVaEaZOytg8vsDGUUmYPCxi/aCAtXReuLp/jpW9
HCyCxWHML6X8yEP/G2i7wEcHqH8C96/AdQOITc56AvxzAMdxMD696GfAYAgeQlMXN1rAw5uX5+9CAmyZ
YDE5NhWXnAffW11Zb1+GstYeve/ZvwILy7uYmEno4jnZGJUiwIGF8bsxKjjtADqNLsBrCmDbjrmADs06
oEmUUuj19T033egCdJg7UPjqGc6A1gycdvOkzAToNB2adcCH8WwDV3WI0yIL8FWxKEx/6z9gWT/PHGlW
lc2EywAAAABJRU5ErkJggg==
</value>
</data>
<data name="fixOpenAreasToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAE/SURBVDhPY0ACokCsBaVhAJsYVsBvbGzsD6T/Q2l+HGI4gTwQ/wcBEA3lYxMDGQKjUQAxLpDH
ogYFIJsOY8MwjI/uIjAABRBMEQjg8jt2cSAnC00Qp01AAJOHGQoG6IpxugCIMTRjcwEIoCvGZSgYoIcB
NiBv6q79v3Rmwv+0Pv//EU32Xzwr9GqgcnCAbisIgMViGzz6G1cn/t9yZer/C892/e/fnfU/vF/3v3m2
ZA9EGVAhFifCxWLanH9uvDzh/8Zrk8Dh1bMn9X//nnSQAd+B8mAAshksCaKhfLiYT7Xh/21X5oDZMLDp
0lSQASC1YIDXBRbZ0j+7dyX9b9+VANbcvjMB7AKzLIkfQHk4wBkGJqni3cE9Gv97d6WAbQbRIL5xivhU
iDIiANC5HUD8CeRsoM1fjJPFJzEwMDAAAD8wxIeEhxEyAAAAAElFTkSuQmCC
</value>
</data>
<data name="setupDefaultPlayersMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAD0SURBVDhPY0AD/9FoogEuDaQZdCzROe5YsvOJwwnODw7EO1S7KomLQaXwArAtIM33WrNef1ra
/f9NT/7/U/H2X9f6mXeCVRDjEpDNIM0/N876/3FS8f9byTb/Fzhp34ZK4wVg00HOBtkM0vyiKvT/1WDN
/z3G8q/AKohxAcjPIGeDbAZpXmch9mteYfb/Gct2EhWQ/0EBBvIzyNkgm8t8A/9X10/6DwLEGoICXCKK
/vfP2fr/2p1nJBkCUwSmHUMLwIZcv/ucJENQAMyQG3coMMQprBBsyO17T8k3xNgj+b9rZBF1DAFhqBDp
AGQIlEkNwMAAAP7JtzLCVbRNAAAAAElFTkSuQmCC
</value>
</data>
<data name="copySelectionToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAJVSURBVDhPpZPdS5NhGMZ3LKJ/gzsrHg3sIFsm5A46cC3ImmnWOy0/lrMtpdbct5tbH5Op6eZH
6lrvtOYqTTdxrUyCTgoKlSwiAjHICAOro7VdPe+7aRSyhC64eeDhvn73/b4Xj+BvRcc8WRPDphKnUYG2
iwxam07AY6sqsTVXZKVa0itypyeHQrD63LhZ1MxVTqolvSZZF5ke7dwKQFIt6RUYvJLD9tm3AmxvA2rO
uO+1iv0ey6a52yIX0zMj1fJvsb02srEFB7Coy7a3/obYXjsPSLzVQlt3GNp6aXrAk4nBzEf3+oWRQA8J
+ztIcOiq1N/rQGKpCecZMTrN9VK2x0R8XQbi7dAJh10tmSmrQPD4bl/2s7CXmR0fBI0Q4ZEOTPraMe67
huCAA4EbbRj1tIJ1m0EBoADc6tIzbrs6CaFTc7ncvy3PAGtzfCW+zCL+OYqfn2YQ+xhCfDWyeb8yH8B1
ayOc+hohD5hiXYVc7rx5qRnxhUboa/OhO50HrXwnWqoJjA17EV9UIfayHu8eHIW+4QgMytLkfxkbsBfe
9lgRW5nC+sMSrE0dwPe5UhgUeyhoN3RnduHHUxnWoxJ8DRXjVX8+lBVFUJ0sTgL8bksul/nyCx/mhwqw
eHM/PkSq8H66EsrjO/AmKMHrETEWvCLeHGrLg0ImwtmyfclP8HWbsv1uU3W7vg4ODcOXjT4gmj2/qqb2
EJrkB3GuspifzJnV5QWM4pjodxKdZmWmU1cjvHypitgvnCIUQMwqGaEAoqmREAogFEAayosIN/kP8/9J
IPgFAlSB3U6URz4AAAAASUVORK5CYII=
</value>
</data>
<data name="toolStripLabel1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAI3SURBVDhPpVBtT1JxHPUz9GHatDSlWfbIxEkCAQJe
DJUIKEBEx4OkIiiKPC10QS7XyrU2KRFQUKcBEup06hfoVc1euLVe6OnvbVdN75vWi/O7+5+dh91TBuC/
wEraS6Yta/EZuvP6I/Pqkxk2DYMLhL1kvGQvmjC1F0FsNwTDsvrbec1ZsJKWnO4gthtEcNMDXUY1z6Zh
QB/HeidsXwzoKTxFV04L04rmKLoTxPi2D49T1I+2Wfn31rh0X/FBtM8aYCXm13svMLkbRmwnhOhOABPb
fkS2fAhtDMO/7sZYyQXJ9AMiZwnoLujxipiPW/sKnTAuqaBfpKDNtpBvK7QZJQkYhPBNA5GzBJClYVxW
w5mz0K26LAVNRo6OeSlUaTGUSSG8pX6o40rwondxf7wOt8O1xHpuRE1aifCmF+qFZrSlJXiUEqElKYBs
jg/NAoXBNQcG8nb05624Eai5GNCeUCCw4YEq9adVMdeE5kQjxJ94aE/LidEG5+ce9BJwRqtOA8jSIEvD
nNHBR/61JdlEt0pnGyD6WA9BnIs+0ip/9xC1Y9W/OCOVuDZUcRpwbPYT4yhZWpdVYaj4HO61XrgKDrpV
mRTTrcRMm86CPtSMBCNkJFmCD0/RiY44RY/FnbgFxbQYjlULbCtdqPFeJXKWANl74UnrQN5BmxnBzQCH
mM2wLBlQ6Sk/4RnQR/yWD8EUD42TXNS/vIN7kbqfjOD6aNVh9fCVw0p3+UGF6/JXhmfw1+PfgbLfYY/G
d6iLJ+UAAAAASUVORK5CYII=
</value>
</data>
<data name="openRAWebsiteToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAANqSURBVDhPXZJvTNR1AIdv03KuXL2pteV8QbnVVmuU
xESolRtJG5GxZJIgaN75h0MZZOMMwoOSIPRohAiecnceIGjHcdyheHfA8efAu+Pu4OD412FIBhThKMxJ
29PvWJr24nn3fZ7fvt/fRwQ8QnpXapRAvcCkwJ8CdwVmBZqktpRt/z//sLha4EJQuPaTFudcK9Yb3TSP
ddPot3DJX8MBa9KyuDXRtMeU8OQjAUF6TKBLPfItM0suxuZ9DM73o5t0YwwMo/b5UHn6qfd0Udp3giRd
vHdnfdxTDwe01f4TBBbbGV60M7QwhHvWQ834EA2BCRSucYp7/Zzs6EM3ZKHULiNe875pJSDIkQL3pv5o
p3nByKXbRlrmO2i56ePsyCjfD44hNbqQGuwUOIxUTpbh+kVHbFX03zHl78YFA5eNgQqcvxqpXdBz8fc+
+ua8lLiHKHaMIm52ITGbyRiuJDMgJ2NChsZTyoXeQraeiroaDEwN/GZAPVVFyZxS+LoP+5yH9KtuxHon
n/U5kIwfJXZUTKx/H0mDaeRey8Q2ruWtws23goGlidtW8keOIx3/nMqf26iddJJUd500i43isSukjNSw
vzaSfedD+dC8k7SGvfRPN7FZHnZHJO1MufPjgpUcbyZpXgXnbphJrrWT3DhI/Jke0s09yLw6PlVv4bgh
kYSKl5BoEum/qScsN/Qv0cG25Gn3bCMKXz5FE23IHZ3sUDs5rI1CqolAogojVRnKF7qPqXeUktUQR/Sp
5zCPqHhd9tqMSBhGk87/Hc2Bao70FJDnqWOXtptDmnAa+8u57CpbEescChTmLFT2IvZrowkvXBsMtIlS
m3dEC8NYHpwzkmU+QIYlHanJyl7hvkH5ZOthvrlyiK9MYvIMqciNEips+eyqjmTjl6LllSEl1H2gL2k/
isF/hrz2bHJtZj6pepmL1xVoe0tQ9RRxrrtQiBzktE2OWLuNF3IeX3o+W7R2JfCRKmadMAzv1y1HsM/8
QPVAO9tPhxBTul7418+ypfhpks9HUN6Rxx5NNCE5a+6+Intxw4MpB3mv7J11wjBMbxdFLCu7q1DaDJzt
sKDstKIfaGRT4RPsVm0l5NiaxVdlG9ff9x4E7hNR8Ob28Lw3WjblhE4Lj7T0L7dCclbd23BsFc9ki1b/
dx7RPxe0rmcJTZoRAAAAAElFTkSuQmCC
</value>
</data>
<data name="openRAResourcesToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAI6SURBVDhPfZFtSFNRHMb3TQj61pe+VIJ9mPMGldcGyYJe1I2I1qbN6HVL2EJrKGzRmsWkJGaQ
RK8Mnc7MuVywNNmLLpNi0YtIm4X2NspkaC5LW7q1p3svbEzv1R88PJzDOT/+nMNzPX2PpXH2B2F3D6Ht
0Qs6ZgC85cIIlsPieIICyckVJbyH/hDV3Nxoc8PzLJiSNFBbbIHDO0w1MPYlguevx+DyDTFrmuutvczl
VCjYgvuPX1HNTTzxj5GkRBRsgc0VoHrxBNauQVxr7sVcbAGRH3OMgBSr6GNsQZNzkGo28wsJTM/EEJ6Y
WVlw195PNfcE3ydnMRqexm1/Nyq8Rsg7L0Fm8kFZ2wJhuXE1I7h5z8MIMon9jWMy+gefx39Ca7PBMHoG
jmgHYslZnHhzHLvMduQp6lu2yg1ZPHo8Gq4JrN4RlPaUw/DtGNp/taLntx+HOz9hj3UE2ZYK5FRpC9MC
mmQymX64D1+jUF4NQHReglJPMdRhGY4+CGJn4wQEPj3WuqRYp1N3LxJkPlzo4xTISg/233kHUa0U+wIl
KGp+i8LL48htUmNNxwFsqNEk0gK6l6ZY78aO+jh2N4RQ5CyBsF2DbYYIyHM+5JiV2Hha42cE9BdxJV9u
BFk9DGHdFLbbykCa9NhSHQShHIBAZQJxqErE+tfMCBRX1m8+cutlvnYApO4UCnRdIFRe8BUW8MW6s4RE
u4rzYmZyZXXZRNnFxk0HLwTzpMZ5/l5dn0BSIyXElVkAeP8B187ybforr3QAAAAASUVORK5CYII=
</value>
</data>
<data name="wikiDocumentationToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ4SURBVDhPpZN9SFNRGMZvBAVFUUFCQlEUUZBCnQoF
+6CMUiwNhUap2ebEr8BKlJKZqGEl1tRELaggNrGJZraKLaOv3TWnEU3ZAnOI5JhzG24T3Bg83XPiDqIJ
QX889+Oc9/2d533vezkA/yV2yX9gIqKkHTw53/aRZLe8I2JQxo0BklbTS45XdZMjFU/IgbKHJKGkg+2L
yajttaCm5ysU3V9QpTaj/DGPzFuv4tLrn8cVt+lRfO81CpQvIG3sQ26DBnvyW5BY2kk4WScP2f3PCIVC
ES0sLKCf/45Tdf3TqdU9032frAgGg39oV04jEorawQB57QaWODIygqGhIfA8D5/Ph2+2H7D/dCEcDmN4
eBgmkwmDg4MMsP1MPYis+Tcgu/U9A9Akr9eLmZkZjI2NQavVwm63Y35+HnNzc5idncXExAQDbM5QIC73
NjihaZDcecMA9BTqwGAwYHR0FF1dXbDZbAxgNpthNBqh1+tZibGpldghqQeX1/aBNosB6ClutxtOp5MB
1Gp1BECduVwujI+PM8D65EvYmnkdXHbzW9osZkuskzqwWCwRQCAQiPRGp9MxwJqDJdh08ho4SZMOKQoN
A4gOHA4HA6hUKlitVgbweDysN6KDlYkFiD1RDi7r5kscrVQxgCgaQGFTU1Pw+/3sXVyn5dH78n1SxCSX
gUuvewZhsiBMFoi8FfF5Tdh5tgHbsmpRrtTgyt2niDl2GWsPX8SqpCKsSJBj2d4LWLo7F+sOlYJLrdYg
p3EgqracVmBj2tWoe1SrkwrBCbO9qIPEwlbslysXdbAk/tzff5coAfBoQ0rFpPC5JoVnXbQYqqiL/y5w
vwBd8t4lLDBzngAAAABJRU5ErkJggg==
</value>
</data>
<data name="discussionForumsToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDhPjZCxT1NRFMa7kpA4sRkSBxIGF535N0hY
hEH+Ao27LDDQkHTWRZk0QCIMIuYShjIZSghLIUVMrS3tq21fW1773rMef+e2j4TyGhx+ee+ee77v3PMl
5lZ2p2ENPo3gAzyHSRFJDKMGqf2Tgml6gXEjrvs0oNzwzGY6Z+h7PcpgW8V1mmvtwPxuBcZp+cZp+qbs
dm09X2mpwfuRBjpVxZWB6KrRNcV6xxRqHXu+z2Cn2QlMlcnaXEJ8cFr89vJNujaf/BougH7p86E+oADL
MK0GG1WEftizYp386u1hg1yE1YTX9bnuQy5CLkIugnZTDRaTGxmTyVVM8Kdneba6F6qY/YXVhFyEXIRc
hFfaOmupwbndg58Z+KiJfznK676hTlUxuVgRuQivE3Kx51sGA5N3exkr3oUWuQi52GZWuxHnq56U+P9V
bavBZSQegx34DFNwRS7SDXu3xPqKCnXykh/lphpkI4MJWIJHg/PK2taxnHx3hEwsavbTactFyZX1/ayK
PXhxs8IwXM6C63q+kIsK/kIOTiEFD7QvVhxB0xm5qLgLT+J67hQiEIyDCx14GtejxBYVRA9hCx7H3UfE
Fv8fSfwDwZ8JlGSjAbkAAAAASUVORK5CYII=
</value>
</data>
<data name="sourceCodeToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAF+SURBVDhPrZDLSkJRGIWPiagPVO9QbxE1aWqjgkZNwmpQ
3lIkSI0wzcCo0MiiC6RdLFSQog5aKOaFtMQ0deX+PaJZBx204OfsffZaH2tv7t/kPonir3H5wrB7grDt
+NnMC/bfYuZuyVfk4NM8rc2OYwyNjItDto8iZGRSGpXgMzw4LUdrJp3NA+95uAVZEGJtOQ7uyBjPxSHR
SiAzyMAZOfifAvRfY9mncGuEWFsbe1dkVBgVkOqleC2kCcTWTF/VGkFaICHWltV9QcZaHRQa0A0QoFPF
UoUAg8Nj4gDWQKKTwHntIghTvV6ncCpbFAesuk7JzMTufxO7FXZAuVJFLl9CLJkXB5jsPsH+U9XGnQrF
MhLpD9zHcuIA/bqXAuZNHzRru5gzODGzaIFq1oSJ6SWMTqoRekiLA9hBt9jLv71/4jlVQJTP4jKS7A1g
DZapwVajgbXZYKrRQKXGWfClvwbs0TofLvKYgT+UwGEg1hvAvr1GFMAO+p1miuO+Ab7ZFVkV6pPjAAAA
AElFTkSuQmCC
</value>
</data>
<data name="issueTrackerToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALnSURBVDhPdZDrL1txGMf3D+z13oqOUavSlp621Gq2
F7NiLhuZ2yRkExLDlNnMvSN0iE3EMKZza11Kx2hdasssWUhGsmwum5Bt6jI2jiLx3TlEU5u9+Jzf8+T3
+36f831OAPgvHj1CeHQLJHTt3sb3d1O5bv395kgj6RcxLHuxhoB7O18Tq/CxFjW7RAtf8H5Z3tMcac7R
E7WC5MPeTc03iVpcV2IeXFT65Qu3hNXcveDbogJLjbmgEXcRa+6dhImu3VXEurDJBQIlD4I6HjIMiTDM
tyO1KALSaM6dQ80RAyqnxK3VFeJmYs1bdQHqyRr0fmyAYiQPrEd2iOjxRctoBZyLz8KpwAGOeUxqaiex
TuU0Z6dy7nkoBWgaK0Huqyika4KRoomEuIIAq8AeUQ3X4OVnO3X4ns65Q+WEsNGlXqwkjFfVflC+L0am
NhxJal+EPfdEfmcQJoZuoWqwEI459hCF2LSbDeiPoIH3lqjjgqjhQjVejozuUCSqfBBWJ0F4oy8+9Edi
ZaoV+r44sDKYYKbZbtin2MSbDWiIp1xTSLM/inTxSGiRIrTWE4H1l9HbH48lag+7G9OY6AiCTzYbdkmn
984kMGAbZ30gpuE/5mzeVEehdECGsGdeCKj1RmV3IsbbrsC01A3TNwVWZ7SofSKGNNXhFK1hxFjdMxsI
y1zknCIWsrUyBNZIUdyVhrZGKZY/qWCaz4bhIRc7KyqM15zfG6uSBBzqzAY0XDl7mJFsheqhclSqovBF
n45tYz3I6RswyJ2xNSfD2uxL6EqIxXelxMl/DGgc05nDnLsO0NVewk9qcVtfk7H5OfiAqTAqSgnmhsvQ
kcsuOdaAJkvOHZ0zKLD9o2J/+ubUdSoCZ/8kZ2NBfu+EIYe1OJzlwDzWgPq9BXJ5BturepiM1A6MrRao
sft7EgujDRhIt2091uBNIWf5tdyJHMljk9Qksj+Tib4MewzetyMpEalPsyH1MgapS7Ee+QMga508U1fU
1wAAAABJRU5ErkJggg==
</value>
</data>
<data name="developerBountiesToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ8SURBVDhPhZLLT1NBGMW70K2JS7cmxrjU+A9oIGIg
FGhEUYkYRYIYaiyCUPqgD2p42hb6BkqLoKUWegt9UKm0JQrSGjdaQErRmLhzY4pE0OPcIRBKfSzO5M7M
/Z3vzDfDAfBftUdb06oZ2aE/7WUt7FdbRJE2x3VQhqQQBxqzTDIm+/UwLE+b4j3wffLAsKBFs68Bdczd
DJMMYK9I5LQxxsIMHCt2eNfGoXnZAYG7FjWjt3ZNskBWrS9a0oaYFr6Pbjz9YIdt0YyGCQEmUmPoiKpQ
7ajE9aFyapIFK0OStH5BAy+B26JKKMNSWBNGDCQMeLw0ACblREtQhKvWS+tZBvJp8brutZrEdSP5bQkb
W98x8nYIihnxNrzqhDQoxOWB0s0dhg7a+a5jsueiH73zj+hZ2yJKCusjvUh9TUIVkcG9OgrJlJCtjPLB
Mly08A5QA+18p0hGIvXMdVP4ybKNxJbQyiws90u34UATWxlzX2bR7H+AEmOhghqwkbRzXZgkDRpZHqRn
7X+vh5zEVoVlGE+OQhRoRJXrBoVnP4cRWguAZ+LivCb3MEcxLbESwfJGD0/qGeo8fPS908G+2EdgB61W
P3WPwFFMLjOo9VdvlPWXIk+dK8jpPnOKowhJjrAp2EeiX1DTuLaEZRsma5XOCjCLLqhn21GkLwgU9OSp
89Q5RzOa2OS9b7bGLRAwfGhedWJsxQGhtx4XzMUQEhOeqSjJ1eWfzdeeO7EDZhjUMfzjLcHmreCqD3ec
VSCGKDYU/iKd9vOM3Kb90F7RodZ1+yB5XWOVwxU/+a4aNupmqaXkNOn0btS/affj5nDFyWu2KzFyVfl7
f/i3wPkNOLzMGxqYvkUAAAAASUVORK5CYII=
</value>
</data>
<data name="aboutToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJnSURBVDhPbZLtS1NxFMfvf9F/EARBEEFEQdCrXgRGvTMM
ClN8URBYkaDUC31RCCZFkj3YnGhmpuh0s+FS51Nr6iLnfMB0W27uSe/udrfr7vp0vdtQs8+Ly+X7Pef8
Ducc4V98YYXhHyJ9DoneaYnu8Qg2Z4DNaIJ8yGH+AGNuEeNoBPuKzFJAYS2kshqQ+er0Yuibo2NgFjm9
c7BIVss0O2N0TkZQtSIFtpMqW8mM/i8m0rQPOKlu7EeUUnsFHIvbNPZ59aACgajMmduTnCr7Qjgm5VV4
0zVGbZOZ1G4HybTKq/4Vrb2tvJ1jJ5Ol1jBPbYuLtJJ7PUeasmoDo45lhG/uEPWt3/PGHhshmbnlMP5w
PK9oBRVF+6aw2Bzce9qN0GNb4vkHR87dx+eRX5wosVBUadUmnWtbzaioaQmPe5HSqvcIQ1PrvPw4o5v7
cXiCnC4e5fzNQXzhmK5lsyqppIh/bZXymlYEu2uDeqNDM3aXtcfcSohz16xcLDcR3BJ1LaOqSGIEj2eB
Gw9bEJa9UeqaR/QB7ce9HuXsFQuXSk1IiqxrcUlCjm9ittq5VW1E2E1q6pzCYl/UAwpM/Axx5GQnRy+0
4YvmhhYNbyKLfipq3vG6azy36xXt9UcvLIjJlB60S9ugh2NFbRy/bOCTdUGbltZ6Kkh79xDXH7QQ207u
HcqUa50nzWb8waCWukNWkUgoMRKJCFI0iBL302sa5uqdJmbmvYfvfNbto6qhh5qGLqadLlLSb7Yja9hG
J7hfZ+RuXScz7v8kFghpO+0wOah43E5x5VtKtBarn/UyPOU5eNOCIPwFCBKiGq2sGKsAAAAASUVORK5C
YII=
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>313, 17</value>
</metadata>
<data name="cashToolStripStatusLabel.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALSSURBVDhPjVLbS5NxGN4/sLm5ZeqWJdlNJ7oIoQPR
hWBEIF4VGYUUUSBk0kUidCdTA0UMdBKGkugssxKdeMDcbHn43FjzgGtuNs+HuX07fPu+be7pLdnF1Isu
Hvi9vO/ved73fV4RgAMQLMezeHPGcsiUEeUYFYITKj4wpjQFjMq8/bUJQRwhc4Y/stYCcFYg8ANgBxDZ
aIHPkG7fX5sQxPFXFaFZwDMIbH0AVhux626DdziV0om1CUEcgXEVdr39iG12IEbKkYVSRJxlcA8cpXRi
bUIQh9+oRNilRnDyOvyjF8H2nwI3dQ9buv8kYA1piJJyeP4phJ/5CI1fQ5C5i/XuI5ROrBXxpgxJiDm2
zE0oo8ExJQLf03mfPh28vZT2dxX+4Qvw9pyEMFeElS7FQQJuUlUR/l0L8E5a3BxtnUF4Qwuv/jSE2Ufg
zbfAGa/Q+wlcHYcQkL+IhWz00UJ2GYAdHWK+4X/z+kcvwzdwDp7PJ6ibfDhbkw8SsKNEEDQj5jUg5hlC
lPyPrmuwRvMK1vvgmRsI6rPBWwthbz6EwPMtDRGyi7e9BDddiOBUDvhfj7HcqYBvJBus7gx8X9IR0CnB
divg7ZLD/VHOb7bLTOutsjzR9kAqoqQcWdIg7KyEMP+CyB5isV1ODhSQAzlge1LoLvQ0polgpE77wC1W
wtUktYs2dJRkhxGij5ylgLzPQXS1GvaWZJo7F2zveeyQ6t5lDu1d5to7GvkT7A1JEK1+TdEGFqrpUxPC
jnKEF8rgsxbBqc0CaymE4CjBdu9ZBG2vENvpQWyrjbqtAWu+g9laiVbk6lQUuycfUEtVEJYqELA9w+pI
LmY00sHpeiljrUsS5jVS17bhJpGUIOR4Dr/1Nlb6LsFSJS4WOdrlmfb3crWtWcbMNcmEmUYZY62Xqi1v
pJnxTTveSjNtDUnquToJM10jESyvxYypUqxmysWZfwCSxP6Dn1PvvAAAAABJRU5ErkJggg==
</value>
</data>
<data name="toolStripStatusLabelMousePosition.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAFNSURBVDhPxZDNSgJhGIW9hSCCbqRFl2B0CUKLoJWLQFoGCUKbVkURFlTQj9li6MckE81FgUqk
iUhWlP0Yk43ZjOOYzpzGz28ammwUNz1wePngPec7vBYDoLNr/iegYdLUwPheaTN/oJm6hgTsRjK4eeS+
lc0VkLx6xszyHjdin3T19vX3kO0WkAAmnIYRoSxhcTOAcedCyTE1N022/8IbSFCbDl+uwOFawoB1lIiu
/oIcZuMgRm06igLcPrBwe4IYsk2Y32qVOaU2nVpNBleqwB9JwmoSQBq4vWFqayKr3/NiFU8sj/3QhWkA
YX79iFqbSNU62KKI61wRzPF5+waza4fUCtRlGe+8hPt8CZfZV+z44+0baAGKWl2UPvFSEJC5e0M0lceW
euCOGnwIIiLRNIJnKfhOEqS6xxeDezvUWQOb3UkWW2lweIwGWCxff/dVb00F4NUAAAAASUVORK5CYII=
</value>
</data>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>45</value>
</metadata>

View File

@@ -82,19 +82,19 @@ namespace OpenRA.Editor
// {"scrate","crate"},
};
// todo: fix this -- will have bitrotted pretty badly.
static Dictionary<string,Pair<Color,Color>> namedColorMapping = new Dictionary<string, Pair<Color, Color>>()
// TODO: fix this -- will have bitrotted pretty badly.
static Dictionary<string, HSLColor> namedColorMapping = new Dictionary<string, HSLColor>()
{
{"gold",Pair.New(Color.FromArgb(246,214,121),Color.FromArgb(40,32,8))},
{"blue",Pair.New(Color.FromArgb(226,230,246),Color.FromArgb(8,20,52))},
{"red",Pair.New(Color.FromArgb(255,20,0),Color.FromArgb(56,0,0))},
{"neutral",Pair.New(Color.FromArgb(238,238,238),Color.FromArgb(44,28,24))},
{"orange",Pair.New(Color.FromArgb(255,230,149),Color.FromArgb(56,0,0))},
{"teal",Pair.New(Color.FromArgb(93,194,165),Color.FromArgb(0,32,32))},
{"salmon",Pair.New(Color.FromArgb(210,153,125),Color.FromArgb(56,0,0))},
{"green",Pair.New(Color.FromArgb(160,240,140),Color.FromArgb(20,20,20))},
{"white",Pair.New(Color.FromArgb(255,255,255),Color.FromArgb(75,75,75))},
{"black",Pair.New(Color.FromArgb(80,80,80),Color.FromArgb(5,5,5))},
{ "gold", HSLColor.FromRGB(246,214,121) },
{ "blue", HSLColor.FromRGB(226,230,246) },
{ "red", HSLColor.FromRGB(255,20,0) },
{ "neutral", HSLColor.FromRGB(238,238,238) },
{ "orange", HSLColor.FromRGB(255,230,149) },
{ "teal", HSLColor.FromRGB(93,194,165) },
{ "salmon", HSLColor.FromRGB(210,153,125) },
{ "green", HSLColor.FromRGB(160,240,140) },
{ "white", HSLColor.FromRGB(255,255,255) },
{ "black", HSLColor.FromRGB(80,80,80) },
};
int MapSize;
@@ -174,10 +174,10 @@ namespace OpenRA.Editor
// Add waypoint actors
foreach( var kv in wps )
{
var a = new ActorReference("mpspawn");
a.Add(new LocationInit(kv.Second));
var a = new ActorReference("waypoint");
a.Add(new LocationInit((CPos)kv.Second));
a.Add(new OwnerInit("Neutral"));
Map.Actors.Value.Add("spawn" + kv.First, a);
Map.Actors.Value.Add("waypoint" + kv.First, a);
}
}
@@ -189,27 +189,27 @@ namespace OpenRA.Editor
static MemoryStream ReadPackedSection(IniSection mapPackSection)
{
StringBuilder sb = new StringBuilder();
var sb = new StringBuilder();
for (int i = 1; ; i++)
{
string line = mapPackSection.GetValue(i.ToString(), null);
var line = mapPackSection.GetValue(i.ToString(), null);
if (line == null)
break;
sb.Append(line.Trim());
}
byte[] data = Convert.FromBase64String(sb.ToString());
List<byte[]> chunks = new List<byte[]>();
BinaryReader reader = new BinaryReader(new MemoryStream(data));
var data = Convert.FromBase64String(sb.ToString());
var chunks = new List<byte[]>();
var reader = new BinaryReader(new MemoryStream(data));
try
{
while (true)
{
uint length = reader.ReadUInt32() & 0xdfffffff;
byte[] dest = new byte[8192];
byte[] src = reader.ReadBytes((int)length);
var length = reader.ReadUInt32() & 0xdfffffff;
var dest = new byte[8192];
var src = reader.ReadBytes((int)length);
/*int actualLength =*/
Format80.DecodeInto(src, dest);
@@ -219,8 +219,8 @@ namespace OpenRA.Editor
}
catch (EndOfStreamException) { }
MemoryStream ms = new MemoryStream();
foreach (byte[] chunk in chunks)
var ms = new MemoryStream();
foreach (var chunk in chunks)
ms.Write(chunk, 0, chunk.Length);
ms.Position = 0;
@@ -276,7 +276,7 @@ namespace OpenRA.Editor
Map.Actors.Value.Add("Actor" + ActorCount++,
new ActorReference(overlayActorMapping[raOverlayNames[o]])
{
new LocationInit( new int2(i, j) ),
new LocationInit( new CPos(i, j) ),
new OwnerInit( "Neutral" )
});
}
@@ -284,7 +284,7 @@ namespace OpenRA.Editor
void ReadRATrees(IniFile file)
{
IniSection terrain = file.GetSection("TERRAIN", true);
var terrain = file.GetSection("TERRAIN", true);
if (terrain == null)
return;
@@ -294,7 +294,7 @@ namespace OpenRA.Editor
Map.Actors.Value.Add("Actor" + ActorCount++,
new ActorReference(kv.Value.ToLowerInvariant())
{
new LocationInit(new int2(loc % MapSize, loc / MapSize)),
new LocationInit(new CPos(loc % MapSize, loc / MapSize)),
new OwnerInit("Neutral")
});
}
@@ -316,14 +316,14 @@ namespace OpenRA.Editor
void ReadCncOverlay(IniFile file)
{
IniSection overlay = file.GetSection("OVERLAY", true);
var overlay = file.GetSection("OVERLAY", true);
if (overlay == null)
return;
foreach (KeyValuePair<string, string> kv in overlay)
{
var loc = int.Parse(kv.Key);
int2 cell = new int2(loc % MapSize, loc / MapSize);
var cell = new CPos(loc % MapSize, loc / MapSize);
var res = Pair.New((byte)0, (byte)0);
if (overlayResourceMapping.ContainsKey(kv.Value.ToLower()))
@@ -343,7 +343,7 @@ namespace OpenRA.Editor
void ReadCncTrees(IniFile file)
{
IniSection terrain = file.GetSection("TERRAIN", true);
var terrain = file.GetSection("TERRAIN", true);
if (terrain == null)
return;
@@ -353,7 +353,7 @@ namespace OpenRA.Editor
Map.Actors.Value.Add("Actor" + ActorCount++,
new ActorReference(kv.Value.Split(',')[0].ToLowerInvariant())
{
new LocationInit(new int2(loc % MapSize, loc / MapSize)),
new LocationInit(new CPos(loc % MapSize, loc / MapSize)),
new OwnerInit("Neutral")
});
}
@@ -375,13 +375,12 @@ namespace OpenRA.Editor
if (parts[0] == "")
parts[0] = "Neutral";
if (!Players.Contains(parts[0]))
Players.Add(parts[0]);
var actor = new ActorReference(parts[1].ToLowerInvariant())
{
new LocationInit(new int2(loc % MapSize, loc / MapSize)),
new LocationInit(new CPos(loc % MapSize, loc / MapSize)),
new OwnerInit(parts[0]),
new HealthInit(float.Parse(parts[2], NumberFormatInfo.InvariantInfo)/256),
new FacingInit((section == "INFANTRY") ? int.Parse(parts[6]) : int.Parse(parts[4])),
@@ -415,25 +414,62 @@ namespace OpenRA.Editor
void LoadPlayer(IniFile file, string section, bool isRA)
{
var c = section == "BadGuy" ? "red" :
isRA ? "blue" : "gold";
var color = namedColorMapping[c];
string c;
string race;
switch (section)
{
case "Spain":
c = "gold";
race = "allies";
break;
case "England":
c = "green";
race = "allies";
break;
case "Ukraine":
c = "orange";
race = "soviet";
break;
case "Germany":
c = "black";
race = "allies";
break;
case "France":
c = "teal";
race = "allies";
break;
case "Turkey":
c = "salmon";
race = "allies";
break;
case "Greece":
case "GoodGuy":
c = isRA? "blue" : "gold";
race = isRA ? "allies" : "gdi";
break;
case "USSR":
case "BadGuy":
c = "red";
race = isRA ? "soviet" : "nod";
break;
case "Special":
case "Neutral":
default:
c = "neutral";
race = isRA ? "allies" : "gdi";
break;
}
var pr = new PlayerReference
{
Name = section,
OwnsWorld = section == "Neutral",
NonCombatant = section == "Neutral",
Race = isRA ? (section == "BadGuy" ? "soviet" : "allies") : (section == "BadGuy" ? "nod" : "gdi"),
ColorRamp = new ColorRamp(
(byte)((color.First.GetHue() / 360.0f) * 255),
(byte)(color.First.GetSaturation() * 255),
(byte)(color.First.GetBrightness() * 255),
(byte)(color.Second.GetBrightness() * 255))
Race = race,
Color = namedColorMapping[c]
};
var Neutral = new [] {"Neutral"};
var neutral = new [] {"Neutral"};
foreach (var s in file.GetSection(section, true))
{
Console.WriteLine(s.Key);
@@ -443,8 +479,8 @@ namespace OpenRA.Editor
pr.InitialCash = int.Parse(s.Value);
break;
case "Allies":
pr.Allies = s.Value.Split(',').Intersect(Players).Except(Neutral).ToArray();
pr.Enemies = s.Value.Split(',').SymmetricDifference(Players).Except(Neutral).ToArray();
pr.Allies = s.Value.Split(',').Intersect(Players).Except(neutral).ToArray();
pr.Enemies = s.Value.Split(',').SymmetricDifference(Players).Except(neutral).ToArray();
break;
}
}

View File

@@ -12,15 +12,10 @@ namespace OpenRA.Editor
{
partial class MapSelect
{
/// <summary>
/// TODO
/// </summary>
// TODO:
private System.ComponentModel.IContainer components = null;
/// <summary>
/// TODO
/// </summary>
/// <param name="disposing">TODO</param>
// TODO:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
@@ -32,9 +27,7 @@ namespace OpenRA.Editor
#region Код, автоматически созданный конструктором форм Windows
/// <summary>
/// TODO
/// </summary>
// TODO:
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();

View File

@@ -20,11 +20,19 @@ namespace OpenRA.Editor
{
public string MapFolderPath;
public bool DirectoryIsEmpty(string path)
{
return !Directory.GetFileSystemEntries(path).Any();
}
public MapSelect(string currentMod)
{
MapFolderPath = new string[] { Environment.CurrentDirectory, "mods", currentMod, "maps" }
MapFolderPath = new string[] { Platform.SupportDir, "maps", currentMod }
.Aggregate(Path.Combine);
if (!Directory.Exists(MapFolderPath))
Directory.CreateDirectory(MapFolderPath);
InitializeComponent();
MapIconsList.Images.Add(pictureBox1.Image);
}
@@ -34,6 +42,9 @@ namespace OpenRA.Editor
MapList.Items.Clear();
txtPathOut.Text = MapFolderPath;
if (DirectoryIsEmpty(MapFolderPath))
return;
foreach (var map in ModData.FindMapsIn(MapFolderPath))
{
ListViewItem map1 = new ListViewItem();

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@@ -13,6 +13,25 @@
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ApplicationIcon>OpenRA.Editor.Icon.ico</ApplicationIcon>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>3.5</OldToolsVersion>
<UpgradeBackupLocation />
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -25,6 +44,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
@@ -35,6 +55,7 @@
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>false</UseVSHostingProcess>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
@@ -98,6 +119,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="ActorPropertiesDialog.resx">
<DependentUpon>ActorPropertiesDialog.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
@@ -122,6 +144,7 @@
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
@@ -157,6 +180,23 @@
<ItemGroup>
<Content Include="OpenRA.Editor.Icon.ico" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<Visible>False</Visible>
<ProductName>Windows Installer 3.1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -1,71 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.4927
// Runtime Version:4.0.30319.269
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace OpenRA.Editor.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenRA.Editor.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
namespace OpenRA.Editor.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenRA.Editor.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -1,30 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.4927
// Runtime Version:4.0.30319.269
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace OpenRA.Editor.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
namespace OpenRA.Editor.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Editor
bitmap.Palette = p.AsSystemPalette();
var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
var data = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
unsafe
@@ -45,7 +45,7 @@ namespace OpenRA.Editor
public static ActorTemplate RenderActor(ActorInfo info, TileSet tileset, Palette p)
{
var image = RenderSimple.GetImage(info);
var image = RenderSprites.GetImage(info);
using (var s = FileSystem.OpenWithExts(image, tileset.Extensions))
{
@@ -84,7 +84,7 @@ namespace OpenRA.Editor
var bitmap = new Bitmap(shp.Width, shp.Height, PixelFormat.Format8bppIndexed);
bitmap.Palette = p.AsSystemPalette();
var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
var data = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
unsafe

View File

@@ -0,0 +1,334 @@
<StyleCopSettings Version="105">
<Analyzers>
<Analyzer AnalyzerId="StyleCop.CSharp.DocumentationRules">
<Rules>
<Rule Name="ElementsMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PartialElementsMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="EnumerationItemsMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DocumentationMustContainValidXml">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationMustHaveSummary">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PartialElementDocumentationMustHaveSummary">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationMustHaveSummaryText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PartialElementDocumentationMustHaveSummaryText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationMustNotHaveDefaultSummary">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementParametersMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementParameterDocumentationMustMatchElementParameters">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementParameterDocumentationMustDeclareParameterName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementParameterDocumentationMustHaveText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementReturnValueMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementReturnValueDocumentationMustHaveText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="VoidReturnValueMustNotBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="GenericTypeParametersMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="GenericTypeParametersMustBeDocumentedPartialClass">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="GenericTypeParameterDocumentationMustMatchTypeParameters">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="GenericTypeParameterDocumentationMustDeclareParameterName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="GenericTypeParameterDocumentationMustHaveText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PropertySummaryDocumentationMustMatchAccessors">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PropertySummaryDocumentationMustOmitSetAccessorWithRestrictedAccess">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationMustNotBeCopiedAndPasted">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="SingleLineCommentsMustNotUseDocumentationStyleSlashes">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DocumentationTextMustNotBeEmpty">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DocumentationTextMustContainWhitespace">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DocumentationMustMeetCharacterPercentage">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ConstructorSummaryDocumentationMustBeginWithStandardText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DestructorSummaryDocumentationMustBeginWithStandardText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DocumentationHeadersMustNotContainBlankLines">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="IncludedDocumentationXPathDoesNotExist">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="IncludeNodeDoesNotContainValidFileAndPath">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="InheritDocMustBeUsedWithInheritingClass">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationMustBeSpelledCorrectly">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileMustHaveHeader">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderMustShowCopyright">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderMustHaveCopyrightText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderMustContainFileName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderFileNameDocumentationMustMatchFileName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderMustHaveValidCompanyText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderFileNameDocumentationMustMatchTypeName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.SpacingRules">
<Rules>
<Rule Name="TabsMustNotBeUsed">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.LayoutRules">
<Rules>
<Rule Name="CurlyBracketsForMultiLineStatementsMustNotShareLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="StatementMustNotBeOnSingleLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementMustNotBeOnSingleLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="CurlyBracketsMustNotBeOmitted">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementsMustBeSeparatedByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.OrderingRules">
<Rules>
<Rule Name="UsingDirectivesMustBePlacedWithinNamespace">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementsMustAppearInTheCorrectOrder">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementsMustBeOrderedByAccess">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.ReadabilityRules">
<Rules>
<Rule Name="CodeMustNotContainMultipleStatementsOnOneLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="UseStringEmptyForEmptyStrings">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PrefixLocalCallsWithThis">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PrefixCallsCorrectly">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ParametersMustBeOnSameLineOrSeparateLines">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.MaintainabilityRules">
<Rules>
<Rule Name="AccessModifierMustBeDeclared">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FieldsMustBePrivate">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileMayOnlyContainASingleClass">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ArithmeticExpressionsMustDeclarePrecedence">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
</Analyzers>
</StyleCopSettings>

View File

@@ -26,6 +26,7 @@ namespace OpenRA.Editor
public Map Map { get; private set; }
public TileSet TileSet { get; private set; }
public Palette Palette { get; private set; }
public Palette PlayerPalette { get; private set; }
public int2 Offset;
public int2 GetOffset() { return Offset; }
@@ -35,8 +36,16 @@ namespace OpenRA.Editor
ITool Tool;
public bool IsPanning;
public bool IsErasing;
public bool ShowActorNames;
public bool ShowGrid;
public bool ShowRuler;
public bool IsPaste { get { return TileSelection != null && ResourceSelection != null; } }
public TileReference<ushort, byte>[,] TileSelection;
public TileReference<byte, byte>[,] ResourceSelection;
public CPos SelectionStart;
public CPos SelectionEnd;
public string NewActorOwner;
@@ -45,21 +54,25 @@ namespace OpenRA.Editor
public event Action<KeyValuePair<string, ActorReference>> ActorDoubleClicked = _ => { };
Dictionary<string, ActorTemplate> ActorTemplates = new Dictionary<string, ActorTemplate>();
Dictionary<int, ResourceTemplate> ResourceTemplates = new Dictionary<int, ResourceTemplate>();
public Dictionary<int, ResourceTemplate> ResourceTemplates = new Dictionary<int, ResourceTemplate>();
static readonly Font MarkerFont = new Font(FontFamily.GenericSansSerif, 12.0f, FontStyle.Regular);
static readonly SolidBrush TextBrush = new SolidBrush(Color.Red);
public Keys GetModifiers() { return ModifierKeys; }
public void Bind(Map m, TileSet ts, Palette p)
public void Bind(Map m, TileSet ts, Palette p, Palette pp)
{
Map = m;
TileSet = ts;
Palette = p;
PlayerPalette = pp;
PlayerPalettes = null;
Chunks.Clear();
Tool = null;
}
public void SetTool(ITool tool) { Tool = tool; }
public void SetTool(ITool tool) { Tool = tool; ClearSelection(); }
public void BindActorTemplates(IEnumerable<ActorTemplate> templates)
{
@@ -83,6 +96,8 @@ namespace OpenRA.Editor
UpdateStyles();
}
static readonly Pen SelectionPen = new Pen(Color.Blue);
static readonly Pen PastePen = new Pen(Color.Green);
static readonly Pen CordonPen = new Pen(Color.Red);
int2 MousePos;
@@ -144,10 +159,10 @@ namespace OpenRA.Editor
Scroll(oldMousePos - MousePos);
else
{
if (e.Button == MouseButtons.Right)
if (e.Button == MouseButtons.Right || (IsErasing && e.Button == MouseButtons.Left))
Erase();
if (e.Button == MouseButtons.Left)
if (e.Button == MouseButtons.Left && !IsErasing)
Draw();
Invalidate();
@@ -157,23 +172,23 @@ namespace OpenRA.Editor
void Erase()
{
// Crash preventing
var BrushLocation = GetBrushLocation();
var brushLocation = GetBrushLocation();
if (Map == null || BrushLocation.X >= Map.MapSize.X ||
BrushLocation.Y >= Map.MapSize.Y ||
BrushLocation.X < 0 ||
BrushLocation.Y < 0)
if (Map == null || brushLocation.X >= Map.MapSize.X ||
brushLocation.Y >= Map.MapSize.Y ||
brushLocation.X < 0 ||
brushLocation.Y < 0)
return;
Tool = null;
var key = Map.Actors.Value.FirstOrDefault(a => a.Value.Location() == BrushLocation);
var key = Map.Actors.Value.FirstOrDefault(a => a.Value.Location() == brushLocation);
if (key.Key != null) Map.Actors.Value.Remove(key.Key);
if (Map.MapResources.Value[BrushLocation.X, BrushLocation.Y].type != 0)
if (Map.MapResources.Value[brushLocation.X, brushLocation.Y].type != 0)
{
Map.MapResources.Value[BrushLocation.X, BrushLocation.Y] = new TileReference<byte, byte>();
var ch = new int2((BrushLocation.X) / ChunkSize, (BrushLocation.Y) / ChunkSize);
Map.MapResources.Value[brushLocation.X, brushLocation.Y] = new TileReference<byte, byte>();
var ch = new int2((brushLocation.X) / ChunkSize, (brushLocation.Y) / ChunkSize);
if (Chunks.ContainsKey(ch))
{
Chunks[ch].Dispose();
@@ -182,12 +197,20 @@ namespace OpenRA.Editor
}
AfterChange();
ClearSelection();
}
void Draw()
{
if (Tool != null) Tool.Apply(this);
AfterChange();
if (Tool != null)
{
Tool.Apply(this);
AfterChange();
}
else if (IsPaste)
PasteSelection();
else
SelectionEnd = GetBrushLocationBR();
}
protected override void OnMouseDown(MouseEventArgs e)
@@ -199,7 +222,12 @@ namespace OpenRA.Editor
if (!IsPanning)
{
if (e.Button == MouseButtons.Right) Erase();
if (e.Button == MouseButtons.Left) Draw();
if (e.Button == MouseButtons.Left && !IsErasing)
{
Draw();
if (!IsPaste)
SelectionStart = SelectionEnd = GetBrushLocation();
}
}
Invalidate();
@@ -212,7 +240,7 @@ namespace OpenRA.Editor
var bitmap = new Bitmap(ChunkSize * TileSet.TileSize, ChunkSize * TileSet.TileSize);
var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
var data = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
unsafe
@@ -234,7 +262,7 @@ namespace OpenRA.Editor
if (Map.MapResources.Value[u * ChunkSize + i, v * ChunkSize + j].type != 0)
{
var resourceImage = ResourceTemplates[Map.MapResources.Value[u * ChunkSize + i, v * ChunkSize + j].type].Bitmap;
var srcdata = resourceImage.LockBits(new Rectangle(0, 0, resourceImage.Width, resourceImage.Height),
var srcdata = resourceImage.LockBits(resourceImage.Bounds(),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
int* q = (int*)srcdata.Scan0.ToPointer();
@@ -267,31 +295,42 @@ namespace OpenRA.Editor
return bitmap;
}
public int2 GetBrushLocation()
public CPos GetBrushLocation()
{
var vX = (int)Math.Floor((MousePos.X - Offset.X) / Zoom);
var vY = (int)Math.Floor((MousePos.Y - Offset.Y) / Zoom);
return new int2(vX / TileSet.TileSize, vY / TileSet.TileSize);
return new CPos(vX / TileSet.TileSize, vY / TileSet.TileSize);
}
public void DrawActor(SGraphics g, int2 p, ActorTemplate t, ColorPalette cp)
public CPos GetBrushLocationBR()
{
var vX = (int)Math.Floor((MousePos.X - Offset.X) / Zoom);
var vY = (int)Math.Floor((MousePos.Y - Offset.Y) / Zoom);
return new CPos((vX + TileSet.TileSize - 1) / TileSet.TileSize,
(vY + TileSet.TileSize - 1) / TileSet.TileSize);
}
public void DrawActor(SGraphics g, CPos p, ActorTemplate t, ColorPalette cp)
{
var centered = t.Appearance == null || !t.Appearance.RelativeToTopLeft;
DrawImage(g, t.Bitmap, p, centered, cp);
var actorPalette = cp;
if (t.Appearance != null && t.Appearance.UseTerrainPalette)
actorPalette = Palette.AsSystemPalette();
DrawImage(g, t.Bitmap, p, centered, actorPalette);
}
float2 GetDrawPosition(int2 location, Bitmap bmp, bool centered)
float2 GetDrawPosition(CPos location, Bitmap bmp, bool centered)
{
float OffsetX = centered ? bmp.Width / 2 - TileSet.TileSize / 2 : 0;
float DrawX = TileSet.TileSize * location.X * Zoom + Offset.X - OffsetX;
float offsetX = centered ? bmp.Width / 2 - TileSet.TileSize / 2 : 0;
float drawX = TileSet.TileSize * location.X * Zoom + Offset.X - offsetX;
float OffsetY = centered ? bmp.Height / 2 - TileSet.TileSize / 2 : 0;
float DrawY = TileSet.TileSize * location.Y * Zoom + Offset.Y - OffsetY;
float offsetY = centered ? bmp.Height / 2 - TileSet.TileSize / 2 : 0;
float drawY = TileSet.TileSize * location.Y * Zoom + Offset.Y - offsetY;
return new float2(DrawX, DrawY);
return new float2(drawX, drawY);
}
public void DrawImage(SGraphics g, Bitmap bmp, int2 location, bool centered, ColorPalette cp)
public void DrawImage(SGraphics g, Bitmap bmp, CPos location, bool centered, ColorPalette cp)
{
var drawPos = GetDrawPosition(location, bmp, centered);
@@ -304,7 +343,7 @@ namespace OpenRA.Editor
if (cp != null) bmp.Palette = restorePalette;
}
void DrawActorBorder(SGraphics g, int2 p, ActorTemplate t)
void DrawActorBorder(SGraphics g, CPos p, ActorTemplate t)
{
var centered = t.Appearance == null || !t.Appearance.RelativeToTopLeft;
var drawPos = GetDrawPosition(p, t.Bitmap, centered);
@@ -318,8 +357,8 @@ namespace OpenRA.Editor
{
var pr = Map.Players[name];
var pcpi = Rules.Info["player"].Traits.Get<PlayerColorPaletteInfo>();
var remap = new PlayerColorRemap(pcpi.PaletteFormat, pr.ColorRamp);
return new Palette(Palette, remap).AsSystemPalette();
var remap = new PlayerColorRemap(pcpi.RemapIndex, pr.Color, pcpi.Ramp);
return new Palette(PlayerPalette, remap).AsSystemPalette();
}
Cache<string, ColorPalette> PlayerPalettes;
@@ -352,7 +391,7 @@ namespace OpenRA.Editor
var x = new int2(u / ChunkSize, v / ChunkSize);
if (!Chunks.ContainsKey(x)) Chunks[x] = RenderChunk(u / ChunkSize, v / ChunkSize);
Bitmap bmp = Chunks[x];
var bmp = Chunks[x];
float DrawX = TileSet.TileSize * (float)ChunkSize * (float)x.X * Zoom + Offset.X;
float DrawY = TileSet.TileSize * (float)ChunkSize * (float)x.Y * Zoom + Offset.Y;
@@ -367,6 +406,25 @@ namespace OpenRA.Editor
Map.Bounds.Width * TileSet.TileSize * Zoom,
Map.Bounds.Height * TileSet.TileSize * Zoom);
e.Graphics.DrawRectangle(SelectionPen,
(SelectionStart.X * TileSet.TileSize * Zoom) + Offset.X,
(SelectionStart.Y * TileSet.TileSize * Zoom) + Offset.Y,
(SelectionEnd - SelectionStart).X * TileSet.TileSize * Zoom,
(SelectionEnd - SelectionStart).Y * TileSet.TileSize * Zoom);
if (IsPaste)
{
var loc = GetBrushLocation();
var width = Math.Abs((SelectionStart - SelectionEnd).X);
var height = Math.Abs((SelectionStart - SelectionEnd).Y);
e.Graphics.DrawRectangle(PastePen,
(loc.X * TileSet.TileSize * Zoom) + Offset.X,
(loc.Y * TileSet.TileSize * Zoom) + Offset.Y,
width * (TileSet.TileSize * Zoom),
height * (TileSet.TileSize * Zoom));
}
foreach (var ar in Map.Actors.Value)
{
if (ActorTemplates.ContainsKey(ar.Value.Type))
@@ -385,6 +443,27 @@ namespace OpenRA.Editor
Brushes.White,
Brushes.Black);
if (ShowRuler && Zoom > 0.2)
{
for (int i = Map.Bounds.Left; i <= Map.Bounds.Right; i+=8)
{
if( i % 8 == 0)
{
PointF point = new PointF(i * TileSet.TileSize * Zoom + Offset.X, (Map.Bounds.Top - 8) * TileSet.TileSize * Zoom + Offset.Y);
e.Graphics.DrawString((i - Map.Bounds.Left).ToString(), MarkerFont, TextBrush, point);
}
}
for (int i = Map.Bounds.Top; i <= Map.Bounds.Bottom; i+=8)
{
if (i % 8 == 0)
{
PointF point = new PointF((Map.Bounds.Left - 8) * TileSet.TileSize * Zoom + Offset.X, i * TileSet.TileSize * Zoom + Offset.Y);
e.Graphics.DrawString((i - Map.Bounds.Left).ToString(), MarkerFont, TextBrush, point);
}
}
}
if (Tool != null)
Tool.Preview(this, e.Graphics);
@@ -395,13 +474,74 @@ namespace OpenRA.Editor
DrawActorBorder(e.Graphics, x.Value.Location(), ActorTemplates[x.Value.Type]);
}
}
public void CopySelection()
{
// Grab tiles and resources within selection (doesn't do actors)
var start = SelectionStart;
var end = SelectionEnd;
if (start == end) return;
int width = Math.Abs((start - end).X);
int height = Math.Abs((start - end).Y);
TileSelection = new TileReference<ushort, byte>[width, height];
ResourceSelection = new TileReference<byte, byte>[width, height];
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
//TODO: crash prevention
TileSelection[x, y] = Map.MapTiles.Value[start.X + x, start.Y + y];
ResourceSelection[x, y] = Map.MapResources.Value[start.X + x, start.Y + y];
}
}
}
void PasteSelection()
{
var loc = GetBrushLocation();
var width = Math.Abs((SelectionStart - SelectionEnd).X);
var height = Math.Abs((SelectionStart - SelectionEnd).Y);
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
var mapX = loc.X + x;
var mapY = loc.Y + y;
//TODO: crash prevention for outside of bounds
Map.MapTiles.Value[mapX, mapY] = TileSelection[x, y];
Map.MapResources.Value[mapX, mapY] = ResourceSelection[x, y];
var ch = new int2(mapX / ChunkSize, mapY / ChunkSize);
if (Chunks.ContainsKey(ch))
{
Chunks[ch].Dispose();
Chunks.Remove(ch);
}
}
}
AfterChange();
}
void ClearSelection()
{
SelectionStart = CPos.Zero;
SelectionEnd = CPos.Zero;
TileSelection = null;
ResourceSelection = null;
}
}
static class ActorReferenceExts
{
public static int2 Location(this ActorReference ar)
public static CPos Location(this ActorReference ar)
{
return ar.InitDict.Get<LocationInit>().value;
return (CPos)ar.InitDict.Get<LocationInit>().value;
}
public static void DrawStringContrast(this SGraphics g, Font f, string s, int x, int y, Brush fg, Brush bg)

View File

@@ -41,41 +41,6 @@ namespace OpenRA
return a.GetTypes().Select(t => t.Namespace).Distinct().Where(n => n != null);
}
public static string ReadAllText(this Stream s)
{
using (s)
using (var sr = new StreamReader(s))
return sr.ReadToEnd();
}
public static byte[] ReadAllBytes(this Stream s)
{
using (s)
{
var data = new byte[s.Length - s.Position];
s.Read(data, 0, data.Length);
return data;
}
}
public static void Write(this Stream s, byte[] data)
{
s.Write(data, 0, data.Length);
}
public static IEnumerable<string> ReadAllLines(this Stream s)
{
using (var sr = new StreamReader(s))
for (; ; )
{
var line = sr.ReadLine();
if (line == null)
yield break;
else
yield return line;
}
}
public static bool HasAttribute<T>(this MemberInfo mi)
{
return mi.GetCustomAttributes(typeof(T), true).Length != 0;
@@ -145,6 +110,14 @@ namespace OpenRA
return xs[r.Next(xs.Length)];
}
public static T RandomOrDefault<T>(this IEnumerable<T> ts, Thirdparty.Random r)
{
if (!ts.Any())
return default(T);
return ts.Random(r);
}
public static float Product(this IEnumerable<float> xs)
{
return xs.Aggregate(1f, (a, x) => a * x);
@@ -172,9 +145,113 @@ namespace OpenRA
return v;
}
public static bool IsPowerOf2(int v)
{
return (v & (v - 1)) == 0;
}
public static Size NextPowerOf2(this Size s) { return new Size(NextPowerOf2(s.Width), NextPowerOf2(s.Height)); }
public static string JoinWith<T>(this IEnumerable<T> ts, string j)
{
return string.Join(j, ts.Select(t => t.ToString()).ToArray());
}
public static IEnumerable<T> Append<T>( this IEnumerable<T> ts, params T[] moreTs)
{
return ts.Concat(moreTs);
}
public static Dictionary<TKey, TSource> ToDictionaryWithConflictLog<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, string debugName, Func<TKey, string> logKey, Func<TSource, string> logValue)
{
return ToDictionaryWithConflictLog(source, keySelector, x => x, debugName, logKey, logValue);
}
public static Dictionary<TKey, TElement> ToDictionaryWithConflictLog<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, string debugName, Func<TKey, string> logKey, Func<TElement, string> logValue)
{
// Fall back on ToString() if null functions are provided:
logKey = logKey ?? (s => s.ToString());
logValue = logValue ?? (s => s.ToString());
// Try to build a dictionary and log all duplicates found (if any):
var dupKeys = new Dictionary<TKey, List<string>>();
var d = new Dictionary<TKey, TElement>();
foreach (var item in source)
{
TKey key = keySelector(item);
TElement element = elementSelector(item);
// Check for a key conflict:
if (d.ContainsKey(key))
{
List<string> dupKeyMessages;
if (!dupKeys.TryGetValue(key, out dupKeyMessages))
{
// Log the initial conflicting value already inserted:
dupKeyMessages = new List<string>();
dupKeyMessages.Add(logValue(d[key]));
dupKeys.Add(key, dupKeyMessages);
}
// Log this conflicting value:
dupKeyMessages.Add(logValue(element));
continue;
}
d.Add(key, element);
}
// If any duplicates were found, log it and throw a descriptive error
if (dupKeys.Count > 0)
{
string badKeysFormatted = String.Join(", ", dupKeys.Select(p => "{0}: [{1}]".F(logKey(p.Key), String.Join(",", p.Value.ToArray()))).ToArray());
string msg = "{0}, duplicate values found for the following keys: {1}".F(debugName, badKeysFormatted);
Log.Write("debug", msg);
throw new ArgumentException(msg);
}
// Return the dictionary we built:
return d;
}
public static Color ColorLerp(float t, Color c1, Color c2)
{
return Color.FromArgb(
(int)(t * c2.A + (1 - t) * c1.A),
(int)(t * c2.R + (1 - t) * c1.R),
(int)(t * c2.G + (1 - t) * c1.G),
(int)(t * c2.B + (1 - t) * c1.B));
}
public static T[] MakeArray<T>(int count, Func<int, T> f)
{
T[] result = new T[count];
for (int i = 0; i < count; i++)
result[i] = f(i);
return result;
}
public static Rectangle Bounds(this Bitmap b) { return new Rectangle(0, 0, b.Width, b.Height); }
public static int ToBits(this IEnumerable<bool> bits)
{
var i = 0;
var result = 0;
foreach (var b in bits)
if (b)
result |= (1 << i++);
else
i++;
if (i > 33)
throw new InvalidOperationException("ToBits only accepts up to 32 values.");
return result;
}
}
public static class Enum<T>
{
public static T Parse(string s) { return (T)Enum.Parse(typeof(T), s); }
public static T[] GetValues() { return (T[])Enum.GetValues(typeof(T)); }
}
}

View File

@@ -56,6 +56,11 @@ namespace OpenRA.FileFormats
ret = GetValue( fieldName, fieldType, n[ 0 ].Value.Value );
return true;
}
else if ( n.Count > 1 )
{
throw new InvalidOperationException("The field {0} has multiple definitions:\n{1}"
.F(fieldName, n.Select(m => "\t- " + m.Location).JoinWith("\n")));
}
throw new InvalidOperationException( "TryGetValueFromYaml: unable to load field {0} (of type {1})".F( fieldName, fieldType ) );
}
@@ -143,19 +148,74 @@ namespace OpenRA.FileFormats
return InvalidValueAction(x,fieldType, field);
}
else if (fieldType == typeof(ColorRamp))
else if (fieldType == typeof(HSLColor))
{
var parts = x.Split(',');
if (parts.Length == 4)
return new ColorRamp(
// Allow old ColorRamp format to be parsed as HSLColor
if (parts.Length == 3 || parts.Length == 4)
return new HSLColor(
(byte)int.Parse(parts[0]).Clamp(0, 255),
(byte)int.Parse(parts[1]).Clamp(0, 255),
(byte)int.Parse(parts[2]).Clamp(0, 255),
(byte)int.Parse(parts[3]).Clamp(0, 255));
(byte)int.Parse(parts[2]).Clamp(0, 255));
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(WRange))
{
WRange res;
if (WRange.TryParse(x, out res))
return res;
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(WVec))
{
var parts = x.Split(',');
if (parts.Length == 3)
{
WRange rx, ry, rz;
if (WRange.TryParse(parts[0], out rx) && WRange.TryParse(parts[1], out ry) && WRange.TryParse(parts[2], out rz))
return new WVec(rx, ry, rz);
}
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(WPos))
{
var parts = x.Split(',');
if (parts.Length == 3)
{
WRange rx, ry, rz;
if (WRange.TryParse(parts[0], out rx) && WRange.TryParse(parts[1], out ry) && WRange.TryParse(parts[2], out rz))
return new WPos(rx, ry, rz);
}
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(WAngle))
{
int res;
if (int.TryParse(x, out res))
return new WAngle(res);
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(WRot))
{
var parts = x.Split(',');
if (parts.Length == 3)
{
int rr, rp, ry;
if (int.TryParse(x, out rr) && int.TryParse(x, out rp) && int.TryParse(x, out ry))
return new WRot(new WAngle(rr), new WAngle(rp), new WAngle(ry));
}
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType.IsEnum)
{
if (!Enum.GetNames(fieldType).Select(a => a.ToLower()).Contains(x.ToLower()))
@@ -320,6 +380,10 @@ namespace OpenRA.FileFormats
((int)c.B).Clamp(0, 255));
}
// Don't save floats in settings.yaml using country-specific decimal separators which can be misunderstood as group seperators.
if (t == typeof(float))
return ((float)v).ToString(CultureInfo.InvariantCulture);
if (t == typeof(Rectangle))
{
var r = (Rectangle)v;
@@ -342,4 +406,11 @@ namespace OpenRA.FileFormats
}
public class FieldFromYamlKeyAttribute : Attribute { }
// mirrors DescriptionAttribute from System.ComponentModel but we dont want to have to use that everywhere.
public class DescAttribute : Attribute
{
public readonly string[] Lines;
public DescAttribute(params string[] lines) { Lines = lines; }
}
}

View File

@@ -19,24 +19,6 @@ namespace OpenRA.FileFormats
{
const string pubkeyStr = "AihRvNoIbTn85FZRYNZRcT+i6KpU+maCsEqr3Q5q+LDB5tH7Tz2qQ38V";
static sbyte[] char2num = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
class PublicKey
{
public uint[] key1 = new uint[64];
@@ -128,25 +110,9 @@ namespace OpenRA.FileFormats
void init_pubkey()
{
int i = 0;
uint i2, tmp;
byte[] keytmp = new byte[256];
init_bignum(pubkey.key2, 0x10001, 64);
i2 = 0;
while (i < pubkeyStr.Length)
{
tmp = (uint)char2num[pubkeyStr[i++]];
tmp <<= 6; tmp |= (uint)(byte)char2num[pubkeyStr[i++]];
tmp <<= 6; tmp |= (uint)(byte)char2num[pubkeyStr[i++]];
tmp <<= 6; tmp |= (uint)(byte)char2num[pubkeyStr[i++]];
keytmp[i2++] = (byte)((tmp >> 16) & 0xff);
keytmp[i2++] = (byte)((tmp >> 8) & 0xff);
keytmp[i2++] = (byte)(tmp & 0xff);
}
key_to_bignum(pubkey.key1, keytmp, 64);
key_to_bignum(pubkey.key1, Convert.FromBase64String(pubkeyStr), 64);
pubkey.len = bitlen_bignum(pubkey.key1, 64) - 1;
}

View File

@@ -0,0 +1,125 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
namespace OpenRA.FileFormats
{
/// <summary>
/// Static class that uses a lookup table to calculates CRC32
/// checksums of input strings.
/// </summary>
public static class CRC32
{
/// <summary>
/// The CRC32 lookup table
/// </summary>
static uint[] lookUp = new uint[256]
{
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
/// <summary>
/// A fast (native) CRC32 implementation that can be used on a regular byte arrays.
/// </summary>
/// <param name="data">The data from which to calculate the checksum.</param>
/// <param name="polynomal">The polynomal.</param>
/// <returns>
/// The calculated checksum.
/// </returns>
public static uint Calculate(byte[] data, uint polynomal = 0xFFFFFFFF)
{
uint crc = polynomal;
for (int i = 0; i < data.Length; i++)
crc = (crc >> 8) ^ lookUp[(crc & 0xFF) ^ data[i]];
crc ^= polynomal;
return crc;
}
/// <summary>
/// A fast (native) CRC32 implementation that can be used on a pinned byte array using
/// default polynomal.
/// </summary>
/// <param name="data"> [in,out] If non-null, the.</param>
/// <param name="len"> The length of the data data.</param>
/// <param name="polynomal">The polynomal to xor with.</param>
/// <returns>The calculated checksum.</returns>
public static unsafe uint Calculate(byte* data, uint len, uint polynomal = 0xFFFFFFFF)
{
uint crc = polynomal;
for (int i = 0; i < len; i++)
crc = (crc >> 8) ^ lookUp[(crc & 0xFF) ^ *data++];
crc ^= polynomal;
return crc;
}
}
}

View File

@@ -45,7 +45,7 @@ namespace OpenRA.FileFormats
static void ReplicatePrevious( byte[] dest, int destIndex, int srcIndex, int count )
{
if( srcIndex > destIndex )
throw new NotImplementedException( string.Format( "srcIndex > destIndex {0} {1}", srcIndex, destIndex ) );
throw new NotImplementedException("srcIndex > destIndex {0} {1}".F(srcIndex, destIndex));
if( destIndex - srcIndex == 1 )
{
@@ -105,7 +105,7 @@ namespace OpenRA.FileFormats
int count = ctx.ReadWord();
int srcIndex = ctx.ReadWord();
if( srcIndex >= destIndex )
throw new NotImplementedException( string.Format( "srcIndex >= destIndex {0} {1}", srcIndex, destIndex ) );
throw new NotImplementedException("srcIndex >= destIndex {0} {1}".F(srcIndex, destIndex));
for( int end = destIndex + count ; destIndex < end ; destIndex++ )
dest[ destIndex ] = dest[ srcIndex++ ];
@@ -116,7 +116,7 @@ namespace OpenRA.FileFormats
int count = count3 + 3;
int srcIndex = ctx.ReadWord();
if( srcIndex >= destIndex )
throw new NotImplementedException( string.Format( "srcIndex >= destIndex {0} {1}", srcIndex, destIndex ) );
throw new NotImplementedException("srcIndex >= destIndex {0} {1}".F(srcIndex, destIndex));
for( int end = destIndex + count ; destIndex < end ; destIndex++ )
dest[ destIndex ] = dest[ srcIndex++ ];

View File

@@ -0,0 +1,75 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.IO;
using System.Text;
namespace OpenRA.FileFormats
{
public class WavLoader
{
public readonly int FileSize;
public readonly string Format;
public readonly int FmtChunkSize;
public readonly int AudioFormat;
public readonly int Channels;
public readonly int SampleRate;
public readonly int ByteRate;
public readonly int BlockAlign;
public readonly int BitsPerSample;
public readonly int DataSize;
public readonly byte[] RawOutput;
public WavLoader(Stream s)
{
while (s.Position < s.Length)
{
if ((s.Position & 1) == 1)
s.ReadByte(); // Alignment
var type = s.ReadASCII(4);
switch (type)
{
case "RIFF":
FileSize = s.ReadInt32();
Format = s.ReadASCII(4);
if (Format != "WAVE")
throw new NotSupportedException("Not a canonical WAVE file.");
break;
case "fmt ":
FmtChunkSize = s.ReadInt32();
if (FmtChunkSize != 16)
throw new NotSupportedException("{0} fmt chunk size is not a supported encoding scheme.".F(FmtChunkSize));
AudioFormat = s.ReadInt16();
if (AudioFormat != 1)
throw new NotSupportedException("Non-PCM compression is not supported.");
Channels = s.ReadInt16();
SampleRate = s.ReadInt32();
ByteRate = s.ReadInt32();
BlockAlign = s.ReadInt16();
BitsPerSample = s.ReadInt16();
break;
case "data":
DataSize = s.ReadInt32();
RawOutput = s.ReadBytes(DataSize);
break;
default:
// Ignore unknown chunks
var chunkSize = s.ReadInt32();
s.ReadBytes(chunkSize);
break;
}
}
}
}
}

View File

@@ -0,0 +1,44 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System.Collections.Generic;
using System.IO;
namespace OpenRA.FileFormats
{
public class XccGlobalDatabase
{
public readonly string[] Entries;
public XccGlobalDatabase(Stream s)
{
var entries = new List<string>();
var reader = new BinaryReader(s);
while (reader.PeekChar() > -1)
{
var count = reader.ReadInt32();
for (var i = 0; i < count; i++)
{
var chars = new List<char>();
char c;
// Read filename
while ((c = reader.ReadChar()) != 0)
chars.Add(c);
entries.Add(new string(chars.ToArray()));
// Skip comment
while ((c = reader.ReadChar()) != 0);
}
}
Entries = entries.ToArray();
}
}
}

View File

@@ -0,0 +1,67 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace OpenRA.FileFormats
{
public class XccLocalDatabase
{
public readonly string[] Entries;
public XccLocalDatabase(Stream s)
{
// Skip unnecessary header data
s.Seek(48, SeekOrigin.Begin);
var reader = new BinaryReader(s);
var count = reader.ReadInt32();
Entries = new string[count];
for (var i = 0; i < count; i++)
{
var chars = new List<char>();
char c;
while ((c = reader.ReadChar()) != 0)
chars.Add(c);
Entries[i] = new string(chars.ToArray());
}
}
public XccLocalDatabase(IEnumerable<string> filenames)
{
Entries = filenames.ToArray();
}
public byte[] Data()
{
var data = new MemoryStream();
using (var writer = new BinaryWriter(data))
{
writer.Write(Encoding.ASCII.GetBytes("XCC by Olaf van der Spek"));
writer.Write(new byte[] {0x1A,0x04,0x17,0x27,0x10,0x19,0x80,0x00});
writer.Write((int)(Entries.Aggregate(Entries.Length, (a,b) => a + b.Length) + 52)); // Size
writer.Write((int)0); // Type
writer.Write((int)0); // Version
writer.Write((int)0); // Game/Format (0 == TD)
writer.Write((int)Entries.Length); // Entries
foreach (var e in Entries)
{
writer.Write(Encoding.ASCII.GetBytes(e));
writer.Write((byte)0);
}
}
return data.ToArray();
}
}
}

View File

@@ -0,0 +1,102 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
namespace OpenRA.FileFormats
{
public class D2kSoundResources : IFolder
{
readonly Stream s;
readonly string filename;
readonly List<string> filenames;
readonly int priority;
readonly Dictionary<uint, PackageEntry> index = new Dictionary<uint, PackageEntry>();
public D2kSoundResources(string filename, int priority)
{
this.filename = filename;
this.priority = priority;
s = FileSystem.Open(filename);
s.Seek(0, SeekOrigin.Begin);
filenames = new List<string>();
var headerLength = s.ReadUInt32();
while (s.Position < headerLength + 4)
{
var name = s.ReadASCIIZ();
var offset = s.ReadUInt32();
var length = s.ReadUInt32();
var hash = PackageEntry.HashFilename(name, PackageHashType.Classic);
if (!index.ContainsKey(hash))
index.Add(hash, new PackageEntry(hash, offset, length));
filenames.Add(name);
}
}
public Stream GetContent(uint hash)
{
PackageEntry e;
if (!index.TryGetValue(hash, out e))
return null;
s.Seek(e.Offset, SeekOrigin.Begin);
var data = new byte[e.Length];
s.Read(data, 0, (int)e.Length);
return new MemoryStream(data);
}
public Stream GetContent(string filename)
{
return GetContent(PackageEntry.HashFilename(filename, PackageHashType.Classic));
}
public bool Exists(string filename)
{
return index.ContainsKey(PackageEntry.HashFilename(filename, PackageHashType.Classic));
}
public IEnumerable<string> AllFileNames()
{
return filenames;
}
public string Name { get { return filename; } }
public int Priority { get { return 1000 + priority; }}
public IEnumerable<uint> ClassicHashes()
{
return index.Keys;
}
public IEnumerable<uint> CrcHashes()
{
yield break;
}
public void Write(Dictionary<string, byte[]> contents)
{
throw new NotImplementedException("Cannot save Dune 2000 Sound Resources.");
}
}
}

View File

@@ -18,29 +18,33 @@ namespace OpenRA.FileFormats
{
public static class FileSystem
{
static List<IFolder> mountedFolders = new List<IFolder>();
public static List<IFolder> MountedFolders = new List<IFolder>();
static Cache<uint, List<IFolder>> classicHashIndex = new Cache<uint, List<IFolder>>( _ => new List<IFolder>() );
static Cache<uint, List<IFolder>> crcHashIndex = new Cache<uint, List<IFolder>>( _ => new List<IFolder>() );
static Cache<uint, List<IFolder>> allFiles = new Cache<uint, List<IFolder>>( _ => new List<IFolder>() );
public static List<string> FolderPaths = new List<string>();
static void MountInner(IFolder folder)
{
mountedFolders.Add(folder);
MountedFolders.Add(folder);
foreach( var hash in folder.AllFileHashes() )
foreach (var hash in folder.ClassicHashes())
{
var l = allFiles[hash];
if( !l.Contains( folder ) )
l.Add( folder );
var l = classicHashIndex[hash];
if (!l.Contains(folder))
l.Add(folder);
}
foreach (var hash in folder.CrcHashes())
{
var l = crcHashIndex[hash];
if (!l.Contains(folder))
l.Add(folder);
}
}
static int order = 0;
static IFolder OpenPackage(string filename)
{
return OpenPackage(filename, order++);
}
public static IFolder CreatePackage(string filename, int order, Dictionary<string, byte[]> content)
{
if (filename.EndsWith(".mix", StringComparison.InvariantCultureIgnoreCase))
@@ -49,20 +53,28 @@ namespace OpenRA.FileFormats
return new ZipFile(filename, order, content);
else if (filename.EndsWith(".oramap", StringComparison.InvariantCultureIgnoreCase))
return new ZipFile(filename, order, content);
else if (filename.EndsWith(".RS", StringComparison.InvariantCultureIgnoreCase))
throw new NotImplementedException("Creating .RS archives is unsupported");
else if (filename.EndsWith(".Z", StringComparison.InvariantCultureIgnoreCase))
throw new NotImplementedException("Creating .Z archives is unsupported");
else
return new Folder(filename, order, content);
}
public static IFolder OpenPackage(string filename, int order)
public static IFolder OpenPackage(string filename, string annotation, int order)
{
if (filename.EndsWith(".mix", StringComparison.InvariantCultureIgnoreCase))
return new MixFile(filename, order);
{
var type = string.IsNullOrEmpty(annotation) ? PackageHashType.Classic :
FieldLoader.GetValue<PackageHashType>("(value)", annotation);
return new MixFile(filename, type, order);
}
else if (filename.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
return new ZipFile(filename, order);
else if (filename.EndsWith(".oramap", StringComparison.InvariantCultureIgnoreCase))
return new ZipFile(filename, order);
else if (filename.EndsWith(".RS", StringComparison.InvariantCultureIgnoreCase))
return new D2kSoundResources(filename, order);
else if (filename.EndsWith(".Z", StringComparison.InvariantCultureIgnoreCase))
return new InstallShieldPackage(filename, order);
else
@@ -70,6 +82,11 @@ namespace OpenRA.FileFormats
}
public static void Mount(string name)
{
Mount(name, null);
}
public static void Mount(string name, string annotation)
{
var optional = name.StartsWith("~");
if (optional) name = name.Substring(1);
@@ -78,7 +95,8 @@ namespace OpenRA.FileFormats
if (name.StartsWith("^"))
name = Platform.SupportDir+name.Substring(1);
var a = (Action)(() => FileSystem.MountInner(OpenPackage(name)));
FolderPaths.Add(name);
Action a = () => FileSystem.MountInner(OpenPackage(name, annotation, order++));
if (optional)
try { a(); }
@@ -89,30 +107,36 @@ namespace OpenRA.FileFormats
public static void UnmountAll()
{
mountedFolders.Clear();
allFiles = new Cache<uint, List<IFolder>>( _ => new List<IFolder>() );
MountedFolders.Clear();
FolderPaths.Clear();
classicHashIndex = new Cache<uint, List<IFolder>>(_ => new List<IFolder>());
crcHashIndex = new Cache<uint, List<IFolder>>(_ => new List<IFolder>());
}
public static bool Unmount(IFolder mount)
{
return (mountedFolders.RemoveAll(f => f == mount) > 0);
return (MountedFolders.RemoveAll(f => f == mount) > 0);
}
public static void Mount(IFolder mount)
{
if (!mountedFolders.Contains(mount)) mountedFolders.Add(mount);
if (!MountedFolders.Contains(mount)) MountedFolders.Add(mount);
}
public static void LoadFromManifest( Manifest manifest )
public static void LoadFromManifest(Manifest manifest)
{
UnmountAll();
foreach (var dir in manifest.Folders) Mount(dir);
foreach (var pkg in manifest.Packages) Mount(pkg);
foreach (var dir in manifest.Folders)
Mount(dir);
foreach (var pkg in manifest.Packages)
Mount(pkg.Key, pkg.Value);
}
static Stream GetFromCache( Cache<uint, List<IFolder>> index, string filename )
static Stream GetFromCache(PackageHashType type, string filename)
{
var folder = index[PackageEntry.HashFilename(filename)]
var index = type == PackageHashType.CRC32 ? crcHashIndex : classicHashIndex;
var folder = index[PackageEntry.HashFilename(filename, type)]
.Where(x => x.Exists(filename))
.OrderBy(x => x.Priority)
.FirstOrDefault();
@@ -123,76 +147,59 @@ namespace OpenRA.FileFormats
return null;
}
public static Stream Open(string filename)
public static Stream Open(string filename) { return OpenWithExts(filename, ""); }
public static Stream OpenWithExts(string filename, params string[] exts)
{
if( filename.IndexOfAny( new char[] { '/', '\\' } ) == -1 )
if (filename.IndexOfAny(new char[] { '/', '\\' } ) == -1)
{
var ret = GetFromCache( allFiles, filename );
if( ret != null )
return ret;
}
var folder = mountedFolders
.Where(x => x.Exists(filename))
.OrderByDescending(x => x.Priority)
.FirstOrDefault();
if (folder != null)
return folder.GetContent(filename);
throw new FileNotFoundException( string.Format( "File not found: {0}", filename ), filename );
}
public static Stream OpenWithExts( string filename, params string[] exts )
{
if( filename.IndexOfAny( new char[] { '/', '\\' } ) == -1 )
{
foreach( var ext in exts )
foreach (var ext in exts)
{
var s = GetFromCache( allFiles, filename + ext );
if( s != null )
var s = GetFromCache(PackageHashType.Classic, filename + ext);
if (s != null)
return s;
s = GetFromCache(PackageHashType.CRC32, filename + ext);
if (s != null)
return s;
}
}
foreach( var ext in exts )
foreach (var ext in exts)
{
foreach( IFolder folder in mountedFolders )
if (folder.Exists(filename + ext))
return folder.GetContent( filename + ext );
var folder = MountedFolders
.Where(x => x.Exists(filename + ext))
.OrderByDescending(x => x.Priority)
.FirstOrDefault();
if (folder != null)
return folder.GetContent(filename + ext);
}
throw new FileNotFoundException( string.Format( "File not found: {0}", filename ), filename );
throw new FileNotFoundException("File not found: {0}".F(filename), filename);
}
public static bool Exists(string filename)
{
foreach (var folder in mountedFolders)
if (folder.Exists(filename))
return true;
return false;
}
public static bool Exists(string filename) { return MountedFolders.Any(f => f.Exists(filename)); }
static Dictionary<string, Assembly> assemblyCache = new Dictionary<string, Assembly>();
public static Assembly ResolveAssembly(object sender, ResolveEventArgs e)
{
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (assembly.FullName == e.Name)
return assembly;
}
string[] frags = e.Name.Split(',');
var frags = e.Name.Split(',');
var filename = frags[0] + ".dll";
Assembly a;
if (assemblyCache.TryGetValue(filename, out a))
return a;
if (FileSystem.Exists(filename))
using (Stream s = FileSystem.Open(filename))
using (var s = FileSystem.Open(filename))
{
byte[] buf = new byte[s.Length];
var buf = new byte[s.Length];
s.Read(buf, 0, buf.Length);
a = Assembly.Load(buf);
assemblyCache.Add(filename, a);

View File

@@ -17,8 +17,7 @@ namespace OpenRA.FileFormats
public class Folder : IFolder
{
readonly string path;
int priority;
readonly int priority;
// Create a new folder package
public Folder(string path, int priority, Dictionary<string, byte[]> contents)
@@ -45,22 +44,30 @@ namespace OpenRA.FileFormats
catch { return null; }
}
public IEnumerable<uint> AllFileHashes()
public IEnumerable<uint> ClassicHashes()
{
foreach( var filename in Directory.GetFiles( path, "*", SearchOption.TopDirectoryOnly ) )
yield return PackageEntry.HashFilename( Path.GetFileName(filename) );
foreach (var filename in Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly))
yield return PackageEntry.HashFilename(Path.GetFileName(filename), PackageHashType.Classic);
}
public IEnumerable<uint> CrcHashes()
{
yield break;
}
public IEnumerable<string> AllFileNames()
{
foreach (var filename in Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly))
yield return Path.GetFileName(filename);
}
public bool Exists(string filename)
{
return File.Exists(Path.Combine(path,filename));
return File.Exists(Path.Combine(path, filename));
}
public int Priority
{
get { return priority; }
}
public int Priority { get { return priority; } }
public string Name { get { return path; } }
public void Write(Dictionary<string, byte[]> contents)
{

View File

@@ -18,13 +18,17 @@ namespace OpenRA.FileFormats
public class InstallShieldPackage : IFolder
{
readonly Dictionary<uint, PackageEntry> index = new Dictionary<uint, PackageEntry>();
readonly List<string> filenames;
readonly Stream s;
readonly long dataStart = 255;
int priority;
readonly int priority;
readonly string filename;
public InstallShieldPackage(string filename, int priority)
{
this.filename = filename;
this.priority = priority;
filenames = new List<string>();
s = FileSystem.Open(filename);
// Parse package header
@@ -45,11 +49,20 @@ namespace OpenRA.FileFormats
// Parse the directory list
s.Seek(TOCAddress, SeekOrigin.Begin);
BinaryReader TOCreader = new BinaryReader(s);
var fileCountInDirs = new List<uint>();
// Parse directories
for (var i = 0; i < DirCount; i++)
ParseDirectory(TOCreader);
fileCountInDirs.Add(ParseDirectory(TOCreader));
// Parse files
foreach (var fileCount in fileCountInDirs)
for (var i = 0; i < fileCount; i++)
ParseFile(reader);
}
void ParseDirectory(BinaryReader reader)
uint ParseDirectory(BinaryReader reader)
{
// Parse directory header
var FileCount = reader.ReadUInt16();
@@ -59,10 +72,7 @@ namespace OpenRA.FileFormats
// Skip to the end of the chunk
reader.ReadBytes(ChunkSize - NameLength - 6);
// Parse files
for (var i = 0; i < FileCount; i++)
ParseFile(reader);
return FileCount;
}
uint AccumulatedData = 0;
@@ -76,8 +86,10 @@ namespace OpenRA.FileFormats
var NameLength = reader.ReadByte();
var FileName = new String(reader.ReadChars(NameLength));
var hash = PackageEntry.HashFilename(FileName);
index.Add(hash, new PackageEntry(hash,AccumulatedData, CompressedSize));
var hash = PackageEntry.HashFilename(FileName, PackageHashType.Classic);
if (!index.ContainsKey(hash))
index.Add(hash, new PackageEntry(hash,AccumulatedData, CompressedSize));
filenames.Add(FileName);
AccumulatedData += CompressedSize;
// Skip to the end of the chunk
@@ -90,33 +102,40 @@ namespace OpenRA.FileFormats
if (!index.TryGetValue(hash, out e))
return null;
s.Seek( dataStart + e.Offset, SeekOrigin.Begin );
byte[] data = new byte[ e.Length ];
s.Read( data, 0, (int)e.Length );
s.Seek(dataStart + e.Offset, SeekOrigin.Begin);
var data = new byte[e.Length];
s.Read(data, 0, (int)e.Length);
return new MemoryStream(Blast.Decompress(data));
}
public Stream GetContent(string filename)
{
return GetContent(PackageEntry.HashFilename(filename));
return GetContent(PackageEntry.HashFilename(filename, PackageHashType.Classic));
}
public IEnumerable<uint> AllFileHashes()
public IEnumerable<uint> ClassicHashes()
{
return index.Keys;
}
public IEnumerable<uint> CrcHashes()
{
yield break;
}
public IEnumerable<string> AllFileNames()
{
return filenames;
}
public bool Exists(string filename)
{
return index.ContainsKey(PackageEntry.HashFilename(filename));
return index.ContainsKey(PackageEntry.HashFilename(filename, PackageHashType.Classic));
}
public int Priority
{
get { return 2000 + priority; }
}
public int Priority { get { return 2000 + priority; }}
public string Name { get { return filename; } }
public void Write(Dictionary<string, byte[]> contents)
{

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -10,6 +10,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
@@ -19,123 +20,145 @@ namespace OpenRA.FileFormats
{
Stream GetContent(string filename);
bool Exists(string filename);
IEnumerable<uint> AllFileHashes();
IEnumerable<uint> ClassicHashes();
IEnumerable<uint> CrcHashes();
IEnumerable<string> AllFileNames();
void Write(Dictionary<string, byte[]> contents);
int Priority { get; }
string Name { get; }
}
public class MixFile : IFolder
{
readonly Dictionary<uint, PackageEntry> index;
readonly bool isRmix, isEncrypted;
readonly long dataStart;
readonly Stream s;
int priority;
readonly int priority;
readonly string filename;
readonly PackageHashType type;
// Create a new MixFile
// Save a mix to disk with the given contents
public MixFile(string filename, int priority, Dictionary<string, byte[]> contents)
{
this.filename = filename;
this.priority = priority;
this.type = PackageHashType.Classic;
if (File.Exists(filename))
File.Delete(filename);
s = File.Create(filename);
index = new Dictionary<uint, PackageEntry>();
contents.Add("local mix database.dat", new XccLocalDatabase(contents.Keys.Append("local mix database.dat")).Data());
Write(contents);
}
public MixFile(string filename, int priority)
public MixFile(string filename, PackageHashType type, int priority)
{
this.filename = filename;
this.priority = priority;
this.type = type;
s = FileSystem.Open(filename);
BinaryReader reader = new BinaryReader(s);
uint signature = reader.ReadUInt32();
// Detect format type
s.Seek(0, SeekOrigin.Begin);
var isCncMix = s.ReadUInt16() != 0;
isRmix = 0 == (signature & ~(uint)(MixFileFlags.Checksum | MixFileFlags.Encrypted));
// The C&C mix format doesn't contain any flags or encryption
var isEncrypted = false;
if (!isCncMix)
isEncrypted = (s.ReadUInt16() & 0x2) != 0;
if (isRmix)
List<PackageEntry> entries;
if (isEncrypted)
{
isEncrypted = 0 != (signature & (uint)MixFileFlags.Encrypted);
if( isEncrypted )
{
index = ParseRaHeader( s, out dataStart ).ToDictionary(x => x.Hash);
return;
}
long unused;
entries = ParseHeader(DecryptHeader(s, 4, out dataStart), 0, out unused);
}
else
s.Seek( 0, SeekOrigin.Begin );
entries = ParseHeader(s, isCncMix ? 0 : 4, out dataStart);
isEncrypted = false;
index = ParseTdHeader(s, out dataStart).ToDictionary(x => x.Hash);
index = entries.ToDictionaryWithConflictLog(x => x.Hash,
"{0} ({1} format, Encrypted: {2}, DataStart: {3})".F(filename, (isCncMix ? "C&C" : "RA/TS/RA2"), isEncrypted, dataStart),
null, x => "(offs={0}, len={1})".F(x.Offset, x.Length)
);
}
const long headerStart = 84;
List<PackageEntry> ParseRaHeader(Stream s, out long dataStart)
List<PackageEntry> ParseHeader(Stream s, long offset, out long headerEnd)
{
BinaryReader reader = new BinaryReader(s);
byte[] keyblock = reader.ReadBytes(80);
byte[] blowfishKey = new BlowfishKeyProvider().DecryptKey(keyblock);
s.Seek(offset, SeekOrigin.Begin);
var numFiles = s.ReadUInt16();
/*uint dataSize = */s.ReadUInt32();
uint[] h = ReadUints(reader, 2);
var items = new List<PackageEntry>();
for (var i = 0; i < numFiles; i++)
items.Add(new PackageEntry(s));
Blowfish fish = new Blowfish(blowfishKey);
MemoryStream ms = Decrypt( h, fish );
BinaryReader reader2 = new BinaryReader(ms);
ushort numFiles = reader2.ReadUInt16();
reader2.ReadUInt32(); /*datasize*/
s.Position = headerStart;
reader = new BinaryReader(s);
int byteCount = 6 + numFiles * PackageEntry.Size;
h = ReadUints( reader, ( byteCount + 3 ) / 4 );
ms = Decrypt( h, fish );
dataStart = headerStart + byteCount + ( ( ~byteCount + 1 ) & 7 );
long ds;
return ParseTdHeader( ms, out ds );
headerEnd = offset + 6 + numFiles*PackageEntry.Size;
return items;
}
static MemoryStream Decrypt( uint[] h, Blowfish fish )
MemoryStream DecryptHeader(Stream s, long offset, out long headerEnd)
{
uint[] decrypted = fish.Decrypt( h );
s.Seek(offset, SeekOrigin.Begin);
MemoryStream ms = new MemoryStream();
BinaryWriter writer = new BinaryWriter( ms );
foreach( uint t in decrypted )
writer.Write( t );
// Decrypt blowfish key
var keyblock = s.ReadBytes(80);
var blowfishKey = new BlowfishKeyProvider().DecryptKey(keyblock);
var fish = new Blowfish(blowfishKey);
// Decrypt first block to work out the header length
var ms = Decrypt(ReadBlocks(s, offset + 80, 1), fish);
var numFiles = ms.ReadUInt16();
// Decrypt the full header - round bytes up to a full block
var blockCount = (13 + numFiles*PackageEntry.Size)/8;
headerEnd = offset + 80 + blockCount*8;
return Decrypt(ReadBlocks(s, offset + 80, blockCount), fish);
}
static MemoryStream Decrypt(uint[] h, Blowfish fish)
{
var decrypted = fish.Decrypt(h);
var ms = new MemoryStream();
var writer = new BinaryWriter(ms);
foreach(var t in decrypted)
writer.Write(t);
writer.Flush();
ms.Position = 0;
ms.Seek(0, SeekOrigin.Begin);
return ms;
}
uint[] ReadUints(BinaryReader r, int count)
uint[] ReadBlocks(Stream s, long offset, int count)
{
uint[] ret = new uint[count];
for (int i = 0; i < ret.Length; i++)
ret[i] = r.ReadUInt32();
s.Seek(offset, SeekOrigin.Begin);
// A block is a single encryption unit (represented as two 32-bit integers)
var ret = new uint[2*count];
for (var i = 0; i < ret.Length; i++)
ret[i] = s.ReadUInt32();
return ret;
}
List<PackageEntry> ParseTdHeader(Stream s, out long dataStart)
uint? FindMatchingHash(string filename)
{
List<PackageEntry> items = new List<PackageEntry>();
var hash = PackageEntry.HashFilename(filename, type);
if (index.ContainsKey(hash))
return hash;
BinaryReader reader = new BinaryReader(s);
ushort numFiles = reader.ReadUInt16();
/*uint dataSize = */reader.ReadUInt32();
// Maybe we were given a raw hash?
uint raw;
if (!uint.TryParse(filename, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out raw))
return null;
for (int i = 0; i < numFiles; i++)
items.Add(new PackageEntry(reader));
if ("{0:X}".F(raw) == filename && index.ContainsKey(raw))
return raw;
dataStart = s.Position;
return items;
return null;
}
public Stream GetContent(uint hash)
@@ -144,33 +167,71 @@ namespace OpenRA.FileFormats
if (!index.TryGetValue(hash, out e))
return null;
s.Seek( dataStart + e.Offset, SeekOrigin.Begin );
byte[] data = new byte[ e.Length ];
s.Read( data, 0, (int)e.Length );
s.Seek(dataStart + e.Offset, SeekOrigin.Begin);
var data = new byte[e.Length];
s.Read(data, 0, (int)e.Length);
return new MemoryStream(data);
}
public Stream GetContent(string filename)
{
return GetContent(PackageEntry.HashFilename(filename));
var hash = FindMatchingHash(filename);
return hash.HasValue ? GetContent(hash.Value) : null;
}
public IEnumerable<uint> AllFileHashes()
static readonly uint[] Nothing = {};
public IEnumerable<uint> ClassicHashes()
{
return index.Keys;
if (type == PackageHashType.Classic)
return index.Keys;
return Nothing;
}
public IEnumerable<uint> CrcHashes()
{
if (type == PackageHashType.CRC32)
return index.Keys;
return Nothing;
}
public IEnumerable<string> AllFileNames()
{
var lookup = new Dictionary<uint, string>();
if (Exists("local mix database.dat"))
{
var db = new XccLocalDatabase(GetContent("local mix database.dat"));
foreach (var e in db.Entries)
{
var hash = PackageEntry.HashFilename(e, type);
if (!lookup.ContainsKey(hash))
lookup.Add(hash, e);
}
}
if (FileSystem.Exists("global mix database.dat"))
{
var db = new XccGlobalDatabase(FileSystem.Open("global mix database.dat"));
foreach (var e in db.Entries)
{
var hash = PackageEntry.HashFilename(e, type);
if (!lookup.ContainsKey(hash))
lookup.Add(hash, e);
}
}
return index.Keys.Select(k => lookup.ContainsKey(k) ? lookup[k] : "{0:X}".F(k));
}
public bool Exists(string filename)
{
return index.ContainsKey(PackageEntry.HashFilename(filename));
}
public int Priority
{
get { return 1000 + priority; }
return FindMatchingHash(filename).HasValue;
}
public int Priority { get { return 1000 + priority; } }
public string Name { get { return filename; } }
public void Write(Dictionary<string, byte[]> contents)
{
// Cannot modify existing mixfile - rename existing file and
@@ -186,14 +247,14 @@ namespace OpenRA.FileFormats
var items = new List<PackageEntry>();
foreach (var kv in contents)
{
uint length = (uint)kv.Value.Length;
uint hash = PackageEntry.HashFilename(Path.GetFileName(kv.Key));
var length = (uint)kv.Value.Length;
var hash = PackageEntry.HashFilename(Path.GetFileName(kv.Key), type);
items.Add(new PackageEntry(hash, dataSize, length));
dataSize += length;
}
// Write the new file
s.Seek(0,SeekOrigin.Begin);
s.Seek(0, SeekOrigin.Begin);
using (var writer = new BinaryWriter(s))
{
// Write file header
@@ -210,11 +271,4 @@ namespace OpenRA.FileFormats
}
}
}
[Flags]
enum MixFileFlags : uint
{
Checksum = 0x10000,
Encrypted = 0x20000,
}
}

View File

@@ -51,7 +51,6 @@ namespace OpenRA.FileFormats
public Stream GetContent(string filename)
{
using (var z = pkg.GetInputStream(pkg.GetEntry(filename)))
{
var ms = new MemoryStream();
@@ -65,10 +64,21 @@ namespace OpenRA.FileFormats
}
}
public IEnumerable<uint> AllFileHashes()
public IEnumerable<uint> ClassicHashes()
{
foreach(ZipEntry entry in pkg)
yield return PackageEntry.HashFilename(entry.Name);
yield return PackageEntry.HashFilename(entry.Name, PackageHashType.Classic);
}
public IEnumerable<uint> CrcHashes()
{
yield break;
}
public IEnumerable<string> AllFileNames()
{
foreach(ZipEntry entry in pkg)
yield return entry.Name;
}
public bool Exists(string filename)
@@ -76,10 +86,8 @@ namespace OpenRA.FileFormats
return pkg.GetEntry(filename) != null;
}
public int Priority
{
get { return 500 + priority; }
}
public int Priority { get { return 500 + priority; } }
public string Name { get { return filename; } }
public void Write(Dictionary<string, byte[]> contents)
{

View File

@@ -36,23 +36,23 @@ namespace OpenRA.FileFormats
public readonly byte[] LookupTable;
public byte[] Image;
public Dune2ImageHeader(BinaryReader reader)
public Dune2ImageHeader(Stream s)
{
Flags = (Dune2ImageFlags)reader.ReadUInt16();
Slices = reader.ReadByte();
Width = reader.ReadUInt16();
Height = reader.ReadByte();
FileSize = reader.ReadUInt16();
DataSize = reader.ReadUInt16();
Flags = (Dune2ImageFlags)s.ReadUInt16();
Slices = s.ReadUInt8();
Width = s.ReadUInt16();
Height = s.ReadUInt8();
FileSize = s.ReadUInt16();
DataSize = s.ReadUInt16();
if (Flags == Dune2ImageFlags.L16_F80_F2_1 ||
Flags == Dune2ImageFlags.L16_F80_F2_2 ||
Flags == Dune2ImageFlags.Ln_F80_F2)
{
int n = Flags == Dune2ImageFlags.Ln_F80_F2 ? reader.ReadByte() : (byte)16;
int n = Flags == Dune2ImageFlags.Ln_F80_F2 ? s.ReadUInt8() : (byte)16;
LookupTable = new byte[n];
for (int i = 0; i < n; i++)
LookupTable[i] = reader.ReadByte();
LookupTable[i] = s.ReadUInt8();
}
else
{
@@ -78,16 +78,14 @@ namespace OpenRA.FileFormats
List<Dune2ImageHeader> headers = new List<Dune2ImageHeader>();
public Dune2ShpReader(Stream stream)
public Dune2ShpReader(Stream s)
{
BinaryReader reader = new BinaryReader(stream);
ImageCount = reader.ReadUInt16();
ImageCount = s.ReadUInt16();
//Last offset is pointer to end of file.
uint[] offsets = new uint[ImageCount + 1];
uint temp = reader.ReadUInt32();
uint temp = s.ReadUInt32();
//If fourth byte in file is non-zero, the offsets are two bytes each.
bool twoByteOffsets = (temp & 0xFF0000) > 0;
@@ -100,13 +98,13 @@ namespace OpenRA.FileFormats
offsets[0] = temp + 2;
for (int i = twoByteOffsets ? 2 : 1; i < ImageCount + 1; i++)
offsets[i] = (twoByteOffsets ? reader.ReadUInt16() : reader.ReadUInt32()) + 2;
offsets[i] = (twoByteOffsets ? s.ReadUInt16() : s.ReadUInt32()) + 2;
for (int i = 0; i < ImageCount; i++)
{
reader.BaseStream.Seek(offsets[i], SeekOrigin.Begin);
Dune2ImageHeader header = new Dune2ImageHeader(reader);
byte[] imgData = reader.ReadBytes(header.FileSize);
s.Seek(offsets[i], SeekOrigin.Begin);
Dune2ImageHeader header = new Dune2ImageHeader(s);
byte[] imgData = s.ReadBytes(header.FileSize);
header.Image = new byte[header.Height * header.Width];
//Decode image data

View File

@@ -0,0 +1,57 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.IO;
using System.Linq;
namespace OpenRA.FileFormats
{
public class HvaReader
{
public readonly uint FrameCount;
public readonly uint LimbCount;
public readonly float[] Transforms;
public HvaReader(Stream s)
{
// Index swaps for transposing a matrix
var ids = new byte[]{0,4,8,12,1,5,9,13,2,6,10,14};
s.Seek(16, SeekOrigin.Begin);
FrameCount = s.ReadUInt32();
LimbCount = s.ReadUInt32();
// Skip limb names
s.Seek(16*LimbCount, SeekOrigin.Current);
Transforms = new float[16*FrameCount*LimbCount];
for (var j = 0; j < FrameCount; j++)
for (var i = 0; i < LimbCount; i++)
{
// Convert to column-major matrices and add the final matrix row
var c = 16*(LimbCount*j + i);
Transforms[c + 3] = 0;
Transforms[c + 7] = 0;
Transforms[c + 11] = 0;
Transforms[c + 15] = 1;
for (var k = 0; k < 12; k++)
Transforms[c + ids[k]] = s.ReadFloat();
}
}
public static HvaReader Load(string filename)
{
using (var s = File.OpenRead(filename))
return new HvaReader(s);
}
}
}

View File

@@ -37,10 +37,10 @@ namespace OpenRA.FileFormats.Graphics
IVertexBuffer<Vertex> CreateVertexBuffer( int length );
ITexture CreateTexture( Bitmap bitmap );
ITexture CreateTexture();
IFrameBuffer CreateFrameBuffer(Size s);
IShader CreateShader( string name );
Size WindowSize { get; }
int GpuMemoryUsed { get; }
void Clear();
void Present();
@@ -51,6 +51,12 @@ namespace OpenRA.FileFormats.Graphics
void SetLineWidth( float width );
void EnableScissor( int left, int top, int width, int height );
void DisableScissor();
void EnableDepthBuffer();
void DisableDepthBuffer();
void EnableAlphaBlending();
void DisableAlphaBlending();
}
public interface IVertexBuffer<T>
@@ -61,9 +67,12 @@ namespace OpenRA.FileFormats.Graphics
public interface IShader
{
void SetValue( string name, float x, float y );
void SetValue( string param, ITexture texture );
void Render( Action a );
void SetVec(string name, float x);
void SetVec(string name, float x, float y);
void SetVec(string name, float[] vec, int length);
void SetTexture(string param, ITexture texture);
void SetMatrix(string param, float[] mtx);
void Render(Action a);
}
public interface ITexture
@@ -71,6 +80,15 @@ namespace OpenRA.FileFormats.Graphics
void SetData(Bitmap bitmap);
void SetData(uint[,] colors);
void SetData(byte[] colors, int width, int height);
byte[] GetData();
Size Size { get; }
}
public interface IFrameBuffer
{
void Bind();
void Unbind();
ITexture Texture { get; }
}
public enum PrimitiveType

View File

@@ -97,7 +97,7 @@ namespace OpenRA.FileFormats.Graphics
case "IEND":
{
var bits = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
var bits = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
using (var ns = new MemoryStream(data.ToArray()))

View File

@@ -8,10 +8,10 @@
*/
#endregion
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
namespace OpenRA.FileFormats
{
@@ -30,9 +30,9 @@ namespace OpenRA.FileFormats
public ImageHeader( BinaryReader reader )
{
Offset = reader.ReadUInt32();
Format = (Format)( Offset >> 24 );
Offset &= 0xFFFFFF;
var data = reader.ReadUInt32();
Offset = data & 0xffffff;
Format = (Format)(data >> 24);
RefOffset = reader.ReadUInt16();
RefFormat = (Format)reader.ReadUInt16();
@@ -48,14 +48,9 @@ namespace OpenRA.FileFormats
}
}
public enum Format
{
Format20 = 0x20,
Format40 = 0x40,
Format80 = 0x80,
}
public enum Format { Format20 = 0x20, Format40 = 0x40, Format80 = 0x80 }
public class ShpReader : IEnumerable<ImageHeader>
public class ShpReader
{
public readonly int ImageCount;
public readonly ushort Width;
@@ -67,74 +62,71 @@ namespace OpenRA.FileFormats
int recurseDepth = 0;
public ShpReader( Stream stream )
public ShpReader(Stream stream)
{
BinaryReader reader = new BinaryReader( stream );
ImageCount = reader.ReadUInt16();
reader.ReadUInt16();
reader.ReadUInt16();
Width = reader.ReadUInt16();
Height = reader.ReadUInt16();
reader.ReadUInt32();
for( int i = 0 ; i < ImageCount ; i++ )
headers.Add( new ImageHeader( reader ) );
new ImageHeader( reader ); // end-of-file header
new ImageHeader( reader ); // all-zeroes header
Dictionary<uint, ImageHeader> offsets = new Dictionary<uint, ImageHeader>();
foreach( ImageHeader h in headers )
offsets.Add( h.Offset, h );
for( int i = 0 ; i < ImageCount ; i++ )
using (var reader = new BinaryReader(stream))
{
ImageHeader h = headers[ i ];
if( h.Format == Format.Format20 )
h.RefImage = headers[ i - 1 ];
ImageCount = reader.ReadUInt16();
reader.ReadUInt16();
reader.ReadUInt16();
Width = reader.ReadUInt16();
Height = reader.ReadUInt16();
reader.ReadUInt32();
else if( h.Format == Format.Format40 )
for (int i = 0 ; i < ImageCount ; i++)
headers.Add(new ImageHeader(reader));
new ImageHeader(reader); // end-of-file header
new ImageHeader(reader); // all-zeroes header
var offsets = headers.ToDictionary(h => h.Offset, h =>h);
for (int i = 0 ; i < ImageCount ; i++)
{
if( !offsets.TryGetValue( h.RefOffset, out h.RefImage ) )
throw new InvalidDataException( string.Format( "Reference doesnt point to image data {0}->{1}", h.Offset, h.RefOffset ) );
var h = headers[ i ];
if (h.Format == Format.Format20)
h.RefImage = headers[i - 1];
else if (h.Format == Format.Format40)
if (!offsets.TryGetValue(h.RefOffset, out h.RefImage))
throw new InvalidDataException("Reference doesnt point to image data {0}->{1}".F(h.Offset, h.RefOffset));
}
foreach (ImageHeader h in headers)
Decompress(stream, h);
}
foreach( ImageHeader h in headers )
Decompress( stream, h );
}
public ImageHeader this[ int index ]
public ImageHeader this[int index]
{
get { return headers[ index ]; }
get { return headers[index]; }
}
void Decompress( Stream stream, ImageHeader h )
void Decompress(Stream stream, ImageHeader h)
{
if( recurseDepth > ImageCount )
throw new InvalidDataException( "Format20/40 headers contain infinite loop" );
if (recurseDepth > ImageCount)
throw new InvalidDataException("Format20/40 headers contain infinite loop");
switch( h.Format )
switch(h.Format)
{
case Format.Format20:
case Format.Format40:
{
if( h.RefImage.Image == null )
if (h.RefImage.Image == null)
{
++recurseDepth;
Decompress( stream, h.RefImage );
Decompress(stream, h.RefImage);
--recurseDepth;
}
h.Image = CopyImageData( h.RefImage.Image );
h.Image = CopyImageData(h.RefImage.Image);
Format40.DecodeInto(ReadCompressedData(stream, h), h.Image);
break;
}
case Format.Format80:
{
byte[] imageBytes = new byte[ Width * Height ];
Format80.DecodeInto( ReadCompressedData( stream, h ), imageBytes );
var imageBytes = new byte[Width * Height];
Format80.DecodeInto(ReadCompressedData(stream, h), imageBytes);
h.Image = imageBytes;
break;
}
@@ -143,37 +135,28 @@ namespace OpenRA.FileFormats
}
}
static byte[] ReadCompressedData( Stream stream, ImageHeader h )
static byte[] ReadCompressedData(Stream stream, ImageHeader h)
{
stream.Position = h.Offset;
// Actually, far too big. There's no length field with the correct length though :(
int compressedLength = (int)( stream.Length - stream.Position );
// TODO: Actually, far too big. There's no length field with the correct length though :(
var compressedLength = (int)(stream.Length - stream.Position);
byte[] compressedBytes = new byte[ compressedLength ];
var compressedBytes = new byte[ compressedLength ];
stream.Read( compressedBytes, 0, compressedLength );
//MemoryStream ms = new MemoryStream( compressedBytes );
return compressedBytes;
}
byte[] CopyImageData( byte[] baseImage )
byte[] CopyImageData(byte[] baseImage)
{
byte[] imageData = new byte[ Width * Height ];
for( int i = 0 ; i < Width * Height ; i++ )
imageData[ i ] = baseImage[ i ];
var imageData = new byte[Width * Height];
for (int i = 0 ; i < Width * Height ; i++)
imageData[i] = baseImage[i];
return imageData;
}
public IEnumerator<ImageHeader> GetEnumerator()
{
return headers.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerable<ImageHeader> Frames { get { return headers; } }
public static ShpReader Load(string filename)
{

View File

@@ -0,0 +1,615 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see LICENSE.
*/
#endregion
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
namespace OpenRA.FileFormats
{
public struct Header
{
public ushort A;
// Unknown
// Width and Height of the images
public ushort Width;
public ushort Height;
public ushort NumImages;
}
public class HeaderImage
{
public ushort x;
public ushort y;
public ushort cx;
public ushort cy;
// cx and cy are width n height of stored image
public byte compression;
public byte[] align;
public byte[] transparent;
public int zero;
public int offset;
public byte[] Image;
}
public struct SHPData
{
public HeaderImage HeaderImage;
public byte[] Databuffer;
public byte[] FrameImage;
}
public struct SHP
{
public Header Header;
public SHPData[] Data;
}
public class ShpTSReader : IEnumerable<HeaderImage>
{
public readonly int ImageCount;
public readonly ushort Width;
public readonly ushort Height;
public readonly ushort Width2;
public readonly ushort Height2;
public int arroff = 0;
public int erri = 0;
public int errj = 0;
public int errk = 0;
public int errl = 0;
public static int FindNextOffsetFrom(SHP SHP, int Init, int Last)
{
int result;
result = 0;
Last++;
while ((result == 0) && (Init < Last))
{
result = SHP.Data[Init].HeaderImage.offset;
Init++;
}
return result;
}
private readonly List<HeaderImage> headers = new List<HeaderImage>();
public ShpTSReader(Stream s)
{
SHP SHP = new SHP();
int FileSize;
int x;
int k = 0;
int l = 0;
int ImageSize;
int NextOffset;
byte[] FData;
byte cp;
byte[] Databuffer;
FileSize = (int)s.Length;
// Get Header
SHP.Header.A = s.ReadUInt16();
SHP.Header.Width = s.ReadUInt16();
SHP.Header.Height = s.ReadUInt16();
SHP.Header.NumImages = s.ReadUInt16();
SHP.Data = new SHPData[SHP.Header.NumImages + 1];
ImageCount = SHP.Header.NumImages;
for (x = 1; x <= SHP.Header.NumImages; x++)
{
SHP.Data[x].HeaderImage = new HeaderImage();
SHP.Data[x].HeaderImage.x = s.ReadUInt16();
SHP.Data[x].HeaderImage.y = s.ReadUInt16();
SHP.Data[x].HeaderImage.cx = s.ReadUInt16();
SHP.Data[x].HeaderImage.cy = s.ReadUInt16();
SHP.Data[x].HeaderImage.compression = s.ReadUInt8();
SHP.Data[x].HeaderImage.align = s.ReadBytes(3);
s.ReadInt32();
SHP.Data[x].HeaderImage.zero = s.ReadUInt8();
SHP.Data[x].HeaderImage.transparent = s.ReadBytes(3);
SHP.Data[x].HeaderImage.offset = s.ReadInt32();
}
Width = SHP.Header.Width;
Height = SHP.Header.Height;
for (int i = 0; i < ImageCount; i++)
{
headers.Add(SHP.Data[i+1].HeaderImage);
}
// Read and decode each image from the file
for (x = 1; x <= SHP.Header.NumImages; x++)
{
headers[x - 1].Image = new byte[(Width * Height)];
for (int i = 0; i < headers[x - 1].Image.Length; i++)
headers[x - 1].Image[i] = 0;
FData = new byte[(Width * Height)];
// Does it really reads the frame?
if (SHP.Data[x].HeaderImage.offset != 0)
{
try
{
// Now it checks the compression:
if ((SHP.Data[x].HeaderImage.compression == 3))
{
// decode it
// Compression 3
NextOffset = FindNextOffsetFrom(SHP, x + 1, SHP.Header.NumImages);
if (NextOffset != 0)
{
ImageSize = NextOffset - SHP.Data[x].HeaderImage.offset;
Databuffer = new byte[ImageSize];
for (int i = 0; i < ImageSize; i++)
{
s.Seek(SHP.Data[x].HeaderImage.offset + i, SeekOrigin.Begin);
Databuffer[i] = s.ReadUInt8();
}
SHP.Data[x].Databuffer = new byte[(SHP.Data[x].HeaderImage.cx * SHP.Data[x].HeaderImage.cy)];
Decode3(Databuffer, ref SHP.Data[x].Databuffer, SHP.Data[x].HeaderImage.cx, SHP.Data[x].HeaderImage.cy, ref FileSize);
k = 0;
l = 0;
for (int i = 0; i < Height; i++)
{
erri = i;
for (int j = SHP.Data[x].HeaderImage.x; j < Width; j++)
{
errj = j;
errl = l;
errk = k;
arroff = i + j + l;
if (((j + 1) > (SHP.Data[x].HeaderImage.cx + SHP.Data[x].HeaderImage.x)) || ((i + 1) > (SHP.Data[x].HeaderImage.cy)))
cp = 0;
else
cp = SHP.Data[x].Databuffer[i + (j - SHP.Data[x].HeaderImage.x) + l];
FData[i + j + k] = cp;
if (j == (SHP.Data[x].HeaderImage.cx + SHP.Data[x].HeaderImage.x - 1))
l = l + (SHP.Data[x].HeaderImage.cx - 1);
if (j == (Width - 1))
k = k + (Width - 1);
}
}
//FData = headers[x - 1].Image;
k = 0;
for (int i = 0; i < (Height - SHP.Data[x].HeaderImage.y); i++)
{
for (int j = 0; j < Width; j++)
{
headers[x - 1].Image[i + j + k + (Width * SHP.Data[x].HeaderImage.y)] = FData[i + j + k];
if (j == (Width - 1))
{
k = k + (Width - 1);
}
}
}
}
else
{
ImageSize = 0;
ImageSize = FileSize - SHP.Data[x].HeaderImage.offset;
Databuffer = new byte[ImageSize];
for (int i = 0; i < ImageSize; i++)
{
s.Seek(SHP.Data[x].HeaderImage.offset + i, SeekOrigin.Begin);
Databuffer[i] = s.ReadUInt8();
}
SHP.Data[x].Databuffer = new byte[((SHP.Data[x].HeaderImage.cx * SHP.Data[x].HeaderImage.cy))];
Decode3(Databuffer, ref SHP.Data[x].Databuffer, SHP.Data[x].HeaderImage.cx, SHP.Data[x].HeaderImage.cy, ref ImageSize);
k = 0;
l = 0;
for (int i = 0; i < Height; i++)
{
erri = i;
for (int j = SHP.Data[x].HeaderImage.x; j < Width; j++)
{
errj = j;
errl = l;
errk = k;
arroff = i + j + l;
if (((j + 1) > (SHP.Data[x].HeaderImage.cx + SHP.Data[x].HeaderImage.x)) || ((i + 1) > (SHP.Data[x].HeaderImage.cy)))
cp = 0;
else
cp = SHP.Data[x].Databuffer[i + (j - SHP.Data[x].HeaderImage.x) + l];
FData[i + j + k] = cp;
if (j == (SHP.Data[x].HeaderImage.cx + SHP.Data[x].HeaderImage.x - 1))
l = l + (SHP.Data[x].HeaderImage.cx - 1);
if (j == (Width - 1))
k = k + (Width - 1);
}
}
//FData = headers[x - 1].Image;
k = 0;
for (int i = 0; i < (Height - SHP.Data[x].HeaderImage.y); i++)
{
for (int j = 0; j < Width; j++)
{
headers[x - 1].Image[i + j + k + (Width * SHP.Data[x].HeaderImage.y)] = FData[i + j + k];
if (j == (Width - 1))
{
k = k + (Width - 1);
}
}
}
}
}
else if ((SHP.Data[x].HeaderImage.compression == 2))
{
NextOffset = FindNextOffsetFrom(SHP, x + 1, SHP.Header.NumImages);
if (NextOffset != 0)
{
ImageSize = NextOffset - SHP.Data[x].HeaderImage.offset;
SHP.Data[x].Databuffer = new byte[(SHP.Data[x].HeaderImage.cx * SHP.Data[x].HeaderImage.cy)];
Databuffer = new byte[ImageSize];
for (int i = 0; i < ImageSize; i++)
{
s.Seek(SHP.Data[x].HeaderImage.offset + i, SeekOrigin.Begin);
Databuffer[i] = s.ReadUInt8();
}
Decode2(Databuffer, ref SHP.Data[x].Databuffer, SHP.Data[x].HeaderImage.cx, SHP.Data[x].HeaderImage.cy, ref ImageSize);
k = 0;
l = 0;
for (int i = 0; i < Height; i++)
{
erri = i;
for (int j = SHP.Data[x].HeaderImage.x; j < Width; j++)
{
errj = j;
errl = l;
errk = k;
arroff = i + j + l;
if (((j + 1) > (SHP.Data[x].HeaderImage.cx + SHP.Data[x].HeaderImage.x)) || ((i + 1) > (SHP.Data[x].HeaderImage.cy)))
cp = 0;
else
cp = SHP.Data[x].Databuffer[i + (j - SHP.Data[x].HeaderImage.x) + l];
FData[i + j + k] = cp;
if (j == (SHP.Data[x].HeaderImage.cx + SHP.Data[x].HeaderImage.x - 1))
l = l + (SHP.Data[x].HeaderImage.cx - 1);
if (j == (Width - 1))
k = k + (Width - 1);
}
}
//FData = headers[x - 1].Image;
k = 0;
for (int i = 0; i < (Height - SHP.Data[x].HeaderImage.y); i++)
{
for (int j = 0; j < Width; j++)
{
headers[x - 1].Image[i + j + k + (Width * SHP.Data[x].HeaderImage.y)] = FData[i + j + k];
if (j == (Width - 1))
{
k = k + (Width - 1);
}
}
}
// Compression 2
}
else
{
ImageSize = 0;
ImageSize = FileSize - SHP.Data[x].HeaderImage.offset;
Databuffer = new byte[ImageSize];
for (int i = 0; i < ImageSize; i++)
{
s.Seek(SHP.Data[x].HeaderImage.offset + i, SeekOrigin.Begin);
Databuffer[i] = s.ReadUInt8();
}
SHP.Data[x].Databuffer = new byte[((SHP.Data[x].HeaderImage.cx * SHP.Data[x].HeaderImage.cy))];
Decode2(Databuffer, ref SHP.Data[x].Databuffer, SHP.Data[x].HeaderImage.cx, SHP.Data[x].HeaderImage.cy, ref ImageSize);
k = 0;
l = 0;
for (int i = 0; i < Height; i++)
{
erri = i;
for (int j = SHP.Data[x].HeaderImage.x; j < Width; j++)
{
errj = j;
errl = l;
errk = k;
arroff = i + j + l;
if (((j + 1) > (SHP.Data[x].HeaderImage.cx + SHP.Data[x].HeaderImage.x)) || ((i + 1) > (SHP.Data[x].HeaderImage.cy)))
cp = 0;
else
cp = SHP.Data[x].Databuffer[i + (j - SHP.Data[x].HeaderImage.x) + l];
FData[i + j + k] = cp;
if (j == (SHP.Data[x].HeaderImage.cx + SHP.Data[x].HeaderImage.x - 1))
l = l + (SHP.Data[x].HeaderImage.cx - 1);
if (j == (Width - 1))
k = k + (Width - 1);
}
}
//FData = headers[x - 1].Image;
k = 0;
for (int i = 0; i < (Height - SHP.Data[x].HeaderImage.y); i++)
{
for (int j = 0; j < Width; j++)
{
headers[x - 1].Image[i + j + k + (Width * SHP.Data[x].HeaderImage.y)] = FData[i + j + k];
if (j == (Width - 1))
{
k = k + (Width - 1);
}
}
}
// Compression 2
}
}
else
{
// Compression 1
ImageSize = (int)(SHP.Data[x].HeaderImage.cx * SHP.Data[x].HeaderImage.cy);
Databuffer = new byte[ImageSize];
for (int i = 0; i < ImageSize; i++)
{
s.Seek(SHP.Data[x].HeaderImage.offset + i, SeekOrigin.Begin);
Databuffer[i] = s.ReadUInt8();
}
SHP.Data[x].Databuffer = new byte[(SHP.Data[x].HeaderImage.cx * SHP.Data[x].HeaderImage.cy)];
SHP.Data[x].Databuffer = Databuffer;
k = 0;
l = 0;
for (int i = 0; i < Height; i++)
{
erri = i;
for (int j = SHP.Data[x].HeaderImage.x; j < Width; j++)
{
errj = j;
errl = l;
errk = k;
arroff = i + j + l;
if (((j + 1) > (SHP.Data[x].HeaderImage.cx + SHP.Data[x].HeaderImage.x)) || ((i + 1) > (SHP.Data[x].HeaderImage.cy)))
cp = 0;
else
cp = SHP.Data[x].Databuffer[i + (j - SHP.Data[x].HeaderImage.x) + l];
FData[i + j + k] = cp;
if (j == (SHP.Data[x].HeaderImage.cx + SHP.Data[x].HeaderImage.x - 1))
l = l + (SHP.Data[x].HeaderImage.cx - 1);
if (j == (Width - 1))
k = k + (Width - 1);
}
}
//FData = headers[x - 1].Image;
k = 0;
for (int i = 0; i < (Height - SHP.Data[x].HeaderImage.y); i++)
{
for (int j = 0; j < Width; j++)
{
headers[x - 1].Image[i + j + k + (Width * SHP.Data[x].HeaderImage.y)] = FData[i + j + k];
if (j == (Width - 1))
{
k = k + (Width - 1);
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
// Set the shp's databuffer to the result after decompression
}
//Width = Width2;
//Height = Height2;
}
public HeaderImage this[int index]
{
get { return headers[index]; }
}
public static void ReInterpretWordFromBytes(byte Byte1, byte Byte2, ref ushort FullValue)
{
FullValue = (ushort)((Byte2 * 256) + Byte1);
}
public static void ReInterpretWordFromBytes(byte Byte1, byte Byte2, ref uint FullValue)
{
FullValue = (uint)((Byte2 * 256) + Byte1);
}
// Compression 3:
public static void Decode3(byte[] Source, ref byte[] Dest, int cx, int cy, ref int max)
{
int SP;
int DP;
int x;
int y;
int Count;
int v;
int maxdp;
ushort Pos;
maxdp = cx * cy;
SP = 0;
DP = 0;
Pos = 0;
try
{
for (y = 1; y <= cy; y++)
{
ReInterpretWordFromBytes(Source[SP], Source[SP + 1], ref Pos);
Count = Pos - 2;
SP = SP + 2;
x = 0;
while (Count > 0)
{
Count = Count - 1;
if ((SP > max) || (DP > maxdp))
{
break;
}
else
{
// SP has reached max value, exit
v = Source[SP];
SP++;
if (v != 0)
{
if ((SP > max) || (DP > maxdp))
{
break;
}
else
{
x++;
Dest[DP] += (byte)v;
}
DP++;
}
else
{
Count -= 1;
v = Source[SP];
SP++;
if ((x + v) > cx)
{
v = cx - x;
}
x = x + v;
while (v > 0)
{
if ((SP > max) || (DP > maxdp))
{
break;
}
else
{
v -= 1;
Dest[DP] = 0;
}
DP++;
// SP has reached max value, exit
}
}
}
}
if ((SP >= max) || (DP >= maxdp))
{
return;
}
// SP has reached max value, exit
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public static void Decode2(byte[] Source, ref byte[] Dest, int cx, int cy, ref int max)
{
int SP;
int DP;
int y;
int Count;
int maxdp;
ushort Pos;
maxdp = cx * cy;
SP = 0;
DP = 0;
Pos = 0;
try
{
for (y = 1; y <= cy; y++)
{
ReInterpretWordFromBytes(Source[SP], Source[SP + 1], ref Pos);
Count = Pos - 2;
SP += 2;
while (Count > 0)
{
Count -= 1;
if ((SP > max) || (DP > maxdp))
{
return;
}
// SP has reached max value, exit
Dest[DP] = Source[SP];
SP++;
DP++;
}
if ((SP >= max) || (DP >= maxdp))
{
return;
}
// SP has reached max value, exit
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public IEnumerator<HeaderImage> GetEnumerator()
{
return headers.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public Size Size { get { return new Size(Width, Height); } }
}
}

View File

@@ -24,5 +24,12 @@ namespace OpenRA.FileFormats.Graphics
this.u = uv.X; this.v = uv.Y;
this.p = pc.X; this.c = pc.Y;
}
public Vertex(float[] xyz, float2 uv, float2 pc)
{
this.x = xyz[0]; this.y = xyz[1]; this.z = xyz[2];
this.u = uv.X; this.v = uv.Y;
this.p = pc.X; this.c = pc.Y;
}
}
}

View File

@@ -46,67 +46,66 @@ namespace OpenRA.FileFormats
public byte[] AudioData { get { return audioData; } }
public int CurrentFrame { get { return currentFrame; } }
public VqaReader( Stream stream )
public VqaReader(Stream stream)
{
this.stream = stream;
BinaryReader reader = new BinaryReader( stream );
// Decode FORM chunk
if (new String(reader.ReadChars(4)) != "FORM")
if (stream.ReadASCII(4) != "FORM")
throw new InvalidDataException("Invalid vqa (invalid FORM section)");
/*var length = */ reader.ReadUInt32();
/*var length = */ stream.ReadUInt32();
if (new String(reader.ReadChars(8)) != "WVQAVQHD")
if (stream.ReadASCII(8) != "WVQAVQHD")
throw new InvalidDataException("Invalid vqa (not WVQAVQHD)");
/* var length = */reader.ReadUInt32();
/* var length = */stream.ReadUInt32();
/*var version = */reader.ReadUInt16();
/*var flags = */reader.ReadUInt16();
Frames = reader.ReadUInt16();
Width = reader.ReadUInt16();
Height = reader.ReadUInt16();
/*var version = */stream.ReadUInt16();
/*var flags = */stream.ReadUInt16();
Frames = stream.ReadUInt16();
Width = stream.ReadUInt16();
Height = stream.ReadUInt16();
blockWidth = reader.ReadByte();
blockHeight = reader.ReadByte();
Framerate = reader.ReadByte();
cbParts = reader.ReadByte();
blockWidth = stream.ReadUInt8();
blockHeight = stream.ReadUInt8();
Framerate = stream.ReadUInt8();
cbParts = stream.ReadUInt8();
blocks = new int2(Width / blockWidth, Height / blockHeight);
numColors = reader.ReadUInt16();
/*var maxBlocks = */reader.ReadUInt16();
/*var unknown1 = */reader.ReadUInt16();
/*var unknown2 = */reader.ReadUInt32();
numColors = stream.ReadUInt16();
/*var maxBlocks = */stream.ReadUInt16();
/*var unknown1 = */stream.ReadUInt16();
/*var unknown2 = */stream.ReadUInt32();
// Audio
/*var freq = */reader.ReadUInt16();
/*var channels = */reader.ReadByte();
/*var bits = */reader.ReadByte();
/*var unknown3 = */reader.ReadChars(14);
/*var freq = */stream.ReadUInt16();
/*var channels = */stream.ReadByte();
/*var bits = */stream.ReadByte();
/*var unknown3 = */stream.ReadBytes(14);
var frameSize = Exts.NextPowerOf2(Math.Max(Width,Height));
var frameSize = Exts.NextPowerOf2(Math.Max(Width, Height));
cbf = new byte[Width*Height];
cbp = new byte[Width*Height];
palette = new uint[numColors];
origData = new byte[2*blocks.X*blocks.Y];
frameData = new uint[frameSize,frameSize];
frameData = new uint[frameSize, frameSize];
var type = new String(reader.ReadChars(4));
var type = stream.ReadASCII(4);
if (type != "FINF")
{
reader.ReadBytes(27);
type = new String(reader.ReadChars(4));
stream.Seek(27, SeekOrigin.Current);
type = stream.ReadASCII(4);
}
/*var length = */reader.ReadUInt16();
/*var unknown4 = */reader.ReadUInt16();
/*var length = */stream.ReadUInt16();
/*var unknown4 = */stream.ReadUInt16();
// Frame offsets
offsets = new UInt32[Frames];
for (int i = 0; i < Frames; i++)
{
offsets[i] = reader.ReadUInt32();
if (offsets[i] > 0x40000000) offsets[i] -= 0x40000000;
offsets[i] = stream.ReadUInt32();
if (offsets[i] > 0x40000000)
offsets[i] -= 0x40000000;
offsets[i] <<= 1;
}
@@ -130,28 +129,28 @@ namespace OpenRA.FileFormats
for (var i = 0; i < Frames; i++)
{
stream.Seek(offsets[i], SeekOrigin.Begin);
BinaryReader reader = new BinaryReader(stream);
var end = (i < Frames - 1) ? offsets[i + 1] : stream.Length;
while (reader.BaseStream.Position < end)
while (stream.Position < end)
{
var type = new String(reader.ReadChars(4));
var length = int2.Swap(reader.ReadUInt32());
var type = stream.ReadASCII(4);
var length = int2.Swap(stream.ReadUInt32());
switch (type)
{
case "SND0":
case "SND2":
var rawAudio = reader.ReadBytes((int)length);
var rawAudio = stream.ReadBytes((int)length);
ms.Write(rawAudio);
compressed = (type == "SND2");
break;
default:
reader.ReadBytes((int)length);
stream.ReadBytes((int)length);
break;
}
if (reader.PeekChar() == 0) reader.ReadByte();
// Chunks are aligned on even bytes; advance by a byte if the next one is null
if (stream.Peek() == 0) stream.ReadByte();
}
}
@@ -171,48 +170,47 @@ namespace OpenRA.FileFormats
// Seek to the start of the frame
stream.Seek(offsets[currentFrame], SeekOrigin.Begin);
BinaryReader reader = new BinaryReader(stream);
var end = (currentFrame < Frames - 1) ? offsets[currentFrame+1] : stream.Length;
while(reader.BaseStream.Position < end)
while (stream.Position < end)
{
var type = new String(reader.ReadChars(4));
var length = int2.Swap(reader.ReadUInt32());
var type = stream.ReadASCII(4);
var length = int2.Swap(stream.ReadUInt32());
switch(type)
{
case "VQFR":
DecodeVQFR(reader);
DecodeVQFR(stream);
break;
default:
// Don't parse sound here.
reader.ReadBytes((int)length);
stream.ReadBytes((int)length);
break;
}
// Chunks are aligned on even bytes; advance by a byte if the next one is null
if (reader.PeekChar() == 0) reader.ReadByte();
if (stream.Peek() == 0) stream.ReadByte();
}
}
// VQA Frame
public void DecodeVQFR(BinaryReader reader)
public void DecodeVQFR(Stream s)
{
while(true)
while (true)
{
// Chunks are aligned on even bytes; may be padded with a single null
if (reader.PeekChar() == 0) reader.ReadByte();
var type = new String(reader.ReadChars(4));
int subchunkLength = (int)int2.Swap(reader.ReadUInt32());
if (s.Peek() == 0) s.ReadByte();
var type = s.ReadASCII(4);
int subchunkLength = (int)int2.Swap(s.ReadUInt32());
switch(type)
{
// Full frame-modifier
case "CBFZ":
Format80.DecodeInto( reader.ReadBytes(subchunkLength), cbf );
Format80.DecodeInto(s.ReadBytes(subchunkLength), cbf);
break;
case "CBF0":
cbf = reader.ReadBytes(subchunkLength);
cbf = s.ReadBytes(subchunkLength);
break;
// frame-modifier chunk
@@ -224,12 +222,12 @@ namespace OpenRA.FileFormats
if (type == "CBP0")
cbf = (byte[])cbp.Clone();
else
Format80.DecodeInto( cbp, cbf );
Format80.DecodeInto(cbp, cbf);
cbOffset = cbChunk = 0;
}
var bytes = reader.ReadBytes(subchunkLength);
var bytes = s.ReadBytes(subchunkLength);
bytes.CopyTo(cbp,cbOffset);
cbOffset += subchunkLength;
cbChunk++;
@@ -239,16 +237,16 @@ namespace OpenRA.FileFormats
case "CPL0":
for (int i = 0; i < numColors; i++)
{
byte r = (byte)(reader.ReadByte() << 2);
byte g = (byte)(reader.ReadByte() << 2);
byte b = (byte)(reader.ReadByte() << 2);
byte r = (byte)(s.ReadUInt8() << 2);
byte g = (byte)(s.ReadUInt8() << 2);
byte b = (byte)(s.ReadUInt8() << 2);
palette[i] = (uint)((255 << 24) | (r << 16) | (g << 8) | b);
}
break;
// Frame data
case "VPTZ":
Format80.DecodeInto( reader.ReadBytes(subchunkLength), origData );
Format80.DecodeInto(s.ReadBytes(subchunkLength), origData);
// This is the last subchunk
return;
default:

View File

@@ -0,0 +1,158 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.IO;
namespace OpenRA.FileFormats
{
public enum NormalType { TiberianSun = 2, RedAlert2 = 4 }
public class VxlElement
{
public byte Color;
public byte Normal;
}
public class VxlLimb
{
public string Name;
public float Scale;
public float[] Bounds;
public byte[] Size;
public NormalType Type;
public uint VoxelCount;
public Dictionary<byte, VxlElement>[,] VoxelMap;
}
public class VxlReader
{
public readonly uint LimbCount;
public VxlLimb[] Limbs;
uint BodySize;
void ReadVoxelData(Stream s, VxlLimb l)
{
var baseSize = l.Size[0]*l.Size[1];
var colStart = new int[baseSize];
for (var i = 0; i < baseSize; i++)
colStart[i] = s.ReadInt32();
s.Seek(4*baseSize, SeekOrigin.Current);
var dataStart = s.Position;
// Count the voxels in this limb
l.VoxelCount = 0;
for (var i = 0; i < baseSize; i++)
{
// Empty column
if (colStart[i] == -1)
continue;
s.Seek(dataStart + colStart[i], SeekOrigin.Begin);
var z = 0;
do
{
z += s.ReadUInt8();
var count = s.ReadUInt8();
z += count;
l.VoxelCount += count;
s.Seek(2*count + 1, SeekOrigin.Current);
} while (z < l.Size[2]);
}
// Read the data
l.VoxelMap = new Dictionary<byte, VxlElement>[l.Size[0],l.Size[1]];
for (var i = 0; i < baseSize; i++)
{
// Empty column
if (colStart[i] == -1)
continue;
s.Seek(dataStart + colStart[i], SeekOrigin.Begin);
byte x = (byte)(i % l.Size[0]);
byte y = (byte)(i / l.Size[0]);
byte z = 0;
l.VoxelMap[x,y] = new Dictionary<byte, VxlElement>();
do
{
z += s.ReadUInt8();
var count = s.ReadUInt8();
for (var j = 0; j < count; j++)
{
var v = new VxlElement();
v.Color = s.ReadUInt8();
v.Normal = s.ReadUInt8();
l.VoxelMap[x,y].Add(z, v);
z++;
}
// Skip duplicate count
s.ReadUInt8();
} while (z < l.Size[2]);
}
}
public VxlReader(Stream s)
{
if (!s.ReadASCII(16).StartsWith("Voxel Animation"))
throw new InvalidDataException("Invalid vxl header");
s.ReadUInt32();
LimbCount = s.ReadUInt32();
s.ReadUInt32();
BodySize = s.ReadUInt32();
s.Seek(770, SeekOrigin.Current);
// Read Limb headers
Limbs = new VxlLimb[LimbCount];
for (var i = 0; i < LimbCount; i++)
{
Limbs[i] = new VxlLimb();
Limbs[i].Name = s.ReadASCII(16);
s.Seek(12, SeekOrigin.Current);
}
// Skip to the Limb footers
s.Seek(802 + 28*LimbCount + BodySize, SeekOrigin.Begin);
var LimbDataOffset = new uint[LimbCount];
for (var i = 0; i < LimbCount; i++)
{
LimbDataOffset[i] = s.ReadUInt32();
s.Seek(8, SeekOrigin.Current);
Limbs[i].Scale = s.ReadFloat();
s.Seek(48, SeekOrigin.Current);
Limbs[i].Bounds = new float[6];
for (var j = 0; j < 6; j++)
Limbs[i].Bounds[j] = s.ReadFloat();
Limbs[i].Size = s.ReadBytes(3);
Limbs[i].Type = (NormalType)s.ReadByte();
}
for (var i = 0; i < LimbCount; i++)
{
s.Seek(802 + 28*LimbCount + LimbDataOffset[i], SeekOrigin.Begin);
ReadVoxelData(s, Limbs[i]);
}
}
public static VxlReader Load(string filename)
{
using (var s = File.OpenRead(filename))
return new VxlReader(s);
}
}
}

View File

@@ -12,36 +12,54 @@ using System.Drawing;
namespace OpenRA.FileFormats
{
public struct ColorRamp
public struct HSLColor
{
public byte H,S,L,R;
public readonly byte H;
public readonly byte S;
public readonly byte L;
public readonly Color RGB;
public ColorRamp(byte h, byte s, byte l, byte r)
public HSLColor(byte h, byte s, byte l)
{
H = h; S = s; L = l; R = r;
H = h;
S = s;
L = l;
RGB = RGBFromHSL(H / 255f, S / 255f, L / 255f);
}
public static readonly ColorRamp Empty = new ColorRamp(0,0,0,0);
/* returns a color along the Lum ramp */
public Color GetColor( float t )
public void ToHSV(out float h, out float s, out float v)
{
return ColorFromHSL( H / 255f, S / 255f, float2.Lerp( L / 255f, L*R / (255f * 255f), t ) );
var ll = 2*L / 255f;
var ss = S / 255f * ((ll <= 1) ? ll : 2 - ll);
h = H / 255f;
s = (2 * ss) / (ll + ss);
v = (ll + ss) / 2;
}
public override string ToString()
public static HSLColor FromHSV(float h, float s, float v)
{
return "{0},{1},{2},{3}".F(H, S, L, R);
var ll = 0.5f*(2 - s)*v;
var ss = (ll >= 1 || v <= 0) ? 0 : 0.5f*s*v / (ll <= 0.5f ? ll : 1 - ll);
return new HSLColor((byte)(255*h), (byte)(255*ss), (byte)(255*ll));
}
// hk is hue in the range [0,1] instead of [0,360]
public static Color ColorFromHSL(float hk, float s, float l)
public static HSLColor FromRGB(int r, int g, int b)
{
var c = Color.FromArgb(r, g, b);
var h = (byte)((c.GetHue() / 360.0f) * 255);
var s = (byte)(c.GetSaturation() * 255);
var l = (byte)(c.GetBrightness() * 255);
return new HSLColor(h, s, l);
}
public static Color RGBFromHSL(float h, float s, float l)
{
// Convert from HSL to RGB
var q = (l < 0.5f) ? l * (1 + s) : l + s - (l * s);
var p = 2 * l - q;
float[] trgb = { hk + 1 / 3.0f, hk, hk - 1/3.0f };
float[] trgb = { h + 1 / 3.0f, h, h - 1/3.0f };
float[] rgb = { 0, 0, 0 };
for (int k = 0; k < 3; k++)
@@ -61,21 +79,26 @@ namespace OpenRA.FileFormats
return Color.FromArgb((int)(rgb[0] * 255), (int)(rgb[1] * 255), (int)(rgb[2] * 255));
}
public static bool operator ==(ColorRamp me, ColorRamp other)
public override string ToString()
{
return (me.H == other.H && me.S == other.S && me.L == other.L && me.R == other.R );
return "{0},{1},{2}".F(H, S, L);
}
public static bool operator !=(ColorRamp me, ColorRamp other) { return !(me == other); }
public static bool operator ==(HSLColor me, HSLColor other)
{
return (me.H == other.H && me.S == other.S && me.L == other.L);
}
public override int GetHashCode() { return H.GetHashCode() ^ S.GetHashCode() ^ L.GetHashCode() ^ R.GetHashCode(); }
public static bool operator !=(HSLColor me, HSLColor other) { return !(me == other); }
public override int GetHashCode() { return H.GetHashCode() ^ S.GetHashCode() ^ L.GetHashCode(); }
public override bool Equals(object obj)
{
if (obj == null)
return false;
ColorRamp o = (ColorRamp)obj;
HSLColor o = (HSLColor)obj;
return o == this;
}
}

View File

@@ -9,6 +9,7 @@
#endregion
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace OpenRA.FileFormats
@@ -18,9 +19,12 @@ namespace OpenRA.FileFormats
public class Manifest
{
public readonly string[]
Mods, Folders, Packages, Rules, ServerTraits,
Sequences, Cursors, Chrome, Assemblies, ChromeLayout,
Weapons, Voices, Music, Movies, TileSets, ChromeMetrics;
Mods, Folders, Rules, ServerTraits,
Sequences, VoxelSequences, Cursors, Chrome, Assemblies, ChromeLayout,
Weapons, Voices, Notifications, Music, Movies, TileSets,
ChromeMetrics, PackageContents;
public readonly Dictionary<string, string> Packages;
public readonly MiniYaml LoadScreen;
public readonly Dictionary<string, Pair<string,int>> Fonts;
public readonly int TileSize = 24;
@@ -29,29 +33,34 @@ namespace OpenRA.FileFormats
{
Mods = mods;
var yaml = new MiniYaml(null, mods
.Select(m => MiniYaml.FromFile("mods/" + m + "/mod.yaml"))
.Select(m => MiniYaml.FromFile("mods{0}{1}{0}mod.yaml".F(Path.DirectorySeparatorChar, m)))
.Aggregate(MiniYaml.MergeLiberal)).NodesDict;
// Todo: Use fieldloader
// TODO: Use fieldloader
Folders = YamlList(yaml, "Folders");
Packages = YamlList(yaml, "Packages");
Packages = yaml["Packages"].NodesDict.ToDictionary(x => x.Key, x => x.Value.Value);
Rules = YamlList(yaml, "Rules");
ServerTraits = YamlList(yaml, "ServerTraits");
Sequences = YamlList(yaml, "Sequences");
VoxelSequences = YamlList(yaml, "VoxelSequences");
Cursors = YamlList(yaml, "Cursors");
Chrome = YamlList(yaml, "Chrome");
Assemblies = YamlList(yaml, "Assemblies");
ChromeLayout = YamlList(yaml, "ChromeLayout");
Weapons = YamlList(yaml, "Weapons");
Voices = YamlList(yaml, "Voices");
Notifications = YamlList(yaml, "Notifications");
Music = YamlList(yaml, "Music");
Movies = YamlList(yaml, "Movies");
TileSets = YamlList(yaml, "TileSets");
ChromeMetrics = YamlList(yaml, "ChromeMetrics");
PackageContents = YamlList(yaml, "PackageContents");
LoadScreen = yaml["LoadScreen"];
Fonts = yaml["Fonts"].NodesDict.ToDictionary(x => x.Key, x => Pair.New(x.Value.NodesDict["Font"].Value,
int.Parse(x.Value.NodesDict["Size"].Value)));
Fonts = yaml["Fonts"].NodesDict.ToDictionary(x => x.Key,
x => Pair.New(x.Value.NodesDict["Font"].Value,
int.Parse(x.Value.NodesDict["Size"].Value)));
if (yaml.ContainsKey("TileSize"))
TileSize = int.Parse(yaml["TileSize"].Value);
}
@@ -59,7 +68,7 @@ namespace OpenRA.FileFormats
static string[] YamlList(Dictionary<string, MiniYaml> yaml, string key)
{
if (!yaml.ContainsKey(key))
return new string[ 0 ];
return new string[] {};
return yaml[key].NodesDict.Keys.ToArray();
}

View File

@@ -21,14 +21,17 @@ namespace OpenRA.FileFormats
public bool NonCombatant = false;
public bool Playable = false;
public string Bot = null;
public bool DefaultStartingUnits = false;
public string StartingUnitsClass = null;
public bool AllowBots = true;
public bool Required = false;
public bool LockRace = false;
public string Race;
// ColorRamp naming retained for backward compatibility
public bool LockColor = false;
public ColorRamp ColorRamp = new ColorRamp(0,0,238,34);
public HSLColor ColorRamp = new HSLColor(0,0,238);
public HSLColor Color { get { return ColorRamp; } set { ColorRamp = value; }}
public bool LockSpawn = false;
public int Spawn = 0;

View File

@@ -15,6 +15,7 @@ namespace OpenRA.FileFormats
public readonly string Type;
public readonly int2 Location;
public readonly int Depth;
public SmudgeReference( string type, int2 location, int depth )
{
Type = type;
@@ -22,10 +23,9 @@ namespace OpenRA.FileFormats
Depth = depth;
}
public override string ToString ()
public override string ToString()
{
return string.Format("{0} {1},{2} {3}", Type, Location.X,Location.Y, Depth);
return "{0} {1},{2} {3}".F(Type, Location.X, Location.Y, Depth);
}
}
}

View File

@@ -20,9 +20,10 @@ namespace OpenRA.FileFormats
public class TerrainTypeInfo
{
public string Type;
public bool AcceptSmudge = true;
public string[] AcceptsSmudgeType = { };
public bool IsWater = false;
public Color Color;
public string CustomCursor;
public TerrainTypeInfo() {}
public TerrainTypeInfo(MiniYaml my) { FieldLoader.Load(this, my); }
@@ -36,18 +37,19 @@ namespace OpenRA.FileFormats
public string Image;
public int2 Size;
public bool PickAny;
public string Category;
[FieldLoader.LoadUsing( "LoadTiles" )]
[FieldLoader.LoadUsing("LoadTiles")]
public Dictionary<byte, string> Tiles = new Dictionary<byte, string>();
public TileTemplate() {}
public TileTemplate(MiniYaml my) { FieldLoader.Load( this, my ); }
public TileTemplate(MiniYaml my) { FieldLoader.Load(this, my); }
static object LoadTiles( MiniYaml y )
static object LoadTiles(MiniYaml y)
{
return y.NodesDict["Tiles"].NodesDict.ToDictionary(
t => byte.Parse(t.Key),
t => t.Value.Value );
t => t.Value.Value);
}
static readonly string[] Fields = { "Id", "Image", "Size", "PickAny" };
@@ -58,12 +60,14 @@ namespace OpenRA.FileFormats
foreach (var field in Fields)
{
FieldInfo f = this.GetType().GetField(field);
if (f.GetValue(this) == null) continue;
root.Add( new MiniYamlNode( field, FieldSaver.FormatValue( this, f ) ) );
if (f.GetValue(this) == null)
continue;
root.Add(new MiniYamlNode(field, FieldSaver.FormatValue(this, f)));
}
root.Add( new MiniYamlNode( "Tiles", null,
Tiles.Select( x => new MiniYamlNode( x.Key.ToString(), x.Value ) ).ToList() ) );
root.Add(new MiniYamlNode("Tiles", null,
Tiles.Select(x => new MiniYamlNode(x.Key.ToString(), x.Value)).ToList()));
return new MiniYaml(null, root);
}
@@ -76,18 +80,21 @@ namespace OpenRA.FileFormats
public string Name;
public string Id;
public string Palette;
public string PlayerPalette;
public int TileSize = 24;
public string[] Extensions;
public int WaterPaletteRotationBase = 0x60;
public Dictionary<string, TerrainTypeInfo> Terrain = new Dictionary<string, TerrainTypeInfo>();
public Dictionary<ushort, TileTemplate> Templates = new Dictionary<ushort, TileTemplate>();
public string[] EditorTemplateOrder;
static readonly string[] fields = {"Name", "TileSize", "Id", "Palette", "Extensions"};
public TileSet() {}
public TileSet( string filepath )
public TileSet(string filepath)
{
var yaml = MiniYaml.DictFromFile( filepath );
var yaml = MiniYaml.DictFromFile(filepath);
// General info
FieldLoader.Load(this, yaml["General"]);
@@ -105,7 +112,7 @@ namespace OpenRA.FileFormats
{
foreach (var t in Templates)
if (t.Value.Data == null)
using( var s = FileSystem.OpenWithExts(t.Value.Image, Extensions) )
using (var s = FileSystem.OpenWithExts(t.Value.Image, Extensions))
t.Value.Data = new Terrain(s, TileSize);
}
@@ -117,33 +124,39 @@ namespace OpenRA.FileFormats
foreach (var field in fields)
{
FieldInfo f = this.GetType().GetField(field);
if (f.GetValue(this) == null) continue;
gen.Add( new MiniYamlNode( field, FieldSaver.FormatValue( this, f ) ) );
if (f.GetValue(this) == null)
continue;
gen.Add(new MiniYamlNode(field, FieldSaver.FormatValue(this, f)));
}
root.Add( new MiniYamlNode( "General", null, gen ) );
root.Add(new MiniYamlNode("General", null, gen));
root.Add( new MiniYamlNode( "Terrain", null,
Terrain.Select( t => new MiniYamlNode(
"TerrainType@{0}".F( t.Value.Type ),
t.Value.Save() ) ).ToList() ) );
root.Add(new MiniYamlNode( "Terrain", null,
Terrain.Select(t => new MiniYamlNode(
"TerrainType@{0}".F(t.Value.Type),
t.Value.Save())).ToList()));
root.Add( new MiniYamlNode( "Templates", null,
Templates.Select( t => new MiniYamlNode(
"Template@{0}".F( t.Value.Id ),
t.Value.Save() ) ).ToList() ) );
root.Add(new MiniYamlNode("Templates", null,
Templates.Select(t => new MiniYamlNode(
"Template@{0}".F(t.Value.Id),
t.Value.Save())).ToList()));
root.WriteToFile(filepath);
}
public byte[] GetBytes(TileReference<ushort,byte> r)
{
TileTemplate tile;
if( Templates.TryGetValue( r.type, out tile ) )
return tile.Data.TileBitmapBytes[ r.index ];
if (Templates.TryGetValue(r.type, out tile))
{
var data = tile.Data.TileBitmapBytes[r.index];
if (data != null)
return data;
}
byte[] missingTile = new byte[ TileSize * TileSize ];
for( int i = 0 ; i < missingTile.Length ; i++ )
missingTile[ i ] = 0x36;
byte[] missingTile = new byte[TileSize*TileSize];
for (var i = 0; i < missingTile.Length; i++)
missingTile[i] = 0x00;
return missingTile;
}
@@ -154,6 +167,7 @@ namespace OpenRA.FileFormats
string ret;
if (!tt.TryGetValue(r.index, out ret))
return "Clear"; // Default walkable
return ret;
}
@@ -166,7 +180,7 @@ namespace OpenRA.FileFormats
bitmap.Palette = p.AsSystemPalette();
var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
var data = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
unsafe

View File

@@ -105,22 +105,26 @@ namespace OpenRA.FileFormats
levels.Add(new List<MiniYamlNode>());
var lineNo = 0;
foreach (var line in lines)
foreach (var ll in lines)
{
var line = ll;
++lineNo;
if (line.Contains('#'))
line = line.Substring(0, line.IndexOf('#')).TrimEnd(' ', '\t');
var t = line.TrimStart(' ', '\t');
if (t.Length == 0 || t[0] == '#')
if (t.Length == 0)
continue;
var level = line.Length - t.Length;
var location = new MiniYamlNode.SourceLocation { Filename = filename, Line = lineNo };
if (levels.Count <= level)
throw new YamlException("Bad indent in miniyaml");
throw new YamlException("Bad indent in miniyaml at {0}".F (location));
while (levels.Count > level + 1)
levels.RemoveAt(levels.Count - 1);
var d = new List<MiniYamlNode>();
var rhs = SplitAtColon( ref t );
levels[ level ].Add( new MiniYamlNode( t, rhs, d, new MiniYamlNode.SourceLocation { Filename = filename, Line = lineNo } ) );
levels[ level ].Add( new MiniYamlNode( t, rhs, d, location ) );
levels.Add(d);
}
@@ -196,8 +200,8 @@ namespace OpenRA.FileFormats
var ret = new List<MiniYamlNode>();
var aDict = a.ToDictionary( x => x.Key );
var bDict = b.ToDictionary( x => x.Key );
var aDict = a.ToDictionaryWithConflictLog(x => x.Key, "MiniYaml.Merge", null, x => "{0} (at {1})".F(x.Key, x.Location));
var bDict = b.ToDictionaryWithConflictLog(x => x.Key, "MiniYaml.Merge", null, x => "{0} (at {1})".F(x.Key, x.Location));
var keys = aDict.Keys.Union( bDict.Keys ).ToList();
var noInherit = keys.Where(x => x.Length > 0 && x[0] == '-')

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@@ -12,10 +12,25 @@
<AssemblyName>OpenRA.FileFormats</AssemblyName>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>2.0</OldToolsVersion>
<OldToolsVersion>3.5</OldToolsVersion>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -27,6 +42,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Optimize>false</Optimize>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\Release\</OutputPath>
@@ -37,6 +53,7 @@
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
@@ -60,7 +77,6 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ColorRamp.cs" />
<Compile Include="Evaluator.cs" />
<Compile Include="Exts.cs" />
<Compile Include="FieldLoader.cs" />
@@ -68,6 +84,7 @@
<Compile Include="FileFormats\Blast.cs" />
<Compile Include="FileFormats\Blowfish.cs" />
<Compile Include="FileFormats\BlowfishKeyProvider.cs" />
<Compile Include="FileFormats\CRC32.cs" />
<Compile Include="FileFormats\Format2.cs" />
<Compile Include="FileFormats\Format40.cs" />
<Compile Include="FileFormats\Format80.cs" />
@@ -115,6 +132,37 @@
<Compile Include="Support\Timer.cs" />
<Compile Include="Thirdparty\Random.cs" />
<Compile Include="TypeDictionary.cs" />
<Compile Include="WPos.cs" />
<Compile Include="WVec.cs" />
<Compile Include="WAngle.cs" />
<Compile Include="WRot.cs" />
<Compile Include="WRange.cs" />
<Compile Include="HSLColor.cs" />
<Compile Include="Graphics\ShpTSReader.cs" />
<Compile Include="FileFormats\XccLocalDatabase.cs" />
<Compile Include="FileFormats\XccGlobalDatabase.cs" />
<Compile Include="Graphics\VxlReader.cs" />
<Compile Include="Graphics\HvaReader.cs" />
<Compile Include="StreamExts.cs" />
<Compile Include="FileFormats\WavLoader.cs" />
<Compile Include="Filesystem\D2kSoundResources.cs" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<Visible>False</Visible>
<ProductName>Windows Installer 3.1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
@@ -124,4 +172,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -8,19 +8,21 @@
*/
#endregion
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace OpenRA.FileFormats
{
public enum PackageHashType { Classic, CRC32 }
public class PackageEntry
{
public readonly uint Hash;
public readonly uint Offset;
public readonly uint Length;
public PackageEntry(uint hash, uint offset, uint length)
{
Hash = hash;
@@ -28,11 +30,11 @@ namespace OpenRA.FileFormats
Length = length;
}
public PackageEntry(BinaryReader r)
public PackageEntry(Stream s)
{
Hash = r.ReadUInt32();
Offset = r.ReadUInt32();
Length = r.ReadUInt32();
Hash = s.ReadUInt32();
Offset = s.ReadUInt32();
Length = s.ReadUInt32();
}
public void Write(BinaryWriter w)
@@ -46,38 +48,60 @@ namespace OpenRA.FileFormats
{
string filename;
if (Names.TryGetValue(Hash, out filename))
return string.Format("{0} - offset 0x{1:x8} - length 0x{2:x8}", filename, Offset, Length);
return "{0} - offset 0x{1:x8} - length 0x{2:x8}".F(filename, Offset, Length);
else
return string.Format("0x{0:x8} - offset 0x{1:x8} - length 0x{2:x8}", Hash, Offset, Length);
return "0x{0:x8} - offset 0x{1:x8} - length 0x{2:x8}".F(Hash, Offset, Length);
}
public static uint HashFilename(string name)
public static uint HashFilename(string name, PackageHashType type)
{
if (name.Length > 12)
name = name.Substring(0, 12);
switch(type)
{
case PackageHashType.Classic:
{
name = name.ToUpperInvariant();
if (name.Length % 4 != 0)
name = name.PadRight(name.Length + (4 - name.Length % 4), '\0');
name = name.ToUpperInvariant();
if (name.Length % 4 != 0)
name = name.PadRight(name.Length + (4 - name.Length % 4), '\0');
MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(name));
BinaryReader reader = new BinaryReader(ms);
MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(name));
BinaryReader reader = new BinaryReader(ms);
int len = name.Length >> 2;
uint result = 0;
int len = name.Length >> 2;
uint result = 0;
while (len-- != 0)
result = ((result << 1) | (result >> 31)) + reader.ReadUInt32();
while (len-- != 0)
result = ((result << 1) | (result >> 31)) + reader.ReadUInt32();
return result;
}
return result;
case PackageHashType.CRC32:
{
name = name.ToUpperInvariant();
var l = name.Length;
int a = l >> 2;
if ((l & 3) != 0)
{
name += (char)(l - (a << 2));
int i = 3 - (l & 3);
while (i-- != 0)
name += name[a << 2];
}
return CRC32.Calculate(Encoding.ASCII.GetBytes(name));
}
default: throw new NotImplementedException("Unknown hash type `{0}`".F(type));
}
}
static Dictionary<uint, string> Names = new Dictionary<uint,string>();
public static void AddStandardName(string s)
{
uint hash = HashFilename(s);
uint hash = HashFilename(s, PackageHashType.Classic); // RA1 and TD
Names.Add(hash, s);
uint crcHash = HashFilename(s, PackageHashType.CRC32); // TS
Names.Add(crcHash, s);
}
public const int Size = 12;

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2012 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -39,7 +39,13 @@ namespace OpenRA.FileFormats
get { return colors; }
}
public Palette(Stream s, bool remapTransparent)
public void ApplyRemap(IPaletteRemap r)
{
for(int i = 0; i < 256; i++)
colors[i] = (uint)r.GetRemappedColor(Color.FromArgb((int)colors[i]),i).ToArgb();
}
public Palette(Stream s, int[] remapShadow)
{
colors = new uint[256];
@@ -54,20 +60,15 @@ namespace OpenRA.FileFormats
}
}
colors[0] = 0;
if (remapTransparent)
{
colors[1] = 178u << 24; // Hack for d2k; may have side effects
colors[3] = 178u << 24;
colors[4] = 140u << 24;
}
colors[0] = 0; //convert black background to transparency
foreach (int i in remapShadow)
colors[i] = 140u << 24;
}
public Palette(Palette p, IPaletteRemap r)
{
colors = new uint[256];
for(int i = 0; i < 256; i++)
colors[i] = (uint)r.GetRemappedColor(Color.FromArgb((int)p.colors[i]),i).ToArgb();
colors = (uint[])p.colors.Clone();
ApplyRemap(r);
}
public Palette(Palette p)
@@ -75,6 +76,13 @@ namespace OpenRA.FileFormats
colors = (uint[])p.colors.Clone();
}
public Palette(uint[] data)
{
if (data.Length != 256)
throw new InvalidDataException("Attempting to create palette with incorrect array size");
colors = (uint[])data.Clone();
}
public ColorPalette AsSystemPalette()
{
ColorPalette pal;
@@ -92,12 +100,27 @@ namespace OpenRA.FileFormats
return pal;
}
public static Palette Load( string filename, bool remap )
public Bitmap AsBitmap()
{
var b = new Bitmap(256, 1, PixelFormat.Format32bppArgb);
var data = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
unsafe
{
uint* c = (uint*)data.Scan0;
for (var x = 0; x < 256; x++)
*(c + x) = colors[x];
}
b.UnlockBits(data);
return b;
}
public static Palette Load(string filename, int[] remap)
{
using(var s = File.OpenRead(filename))
return new Palette(s, remap);
}
}
public interface IPaletteRemap { Color GetRemappedColor(Color original, int index); }
public interface IPaletteRemap { Color GetRemappedColor(Color original, int index); }
}

View File

@@ -8,39 +8,41 @@
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
namespace OpenRA.FileFormats
{
// TODO: ship this out of here.
public enum PaletteFormat { ra, cnc, d2k }
public class PlayerColorRemap : IPaletteRemap
{
Dictionary<int, Color> remapColors;
public PlayerColorRemap(PaletteFormat fmt, ColorRamp c)
public static int GetRemapIndex(int[] Ramp, int i)
{
var c1 = c.GetColor(0);
var c2 = c.GetColor(1); /* temptemp: this can be expressed better */
var baseIndex = (fmt == PaletteFormat.cnc) ? 0xb0 : (fmt == PaletteFormat.d2k) ? 240 : 80;
var ramp = (fmt == PaletteFormat.cnc)
? new[] { 0, 2, 4, 6, 8, 10, 13, 15, 1, 3, 5, 7, 9, 11, 12, 14 }
: new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
remapColors = ramp.Select((x, i) => Pair.New(baseIndex + i, ColorLerp(x / 16f, c1, c2)))
.ToDictionary(u => u.First, u => u.Second);
return Ramp[i];
}
public static Color ColorLerp(float t, Color c1, Color c2)
public PlayerColorRemap(int[] Ramp, HSLColor c, float rampFraction)
{
return Color.FromArgb(255,
(int)(t * c2.R + (1 - t) * c1.R),
(int)(t * c2.G + (1 - t) * c1.G),
(int)(t * c2.B + (1 - t) * c1.B));
// Increase luminosity if required to represent the full ramp
var rampRange = (byte)((1 - rampFraction)*c.L);
var c1 = new HSLColor(c.H, c.S, (byte)Math.Max(rampRange, c.L)).RGB;
var c2 = new HSLColor(c.H, c.S, (byte)Math.Max(0, c.L - rampRange)).RGB;
var baseIndex = Ramp[0];
var RemapRamp = Ramp.Select(r => r - Ramp[0]).ToArray();
if (Ramp[0] > Ramp[15]) // reversed remapping
{
baseIndex = Ramp[15];
for (var i = 15; i > 0; i--)
RemapRamp = Ramp.Select(r => r - Ramp[15]).ToArray();
}
remapColors = RemapRamp.Select((x, i) => Pair.New(baseIndex + i, Exts.ColorLerp(x / 16f, c1, c2)))
.ToDictionary(u => u.First, u => u.Second);
}
public Color GetRemappedColor(Color original, int index)

View File

@@ -56,7 +56,7 @@ namespace OpenRA.FileFormats
public int CompareTo(DelayedAction other)
{
return Math.Sign(Time - other.Time);
return Time.CompareTo(other.Time);
}
}
}

View File

@@ -12,7 +12,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
namespace OpenRA.Collections
namespace OpenRA.FileFormats
{
public class Set<T> : IEnumerable<T>
{
@@ -44,5 +44,13 @@ namespace OpenRA.Collections
{
return GetEnumerator();
}
public bool Contains( T obj ) { return data.ContainsKey(obj); }
public Set( params T[] ts )
{
foreach( var t in ts )
Add(t);
}
}
}

View File

@@ -92,7 +92,7 @@ namespace OpenRA
public static float Dot(float2 a, float2 b) { return a.X * b.X + a.Y * b.Y; }
public float2 Round() { return new float2((float)Math.Round(X), (float)Math.Round(Y)); }
public override string ToString() { return string.Format("({0},{1})", X, Y); }
public override string ToString() { return "({0},{1})".F(X, Y); }
public int2 ToInt2() { return new int2((int)X, (int)Y); }
public static float2 Max(float2 a, float2 b) { return new float2(Math.Max(a.X, b.X), Math.Max(a.Y, b.Y)); }
@@ -101,4 +101,18 @@ namespace OpenRA
public float LengthSquared { get { return X * X + Y * Y; } }
public float Length { get { return (float)Math.Sqrt(LengthSquared); } }
}
public class EWMA
{
readonly float animRate;
float? value;
public EWMA(float animRate) { this.animRate = animRate; }
public float Update(float newValue)
{
value = float2.Lerp(value ?? newValue, newValue, animRate);
return value.Value;
}
}
}

View File

@@ -55,7 +55,7 @@ namespace OpenRA
public PointF ToPointF() { return new PointF(X, Y); }
public float2 ToFloat2() { return new float2(X, Y); }
public override string ToString() { return string.Format("{0},{1}", X, Y); }
public override string ToString() { return "{0},{1}".F(X, Y); }
// Change endianness of a uint32
public static uint Swap(uint orig)

View File

@@ -0,0 +1,334 @@
<StyleCopSettings Version="105">
<Analyzers>
<Analyzer AnalyzerId="StyleCop.CSharp.DocumentationRules">
<Rules>
<Rule Name="ElementsMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PartialElementsMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="EnumerationItemsMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DocumentationMustContainValidXml">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationMustHaveSummary">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PartialElementDocumentationMustHaveSummary">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationMustHaveSummaryText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PartialElementDocumentationMustHaveSummaryText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationMustNotHaveDefaultSummary">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementParametersMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementParameterDocumentationMustMatchElementParameters">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementParameterDocumentationMustDeclareParameterName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementParameterDocumentationMustHaveText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementReturnValueMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementReturnValueDocumentationMustHaveText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="VoidReturnValueMustNotBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="GenericTypeParametersMustBeDocumented">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="GenericTypeParametersMustBeDocumentedPartialClass">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="GenericTypeParameterDocumentationMustMatchTypeParameters">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="GenericTypeParameterDocumentationMustDeclareParameterName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="GenericTypeParameterDocumentationMustHaveText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PropertySummaryDocumentationMustMatchAccessors">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PropertySummaryDocumentationMustOmitSetAccessorWithRestrictedAccess">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationMustNotBeCopiedAndPasted">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="SingleLineCommentsMustNotUseDocumentationStyleSlashes">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DocumentationTextMustNotBeEmpty">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DocumentationTextMustContainWhitespace">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DocumentationMustMeetCharacterPercentage">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ConstructorSummaryDocumentationMustBeginWithStandardText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DestructorSummaryDocumentationMustBeginWithStandardText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="DocumentationHeadersMustNotContainBlankLines">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="IncludedDocumentationXPathDoesNotExist">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="IncludeNodeDoesNotContainValidFileAndPath">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="InheritDocMustBeUsedWithInheritingClass">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementDocumentationMustBeSpelledCorrectly">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileMustHaveHeader">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderMustShowCopyright">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderMustHaveCopyrightText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderMustContainFileName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderFileNameDocumentationMustMatchFileName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderMustHaveValidCompanyText">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileHeaderFileNameDocumentationMustMatchTypeName">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.SpacingRules">
<Rules>
<Rule Name="TabsMustNotBeUsed">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.LayoutRules">
<Rules>
<Rule Name="CurlyBracketsForMultiLineStatementsMustNotShareLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="StatementMustNotBeOnSingleLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementMustNotBeOnSingleLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="CurlyBracketsMustNotBeOmitted">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementsMustBeSeparatedByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.OrderingRules">
<Rules>
<Rule Name="UsingDirectivesMustBePlacedWithinNamespace">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementsMustAppearInTheCorrectOrder">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ElementsMustBeOrderedByAccess">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.ReadabilityRules">
<Rules>
<Rule Name="CodeMustNotContainMultipleStatementsOnOneLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="UseStringEmptyForEmptyStrings">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PrefixLocalCallsWithThis">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="PrefixCallsCorrectly">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ParametersMustBeOnSameLineOrSeparateLines">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
<Analyzer AnalyzerId="StyleCop.CSharp.MaintainabilityRules">
<Rules>
<Rule Name="AccessModifierMustBeDeclared">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FieldsMustBePrivate">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="FileMayOnlyContainASingleClass">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="ArithmeticExpressionsMustDeclarePrecedence">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
</Analyzers>
</StyleCopSettings>

138
OpenRA.FileFormats/StreamExts.cs Executable file
View File

@@ -0,0 +1,138 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace OpenRA
{
public static class StreamExts
{
public static byte[] ReadBytes(this Stream s, int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException("count", "Non-negative number required.");
var buf = new byte[count];
if (s.Read(buf, 0, count) < count)
throw new EndOfStreamException();
return buf;
}
public static int Peek(this Stream s)
{
var buf = new byte[1];
if (s.Read(buf, 0, 1) == 0)
return -1;
s.Seek(s.Position - 1, SeekOrigin.Begin);
return buf[0];
}
public static byte ReadUInt8(this Stream s)
{
return s.ReadBytes(1)[0];
}
public static ushort ReadUInt16(this Stream s)
{
return BitConverter.ToUInt16(s.ReadBytes(2), 0);
}
public static short ReadInt16(this Stream s)
{
return BitConverter.ToInt16(s.ReadBytes(2), 0);
}
public static uint ReadUInt32(this Stream s)
{
return BitConverter.ToUInt32(s.ReadBytes(4), 0);
}
public static int ReadInt32(this Stream s)
{
return BitConverter.ToInt32(s.ReadBytes(4), 0);
}
public static float ReadFloat(this Stream s)
{
return BitConverter.ToSingle(s.ReadBytes(4), 0);
}
public static double ReadDouble(this Stream s)
{
return BitConverter.ToDouble(s.ReadBytes(8), 0);
}
public static string ReadASCII(this Stream s, int length)
{
return new string(Encoding.ASCII.GetChars(s.ReadBytes(length)));
}
public static string ReadASCIIZ(this Stream s)
{
var bytes = new List<byte>();
var buf = new byte[1];
for (;;)
{
if (s.Read(buf, 0, 1) < 1)
throw new EndOfStreamException();
if (buf[0] == 0)
break;
bytes.Add(buf[0]);
}
return new string(Encoding.ASCII.GetChars(bytes.ToArray()));
}
public static string ReadAllText(this Stream s)
{
using (s)
using (var sr = new StreamReader(s))
return sr.ReadToEnd();
}
public static byte[] ReadAllBytes(this Stream s)
{
using (s)
{
var data = new byte[s.Length - s.Position];
s.Read(data, 0, data.Length);
return data;
}
}
public static void Write(this Stream s, byte[] data)
{
s.Write(data, 0, data.Length);
}
public static IEnumerable<string> ReadAllLines(this Stream s)
{
using (var sr = new StreamReader(s))
{
for (;;)
{
var line = sr.ReadLine();
if (line == null)
yield break;
else
yield return line;
}
}
}
}
}

View File

@@ -26,7 +26,7 @@ namespace OpenRA
public static class Log
{
static string LogPathPrefix = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + Path.DirectorySeparatorChar;
static Dictionary<string, ChannelInfo> channels = new Dictionary<string,ChannelInfo>();
public static readonly Dictionary<string, ChannelInfo> Channels = new Dictionary<string, ChannelInfo>();
public static string LogPath
{
@@ -47,7 +47,7 @@ namespace OpenRA
public static void AddChannel(string channelName, string baseFilename)
{
if (channels.ContainsKey(channelName)) return;
if (Channels.ContainsKey(channelName)) return;
foreach (var filename in FilenamesForChannel(channelName, baseFilename))
try
@@ -55,7 +55,7 @@ namespace OpenRA
var writer = File.CreateText(filename);
writer.AutoFlush = true;
channels.Add(channelName,
Channels.Add(channelName,
new ChannelInfo()
{
Filename = filename,
@@ -70,7 +70,7 @@ namespace OpenRA
public static void Write(string channel, string format, params object[] args)
{
ChannelInfo info;
if (!channels.TryGetValue(channel, out info))
if (!Channels.TryGetValue(channel, out info))
throw new Exception("Tried logging to non-existant channel " + channel);
info.Writer.WriteLine(format, args);

View File

@@ -20,6 +20,7 @@ namespace OpenRA.Thirdparty
int index = 0;
public int Last;
public int TotalCount = 0;
public Random() : this(Environment.TickCount) { }
@@ -41,13 +42,14 @@ namespace OpenRA.Thirdparty
y ^= y >> 18;
index = (index + 1) % 624;
TotalCount++;
Last = (int)(y % int.MaxValue);
return Last;
}
public int Next(int low, int high) { return low + Next() % (high - low); }
public int Next(int high) { return Next() % high; }
public double NextDouble() { return Math.Abs(Next() / (double)0x7fffffff); }
public float NextFloat() { return Math.Abs(Next() / (float)0x7fffffff); }
void Generate()
{

View File

@@ -48,17 +48,17 @@ namespace OpenRA.FileFormats
public bool Contains<T>()
{
return dataSingular.ContainsKey( typeof( T ) ) || dataMultiple.ContainsKey( typeof( T ) );
return dataSingular.ContainsKey(typeof(T)) || dataMultiple.ContainsKey(typeof(T));
}
public T Get<T>()
{
if( dataMultiple.ContainsKey( typeof( T ) ) )
throw new InvalidOperationException( string.Format( "TypeDictionary contains multiple instance of type `{0}`", typeof( T ) ) );
if (dataMultiple.ContainsKey(typeof(T)))
throw new InvalidOperationException("TypeDictionary contains multiple instance of type `{0}`".F(typeof(T)));
object ret;
if( !dataSingular.TryGetValue( typeof( T ), out ret ) )
throw new InvalidOperationException(string.Format("TypeDictionary does not contain instance of type `{0}`", typeof(T)));
if (!dataSingular.TryGetValue(typeof(T), out ret))
throw new InvalidOperationException("TypeDictionary does not contain instance of type `{0}`".F(typeof(T)));
return (T)ret;
}
@@ -69,11 +69,11 @@ namespace OpenRA.FileFormats
public object GetOrDefault(Type t)
{
if( dataMultiple.ContainsKey(t) )
throw new InvalidOperationException( string.Format( "TypeDictionary contains multiple instance of type `{0}`", t ) );
if (dataMultiple.ContainsKey(t))
throw new InvalidOperationException("TypeDictionary contains multiple instances of type `{0}`".F(t));
object ret;
if( !dataSingular.TryGetValue(t, out ret ) )
if (!dataSingular.TryGetValue(t, out ret))
return null;
return ret;
}

View File

@@ -0,0 +1,123 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Drawing;
namespace OpenRA
{
/// <summary>
/// 1D angle - 1024 units = 360 degrees.
/// </summary>
public struct WAngle
{
public readonly int Angle;
public WAngle(int a)
{
Angle = a % 1024;
if (Angle < 0)
Angle += 1024;
}
public static readonly WAngle Zero = new WAngle(0);
public static WAngle FromFacing(int facing) { return new WAngle(facing*4); }
public static WAngle FromDegrees(int degrees) { return new WAngle(degrees*1024/360); }
public static WAngle operator +(WAngle a, WAngle b) { return new WAngle(a.Angle + b.Angle); }
public static WAngle operator -(WAngle a, WAngle b) { return new WAngle(a.Angle - b.Angle); }
public static WAngle operator -(WAngle a) { return new WAngle(-a.Angle); }
public static bool operator ==(WAngle me, WAngle other) { return (me.Angle == other.Angle); }
public static bool operator !=(WAngle me, WAngle other) { return !(me == other); }
public override int GetHashCode() { return Angle.GetHashCode(); }
public override bool Equals(object obj)
{
if (obj == null)
return false;
WAngle o = (WAngle)obj;
return o == this;
}
public int Sin() { return new WAngle(Angle - 256).Cos(); }
public int Cos()
{
if (Angle <= 256)
return CosineTable[Angle];
if (Angle <= 512)
return -CosineTable[512 - Angle];
return -new WAngle(Angle - 512).Cos();
}
public int Tan()
{
if (Angle <= 256)
return TanTable[Angle];
if (Angle <= 512)
return -TanTable[512 - Angle];
return new WAngle(Angle - 512).Tan();
}
// Must not be used outside rendering code
public float RendererRadians() { return (float)(Angle * Math.PI / 512f); }
public float RendererDegrees() { return Angle * 0.3515625f; }
public override string ToString() { return "{0}".F(Angle); }
static int[] CosineTable =
{
1024, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1022, 1022, 1022, 1021,
1021, 1020, 1020, 1019, 1019, 1018, 1017, 1017, 1016, 1015, 1014, 1013,
1012, 1011, 1010, 1009, 1008, 1007, 1006, 1005, 1004, 1003, 1001, 1000,
999, 997, 996, 994, 993, 991, 990, 988, 986, 985, 983, 981, 979, 978,
976, 974, 972, 970, 968, 966, 964, 962, 959, 957, 955, 953, 950, 948,
946, 943, 941, 938, 936, 933, 930, 928, 925, 922, 920, 917, 914, 911,
908, 906, 903, 900, 897, 894, 890, 887, 884, 881, 878, 875, 871, 868,
865, 861, 858, 854, 851, 847, 844, 840, 837, 833, 829, 826, 822, 818,
814, 811, 807, 803, 799, 795, 791, 787, 783, 779, 775, 771, 767, 762,
758, 754, 750, 745, 741, 737, 732, 728, 724, 719, 715, 710, 706, 701,
696, 692, 687, 683, 678, 673, 668, 664, 659, 654, 649, 644, 639, 634,
629, 625, 620, 615, 609, 604, 599, 594, 589, 584, 579, 574, 568, 563,
558, 553, 547, 542, 537, 531, 526, 521, 515, 510, 504, 499, 493, 488,
482, 477, 471, 466, 460, 454, 449, 443, 437, 432, 426, 420, 414, 409,
403, 397, 391, 386, 380, 374, 368, 362, 356, 350, 344, 339, 333, 327,
321, 315, 309, 303, 297, 291, 285, 279, 273, 267, 260, 254, 248, 242,
236, 230, 224, 218, 212, 205, 199, 193, 187, 181, 175, 168, 162, 156,
150, 144, 137, 131, 125, 119, 112, 106, 100, 94, 87, 81, 75, 69, 62,
56, 50, 43, 37, 31, 25, 18, 12, 6, 0
};
static int[] TanTable =
{
0, 6, 12, 18, 25, 31, 37, 44, 50, 56, 62, 69, 75, 81, 88, 94, 100, 107,
113, 119, 126, 132, 139, 145, 151, 158, 164, 171, 177, 184, 190, 197,
203, 210, 216, 223, 229, 236, 243, 249, 256, 263, 269, 276, 283, 290,
296, 303, 310, 317, 324, 331, 338, 345, 352, 359, 366, 373, 380, 387,
395, 402, 409, 416, 424, 431, 438, 446, 453, 461, 469, 476, 484, 492,
499, 507, 515, 523, 531, 539, 547, 555, 563, 571, 580, 588, 596, 605,
613, 622, 630, 639, 648, 657, 666, 675, 684, 693, 702, 711, 721, 730,
740, 749, 759, 769, 779, 789, 799, 809, 819, 829, 840, 850, 861, 872,
883, 894, 905, 916, 928, 939, 951, 963, 974, 986, 999, 1011, 1023, 1036,
1049, 1062, 1075, 1088, 1102, 1115, 1129, 1143, 1158, 1172, 1187, 1201,
1216, 1232, 1247, 1263, 1279, 1295, 1312, 1328, 1345, 1363, 1380, 1398,
1416, 1435, 1453, 1473, 1492, 1512, 1532, 1553, 1574, 1595, 1617, 1639,
1661, 1684, 1708, 1732, 1756, 1782, 1807, 1833, 1860, 1887, 1915, 1944,
1973, 2003, 2034, 2065, 2098, 2131, 2165, 2199, 2235, 2272, 2310, 2348,
2388, 2429, 2472, 2515, 2560, 2606, 2654, 2703, 2754, 2807, 2861, 2918,
2976, 3036, 3099, 3164, 3232, 3302, 3375, 3451, 3531, 3613, 3700, 3790,
3885, 3984, 4088, 4197, 4311, 4432, 4560, 4694, 4836, 4987, 5147, 5318,
5499, 5693, 5901, 6124, 6364, 6622, 6903, 7207, 7539, 7902, 8302, 8743,
9233, 9781, 10396, 11094, 11891, 12810, 13882, 15148, 16667, 18524, 20843,
23826, 27801, 33366, 41713, 55622, 83438, 166883, int.MaxValue
};
}
}

View File

@@ -0,0 +1,88 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Drawing;
namespace OpenRA
{
/// <summary>
/// 3d World position - 1024 units = 1 cell.
/// </summary>
public struct WPos
{
public readonly int X, Y, Z;
public WPos(int x, int y, int z) { X = x; Y = y; Z = z; }
public WPos(WRange x, WRange y, WRange z) { X = x.Range; Y = y.Range; Z = z.Range; }
public static readonly WPos Zero = new WPos(0, 0, 0);
public static explicit operator WVec(WPos a) { return new WVec(a.X, a.Y, a.Z); }
public static WPos operator +(WPos a, WVec b) { return new WPos(a.X + b.X, a.Y + b.Y, a.Z + b.Z); }
public static WPos operator -(WPos a, WVec b) { return new WPos(a.X - b.X, a.Y - b.Y, a.Z - b.Z); }
public static WVec operator -(WPos a, WPos b) { return new WVec(a.X - b.X, a.Y - b.Y, a.Z - b.Z); }
public static bool operator ==(WPos me, WPos other) { return (me.X == other.X && me.Y == other.Y && me.Z == other.Z); }
public static bool operator !=(WPos me, WPos other) { return !(me == other); }
public static WPos Lerp(WPos a, WPos b, int mul, int div) { return a + (b - a) * mul / div; }
public static WPos LerpQuadratic(WPos a, WPos b, WAngle pitch, int mul, int div)
{
// Start with a linear lerp between the points
var ret = Lerp(a, b, mul, div);
if (pitch.Angle == 0)
return ret;
// Add an additional quadratic variation to height
// Uses fp to avoid integer overflow
var offset = (int)((float)((float)(b - a).Length*pitch.Tan()*mul*(div - mul)) / (float)(1024*div*div));
return new WPos(ret.X, ret.Y, ret.Z + offset);
}
public static WPos Average(params WPos[] list)
{
if (list == null || list.Length == 0)
return WPos.Zero;
var x = 0;
var y = 0;
var z = 0;
foreach(var pos in list)
{
x += pos.X;
y += pos.Y;
z += pos.Z;
}
x /= list.Length;
y /= list.Length;
z /= list.Length;
return new WPos(x,y,z);
}
public override int GetHashCode() { return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode(); }
public override bool Equals(object obj)
{
if (obj == null)
return false;
WPos o = (WPos)obj;
return o == this;
}
public override string ToString() { return "{0},{1},{2}".F(X, Y, Z); }
}
}

View File

@@ -0,0 +1,73 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Drawing;
namespace OpenRA
{
/// <summary>
/// 1d world distance - 1024 units = 1 cell.
/// </summary>
public struct WRange
{
public readonly int Range;
public WRange(int r) { Range = r; }
public static readonly WRange Zero = new WRange(0);
public static WRange FromCells(int cells) { return new WRange(1024*cells); }
public static WRange operator +(WRange a, WRange b) { return new WRange(a.Range + b.Range); }
public static WRange operator -(WRange a, WRange b) { return new WRange(a.Range - b.Range); }
public static WRange operator -(WRange a) { return new WRange(-a.Range); }
public static bool operator ==(WRange me, WRange other) { return (me.Range == other.Range); }
public static bool operator !=(WRange me, WRange other) { return !(me == other); }
public static bool TryParse(string s, out WRange result)
{
s = s.ToLowerInvariant();
var components = s.Split('c');
int cell = 0;
int subcell = 0;
result = WRange.Zero;
switch (components.Length)
{
case 2:
if (!int.TryParse(components[0], out cell) ||
!int.TryParse(components[1], out subcell))
return false;
break;
case 1:
if (!int.TryParse(components[0], out subcell))
return false;
break;
default: return false;
}
result = new WRange(1024*cell + subcell);
return true;
}
public override int GetHashCode() { return Range.GetHashCode(); }
public override bool Equals(object obj)
{
if (obj == null)
return false;
WRange o = (WRange)obj;
return o == this;
}
public override string ToString() { return "{0}".F(Range); }
}
}

109
OpenRA.FileFormats/WRot.cs Normal file
View File

@@ -0,0 +1,109 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Drawing;
namespace OpenRA
{
/// <summary>
/// 3d World rotation.
/// </summary>
public struct WRot
{
public readonly WAngle Roll, Pitch, Yaw;
public WRot(WAngle roll, WAngle pitch, WAngle yaw) { Roll = roll; Pitch = pitch; Yaw = yaw; }
public static readonly WRot Zero = new WRot(WAngle.Zero, WAngle.Zero, WAngle.Zero);
public static WRot FromFacing(int facing) { return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)); }
public static WRot FromYaw(WAngle yaw) { return new WRot(WAngle.Zero, WAngle.Zero, yaw); }
public static WRot operator +(WRot a, WRot b) { return new WRot(a.Roll + b.Roll, a.Pitch + b.Pitch, a.Yaw + b.Yaw); }
public static WRot operator -(WRot a, WRot b) { return new WRot(a.Roll - b.Roll, a.Pitch - b.Pitch, a.Yaw - b.Yaw); }
public static WRot operator -(WRot a) { return new WRot(-a.Roll, -a.Pitch, -a.Yaw); }
public static bool operator ==(WRot me, WRot other) { return (me.Roll == other.Roll &&
me.Pitch == other.Pitch && me.Yaw == other.Yaw); }
public static bool operator !=(WRot me, WRot other) { return !(me == other); }
public WRot WithYaw(WAngle yaw)
{
return new WRot(Roll, Pitch, yaw);
}
public int[] AsQuarternion()
{
// Angles increase clockwise
var r = new WAngle(-Roll.Angle / 2);
var p = new WAngle(-Pitch.Angle / 2);
var y = new WAngle(-Yaw.Angle / 2);
var cr = (long)r.Cos();
var sr = (long)r.Sin();
var cp = (long)p.Cos();
var sp = (long)p.Sin();
var cy = (long)y.Cos();
var sy = (long)y.Sin();
// Normalized to 1024 == 1.0
return new int[4]
{
(int)((sr*cp*cy - cr*sp*sy) / 1048576), // x
(int)((cr*sp*cy + sr*cp*sy) / 1048576), // y
(int)((cr*cp*sy - sr*sp*cy) / 1048576), // z
(int)((cr*cp*cy + sr*sp*sy) / 1048576) // w
};
}
public int[] AsMatrix()
{
var q = AsQuarternion();
// Theoretically 1024**2, but may differ slightly due to rounding
var lsq = q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3];
// Quarternion components use 10 bits, so there's no risk of overflow
var mtx = new int[16];
mtx[0] = lsq - 2*(q[1]*q[1] + q[2]*q[2]);
mtx[1] = 2*(q[0]*q[1] + q[2]*q[3]);
mtx[2] = 2*(q[0]*q[2] - q[1]*q[3]);
mtx[3] = 0;
mtx[4] = 2*(q[0]*q[1] - q[2]*q[3]);
mtx[5] = lsq - 2*(q[0]*q[0] + q[2]*q[2]);
mtx[6] = 2*(q[1]*q[2] + q[0]*q[3]);
mtx[7] = 0;
mtx[8] = 2*(q[0]*q[2] + q[1]*q[3]);
mtx[9] = 2*(q[1]*q[2] - q[0]*q[3]);
mtx[10] = lsq - 2*(q[0]*q[0] + q[1]*q[1]);
mtx[11] = 0;
mtx[12] = 0;
mtx[13] = 0;
mtx[14] = 0;
mtx[15] = lsq;
return mtx;
}
public override int GetHashCode() { return Roll.GetHashCode() ^ Pitch.GetHashCode() ^ Yaw.GetHashCode(); }
public override bool Equals(object obj)
{
if (obj == null)
return false;
WRot o = (WRot)obj;
return o == this;
}
public override string ToString() { return "{0},{1},{2}".F(Roll, Pitch, Yaw); }
}
}

View File

@@ -0,0 +1,83 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Drawing;
namespace OpenRA
{
/// <summary>
/// 3d World vector for describing offsets and distances - 1024 units = 1 cell.
/// </summary>
public struct WVec
{
public readonly int X, Y, Z;
public WVec(int x, int y, int z) { X = x; Y = y; Z = z; }
public WVec(WRange x, WRange y, WRange z) { X = x.Range; Y = y.Range; Z = z.Range; }
public static readonly WVec Zero = new WVec(0, 0, 0);
public static WVec operator +(WVec a, WVec b) { return new WVec(a.X + b.X, a.Y + b.Y, a.Z + b.Z); }
public static WVec operator -(WVec a, WVec b) { return new WVec(a.X - b.X, a.Y - b.Y, a.Z - b.Z); }
public static WVec operator -(WVec a) { return new WVec(-a.X, -a.Y, -a.Z); }
public static WVec operator /(WVec a, int b) { return new WVec(a.X / b, a.Y / b, a.Z / b); }
public static WVec operator *(int a, WVec b) { return new WVec(a * b.X, a * b.Y, a * b.Z); }
public static WVec operator *(WVec a, int b) { return b*a; }
public static bool operator ==(WVec me, WVec other) { return (me.X == other.X && me.Y == other.Y && me.Z == other.Z); }
public static bool operator !=(WVec me, WVec other) { return !(me == other); }
public static int Dot(WVec a, WVec b) { return a.X * b.X + a.Y * b.Y + a.Z * b.Z; }
public int LengthSquared { get { return X * X + Y * Y + Z * Z; } }
public int Length { get { return (int)Math.Sqrt(LengthSquared); } }
public WVec Rotate(WRot rot)
{
var mtx = rot.AsMatrix();
var lx = (long)X;
var ly = (long)Y;
var lz = (long)Z;
return new WVec(
(int)((lx * mtx[0] + ly*mtx[4] + lz*mtx[8]) / mtx[15]),
(int)((lx * mtx[1] + ly*mtx[5] + lz*mtx[9]) / mtx[15]),
(int)((lx * mtx[2] + ly*mtx[6] + lz*mtx[10]) / mtx[15]));
}
public static WVec Lerp(WVec a, WVec b, int mul, int div) { return a + (b - a) * mul / div; }
public static WVec LerpQuadratic(WVec a, WVec b, WAngle pitch, int mul, int div)
{
// Start with a linear lerp between the points
var ret = Lerp(a, b, mul, div);
if (pitch.Angle == 0)
return ret;
// Add an additional quadratic variation to height
// Uses fp to avoid integer overflow
var offset = (int)((float)((float)(b - a).Length*pitch.Tan()*mul*(div - mul)) / (float)(1024*div*div));
return new WVec(ret.X, ret.Y, ret.Z + offset);
}
public override int GetHashCode() { return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode(); }
public override bool Equals(object obj)
{
if (obj == null)
return false;
WVec o = (WVec)obj;
return o == this;
}
public override string ToString() { return "{0},{1},{2}".F(X, Y, Z); }
}
}

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA
@@ -27,14 +28,16 @@ namespace OpenRA
Lazy<IOccupySpace> occupySpace;
IHasLocation HasLocation;
Lazy<IMove> Move;
Lazy<IFacing> Facing;
public Cached<Rectangle> Bounds;
public Cached<Rectangle> ExtendedBounds;
public IOccupySpace OccupiesSpace { get { return occupySpace.Value; } }
public int2 Location { get { return occupySpace.Value.TopLeft; } }
public CPos Location { get { return occupySpace.Value.TopLeft; } }
public int2 CenterLocation
public PPos CenterLocation
{
get
{
@@ -44,11 +47,30 @@ namespace OpenRA
}
}
[Sync]
public Player Owner;
public WPos CenterPosition
{
get
{
var altitude = Move.Value != null ? Move.Value.Altitude : 0;
return CenterLocation.ToWPos(altitude);
}
}
public WRot Orientation
{
get
{
// TODO: Support non-zero pitch/roll in IFacing (IOrientation?)
var facing = Facing.Value != null ? Facing.Value.Facing : 0;
return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing));
}
}
[Sync] public Player Owner;
Activity currentActivity;
public Group Group;
public int Generation;
internal Actor(World world, string name, TypeDictionary initDict )
{
@@ -71,7 +93,8 @@ namespace OpenRA
AddTrait(trait.Create(init));
}
Move = Lazy.New( () => TraitOrDefault<IMove>() );
Move = Lazy.New(() => TraitOrDefault<IMove>());
Facing = Lazy.New(() => TraitOrDefault<IFacing>());
Size = Lazy.New(() =>
{
@@ -79,17 +102,14 @@ namespace OpenRA
if (si != null && si.Bounds != null)
return new int2(si.Bounds[0], si.Bounds[1]);
// auto size from render
var firstSprite = TraitsImplementing<IRender>().SelectMany(ApplyIRender).FirstOrDefault();
if (firstSprite.Sprite == null) return int2.Zero;
return (firstSprite.Sprite.size * firstSprite.Scale).ToInt2();
return TraitsImplementing<IAutoSelectionSize>().Select(x => x.SelectionSize(this)).FirstOrDefault();
});
ApplyIRender = x => x.Render(this);
ApplyRenderModifier = (m, p) => p.ModifyRender(this, m);
ApplyIRender = (x, wr) => x.Render(this, wr);
ApplyRenderModifier = (m, p, wr) => p.ModifyRender(this, wr, m);
Bounds = Cached.New( () => CalculateBounds(false) );
ExtendedBounds = Cached.New( () => CalculateBounds(true) );
Bounds = Cached.New(() => CalculateBounds(false));
ExtendedBounds = Cached.New(() => CalculateBounds(true));
}
public void Tick()
@@ -97,7 +117,7 @@ namespace OpenRA
Bounds.Invalidate();
ExtendedBounds.Invalidate();
currentActivity = Util.RunActivity( this, currentActivity );
currentActivity = Traits.Util.RunActivity(this, currentActivity);
}
public bool IsIdle
@@ -108,13 +128,13 @@ namespace OpenRA
OpenRA.FileFormats.Lazy<int2> Size;
// note: these delegates are cached to avoid massive allocation.
Func<IRender, IEnumerable<Renderable>> ApplyIRender;
Func<IEnumerable<Renderable>, IRenderModifier, IEnumerable<Renderable>> ApplyRenderModifier;
public IEnumerable<Renderable> Render()
Func<IRender, WorldRenderer, IEnumerable<IRenderable>> ApplyIRender;
Func<IEnumerable<IRenderable>, IRenderModifier, WorldRenderer, IEnumerable<IRenderable>> ApplyRenderModifier;
public IEnumerable<IRenderable> Render(WorldRenderer wr)
{
var mods = TraitsImplementing<IRenderModifier>();
var sprites = TraitsImplementing<IRender>().SelectMany(ApplyIRender);
return mods.Aggregate(sprites, ApplyRenderModifier);
var sprites = TraitsImplementing<IRender>().SelectMany(x => ApplyIRender(x, wr));
return mods.Aggregate(sprites, (m,p) => ApplyRenderModifier(m,p,wr));
}
// When useAltitude = true, the bounding box is extended
@@ -123,22 +143,22 @@ namespace OpenRA
// at its current altitude
Rectangle CalculateBounds(bool useAltitude)
{
var size = Size.Value;
var size = (PVecInt)(Size.Value);
var loc = CenterLocation - size / 2;
var si = Info.Traits.GetOrDefault<SelectableInfo>();
if (si != null && si.Bounds != null && si.Bounds.Length > 2)
{
loc.X += si.Bounds[2];
loc.Y += si.Bounds[3];
loc += new PVecInt(si.Bounds[2], si.Bounds[3]);
}
var move = Move.Value;
if (move != null)
{
loc.Y -= move.Altitude;
loc -= new PVecInt(0, move.Altitude);
if (useAltitude)
size = new int2(size.X, size.Y + move.Altitude);
size = new PVecInt(size.X, size.Y + move.Altitude);
}
return new Rectangle(loc.X, loc.Y, size.X, size.Y);
@@ -227,15 +247,21 @@ namespace OpenRA
} );
}
// todo: move elsewhere.
// TODO: move elsewhere.
public void ChangeOwner(Player newOwner)
{
World.AddFrameEndTask(w =>
{
var oldOwner = Owner;
// momentarily remove from world so the ownership queries don't get confused
w.Remove(this);
Owner = newOwner;
Generation++;
w.Add(this);
foreach (var t in this.TraitsImplementing<INotifyOwnerChanged>())
t.OnOwnerChanged(this, oldOwner, newOwner);
});
}
}

View File

@@ -62,20 +62,29 @@ namespace OpenRA
public int Value( World world ) { return value; }
}
public class LocationInit : IActorInit<int2>
public class LocationInit : IActorInit<CPos>
{
[FieldFromYamlKey] public readonly int2 value = int2.Zero;
public LocationInit() { }
public LocationInit( int2 init ) { value = init; }
public int2 Value( World world ) { return value; }
public LocationInit( CPos init ) { value = init.ToInt2(); }
public CPos Value(World world) { return (CPos)value; }
}
public class CenterLocationInit : IActorInit<int2>
public class SubCellInit : IActorInit<SubCell>
{
[FieldFromYamlKey] public readonly int value = 0;
public SubCellInit() { }
public SubCellInit(int init) { value = init; }
public SubCellInit(SubCell init) { value = (int)init; }
public SubCell Value(World world) { return (SubCell)value; }
}
public class CenterLocationInit : IActorInit<PPos>
{
[FieldFromYamlKey] public readonly int2 value = int2.Zero;
public CenterLocationInit() { }
public CenterLocationInit( int2 init ) { value = init; }
public int2 Value( World world ) { return value; }
public CenterLocationInit(PPos init) { value = init.ToInt2(); }
public PPos Value(World world) { return (PPos)value; }
}
public class OwnerInit : IActorInit<Player>

View File

@@ -37,7 +37,7 @@ namespace OpenRA
world.ActorRemoved += a => Remove( a, a.OccupiesSpace );
}
public IEnumerable<Actor> GetUnitsAt( int2 a )
public IEnumerable<Actor> GetUnitsAt(CPos a)
{
if (!map.IsInMap(a)) yield break;
@@ -46,7 +46,7 @@ namespace OpenRA
yield return i.actor;
}
public IEnumerable<Actor> GetUnitsAt( int2 a, SubCell sub )
public IEnumerable<Actor> GetUnitsAt(CPos a, SubCell sub)
{
if (!map.IsInMap(a)) yield break;
@@ -55,7 +55,7 @@ namespace OpenRA
yield return i.actor;
}
public bool HasFreeSubCell(int2 a)
public bool HasFreeSubCell(CPos a)
{
if (!AnyUnitsAt(a))
return true;
@@ -64,12 +64,22 @@ namespace OpenRA
SubCell.BottomLeft, SubCell.BottomRight }.Any(b => !AnyUnitsAt(a,b));
}
public bool AnyUnitsAt(int2 a)
public SubCell? FreeSubCell(CPos a)
{
if (!HasFreeSubCell(a))
return null;
return new[]{ SubCell.TopLeft, SubCell.TopRight, SubCell.Center,
SubCell.BottomLeft, SubCell.BottomRight }.First(b => !AnyUnitsAt(a,b));
}
public bool AnyUnitsAt(CPos a)
{
return influence[ a.X, a.Y ] != null;
}
public bool AnyUnitsAt(int2 a, SubCell sub)
public bool AnyUnitsAt(CPos a, SubCell sub)
{
for( var i = influence[ a.X, a.Y ] ; i != null ; i = i.next )
if (i.subCell == sub || i.subCell == SubCell.FullCell)

77
OpenRA.Game/CPos.cs Normal file
View File

@@ -0,0 +1,77 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Drawing;
namespace OpenRA
{
/// <summary>
/// Cell coordinate position in the world (coarse).
/// </summary>
public struct CPos
{
public readonly int X, Y;
public CPos(int x, int y) { X = x; Y = y; }
public static readonly CPos Zero = new CPos(0, 0);
public static explicit operator CPos(int2 a) { return new CPos(a.X, a.Y); }
public static CPos operator +(CVec a, CPos b) { return new CPos(a.X + b.X, a.Y + b.Y); }
public static CPos operator +(CPos a, CVec b) { return new CPos(a.X + b.X, a.Y + b.Y); }
public static CPos operator -(CPos a, CVec b) { return new CPos(a.X - b.X, a.Y - b.Y); }
public static CVec operator -(CPos a, CPos b) { return new CVec(a.X - b.X, a.Y - b.Y); }
public static bool operator ==(CPos me, CPos other) { return (me.X == other.X && me.Y == other.Y); }
public static bool operator !=(CPos me, CPos other) { return !(me == other); }
public static CPos Max(CPos a, CPos b) { return new CPos(Math.Max(a.X, b.X), Math.Max(a.Y, b.Y)); }
public static CPos Min(CPos a, CPos b) { return new CPos(Math.Min(a.X, b.X), Math.Min(a.Y, b.Y)); }
public float2 ToFloat2() { return new float2(X, Y); }
public int2 ToInt2() { return new int2(X, Y); }
public PPos ToPPos() { return new PPos(Game.CellSize * X, Game.CellSize * Y); }
public WPos CenterPosition { get { return new WPos(1024*X + 512, 1024*Y + 512, 0); } }
public CPos Clamp(Rectangle r)
{
return new CPos(Math.Min(r.Right, Math.Max(X, r.Left)),
Math.Min(r.Bottom, Math.Max(Y, r.Top)));
}
public override int GetHashCode() { return X.GetHashCode() ^ Y.GetHashCode(); }
public override bool Equals(object obj)
{
if (obj == null)
return false;
CPos o = (CPos)obj;
return o == this;
}
public override string ToString() { return "{0},{1}".F(X, Y); }
}
public static class RectangleExtensions
{
public static CPos TopLeftAsCPos(this Rectangle r) { return new CPos(r.Left, r.Top); }
public static CPos BottomRightAsCPos(this Rectangle r) { return new CPos(r.Right, r.Bottom); }
}
public static class WPosExtensions
{
public static CPos ToCPos(this WPos a) { return new CPos(a.X / 1024, a.Y / 1024); }
}
}

89
OpenRA.Game/CVec.cs Normal file
View File

@@ -0,0 +1,89 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Drawing;
namespace OpenRA
{
/// <summary>
/// Cell coordinate vector (coarse).
/// </summary>
public struct CVec
{
public readonly int X, Y;
public CVec(int x, int y) { X = x; Y = y; }
public CVec(Size p) { X = p.Width; Y = p.Height; }
public static readonly CVec Zero = new CVec(0, 0);
public static explicit operator CVec(int2 a) { return new CVec(a.X, a.Y); }
public static explicit operator CVec(float2 a) { return new CVec((int)a.X, (int)a.Y); }
public static CVec operator +(CVec a, CVec b) { return new CVec(a.X + b.X, a.Y + b.Y); }
public static CVec operator -(CVec a, CVec b) { return new CVec(a.X - b.X, a.Y - b.Y); }
public static CVec operator *(int a, CVec b) { return new CVec(a * b.X, a * b.Y); }
public static CVec operator *(CVec b, int a) { return new CVec(a * b.X, a * b.Y); }
public static CVec operator /(CVec a, int b) { return new CVec(a.X / b, a.Y / b); }
public static CVec operator -(CVec a) { return new CVec(-a.X, -a.Y); }
public static bool operator ==(CVec me, CVec other) { return (me.X == other.X && me.Y == other.Y); }
public static bool operator !=(CVec me, CVec other) { return !(me == other); }
public static CVec Max(CVec a, CVec b) { return new CVec(Math.Max(a.X, b.X), Math.Max(a.Y, b.Y)); }
public static CVec Min(CVec a, CVec b) { return new CVec(Math.Min(a.X, b.X), Math.Min(a.Y, b.Y)); }
public static int Dot(CVec a, CVec b) { return a.X * b.X + a.Y * b.Y; }
public CVec Sign() { return new CVec(Math.Sign(X), Math.Sign(Y)); }
public CVec Abs() { return new CVec(Math.Abs(X), Math.Abs(Y)); }
public int LengthSquared { get { return X * X + Y * Y; } }
public int Length { get { return (int)Math.Sqrt(LengthSquared); } }
public float2 ToFloat2() { return new float2(X, Y); }
public int2 ToInt2() { return new int2(X, Y); }
public WVec ToWVec() { return new WVec(X*1024, Y*1024, 0); }
public CVec Clamp(Rectangle r)
{
return new CVec(
Math.Min(r.Right, Math.Max(X, r.Left)),
Math.Min(r.Bottom, Math.Max(Y, r.Top))
);
}
public override int GetHashCode() { return X.GetHashCode() ^ Y.GetHashCode(); }
public override bool Equals(object obj)
{
if (obj == null)
return false;
CVec o = (CVec)obj;
return o == this;
}
public override string ToString() { return "{0},{1}".F(X, Y); }
public static readonly CVec[] directions =
{
new CVec(-1, -1),
new CVec(-1, 0),
new CVec(-1, 1),
new CVec(0, -1),
new CVec(0, 1),
new CVec(1, -1),
new CVec(1, 0),
new CVec(1, 1),
};
}
}

View File

@@ -10,6 +10,7 @@
using System;
using System.Collections.Generic;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Effects
@@ -25,12 +26,12 @@ namespace OpenRA.Effects
this.delay = delay;
}
public void Tick( World world )
public void Tick(World world)
{
if (--delay <= 0)
world.AddFrameEndTask(w => { w.Remove(this); a(); });
}
public IEnumerable<Renderable> Render() { yield break; }
public IEnumerable<IRenderable> Render(WorldRenderer wr) { yield break; }
}
}

View File

@@ -10,6 +10,7 @@
using System.Collections.Generic;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Effects
@@ -32,14 +33,14 @@ namespace OpenRA.Effects
world.AddFrameEndTask(w => w.Remove(this));
}
public IEnumerable<Renderable> Render()
public IEnumerable<IRenderable> Render(WorldRenderer wr)
{
if (!target.IsInWorld)
yield break;
if (remainingTicks % 2 == 0)
foreach (var r in target.Render())
yield return r.WithPalette("highlight");
foreach (var r in target.Render(wr))
yield return r.WithPalette(wr.Palette("highlight"));
}
}
}

View File

@@ -9,13 +9,14 @@
#endregion
using System.Collections.Generic;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Effects
{
public interface IEffect
{
void Tick( World world );
IEnumerable<Renderable> Render();
void Tick(World world);
IEnumerable<IRenderable> Render(WorldRenderer r);
}
}

183
OpenRA.Game/Game.cs Executable file → Normal file
View File

@@ -29,6 +29,8 @@ namespace OpenRA
{
public static int CellSize { get { return modData.Manifest.TileSize; } }
public static MouseButtonPreference mouseButtonPreference = new MouseButtonPreference();
public static ModData modData;
static WorldRenderer worldRenderer;
@@ -50,18 +52,13 @@ namespace OpenRA
public static void JoinServer(string host, int port)
{
var replayFilename = ChooseReplayFilename();
string path = Path.Combine( Platform.SupportDir, "Replays" );
if( !Directory.Exists( path ) ) Directory.CreateDirectory( path );
var replayFile = File.Create( Path.Combine( path, replayFilename ) );
JoinInner(new OrderManager(host, port,
new ReplayRecorderConnection(new NetworkConnection(host, port), replayFile)));
new ReplayRecorderConnection(new NetworkConnection(host, port), ChooseReplayFilename)));
}
static string ChooseReplayFilename()
{
return DateTime.UtcNow.ToString("OpenRA-yyyy-MM-ddTHHmmssZ.rep");
return DateTime.UtcNow.ToString("OpenRA-yyyy-MM-ddTHHmmssZ");
}
static void JoinInner(OrderManager om)
@@ -95,14 +92,14 @@ namespace OpenRA
// Hacky workaround for orderManager visibility
public static Widget OpenWindow(World world, string widget)
{
return Widget.OpenWindow(widget, new WidgetArgs() {{ "world", world }, { "orderManager", orderManager }, { "worldRenderer", worldRenderer }});
return Ui.OpenWindow(widget, new WidgetArgs() {{ "world", world }, { "orderManager", orderManager }, { "worldRenderer", worldRenderer }});
}
// Who came up with the great idea of making these things
// impossible for the things that want them to access them directly?
public static Widget OpenWindow(string widget, WidgetArgs args)
{
return Widget.OpenWindow(widget, new WidgetArgs(args)
return Ui.OpenWindow(widget, new WidgetArgs(args)
{
{ "world", worldRenderer.world },
{ "orderManager", orderManager },
@@ -125,17 +122,17 @@ namespace OpenRA
public static void RunAfterTick(Action a) { delayedActions.Add(a); }
public static void RunAfterDelay(int delay, Action a) { delayedActions.Add(a, delay); }
static void Tick( OrderManager orderManager, Viewport viewPort )
static void Tick(OrderManager orderManager, Viewport viewPort)
{
if (orderManager.Connection.ConnectionState != lastConnectionState)
{
lastConnectionState = orderManager.Connection.ConnectionState;
ConnectionStateChanged( orderManager );
ConnectionStateChanged(orderManager);
}
Tick( orderManager );
if( worldRenderer != null && orderManager.world != worldRenderer.world )
Tick( worldRenderer.world.orderManager );
Tick(orderManager);
if (worldRenderer != null && orderManager.world != worldRenderer.world)
Tick(worldRenderer.world.orderManager);
using (new PerfSample("render"))
{
@@ -152,20 +149,20 @@ namespace OpenRA
delayedActions.PerformActions();
}
static void Tick( OrderManager orderManager )
static void Tick(OrderManager orderManager)
{
int t = Environment.TickCount;
int dt = t - orderManager.LastTickTime;
if (dt >= Settings.Game.Timestep)
using( new PerfSample( "tick_time" ) )
using (new PerfSample("tick_time"))
{
orderManager.LastTickTime += Settings.Game.Timestep;
Widget.DoTick();
Ui.Tick();
var world = orderManager.world;
if (orderManager.GameStarted)
++Viewport.TicksSinceLastMove;
Sound.Tick();
Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate(); } );
Sync.CheckSyncUnchanged(world, orderManager.TickImmediate);
if (world != null)
{
@@ -177,14 +174,14 @@ namespace OpenRA
Log.Write("debug", "--Tick: {0} ({1})", LocalTick, isNetTick ? "net" : "local");
if (isNetTick) orderManager.Tick();
if (isNetTick)
orderManager.Tick();
Sync.CheckSyncUnchanged(world, () =>
{
world.OrderGenerator.Tick(world);
world.Selection.Tick(world);
});
{
world.OrderGenerator.Tick(world);
world.Selection.Tick(world);
});
world.Tick();
@@ -193,6 +190,9 @@ namespace OpenRA
else
if (orderManager.NetFrameNumber == 0)
orderManager.LastTickTime = Environment.TickCount;
world.TickRender(worldRenderer);
viewport.Tick();
}
}
}
@@ -211,26 +211,34 @@ namespace OpenRA
var map = modData.PrepareMap(mapUID);
viewport = new Viewport(new int2(Renderer.Resolution), map.Bounds, Renderer);
orderManager.world = new World(modData.Manifest, map, orderManager) { IsShellmap = isShellmap };
orderManager.world = new World(modData.Manifest, map, orderManager, isShellmap);
worldRenderer = new WorldRenderer(orderManager.world);
if (orderManager.GameStarted) return;
Widget.SelectedWidget = null;
Ui.SelectedWidget = null;
orderManager.LocalFrameNumber = 0;
orderManager.LastTickTime = Environment.TickCount;
orderManager.StartGame();
worldRenderer.RefreshPalette();
if (!isShellmap)
Sound.PlayNotification(null, "Speech", "StartGame", null);
}
public static bool IsHost
{
get { return orderManager.Connection.LocalClientId == 0; }
get
{
var client= orderManager.LobbyInfo.ClientWithIndex(
orderManager.Connection.LocalClientId);
return ((client!=null) && client.IsAdmin);
}
}
public static Dictionary<String, Mod> CurrentMods
{
get { return Mod.AllMods.Where( k => modData.Manifest.Mods.Contains( k.Key )).ToDictionary( k => k.Key, k => k.Value ); }
get { return Mod.AllMods.Where(k => modData.Manifest.Mods.Contains(k.Key)).ToDictionary(k => k.Key, k => k.Value); }
}
static Modifiers modifiers;
@@ -244,12 +252,20 @@ namespace OpenRA
AppDomain.CurrentDomain.AssemblyResolve += FileSystem.ResolveAssembly;
Settings = new Settings(Platform.SupportDir + "settings.yaml", args);
Settings.Save();
Log.LogPath = Platform.SupportDir + "Logs" + Path.DirectorySeparatorChar;
Log.AddChannel("perf", "perf.log");
Log.AddChannel("debug", "debug.log");
Log.AddChannel("sync", "syncreport.log");
Log.AddChannel("server", "server.log");
if (Settings.Server.DiscoverNatDevices)
UPnP.TryNatDiscovery();
else
{
Settings.Server.NatDeviceAvailable = false;
Settings.Server.AllowPortForward = false;
}
FileSystem.Mount("."); // Needed to access shaders
Renderer.Initialize( Game.Settings.Graphics.Mode );
@@ -259,8 +275,15 @@ namespace OpenRA
foreach(var mod in Mod.AllMods)
Console.WriteLine("\t{0}: {1} ({2})", mod.Key, mod.Value.Title, mod.Value.Version);
Sound.Create();
Sound.Create(Settings.Sound.Engine);
InitializeWithMods(Settings.Game.Mods);
if (Settings.Server.DiscoverNatDevices)
{
RunAfterDelay(Settings.Server.NatDiscoveryTimeout, () =>
UPnP.TryStoppingNatDiscovery()
);
}
}
public static void InitializeWithMods(string[] mods)
@@ -270,7 +293,7 @@ namespace OpenRA
AddChatLine = (a,b,c) => {};
ConnectionStateChanged = om => {};
BeforeGameStart = () => {};
Widget.ResetAll();
Ui.ResetAll();
worldRenderer = null;
if (server != null)
@@ -278,20 +301,19 @@ namespace OpenRA
if (orderManager != null)
orderManager.Dispose();
// Discard any invalid mods
// Discard any invalid mods, set RA as default
var mm = mods.Where( m => Mod.AllMods.ContainsKey( m ) ).ToArray();
if (mm.Length == 0) mm = new[] { "ra" };
Console.WriteLine("Loading mods: {0}", mm.JoinWith(","));
Settings.Game.Mods = mm;
Settings.Save();
Sound.StopMusic();
Sound.StopVideo();
Sound.Initialize();
modData = new ModData( mm );
modData = new ModData(mm);
Renderer.InitializeFonts(modData.Manifest);
modData.LoadInitialAssets();
modData.InitializeLoaders();
PerfHistory.items["render"].hasNormalTick = false;
PerfHistory.items["batches"].hasNormalTick = false;
@@ -301,7 +323,40 @@ namespace OpenRA
JoinLocal();
viewport = new Viewport(new int2(Renderer.Resolution), Rectangle.Empty, Renderer);
modData.LoadScreen.StartGame();
if (Game.Settings.Server.Dedicated)
{
while (true)
{
Game.Settings.Server.Map = WidgetUtils.ChooseInitialMap(Game.Settings.Server.Map);
Game.Settings.Save();
Game.CreateServer(new ServerSettings(Game.Settings.Server));
while (true)
{
System.Threading.Thread.Sleep(100);
if ((server.State == Server.ServerState.GameStarted)
&& (server.conns.Count<=1))
{
Console.WriteLine("No one is playing, shutting down...");
server.Shutdown();
break;
}
}
if (Game.Settings.Server.DedicatedLoop)
{
Console.WriteLine("Starting a new server instance...");
continue;
}
else
break;
}
System.Environment.Exit(0);
}
else
{
modData.LoadScreen.StartGame();
Settings.Save();
}
}
public static void LoadShellMap()
@@ -326,8 +381,20 @@ namespace OpenRA
internal static void Run()
{
while (!quit)
{
var idealFrameTime = 1.0 / Settings.Graphics.MaxFramerate;
var sw = new Stopwatch();
Tick( orderManager, viewport );
if (Settings.Graphics.CapFramerate)
{
var waitTime = idealFrameTime - sw.ElapsedTime();
if (waitTime > 0)
System.Threading.Thread.Sleep( TimeSpan.FromSeconds(waitTime) );
}
}
OnQuit();
}
@@ -358,13 +425,13 @@ namespace OpenRA
public static T CreateObject<T>( string name )
{
return modData.ObjectCreator.CreateObject<T>( name );
return modData.ObjectCreator.CreateObject<T>(name);
}
public static void CreateServer(ServerSettings settings)
{
server = new Server.Server(new IPEndPoint(IPAddress.Any, settings.ListenPort),
Game.Settings.Game.Mods, settings, modData);
Game.Settings.Game.Mods, settings, modData);
}
public static int CreateLocalServer(string map)
@@ -378,9 +445,10 @@ namespace OpenRA
// Work around a miscompile in mono 2.6.7:
// booleans that default to true cannot be set false by an initializer
settings.AdvertiseOnline = false;
settings.AllowPortForward = false;
server = new Server.Server(new IPEndPoint(IPAddress.Loopback, 0),
Game.Settings.Game.Mods, settings, modData);
Game.Settings.Game.Mods, settings, modData);
return server.Port;
}
@@ -390,21 +458,28 @@ namespace OpenRA
return orderManager != null && orderManager.world == world;
}
public static void JoinExternalGame()
public static bool DownloadMap(string mapHash)
{
var addressParts = Game.Settings.Game.ConnectTo.Split(
new [] { ':' }, StringSplitOptions.RemoveEmptyEntries);
if (addressParts.Length < 1 || addressParts.Length > 2)
return;
var host = addressParts[0];
var port = Exts.WithDefault(1234, () => int.Parse(addressParts[1]));
Game.Settings.Game.ConnectTo = "";
Game.Settings.Save();
Game.JoinServer(host, port);
try
{
var mod = Game.CurrentMods.FirstOrDefault().Value.Id;
var dirPath = "{1}maps{0}{2}".F(Path.DirectorySeparatorChar, Platform.SupportDir, mod);
if(!Directory.Exists(dirPath))
Directory.CreateDirectory(dirPath);
var mapPath = "{1}{0}{2}".F(Path.DirectorySeparatorChar, dirPath, mapHash+".oramap");
Console.Write("Trying to download map to {0} ... ".F(mapPath));
WebClient webClient = new WebClient();
webClient.DownloadFile(Game.Settings.Game.MapRepository + mapHash, mapPath);
Game.modData.AvailableMaps.Add(mapHash, new Map(mapPath));
Console.WriteLine("done");
return true;
}
catch (WebException e)
{
Log.Write("debug", "Could not download map '{0}'", mapHash);
Log.Write("debug", e.ToString());
return false;
}
}
}
}

View File

@@ -16,8 +16,15 @@ using OpenRA.Traits;
namespace OpenRA
{
//TODO: This is not exported into the documentation yet.
[Desc("A unit/building inside the game. Every rules starts with one and adds trait to it.",
"Special actors like world or player are usually defined in system.yaml and affect everything.")]
public class ActorInfo
{
[Desc("The actor name can be anything, but the sprites used in the Render*: traits default to this one.",
"If you add an ^ in front of the name, the engine will recognize this as a collection of traits",
"that can be inherited by others (using Inherits:) and not a real unit.",
"You can remove inherited traits by adding a - infront of them as in -TraitName: to inherit everything, but this trait.")]
public readonly string Name;
public readonly TypeDictionary Traits = new TypeDictionary();
@@ -70,6 +77,9 @@ namespace OpenRA
static ITraitInfo LoadTraitInfo(string traitName, MiniYaml my)
{
if (!string.IsNullOrEmpty(my.Value))
throw new YamlException("Junk value `{0}` on trait node {1}"
.F(my.Value, traitName));
var info = Game.CreateObject<ITraitInfo>(traitName + "Info");
FieldLoader.Load(info, my);
return info;

View File

@@ -20,7 +20,8 @@ namespace OpenRA
{
public static Dictionary<string, ActorInfo> Info;
public static Dictionary<string, WeaponInfo> Weapons;
public static Dictionary<string, VoiceInfo> Voices;
public static Dictionary<string, SoundInfo> Voices;
public static Dictionary<string, SoundInfo> Notifications;
public static Dictionary<string, MusicInfo> Music;
public static Dictionary<string, string> Movies;
public static Dictionary<string, TileSet> TileSets;
@@ -30,7 +31,8 @@ namespace OpenRA
// Added support to extend the list of rules (add it to m.LocalRules)
Info = LoadYamlRules(m.Rules, map.Rules, (k, y) => new ActorInfo(k.Key.ToLowerInvariant(), k.Value, y));
Weapons = LoadYamlRules(m.Weapons, map.Weapons, (k, _) => new WeaponInfo(k.Key.ToLowerInvariant(), k.Value));
Voices = LoadYamlRules(m.Voices, map.Voices, (k, _) => new VoiceInfo(k.Value));
Voices = LoadYamlRules(m.Voices, map.Voices, (k, _) => new SoundInfo(k.Value));
Notifications = LoadYamlRules(m.Notifications, map.Notifications, (k, _) => new SoundInfo(k.Value));
Music = LoadYamlRules(m.Music, new List<MiniYamlNode>(), (k, _) => new MusicInfo(k.Key, k.Value));
Movies = LoadYamlRules(m.Movies, new List<MiniYamlNode>(), (k, v) => k.Value.Value);
@@ -44,9 +46,9 @@ namespace OpenRA
static Dictionary<string, T> LoadYamlRules<T>(string[] files, List<MiniYamlNode> dict, Func<MiniYamlNode, Dictionary<string, MiniYaml>, T> f)
{
var y = files.Select(a => MiniYaml.FromFile(a)).Aggregate(dict,MiniYaml.MergeLiberal);
var yy = y.ToDictionary( x => x.Key, x => x.Value );
return y.ToDictionary(kv => kv.Key.ToLowerInvariant(), kv => f(kv, yy));
var y = files.Select(MiniYaml.FromFile).Aggregate(dict, MiniYaml.MergeLiberal);
var yy = y.ToDictionary(x => x.Key, x => x.Value);
return y.ToDictionaryWithConflictLog(kv => kv.Key.ToLowerInvariant(), kv => f(kv, yy), "LoadYamlRules", null, null);
}
public static IEnumerable<KeyValuePair<string,MusicInfo>> InstalledMusic { get { return Music.Where( m => m.Value.Exists ); } }

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -19,6 +19,9 @@ using OpenRA.Server;
namespace OpenRA.GameRules
{
public enum MouseScrollType { Disabled, Standard, Inverted }
public enum SoundCashTicks { Disabled, Normal, Extreme }
public class ServerSettings
{
public string Name = "OpenRA Game";
@@ -26,8 +29,19 @@ namespace OpenRA.GameRules
public int ExternalPort = 1234;
public bool AdvertiseOnline = true;
public string MasterServer = "http://master.open-ra.org/";
public bool DiscoverNatDevices = false; // Allow users to disable NAT discovery if problems occur
public bool AllowPortForward = true; // let the user disable it even if compatible devices are found
public bool NatDeviceAvailable = false; // internal check if discovery succeeded
public int NatDiscoveryTimeout = 1000; // ms to search for UPnP enabled NATs
public bool VerboseNatDiscovery = false; // print very detailed logs for debugging
public bool AllowCheats = false;
public string Map = null;
public string[] Ban = { };
public int TimeOut = 0;
public bool Dedicated = false;
public bool DedicatedLoop = true;
public bool LockBots = false;
public bool AllowVersionMismatch = false;
public ServerSettings() { }
@@ -38,8 +52,19 @@ namespace OpenRA.GameRules
ExternalPort = other.ExternalPort;
AdvertiseOnline = other.AdvertiseOnline;
MasterServer = other.MasterServer;
DiscoverNatDevices = other.DiscoverNatDevices;
AllowPortForward = other.AllowPortForward;
NatDeviceAvailable = other.NatDeviceAvailable;
NatDiscoveryTimeout = other.NatDiscoveryTimeout;
VerboseNatDiscovery = other.VerboseNatDiscovery;
AllowCheats = other.AllowCheats;
Map = other.Map;
Ban = other.Ban;
TimeOut = other.TimeOut;
Dedicated = other.Dedicated;
DedicatedLoop = other.DedicatedLoop;
LockBots = other.LockBots;
AllowVersionMismatch = other.AllowVersionMismatch;
}
}
@@ -51,6 +76,8 @@ namespace OpenRA.GameRules
public float LongTickThreshold = 0.001f;
public bool SanityCheckUnsyncedCode = false;
public int Samples = 25;
public bool IgnoreVersionMismatch = false;
public bool DeveloperMenu = false;
}
public class GraphicSettings
@@ -60,6 +87,8 @@ namespace OpenRA.GameRules
public int2 FullscreenSize = new int2(0,0);
public int2 WindowedSize = new int2(1024, 768);
public bool PixelDouble = false;
public bool CapFramerate = false;
public int MaxFramerate = 60;
public int BatchSize = 8192;
public int NumTempBuffers = 8;
@@ -73,18 +102,19 @@ namespace OpenRA.GameRules
public float VideoVolume = 0.5f;
public bool Shuffle = false;
public bool Repeat = false;
public bool ShellmapMusic = true;
public bool MapMusic = true;
public string Engine = "AL";
public SoundCashTicks SoundCashTickType = SoundCashTicks.Extreme;
}
public class PlayerSettings
{
public string Name = "Newbie";
public ColorRamp ColorRamp = new ColorRamp(75, 255, 180, 25);
public HSLColor Color = new HSLColor(75, 255, 180);
public string LastServer = "localhost:1234";
}
public enum MouseScrollType { Disabled, Standard, Inverted }
public class GameSettings
{
public string[] Mods = { "ra" };
@@ -96,12 +126,37 @@ namespace OpenRA.GameRules
public MouseScrollType MouseScroll = MouseScrollType.Standard;
public float ViewportEdgeScrollStep = 10f;
public bool UseClassicMouseStyle = false;
// Internal game settings
public int Timestep = 40;
public string ConnectTo = "";
public bool AllowDownloading = true;
public string MapRepository = "http://content.open-ra.org/map/";
}
public class KeySettings
{
public string CycleBaseKey = "backspace";
public string ToLastEventKey = "space";
public string ToSelectionKey = "home";
public string PauseKey = "f9";
public string SellKey = "f10";
public string PowerDownKey = "f11";
public string RepairKey = "f12";
public string AttackMoveKey = "a";
public string StopKey = "s";
public string ScatterKey = "x";
public string DeployKey = "f";
public string StanceCycleKey = "z";
public string GuardKey = "d";
public string CycleTabsKey = "tab";
}
public class Settings
{
string SettingsFile;
@@ -112,6 +167,7 @@ namespace OpenRA.GameRules
public GraphicSettings Graphics = new GraphicSettings();
public ServerSettings Server = new ServerSettings();
public DebugSettings Debug = new DebugSettings();
public KeySettings Keys = new KeySettings();
public Dictionary<string, object> Sections;
@@ -126,6 +182,7 @@ namespace OpenRA.GameRules
{"Graphics", Graphics},
{"Server", Server},
{"Debug", Debug},
{"Keys", Keys},
};
// Override fieldloader to ignore invalid entries
@@ -139,7 +196,6 @@ namespace OpenRA.GameRules
if (File.Exists(SettingsFile))
{
//Console.WriteLine("Loading settings file {0}",SettingsFile);
var yaml = MiniYaml.DictFromFile(SettingsFile);
foreach (var kv in Sections)
@@ -168,11 +224,11 @@ namespace OpenRA.GameRules
void LoadSectionYaml(MiniYaml yaml, object section)
{
object defaults = Activator.CreateInstance(section.GetType());
var defaults = Activator.CreateInstance(section.GetType());
FieldLoader.InvalidValueAction = (s,t,f) =>
{
object ret = defaults.GetType().GetField(f).GetValue(defaults);
System.Console.WriteLine("FieldLoader: Cannot parse `{0}` into `{2}:{1}`; substituting default `{3}`".F(s,t.Name,f,ret) );
var ret = defaults.GetType().GetField(f).GetValue(defaults);
Console.WriteLine("FieldLoader: Cannot parse `{0}` into `{2}:{1}`; substituting default `{3}`".F(s,t.Name,f,ret) );
return ret;
};

View File

@@ -1,4 +1,4 @@
#region Copyright & License Information
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
@@ -15,12 +15,16 @@ using OpenRA.FileFormats;
namespace OpenRA.GameRules
{
public class VoiceInfo
public class SoundInfo
{
[FieldLoader.Ignore] public readonly Dictionary<string,string[]> Variants;
[FieldLoader.Ignore] public readonly Dictionary<string,string[]> Prefixes;
[FieldLoader.Ignore] public readonly Dictionary<string,string[]> Voices;
[FieldLoader.Ignore] public readonly Dictionary<string,string[]> Notifications;
public readonly string DefaultVariant = ".aud" ;
public readonly string DefaultPrefix = "" ;
public readonly string[] DisableVariants = { };
public readonly string[] DisablePrefixes = { };
static Dictionary<string, string[]> Load( MiniYaml y, string name )
{
@@ -31,30 +35,28 @@ namespace OpenRA.GameRules
: new Dictionary<string, string[]>();
}
public readonly OpenRA.FileFormats.Lazy<Dictionary<string, VoicePool>> Pools;
public readonly OpenRA.FileFormats.Lazy<Dictionary<string, SoundPool>> VoicePools;
public readonly OpenRA.FileFormats.Lazy<Dictionary<string, SoundPool>> NotificationsPools;
public VoiceInfo( MiniYaml y )
public SoundInfo( MiniYaml y )
{
FieldLoader.Load( this, y );
Variants = Load(y, "Variants");
Prefixes = Load(y, "Prefixes");
Voices = Load(y, "Voices");
Notifications = Load(y, "Notifications");
if (!Voices.ContainsKey("Attack"))
Voices.Add("Attack", Voices["Move"]);
if (!Voices.ContainsKey("AttackMove"))
Voices.Add("AttackMove", Voices["Move"]);
Pools = Lazy.New(() => Voices.ToDictionary( a => a.Key, a => new VoicePool(a.Value) ));
VoicePools = Lazy.New(() => Voices.ToDictionary( a => a.Key, a => new SoundPool(a.Value) ));
NotificationsPools = Lazy.New(() => Notifications.ToDictionary( a => a.Key, a => new SoundPool(a.Value) ));
}
}
public class VoicePool
public class SoundPool
{
readonly string[] clips;
readonly List<string> liveclips = new List<string>();
public VoicePool(params string[] clips)
public SoundPool(params string[] clips)
{
this.clips = clips;
}

View File

@@ -18,21 +18,35 @@ namespace OpenRA.GameRules
{
public class WarheadInfo
{
public readonly int Spread = 1; // distance (in pixels) from the explosion center at which damage is 1/2.
[Desc("Distance (in pixels) from the explosion center at which damage is 1/2.")]
public readonly int Spread = 1;
[FieldLoader.LoadUsing( "LoadVersus" )]
public readonly Dictionary<string, float> Versus; // damage vs each armortype
public readonly bool Ore = false; // can this damage ore?
public readonly string Explosion = null; // explosion effect to use
public readonly string WaterExplosion = null; // explosion effect on hitting water (usually a splash)
public readonly string SmudgeType = null; // type of smudge to apply
public readonly int[] Size = { 0, 0 }; // size of the explosion. provide 2 values for a ring effect (outer/inner)
public readonly int InfDeath = 0; // infantry death animation to use
public readonly string ImpactSound = null; // sound to play on impact
public readonly string WaterImpactSound = null; // sound to play on impact with water
public readonly int Damage = 0; // how much (raw) damage to deal
public readonly int Delay = 0; // delay in ticks before dealing the damage. 0=instant (old model)
public readonly DamageModel DamageModel = DamageModel.Normal; // which damage model to use
public readonly bool PreventProne = false; // whether we should prevent prone response in infantry.
[Desc("Damage vs each armortype. 0% = can't target.")]
public readonly Dictionary<string, float> Versus;
[Desc("Can this damage ore?")]
public readonly bool Ore = false;
[Desc("Explosion effect to use.")]
public readonly string Explosion = null;
[Desc("Explosion effect on hitting water (usually a splash).")]
public readonly string WaterExplosion = null;
[Desc("Type of smudge to apply to terrain.")]
public readonly string[] SmudgeType = { };
[Desc("Size of the explosion. provide 2 values for a ring effect (outer/inner).")]
public readonly int[] Size = { 0, 0 };
[Desc("Infantry death animation to use")]
public readonly int InfDeath = 1;
[Desc("Sound to play on impact.")]
public readonly string ImpactSound = null;
[Desc("Sound to play on impact with water")]
public readonly string WaterImpactSound = null;
[Desc("How much (raw) damage to deal")]
public readonly int Damage = 0;
[Desc("Delay in ticks before dealing the damage, 0 = instant (old model).")]
public readonly int Delay = 0;
[Desc("Which damage model to use.")]
public readonly DamageModel DamageModel = DamageModel.Normal;
[Desc("Whether we should prevent prone response for infantry.")]
public readonly bool PreventProne = false;
public float EffectivenessAgainst(Actor self)
{
@@ -72,11 +86,11 @@ namespace OpenRA.GameRules
{
public WeaponInfo weapon;
public Actor firedBy;
public int2 src;
public PPos src;
public int srcAltitude;
public int facing;
public Target target;
public int2 dest;
public PPos dest;
public int destAltitude;
public float firepowerModifier = 1.0f;
}
@@ -86,12 +100,13 @@ namespace OpenRA.GameRules
public class WeaponInfo
{
public readonly float Range = 0;
public readonly string Report = null;
public readonly string[] Report = null;
[Desc("Rate of Fire")]
public readonly int ROF = 1;
public readonly int Burst = 1;
public readonly bool Charges = false;
public readonly bool Underwater = false;
public readonly string[] ValidTargets = { "Ground" };
public readonly string[] ValidTargets = { "Ground", "Water" };
public readonly int BurstDelay = 5;
public readonly float MinRange = 0;
@@ -122,5 +137,37 @@ namespace OpenRA.GameRules
return ret;
}
public bool IsValidAgainst(Actor a)
{
var targetable = a.TraitOrDefault<ITargetable>();
if (targetable == null || !ValidTargets.Intersect(targetable.TargetTypes).Any())
return false;
if (Warheads.All(w => w.EffectivenessAgainst(a) <= 0))
return false;
return true;
}
public bool IsValidAgainst(Target target, World world)
{
if (!target.IsValid)
return false;
if (target.IsActor)
return IsValidAgainst(target.Actor);
else
{
var cell = target.CenterPosition.ToCPos();
if (ValidTargets.Contains("Ground") && world.GetTerrainType(cell) != "Water")
return true;
if (ValidTargets.Contains("Water") && world.GetTerrainType(cell) == "Water")
return true;
return false;
}
}
}
}

View File

@@ -24,15 +24,13 @@ namespace OpenRA.Graphics
public string Name { get { return name; } }
public Animation( string name )
: this( name, () => 0 )
{
}
public Animation(string name)
: this(name, () => 0) {}
public Animation( string name, Func<int> facingFunc )
public Animation(string name, Func<int> facingFunc)
{
this.name = name.ToLowerInvariant();
this.tickFunc = () => { };
this.tickFunc = () => {};
this.facingFunc = facingFunc;
}
@@ -46,12 +44,12 @@ namespace OpenRA.Graphics
}
}
public void Play( string sequenceName )
public void Play(string sequenceName)
{
PlayThen(sequenceName, null);
}
public void PlayRepeating( string sequenceName )
public void PlayRepeating(string sequenceName)
{
backwards = false;
tickAlways = false;
@@ -75,16 +73,16 @@ namespace OpenRA.Graphics
return true;
}
public void PlayThen( string sequenceName, Action after )
public void PlayThen(string sequenceName, Action after)
{
backwards = false;
tickAlways = false;
CurrentSequence = SequenceProvider.GetSequence( name, sequenceName );
CurrentSequence = SequenceProvider.GetSequence(name, sequenceName);
frame = 0;
tickFunc = () =>
{
++frame;
if( frame >= CurrentSequence.Length )
if (frame >= CurrentSequence.Length)
{
frame = CurrentSequence.Length - 1;
tickFunc = () => { };
@@ -99,11 +97,11 @@ namespace OpenRA.Graphics
backwards = true;
}
public void PlayFetchIndex( string sequenceName, Func<int> func )
public void PlayFetchIndex(string sequenceName, Func<int> func)
{
backwards = false;
tickAlways = true;
CurrentSequence = SequenceProvider.GetSequence( name, sequenceName );
CurrentSequence = SequenceProvider.GetSequence(name, sequenceName);
frame = func();
tickFunc = () => frame = func();
}
@@ -113,19 +111,19 @@ namespace OpenRA.Graphics
public void Tick()
{
Tick( 40 ); // tick one frame
Tick(40); // tick one frame
}
public bool HasSequence(string seq) { return SequenceProvider.HasSequence( name, seq ); }
public bool HasSequence(string seq) { return SequenceProvider.HasSequence(name, seq); }
public void Tick( int t )
public void Tick(int t)
{
if( tickAlways )
if (tickAlways)
tickFunc();
else
{
timeUntilNextFrame -= t;
while( timeUntilNextFrame <= 0 )
while (timeUntilNextFrame <= 0)
{
tickFunc();
timeUntilNextFrame += CurrentSequence != null ? CurrentSequence.Tick : 40; // 25 fps == 40 ms
@@ -145,9 +143,9 @@ namespace OpenRA.Graphics
}
}
public Sequence GetSequence( string sequenceName )
public Sequence GetSequence(string sequenceName)
{
return SequenceProvider.GetSequence( name, sequenceName );
return SequenceProvider.GetSequence(name, sequenceName);
}
}
}

View File

@@ -15,36 +15,43 @@ namespace OpenRA.Graphics
{
public class AnimationWithOffset
{
public Animation Animation;
public Func<float2> OffsetFunc;
public Func<bool> DisableFunc;
public int ZOffset;
public readonly Animation Animation;
public readonly Func<WVec> OffsetFunc;
public readonly Func<bool> DisableFunc;
public readonly Func<WPos, int> ZOffset;
public AnimationWithOffset(Animation a)
: this(a, null, null)
{
}
public AnimationWithOffset(Animation a, Func<WVec> offset, Func<bool> disable)
: this(a, offset, disable, null) { }
public AnimationWithOffset(Animation a, Func<float2> o, Func<bool> d)
public AnimationWithOffset(Animation a, Func<WVec> offset, Func<bool> disable, int zOffset)
: this(a, offset, disable, _ => zOffset) { }
public AnimationWithOffset(Animation a, Func<WVec> offset, Func<bool> disable, Func<WPos, int> zOffset)
{
this.Animation = a;
this.OffsetFunc = o;
this.DisableFunc = d;
this.OffsetFunc = offset;
this.DisableFunc = disable;
this.ZOffset = zOffset;
}
public Renderable Image(Actor self, string pal)
public IRenderable Image(Actor self, WorldRenderer wr, PaletteReference pal)
{
var p = self.CenterLocation;
var loc = p - 0.5f * Animation.Image.size
+ (OffsetFunc != null ? OffsetFunc() : float2.Zero);
var r = new Renderable(Animation.Image, loc, pal, p.Y);
return Image(self, wr, pal, 1f);
}
return ZOffset != 0 ? r.WithZOffset(ZOffset) : r;
public IRenderable Image(Actor self, WorldRenderer wr, PaletteReference pal, float scale)
{
var p = self.CenterPosition;
if (OffsetFunc != null)
p += OffsetFunc();
var z = (ZOffset != null) ? ZOffset(p) : 0;
return new SpriteRenderable(Animation.Image, p, z, pal, scale);
}
public static implicit operator AnimationWithOffset(Animation a)
{
return new AnimationWithOffset(a);
return new AnimationWithOffset(a, null, null, null);
}
}
}

View File

@@ -0,0 +1,68 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System.Collections.Generic;
using System.Drawing;
namespace OpenRA.Graphics
{
public struct BeamRenderable : IRenderable
{
readonly WPos pos;
readonly int zOffset;
readonly WVec length;
readonly Color color;
readonly float width;
public BeamRenderable(WPos pos, int zOffset, WVec length, float width, Color color)
{
this.pos = pos;
this.zOffset = zOffset;
this.length = length;
this.color = color;
this.width = width;
}
public WPos Pos { get { return pos; } }
public float Scale { get { return 1f; } }
public PaletteReference Palette { get { return null; } }
public int ZOffset { get { return zOffset; } }
public IRenderable WithScale(float newScale) { return new BeamRenderable(pos, zOffset, length, width, color); }
public IRenderable WithPalette(PaletteReference newPalette) { return new BeamRenderable(pos, zOffset, length, width, color); }
public IRenderable WithZOffset(int newOffset) { return new BeamRenderable(pos, zOffset, length, width, color); }
public IRenderable WithPos(WPos pos) { return new BeamRenderable(pos, zOffset, length, width, color); }
public void BeforeRender(WorldRenderer wr) {}
public void Render(WorldRenderer wr)
{
var wlr = Game.Renderer.WorldLineRenderer;
var src = wr.ScreenPosition(pos);
var dest = wr.ScreenPosition(pos + length);
var lineWidth = wlr.LineWidth;
if (lineWidth != width)
{
wlr.Flush();
wlr.LineWidth = width;
}
wlr.DrawLine(src, dest, color, color);
if (lineWidth != width)
{
wlr.Flush();
wlr.LineWidth = lineWidth;
}
}
public void RenderDebugGeometry(WorldRenderer wr) {}
}
}

View File

@@ -0,0 +1,105 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
namespace OpenRA.Graphics
{
public struct ContrailRenderable : IRenderable
{
readonly World world;
// Store trail positions in a circular buffer
readonly WPos[] trail;
int next;
int length;
int skip;
readonly Color color;
readonly int zOffset;
public ContrailRenderable(World world, Color color, int length, int skip, int zOffset)
: this(world, new WPos[length], 0, 0, skip, color, zOffset) {}
ContrailRenderable(World world, WPos[] trail, int next, int length, int skip, Color color, int zOffset)
{
this.world = world;
this.trail = trail;
this.next = next;
this.length = length;
this.skip = skip;
this.color = color;
this.zOffset = zOffset;
}
public WPos Pos { get { return trail[idx(next-1)]; } }
public float Scale { get { return 1f; } }
public PaletteReference Palette { get { return null; } }
public int ZOffset { get { return zOffset; } }
public IRenderable WithScale(float newScale) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, zOffset); }
public IRenderable WithPalette(PaletteReference newPalette) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, zOffset); }
public IRenderable WithZOffset(int newOffset) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, newOffset); }
public IRenderable WithPos(WPos pos) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, zOffset); }
public void BeforeRender(WorldRenderer wr) {}
public void Render(WorldRenderer wr)
{
// Need at least 4 points to smooth the contrail over
if (length - skip < 4 )
return;
// Start of the first line segment is the tail of the list - don't smooth it.
var curPos = trail[idx(next - skip - 1)];
var curCell = curPos.ToCPos();
var curColor = color;
for (var i = 0; i < length - skip - 4; i++)
{
var j = next - skip - i - 2;
var nextPos = WPos.Average(trail[idx(j)], trail[idx(j-1)], trail[idx(j-2)], trail[idx(j-3)]);
var nextCell = nextPos.ToCPos();
var nextColor = Exts.ColorLerp(i * 1f / (length - 4), color, Color.Transparent);
if (!world.FogObscures(curCell) && !world.FogObscures(nextCell))
Game.Renderer.WorldLineRenderer.DrawLine(wr.ScreenPosition(curPos), wr.ScreenPosition(nextPos), curColor, nextColor);
curPos = nextPos;
curCell = nextCell;
curColor = nextColor;
}
}
public void RenderDebugGeometry(WorldRenderer wr) {}
// Array index modulo length
int idx(int i)
{
var j = i % trail.Length;
return j < 0 ? j + trail.Length : j;
}
public void Update(WPos pos)
{
trail[next] = pos;
next = idx(next+1);
if (length < trail.Length)
length++;
}
public static Color ChooseColor(Actor self)
{
var ownerColor = Color.FromArgb(255, self.Owner.Color.RGB);
return Exts.ColorLerp(0.5f, ownerColor, Color.White);
}
}
}

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -14,23 +14,46 @@ using System.IO;
using System.Linq;
using System.Xml;
using OpenRA.FileFormats;
using OpenRA.Traits;
namespace OpenRA.Graphics
{
public static class CursorProvider
{
static HardwarePalette palette;
static Dictionary<string, CursorSequence> cursors;
static Cache<string, PaletteReference> palettes;
static PaletteReference CreatePaletteReference(string name)
{
var pal = palette.GetPalette(name);
if (pal == null)
throw new InvalidOperationException("Palette `{0}` does not exist".F(name));
return new PaletteReference(name, palette.GetPaletteIndex(name), pal);
}
public static void Initialize(string[] sequenceFiles)
{
cursors = new Dictionary<string, CursorSequence>();
palettes = new Cache<string, PaletteReference>(CreatePaletteReference);
var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal));
int[] ShadowIndex = { };
foreach (var s in sequences.NodesDict["Palettes"].Nodes)
Game.modData.Palette.AddPalette(s.Key, new Palette(FileSystem.Open(s.Value.Value), false));
if (sequences.NodesDict.ContainsKey("ShadowIndex"))
{
Array.Resize(ref ShadowIndex, ShadowIndex.Length + 1);
int.TryParse(sequences.NodesDict["ShadowIndex"].Value, out ShadowIndex[ShadowIndex.Length - 1]);
}
palette = new HardwarePalette();
foreach (var p in sequences.NodesDict["Palettes"].Nodes)
palette.AddPalette(p.Key, new Palette(FileSystem.Open(p.Value.Value), ShadowIndex), false);
foreach (var s in sequences.NodesDict["Cursors"].Nodes)
LoadSequencesForCursor(s.Key, s.Value);
palette.Initialize();
}
static void LoadSequencesForCursor(string cursorSrc, MiniYaml cursor)
@@ -46,6 +69,18 @@ namespace OpenRA.Graphics
return cursors.ContainsKey(cursor);
}
public static void DrawCursor(Renderer renderer, string cursorName, int2 lastMousePos, int cursorFrame)
{
var cursorSequence = GetCursorSequence(cursorName);
var cursorSprite = cursorSequence.GetSprite(cursorFrame);
renderer.SetPalette(palette);
renderer.SpriteRenderer.DrawSprite(cursorSprite,
lastMousePos - cursorSequence.Hotspot,
palettes[cursorSequence.Palette],
cursorSprite.size);
}
public static CursorSequence GetCursorSequence(string cursor)
{
try { return cursors[cursor]; }

View File

@@ -22,15 +22,17 @@ namespace OpenRA.Graphics
public const int MaxPalettes = 256;
int allocated = 0;
ITexture texture;
public ITexture Texture { get; private set; }
Dictionary<string, Palette> palettes;
Dictionary<string, int> indices;
Dictionary<string, bool> allowsMods;
public HardwarePalette()
{
palettes = new Dictionary<string, Palette>();
indices = new Dictionary<string, int>();
texture = Game.Renderer.Device.CreateTexture();
allowsMods = new Dictionary<string, bool>();
Texture = Game.Renderer.Device.CreateTexture();
}
public Palette GetPalette(string name)
@@ -49,22 +51,24 @@ namespace OpenRA.Graphics
return ret;
}
public void AddPalette(string name, Palette p)
public void AddPalette(string name, Palette p, bool allowModifiers)
{
if (palettes.ContainsKey(name))
throw new InvalidOperationException("Palette {0} has already been defined".F(name));
palettes.Add(name, p);
indices.Add(name, allocated++);
allowsMods.Add(name, allowModifiers);
}
uint[,] data = new uint[MaxPalettes, 256];
public void Update(IEnumerable<IPaletteModifier> paletteMods)
public void ApplyModifiers(IEnumerable<IPaletteModifier> paletteMods)
{
var copy = palettes.ToDictionary(p => p.Key, p => new Palette(p.Value));
var modifiable = copy.Where(p => allowsMods[p.Key]).ToDictionary(p => p.Key, p => p.Value);
foreach (var mod in paletteMods)
mod.AdjustPalette(copy);
mod.AdjustPalette(modifiable);
foreach (var pal in copy)
{
@@ -74,9 +78,12 @@ namespace OpenRA.Graphics
data[j,i] = c[i];
}
// Doesn't work
texture.SetData(data);
Game.Renderer.PaletteTexture = texture;
Texture.SetData(data);
}
public void Initialize()
{
ApplyModifiers(new IPaletteModifier[] {});
}
}
}

View File

@@ -21,10 +21,10 @@ namespace OpenRA.Graphics
Renderer renderer;
IShader shader;
Vertex[] vertices = new Vertex[ Renderer.TempBufferSize ];
Vertex[] vertices = new Vertex[Renderer.TempBufferSize];
int nv = 0;
public LineRenderer( Renderer renderer, IShader shader )
public LineRenderer(Renderer renderer, IShader shader)
{
this.renderer = renderer;
this.shader = shader;
@@ -32,50 +32,58 @@ namespace OpenRA.Graphics
public void Flush()
{
if( nv > 0 )
if (nv > 0)
{
shader.Render( () =>
renderer.Device.EnableAlphaBlending();
shader.Render(() =>
{
var vb = renderer.GetTempVertexBuffer();
vb.SetData( vertices, nv );
renderer.SetLineWidth(LineWidth);
renderer.DrawBatch( vb, 0, nv, PrimitiveType.LineList );
} );
vb.SetData(vertices, nv);
renderer.SetLineWidth(LineWidth * Game.viewport.Zoom);
renderer.DrawBatch(vb, 0, nv, PrimitiveType.LineList);
});
renderer.Device.DisableAlphaBlending();
nv = 0;
}
}
public void DrawRect( float2 tl, float2 br, Color c )
public void DrawRect(float2 tl, float2 br, Color c)
{
var tr = new float2( br.X, tl.Y );
var bl = new float2( tl.X, br.Y );
DrawLine( tl, tr, c, c );
DrawLine( tl, bl, c, c );
DrawLine( tr, br, c, c );
DrawLine( bl, br, c, c );
var tr = new float2(br.X, tl.Y);
var bl = new float2(tl.X, br.Y);
DrawLine(tl, tr, c, c);
DrawLine(tl, bl, c, c);
DrawLine(tr, br, c, c);
DrawLine(bl, br, c, c);
}
public void DrawLine( float2 start, float2 end, Color startColor, Color endColor )
public void DrawLine(float2 start, float2 end, Color startColor, Color endColor)
{
Renderer.CurrentBatchRenderer = this;
if( nv + 2 > Renderer.TempBufferSize )
if (nv + 2 > Renderer.TempBufferSize)
Flush();
vertices[ nv++ ] = new Vertex( start + offset,
new float2( startColor.R / 255.0f, startColor.G / 255.0f ),
new float2( startColor.B / 255.0f, startColor.A / 255.0f ) );
vertices[nv++] = new Vertex(start + offset,
new float2(startColor.R / 255.0f, startColor.G / 255.0f),
new float2(startColor.B / 255.0f, startColor.A / 255.0f));
vertices[ nv++ ] = new Vertex( end + offset,
new float2( endColor.R / 255.0f, endColor.G / 255.0f ),
new float2( endColor.B / 255.0f, endColor.A / 255.0f ) );
vertices[nv++] = new Vertex(end + offset,
new float2(endColor.R / 255.0f, endColor.G / 255.0f),
new float2(endColor.B / 255.0f, endColor.A / 255.0f));
}
public void FillRect( RectangleF r, Color color )
public void FillRect(RectangleF r, Color color)
{
for (float y = r.Top; y < r.Bottom; y++)
for (var y = r.Top; y < r.Bottom; y++)
DrawLine(new float2(r.Left, y), new float2(r.Right, y), color, color);
}
public void SetViewportParams(Size screen, float zoom, float2 scroll)
{
shader.SetVec("Scroll", (int)scroll.X, (int)scroll.Y);
shader.SetVec("r1", zoom*2f/screen.Width, -zoom*2f/screen.Height);
shader.SetVec("r2", -1, 1);
}
}
}

View File

@@ -32,13 +32,11 @@ namespace OpenRA.Graphics
var height = map.Bounds.Height;
if (!actualSize)
{
width = height = Exts.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
}
var terrain = new Bitmap(width, height);
var bitmapData = terrain.LockBits(new Rectangle(0, 0, terrain.Width, terrain.Height),
var bitmapData = terrain.LockBits(terrain.Bounds(),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
@@ -69,7 +67,7 @@ namespace OpenRA.Graphics
Bitmap terrain = new Bitmap(terrainBitmap);
var tileset = Rules.TileSets[map.Tileset];
var bitmapData = terrain.LockBits(new Rectangle(0, 0, terrain.Width, terrain.Height),
var bitmapData = terrain.LockBits(terrain.Bounds(),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
@@ -104,7 +102,7 @@ namespace OpenRA.Graphics
var map = world.Map;
var size = Exts.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
var bitmap = new Bitmap(size, size);
var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
var bitmapData = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
@@ -132,7 +130,7 @@ namespace OpenRA.Graphics
var map = world.Map;
var size = Exts.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
var bitmap = new Bitmap(size, size);
var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
var bitmapData = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
@@ -141,7 +139,7 @@ namespace OpenRA.Graphics
foreach (var t in world.ActorsWithTrait<IRadarSignature>())
{
if (!world.LocalShroud.IsVisible(t.Actor))
if (world.FogObscures(t.Actor))
continue;
var color = t.Trait.RadarSignatureColor(t.Actor);
@@ -160,10 +158,10 @@ namespace OpenRA.Graphics
var map = world.Map;
var size = Exts.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
var bitmap = new Bitmap(size, size);
if (world.LocalShroud.Disabled)
if (world.RenderPlayer == null)
return bitmap;
var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
var bitmapData = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
var shroud = Color.Black.ToArgb();
@@ -176,11 +174,10 @@ namespace OpenRA.Graphics
for (var x = 0; x < map.Bounds.Width; x++)
for (var y = 0; y < map.Bounds.Height; y++)
{
var mapX = x + map.Bounds.Left;
var mapY = y + map.Bounds.Top;
if (!world.LocalShroud.IsExplored(mapX, mapY))
var p = new CPos(x + map.Bounds.Left, y + map.Bounds.Top);
if (world.ShroudObscures(p))
*(c + (y * bitmapData.Stride >> 2) + x) = shroud;
else if (!world.LocalShroud.IsVisible(mapX,mapY))
else if (world.FogObscures(p))
*(c + (y * bitmapData.Stride >> 2) + x) = fog;
}
}

View File

@@ -0,0 +1,69 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System.Drawing;
using OpenRA.FileFormats.Graphics;
namespace OpenRA.Graphics
{
public class QuadRenderer : Renderer.IBatchRenderer
{
Renderer renderer;
IShader shader;
Vertex[] vertices = new Vertex[Renderer.TempBufferSize];
int nv = 0;
public QuadRenderer(Renderer renderer, IShader shader)
{
this.renderer = renderer;
this.shader = shader;
}
public void Flush()
{
if (nv > 0)
{
renderer.Device.EnableAlphaBlending();
shader.Render(() =>
{
var vb = renderer.GetTempVertexBuffer();
vb.SetData(vertices, nv);
renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList);
});
renderer.Device.DisableAlphaBlending();
nv = 0;
}
}
public void FillRect(RectangleF r, Color color)
{
Renderer.CurrentBatchRenderer = this;
if (nv + 4 > Renderer.TempBufferSize)
Flush();
vertices[nv] = new Vertex(new float2(r.Left, r.Top), new float2(color.R / 255.0f, color.G / 255.0f), new float2(color.B / 255.0f, color.A / 255.0f));
vertices[nv + 1] = new Vertex(new float2(r.Right, r.Top), new float2(color.R / 255.0f, color.G / 255.0f), new float2(color.B / 255.0f, color.A / 255.0f));
vertices[nv + 2] = new Vertex(new float2(r.Right, r.Bottom), new float2(color.R / 255.0f, color.G / 255.0f), new float2(color.B / 255.0f, color.A / 255.0f));
vertices[nv + 3] = new Vertex(new float2(r.Left, r.Bottom), new float2(color.R / 255.0f, color.G / 255.0f), new float2(color.B / 255.0f, color.A / 255.0f));
nv += 4;
}
public void SetViewportParams(Size screen, float zoom, float2 scroll)
{
shader.SetVec("Scroll", (int)scroll.X, (int)scroll.Y);
shader.SetVec("r1", zoom*2f/screen.Width, -zoom*2f/screen.Height);
shader.SetVec("r2", -1, 1);
}
}
}

View File

@@ -0,0 +1,91 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System.Collections.Generic;
using System.Drawing;
namespace OpenRA.Graphics
{
public class RenderableComparer : IComparer<IRenderable>
{
WorldRenderer wr;
public RenderableComparer(WorldRenderer wr)
{
this.wr = wr;
}
public int Compare(IRenderable x, IRenderable y)
{
var xOrder = wr.ScreenZPosition(x.Pos, x.ZOffset);
var yOrder = wr.ScreenZPosition(y.Pos, y.ZOffset);
return xOrder.CompareTo(yOrder);
}
}
public interface IRenderable
{
WPos Pos { get; }
float Scale { get; }
PaletteReference Palette { get; }
int ZOffset { get; }
IRenderable WithScale(float newScale);
IRenderable WithPalette(PaletteReference newPalette);
IRenderable WithZOffset(int newOffset);
IRenderable WithPos(WPos pos);
void BeforeRender(WorldRenderer wr);
void Render(WorldRenderer wr);
void RenderDebugGeometry(WorldRenderer wr);
}
public struct SpriteRenderable : IRenderable
{
readonly Sprite sprite;
readonly WPos pos;
readonly int zOffset;
readonly PaletteReference palette;
readonly float scale;
public SpriteRenderable(Sprite sprite, WPos pos, int zOffset, PaletteReference palette, float scale)
{
this.sprite = sprite;
this.pos = pos;
this.zOffset = zOffset;
this.palette = palette;
this.scale = scale;
}
// Provided for legacy support only - Don't use for new things!
public SpriteRenderable(Sprite sprite, float2 pos, PaletteReference palette, int z)
: this(sprite, new PPos((int)pos.X, (int)pos.Y).ToWPos(0), z, palette, 1f) { }
public WPos Pos { get { return pos; } }
public float Scale { get { return scale; } }
public PaletteReference Palette { get { return palette; } }
public int ZOffset { get { return zOffset; } }
public IRenderable WithScale(float newScale) { return new SpriteRenderable(sprite, pos, zOffset, palette, newScale); }
public IRenderable WithPalette(PaletteReference newPalette) { return new SpriteRenderable(sprite, pos, zOffset, newPalette, scale); }
public IRenderable WithZOffset(int newOffset) { return new SpriteRenderable(sprite, pos, newOffset, palette, scale); }
public IRenderable WithPos(WPos pos) { return new SpriteRenderable(sprite, pos, zOffset, palette, scale); }
public void BeforeRender(WorldRenderer wr) {}
public void Render(WorldRenderer wr)
{
sprite.DrawAt(wr.ScreenPxPosition(pos) - (0.5f*scale*sprite.size).ToInt2(), palette, scale);
}
public void RenderDebugGeometry(WorldRenderer wr)
{
var offset = wr.ScreenPxPosition(pos) - 0.5f*scale*sprite.size + sprite.offset;
Game.Renderer.WorldLineRenderer.DrawRect(offset, offset + sprite.size, Color.Red);
}
}
}

View File

@@ -26,20 +26,16 @@ namespace OpenRA.Graphics
internal static int SheetSize;
internal static int TempBufferSize;
internal static int TempBufferCount;
internal IShader WorldSpriteShader { get; private set; }
internal IShader WorldLineShader { get; private set; }
internal IShader LineShader { get; private set; }
internal IShader RgbaSpriteShader { get; private set; }
internal IShader SpriteShader { get; private set; }
public SpriteRenderer WorldSpriteRenderer { get; private set; }
public SpriteRenderer WorldRgbaSpriteRenderer { get; private set; }
public QuadRenderer WorldQuadRenderer { get; private set; }
public LineRenderer WorldLineRenderer { get; private set; }
public VoxelRenderer WorldVoxelRenderer { get; private set; }
public LineRenderer LineRenderer { get; private set; }
public SpriteRenderer RgbaSpriteRenderer { get; private set; }
public SpriteRenderer SpriteRenderer { get; private set; }
public ITexture PaletteTexture;
Queue<IVertexBuffer<Vertex>> tempBuffers = new Queue<IVertexBuffer<Vertex>>();
public Dictionary<string, SpriteFont> Fonts;
@@ -50,20 +46,17 @@ namespace OpenRA.Graphics
TempBufferCount = Game.Settings.Graphics.NumTempBuffers;
SheetSize = Game.Settings.Graphics.SheetSize;
WorldSpriteShader = device.CreateShader("world-shp");
WorldLineShader = device.CreateShader("world-line");
LineShader = device.CreateShader("chrome-line");
RgbaSpriteShader = device.CreateShader("chrome-rgba");
SpriteShader = device.CreateShader("chrome-shp");
WorldSpriteRenderer = new SpriteRenderer(this, device.CreateShader("shp"));
WorldRgbaSpriteRenderer = new SpriteRenderer(this, device.CreateShader("rgba"));
WorldLineRenderer = new LineRenderer(this, device.CreateShader("line"));
WorldVoxelRenderer = new VoxelRenderer(this, device.CreateShader("vxl"));
LineRenderer = new LineRenderer(this, device.CreateShader("line"));
WorldQuadRenderer = new QuadRenderer(this, device.CreateShader("line"));
RgbaSpriteRenderer = new SpriteRenderer(this, device.CreateShader("rgba"));
SpriteRenderer = new SpriteRenderer(this, device.CreateShader("shp"));
WorldSpriteRenderer = new SpriteRenderer( this, WorldSpriteShader );
WorldLineRenderer = new LineRenderer(this, WorldLineShader);
LineRenderer = new LineRenderer(this, LineShader);
RgbaSpriteRenderer = new SpriteRenderer( this, RgbaSpriteShader );
SpriteRenderer = new SpriteRenderer( this, SpriteShader );
for( int i = 0 ; i < TempBufferCount ; i++ )
tempBuffers.Enqueue( device.CreateVertexBuffer( TempBufferSize ) );
for (int i = 0; i < TempBufferCount; i++)
tempBuffers.Enqueue(device.CreateVertexBuffer(TempBufferSize));
}
public void InitializeFonts(Manifest m)
@@ -76,28 +69,33 @@ namespace OpenRA.Graphics
public void BeginFrame(float2 scroll, float zoom)
{
device.Clear();
WorldLineRenderer.LineWidth = zoom;
float2 r1 = new float2(2f/Resolution.Width, -2f/Resolution.Height);
float2 r2 = new float2(-1, 1);
var zr1 = zoom*r1;
SetShaderParams( WorldSpriteShader, zr1, r2, scroll );
SetShaderParams( WorldLineShader, zr1, r2, scroll );
SetShaderParams( LineShader, r1, r2, scroll );
SetShaderParams( RgbaSpriteShader, r1, r2, scroll );
SetShaderParams( SpriteShader, r1, r2, scroll );
WorldSpriteRenderer.SetViewportParams(Resolution, zoom, scroll);
WorldRgbaSpriteRenderer.SetViewportParams(Resolution, zoom, scroll);
SpriteRenderer.SetViewportParams(Resolution, 1f, float2.Zero);
RgbaSpriteRenderer.SetViewportParams(Resolution, 1f, float2.Zero);
WorldLineRenderer.SetViewportParams(Resolution, zoom, scroll);
WorldQuadRenderer.SetViewportParams(Resolution, zoom, scroll);
LineRenderer.SetViewportParams(Resolution, 1f, float2.Zero);
WorldVoxelRenderer.SetViewportParams(Resolution, zoom, scroll);
}
void SetShaderParams( IShader s, float2 r1, float2 r2, float2 scroll )
ITexture currentPaletteTexture;
public void SetPalette(HardwarePalette palette)
{
s.SetValue( "Palette", PaletteTexture );
s.SetValue( "Scroll", (int) scroll.X, (int) scroll.Y );
s.SetValue( "r1", r1.X, r1.Y );
s.SetValue( "r2", r2.X, r2.Y );
if (palette.Texture == currentPaletteTexture)
return;
Flush();
currentPaletteTexture = palette.Texture;
RgbaSpriteRenderer.SetPalette(currentPaletteTexture);
SpriteRenderer.SetPalette(currentPaletteTexture);
WorldSpriteRenderer.SetPalette(currentPaletteTexture);
WorldRgbaSpriteRenderer.SetPalette(currentPaletteTexture);
WorldVoxelRenderer.SetPalette(currentPaletteTexture);
}
public void EndFrame( IInputHandler inputHandler )
public void EndFrame(IInputHandler inputHandler)
{
Flush();
device.PumpInput(inputHandler);
@@ -131,14 +129,17 @@ namespace OpenRA.Graphics
// which makes the window non-interactive in Windowed/Pseudofullscreen mode.
static Screen FixOSX() { return Screen.PrimaryScreen; }
internal static void Initialize( WindowMode windowMode )
internal static void Initialize(WindowMode windowMode)
{
if (Platform.CurrentPlatform == PlatformType.OSX)
FixOSX();
var resolution = GetResolution( windowMode );
var rendererPath = Path.GetFullPath( "OpenRA.Renderer.{0}.dll".F(Game.Settings.Graphics.Renderer) );
device = CreateDevice( Assembly.LoadFile( rendererPath ), resolution.Width, resolution.Height, windowMode );
var resolution = GetResolution(windowMode);
string renderer = Game.Settings.Server.Dedicated ? "Null" : Game.Settings.Graphics.Renderer;
var rendererPath = Path.GetFullPath("OpenRA.Renderer.{0}.dll".F(renderer));
device = CreateDevice(Assembly.LoadFile(rendererPath), resolution.Width, resolution.Height, windowMode);
}
static Size GetResolution(WindowMode windowmode)
@@ -149,12 +150,12 @@ namespace OpenRA.Graphics
return new Size(size.X, size.Y);
}
static IGraphicsDevice CreateDevice( Assembly rendererDll, int width, int height, WindowMode window )
static IGraphicsDevice CreateDevice(Assembly rendererDll, int width, int height, WindowMode window)
{
foreach( RendererAttribute r in rendererDll.GetCustomAttributes( typeof( RendererAttribute ), false ) )
foreach (RendererAttribute r in rendererDll.GetCustomAttributes(typeof(RendererAttribute), false))
{
var factory = (IDeviceFactory) r.Type.GetConstructor( Type.EmptyTypes ).Invoke( null );
return factory.Create( new Size( width, height ), window );
var factory = (IDeviceFactory)r.Type.GetConstructor(Type.EmptyTypes).Invoke(null);
return factory.Create(new Size(width, height), window);
}
throw new InvalidOperationException("Renderer DLL is missing RendererAttribute to tell us what type to use!");
@@ -163,7 +164,7 @@ namespace OpenRA.Graphics
internal IVertexBuffer<Vertex> GetTempVertexBuffer()
{
var ret = tempBuffers.Dequeue();
tempBuffers.Enqueue( ret );
tempBuffers.Enqueue(ret);
return ret;
}
@@ -175,8 +176,8 @@ namespace OpenRA.Graphics
get { return currentBatchRenderer; }
set
{
if( currentBatchRenderer == value ) return;
if( currentBatchRenderer != null )
if (currentBatchRenderer == value) return;
if (currentBatchRenderer != null)
currentBatchRenderer.Flush();
currentBatchRenderer = value;
}
@@ -185,7 +186,7 @@ namespace OpenRA.Graphics
public void EnableScissor(int left, int top, int width, int height)
{
Flush();
Device.EnableScissor( left, top, width, height );
Device.EnableScissor(left, top, width, height);
}
public void DisableScissor()
@@ -193,5 +194,17 @@ namespace OpenRA.Graphics
Flush();
Device.DisableScissor();
}
public void EnableDepthBuffer()
{
Flush();
Device.EnableDepthBuffer();
}
public void DisableDepthBuffer()
{
Flush();
Device.DisableDepthBuffer();
}
}
}

View File

@@ -8,34 +8,45 @@
*/
#endregion
using System;
using System.Xml;
using OpenRA.FileFormats;
using System.Collections.Generic;
using System.Linq;
using OpenRA.FileFormats;
namespace OpenRA.Graphics
{
public class Sequence
{
readonly Sprite[] sprites;
readonly int start, length, facings, tick;
readonly int start, length, stride, facings, tick;
readonly bool reverseFacings, transpose;
public readonly string Name;
public int Start { get { return start; } }
public int End { get { return start + length; } }
public int Length { get { return length; } }
public int Stride { get { return stride; } }
public int Facings { get { return facings; } }
public int Tick { get { return tick; } }
string srcOverride;
public Sequence(string unit, string name, MiniYaml info)
{
srcOverride = info.Value;
var srcOverride = info.Value;
Name = name;
var d = info.NodesDict;
var offset = float2.Zero;
sprites = Game.modData.SpriteLoader.LoadAllSprites(string.IsNullOrEmpty(srcOverride) ? unit : srcOverride );
start = int.Parse(d["Start"].Value);
if (d.ContainsKey("Offset"))
offset = FieldLoader.GetValue<float2>("Offset", d["Offset"].Value);
// Apply offset to each sprite in the sequence
// Different sequences may apply different offsets to the same frame
sprites = Game.modData.SpriteLoader.LoadAllSprites(srcOverride ?? unit).Select(
s => new Sprite(s.sheet, s.bounds, s.offset + offset, s.channel)).ToArray();
if (!d.ContainsKey("Length"))
length = 1;
else if (d["Length"].Value == "*")
@@ -43,47 +54,56 @@ namespace OpenRA.Graphics
else
length = int.Parse(d["Length"].Value);
if (d.ContainsKey("Stride"))
stride = int.Parse(d["Stride"].Value);
else
stride = length;
if(d.ContainsKey("Facings"))
facings = int.Parse(d["Facings"].Value);
if (d.ContainsKey("Facings"))
{
var f = int.Parse(d["Facings"].Value);
facings = Math.Abs(f);
reverseFacings = f < 0;
}
else
facings = 1;
if(d.ContainsKey("Tick"))
if (d.ContainsKey("Tick"))
tick = int.Parse(d["Tick"].Value);
else
tick = 40;
if (d.ContainsKey("Transpose"))
transpose = bool.Parse(d["Transpose"].Value);
if (length > stride)
throw new InvalidOperationException(
"{0}: Sequence {1}.{2}: Length must be <= stride"
.F(info.Nodes[0].Location, unit, name));
if (start < 0 || start + facings * stride > sprites.Length)
throw new InvalidOperationException(
"{6}: Sequence {0}.{1} uses frames [{2}..{3}] of SHP `{4}`, but only 0..{5} actually exist"
.F(unit, name, start, start + facings * stride - 1, srcOverride ?? unit, sprites.Length - 1,
info.Nodes[0].Location));
}
public MiniYaml Save()
public Sprite GetSprite(int frame)
{
var root = new List<MiniYamlNode>();
root.Add(new MiniYamlNode("Start", start.ToString()));
if (length > 1 && (start != 0 || length != sprites.Length - start))
root.Add(new MiniYamlNode("Length", length.ToString()));
else if (length > 1 && length == sprites.Length - start)
root.Add(new MiniYamlNode("Length", "*"));
if (facings > 1)
root.Add(new MiniYamlNode("Facings", facings.ToString()));
if (tick != 40)
root.Add(new MiniYamlNode("Tick", tick.ToString()));
return new MiniYaml(srcOverride, root);
}
public Sprite GetSprite( int frame )
{
return GetSprite( frame, 0 );
return GetSprite(frame, 0);
}
public Sprite GetSprite(int frame, int facing)
{
var f = Traits.Util.QuantizeFacing( facing, facings );
return sprites[ (f * length) + ( frame % length ) + start ];
var f = Traits.Util.QuantizeFacing(facing, facings);
if (reverseFacings)
f = (facings - f) % facings;
int i = transpose ? (frame % length) * facings + f :
(f * stride) + (frame % length);
return sprites[start + i];
}
}
}

View File

@@ -40,7 +40,10 @@ namespace OpenRA.Graphics
var seq = sequences.NodesDict.ToDictionary(x => x.Key, x => new Sequence(unit,x.Key,x.Value));
units.Add(unit, seq);
}
catch (FileNotFoundException) {} // Do nothing; we can crash later if we actually wanted art
catch (FileNotFoundException)
{
// Do nothing; we can crash later if we actually wanted art
}
}
public static Sequence GetSequence(string unitName, string sequenceName)
@@ -53,7 +56,7 @@ namespace OpenRA.Graphics
"Unit `{0}` does not have a sequence `{1}`".F(unitName, sequenceName));
else
throw new InvalidOperationException(
"Unit `{0}` does not have any sequences defined.".F(unitName));
"Unit `{0}` does not have all sequences defined.".F(unitName));
}
}
@@ -61,7 +64,7 @@ namespace OpenRA.Graphics
{
if (!units.ContainsKey(unit))
throw new InvalidOperationException(
"Unit `{0}` does not have any sequences defined.".F(unit));
"Unit `{0}` does not have sequence `{1}` defined.".F(unit, seq));
return units[unit].ContainsKey(seq);
}

View File

@@ -8,7 +8,9 @@
*/
#endregion
using System;
using System.Drawing;
using System.Drawing.Imaging;
using OpenRA.FileFormats;
using OpenRA.FileFormats.Graphics;
@@ -16,21 +18,52 @@ namespace OpenRA.Graphics
{
public class Sheet
{
Bitmap bitmap;
ITexture texture;
bool dirty;
byte[] data;
public readonly Size Size;
public byte[] Data { get { return data ?? texture.GetData(); } }
public Sheet(Size size)
{
Size = size;
data = new byte[4*Size.Width*Size.Height];
}
public Sheet(ITexture texture)
{
this.texture = texture;
Size = texture.Size;
}
public Sheet(string filename)
{
bitmap = (Bitmap)Image.FromStream(FileSystem.Open(filename));
var bitmap = (Bitmap)Image.FromStream(FileSystem.Open(filename));
Size = bitmap.Size;
data = new byte[4*Size.Width*Size.Height];
var b = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe
{
int* c = (int*)b.Scan0;
for (var x = 0; x < Size.Width; x++)
for (var y = 0; y < Size.Height; y++)
{
var i = 4*Size.Width*y + 4*x;
// Convert argb to bgra
var argb = *(c + (y * b.Stride >> 2) + x);
data[i++] = (byte)(argb >> 0);
data[i++] = (byte)(argb >> 8);
data[i++] = (byte)(argb >> 16);
data[i++] = (byte)(argb >> 24);
}
}
bitmap.UnlockBits(b);
}
public ITexture Texture
@@ -45,23 +78,69 @@ namespace OpenRA.Graphics
if (dirty)
{
if (data != null)
{
texture.SetData(data, Size.Width, Size.Height);
dirty = false;
}
else if (bitmap != null)
{
texture.SetData(bitmap);
dirty = false;
}
texture.SetData(data, Size.Width, Size.Height);
dirty = false;
}
return texture;
}
}
public byte[] Data { get { if (data == null) data = new byte[4 * Size.Width * Size.Height]; return data; } }
public void MakeDirty() { dirty = true; }
public Bitmap AsBitmap()
{
var d = Data;
var b = new Bitmap(Size.Width, Size.Height);
var output = b.LockBits(new Rectangle(0, 0, Size.Width, Size.Height),
ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
unsafe
{
int* c = (int*)output.Scan0;
for (var x = 0; x < Size.Width; x++)
for (var y = 0; y < Size.Height; y++)
{
var i = 4*Size.Width*y + 4*x;
// Convert bgra to argb
var argb = (d[i+3] << 24) | (d[i+2] << 16) | (d[i+1] << 8) | d[i];
*(c + (y * output.Stride >> 2) + x) = argb;
}
}
b.UnlockBits(output);
return b;
}
public Bitmap AsBitmap(TextureChannel channel, Palette pal)
{
var d = Data;
var b = new Bitmap(Size.Width, Size.Height);
var output = b.LockBits(new Rectangle(0, 0, Size.Width, Size.Height),
ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
unsafe
{
int* c = (int*)output.Scan0;
for (var x = 0; x < Size.Width; x++)
for (var y = 0; y < Size.Height; y++)
{
var index = d[4*Size.Width*y + 4*x + (int)channel];
*(c + (y * output.Stride >> 2) + x) = pal.GetColor(index).ToArgb();
}
}
b.UnlockBits(output);
return b;
}
public void CommitData()
{
if (data == null)
throw new InvalidOperationException("Texture-wrappers are read-only");
dirty = true;
}
}
}

View File

@@ -8,68 +8,78 @@
*/
#endregion
using System;
using System.Drawing;
namespace OpenRA.Graphics
{
public class SheetOverflowException : Exception
{
public SheetOverflowException(string message)
: base(message) {}
}
public enum SheetType
{
Indexed = 1,
DualIndexed = 2,
BGRA = 4,
}
public class SheetBuilder
{
internal SheetBuilder(TextureChannel ch)
Sheet current;
TextureChannel channel;
SheetType type;
int rowHeight = 0;
Point p;
Func<Sheet> allocateSheet;
public static Sheet AllocateSheet()
{
current = null;
rowHeight = 0;
channel = null;
initialChannel = ch;
return new Sheet(new Size(Renderer.SheetSize, Renderer.SheetSize));;
}
internal SheetBuilder(SheetType t)
: this(t, AllocateSheet) {}
internal SheetBuilder(SheetType t, Func<Sheet> allocateSheet)
{
channel = TextureChannel.Red;
type = t;
current = allocateSheet();
this.allocateSheet = allocateSheet;
}
public Sprite Add(byte[] src, Size size)
{
Sprite rect = Allocate(size);
var rect = Allocate(size);
Util.FastCopyIntoChannel(rect, src);
current.CommitData();
return rect;
}
public Sprite Add(Size size, byte paletteIndex)
{
byte[] data = new byte[size.Width * size.Height];
for (int i = 0; i < data.Length; i++)
var data = new byte[size.Width * size.Height];
for (var i = 0; i < data.Length; i++)
data[i] = paletteIndex;
return Add(data, size);
}
Sheet NewSheet() { return new Sheet(new Size( Renderer.SheetSize, Renderer.SheetSize ) ); }
Sheet current = null;
int rowHeight = 0;
Point p;
TextureChannel? channel = null;
TextureChannel initialChannel;
TextureChannel? NextChannel(TextureChannel? t)
TextureChannel? NextChannel(TextureChannel t)
{
if (t == null)
return initialChannel;
var nextChannel = (int)t + (int)type;
if (nextChannel > (int)TextureChannel.Alpha)
return null;
switch (t.Value)
{
case TextureChannel.Red: return TextureChannel.Green;
case TextureChannel.Green: return TextureChannel.Blue;
case TextureChannel.Blue: return TextureChannel.Alpha;
case TextureChannel.Alpha: return null;
default: return null;
}
return (TextureChannel)nextChannel;
}
public Sprite Allocate(Size imageSize)
public Sprite Allocate(Size imageSize) { return Allocate(imageSize, float2.Zero); }
public Sprite Allocate(Size imageSize, float2 spriteOffset)
{
if (current == null)
{
current = NewSheet();
channel = NextChannel(null);
}
if (imageSize.Width + p.X > current.Size.Width)
{
p = new Point(0, p.Y + rowHeight);
@@ -81,22 +91,25 @@ namespace OpenRA.Graphics
if (p.Y + imageSize.Height > current.Size.Height)
{
if (null == (channel = NextChannel(channel)))
var next = NextChannel(channel);
if (next == null)
{
current = NewSheet();
channel = NextChannel(channel);
current = allocateSheet();
channel = TextureChannel.Red;
}
else
channel = next.Value;
rowHeight = imageSize.Height;
p = new Point(0,0);
}
Sprite rect = new Sprite(current, new Rectangle(p, imageSize), channel.Value);
current.MakeDirty();
var rect = new Sprite(current, new Rectangle(p, imageSize), spriteOffset, channel);
p.X += imageSize.Width;
return rect;
}
public Sheet Current { get { return current; } }
}
}

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