Compare commits

...

2160 Commits

Author SHA1 Message Date
Matthias Mailänder
1e2bccbc59 Merge pull request #3693 from ScottNZ/crashform
Add crash dialog
2013-08-18 00:11:02 -07:00
Matthias Mailänder
72141aa916 Merge pull request #3676 from Mailaender/native-r8s
Completely removed all conversion steps for Dune 2000
2013-08-18 00:03:44 -07:00
Matthias Mailänder
0466cac3ab I hereby declare Dune 2000 out of "beta"
still some things that need to be done, but already looking good
2013-08-18 07:23:51 +02:00
ScottNZ
7f67b567f9 Add Fatal Error dialog 2013-08-18 14:58:07 +12:00
Matthias Mailänder
bf521518af cleanup the rubble 2013-08-17 23:56:12 +02:00
Matthias Mailänder
009f6a3f70 bring back turrets and vehicle repairing 2013-08-17 23:47:14 +02:00
Matthias Mailänder
34ec588392 disallow conyard → mcv
because it looks bad
2013-08-17 23:47:14 +02:00
Matthias Mailänder
1c04c6608f don't render the idle overlay during selling 2013-08-17 23:47:14 +02:00
Matthias Mailänder
018ceb8d82 display where duplicate keys in MiniYaml are found 2013-08-17 23:47:13 +02:00
Matthias Mailänder
8c6074a081 WithCrumbleOverlay for Dune 2000 buildings 2013-08-17 23:47:09 +02:00
Paul Chote
32c3563a04 adjust the build palette origins to icon width 2013-08-17 23:31:25 +02:00
Matthias Mailänder
bad57b6ab7 use DATA.R8 in the colorpicker 2013-08-17 23:31:25 +02:00
Matthias Mailänder
eabe16b1ff remove 2 low details maps 2013-08-17 23:31:24 +02:00
Matthias Mailänder
72d2ebd3a8 read BLOX*.R8 tilesets directly without conversions 2013-08-17 23:31:24 +02:00
Matthias Mailänder
cb2dd333a7 read bibs from R8 2013-08-17 23:31:24 +02:00
Matthias Mailänder
0a84ddc8fb fix d2k cursors
- center by default (also works better for ra/cnc/ts)
2013-08-17 23:31:24 +02:00
Matthias Mailänder
40438e7fa6 nuke palette effect does not seem to like additive blending 2013-08-17 23:31:24 +02:00
Matthias Mailänder
c551cfca0f welding for the light factories 2013-08-17 23:31:24 +02:00
Matthias Mailänder
0dd73a1289 welding animations for the corrino heavy factory 2013-08-17 23:31:24 +02:00
Matthias Mailänder
f480679ab1 add welding animations to the high tech factories 2013-08-17 23:31:24 +02:00
Matthias Mailänder
1a9c762115 add location in sequence yaml to FormatExceptions 2013-08-17 23:31:24 +02:00
Matthias Mailänder
3457255fa9 I think every instance of HackyAI needs those definitions. 2013-08-17 23:31:24 +02:00
Matthias Mailänder
67c1eaf919 animate the repair button using Frames: 2013-08-17 23:31:24 +02:00
Matthias Mailänder
3db98b6554 welding in the heavy weapon factories
overlay + alpha blending = awesome
2013-08-17 23:31:24 +02:00
Matthias Mailänder
8a1e825946 added Ix Research lights as overlays 2013-08-17 23:31:23 +02:00
Matthias Mailänder
d4364694ab spinning radar dishes 2013-08-17 23:31:23 +02:00
Matthias Mailänder
c71e081afc added wind trap zaps with overlays 2013-08-17 23:31:23 +02:00
Matthias Mailänder
51be8ef6bd repair pad animations are not yet supported for overlays 2013-08-17 23:31:23 +02:00
Matthias Mailänder
93622ebeb2 use the cool new additive blend mode for Dune 2000 explosions 2013-08-17 23:31:23 +02:00
Matthias Mailänder
9950706cb1 cleanup weapon yamls
- removed Red Alert sounds
- WaterExplosion? Arrakis is a desert planet...
- remove unused weapons/defaults and merge explosions
- give bazooka smaller sized explosions
- bigger explosions for orni strikes
2013-08-17 23:31:23 +02:00
Matthias Mailänder
c6e9b00c8c removed legacy 90mm SHP trails
they are too big
2013-08-17 23:31:23 +02:00
Matthias Mailänder
d1f3ad81a6 remove unused allyrepair
wrong palette anyway
2013-08-17 23:31:23 +02:00
Matthias Mailänder
b014a3d09c remove utility dependency on d2k DLL
partly fixes #3298
2013-08-17 23:31:23 +02:00
Matthias Mailänder
6e26173f0f remove foreign dependencies from d2k mod entirely 2013-08-17 23:31:23 +02:00
Matthias Mailänder
3025e3cf62 remove dependency on mouse.shp conversions 2013-08-17 23:31:23 +02:00
Matthias Mailänder
e28bbf1f90 load DATA.R8 per default and not mouse.shp 2013-08-17 23:31:23 +02:00
Matthias Mailänder
a831b8984a port map actors to DATA.R8 sequences 2013-08-17 23:31:22 +02:00
Matthias Mailänder
efb55d4cb9 read support power icons from sequences
so that d2k can grab them from DATA.R8
2013-08-17 23:31:22 +02:00
Matthias Mailänder
376a6c7a5d read the production icons from sequences
this allows d2k to read them from DATA.R8 without trouble
2013-08-17 23:31:22 +02:00
Matthias Mailänder
b73ca27a8f move vehicles to load sprites from DATA.R8 directly 2013-08-17 23:31:22 +02:00
Matthias Mailänder
8718a9cb44 load projectiles, muzzles and explosions from DATA.R8 2013-08-17 23:31:22 +02:00
Matthias Mailänder
d0d2c7a49b load Dune 2000 aircraft directly from DATA.R8 2013-08-17 23:31:22 +02:00
Matthias Mailänder
bed3fc2498 replace the infantry sequences with transposed DATA.R8 frames 2013-08-17 23:31:22 +02:00
Matthias Mailänder
341522232e migrate all other buildings to DATA.R8 sequences
4th conyard might be for the Corrino faction
TODO: active animations are yet unused overlays

no need to render build-top for refineries
2013-08-17 23:31:22 +02:00
Matthias Mailänder
03eaf76cd8 moved the towers to DATA.R8 sequences 2013-08-17 23:31:22 +02:00
Matthias Mailänder
a7504b5dd9 load Dune 2000 walls directly from DATA.R8 2013-08-17 23:31:22 +02:00
Matthias Mailänder
0dbee935e7 load the Dune 2000 mouse curser from the native MOUSE.R8 format 2013-08-17 23:31:21 +02:00
Matthias Mailänder
81f577dcbe Merge pull request #3690 from reaperrr/TS-fixes
Adds combined shroudfog palette to TS mod
2013-08-17 08:08:32 -07:00
reaperrr
d5203f703f Adds combined shroudfog palette to TS mod.
The mod crashes without it if FOW is disabled.
2013-08-17 17:04:28 +02:00
Matthias Mailänder
e77286c0a7 Merge pull request #3686 from pchote/portable-install
Support support dir inside the game root for portable installs.
2013-08-17 02:45:49 -07:00
Matthias Mailänder
d565413e4d Merge pull request #3687 from pchote/mapoptions
Lobby map option improvements.
2013-08-17 02:42:23 -07:00
Paul Chote
bfd8739e2b Tweak layout again.
C&C doesn't offer fragile alliances.
2013-08-17 21:37:48 +12:00
Matthias Mailänder
924e1e0061 Merge pull request #3688 from pchote/gps-fog
Add GPSDot to RA structures.
2013-08-17 02:17:59 -07:00
Paul Chote
9536de03e7 Merge pull request #3677 from ScottNZ/autotarget
Fix the autotarget bug that made turrets uncontrollable in combat
2013-08-17 01:22:35 -07:00
Paul Chote
7b42888064 Disable crates option for missions and mini games. 2013-08-17 20:16:01 +12:00
Paul Chote
2a7318b69f Add GPSDot for RA structures. Fixes #3631. 2013-08-17 20:11:09 +12:00
Matthias Mailänder
503fdc463f Merge pull request #3684 from pchote/tileset-fixup
TileSet Refactoring
2013-08-17 01:08:42 -07:00
Paul Chote
5cb79283be Use uppercase extensions to support case-sensitive filesystems. 2013-08-17 20:01:24 +12:00
ScottNZ
115a447b2f Fix the autotarget bug that made turrets uncontrollable in combat 2013-08-17 17:53:50 +12:00
Paul Chote
fbc02957a2 Allow a local support dir inside the game root. Fixes #3673. 2013-08-17 16:37:24 +12:00
Paul Chote
271ce5275c Add starting cash option. 2013-08-17 14:43:52 +12:00
Paul Chote
3fd64dfe52 Remove dead InitialCash setting from PlayerReference. 2013-08-17 14:42:43 +12:00
Paul Chote
ce41eb2361 Add "Build off Ally ConYards" option. Fixes #2464. 2013-08-17 14:42:40 +12:00
Paul Chote
059c88ca1b Reorganize map options panel. 2013-08-17 14:41:44 +12:00
Paul Chote
d76a8c2950 Allow maps to override options. Closes #3646.
Also set sensible defaults for most of the maps and mini games.
2013-08-17 14:41:40 +12:00
Paul Chote
ca90b2e6f1 Add FieldLoader support for Nullable<T>. 2013-08-17 10:03:57 +12:00
Paul Chote
608ca31f6d Support .r8 tileset artwork. 2013-08-15 19:28:55 +12:00
Paul Chote
b6a033eef5 Remove obsolete IRenderAsTerrain.
This removes the technical limitation preventing
FrozenUnderFog on bridges.
2013-08-15 18:12:49 +12:00
Paul Chote
7278739e45 Allow tilesets to specify their sheet size.
Decreased the default size from 4096 to 512.
2013-08-15 18:05:34 +12:00
Paul Chote
f83ad88d2a Use Manifest.TileSize everywhere. 2013-08-15 17:43:12 +12:00
Paul Chote
179fbc06ea Merge pull request #3678 from Mailaender/d2k-early-merge
Non-controversial early merge cleanups from the native-r8s branch
2013-08-14 14:29:56 -07:00
Matthias Mailänder
2bd655b3a7 Merge pull request #3683 from pchote/fancy-explosion-support
Add engine support for D2K explosions
2013-08-14 08:22:13 -07:00
Paul Chote
f6d0ea4b0f Remove TileSet rendering code. 2013-08-14 23:08:25 +12:00
Paul Chote
18759e01cf Use TileSetRenderer in the editor. 2013-08-14 23:08:25 +12:00
Paul Chote
70580b27b9 Use TileSetRenderer for utility --tmp-png. 2013-08-14 23:08:24 +12:00
Paul Chote
5bea8fd4cc Introduce TileSetRenderer for editor and utility. 2013-08-14 23:08:24 +12:00
Paul Chote
387ac04d9f Split tileset artwork loading out of TileSet.
This simplifies terrain loading and allows for
non-square tiles in game.

The editor still relies on the old code for now.
2013-08-14 23:08:17 +12:00
Matthias Mailänder
e1f4a9d5b5 adjust the d2k timer position a little 2013-08-14 07:57:23 +02:00
Matthias Mailänder
b4146dea86 adjust the d2k production palette icon width to 60 again 2013-08-14 07:57:23 +02:00
Matthias Mailänder
0393f75729 remove failed experiment with fundaments 2013-08-14 07:57:23 +02:00
Matthias Mailänder
25152a31db move Tooltip into it's own CS file 2013-08-14 07:57:23 +02:00
Matthias Mailänder
c07dc9d120 remove sandworm test that did not work out 2013-08-14 07:57:23 +02:00
Matthias Mailänder
f7abeddaad give the d2k tower rockets an angle
as the turrets points upwards
2013-08-14 07:57:23 +02:00
Matthias Mailänder
265106d760 remove unused artwork 2013-08-14 07:57:23 +02:00
Paul Chote
a1dd7cff7b Support additive blending for D2K explosions. 2013-08-14 17:31:02 +12:00
Paul Chote
2b6b212d02 Merge pull request #3681 from Mailaender/overlays
Added WithIdleOverlay Render Trait
2013-08-13 15:34:06 -07:00
Matthias Mailänder
d3edaaae4d replace WithSpinner → WithIdleOverlay 2013-08-14 00:05:24 +02:00
Matthias Mailänder
94c3090528 require body orientation for idle overlays
and don't wait for BuildingComplete to generalize for units
2013-08-13 23:51:31 +02:00
Matthias Mailänder
aaf1904257 fix Could not load type 'System.Action'
by changing .NET target framework from default 4.0 to 3.5
2013-08-13 18:50:36 +02:00
Matthias Mailänder
c0be16cde3 don't display the overlay before the building is completed 2013-08-13 17:00:59 +02:00
Matthias Mailänder
004d3669c2 complete the spotlight tower sequences 2013-08-13 16:45:09 +02:00
Matthias Mailänder
9dbbd32686 set up the GDI helipad better with overlays 2013-08-13 16:40:56 +02:00
Matthias Mailänder
6cfca021bc lights and flags for the GDI barracks 2013-08-13 16:16:37 +02:00
Matthias Mailänder
d7b7c18489 lights and plugs for the power plant 2013-08-13 16:16:18 +02:00
Matthias Mailänder
6b5747f017 light and fans animation for the construction yard 2013-08-13 16:15:59 +02:00
Matthias Mailänder
ec83c34281 developer cheats by default in Tiberian Sun
as long it is in development
2013-08-13 16:15:17 +02:00
Matthias Mailänder
cb4e4d7bd9 added idle render overlays for d2k and ts buildings 2013-08-13 16:14:13 +02:00
Matthias Mailänder
ef968a0caf Fixed Error: unterminated string parsing line at OpenRA.nsi:97 2013-08-12 13:38:37 +02:00
Matthias Mailänder
42d998a5ea Merge pull request #3675 from pchote/server-fix
Dedicated server crashfix
2013-08-12 04:21:12 -07:00
Matthias Mailänder
3fdf9ddbc9 Merge pull request #3648 from pchote/frozen-fog-rework
Rework frozen actors to support tooltips and orders
2013-08-12 04:19:21 -07:00
Matthias Mailänder
f975e7b414 Merge pull request #3674 from pchote/lobby-fix
Improve RA lobby dropdown group background.
2013-08-12 04:07:54 -07:00
Paul Chote
0a2455a0bb Merge pull request #3657 from Mailaender/sniper-versus
Made snipers unable to shoot anything else than infantry
2013-08-12 03:22:34 -07:00
Paul Chote
171c52b4a6 Merge pull request #3650 from Mailaender/hackyai-nre
Attempt to fix some rare exceptions in HackyAI
2013-08-12 03:01:11 -07:00
Paul Chote
aca9e9ec9b Merge pull request #3672 from reaperrr/cnc-offset-finetuning
Improved turret and muzzle offsets for buggy and jeep in CnC mod
2013-08-12 02:59:38 -07:00
Paul Chote
9a9494c01b Remove starting-units validation. Fixes #3641. 2013-08-12 21:53:16 +12:00
Paul Chote
4b51b0c205 Allow custom dropdown group background. Fixes #3584. 2013-08-12 21:48:39 +12:00
Paul Chote
1040d7f3ef Add no-sync check around TickRender. 2013-08-12 21:35:46 +12:00
Paul Chote
63eb1b8a03 [Sync] the AutoTargeted actor ID for desync hunting. 2013-08-12 21:34:20 +12:00
Paul Chote
587fac377e Make the non-support of frozen actor targeting in EnterOrderTargeter explicit. 2013-08-12 21:34:20 +12:00
Paul Chote
a88b5e98d7 Enable frozen order: Infiltrates. 2013-08-12 21:34:20 +12:00
Paul Chote
2aed55f5f6 Enable frozen order: EngineerRepair. 2013-08-12 21:34:19 +12:00
Paul Chote
ebd0c210d9 Enable frozen order: Captures. 2013-08-12 21:34:19 +12:00
Paul Chote
80870dcca8 Enable frozen order: DemoAttack. 2013-08-12 21:34:19 +12:00
Paul Chote
aab63e6f2d Enable frozen order: C4. 2013-08-12 21:34:19 +12:00
Paul Chote
f2ecea4731 Enable frozen order: LegacyCaptureActor. 2013-08-12 21:34:19 +12:00
Paul Chote
d27d5f449e Enable frozen order: DeliverSupplies. 2013-08-12 21:34:19 +12:00
Paul Chote
9c5b526a3d Enable frozen order: Attack. 2013-08-12 21:34:19 +12:00
Paul Chote
53287ba2c8 Add helper for resolving orders against frozen actors. 2013-08-12 21:34:18 +12:00
Paul Chote
3e605b1ee9 Add plumbing for issuing orders against frozen actors. 2013-08-12 21:34:18 +12:00
Paul Chote
40a9caddc7 Add FrozenActor target type. 2013-08-12 21:34:18 +12:00
Paul Chote
c0cb52a5ca Show tooltips for frozen actors. 2013-08-12 21:34:18 +12:00
Paul Chote
eef941fd42 Track per-player frozen actors. 2013-08-12 21:34:18 +12:00
reaperrr
08ea277891 Improved turret and muzzle offsets for buggy and jeep. 2013-08-11 14:46:18 +02:00
Paul Chote
c3bcca2ff7 Use selection priority when picking tooltip actor. 2013-08-11 22:23:53 +12:00
Paul Chote
0a9d920eb6 Allow world and (render-) player actors to render. 2013-08-11 22:23:52 +12:00
Paul Chote
e4d1c654ed Merge IOrderTargeter.CanTargetActor and CanTargetLocation. 2013-08-11 22:23:52 +12:00
Paul Chote
4f3c9aa0af Introduce Target.Type property. 2013-08-11 22:23:52 +12:00
Paul Chote
fa517b8787 Change WeaponInfo.EffectivenessAgainst to take ActorInfo. 2013-08-11 22:23:52 +12:00
Paul Chote
ff98fb0cdf Add ITargetableInfo interface for querying target types. 2013-08-11 22:23:52 +12:00
Paul Chote
6b1b8d9ed4 Add Order.ExtraData field. 2013-08-11 22:23:51 +12:00
Paul Chote
9ccf2014b0 Merge pull request #3662 from Mailaender/player-stats
Cleanup kill/death counts
2013-08-11 03:23:11 -07:00
Matthias Mailänder
bbff99d958 remove kill/death count in player/health 2013-08-11 12:21:33 +02:00
Matthias Mailänder
5dcf1c755c use the player statistics everywhere 2013-08-11 12:21:33 +02:00
Matthias Mailänder
c98dfd0439 don't count walls as building kills for player stats 2013-08-11 12:21:33 +02:00
Matthias Mailänder
d2e4c2904f fix broken team display in cnc objectives 2013-08-11 12:21:33 +02:00
Matthias Mailänder
771c32255c use advanced player statistics in cnc mod 2013-08-11 12:21:28 +02:00
Paul Chote
59d821b8ef Merge pull request #3647 from Mailaender/ip2geo
Show locations of client and servers using a local GeoIP database
2013-08-11 03:21:23 -07:00
Matthias Mailänder
119f9b9ff0 Merge pull request #3669 from dan9550/util-map-hash
Get the hash of map files using OpenRA.Utility
2013-08-11 02:17:18 -07:00
Matthias Mailänder
f4371f886c Merge pull request #3665 from pchote/frozen-fog-prereqs
Rework bibs (again).
2013-08-11 02:14:34 -07:00
Matthias Mailänder
c25fbc7d28 Merge pull request #3668 from pchote/more-polish
Polish fixes for muzzle flashes and cash ticks.
2013-08-11 00:48:27 -07:00
Paul Chote
0b1ce8097f Don't flash bibs when targeting buildings. 2013-08-11 16:39:18 +12:00
Dan9550
1b6d79888f Quick and esy way to get the hash of map files using OpenRA.Utility 2013-08-11 12:47:34 +10:00
Paul Chote
18ae6aed28 Hide CashTicks under fog. Fixes #3664. 2013-08-11 12:52:47 +12:00
Paul Chote
cc44139eb1 Fix z-offset for muzzle flashes. Fixes #3667. 2013-08-11 12:52:47 +12:00
Paul Chote
190ce0fc90 Fix z-ordering of FrozenActorProxy. 2013-08-11 12:30:25 +12:00
Paul Chote
69130fea95 Merge pull request #3663 from reaperrr/cnc-snow-color-fix
C&C mod snow brightness fix
2013-08-10 05:43:00 -07:00
Paul Chote
3b3e6edc90 Add IMove interface.
Fixes Rallypoints for aircraft.
2013-08-11 00:28:31 +12:00
Paul Chote
a6ee4daf58 Remove obsolete ITooltip.Stance. 2013-08-11 00:28:30 +12:00
Paul Chote
4754cbb768 Replace IOrderGenerator.RenderBeforeWorld with world-sorted .Render.
Range circles have been moved to RenderAfterWorld for now.
2013-08-11 00:25:54 +12:00
Paul Chote
b02fd0d002 Remove BibLayer and use sequences / RenderSprites instead. 2013-08-11 00:25:53 +12:00
Paul Chote
810a52af36 Remove BelowUnits from RA bibbed structures and crates. 2013-08-11 00:25:53 +12:00
Paul Chote
614d57ac08 Remove BelowUnits from D2K. 2013-08-11 00:25:52 +12:00
Paul Chote
7d1931cd80 Remove BelowUnits from C&C bibbed structures.
It interacts badly with the rewritten Bib trait.
2013-08-11 00:25:52 +12:00
reaperrr
b18e1aa8ca Increases contrast between main snow color and darker patches of snow, additionally gives the darker patches a slightly more blueish color. 2013-08-10 13:19:56 +02:00
Paul Chote
4a7a50dac9 Fix parsing of negative WRange. 2013-08-10 22:25:05 +12:00
Paul Chote
5e03b503be Parse sequence ZOffsets as a WRange. 2013-08-10 22:25:05 +12:00
Paul Chote
be7fc57cdd Introduce IRenderable.IsDecoration and AsDecoration.
These are used to filter *Renderables that shouldn't
be copied for things like highlight or shadow.
2013-08-10 22:25:05 +12:00
Matthias Mailänder
2b99c8a4d9 Merge pull request #3661 from reaperrr/sound-fix
Minor sound fixes
2013-08-10 02:39:58 -07:00
reaperrr
751836ad68 ImpactSound for Longbow's HellfireAA.
In addition, I noticed a missing .aud extension and fixed that as well.
2013-08-10 11:23:26 +02:00
Paul Chote
8fcbe7bb9e Fix world visibility checks when shroud is disabled. 2013-08-10 20:15:05 +12:00
Matthias Mailänder
c034715f69 only colorize the LatencyDescription
not together with the prefix
2013-08-10 09:52:13 +02:00
Paul Chote
8271e5ed63 Merge pull request #3634 from Mailaender/style
StyleCop Cleanup
2013-08-09 19:19:03 -07:00
Paul Chote
53d098d96f Merge pull request #3652 from Mailaender/perf-info
Performance Graph Cleanup
2013-08-09 19:14:00 -07:00
Matthias Mailänder
9ea2f50634 Merge pull request #3656 from reaperrr/d2k-sequences
D2k sequences.yaml split
2013-08-09 13:09:19 -07:00
Matthias Mailänder
1279b23f62 check null because Nullable object must have a value
fixes #3642
2013-08-09 22:06:28 +02:00
Matthias Mailänder
af5321b51c made snipers unable to shoot anything else than infantry
fixes #3530 using a target type workaround
2013-08-09 22:03:19 +02:00
reaperrr
a57b43fb45 Splits D2K sequences.yaml into multiple files, organised the same way as cnc/ra mod. 2013-08-09 20:05:58 +02:00
reaperrr
69275d9e2a Renaming RA animations.yaml sequences file to misc.yaml for consistency. 2013-08-09 19:53:23 +02:00
reaperrr
cf725d3442 Splits cnc aircraft sequences into separate aircraft.yaml. 2013-08-09 19:49:41 +02:00
Paul Chote
6803414b22 Merge pull request #3651 from reaperrr/ra-explosions
RA mod Explosion & ImpactSound revamp
2013-08-08 23:08:38 -07:00
Matthias Mailänder
03a0640f65 merged RA/CncPerfDebugLogic
separate text and graph, fixes #3491
small repositions to fit with other widgets
2013-08-08 23:09:48 +02:00
reaperrr
f55ed62ebf ImpactSound overhaul.
Nearly all cannons and missiles now have ImpactSounds. Rule of thumb: kaboom12 for cannons (tanks, gun turret), kaboom15 for artillery weapons (cruiser, missile sub, artillery), kaboom25 for missiles.
Exceptions are the Flak Truck and Light Tank, due to their high rate of fire.
2013-08-08 22:43:48 +02:00
reaperrr
be2fd7b9df WaterImpactSound overhaul.
Nearly all ballistic or missile weapons now have a splash sound when hitting water.
2013-08-08 22:42:38 +02:00
reaperrr
f8a2290cb7 Changes explosion animations for artillery, cruiser and missile sub weapons from large_explosion to artillery_explosion. 2013-08-08 22:32:52 +02:00
reaperrr
d47912a58f Changes Explosion from med_explosion to either small_explosion_air or med_explosion_air for several weapons that are (mostly) anti-air, for more animation variety. 2013-08-08 22:28:53 +02:00
reaperrr
b56b0075e4 Adds explosion sequences for flak.shp and veh-hit1.shp, labeled small_explosion_air and med_explosion_air, respectively. 2013-08-08 22:24:29 +02:00
reaperrr
e80785b59b Adds water piff(s) animations to machine gun/pistol/rifle weapons. 2013-08-08 22:22:46 +02:00
Matthias Mailänder
3e5fcface2 remove useless StyleCop file added here by accident
closes #3615
2013-08-08 14:35:16 +02:00
Matthias Mailänder
2dbc4f4786 Stylecop clean Editor 2013-08-08 14:31:36 +02:00
Matthias Mailänder
685073fedd print Unknown Location instead of just N/A 2013-08-08 13:39:18 +02:00
Matthias Mailänder
51e4d6d4c5 Add location to Dune 2000 lobby tooltip 2013-08-08 13:39:18 +02:00
Matthias Mailänder
7f77e5a5f3 colorize the latency tooltip
so people get it faster
now that we display 4 lines of information
2013-08-08 13:39:18 +02:00
Matthias Mailänder
669a95479a cache the country lookup to avoid doing it every render tick 2013-08-08 13:39:18 +02:00
Matthias Mailänder
fb042056b0 get the server location from the IP
and show it in the game browser, closes #2555
2013-08-08 13:39:18 +02:00
Matthias Mailänder
9d40b430dc try to grab the external IP of localhost from the NAT router 2013-08-08 13:39:18 +02:00
Matthias Mailänder
feb7f80a39 display the client location in a lobby tooltip 2013-08-08 13:39:18 +02:00
Matthias Mailänder
781c680ad3 translate the IP to a country
using http://dev.maxmind.com/geoip/legacy/geolite/
code from https://github.com/maxmind/geoip-api-csharp2
2013-08-08 13:39:12 +02:00
Paul Chote
3ae173394b Merge pull request #3643 from reaperrr/cncmuzzles
CnC mod muzzles and offsets
2013-08-08 04:04:03 -07:00
Matthias Mailänder
00839cb77b Random is not Thirdparty anymore
but our own implementation
2013-08-08 09:35:01 +02:00
Matthias Mailänder
57f7f71c8d StyleCop clean MiniYaml 2013-08-07 15:52:30 +02:00
Matthias Mailänder
05f165357d StyleCop clean Map
move non-map specific functions to FileFormats
2013-08-07 15:52:29 +02:00
Matthias Mailänder
452342f289 StyleCop clean ModData 2013-08-07 15:52:29 +02:00
Matthias Mailänder
2653f95853 StyleCop clean OjbectCreator 2013-08-07 15:52:29 +02:00
Matthias Mailänder
32cbe4620f StyleCop clean IniFile 2013-08-07 15:52:29 +02:00
Matthias Mailänder
47044fc696 StyleCop clean Blast 2013-08-07 15:52:29 +02:00
Matthias Mailänder
6436ccd431 StyleCop clean AudLoader 2013-08-07 15:52:29 +02:00
Matthias Mailänder
0cfe7e2a06 StyleCop clean Exts 2013-08-07 15:52:29 +02:00
Matthias Mailänder
e6368b2b44 StyleCop clean Evaluator 2013-08-07 15:52:29 +02:00
Matthias Mailänder
5957627fb6 StyleCop clean FieldLoader
remove SA1510 for FileFormats
2013-08-07 15:52:29 +02:00
Matthias Mailänder
4603f0bbf6 StyleCop clean TilesetBuilder
adapt Makefile after TilesetBuilder file renamings

remove dead TilesetBuilder code
2013-08-07 15:52:22 +02:00
Matthias Mailänder
59b700fcde StyleCop clean renderer DLLs 2013-08-07 15:42:34 +02:00
Matthias Mailänder
d278bc84d1 StyleCop clean Cnc DLL 2013-08-07 15:42:34 +02:00
Matthias Mailänder
bcce9ea7f0 StyleCop clean RALint 2013-08-07 15:42:34 +02:00
Matthias Mailänder
c49ddefbe0 don't clobber the shadow index twice 2013-08-07 15:42:34 +02:00
Matthias Mailänder
c2d80d21f3 StyleCop clean Utility 2013-08-07 15:42:34 +02:00
Matthias Mailänder
040e8eccd9 StyleCop clean D2k Mod DLL 2013-08-07 15:42:34 +02:00
Matthias Mailänder
1cd3a97772 Tiberian Sun Loadscreen
we need at least one file to get the DLL built
2013-08-07 15:42:34 +02:00
Matthias Mailänder
79355bbb32 remove unused AssemblyInfos 2013-08-07 15:42:29 +02:00
Matthias Mailänder
7415b0ce23 StyleCop rules for Tiberian Sun 2013-08-07 13:50:23 +02:00
Matthias Mailänder
f02bfbf0c2 disable StyleCop rules SA1115 and SA1116
closes #3562
2013-08-07 13:50:23 +02:00
reaperrr
fb2e85e6d3 disable AGT muzzle. 2013-08-06 13:25:02 +02:00
reaperrr
2d45346c27 counter-clock flame. 2013-08-06 13:24:25 +02:00
Chris Forbes
56ae309b3b Merge pull request #3644 from reaperrr/orca-fix
Orca missile fix.
2013-08-05 14:03:47 -07:00
Chris Forbes
9848668fe7 Merge pull request #3645 from reaperrr/hind-larger-rotor
Larger rotor for Hind.
2013-08-05 14:03:29 -07:00
reaperrr
d815348230 Larger rotor for Hind.
The default lrotor looks too small for the mighty Hind, so I made a larger one.
2013-08-05 20:01:19 +02:00
reaperrr
791a77ab5d Orca missile fix.
Orca now alternates between missile pods instead of firing all missiles from right pod.
2013-08-05 19:50:48 +02:00
reaperrr
7cf94e4f1e Fix CnC mod LocalOffsets. 2013-08-05 19:34:06 +02:00
reaperrr
a1ac1973a7 Add muzzle flashes to all cannons and the Advanced Guard Tower (which had a muzzle in the original CnC, too). 2013-08-05 19:33:28 +02:00
reaperrr
ebfb9fed9b Fix Flame Tank flames (muzzle).
This wasn't fixable through offsets alone, I had to fix the flame shps. I accidentally used clock-wise ordering when renaming the flame anim frames, hence the "negative" facing.
2013-08-05 19:30:16 +02:00
Chris Forbes
a582efcca0 Merge pull request #3639 from reaperrr/muzzles
Offsets and muzzle flashes
2013-08-04 13:55:14 -07:00
reaperrr
6da236d47f Set/fix LocalOffsets for all units and structures with muzzle flashes in RA mod.
Offsets that haven't been touched were either forgotten or deemed good enough.
2013-08-04 18:33:09 +02:00
reaperrr
3dc73d286d Apply GTWR fix to RA defenses (pillboxes, flame turret) as well. 2013-08-04 18:29:27 +02:00
reaperrr
78b4f17baf Adds muzzle flash to all vehicles and ships with cannons.
Muzzle animation is a customized version of the original gunfire.shp. Not using all frames for light tank, flak truck and flak cannon is intentional.
2013-08-04 18:27:10 +02:00
Matthias Mailänder
f10e4a562e Merge pull request #3638 from wuschel/bleed
fixed RA map: ATHENA
2013-08-04 03:49:26 -07:00
wuschel
b3d1496ddb fixed RA map: ATHENA
removed Actor656: tran.husk1 (was burning down).
2013-08-04 12:42:14 +02:00
Matthias Mailänder
8bd8e896d9 Merge pull request #3637 from pchote/ripley-f7u12
Restore alt-f4 for windows users only.
2013-08-04 03:06:03 -07:00
Paul Chote
6fc2e11ad4 Restore Alt-f4 quit shortcut for Windows users. 2013-08-04 21:50:42 +12:00
Matthias Mailänder
ceb6f17afc Merge pull request #3635 from pchote/changelog
Update changelog to current.
2013-08-04 01:36:08 -07:00
Matthias Mailänder
49f03e49a5 Merge pull request #3633 from pchote/frozen-polish
Clean up loose ends with fog and lobby options.
2013-08-04 01:35:48 -07:00
Paul Chote
e2f51a3424 Update changelog. 2013-08-04 20:09:11 +12:00
Paul Chote
04e5edc811 Rewrite bib to match new FrozenUnderFog capabilities. 2013-08-04 19:42:16 +12:00
Paul Chote
c7350b704e Add trait interfaces for added/removed from world. 2013-08-04 18:22:57 +12:00
ScottNZ
c980d97027 Add RA starting units setup 2013-08-04 13:13:02 +12:00
Paul Chote
87b32fd0b9 Tweak starting unit defaults. 2013-08-04 13:07:47 +12:00
Paul Chote
c08f602661 Add lobby options for Shroud and Fog. 2013-08-04 13:04:09 +12:00
Paul Chote
d867e8200f Reset default state when a dedicated server clears. 2013-08-04 12:06:47 +12:00
Paul Chote
40533918f3 Allow mods to set default lobby options. 2013-08-04 12:03:18 +12:00
Paul Chote
8fb7ed4913 Hide walls under fog. 2013-08-04 11:49:09 +12:00
Paul Chote
5617b2a550 Freeze civilian and map structures under fog. Fixes #3614. 2013-08-04 11:43:57 +12:00
Paul Chote
136ddf1697 Allow map-placed frozen actors to start revealed. 2013-08-04 11:41:24 +12:00
Matthias Mailänder
cc5390c289 Merge pull request #3629 from pchote/superweapons
Fix superweapon timer / perf text conflict.
2013-08-03 03:57:00 -07:00
Matthias Mailänder
2cd3829ad4 Merge pull request #3628 from pchote/domain-crash
Fix out-of-bounds crash in DomainIndex.
2013-08-03 03:48:35 -07:00
Paul Chote
431adcf3a7 Add bounds checking to DomainIndex. Fixes #3599. 2013-08-03 22:09:22 +12:00
ScottNZ
9c35fc7cba Move superweapon timers to the top so they don't interfere with the performance graph.
Fixes #3626.
2013-08-03 22:00:22 +12:00
Matthias Mailänder
b7c349b1a5 Merge pull request #3622 from ScottNZ/q
Split Plane queue into a Plane queue and a Helicopter queue to stop plan...
2013-08-03 02:21:06 -07:00
Matthias Mailänder
74c136b7e3 Merge pull request #3627 from pchote/muzzleflash
Improved Muzzleflash support
2013-08-03 02:20:46 -07:00
Matthias Mailänder
a0cea99825 Merge pull request #3625 from pchote/gtwr-fix
Fix muzzle offsets for actors without a rendered turret.
2013-08-03 02:15:51 -07:00
Paul Chote
8f24f93330 Add per-armament muzzle flashes. Fixes #3609. 2013-08-03 16:47:50 +12:00
Paul Chote
755fa6eaf4 Include Armament and Barrel in INotifyAttack. 2013-08-03 16:21:57 +12:00
Paul Chote
03e09e25bb Fix turret facings for GTWR etc. Fixes #3610. 2013-08-03 12:45:21 +12:00
Matthias Mailänder
deb03e7a02 Merge pull request #3624 from pchote/renderable-fixup
Renderable fixup
2013-08-02 16:56:30 -07:00
Matthias Mailänder
079fc7cc04 Merge pull request #3623 from ScottNZ/desc
Fix DescAttribute fail in CashTrickler.cs
2013-08-02 16:45:04 -07:00
Paul Chote
a545259454 Don't render contrail shadows. 2013-08-03 11:20:26 +12:00
Paul Chote
805b4b6258 Change IRenderable.WithPos -> OffsetBy.
This is more appropriate for the actual use cases.
Fixes #3621.
2013-08-03 11:16:52 +12:00
ScottNZ
d2a310e879 Fix DescAttribute fail in CashTrickler.cs 2013-08-03 10:55:46 +12:00
ScottNZ
01fb04049e Split Plane queue into a Plane queue and a Helicopter queue to stop planes appearing on helipads etc 2013-08-03 10:50:39 +12:00
Paul Chote
3788d4f185 Merge pull request #3600 from Mailaender/music-player-fixes
Fixed various music player problems
2013-08-02 15:48:04 -07:00
Matthias Mailänder
ad95f48711 merge C&C and RA music player logic
mainly code cleanup, but with the following improvements:
- scroll to current song which fixes #3360 and overlapping label
- use Rules.InstalledMusic & Sound.MusicPlaying everywhere
- separated C&C install logic and log catched exceptions
- save the music settings on back/close
2013-08-03 00:37:04 +02:00
Matthias Mailänder
06233a76a8 don't hide the pause button after unpause 2013-08-02 20:17:05 +02:00
Matthias Mailänder
fa84f1906f actually care for the map music switch 2013-08-02 20:13:57 +02:00
Matthias Mailänder
41af9d7993 Merge pull request #3620 from wuschel/bleed
fixed RA map: ATHENA (koth)
2013-08-02 11:07:08 -07:00
Matthias Mailänder
927180fb00 Merge pull request #3617 from pchote/audio-device-selector
Audio device selector
2013-08-02 11:02:21 -07:00
Matthias Mailänder
b62d9b7517 Merge pull request #3616 from pchote/wobbly-turrets
Fix wobbly turrets
2013-08-02 10:58:50 -07:00
wuschel
d51aec5fde fixed RA map: ATHENA (koth)
-- removed residual wall on main island
-- removed a couple of oil derricks
-- added some additional stones to prevent players to colonize the main
island.
-- playtested
2013-08-02 16:33:44 +02:00
Paul Chote
4009edfa96 Add audio device selection. Fixes #3553. 2013-08-02 19:38:49 +12:00
Paul Chote
cdef41adb4 Specify sprite positions as center pos + offset. Fixes #3611. 2013-08-01 22:23:21 +12:00
Chris Forbes
130fd0bf0c Merge pull request #3592 from pchote/world-projectiles
Convert projectiles to world coordinates.
2013-08-01 01:36:44 -07:00
Paul Chote
1ae2e55448 Remove obsolete PPos functions from Target. 2013-08-01 20:18:44 +12:00
Paul Chote
3d1b7d6d53 Fix Traits.Util style issues. 2013-08-01 20:18:44 +12:00
Paul Chote
b50ba0bfb9 Use WAngle.ArcTan in Traits.Util.GetFacing. 2013-08-01 20:18:44 +12:00
Paul Chote
e08445f762 Remove obsolete functions from Traits.Util. 2013-08-01 20:18:44 +12:00
Paul Chote
3fd01cfac2 Remove obsolete PSubPos and PSubVec. 2013-08-01 20:18:43 +12:00
Paul Chote
4a425e0fa0 Remove PSubVec from AttackWander. 2013-08-01 20:18:43 +12:00
Paul Chote
f198d7f204 Add WVec.ToCVec() extension method. 2013-08-01 20:18:43 +12:00
Paul Chote
bf9c737a11 Remove obsolete Gauss1D/Gauss2D functions. 2013-08-01 20:18:42 +12:00
Paul Chote
b374816fa1 Convert Missile to world coordinates. Fixes #3347. Closes #3434. 2013-08-01 20:18:42 +12:00
Paul Chote
285ecb8c03 Rewrite bullets using world coords and improved trails. 2013-08-01 20:18:42 +12:00
Paul Chote
da5c85dbac Rewrite GravityBomb with world coords and gravity. 2013-08-01 20:18:42 +12:00
Paul Chote
547fcdfa4d Split TeslaRenderable out from TeslaZap. 2013-08-01 20:18:41 +12:00
Paul Chote
df46ffeb84 Convert ProjectileArgs to world coords. 2013-08-01 20:18:41 +12:00
Paul Chote
6d52af4553 Add probabilistic sampling functions to WRange, WVec. 2013-08-01 20:18:41 +12:00
Paul Chote
46a384d1ca Add WAngle.ArcTan(). 2013-08-01 20:18:40 +12:00
Matthias Mailänder
332759a5f5 Put audio related problems into sound.log 2013-07-31 22:16:01 +02:00
Matthias Mailänder
8f5a1333d2 Merge pull request #3607 from pchote/widget-focus
Split keyboard/mouse focus and use C&C world tooltips in RA/D2K.
2013-07-29 10:49:11 -07:00
Paul Chote
06d65305df Merge pull request #3603 from Mailaender/tiberian-sun
Added a Tiberian Sun test mod
2013-07-28 01:27:22 -07:00
Paul Chote
d62c6ab20f Merge pull request #3606 from reaperrr/cnc-mouse-fix
Fixes cnc mod mouse cursor
2013-07-28 01:09:46 -07:00
Paul Chote
206fc0ea1d Eat mouse-up events in RA production palette. Fixes #2192. 2013-07-28 20:00:08 +12:00
Paul Chote
0e37c99521 Use C&C world tooltips in RA and D2K. Fixes #2382. 2013-07-28 19:53:12 +12:00
Matthias Mailänder
389aa6c929 Added a minimal work in progress TS mod with few backfalls on RA
to showcase infantry, vehicles, aircraft
2013-07-28 09:17:34 +02:00
Matthias Mailänder
2d050cb2cc Added a (temporary) C&C chrome skin for Tiberian Sun 2013-07-28 09:10:50 +02:00
Matthias Mailänder
af103f185b set up Tiberian Sun and Firestorm soundtrack 2013-07-28 09:10:37 +02:00
Matthias Mailänder
74ac720086 fix broken tabs before newline and remove unnecessary spaces 2013-07-28 09:10:36 +02:00
Matthias Mailänder
0ecabe0e49 fix useless RenderUnit trait addition and removal 2013-07-28 09:10:36 +02:00
Paul Chote
9be6f3f29d Move C&C world tooltip code into ViewportControllerWidget. 2013-07-28 19:06:13 +12:00
Paul Chote
0cdc4d6f01 Rename ViewportScrollController -> ViewportController. 2013-07-28 18:57:12 +12:00
Paul Chote
6722db20e3 Clean up ViewportScrollControllerWidget. 2013-07-28 18:52:08 +12:00
Paul Chote
40c6264aca Spaces -> Tabs in ViewportScrollControllerWidget. 2013-07-28 18:39:59 +12:00
reaperrr
106fa4da0d Fixes cnc mod mouse cursor.
Looks like color #12 got replaced with color #0 during conversion from dune2 shp to cnc shp. I fixed mouse2.shp by converting the original shp with a custom palette and then manually fixed mouse4.shp.
2013-07-27 11:32:11 +02:00
Paul Chote
7c91d6976d Split keyboard and mouse focus.
Fixes #3304.
Fixes #2075.
Fixes C&C chat focus bug.
2013-07-27 21:02:52 +12:00
Paul Chote
eb57e2dd4e Merge pull request #3601 from Mailaender/sound-extensions
Sound extensions for Red Alert missions
2013-07-26 16:25:50 -07:00
Chris Forbes
858b3888b2 Merge pull request #3604 from reaperrr/patch-2
Changes track title of Afterlife to Await
2013-07-26 12:06:39 -07:00
reaperrr
616472140d Changes track title of Afterlife to Await
The file is called await_r.aud and the ingame title in RA was Await, too. As far as I can tell, the title 'Afterlife' first came up in the old RAMIXer's database, and was copy-pasted to XCC Mixer's database. But there is no indication that Afterlife really is/was supposed to be the real in-game title of this track.
2013-07-26 18:43:21 +02:00
Matthias Mailänder
3e44ac7d00 added sound extensions and replaced missing volknapalm.aud 2013-07-26 08:04:12 +02:00
Matthias Mailänder
c7018e438c fix silent cruiser cannons in shellmaps
closes #3598
2013-07-26 08:04:12 +02:00
Matthias Mailänder
e01b2a9ffc fix missing sounds in allies01
closes #3478
2013-07-26 08:04:12 +02:00
Matthias Mailänder
ea36d05fc5 Merge pull request #3595 from dan9550/td_nod_campaign
More improvements to nod01
2013-07-25 13:34:37 -07:00
Dan9550
0657abd51b Fixed nod01, not being able to lose mission 2013-07-26 06:25:35 +10:00
Matthias Mailänder
4a146d140d Merge pull request #3596 from pchote/fog-visibility-freezing
Fog visibility freezing fixes #3206 et al
2013-07-25 11:12:36 -07:00
Paul Chote
bdded2f14c Hide crate effects / rank animation under fog. 2013-07-25 18:16:10 +12:00
Paul Chote
c836374ae2 Enable FrozenUnderFog in C&C and RA. 2013-07-25 18:11:55 +12:00
Paul Chote
126fc79eed Fix FrozenUnderFog. 2013-07-25 18:11:55 +12:00
Paul Chote
67388d2ba9 Tidy HiddenUnderFog. 2013-07-25 18:11:55 +12:00
Paul Chote
7405921621 Hide Repair, Powerdown icons when cloaked. Fixes #3588. Fixes #3502. 2013-07-25 18:11:55 +12:00
Paul Chote
b24427a9c1 Hide smoke under fog. 2013-07-25 18:11:55 +12:00
Paul Chote
7cb70d3aab Hide corpses under fog. 2013-07-25 18:11:54 +12:00
Paul Chote
bc4061aabd Hide explosions under fog. 2013-07-25 18:11:54 +12:00
Paul Chote
a09bcbd47a Use the rendered resource state for the harvest order targeter. 2013-07-25 18:11:54 +12:00
Paul Chote
ff4a600d94 Freeze resources under fog. 2013-07-25 18:11:54 +12:00
Paul Chote
e1a7a55f2a Fix ResourceLayer style nits. 2013-07-25 18:11:54 +12:00
Paul Chote
bfaf5446cb Freeze smudges under fog. 2013-07-25 18:11:54 +12:00
Paul Chote
ac7b93d39d Fix SmudgeLayer style nits. 2013-07-25 18:11:53 +12:00
Paul Chote
b54ffdbabd Add FrozenUnderFog property to BibLayer.
Note: This implements the desired behavior
for FrozenUnderFog, so is still inconsistent
with its current (broken) behavior.
2013-07-25 18:11:53 +12:00
Dan9550
b75ad65493 fixed strange indentation nod01 2013-07-25 06:57:09 +10:00
Dan9550
ea5f4d9029 corrected lose fmv nod01 2013-07-25 05:08:09 +10:00
Matthias Mailänder
501bf6b4fd Merge pull request #3593 from wuschel/bleed
Fixes #3573 and updates maps Pluto/Artemis a little.
2013-07-24 10:37:25 -07:00
Dan9550
d59a1af272 tweaks and such, nod01 2013-07-24 23:46:16 +10:00
Paul Chote
f95c19e5b2 Fix BibLayer style nits. 2013-07-24 21:01:17 +12:00
Dan9550
f88c62e363 More improvements to nod01 2013-07-24 17:45:19 +10:00
wuschel
f685f08789 changed: RA map ARTEMIS
-- minor changes
2013-07-23 23:11:21 +02:00
wuschel
9d3f2f8b84 changed: RA map PLUTO
-- fixed # 3573
-- removed MISS
-- changed MSLO so that it is possible to possess multiple ones.
-- added additional MSLO to the map.
-- removed a couple of oil derricks.
2013-07-23 23:05:51 +02:00
Matthias Mailänder
7754357760 Merge pull request #3591 from ScottNZ/voices
Add an Unload voice for when a unit is unloading.
2013-07-22 12:47:11 -07:00
ScottNZ
dc84acc300 Add an Unload voice for when a unit is unloading. 2013-07-22 22:19:37 +12:00
Matthias Mailänder
80ebd3aae1 Merge pull request #3587 from dan9550/td_nod_campaign
Fixes HPAD being buildable in gdi01
2013-07-21 04:04:42 -07:00
Dan9550
4eece4326c Added my fullname to AUTHORS 2013-07-21 18:56:43 +10:00
Dan9550
79b7fb9eb1 Removes buildable HPAD from gdi01 2013-07-21 18:56:43 +10:00
Matthias Mailänder
47502dbb8b Merge pull request #3586 from pchote/omg-even-more-world-coords
Convert actor positioning to world coordinates.
2013-07-21 01:55:26 -07:00
Paul Chote
cc00c5bc18 Fix Nod01Script line endings. 2013-07-21 20:42:07 +12:00
Paul Chote
cff5b8bfb0 Remove rebase cruft. 2013-07-21 20:41:43 +12:00
Paul Chote
0594822078 Fix cargo loading. 2013-07-21 18:35:12 +12:00
Paul Chote
57adaf46b0 Rewrite Aircraft movement using world coords. 2013-07-21 17:35:47 +12:00
Paul Chote
c3f04cc32e Convert non-aircraft positioning to world coords.
This removes the incomplete and unused hover code
on Mobile, which would be more trouble that it is
currently worth to carry over.
2013-07-21 17:35:47 +12:00
Paul Chote
29009fe3a4 Allow husks to chronoshift and return to their parent actors location. 2013-07-21 17:35:46 +12:00
Paul Chote
e23c1ad33e Rewrite husks using world coords. 2013-07-21 17:35:46 +12:00
Paul Chote
6a435752fd Remove *PxPosition from IOccupySpace/IPositionable. 2013-07-21 17:35:46 +12:00
Paul Chote
19165d259d Add world coord overloads to IOccupySpace and IPositionable. 2013-07-21 17:35:46 +12:00
Paul Chote
3e9bc63d4e Prevent things from tweaking mobile position directly. 2013-07-21 17:35:45 +12:00
Paul Chote
0676116d77 Convert Move and related plumbing to world coordinates. 2013-07-21 17:35:45 +12:00
Paul Chote
abdfac6e85 More style fixes for Move. 2013-07-21 17:35:45 +12:00
Paul Chote
048bed0a5e Rename ITeleportable -> IPositionable. 2013-07-21 17:35:41 +12:00
Paul Chote
ac4b07bf7b Add missing SetChronoTankDestination.cs to project. 2013-07-21 17:33:35 +12:00
Paul Chote
ecc119cb29 Combine IHasLocation -> IOccupySpace, IMove -> ITeleportable. 2013-07-21 17:33:32 +12:00
Paul Chote
36a45d1a3f Change Exit.SpawnOffsetVector to WVec. 2013-07-21 17:31:00 +12:00
Paul Chote
ac3f63b59c Remove IHasLocation lookup from Target. 2013-07-21 17:31:00 +12:00
Paul Chote
200fde77b1 Remove unnecessary IHasLocation checks in HackyAI.
Existing checks for ITargetable / Building / etc
make these redundant.
2013-07-21 17:31:00 +12:00
Paul Chote
8a988e5e02 Clean up HarvesterDockSequence. 2013-07-21 17:30:59 +12:00
Paul Chote
031c17ab9c Helicopter style fixes. 2013-07-21 17:30:59 +12:00
Paul Chote
179f97a598 Convert helicopter activities to world coords. 2013-07-21 17:30:59 +12:00
Paul Chote
712e13b1e7 Remove some duplication against WorldUtils.ClosestTo. 2013-07-21 17:30:59 +12:00
Paul Chote
b92aa760d2 FlyAttack style fixes. 2013-07-21 17:30:58 +12:00
Paul Chote
a070629571 Convert plane activities to world coords. 2013-07-21 17:30:58 +12:00
Paul Chote
f18994f800 Add WVec.HorizontalLengthSquared to simplify range checks. 2013-07-21 17:30:58 +12:00
Paul Chote
56da57bc09 Return WVec.LengthSquared as a long to avoid overflow. 2013-07-21 17:30:57 +12:00
Matthias Mailänder
0f42fa5460 Merge pull request #3585 from dan9550/td_nod_campaign
NOD01Script Spaces -> Tabs & updated code
2013-07-20 03:32:56 -07:00
Dan9550
897f6cd69e Updated code, removed NOD_01, Spaces -> Tabs
NOD01Script Spaces -> Tabs

started work on NOD_01

Conflicts:
	OpenRA.Mods.cnc_sw/OpenRA.Mods.Cnc_sw.csproj

removing uneeded files

Spaces -> Tabs NOD01Script.cs

started work on NOD_01

Conflicts:
	OpenRA.Mods.cnc_sw/OpenRA.Mods.Cnc_sw.csproj

removing uneeded files

Did some messing around still broken

Spaces -> Tabs #2

Updated the code a little, is somewhat more playable now

removed NOD_01
2013-07-20 19:39:42 +10:00
Matthias Mailänder
002df7b24e Merge pull request #3583 from pchote/omg-more-world-coords
More world coordinates
2013-07-20 01:08:53 -07:00
Paul Chote
ddd1314613 Convert ScreenShaker to world coords. 2013-07-20 15:34:28 +12:00
Paul Chote
0c35e49239 Remove PPos from range circle drawing. 2013-07-20 15:34:28 +12:00
Paul Chote
27f04c1b78 Rename FindUnits -> FindActorsInBox. 2013-07-20 15:34:28 +12:00
Paul Chote
37c02fea79 Remove PPos overload of FindUnits. 2013-07-20 15:34:27 +12:00
Paul Chote
800acdbdf2 Rename FindUnitsInCircle -> FindActorsInCircle. 2013-07-20 15:34:27 +12:00
Paul Chote
e6865c5996 Remove PPos overload of FindUnitsInCircle. 2013-07-20 15:34:27 +12:00
Paul Chote
39d2095e54 Remove PPos overload of ClosestTo. 2013-07-20 15:34:27 +12:00
Paul Chote
c1a0836640 Convert HackyAI to world coords. 2013-07-20 15:34:26 +12:00
Paul Chote
6201d7bfe2 Convert mission scripts to world coords. 2013-07-20 15:34:26 +12:00
Paul Chote
1dfc4837d4 Add some world-coordinate helpers. 2013-07-20 15:34:26 +12:00
Matthias Mailänder
8751d29a9a Merge pull request #3578 from pchote/renderer-cleanup
Renderer cleanup
2013-07-19 09:10:15 -07:00
Paul Chote
c21db5dbbd Remove hacky os-specific keyboard shortcuts. 2013-07-18 18:23:34 +12:00
Paul Chote
7abab1449c Remove obsolete stencil buffer configuration. 2013-07-18 18:13:46 +12:00
Paul Chote
7853c2127e Style fixes for Renderer.SdlCommon. 2013-07-18 18:13:16 +12:00
Paul Chote
1b4e387ecc Style fixes for Renderer.Gl. 2013-07-18 17:45:23 +12:00
Paul Chote
61cb279c1d Style fixes for Renderer.Cg. 2013-07-18 17:45:23 +12:00
Matthias Mailänder
52fcba1607 Merge pull request #3575 from pchote/r8reader
Native R8 support for sequences
2013-07-17 08:27:15 -07:00
Matthias Mailänder
77ff985dcd Merge pull request #3574 from ScottNZ/superweapons
Add atom bomb and gps public superweapon timers to RA
2013-07-17 08:25:25 -07:00
ScottNZ
b519c915ca Add public atom bomb and gps timers to RA 2013-07-17 14:52:50 +12:00
Paul Chote
acbd692de8 Add native support for the d2k R8 format. 2013-07-16 23:16:09 +12:00
Paul Chote
e8d7624867 Move R8Reader to FileFormats. 2013-07-16 23:02:16 +12:00
Paul Chote
da4a2f548b Support loading sprites with non-zero offsets. 2013-07-16 19:40:54 +12:00
ScottNZ
506790e09c Add "leading minute zero" overload to FormatTime 2013-07-16 18:35:28 +12:00
Matthias Mailänder
667aee095f Merge pull request #3571 from pchote/split-shadows
Add support for TS/RA2 split-shadows.
2013-07-15 09:18:35 -07:00
Matthias Mailänder
60d97ef5fb Merge pull request #3567 from cjshmyr/capturing
Remove unused interface INotifyOtherCaptured
2013-07-15 08:58:58 -07:00
Matthias Mailänder
3da3726ded Merge pull request #3566 from reaperrr/patch-1
Fixes & tweaks Badger contrails
2013-07-15 08:55:43 -07:00
Matthias Mailänder
f2c931b059 Merge pull request #3570 from 0x7c00/bleed
Allow the AI to look for more space to build: fixes #3189
2013-07-15 08:44:46 -07:00
Paul Chote
adea353e2b Support split shadows for TS and RA2. 2013-07-15 20:59:36 +12:00
Paul Chote
847f93246c Remove unnecessary properties from Sequence. 2013-07-15 20:58:25 +12:00
Paul Chote
a642b8298e Move harvester animation z offset to sequences. 2013-07-15 20:58:24 +12:00
Paul Chote
dcbef51ba0 Move ion cannon z offset to sequences. 2013-07-15 20:58:03 +12:00
Paul Chote
9a47c6a303 Allow sequences to define a custom z offset. 2013-07-15 20:57:14 +12:00
Paul Chote
15688eed13 Allow Animation to generate its own Renderables. 2013-07-15 20:54:02 +12:00
Nico
d3e760659a fix #3569 , and possible many other bugs... if the place is not close to the base, instead of returning the error, continue to see if there is another place to build 2013-07-14 23:31:09 -03:00
Nico
01f72f4f44 Revert "allow the AI to base-walk without restrictions"
This reverts commit d08d3d6e23.
2013-07-14 23:14:09 -03:00
Curtis Shmyr
a1f05fd017 Remove unused interface INotifyOtherCaptured 2013-07-14 11:53:15 -06:00
reaperrr
aa56c6339b Tweaks to Badger contrail 2013-07-14 18:02:02 +02:00
ScottNZ
8bec40eb9b Move SupportPowerInstance out of SupportPowerManager 2013-07-14 22:40:38 +12:00
Chris Forbes
fc458d191d Merge pull request #3563 from ScottNZ/hosp
Make ra hosp reveal shroud
2013-07-14 02:19:42 -07:00
ScottNZ
b314b37d67 Make ra hosp reveal shroud 2013-07-14 20:54:38 +12:00
Matthias Mailänder
cdab89ce74 Merge pull request #3561 from pchote/more-playtest-fixes
More playtest regression fixes.
2013-07-14 01:39:55 -07:00
Matthias Mailänder
e1dab71600 Merge pull request #3559 from wuschel/bleed
Updated two maps: DIONYSUS and PLUTO
2013-07-14 01:34:05 -07:00
Matthias Mailänder
5debc253a1 Merge pull request #3560 from ScottNZ/superweapons
RA superweapon improvements
2013-07-14 01:29:16 -07:00
Paul Chote
c7c9b8710e Fix cached paths in PathFinder. Fixes #3557. 2013-07-14 17:08:36 +12:00
Paul Chote
57a27eb948 Restore packet size restriction with 128k limit. 2013-07-14 17:00:44 +12:00
Paul Chote
330978aeea Fix ProductionAirdrop style nits. 2013-07-14 16:56:44 +12:00
Paul Chote
8f5abf7983 Give the airdrop C17 enough room to land. Fixes #3554. 2013-07-14 16:51:50 +12:00
ScottNZ
d930aee65d Apply offset to iron so it graphically fits on its footprint properly 2013-07-14 11:52:34 +12:00
ScottNZ
ef703d61af Move ra superweapons a little closer to the ra1 superweapons by removing bibs and changing the footprint of iron to 2,1 2013-07-14 11:52:34 +12:00
ScottNZ
2faeaca83f Add build limits to iron and pdox 2013-07-14 11:52:34 +12:00
ScottNZ
c579f885c3 Make the RA superweapon descriptions a bit more consistent 2013-07-14 11:52:33 +12:00
wuschel
cafb5ffdf3 Updated two maps: DIONYSUS and PLUTO
Minor changes:
DIONYSUS: removed that hill with the MISS again.
PLUTO: removed two ore drills/patches on each starting island.
2013-07-14 00:01:44 +02:00
Matthias Mailänder
a802c5cb01 Merge pull request #3555 from ScottNZ/chronosound
Use correct sound for teleporting chronotanks
2013-07-13 07:14:33 -07:00
ScottNZ
7ead562349 Use correct sound for teleporting chronotanks 2013-07-14 00:24:11 +12:00
Matthias Mailänder
bd38f1255f Merge pull request #3552 from pchote/playtest-hotfix
Playtest hotfix
2013-07-13 02:23:48 -07:00
Paul Chote
4e86eea57c Fix C&C credits back button position. 2013-07-13 21:07:19 +12:00
Paul Chote
bb2de697ee Fix alphabetical ordering of AUTHORS. 2013-07-13 21:06:08 +12:00
Paul Chote
567b1967cf Revert "restrict packet size to 4K in server"
This reverts commit edb08d6fec.
2013-07-13 21:03:44 +12:00
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
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
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
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
1272 changed files with 98602 additions and 39332 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

15
.gitignore vendored
View File

@@ -15,6 +15,7 @@ _ReSharper.*/
#binary stuff
/*.dll
/*.dll.config
*.pdb
*.mdb
*.exe
@@ -24,9 +25,13 @@ _ReSharper.*/
*.orig
\#*
.*.sw?
# dependency DLLs (different for every platform!)
cg.dll
cgGL.dll
freetype6.dll
zlib1.dll
SDL.dll
/OpenRa.Gl.dll
@@ -49,9 +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
# KDE crap
*.kate-swp
*.directory
*.directory
# auto-generated documentation
DOCUMENTATION.md
*.html
# StyleCop
*.Cache

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"

111
AUTHORS
View File

@@ -1,43 +1,78 @@
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)
* Matthias Mailänder (Mailaender)
* Paul Chote (pchote)
* 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:
* Akseli Virtanen (RAGEQUIT)
* Andrew Riedi
* Barnaby Smith (mvi)
* Bellator
* Christer Ulfsparre (Holloweye)
* Cody Brittain (Generalcamo)
* Daniel Derejvanik (Harisson)
* Erasmus Schroder (rasco)
* Igor Popov (ihptru)
* James Dunne (jsd)
* Jeff Harris (jeff_1amstudios)
* Jes (-Jes-)
* Joakim Lindberg (booom3)
* Kenny Hoxworth (hoxworth)
* Kyrre Soerensen (zypres)
* Lawrence Wang
* Mark Olson (markolson)
* Matthew Gatland (mgatland)
* Matthias Mailänder (Mailaender)
* Max Ugrumov (katzsmile)
* Max621
* Nukem
* Paolo Chiodi (paolochiodi)
* Paul Dovydaitis (pdovy)
* Raymond Martineau (mart0258)
* Riderr3
* Tim Mylemans (gecko)
* Akseli Virtanen (RAGEQUIT)
* Andrew Aldridge (i80and)
* Andrew Perkins
* Andrew Riedi
* Andreas Beck (baxtor)
* Barnaby Smith (mvi)
* Bellator
* Bugra Cuhadaroglu (BugraC)
* Christer Ulfsparre (Holloweye)
* Cody Brittain (Generalcamo)
* D2k Sardaukar
* Daniel Derejvanik (Harisson)
* Danny Keary (Dan9550)
* Erasmus Schroder (rasco)
* Fahrradkette
* 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)
* Maarten Meuris (Nyerguds)
* Mark Olson (markolson)
* Matthew Gatland (mgatland)
* Max621
* Max Ugrumov (katzsmile)
* 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
Using GeoLite data created by MaxMind and
distributed under the CC BY-SA 3.0 license.
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)

1130
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.

BIN
GeoIP.dat Normal file

Binary file not shown.

165
GeoIP/COPYING Normal file
View File

@@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

63
GeoIP/Country.cs Normal file
View File

@@ -0,0 +1,63 @@
#region Copyright & License Information
/*
* Copyright (C) 2008 MaxMind Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#endregion
using System;
using System.IO;
namespace GeoIP
{
public class Country
{
String code;
String name;
/*
* Creates a new Country.
*
* @param code the country code.
* @param name the country name.
*/
public Country(String code, String name)
{
this.code = code;
this.name = name;
}
/*
* Returns the ISO two-letter country code of this country.
*
* @return the country code.
*/
public String getCode()
{
return code;
}
/*
* Returns the name of this country.
*
* @return the country name.
*/
public String getName()
{
return name;
}
}
}

106
GeoIP/DatabaseInfo.cs Normal file
View File

@@ -0,0 +1,106 @@
#region Copyright & License Information
/*
* Copyright (C) 2008 MaxMind Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#endregion
using System;
using System.IO;
namespace GeoIP
{
public class DatabaseInfo
{
public static int COUNTRY_EDITION = 1;
public static int REGION_EDITION_REV0 = 7;
public static int REGION_EDITION_REV1 = 3;
public static int CITY_EDITION_REV0 = 6;
public static int CITY_EDITION_REV1 = 2;
public static int ORG_EDITION = 5;
public static int ISP_EDITION = 4;
public static int PROXY_EDITION = 8;
public static int ASNUM_EDITION = 9;
public static int NETSPEED_EDITION = 10;
public static int DOMAIN_EDITION = 11;
public static int COUNTRY_EDITION_V6 = 12;
public static int ASNUM_EDITION_V6 = 21;
public static int ISP_EDITION_V6 = 22;
public static int ORG_EDITION_V6 = 23;
public static int DOMAIN_EDITION_V6 = 24;
public static int CITY_EDITION_REV1_V6 = 30;
public static int CITY_EDITION_REV0_V6 = 31;
public static int NETSPEED_EDITION_REV1 = 32;
public static int NETSPEED_EDITION_REV1_V6 = 33;
private String info;
/**
* Creates a new DatabaseInfo object given the database info String.
* @param info
*/
public DatabaseInfo(String info)
{
this.info = info;
}
public int getType()
{
if ((info == null) | (info == ""))
{
return COUNTRY_EDITION;
}
else
{
// Get the type code from the database info string and then
// subtract 105 from the value to preserve compatability with
// databases from April 2003 and earlier.
return Convert.ToInt32(info.Substring(4, 3)) - 105;
}
}
/**
* Returns the date of the database.
*
* @return the date of the database.
*/
public DateTime getDate()
{
for (int i=0; i<info.Length-9; i++)
{
if (Char.IsWhiteSpace(info[i]) == true)
{
var dateString = info.Substring(i+1, 8);
try
{
return DateTime.ParseExact(dateString,"yyyyMMdd",null);
}
catch (Exception e)
{
Console.Write(e.Message);
}
break;
}
}
return DateTime.Now;
}
public String toString()
{
return info;
}
}
}

44
GeoIP/GeoIP.csproj Normal file
View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>10.0.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{021DDD6A-A608-424C-9A9A-252D8A9989E0}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>GeoIP</RootNamespace>
<AssemblyName>GeoIP</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>..</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
</ItemGroup>
<ItemGroup>
<Compile Include="Country.cs" />
<Compile Include="DatabaseInfo.cs" />
<Compile Include="Location.cs" />
<Compile Include="LookupService.cs" />
<Compile Include="Region.cs" />
<Compile Include="RegionName.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

67
GeoIP/Location.cs Normal file
View File

@@ -0,0 +1,67 @@
#region Copyright & License Information
/*
* Copyright (C) 2008 MaxMind Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#endregion
using System;
using System.IO;
namespace GeoIP
{
public class Location
{
public String countryCode;
public String countryName;
public String region;
public String city;
public String postalCode;
public double latitude;
public double longitude;
public int dma_code;
public int area_code;
public String regionName;
public int metro_code;
private static double EARTH_DIAMETER = 2 * 6378.2;
private static double PI = 3.14159265;
private static double RAD_CONVERT = PI / 180;
public double distance (Location loc)
{
double delta_lat, delta_lon;
double temp;
double lat1 = latitude;
double lon1 = longitude;
double lat2 = loc.latitude;
double lon2 = loc.longitude;
// convert degrees to radians
lat1 *= RAD_CONVERT;
lat2 *= RAD_CONVERT;
// find the deltas
delta_lat = lat2 - lat1;
delta_lon = (lon2 - lon1) * RAD_CONVERT;
// Find the great circle distance
temp = Math.Pow(Math.Sin(delta_lat/2), 2) + Math.Cos(lat1) * Math.Cos(lat2) * Math.Pow(Math.Sin(delta_lon/2), 2);
return EARTH_DIAMETER * Math.Atan2(Math.Sqrt(temp), Math.Sqrt(1-temp));
}
}
}

999
GeoIP/LookupService.cs Normal file
View File

@@ -0,0 +1,999 @@
#region Copyright & License Information
/*
* Copyright (C) 2008 MaxMind Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#endregion
using System;
using System.IO;
using System.Net;
using System.Runtime.CompilerServices;
namespace GeoIP
{
public class LookupService
{
private FileStream file = null;
private DatabaseInfo databaseInfo = null;
private Object ioLock = new Object();
byte databaseType = Convert.ToByte(DatabaseInfo.COUNTRY_EDITION);
int[] databaseSegments;
int recordLength;
int dboptions;
byte[] dbbuffer;
private static Country UNKNOWN_COUNTRY = new Country("--", "Unknown Location");
private static int COUNTRY_BEGIN = 16776960;
private static int STRUCTURE_INFO_MAX_SIZE = 20;
private static int DATABASE_INFO_MAX_SIZE = 100;
private static int FULL_RECORD_LENGTH = 100;//???
private static int SEGMENT_RECORD_LENGTH = 3;
private static int STANDARD_RECORD_LENGTH = 3;
private static int ORG_RECORD_LENGTH = 4;
private static int MAX_RECORD_LENGTH = 4;
private static int MAX_ORG_RECORD_LENGTH = 1000;//???
private static int FIPS_RANGE = 360;
private static int STATE_BEGIN_REV0 = 16700000;
private static int STATE_BEGIN_REV1 = 16000000;
private static int US_OFFSET = 1;
private static int CANADA_OFFSET = 677;
private static int WORLD_OFFSET = 1353;
public static int GEOIP_STANDARD = 0;
public static int GEOIP_MEMORY_CACHE = 1;
public static int GEOIP_UNKNOWN_SPEED = 0;
public static int GEOIP_DIALUP_SPEED = 1;
public static int GEOIP_CABLEDSL_SPEED = 2;
public static int GEOIP_CORPORATE_SPEED = 3;
private static String[] countryCode = {
"--",
"AP", "EU", "AD", "AE", "AF", "AG", "AI", "AL", "AM", "CW",
"AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AZ", "BA", "BB",
"BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BM", "BN", "BO",
"BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD",
"CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR",
"CU", "CV", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO",
"DZ", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI", "FJ",
"FK", "FM", "FO", "FR", "SX", "GA", "GB", "GD", "GE", "GF",
"GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT",
"GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID",
"IE", "IL", "IN", "IO", "IQ", "IR", "IS", "IT", "JM", "JO",
"JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR", "KW",
"KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT",
"LU", "LV", "LY", "MA", "MC", "MD", "MG", "MH", "MK", "ML",
"MM", "MN", "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV",
"MW", "MX", "MY", "MZ", "NA", "NC", "NE", "NF", "NG", "NI",
"NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF",
"PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW",
"PY", "QA", "RE", "RO", "RU", "RW", "SA", "SB", "SC", "SD",
"SE", "SG", "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO",
"SR", "ST", "SV", "SY", "SZ", "TC", "TD", "TF", "TG", "TH",
"TJ", "TK", "TM", "TN", "TO", "TL", "TR", "TT", "TV", "TW",
"TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE",
"VG", "VI", "VN", "VU", "WF", "WS", "YE", "YT", "RS", "ZA",
"ZM", "ME", "ZW", "A1", "A2", "O1", "AX", "GG", "IM", "JE",
"BL", "MF", "BQ", "SS", "O1" };
private static String[] countryName = {
"Unknown Location",
"Asia/Pacific Region", "Europe", "Andorra", "United Arab Emirates", "Afghanistan", "Antigua and Barbuda", "Anguilla", "Albania", "Armenia", "Curacao",
"Angola", "Antarctica", "Argentina", "American Samoa", "Austria", "Australia", "Aruba", "Azerbaijan", "Bosnia and Herzegovina", "Barbados",
"Bangladesh", "Belgium", "Burkina Faso", "Bulgaria", "Bahrain", "Burundi", "Benin", "Bermuda", "Brunei Darussalam", "Bolivia",
"Brazil", "Bahamas", "Bhutan", "Bouvet Island", "Botswana", "Belarus", "Belize", "Canada", "Cocos (Keeling) Islands", "Congo, The Democratic Republic of the",
"Central African Republic", "Congo", "Switzerland", "Cote D'Ivoire", "Cook Islands", "Chile", "Cameroon", "China", "Colombia", "Costa Rica",
"Cuba", "Cape Verde", "Christmas Island", "Cyprus", "Czech Republic", "Germany", "Djibouti", "Denmark", "Dominica", "Dominican Republic",
"Algeria", "Ecuador", "Estonia", "Egypt", "Western Sahara", "Eritrea", "Spain", "Ethiopia", "Finland", "Fiji",
"Falkland Islands (Malvinas)", "Micronesia, Federated States of", "Faroe Islands", "France", "Sint Maarten (Dutch part)", "Gabon", "United Kingdom", "Grenada", "Georgia", "French Guiana",
"Ghana", "Gibraltar", "Greenland", "Gambia", "Guinea", "Guadeloupe", "Equatorial Guinea", "Greece", "South Georgia and the South Sandwich Islands", "Guatemala",
"Guam", "Guinea-Bissau", "Guyana", "Hong Kong", "Heard Island and McDonald Islands", "Honduras", "Croatia", "Haiti", "Hungary", "Indonesia",
"Ireland", "Israel", "India", "British Indian Ocean Territory", "Iraq", "Iran, Islamic Republic of", "Iceland", "Italy", "Jamaica", "Jordan",
"Japan", "Kenya", "Kyrgyzstan", "Cambodia", "Kiribati", "Comoros", "Saint Kitts and Nevis", "Korea, Democratic People's Republic of", "Korea, Republic of", "Kuwait",
"Cayman Islands", "Kazakhstan", "Lao People's Democratic Republic", "Lebanon", "Saint Lucia", "Liechtenstein", "Sri Lanka", "Liberia", "Lesotho", "Lithuania",
"Luxembourg", "Latvia", "Libya", "Morocco", "Monaco", "Moldova, Republic of", "Madagascar", "Marshall Islands", "Macedonia", "Mali",
"Myanmar", "Mongolia", "Macau", "Northern Mariana Islands", "Martinique", "Mauritania", "Montserrat", "Malta", "Mauritius", "Maldives",
"Malawi", "Mexico", "Malaysia", "Mozambique", "Namibia", "New Caledonia", "Niger", "Norfolk Island", "Nigeria", "Nicaragua",
"Netherlands", "Norway", "Nepal", "Nauru", "Niue", "New Zealand", "Oman", "Panama", "Peru", "French Polynesia",
"Papua New Guinea", "Philippines", "Pakistan", "Poland", "Saint Pierre and Miquelon", "Pitcairn Islands", "Puerto Rico", "Palestinian Territory", "Portugal", "Palau",
"Paraguay", "Qatar", "Reunion", "Romania", "Russian Federation", "Rwanda", "Saudi Arabia", "Solomon Islands", "Seychelles", "Sudan",
"Sweden", "Singapore", "Saint Helena", "Slovenia", "Svalbard and Jan Mayen", "Slovakia", "Sierra Leone", "San Marino", "Senegal", "Somalia", "Suriname",
"Sao Tome and Principe", "El Salvador", "Syrian Arab Republic", "Swaziland", "Turks and Caicos Islands", "Chad", "French Southern Territories", "Togo", "Thailand",
"Tajikistan", "Tokelau", "Turkmenistan", "Tunisia", "Tonga", "Timor-Leste", "Turkey", "Trinidad and Tobago", "Tuvalu", "Taiwan",
"Tanzania, United Republic of", "Ukraine", "Uganda", "United States Minor Outlying Islands", "United States", "Uruguay", "Uzbekistan", "Holy See (Vatican City State)", "Saint Vincent and the Grenadines", "Venezuela",
"Virgin Islands, British", "Virgin Islands, U.S.", "Vietnam", "Vanuatu", "Wallis and Futuna", "Samoa", "Yemen", "Mayotte", "Serbia", "South Africa",
"Zambia", "Montenegro", "Zimbabwe", "Anonymous Proxy", "Satellite Provider", "Other", "Aland Islands", "Guernsey", "Isle of Man", "Jersey",
"Saint Barthelemy", "Saint Martin", "Bonaire, Saint Eustatius and Saba", "South Sudan", "Other" };
public LookupService(String databaseFile, int options)
{
try
{
lock (ioLock)
this.file = new FileStream(databaseFile, FileMode.Open, FileAccess.Read);
dboptions = options;
init();
}
catch(System.SystemException)
{
Console.WriteLine("cannot open file " + databaseFile);
}
}
public LookupService(String databaseFile):this(databaseFile, GEOIP_STANDARD) { }
private void init()
{
int i, j;
byte[] delim = new byte[3];
byte[] buf = new byte[SEGMENT_RECORD_LENGTH];
databaseType = (byte)DatabaseInfo.COUNTRY_EDITION;
recordLength = STANDARD_RECORD_LENGTH;
lock (ioLock)
{
file.Seek(-3,SeekOrigin.End);
for (i = 0; i < STRUCTURE_INFO_MAX_SIZE; i++)
{
file.Read(delim,0,3);
if (delim[0] == 255 && delim[1] == 255 && delim[2] == 255)
{
databaseType = Convert.ToByte(file.ReadByte());
if (databaseType >= 106)
{
// Backward compatibility with databases from April 2003 and earlier
databaseType -= 105;
}
// Determine the database type.
if (databaseType == DatabaseInfo.REGION_EDITION_REV0)
{
databaseSegments = new int[1];
databaseSegments[0] = STATE_BEGIN_REV0;
recordLength = STANDARD_RECORD_LENGTH;
}
else if (databaseType == DatabaseInfo.REGION_EDITION_REV1)
{
databaseSegments = new int[1];
databaseSegments[0] = STATE_BEGIN_REV1;
recordLength = STANDARD_RECORD_LENGTH;
}
else if (databaseType == DatabaseInfo.CITY_EDITION_REV0 ||
databaseType == DatabaseInfo.CITY_EDITION_REV1 ||
databaseType == DatabaseInfo.ORG_EDITION ||
databaseType == DatabaseInfo.ORG_EDITION_V6 ||
databaseType == DatabaseInfo.ISP_EDITION ||
databaseType == DatabaseInfo.ISP_EDITION_V6 ||
databaseType == DatabaseInfo.ASNUM_EDITION ||
databaseType == DatabaseInfo.ASNUM_EDITION_V6 ||
databaseType == DatabaseInfo.NETSPEED_EDITION_REV1 ||
databaseType == DatabaseInfo.NETSPEED_EDITION_REV1_V6 ||
databaseType == DatabaseInfo.CITY_EDITION_REV0_V6 ||
databaseType == DatabaseInfo.CITY_EDITION_REV1_V6)
{
databaseSegments = new int[1];
databaseSegments[0] = 0;
if (databaseType == DatabaseInfo.CITY_EDITION_REV0 ||
databaseType == DatabaseInfo.CITY_EDITION_REV1 ||
databaseType == DatabaseInfo.ASNUM_EDITION_V6 ||
databaseType == DatabaseInfo.NETSPEED_EDITION_REV1 ||
databaseType == DatabaseInfo.NETSPEED_EDITION_REV1_V6 ||
databaseType == DatabaseInfo.CITY_EDITION_REV0_V6 ||
databaseType == DatabaseInfo.CITY_EDITION_REV1_V6 ||
databaseType == DatabaseInfo.ASNUM_EDITION)
{
recordLength = STANDARD_RECORD_LENGTH;
}
else
{
recordLength = ORG_RECORD_LENGTH;
}
file.Read(buf,0,SEGMENT_RECORD_LENGTH);
for (j = 0; j < SEGMENT_RECORD_LENGTH; j++)
databaseSegments[0] += (unsignedByteToInt(buf[j]) << (j * 8));
}
break;
}
else
{
file.Seek(-4,SeekOrigin.Current);
}
}
if ((databaseType == DatabaseInfo.COUNTRY_EDITION) ||
(databaseType == DatabaseInfo.COUNTRY_EDITION_V6) ||
(databaseType == DatabaseInfo.PROXY_EDITION) ||
(databaseType == DatabaseInfo.NETSPEED_EDITION))
{
databaseSegments = new int[1];
databaseSegments[0] = COUNTRY_BEGIN;
recordLength = STANDARD_RECORD_LENGTH;
}
if ((dboptions & GEOIP_MEMORY_CACHE) == 1)
{
int l = (int) file.Length;
dbbuffer = new byte[l];
file.Seek(0,SeekOrigin.Begin);
file.Read(dbbuffer,0,l);
}
}
}
public void close()
{
try
{
lock (ioLock) { file.Close(); }
file = null;
}
catch (Exception) { }
}
public Country getCountry(IPAddress ipAddress)
{
return getCountry(bytestoLong(ipAddress.GetAddressBytes()));
}
public Country getCountryV6(String ipAddress)
{
IPAddress addr;
try
{
addr = IPAddress.Parse(ipAddress);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return UNKNOWN_COUNTRY;
}
return getCountryV6(addr);
}
public Country getCountry(String ipAddress)
{
IPAddress addr;
try
{
addr = IPAddress.Parse(ipAddress);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return UNKNOWN_COUNTRY;
}
return getCountry(bytestoLong(addr.GetAddressBytes()));
}
public Country getCountryV6(IPAddress ipAddress)
{
if (file == null)
{
throw new Exception("Database has been closed.");
}
if ((databaseType == DatabaseInfo.CITY_EDITION_REV1) |
(databaseType == DatabaseInfo.CITY_EDITION_REV0))
{
var l = getLocation(ipAddress);
if (l == null)
return UNKNOWN_COUNTRY;
else
return new Country(l.countryCode, l.countryName);
}
else
{
int ret = SeekCountryV6(ipAddress) - COUNTRY_BEGIN;
if (ret == 0)
return UNKNOWN_COUNTRY;
else
return new Country(countryCode[ret], countryName[ret]);
}
}
public Country getCountry(long ipAddress)
{
if (file == null)
throw new Exception("Database has been closed.");
if ((databaseType == DatabaseInfo.CITY_EDITION_REV1) |
(databaseType == DatabaseInfo.CITY_EDITION_REV0))
{
var l = getLocation(ipAddress);
if (l == null)
return UNKNOWN_COUNTRY;
else
return new Country(l.countryCode, l.countryName);
}
else
{
var ret = SeekCountry(ipAddress) - COUNTRY_BEGIN;
if (ret == 0)
return UNKNOWN_COUNTRY;
else
return new Country(countryCode[ret], countryName[ret]);
}
}
public int getID(String ipAddress)
{
IPAddress addr;
try
{
addr = IPAddress.Parse(ipAddress);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return 0;
}
return getID(bytestoLong(addr.GetAddressBytes()));
}
public int getID(IPAddress ipAddress)
{
return getID(bytestoLong(ipAddress.GetAddressBytes()));
}
public int getID(long ipAddress)
{
if (file == null)
throw new Exception("Database has been closed.");
int ret = SeekCountry(ipAddress) - databaseSegments[0];
return ret;
}
public DatabaseInfo getDatabaseInfo()
{
if (databaseInfo != null)
return databaseInfo;
try
{
// Synchronize since we're accessing the database file.
lock (ioLock)
{
bool hasStructureInfo = false;
byte [] delim = new byte[3];
// Advance to part of file where database info is stored.
file.Seek(-3,SeekOrigin.End);
for (int i=0; i<STRUCTURE_INFO_MAX_SIZE; i++)
{
file.Read(delim,0,3);
if (delim[0] == 255 && delim[1] == 255 && delim[2] == 255)
{
hasStructureInfo = true;
break;
}
file.Seek(-4,SeekOrigin.Current);
}
if (hasStructureInfo)
file.Seek(-6,SeekOrigin.Current);
else
{
// No structure info, must be pre Sep 2002 database, go back to end.
file.Seek(-3,SeekOrigin.End);
}
// Find the database info string.
for (int i=0; i<DATABASE_INFO_MAX_SIZE; i++)
{
file.Read(delim,0,3);
if (delim[0]==0 && delim[1]==0 && delim[2]==0)
{
byte[] dbInfo = new byte[i];
char[] dbInfo2 = new char[i];
file.Read(dbInfo,0,i);
for (int a0 = 0;a0 < i;a0++)
dbInfo2[a0] = Convert.ToChar(dbInfo[a0]);
// Create the database info object using the string.
this.databaseInfo = new DatabaseInfo(new String(dbInfo2));
return databaseInfo;
}
file.Seek(-4,SeekOrigin.Current);
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return new DatabaseInfo("");
}
public Region getRegion(IPAddress ipAddress)
{
return getRegion(bytestoLong(ipAddress.GetAddressBytes()));
}
public Region getRegion(String str)
{
IPAddress addr;
try
{
addr = IPAddress.Parse(str);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
return getRegion(bytestoLong(addr.GetAddressBytes()));
}
[MethodImpl(MethodImplOptions.Synchronized)]
public Region getRegion(long ipnum)
{
Region record = new Region();
int seek_region = 0;
if (databaseType == DatabaseInfo.REGION_EDITION_REV0)
{
seek_region = SeekCountry(ipnum) - STATE_BEGIN_REV0;
char [] ch = new char[2];
if (seek_region >= 1000)
{
record.countryCode = "US";
record.countryName = "United States";
ch[0] = (char)(((seek_region - 1000)/26) + 65);
ch[1] = (char)(((seek_region - 1000)%26) + 65);
record.region = new String(ch);
}
else
{
record.countryCode = countryCode[seek_region];
record.countryName = countryName[seek_region];
record.region = "";
}
}
else if (databaseType == DatabaseInfo.REGION_EDITION_REV1)
{
seek_region = SeekCountry(ipnum) - STATE_BEGIN_REV1;
char [] ch = new char[2];
if (seek_region < US_OFFSET)
{
record.countryCode = "";
record.countryName = "";
record.region = "";
} else if (seek_region < CANADA_OFFSET)
{
record.countryCode = "US";
record.countryName = "United States";
ch[0] = (char)(((seek_region - US_OFFSET)/26) + 65);
ch[1] = (char)(((seek_region - US_OFFSET)%26) + 65);
record.region = new String(ch);
} else if (seek_region < WORLD_OFFSET)
{
record.countryCode = "CA";
record.countryName = "Canada";
ch[0] = (char)(((seek_region - CANADA_OFFSET)/26) + 65);
ch[1] = (char)(((seek_region - CANADA_OFFSET)%26) + 65);
record.region = new String(ch);
}
else
{
record.countryCode = countryCode[(seek_region - WORLD_OFFSET) / FIPS_RANGE];
record.countryName = countryName[(seek_region - WORLD_OFFSET) / FIPS_RANGE];
record.region = "";
}
}
return record;
}
public Location getLocation(IPAddress addr)
{
return getLocation(bytestoLong(addr.GetAddressBytes()));
}
public Location getLocationV6(String str)
{
IPAddress addr;
try
{
addr = IPAddress.Parse(str);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
return getLocationV6(addr);
}
public Location getLocation(String str)
{
IPAddress addr;
try
{
addr = IPAddress.Parse(str);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
return getLocation(bytestoLong(addr.GetAddressBytes()));
}
[MethodImpl(MethodImplOptions.Synchronized)]
public Location getLocationV6(IPAddress addr)
{
int record_pointer;
byte[] record_buf = new byte[FULL_RECORD_LENGTH];
char[] record_buf2 = new char[FULL_RECORD_LENGTH];
int record_buf_offset = 0;
Location record = new Location();
int str_length = 0;
int j, Seek_country;
double latitude = 0, longitude = 0;
try
{
Seek_country = SeekCountryV6(addr);
if (Seek_country == databaseSegments[0])
return null;
record_pointer = Seek_country + ((2 * recordLength - 1) * databaseSegments[0]);
if ((dboptions & GEOIP_MEMORY_CACHE) == 1)
Array.Copy(dbbuffer, record_pointer, record_buf, 0, Math.Min(dbbuffer.Length - record_pointer, FULL_RECORD_LENGTH));
else
{
lock (ioLock)
{
file.Seek(record_pointer,SeekOrigin.Begin);
file.Read(record_buf,0,FULL_RECORD_LENGTH);
}
}
for (int a0 = 0;a0 < FULL_RECORD_LENGTH;a0++)
record_buf2[a0] = Convert.ToChar(record_buf[a0]);
// get country
record.countryCode = countryCode[unsignedByteToInt(record_buf[0])];
record.countryName = countryName[unsignedByteToInt(record_buf[0])];
record_buf_offset++;
// get region
while (record_buf[record_buf_offset + str_length] != '\0')
str_length++;
if (str_length > 0)
record.region = new String(record_buf2, record_buf_offset, str_length);
record_buf_offset += str_length + 1;
str_length = 0;
// get region_name
record.regionName = RegionName.getRegionName( record.countryCode, record.region );
// get city
while (record_buf[record_buf_offset + str_length] != '\0')
str_length++;
if (str_length > 0)
record.city = new String(record_buf2, record_buf_offset, str_length);
record_buf_offset += (str_length + 1);
str_length = 0;
// get postal code
while (record_buf[record_buf_offset + str_length] != '\0')
str_length++;
if (str_length > 0)
record.postalCode = new String(record_buf2, record_buf_offset, str_length);
record_buf_offset += (str_length + 1);
// get latitude
for (j = 0; j < 3; j++)
latitude += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
record.latitude = (float)latitude/10000 - 180;
record_buf_offset += 3;
// get longitude
for (j = 0; j < 3; j++)
longitude += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
record.longitude = (float)longitude/10000 - 180;
record.metro_code = record.dma_code = 0;
record.area_code = 0;
if (databaseType == DatabaseInfo.CITY_EDITION_REV1
||databaseType == DatabaseInfo.CITY_EDITION_REV1_V6)
{
// get metro_code
int metroarea_combo = 0;
if (record.countryCode == "US")
{
record_buf_offset += 3;
for (j = 0; j < 3; j++)
metroarea_combo += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
record.metro_code = record.dma_code = metroarea_combo/1000;
record.area_code = metroarea_combo % 1000;
}
}
}
catch (IOException)
{
Console.WriteLine("IO Exception while seting up segments");
}
return record;
}
[MethodImpl(MethodImplOptions.Synchronized)]
public Location getLocation(long ipnum)
{
int record_pointer;
byte[] record_buf = new byte[FULL_RECORD_LENGTH];
char[] record_buf2 = new char[FULL_RECORD_LENGTH];
int record_buf_offset = 0;
Location record = new Location();
int str_length = 0;
int j, Seek_country;
double latitude = 0, longitude = 0;
try
{
Seek_country = SeekCountry(ipnum);
if (Seek_country == databaseSegments[0])
return null;
record_pointer = Seek_country + ((2 * recordLength - 1) * databaseSegments[0]);
if ((dboptions & GEOIP_MEMORY_CACHE) == 1)
Array.Copy(dbbuffer, record_pointer, record_buf, 0, Math.Min(dbbuffer.Length - record_pointer, FULL_RECORD_LENGTH));
else
{
lock (ioLock)
{
file.Seek(record_pointer,SeekOrigin.Begin);
file.Read(record_buf,0,FULL_RECORD_LENGTH);
}
}
for (int a0 = 0;a0 < FULL_RECORD_LENGTH;a0++)
record_buf2[a0] = Convert.ToChar(record_buf[a0]);
// get country
record.countryCode = countryCode[unsignedByteToInt(record_buf[0])];
record.countryName = countryName[unsignedByteToInt(record_buf[0])];
record_buf_offset++;
// get region
while (record_buf[record_buf_offset + str_length] != '\0')
str_length++;
if (str_length > 0)
record.region = new String(record_buf2, record_buf_offset, str_length);
record_buf_offset += str_length + 1;
str_length = 0;
// get region_name
record.regionName = RegionName.getRegionName(record.countryCode, record.region);
// get city
while (record_buf[record_buf_offset + str_length] != '\0')
str_length++;
if (str_length > 0)
record.city = new String(record_buf2, record_buf_offset, str_length);
record_buf_offset += (str_length + 1);
str_length = 0;
// get postal code
while (record_buf[record_buf_offset + str_length] != '\0')
str_length++;
if (str_length > 0)
record.postalCode = new String(record_buf2, record_buf_offset, str_length);
record_buf_offset += (str_length + 1);
// get latitude
for (j = 0; j < 3; j++)
latitude += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
record.latitude = (float) latitude/10000 - 180;
record_buf_offset += 3;
// get longitude
for (j = 0; j < 3; j++)
longitude += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
record.longitude = (float) longitude/10000 - 180;
record.metro_code = record.dma_code = 0;
record.area_code = 0;
if (databaseType == DatabaseInfo.CITY_EDITION_REV1)
{
// get metro_code
int metroarea_combo = 0;
if (record.countryCode == "US"){
record_buf_offset += 3;
for (j = 0; j < 3; j++)
metroarea_combo += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
record.metro_code = record.dma_code = metroarea_combo/1000;
record.area_code = metroarea_combo % 1000;
}
}
}
catch (IOException)
{
Console.WriteLine("IO Exception while seting up segments");
}
return record;
}
public String getOrg(IPAddress addr)
{
return getOrg(bytestoLong(addr.GetAddressBytes()));
}
public String getOrgV6(String str)
{
IPAddress addr;
try
{
addr = IPAddress.Parse(str);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
return getOrgV6(addr);
}
public String getOrg(String str)
{
IPAddress addr;
try
{
addr = IPAddress.Parse(str);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
return getOrg(bytestoLong(addr.GetAddressBytes()));
}
[MethodImpl(MethodImplOptions.Synchronized)]
public String getOrgV6( IPAddress addr)
{
int Seek_org;
int record_pointer;
int str_length = 0;
byte[] buf = new byte[MAX_ORG_RECORD_LENGTH];
char[] buf2 = new char[MAX_ORG_RECORD_LENGTH];
String org_buf;
try
{
Seek_org = SeekCountryV6(addr);
if (Seek_org == databaseSegments[0])
return null;
record_pointer = Seek_org + (2 * recordLength - 1) * databaseSegments[0];
if ((dboptions & GEOIP_MEMORY_CACHE) == 1)
Array.Copy(dbbuffer, record_pointer, buf, 0, Math.Min(dbbuffer.Length - record_pointer, MAX_ORG_RECORD_LENGTH));
else
{
lock (ioLock)
{
file.Seek(record_pointer,SeekOrigin.Begin);
file.Read(buf,0,MAX_ORG_RECORD_LENGTH);
}
}
while (buf[str_length] != 0)
{
buf2[str_length] = Convert.ToChar(buf[str_length]);
str_length++;
}
buf2[str_length] = '\0';
org_buf = new String(buf2,0,str_length);
return org_buf;
}
catch (IOException)
{
Console.WriteLine("IO Exception");
return null;
}
}
[MethodImpl(MethodImplOptions.Synchronized)]
public String getOrg(long ipnum)
{
int Seek_org;
int record_pointer;
int str_length = 0;
byte [] buf = new byte[MAX_ORG_RECORD_LENGTH];
char [] buf2 = new char[MAX_ORG_RECORD_LENGTH];
String org_buf;
try
{
Seek_org = SeekCountry(ipnum);
if (Seek_org == databaseSegments[0])
return null;
record_pointer = Seek_org + (2 * recordLength - 1) * databaseSegments[0];
if ((dboptions & GEOIP_MEMORY_CACHE) == 1)
Array.Copy(dbbuffer, record_pointer, buf, 0, Math.Min(dbbuffer.Length - record_pointer, MAX_ORG_RECORD_LENGTH));
else
{
lock (ioLock)
{
file.Seek(record_pointer,SeekOrigin.Begin);
file.Read(buf,0,MAX_ORG_RECORD_LENGTH);
}
}
while (buf[str_length] != 0)
{
buf2[str_length] = Convert.ToChar(buf[str_length]);
str_length++;
}
buf2[str_length] = '\0';
org_buf = new String(buf2, 0, str_length);
return org_buf;
}
catch (IOException)
{
Console.WriteLine("IO Exception");
return null;
}
}
[MethodImpl(MethodImplOptions.Synchronized)]
int SeekCountryV6(IPAddress ipAddress)
{
byte [] v6vec = ipAddress.GetAddressBytes();
byte [] buf = new byte[2 * MAX_RECORD_LENGTH];
int [] x = new int[2];
int offset = 0;
for (int depth = 127; depth >= 0; depth--)
{
try
{
if ((dboptions & GEOIP_MEMORY_CACHE) == 1)
{
for (int i = 0;i < (2 * MAX_RECORD_LENGTH);i++)
buf[i] = dbbuffer[i+(2 * recordLength * offset)];
}
else
{
lock (ioLock)
{
file.Seek(2 * recordLength * offset,SeekOrigin.Begin);
file.Read(buf,0,2 * MAX_RECORD_LENGTH);
}
}
}
catch (IOException)
{
Console.WriteLine("IO Exception");
}
for (int i = 0; i<2; i++)
{
x[i] = 0;
for (int j = 0; j<recordLength; j++)
{
int y = buf[(i*recordLength)+j];
if (y < 0)
{
y+= 256;
}
x[i] += (y << (j * 8));
}
}
int bnum = 127 - depth;
int idx = bnum >> 3;
int b_mask = 1 << ( bnum & 7 ^ 7 );
if ((v6vec[idx] & b_mask) > 0)
{
if (x[1] >= databaseSegments[0])
{
return x[1];
}
offset = x[1];
}
else
{
if (x[0] >= databaseSegments[0])
{
return x[0];
}
offset = x[0];
}
}
// shouldn't reach here
Console.WriteLine("Error Seeking country while Seeking " + ipAddress);
return 0;
}
[MethodImpl(MethodImplOptions.Synchronized)]
int SeekCountry(long ipAddress)
{
byte [] buf = new byte[2 * MAX_RECORD_LENGTH];
int [] x = new int[2];
int offset = 0;
for (int depth = 31; depth >= 0; depth--)
{
try
{
if ((dboptions & GEOIP_MEMORY_CACHE) == 1)
{
for (int i = 0;i < (2 * MAX_RECORD_LENGTH);i++)
{
buf[i] = dbbuffer[i+(2 * recordLength * offset)];
}
}
else
{
lock (ioLock)
{
file.Seek(2 * recordLength * offset,SeekOrigin.Begin);
file.Read(buf, 0, 2 * MAX_RECORD_LENGTH);
}
}
}
catch (IOException)
{
Console.WriteLine("IO Exception");
}
for (int i = 0; i<2; i++)
{
x[i] = 0;
for (int j = 0; j<recordLength; j++)
{
int y = buf[(i*recordLength)+j];
if (y < 0)
y+= 256;
x[i] += (y << (j * 8));
}
}
if ((ipAddress & (1 << depth)) > 0)
{
if (x[1] >= databaseSegments[0])
return x[1];
offset = x[1];
}
else
{
if (x[0] >= databaseSegments[0])
return x[0];
offset = x[0];
}
}
// shouldn't reach here
Console.WriteLine("Error Seeking country while Seeking " + ipAddress);
return 0;
}
static long swapbytes(long ipAddress)
{
return (((ipAddress>>0) & 255) << 24) | (((ipAddress>>8) & 255) << 16)
| (((ipAddress>>16) & 255) << 8) | (((ipAddress>>24) & 255) << 0);
}
static long bytestoLong(byte [] address)
{
long ipnum = 0;
for (int i = 0; i < 4; ++i)
{
long y = address[i];
if (y < 0)
y += 256;
ipnum += y << ((3-i)*8);
}
return ipnum;
}
static int unsignedByteToInt(byte b)
{
return (int) b & 0xFF;
}
}
}

53
GeoIP/Region.cs Normal file
View File

@@ -0,0 +1,53 @@
#region Copyright & License Information
/*
* Copyright (C) 2008 MaxMind Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#endregion
using System;
using System.IO;
public class Region
{
public String countryCode;
public String countryName;
public String region;
public Region() { }
public Region(String countryCode,String countryName,String region)
{
this.countryCode = countryCode;
this.countryName = countryName;
this.region = region;
}
public String getcountryCode()
{
return countryCode;
}
public String getcountryName()
{
return countryName;
}
public String getregion()
{
return region;
}
}

4489
GeoIP/RegionName.cs Normal file

File diff suppressed because it is too large Load Diff

323
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: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 mods utility tsbuild
tools: editor ralint tsbuild
package: core editor
mods: mod_ra mod_cnc mod_d2k
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
@@ -24,19 +71,24 @@ fileformats_LIBS = $(COMMON_LIBS) thirdparty/Tao/Tao.Sdl.dll System.Windows.Form
PROGRAMS = fileformats
fileformats: $(fileformats_TARGET)
geoip_SRCS := $(shell find GeoIP/ -iname '*.cs')
geoip_TARGET = GeoIP.dll
geoip_KIND = library
geoip_LIBS = $(COMMON_LIBS)
PROGRAMS += geoip
geoip: $(geoip_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 +122,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) $(geoip_TARGET)
mod_ra_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(utility_TARGET) $(geoip_TARGET)
mod_ra_EXTRA_CMDS = mono --debug RALint.exe ra
PROGRAMS += mod_ra
mod_ra: $(mod_ra_TARGET)
@@ -101,15 +152,24 @@ mod_cnc: $(mod_cnc_TARGET)
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_DEPS = $(STD_MOD_DEPS) $(mod_ra_TARGET) $(mod_cnc_TARGET)
mod_d2k_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_ra_TARGET)
mod_d2k_EXTRA_CMDS = mono --debug RALint.exe d2k
PROGRAMS += mod_d2k
mod_d2k: $(mod_d2k_TARGET)
#
# Tools
#
# Tiberian Sun
mod_ts_SRCS := $(shell find OpenRA.Mods.TS/ -iname '*.cs')
mod_ts_TARGET = mods/ts/OpenRA.Mods.TS.dll
mod_ts_KIND = library
mod_ts_DEPS = $(STD_MOD_DEPS) $(mod_ra_TARGET)
mod_ts_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_ra_TARGET)
mod_ts_EXTRA_CMDS = mono --debug RALint.exe ts
PROGRAMS += mod_ts
mod_ts: $(mod_ts_TARGET)
##### Tools #####
# Map Editor
editor_SRCS := $(shell find OpenRA.Editor/ -iname '*.cs')
editor_TARGET = OpenRA.Editor.exe
@@ -141,23 +201,18 @@ 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.frmBuilder.resources -resource:OpenRA.TilesetBuilder.frmNew.resources -resource:OpenRA.TilesetBuilder.Surface.resources
tsbuild_EXTRA = -resource:OpenRA.TilesetBuilder.FormBuilder.resources -resource:OpenRA.TilesetBuilder.FormNew.resources -resource:OpenRA.TilesetBuilder.Surface.resources
PROGRAMS += tsbuild
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.FormBuilder.resources:
resgen2 OpenRA.TilesetBuilder/FormBuilder.resx OpenRA.TilesetBuilder.FormBuilder.resources 1> /dev/null
OpenRA.TilesetBuilder.FormNew.resources:
resgen2 OpenRA.TilesetBuilder/frmNew.resx OpenRA.TilesetBuilder.FormNew.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)
tsbuild: OpenRA.TilesetBuilder.FormBuilder.resources OpenRA.TilesetBuilder.FormNew.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')
@@ -168,11 +223,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
@@ -191,74 +248,130 @@ 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 tsbuild
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
@$(INSTALL_PROGRAM) -d $(INSTALL_DIR)/mods/ra
@$(INSTALL_PROGRAM) $(mod_ra_TARGET) $(INSTALL_DIR)/mods/ra
@$(INSTALL_PROGRAM) -d $(INSTALL_DIR)/mods/d2k
@$(INSTALL_PROGRAM) $(mod_d2k_TARGET) $(INSTALL_DIR)/mods/d2k
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
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
@-cp $(foreach f,$(shell ls mods/d2k --hide=*.dll),mods/d2k/$(f)) $(INSTALL_DIR)/mods/d2k
@cp -r mods/d2k/maps $(INSTALL_DIR)/mods/d2k
@cp -r mods/d2k/bits $(INSTALL_DIR)/mods/d2k
@cp -r mods/d2k/chrome $(INSTALL_DIR)/mods/d2k
@cp -r mods/d2k/rules $(INSTALL_DIR)/mods/d2k
@cp -r mods/d2k/tilesets $(INSTALL_DIR)/mods/d2k
@cp -r mods/d2k/uibits $(INSTALL_DIR)/mods/d2k
package: dependencies core editor docs version
@cp -r glsl $(INSTALL_DIR)
@cp -r cg $(INSTALL_DIR)
@cp *.ttf $(INSTALL_DIR)
@cp thirdparty/Tao/* $(INSTALL_DIR)
@$(INSTALL_PROGRAM) thirdparty/ICSharpCode.SharpZipLib.dll $(INSTALL_DIR)
mods: mod_ra mod_cnc mod_d2k mod_ts
@echo "#!/bin/sh" > openra
@echo "cd "$(datadir)"/openra" >> openra
@echo "exec mono "$(datadir)"/openra/OpenRA.Game.exe \"$$""@\"" >> openra
all: dependencies core tools
@echo "#!/bin/sh" > openra-editor
@echo "cd "$(datadir)"/openra" >> openra-editor
@echo "exec mono "$(datadir)"/openra/OpenRA.Editor.exe \"$$""@\"" >> openra-editor
clean:
@-$(RM_F) *.exe *.dll *.mdb mods/**/*.dll mods/**/*.mdb *.resources
@$(INSTALL_PROGRAM) -d $(BIN_INSTALL_DIR)
@$(INSTALL_PROGRAM) -m +rx openra $(BIN_INSTALL_DIR)
@$(INSTALL_PROGRAM) -m +rx openra-editor $(BIN_INSTALL_DIR)
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) "GeoIP.dat" "$(DATA_INSTALL_DIR)/GeoIP.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 $(DESTDIR)$(bindir)/openra-editor
@-$(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

@@ -14,9 +14,7 @@
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

View File

@@ -41,7 +41,7 @@ namespace OpenRA.Editor
{
var r = new TextBox();
r.Text = FieldSaver.FormatValue(getter(), t);
r.LostFocus += (e,_) => setter(FieldLoader.GetValue("<editor internals>", t, r.Text));
r.LostFocus += (e, _) => setter(FieldLoader.GetValue("<editor internals>", t, r.Text));
r.Enabled = false;
return r;
}

View File

@@ -17,12 +17,12 @@ namespace OpenRA.Editor
{
class ActorTool : ITool
{
ActorTemplate Actor;
public ActorTool(ActorTemplate actor) { this.Actor = actor; }
ActorTemplate actorTemplate;
public ActorTool(ActorTemplate actor) { this.actorTemplate = actor; }
public void Preview(Surface surface, SGraphics g)
{
surface.DrawActor(g, surface.GetBrushLocation(), Actor,
surface.DrawActor(g, surface.GetBrushLocation(), actorTemplate,
surface.GetPaletteForPlayer(surface.NewActorOwner));
}
@@ -33,17 +33,17 @@ namespace OpenRA.Editor
var owner = surface.NewActorOwner;
var id = NextActorName(surface);
surface.Map.Actors.Value[id] = new ActorReference(Actor.Info.Name.ToLowerInvariant())
surface.Map.Actors.Value[id] = new ActorReference(actorTemplate.Info.Name.ToLowerInvariant())
{
new LocationInit( surface.GetBrushLocation() ),
new OwnerInit( owner)
new LocationInit(surface.GetBrushLocation()),
new OwnerInit(owner)
};
}
string NextActorName(Surface surface)
{
var id = 0;
for (; ; )
for (;;)
{
var possible = "Actor{0}".F(id++);
if (!surface.Map.Actors.Value.ContainsKey(possible)) return possible;

View File

@@ -19,15 +19,15 @@ namespace OpenRA.Editor
{
class BrushTool : ITool
{
BrushTemplate Brush;
BrushTemplate brushTemplate;
public BrushTool(BrushTemplate brush) { this.Brush = brush; }
public BrushTool(BrushTemplate brush) { this.brushTemplate = brush; }
public void Apply(Surface surface)
{
// change the bits in the map
var template = surface.TileSet.Templates[Brush.N];
var tile = template.Data;
var template = surface.TileSet.Templates[brushTemplate.N];
var tile = surface.TileSetRenderer.Data(brushTemplate.N);
var pos = surface.GetBrushLocation();
if (surface.GetModifiers() == Keys.Shift)
@@ -42,11 +42,11 @@ namespace OpenRA.Editor
if (surface.Map.IsInMap(new CVec(u, v) + pos))
{
var z = u + v * template.Size.X;
if (tile.TileBitmapBytes[z] != null)
if (tile[z] != null)
surface.Map.MapTiles.Value[u + pos.X, v + pos.Y] =
new TileReference<ushort, byte>
{
type = Brush.N,
type = brushTemplate.N,
index = template.PickAny ? (byte)((u + pos.X) % 4 + ((v + pos.Y) % 4) * 4) : (byte)z,
};
@@ -62,11 +62,11 @@ namespace OpenRA.Editor
public void Preview(Surface surface, SGraphics g)
{
g.DrawImage(Brush.Bitmap,
surface.TileSet.TileSize * surface.GetBrushLocation().X * surface.Zoom + surface.GetOffset().X,
surface.TileSet.TileSize * surface.GetBrushLocation().Y * surface.Zoom + surface.GetOffset().Y,
Brush.Bitmap.Width * surface.Zoom,
Brush.Bitmap.Height * surface.Zoom);
g.DrawImage(brushTemplate.Bitmap,
surface.TileSetRenderer.TileSize.Width * surface.GetBrushLocation().X * surface.Zoom + surface.GetOffset().X,
surface.TileSetRenderer.TileSize.Height * surface.GetBrushLocation().Y * surface.Zoom + surface.GetOffset().Y,
brushTemplate.Bitmap.Width * surface.Zoom,
brushTemplate.Bitmap.Height * surface.Zoom);
}
void FloodFillWithBrush(Surface s, CPos pos)
@@ -96,7 +96,7 @@ namespace OpenRA.Editor
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 };
s.Map.MapTiles.Value[x, p.Y] = new TileReference<ushort, byte> { type = brushTemplate.N, index = (byte)0 };
if (s.Map.MapTiles.Value[x, p.Y - 1].Equals(replace))
maybeEnqueue(x, p.Y - 1);
if (s.Map.MapTiles.Value[x, p.Y + 1].Equals(replace))
@@ -104,14 +104,14 @@ namespace OpenRA.Editor
}
}
/* todo: optimize */
/* TODO: optimize */
foreach (var ch in s.Chunks.Values) ch.Dispose();
s.Chunks.Clear();
}
CPos FindEdge(Surface s, CPos p, CVec d, TileReference<ushort, byte> replace)
{
for (; ; )
for (;;)
{
var q = p + d;
if (!s.Map.IsInMap(q)) return p;

View File

@@ -24,9 +24,7 @@ namespace OpenRA.Editor
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

View File

@@ -15,7 +15,7 @@ namespace OpenRA.Editor
{
public partial class ErrorListDialog : Form
{
public ErrorListDialog( IEnumerable<string> errors )
public ErrorListDialog(IEnumerable<string> errors)
{
InitializeComponent();
foreach (var e in errors)

File diff suppressed because it is too large Load Diff

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,
@@ -42,14 +42,17 @@ namespace OpenRA.Editor
tilePalette.ResumeLayout();
actorPalette.ResumeLayout();
resourcePalette.ResumeLayout();
surface1.Bind(null, null, null, null);
pmMiniMap.Image = null;
surface1.Bind(null, null, null, null, null);
miniMapBox.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;
};
@@ -66,12 +69,13 @@ namespace OpenRA.Editor
void OnMapChanged()
{
MakeDirty();
pmMiniMap.Image = Minimap.AddStaticResources(surface1.Map, Minimap.TerrainBitmap(surface1.Map, true));
miniMapBox.Image = Minimap.AddStaticResources(surface1.Map, Minimap.TerrainBitmap(surface1.Map, true));
cashToolStripStatusLabel.Text = CalculateTotalResource().ToString();
}
void ActorDoubleClicked(KeyValuePair<string,ActorReference> kv)
void ActorDoubleClicked(KeyValuePair<string, ActorReference> kv)
{
using( var apd = new ActorPropertiesDialog() )
using (var apd = new ActorPropertiesDialog())
{
var name = kv.Key;
apd.AddRow("(Name)", apd.MakeEditorControl(typeof(string), () => name, v => name = (string)v));
@@ -80,11 +84,11 @@ namespace OpenRA.Editor
var objSaved = kv.Value.Save();
// TODO: make this work properly
foreach( var init in Rules.Info[kv.Value.Type].GetInitKeys() )
foreach (var init in Rules.Info[kv.Value.Type].GetInitKeys())
apd.AddRow(init.First,
apd.MakeEditorControl(init.Second,
() => objSaved.NodesDict.ContainsKey( init.First ) ? objSaved.NodesDict[init.First].Value : null,
_ => {}));
() => objSaved.NodesDict.ContainsKey(init.First) ? objSaved.NodesDict[init.First].Value : null,
_ => { }));
apd.ShowDialog();
@@ -97,6 +101,7 @@ namespace OpenRA.Editor
string loadedMapName;
string currentMod = "ra";
TileSet tileset;
TileSetRenderer tilesetRenderer;
bool dirty = false;
void LoadMap(string mapname)
@@ -117,6 +122,9 @@ namespace OpenRA.Editor
PrepareMapResources(Game.modData.Manifest, map);
// Calculate total net worth of resources in cash
cashToolStripStatusLabel.Text = CalculateTotalResource().ToString();
dirty = false;
}
@@ -137,20 +145,21 @@ namespace OpenRA.Editor
{
Rules.LoadRules(manifest, map);
tileset = Rules.TileSets[map.Tileset];
tileset.LoadTiles();
int[] ShadowIndex = { 3, 4 };
var palette = new Palette(FileSystem.Open(tileset.Palette), ShadowIndex);
tilesetRenderer = new TileSetRenderer(tileset, new Size(manifest.TileSize, manifest.TileSize));
var shadowIndex = new int[] { 3, 4 };
var palette = new Palette(FileSystem.Open(tileset.Palette), shadowIndex);
// required for desert terrain in RA
var playerPalette = tileset.PlayerPalette ?? tileset.Palette;
var PlayerPalette = new Palette(FileSystem.Open(playerPalette), ShadowIndex);
var shadowedPalette = new Palette(FileSystem.Open(playerPalette), shadowIndex);
surface1.Bind(map, tileset, tilesetRenderer, palette, shadowedPalette);
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(); }
string[] templateOrder = tileset.EditorTemplateOrder ?? new string[]{};
var templateOrder = tileset.EditorTemplateOrder ?? new string[] { };
foreach (var tc in tileset.Templates.GroupBy(t => t.Value.Category).OrderBy(t => templateOrder.ToList().IndexOf(t.Key)))
{
var category = tc.Key ?? "(Uncategorized)";
@@ -164,19 +173,20 @@ namespace OpenRA.Editor
TextAlign = ContentAlignment.MiddleLeft,
Width = tilePalette.ClientSize.Width,
};
// hook this manually, anchoring inside FlowLayoutPanel is flaky.
tilePalette.Resize += (_,e) => categoryHeader.Width = tilePalette.ClientSize.Width;
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 )
foreach (var t in tc)
{
try
{
var bitmap = tileset.RenderTemplate((ushort)t.Key, palette);
var bitmap = tilesetRenderer.RenderTemplate((ushort)t.Key, palette);
var ibox = new PictureBox
{
Image = bitmap,
@@ -190,12 +200,7 @@ namespace OpenRA.Editor
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));
tt.SetToolTip(ibox, "{1}:{0} ({2}x{3})".F(template.Image, template.Id, template.Size.X, template.Size.Y));
}
catch { }
}
@@ -216,13 +221,14 @@ namespace OpenRA.Editor
if (etf != null && etf.RequireTilesets != null
&& !etf.RequireTilesets.Contains(tileset.Id)) continue;
var TemplatePalette = PlayerPalette;
var templatePalette = shadowedPalette;
var rsi = info.Traits.GetOrDefault<RenderSimpleInfo>();
// exception for desert buildings
if (rsi != null && rsi.Palette != null && rsi.Palette.Contains("terrain"))
TemplatePalette = palette;
templatePalette = palette;
var template = RenderUtils.RenderActor(info, tileset, TemplatePalette);
var template = RenderUtils.RenderActor(info, tileset, templatePalette);
var ibox = new PictureBox
{
Image = template.Bitmap,
@@ -236,9 +242,7 @@ namespace OpenRA.Editor
actorPalette.Controls.Add(ibox);
tt.SetToolTip(ibox,
"{0}".F(
info.Name));
tt.SetToolTip(ibox, "{0}".F(info.Name));
actorTemplates.Add(template);
}
@@ -253,7 +257,7 @@ namespace OpenRA.Editor
{
try
{
var template = RenderUtils.RenderResourceType(a, tileset.Extensions, PlayerPalette);
var template = RenderUtils.RenderResourceType(a, tileset.Extensions, shadowedPalette);
var ibox = new PictureBox
{
Image = template.Bitmap,
@@ -263,16 +267,11 @@ namespace OpenRA.Editor
BorderStyle = BorderStyle.FixedSingle
};
ibox.Click += (_, e) => surface1.SetTool(new ResourceTool(template));
resourcePalette.Controls.Add(ibox);
tt.SetToolTip(ibox,
"{0}:{1}cr".F(
template.Info.Name,
template.Info.ValuePerUnit));
tt.SetToolTip(ibox, "{0}:{1}cr".F(template.Info.Name, template.Info.ValuePerUnit));
resourceTemplates.Add(template);
}
@@ -287,13 +286,16 @@ namespace OpenRA.Editor
p.ResumeLayout();
}
pmMiniMap.Image = Minimap.AddStaticResources(surface1.Map, Minimap.TerrainBitmap(surface1.Map, true));
miniMapBox.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?
miniMapToPng.Enabled = true;
PopulateActorOwnerChooser();
}
@@ -310,25 +312,25 @@ namespace OpenRA.Editor
{
using (var rd = new ResizeDialog())
{
rd.width.Value = surface1.Map.MapSize.X;
rd.height.Value = surface1.Map.MapSize.Y;
rd.cordonLeft.Value = surface1.Map.Bounds.Left;
rd.cordonTop.Value = surface1.Map.Bounds.Top;
rd.cordonRight.Value = surface1.Map.Bounds.Right;
rd.cordonBottom.Value = surface1.Map.Bounds.Bottom;
rd.MapWidth.Value = surface1.Map.MapSize.X;
rd.MapHeight.Value = surface1.Map.MapSize.Y;
rd.CordonLeft.Value = surface1.Map.Bounds.Left;
rd.CordonTop.Value = surface1.Map.Bounds.Top;
rd.CordonRight.Value = surface1.Map.Bounds.Right;
rd.CordonBottom.Value = surface1.Map.Bounds.Bottom;
if (DialogResult.OK != rd.ShowDialog())
return;
surface1.Map.ResizeCordon((int)rd.cordonLeft.Value,
(int)rd.cordonTop.Value,
(int)rd.cordonRight.Value,
(int)rd.cordonBottom.Value);
surface1.Map.ResizeCordon((int)rd.CordonLeft.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)
if ((int)rd.MapWidth.Value != surface1.Map.MapSize.X || (int)rd.MapHeight.Value != surface1.Map.MapSize.Y)
{
surface1.Map.Resize((int)rd.width.Value, (int)rd.height.Value);
surface1.Bind(surface1.Map, surface1.TileSet, surface1.Palette, surface1.PlayerPalette); // rebind it to invalidate all caches
surface1.Map.Resize((int)rd.MapWidth.Value, (int)rd.MapHeight.Value);
surface1.Bind(surface1.Map, surface1.TileSet, surface1.TileSetRenderer, surface1.Palette, surface1.PlayerPalette); // rebind it to invalidate all caches
}
surface1.Invalidate();
@@ -344,25 +346,24 @@ namespace OpenRA.Editor
surface1.Map.Save(loadedMapName);
dirty = false;
}
}
void SaveAsClicked(object sender, EventArgs e)
{
using (var nms = new MapSelect(currentMod))
{
nms.txtNew.ReadOnly = false;
nms.btnOk.Text = "Save";
nms.txtNew.Text = "unnamed";
nms.txtPathOut.ReadOnly = false;
nms.NewText.ReadOnly = false;
nms.ButtonOkay.Text = "Save";
nms.NewText.Text = "unnamed";
nms.PathOutText.ReadOnly = false;
if (DialogResult.OK == nms.ShowDialog())
{
if (nms.txtNew.Text == "")
nms.txtNew.Text = "unnamed";
if (nms.NewText.Text == "")
nms.NewText.Text = "unnamed";
// TODO: Allow the user to choose map format (directory vs oramap)
loadedMapName = Path.Combine(nms.MapFolderPath, nms.txtNew.Text + ".oramap");
loadedMapName = Path.Combine(nms.MapFolderPath, nms.NewText.Text + ".oramap");
SaveClicked(sender, e);
}
}
@@ -372,12 +373,12 @@ namespace OpenRA.Editor
{
using (var nms = new MapSelect(currentMod))
{
nms.txtNew.ReadOnly = true;
nms.txtPathOut.ReadOnly = true;
nms.btnOk.Text = "Open";
nms.NewText.ReadOnly = true;
nms.PathOutText.ReadOnly = true;
nms.ButtonOkay.Text = "Open";
if (DialogResult.OK == nms.ShowDialog())
LoadMap(nms.txtNew.Tag as string);
LoadMap(nms.NewText.Tag as string);
}
}
@@ -385,17 +386,17 @@ namespace OpenRA.Editor
{
using (var nmd = new NewMapDialog())
{
nmd.theater.Items.Clear();
nmd.theater.Items.AddRange(Rules.TileSets.Select(a => a.Value.Id).ToArray());
nmd.theater.SelectedIndex = 0;
nmd.TheaterBox.Items.Clear();
nmd.TheaterBox.Items.AddRange(Rules.TileSets.Select(a => a.Value.Id).ToArray());
nmd.TheaterBox.SelectedIndex = 0;
if (DialogResult.OK == nmd.ShowDialog())
{
var map = Map.FromTileset(nmd.theater.SelectedItem as string);
var map = Map.FromTileset(nmd.TheaterBox.SelectedItem as string);
map.Resize((int)nmd.width.Value, (int)nmd.height.Value);
map.ResizeCordon((int)nmd.cordonLeft.Value, (int)nmd.cordonTop.Value,
(int)nmd.cordonRight.Value, (int)nmd.cordonBottom.Value);
map.Resize((int)nmd.MapWidth.Value, (int)nmd.MapHeight.Value);
map.ResizeCordon((int)nmd.CordonLeft.Value, (int)nmd.CordonTop.Value,
(int)nmd.CordonRight.Value, (int)nmd.CordonBottom.Value);
map.Players.Clear();
map.MakeDefaultPlayers();
@@ -409,20 +410,20 @@ namespace OpenRA.Editor
{
using (var pd = new PropertiesDialog())
{
pd.title.Text = surface1.Map.Title;
pd.desc.Text = surface1.Map.Description;
pd.author.Text = surface1.Map.Author;
pd.selectable.Checked = surface1.Map.Selectable;
pd.useAsShellmap.Checked = surface1.Map.UseAsShellmap;
pd.TitleBox.Text = surface1.Map.Title;
pd.DescBox.Text = surface1.Map.Description;
pd.AuthorBox.Text = surface1.Map.Author;
pd.SelectableCheckBox.Checked = surface1.Map.Selectable;
pd.ShellmapCheckBox.Checked = surface1.Map.UseAsShellmap;
if (DialogResult.OK != pd.ShowDialog())
return;
surface1.Map.Title = pd.title.Text;
surface1.Map.Description = pd.desc.Text;
surface1.Map.Author = pd.author.Text;
surface1.Map.Selectable = pd.selectable.Checked;
surface1.Map.UseAsShellmap = pd.useAsShellmap.Checked;
surface1.Map.Title = pd.TitleBox.Text;
surface1.Map.Description = pd.DescBox.Text;
surface1.Map.Author = pd.AuthorBox.Text;
surface1.Map.Selectable = pd.SelectableCheckBox.Checked;
surface1.Map.UseAsShellmap = pd.ShellmapCheckBox.Checked;
}
}
@@ -480,26 +481,31 @@ namespace OpenRA.Editor
void ExportMinimap(object sender, EventArgs e)
{
using( var sfd = new SaveFileDialog() {
using (var sfd = new SaveFileDialog()
{
InitialDirectory = Path.Combine(Environment.CurrentDirectory, "maps"),
DefaultExt = "*.png",
Filter = "PNG Image (*.png)|*.png",
Title = "Export Minimap to PNG",
FileName = Path.ChangeExtension(loadedMapName, ".png"),
RestoreDirectory = true } )
if (DialogResult.OK == sfd.ShowDialog())
pmMiniMap.Image.Save(sfd.FileName);
RestoreDirectory = true
})
if (DialogResult.OK == sfd.ShowDialog())
miniMapBox.Image.Save(sfd.FileName);
}
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();
}
@@ -514,8 +520,7 @@ namespace OpenRA.Editor
{
var tr = surface1.Map.MapTiles.Value[i, j];
if (tr.type == 0xff || tr.type == 0xffff || tr.type == 1 || tr.type == 2)
tr.index = (byte)r.Next(0,
Rules.TileSets[surface1.Map.Tileset].Templates[tr.type].Data.TileBitmapBytes.Count);
tr.index = (byte)r.Next(0, surface1.TileSetRenderer.Data(tr.type).Count);
surface1.Map.MapTiles.Value[i, j] = tr;
}
@@ -547,11 +552,11 @@ namespace OpenRA.Editor
if (player == null)
return;
var color = player.ColorRamp.GetColor(0);
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 );
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 OnSelectedPlayerChanged(object sender, EventArgs e)
@@ -560,9 +565,192 @@ namespace OpenRA.Editor
surface1.NewActorOwner = player.Name;
}
private void copySelectionToolStripMenuItem_Click(object sender, EventArgs e)
void CopySelectionToolStripMenuItemClick(object sender, EventArgs e)
{
surface1.CopySelection();
}
void OpenRAWebsiteToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://www.open-ra.org");
}
void OpenRAResourcesToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://content.open-ra.org");
}
void WikiDocumentationToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA/wiki");
}
void DiscussionForumsToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://www.sleipnirstuff.com/forum/viewforum.php?f=80");
}
void IssueTrackerToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA/issues");
}
void DeveloperBountiesToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.bountysource.com/#repos/OpenRA/OpenRA");
}
void SourceCodeToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA");
}
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);
}
void HelpToolStripButton_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA/wiki/Mapping");
}
void ToolStripMenuItemNewClick(object sender, EventArgs e)
{
NewClicked(sender, e);
}
void ToolStripMenuItemOpenClick(object sender, EventArgs e)
{
OpenClicked(sender, e);
}
void ToolStripMenuItemSaveClick(object sender, EventArgs e)
{
SaveClicked(sender, e);
}
void ToolStripMenuItemPropertiesClick(object sender, EventArgs e)
{
PropertiesClicked(sender, e);
}
void ToolStripMenuItemResizeClick(object sender, EventArgs e)
{
ResizeClicked(sender, e);
}
void ToolStripMenuItemShowActorNamesClick(object sender, EventArgs e)
{
ShowActorNamesClicked(sender, e);
}
void ToolStripMenuItemFixOpenAreasClick(object sender, EventArgs e)
{
FixOpenAreas(sender, e);
}
void ToolStripMenuItemSetupDefaultPlayersClick(object sender, EventArgs e)
{
SetupDefaultPlayers(sender, e);
}
void ToolStripMenuItemCopySelectionClick(object sender, EventArgs e)
{
CopySelectionToolStripMenuItemClick(sender, e);
}
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,90 +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="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="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
</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==
</value>
</data>
<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">
@@ -253,50 +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/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/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

@@ -23,7 +23,7 @@ namespace OpenRA.Editor
public class LegacyMapImporter
{
// Mapping from ra overlay index to type string
static string[] raOverlayNames =
static string[] redAlertOverlayNames =
{
"sbag", "cycl", "brik", "fenc", "wood",
"gold01", "gold02", "gold03", "gold04",
@@ -34,73 +34,77 @@ namespace OpenRA.Editor
static Dictionary<string, Pair<byte, byte>> overlayResourceMapping = new Dictionary<string, Pair<byte, byte>>()
{
// RA Gems, Gold
{ "gold01", new Pair<byte,byte>(1,0) },
{ "gold02", new Pair<byte,byte>(1,1) },
{ "gold03", new Pair<byte,byte>(1,2) },
{ "gold04", new Pair<byte,byte>(1,3) },
// RA Gold & Gems
{ "gold01", new Pair<byte, byte>(1, 0) },
{ "gold02", new Pair<byte, byte>(1, 1) },
{ "gold03", new Pair<byte, byte>(1, 2) },
{ "gold04", new Pair<byte, byte>(1, 3) },
{ "gem01", new Pair<byte, byte>(2, 0) },
{ "gem02", new Pair<byte, byte>(2, 1) },
{ "gem03", new Pair<byte, byte>(2, 2) },
{ "gem04", new Pair<byte, byte>(2, 3) },
{ "gem01", new Pair<byte,byte>(2,0) },
{ "gem02", new Pair<byte,byte>(2,1) },
{ "gem03", new Pair<byte,byte>(2,2) },
{ "gem04", new Pair<byte,byte>(2,3) },
// cnc tiberium
{ "ti1", new Pair<byte,byte>(1,0) },
{ "ti2", new Pair<byte,byte>(1,1) },
{ "ti3", new Pair<byte,byte>(1,2) },
{ "ti4", new Pair<byte,byte>(1,3) },
{ "ti5", new Pair<byte,byte>(1,4) },
{ "ti6", new Pair<byte,byte>(1,5) },
{ "ti7", new Pair<byte,byte>(1,6) },
{ "ti8", new Pair<byte,byte>(1,7) },
{ "ti9", new Pair<byte,byte>(1,8) },
{ "ti10", new Pair<byte,byte>(1,9) },
{ "ti11", new Pair<byte,byte>(1,10) },
{ "ti12", new Pair<byte,byte>(1,11) },
// CnC Tiberium
{ "ti1", new Pair<byte, byte>(1, 0) },
{ "ti2", new Pair<byte, byte>(1, 1) },
{ "ti3", new Pair<byte, byte>(1, 2) },
{ "ti4", new Pair<byte, byte>(1, 3) },
{ "ti5", new Pair<byte, byte>(1, 4) },
{ "ti6", new Pair<byte, byte>(1, 5) },
{ "ti7", new Pair<byte, byte>(1, 6) },
{ "ti8", new Pair<byte, byte>(1, 7) },
{ "ti9", new Pair<byte, byte>(1, 8) },
{ "ti10", new Pair<byte, byte>(1, 9) },
{ "ti11", new Pair<byte, byte>(1, 10) },
{ "ti12", new Pair<byte, byte>(1, 11) },
};
static Dictionary<string, string> overlayActorMapping = new Dictionary<string, string>() {
// Fences
{"sbag","sbag"},
{"cycl","cycl"},
{"brik","brik"},
{"fenc","fenc"},
{"wood","wood"},
{ "sbag", "sbag" },
{ "cycl", "cycl" },
{ "brik", "brik" },
{ "fenc", "fenc" },
{ "wood", "wood" },
// Fields
{"v12","v12"},
{"v13","v13"},
{"v14","v14"},
{"v15","v15"},
{"v16","v16"},
{"v17","v17"},
{"v18","v18"},
{ "v12", "v12" },
{ "v13", "v13" },
{ "v14", "v14" },
{ "v15", "v15" },
{ "v16", "v16" },
{ "v17", "v17" },
{ "v18", "v18" },
// Crates
// {"wcrate","crate"},
// {"scrate","crate"},
// { "wcrate", "crate" },
// { "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;
int ActorCount = 0;
Map Map = new Map();
List<string> Players = new List<string>();
static string Truncate(string s, int maxLength)
{
return s.Length <= maxLength ? s : s.Substring(0, maxLength);
}
int mapSize;
int actorCount = 0;
Map map = new Map();
List<string> players = new List<string>();
Action<string> errorHandler;
LegacyMapImporter(string filename, Action<string> errorHandler)
@@ -112,36 +116,35 @@ namespace OpenRA.Editor
public static Map Import(string filename, Action<string> errorHandler)
{
var converter = new LegacyMapImporter(filename, errorHandler);
return converter.Map;
return converter.map;
}
enum IniMapFormat { RedAlert = 3, /* otherwise, cnc (2 variants exist, we don't care to differentiate) */ };
enum IniMapFormat { RedAlert = 3 } // otherwise, cnc (2 variants exist, we don't care to differentiate)
public void ConvertIniMap(string iniFile)
{
var file = new IniFile(FileSystem.Open(iniFile));
var basic = file.GetSection("Basic");
var map = file.GetSection("Map");
var mapSection = file.GetSection("Map");
var legacyMapFormat = (IniMapFormat)int.Parse(basic.GetValue("NewINIFormat", "0"));
var XOffset = int.Parse(map.GetValue("X", "0"));
var YOffset = int.Parse(map.GetValue("Y", "0"));
var Width = int.Parse(map.GetValue("Width", "0"));
var Height = int.Parse(map.GetValue("Height", "0"));
MapSize = (legacyMapFormat == IniMapFormat.RedAlert) ? 128 : 64;
var offsetX = int.Parse(mapSection.GetValue("X", "0"));
var offsetY = int.Parse(mapSection.GetValue("Y", "0"));
var width = int.Parse(mapSection.GetValue("Width", "0"));
var height = int.Parse(mapSection.GetValue("Height", "0"));
mapSize = (legacyMapFormat == IniMapFormat.RedAlert) ? 128 : 64;
Map.Title = basic.GetValue("Name", "(null)");
Map.Author = "Westwood Studios";
Map.Tileset = Truncate(map.GetValue("Theater", "TEMPERAT"), 8);
Map.MapSize.X = MapSize;
Map.MapSize.Y = MapSize;
Map.Bounds = Rectangle.FromLTRB(XOffset, YOffset, XOffset + Width, YOffset + Height);
Map.Selectable = true;
map.Title = basic.GetValue("Name", "(null)");
map.Author = "Westwood Studios";
map.Tileset = Truncate(mapSection.GetValue("Theater", "TEMPERAT"), 8);
map.MapSize.X = mapSize;
map.MapSize.Y = mapSize;
map.Bounds = Rectangle.FromLTRB(offsetX, offsetY, offsetX + width, offsetY + height);
map.Selectable = true;
Map.Smudges = Lazy.New(() => new List<SmudgeReference>());
Map.Actors = Lazy.New(() => new Dictionary<string, ActorReference>());
Map.MapResources = Lazy.New(() => new TileReference<byte, byte>[MapSize, MapSize]);
Map.MapTiles = Lazy.New(() => new TileReference<ushort, byte>[MapSize, MapSize]);
map.Smudges = Lazy.New(() => new List<SmudgeReference>());
map.Actors = Lazy.New(() => new Dictionary<string, ActorReference>());
map.MapResources = Lazy.New(() => new TileReference<byte, byte>[mapSize, mapSize]);
map.MapTiles = Lazy.New(() => new TileReference<ushort, byte>[mapSize, mapSize]);
if (legacyMapFormat == IniMapFormat.RedAlert)
{
@@ -149,8 +152,9 @@ namespace OpenRA.Editor
UnpackRAOverlayData(ReadPackedSection(file.GetSection("OverlayPack")));
ReadRATrees(file);
}
else // CNC
else
{
// CnC
UnpackCncTileData(FileSystem.Open(iniFile.Substring(0, iniFile.Length - 4) + ".bin"));
ReadCncOverlay(file);
ReadCncTrees(file);
@@ -161,25 +165,23 @@ namespace OpenRA.Editor
LoadActors(file, "INFANTRY");
LoadSmudges(file, "SMUDGE");
foreach (var p in Players)
LoadPlayer(file, p, (legacyMapFormat == IniMapFormat.RedAlert));
foreach (var p in players)
LoadPlayer(file, p, legacyMapFormat == IniMapFormat.RedAlert);
var wps = file.GetSection("Waypoints")
.Where(kv => int.Parse(kv.Value) > 0)
.Select(kv => Pair.New(int.Parse(kv.Key),
LocationFromMapOffset(int.Parse(kv.Value), MapSize)))
LocationFromMapOffset(int.Parse(kv.Value), mapSize)))
.ToArray();
// Add waypoint actors
foreach( var kv in wps )
foreach (var kv in wps)
{
var a = new ActorReference("waypoint");
a.Add(new LocationInit((CPos)kv.Second));
a.Add(new OwnerInit("Neutral"));
Map.Actors.Value.Add("waypoint" + kv.First, a);
map.Actors.Value.Add("waypoint" + kv.First, a);
}
}
static int2 LocationFromMapOffset(int offset, int mapSize)
@@ -190,7 +192,7 @@ namespace OpenRA.Editor
static MemoryStream ReadPackedSection(IniSection mapPackSection)
{
var sb = new StringBuilder();
for (int i = 1; ; i++)
for (int i = 1;; i++)
{
var line = mapPackSection.GetValue(i.ToString(), null);
if (line == null)
@@ -246,38 +248,38 @@ namespace OpenRA.Editor
void UnpackRATileData(MemoryStream ms)
{
for (int i = 0; i < MapSize; i++)
for (int j = 0; j < MapSize; j++)
Map.MapTiles.Value[i, j] = new TileReference<ushort, byte>();
for (int i = 0; i < mapSize; i++)
for (int j = 0; j < mapSize; j++)
map.MapTiles.Value[i, j] = new TileReference<ushort, byte>();
for (int j = 0; j < MapSize; j++)
for (int i = 0; i < MapSize; i++)
Map.MapTiles.Value[i, j].type = ReadWord(ms);
for (int j = 0; j < mapSize; j++)
for (int i = 0; i < mapSize; i++)
map.MapTiles.Value[i, j].type = ReadWord(ms);
for (int j = 0; j < MapSize; j++)
for (int i = 0; i < MapSize; i++)
Map.MapTiles.Value[i, j].index = ReadByte(ms);
for (int j = 0; j < mapSize; j++)
for (int i = 0; i < mapSize; i++)
map.MapTiles.Value[i, j].index = ReadByte(ms);
}
void UnpackRAOverlayData(MemoryStream ms)
{
for (int j = 0; j < MapSize; j++)
for (int i = 0; i < MapSize; i++)
for (int j = 0; j < mapSize; j++)
for (int i = 0; i < mapSize; i++)
{
byte o = ReadByte(ms);
var res = Pair.New((byte)0, (byte)0);
if (o != 255 && overlayResourceMapping.ContainsKey(raOverlayNames[o]))
res = overlayResourceMapping[raOverlayNames[o]];
if (o != 255 && overlayResourceMapping.ContainsKey(redAlertOverlayNames[o]))
res = overlayResourceMapping[redAlertOverlayNames[o]];
Map.MapResources.Value[i, j] = new TileReference<byte, byte>(res.First, res.Second);
map.MapResources.Value[i, j] = new TileReference<byte, byte>(res.First, res.Second);
if (o != 255 && overlayActorMapping.ContainsKey(raOverlayNames[o]))
Map.Actors.Value.Add("Actor" + ActorCount++,
new ActorReference(overlayActorMapping[raOverlayNames[o]])
if (o != 255 && overlayActorMapping.ContainsKey(redAlertOverlayNames[o]))
map.Actors.Value.Add("Actor" + actorCount++,
new ActorReference(overlayActorMapping[redAlertOverlayNames[o]])
{
new LocationInit( new CPos(i, j) ),
new OwnerInit( "Neutral" )
new LocationInit(new CPos(i, j)),
new OwnerInit("Neutral")
});
}
}
@@ -291,10 +293,10 @@ namespace OpenRA.Editor
foreach (KeyValuePair<string, string> kv in terrain)
{
var loc = int.Parse(kv.Key);
Map.Actors.Value.Add("Actor" + ActorCount++,
map.Actors.Value.Add("Actor" + actorCount++,
new ActorReference(kv.Value.ToLowerInvariant())
{
new LocationInit(new CPos(loc % MapSize, loc / MapSize)),
new LocationInit(new CPos(loc % mapSize, loc / mapSize)),
new OwnerInit("Neutral")
});
}
@@ -302,15 +304,15 @@ namespace OpenRA.Editor
void UnpackCncTileData(Stream ms)
{
for (int i = 0; i < MapSize; i++)
for (int j = 0; j < MapSize; j++)
Map.MapTiles.Value[i, j] = new TileReference<ushort, byte>();
for (int i = 0; i < mapSize; i++)
for (int j = 0; j < mapSize; j++)
map.MapTiles.Value[i, j] = new TileReference<ushort, byte>();
for (int j = 0; j < MapSize; j++)
for (int i = 0; i < MapSize; i++)
for (int j = 0; j < mapSize; j++)
for (int i = 0; i < mapSize; i++)
{
Map.MapTiles.Value[i, j].type = ReadByte(ms);
Map.MapTiles.Value[i, j].index = ReadByte(ms);
map.MapTiles.Value[i, j].type = ReadByte(ms);
map.MapTiles.Value[i, j].index = ReadByte(ms);
}
}
@@ -323,16 +325,16 @@ namespace OpenRA.Editor
foreach (KeyValuePair<string, string> kv in overlay)
{
var loc = int.Parse(kv.Key);
var cell = new CPos(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()))
res = overlayResourceMapping[kv.Value.ToLower()];
Map.MapResources.Value[cell.X, cell.Y] = new TileReference<byte, byte>(res.First, res.Second);
map.MapResources.Value[cell.X, cell.Y] = new TileReference<byte, byte>(res.First, res.Second);
if (overlayActorMapping.ContainsKey(kv.Value.ToLower()))
Map.Actors.Value.Add("Actor" + ActorCount++,
map.Actors.Value.Add("Actor" + actorCount++,
new ActorReference(overlayActorMapping[kv.Value.ToLower()])
{
new LocationInit(cell),
@@ -350,10 +352,10 @@ namespace OpenRA.Editor
foreach (KeyValuePair<string, string> kv in terrain)
{
var loc = int.Parse(kv.Key);
Map.Actors.Value.Add("Actor" + ActorCount++,
map.Actors.Value.Add("Actor" + actorCount++,
new ActorReference(kv.Value.Split(',')[0].ToLowerInvariant())
{
new LocationInit(new CPos(loc % MapSize, loc / MapSize)),
new LocationInit(new CPos(loc % mapSize, loc / mapSize)),
new OwnerInit("Neutral")
});
}
@@ -363,26 +365,24 @@ namespace OpenRA.Editor
{
foreach (var s in file.GetSection(section, true))
{
//Structures: num=owner,type,health,location,turret-facing,trigger
//Units: num=owner,type,health,location,facing,action,trigger
//Infantry: num=owner,type,health,location,subcell,action,facing,trigger
// Structures: num=owner,type,health,location,turret-facing,trigger
// Units: num=owner,type,health,location,facing,action,trigger
// Infantry: num=owner,type,health,location,subcell,action,facing,trigger
try
{
var parts = s.Value.Split(',');
var loc = int.Parse(parts[3]);
if (parts[0] == "")
parts[0] = "Neutral";
if (!Players.Contains(parts[0]))
Players.Add(parts[0]);
if (!players.Contains(parts[0]))
players.Add(parts[0]);
var actor = new ActorReference(parts[1].ToLowerInvariant())
{
new LocationInit(new CPos(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 HealthInit(float.Parse(parts[2], NumberFormatInfo.InvariantInfo) / 256),
new FacingInit((section == "INFANTRY") ? int.Parse(parts[6]) : int.Parse(parts[4])),
};
@@ -392,7 +392,7 @@ namespace OpenRA.Editor
if (!Rules.Info.ContainsKey(parts[1].ToLowerInvariant()))
errorHandler("Ignoring unknown actor type: `{0}`".F(parts[1].ToLowerInvariant()));
else
Map.Actors.Value.Add("Actor" + ActorCount++, actor);
map.Actors.Value.Add("Actor" + actorCount++, actor);
}
catch (Exception)
{
@@ -405,10 +405,10 @@ namespace OpenRA.Editor
{
foreach (var s in file.GetSection(section, true))
{
//loc=type,loc,depth
// loc=type,loc,depth
var parts = s.Value.Split(',');
var loc = int.Parse(parts[1]);
Map.Smudges.Value.Add(new SmudgeReference(parts[0].ToLowerInvariant(), new int2(loc % MapSize, loc / MapSize), int.Parse(parts[2])));
map.Smudges.Value.Add(new SmudgeReference(parts[0].ToLowerInvariant(), new int2(loc % mapSize, loc / mapSize), int.Parse(parts[2])));
}
}
@@ -444,7 +444,7 @@ namespace OpenRA.Editor
break;
case "Greece":
case "GoodGuy":
c = isRA? "blue" : "gold";
c = isRA ? "blue" : "gold";
race = isRA ? "allies" : "gdi";
break;
case "USSR":
@@ -460,43 +460,29 @@ namespace OpenRA.Editor
break;
}
var color = namedColorMapping[c];
var pr = new PlayerReference
{
Name = section,
OwnsWorld = section == "Neutral",
NonCombatant = section == "Neutral",
Race = race,
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))
Color = namedColorMapping[c]
};
var neutral = new [] {"Neutral"};
var neutral = new[] { "Neutral" };
foreach (var s in file.GetSection(section, true))
{
Console.WriteLine(s.Key);
switch(s.Key)
switch (s.Key)
{
case "Credits":
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;
}
}
Map.Players.Add(section, pr);
}
static string Truncate(string s, int maxLength)
{
return s.Length <= maxLength ? s : s.Substring(0, maxLength);
map.Players.Add(section, pr);
}
}
}

View File

@@ -12,70 +12,59 @@ 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))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором форм Windows
/// <summary>
/// TODO
/// </summary>
// TODO:
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MapSelect));
this.MapList = new System.Windows.Forms.ListView();
this.colMapName = new System.Windows.Forms.ColumnHeader("(отсутствует)");
this.ColumnMapName = new System.Windows.Forms.ColumnHeader("(none)");
this.MapIconsList = new System.Windows.Forms.ImageList(this.components);
this.btnCancel = new System.Windows.Forms.Button();
this.btnOk = new System.Windows.Forms.Button();
this.lblNew = new System.Windows.Forms.Label();
this.txtNew = new System.Windows.Forms.TextBox();
this.pbMinimap = new System.Windows.Forms.PictureBox();
this.pnlBottom = new System.Windows.Forms.Panel();
this.txtPathOut = new System.Windows.Forms.TextBox();
this.lblPathOut = new System.Windows.Forms.Label();
this.lblPath = new System.Windows.Forms.Label();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.lblMapList = new System.Windows.Forms.Label();
this.txtDesc = new System.Windows.Forms.TextBox();
this.lblDesc = new System.Windows.Forms.Label();
this.txtTheater = new System.Windows.Forms.TextBox();
this.lblTheater = new System.Windows.Forms.Label();
this.txtAuthor = new System.Windows.Forms.TextBox();
this.lblAuthor = new System.Windows.Forms.Label();
this.txtTitle = new System.Windows.Forms.TextBox();
this.lblMapName = new System.Windows.Forms.Label();
this.lblMinimap = new System.Windows.Forms.Label();
this.ButtonCancel = new System.Windows.Forms.Button();
this.ButtonOkay = new System.Windows.Forms.Button();
this.NewLabel = new System.Windows.Forms.Label();
this.NewText = new System.Windows.Forms.TextBox();
this.MiniMapBox = new System.Windows.Forms.PictureBox();
this.BottomPanel = new System.Windows.Forms.Panel();
this.PathOutText = new System.Windows.Forms.TextBox();
this.PathOutLabel = new System.Windows.Forms.Label();
this.PathLabel = new System.Windows.Forms.Label();
this.SplitContainer1 = new System.Windows.Forms.SplitContainer();
this.MapListLabel = new System.Windows.Forms.Label();
this.DescTxt = new System.Windows.Forms.TextBox();
this.DescLabel = new System.Windows.Forms.Label();
this.TheaterText = new System.Windows.Forms.TextBox();
this.TheaterLabel = new System.Windows.Forms.Label();
this.AuthorText = new System.Windows.Forms.TextBox();
this.AuthorLabel = new System.Windows.Forms.Label();
this.TitleText = new System.Windows.Forms.TextBox();
this.MapNameLabel = new System.Windows.Forms.Label();
this.MiniMapLabel = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pbMinimap)).BeginInit();
this.pnlBottom.SuspendLayout();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)this.MiniMapBox).BeginInit();
this.BottomPanel.SuspendLayout();
this.SplitContainer1.Panel1.SuspendLayout();
this.SplitContainer1.Panel2.SuspendLayout();
this.SplitContainer1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)this.pictureBox1).BeginInit();
this.SuspendLayout();
//
// MapList
//
this.MapList.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.MapList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.colMapName});
this.MapList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.ColumnMapName });
this.MapList.FullRowSelect = true;
this.MapList.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
this.MapList.LargeImageList = this.MapIconsList;
@@ -89,250 +78,198 @@ namespace OpenRA.Editor
this.MapList.UseCompatibleStateImageBehavior = false;
this.MapList.View = System.Windows.Forms.View.Details;
this.MapList.SelectedIndexChanged += new System.EventHandler(this.MapList_SelectedIndexChanged);
//
// colMapName
//
this.colMapName.Text = "Map name";
this.colMapName.Width = 240;
//
// MapIconsList
//
this.ColumnMapName.Text = "Map name";
this.ColumnMapName.Width = 240;
this.MapIconsList.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
this.MapIconsList.ImageSize = new System.Drawing.Size(24, 24);
this.MapIconsList.TransparentColor = System.Drawing.Color.Transparent;
//
// btnCancel
//
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(407, 35);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 3;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// btnOk
//
this.btnOk.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOk.Location = new System.Drawing.Point(326, 35);
this.btnOk.Name = "btnOk";
this.btnOk.Size = new System.Drawing.Size(75, 23);
this.btnOk.TabIndex = 2;
this.btnOk.Text = "Open";
this.btnOk.UseVisualStyleBackColor = true;
//
// lblNew
//
this.lblNew.AutoSize = true;
this.lblNew.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblNew.Location = new System.Drawing.Point(12, 40);
this.lblNew.Name = "lblNew";
this.lblNew.Size = new System.Drawing.Size(69, 13);
this.lblNew.TabIndex = 3;
this.lblNew.Text = "Map name:";
//
// txtNew
//
this.txtNew.BackColor = System.Drawing.SystemColors.Window;
this.txtNew.Location = new System.Drawing.Point(88, 37);
this.txtNew.Name = "txtNew";
this.txtNew.ReadOnly = true;
this.txtNew.Size = new System.Drawing.Size(232, 20);
this.txtNew.TabIndex = 1;
//
// pbMinimap
//
this.pbMinimap.BackColor = System.Drawing.Color.Black;
this.pbMinimap.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.pbMinimap.Location = new System.Drawing.Point(32, 25);
this.pbMinimap.Name = "pbMinimap";
this.pbMinimap.Size = new System.Drawing.Size(124, 124);
this.pbMinimap.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbMinimap.TabIndex = 5;
this.pbMinimap.TabStop = false;
//
// pnlBottom
//
this.pnlBottom.Controls.Add(this.pictureBox1);
this.pnlBottom.Controls.Add(this.txtPathOut);
this.pnlBottom.Controls.Add(this.lblPathOut);
this.pnlBottom.Controls.Add(this.lblPath);
this.pnlBottom.Controls.Add(this.btnCancel);
this.pnlBottom.Controls.Add(this.btnOk);
this.pnlBottom.Controls.Add(this.txtNew);
this.pnlBottom.Controls.Add(this.lblNew);
this.pnlBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
this.pnlBottom.Location = new System.Drawing.Point(0, 332);
this.pnlBottom.MaximumSize = new System.Drawing.Size(0, 70);
this.pnlBottom.Name = "pnlBottom";
this.pnlBottom.Size = new System.Drawing.Size(494, 70);
this.pnlBottom.TabIndex = 6;
//
// txtPathOut
//
this.txtPathOut.BackColor = System.Drawing.SystemColors.Window;
this.txtPathOut.Location = new System.Drawing.Point(55, 10);
this.txtPathOut.Name = "txtPathOut";
this.txtPathOut.ReadOnly = true;
this.txtPathOut.Size = new System.Drawing.Size(265, 20);
this.txtPathOut.TabIndex = 0;
this.txtPathOut.TextChanged += new System.EventHandler(this.txtPathOut_TextChanged);
//
// lblPathOut
//
this.lblPathOut.AutoSize = true;
this.lblPathOut.Location = new System.Drawing.Point(55, 13);
this.lblPathOut.Name = "lblPathOut";
this.lblPathOut.Size = new System.Drawing.Size(0, 13);
this.lblPathOut.TabIndex = 6;
//
// lblPath
//
this.lblPath.AutoSize = true;
this.lblPath.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblPath.Location = new System.Drawing.Point(12, 13);
this.lblPath.Name = "lblPath";
this.lblPath.Size = new System.Drawing.Size(37, 13);
this.lblPath.TabIndex = 5;
this.lblPath.Text = "Path:";
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.lblMapList);
this.splitContainer1.Panel1.Controls.Add(this.MapList);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.txtDesc);
this.splitContainer1.Panel2.Controls.Add(this.lblDesc);
this.splitContainer1.Panel2.Controls.Add(this.txtTheater);
this.splitContainer1.Panel2.Controls.Add(this.lblTheater);
this.splitContainer1.Panel2.Controls.Add(this.txtAuthor);
this.splitContainer1.Panel2.Controls.Add(this.lblAuthor);
this.splitContainer1.Panel2.Controls.Add(this.txtTitle);
this.splitContainer1.Panel2.Controls.Add(this.lblMapName);
this.splitContainer1.Panel2.Controls.Add(this.lblMinimap);
this.splitContainer1.Panel2.Controls.Add(this.pbMinimap);
this.splitContainer1.Size = new System.Drawing.Size(494, 332);
this.splitContainer1.SplitterDistance = 300;
this.splitContainer1.TabIndex = 7;
//
// lblMapList
//
this.lblMapList.AutoSize = true;
this.lblMapList.Location = new System.Drawing.Point(12, 9);
this.lblMapList.Name = "lblMapList";
this.lblMapList.Size = new System.Drawing.Size(81, 13);
this.lblMapList.TabIndex = 1;
this.lblMapList.Text = "Available maps:";
//
// txtDesc
//
this.txtDesc.BackColor = System.Drawing.SystemColors.ButtonFace;
this.txtDesc.Location = new System.Drawing.Point(16, 289);
this.txtDesc.Name = "txtDesc";
this.txtDesc.ReadOnly = true;
this.txtDesc.Size = new System.Drawing.Size(162, 20);
this.txtDesc.TabIndex = 14;
//
// lblDesc
//
this.lblDesc.AutoSize = true;
this.lblDesc.Location = new System.Drawing.Point(13, 273);
this.lblDesc.Name = "lblDesc";
this.lblDesc.Size = new System.Drawing.Size(63, 13);
this.lblDesc.TabIndex = 13;
this.lblDesc.Text = "Description:";
//
// txtTheater
//
this.txtTheater.BackColor = System.Drawing.SystemColors.ButtonFace;
this.txtTheater.Location = new System.Drawing.Point(16, 252);
this.txtTheater.Name = "txtTheater";
this.txtTheater.ReadOnly = true;
this.txtTheater.Size = new System.Drawing.Size(162, 20);
this.txtTheater.TabIndex = 12;
//
// lblTheater
//
this.lblTheater.AutoSize = true;
this.lblTheater.Location = new System.Drawing.Point(13, 236);
this.lblTheater.Name = "lblTheater";
this.lblTheater.Size = new System.Drawing.Size(47, 13);
this.lblTheater.TabIndex = 11;
this.lblTheater.Text = "Tileset:";
//
// txtAuthor
//
this.txtAuthor.BackColor = System.Drawing.SystemColors.ButtonFace;
this.txtAuthor.Location = new System.Drawing.Point(16, 214);
this.txtAuthor.Name = "txtAuthor";
this.txtAuthor.ReadOnly = true;
this.txtAuthor.Size = new System.Drawing.Size(162, 20);
this.txtAuthor.TabIndex = 10;
//
// lblAuthor
//
this.lblAuthor.AutoSize = true;
this.lblAuthor.Location = new System.Drawing.Point(13, 198);
this.lblAuthor.Name = "lblAuthor";
this.lblAuthor.Size = new System.Drawing.Size(41, 13);
this.lblAuthor.TabIndex = 9;
this.lblAuthor.Text = "Author:";
//
// txtTitle
//
this.txtTitle.BackColor = System.Drawing.SystemColors.ButtonFace;
this.txtTitle.Location = new System.Drawing.Point(16, 177);
this.txtTitle.Name = "txtTitle";
this.txtTitle.ReadOnly = true;
this.txtTitle.Size = new System.Drawing.Size(162, 20);
this.txtTitle.TabIndex = 8;
//
// lblMapName
//
this.lblMapName.AutoSize = true;
this.lblMapName.Location = new System.Drawing.Point(13, 161);
this.lblMapName.Name = "lblMapName";
this.lblMapName.Size = new System.Drawing.Size(30, 13);
this.lblMapName.TabIndex = 7;
this.lblMapName.Text = "Title:";
//
// lblMinimap
//
this.lblMinimap.AutoSize = true;
this.lblMinimap.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblMinimap.Location = new System.Drawing.Point(29, 9);
this.lblMinimap.Name = "lblMinimap";
this.lblMinimap.Size = new System.Drawing.Size(71, 13);
this.lblMinimap.TabIndex = 6;
this.lblMinimap.Text = "Map preview:";
//
// pictureBox1
//
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.ButtonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.ButtonCancel.Location = new System.Drawing.Point(407, 35);
this.ButtonCancel.Name = "btnCancel";
this.ButtonCancel.Size = new System.Drawing.Size(75, 23);
this.ButtonCancel.TabIndex = 3;
this.ButtonCancel.Text = "Cancel";
this.ButtonCancel.UseVisualStyleBackColor = true;
this.ButtonOkay.DialogResult = System.Windows.Forms.DialogResult.OK;
this.ButtonOkay.Location = new System.Drawing.Point(326, 35);
this.ButtonOkay.Name = "btnOk";
this.ButtonOkay.Size = new System.Drawing.Size(75, 23);
this.ButtonOkay.TabIndex = 2;
this.ButtonOkay.Text = "Open";
this.ButtonOkay.UseVisualStyleBackColor = true;
this.NewLabel.AutoSize = true;
this.NewLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, (byte)204);
this.NewLabel.Location = new System.Drawing.Point(12, 40);
this.NewLabel.Name = "lblNew";
this.NewLabel.Size = new System.Drawing.Size(69, 13);
this.NewLabel.TabIndex = 3;
this.NewLabel.Text = "Map name:";
this.NewText.BackColor = System.Drawing.SystemColors.Window;
this.NewText.Location = new System.Drawing.Point(88, 37);
this.NewText.Name = "txtNew";
this.NewText.ReadOnly = true;
this.NewText.Size = new System.Drawing.Size(232, 20);
this.NewText.TabIndex = 1;
this.MiniMapBox.BackColor = System.Drawing.Color.Black;
this.MiniMapBox.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.MiniMapBox.Location = new System.Drawing.Point(32, 25);
this.MiniMapBox.Name = "pbMinimap";
this.MiniMapBox.Size = new System.Drawing.Size(124, 124);
this.MiniMapBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.MiniMapBox.TabIndex = 5;
this.MiniMapBox.TabStop = false;
this.BottomPanel.Controls.Add(this.pictureBox1);
this.BottomPanel.Controls.Add(this.PathOutText);
this.BottomPanel.Controls.Add(this.PathOutLabel);
this.BottomPanel.Controls.Add(this.PathLabel);
this.BottomPanel.Controls.Add(this.ButtonCancel);
this.BottomPanel.Controls.Add(this.ButtonOkay);
this.BottomPanel.Controls.Add(this.NewText);
this.BottomPanel.Controls.Add(this.NewLabel);
this.BottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
this.BottomPanel.Location = new System.Drawing.Point(0, 332);
this.BottomPanel.MaximumSize = new System.Drawing.Size(0, 70);
this.BottomPanel.Name = "pnlBottom";
this.BottomPanel.Size = new System.Drawing.Size(494, 70);
this.BottomPanel.TabIndex = 6;
this.PathOutText.BackColor = System.Drawing.SystemColors.Window;
this.PathOutText.Location = new System.Drawing.Point(55, 10);
this.PathOutText.Name = "txtPathOut";
this.PathOutText.ReadOnly = true;
this.PathOutText.Size = new System.Drawing.Size(265, 20);
this.PathOutText.TabIndex = 0;
this.PathOutText.TextChanged += new System.EventHandler(this.PathOutTextChanged);
this.PathOutLabel.AutoSize = true;
this.PathOutLabel.Location = new System.Drawing.Point(55, 13);
this.PathOutLabel.Name = "lblPathOut";
this.PathOutLabel.Size = new System.Drawing.Size(0, 13);
this.PathOutLabel.TabIndex = 6;
this.PathLabel.AutoSize = true;
this.PathLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, (byte)204);
this.PathLabel.Location = new System.Drawing.Point(12, 13);
this.PathLabel.Name = "lblPath";
this.PathLabel.Size = new System.Drawing.Size(37, 13);
this.PathLabel.TabIndex = 5;
this.PathLabel.Text = "Path:";
this.SplitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.SplitContainer1.Location = new System.Drawing.Point(0, 0);
this.SplitContainer1.Name = "splitContainer1";
this.SplitContainer1.Panel1.Controls.Add(this.MapListLabel);
this.SplitContainer1.Panel1.Controls.Add(this.MapList);
this.SplitContainer1.Panel2.Controls.Add(this.DescTxt);
this.SplitContainer1.Panel2.Controls.Add(this.DescLabel);
this.SplitContainer1.Panel2.Controls.Add(this.TheaterText);
this.SplitContainer1.Panel2.Controls.Add(this.TheaterLabel);
this.SplitContainer1.Panel2.Controls.Add(this.AuthorText);
this.SplitContainer1.Panel2.Controls.Add(this.AuthorLabel);
this.SplitContainer1.Panel2.Controls.Add(this.TitleText);
this.SplitContainer1.Panel2.Controls.Add(this.MapNameLabel);
this.SplitContainer1.Panel2.Controls.Add(this.MiniMapLabel);
this.SplitContainer1.Panel2.Controls.Add(this.MiniMapBox);
this.SplitContainer1.Size = new System.Drawing.Size(494, 332);
this.SplitContainer1.SplitterDistance = 300;
this.SplitContainer1.TabIndex = 7;
this.MapListLabel.AutoSize = true;
this.MapListLabel.Location = new System.Drawing.Point(12, 9);
this.MapListLabel.Name = "lblMapList";
this.MapListLabel.Size = new System.Drawing.Size(81, 13);
this.MapListLabel.TabIndex = 1;
this.MapListLabel.Text = "Available maps:";
this.DescTxt.BackColor = System.Drawing.SystemColors.ButtonFace;
this.DescTxt.Location = new System.Drawing.Point(16, 289);
this.DescTxt.Name = "txtDesc";
this.DescTxt.ReadOnly = true;
this.DescTxt.Size = new System.Drawing.Size(162, 20);
this.DescTxt.TabIndex = 14;
this.DescLabel.AutoSize = true;
this.DescLabel.Location = new System.Drawing.Point(13, 273);
this.DescLabel.Name = "lblDesc";
this.DescLabel.Size = new System.Drawing.Size(63, 13);
this.DescLabel.TabIndex = 13;
this.DescLabel.Text = "Description:";
this.TheaterText.BackColor = System.Drawing.SystemColors.ButtonFace;
this.TheaterText.Location = new System.Drawing.Point(16, 252);
this.TheaterText.Name = "txtTheater";
this.TheaterText.ReadOnly = true;
this.TheaterText.Size = new System.Drawing.Size(162, 20);
this.TheaterText.TabIndex = 12;
this.TheaterLabel.AutoSize = true;
this.TheaterLabel.Location = new System.Drawing.Point(13, 236);
this.TheaterLabel.Name = "lblTheater";
this.TheaterLabel.Size = new System.Drawing.Size(47, 13);
this.TheaterLabel.TabIndex = 11;
this.TheaterLabel.Text = "Tileset:";
this.AuthorText.BackColor = System.Drawing.SystemColors.ButtonFace;
this.AuthorText.Location = new System.Drawing.Point(16, 214);
this.AuthorText.Name = "txtAuthor";
this.AuthorText.ReadOnly = true;
this.AuthorText.Size = new System.Drawing.Size(162, 20);
this.AuthorText.TabIndex = 10;
this.AuthorLabel.AutoSize = true;
this.AuthorLabel.Location = new System.Drawing.Point(13, 198);
this.AuthorLabel.Name = "lblAuthor";
this.AuthorLabel.Size = new System.Drawing.Size(41, 13);
this.AuthorLabel.TabIndex = 9;
this.AuthorLabel.Text = "Author:";
this.TitleText.BackColor = System.Drawing.SystemColors.ButtonFace;
this.TitleText.Location = new System.Drawing.Point(16, 177);
this.TitleText.Name = "txtTitle";
this.TitleText.ReadOnly = true;
this.TitleText.Size = new System.Drawing.Size(162, 20);
this.TitleText.TabIndex = 8;
this.MapNameLabel.AutoSize = true;
this.MapNameLabel.Location = new System.Drawing.Point(13, 161);
this.MapNameLabel.Name = "lblMapName";
this.MapNameLabel.Size = new System.Drawing.Size(30, 13);
this.MapNameLabel.TabIndex = 7;
this.MapNameLabel.Text = "Title:";
this.MiniMapLabel.AutoSize = true;
this.MiniMapLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (byte)204);
this.MiniMapLabel.Location = new System.Drawing.Point(29, 9);
this.MiniMapLabel.Name = "lblMinimap";
this.MiniMapLabel.Size = new System.Drawing.Size(71, 13);
this.MiniMapLabel.TabIndex = 6;
this.MiniMapLabel.Text = "Map preview:";
this.pictureBox1.Image = (System.Drawing.Image)resources.GetObject("pictureBox1.Image");
this.pictureBox1.Location = new System.Drawing.Point(336, -9);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(54, 35);
this.pictureBox1.TabIndex = 7;
this.pictureBox1.TabStop = false;
this.pictureBox1.Visible = false;
//
// MapSelect
//
this.AcceptButton = this.btnOk;
this.AcceptButton = this.ButtonOkay;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.btnCancel;
this.CancelButton = this.ButtonCancel;
this.ClientSize = new System.Drawing.Size(494, 402);
this.Controls.Add(this.splitContainer1);
this.Controls.Add(this.pnlBottom);
this.Controls.Add(this.SplitContainer1);
this.Controls.Add(this.BottomPanel);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
@@ -342,44 +279,41 @@ namespace OpenRA.Editor
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Select map";
this.Load += new System.EventHandler(this.MapSelect_Load);
((System.ComponentModel.ISupportInitialize)(this.pbMinimap)).EndInit();
this.pnlBottom.ResumeLayout(false);
this.pnlBottom.PerformLayout();
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false);
this.splitContainer1.Panel2.PerformLayout();
this.splitContainer1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)this.MiniMapBox).EndInit();
this.BottomPanel.ResumeLayout(false);
this.BottomPanel.PerformLayout();
this.SplitContainer1.Panel1.ResumeLayout(false);
this.SplitContainer1.Panel1.PerformLayout();
this.SplitContainer1.Panel2.ResumeLayout(false);
this.SplitContainer1.Panel2.PerformLayout();
this.SplitContainer1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)this.pictureBox1).EndInit();
this.ResumeLayout(false);
}
#endregion
public System.Windows.Forms.ListView MapList;
public System.Windows.Forms.Button btnCancel;
public System.Windows.Forms.Button btnOk;
public System.Windows.Forms.Label lblNew;
public System.Windows.Forms.TextBox txtNew;
public System.Windows.Forms.ColumnHeader colMapName;
public System.Windows.Forms.Button ButtonCancel;
public System.Windows.Forms.Button ButtonOkay;
public System.Windows.Forms.Label NewLabel;
public System.Windows.Forms.TextBox NewText;
public System.Windows.Forms.ColumnHeader ColumnMapName;
public System.Windows.Forms.ImageList MapIconsList;
public System.Windows.Forms.PictureBox pbMinimap;
public System.Windows.Forms.Panel pnlBottom;
public System.Windows.Forms.SplitContainer splitContainer1;
public System.Windows.Forms.Label lblMinimap;
public System.Windows.Forms.TextBox txtTheater;
public System.Windows.Forms.Label lblTheater;
public System.Windows.Forms.TextBox txtAuthor;
public System.Windows.Forms.Label lblAuthor;
public System.Windows.Forms.TextBox txtTitle;
public System.Windows.Forms.Label lblMapName;
public System.Windows.Forms.TextBox txtDesc;
public System.Windows.Forms.Label lblDesc;
public System.Windows.Forms.Label lblMapList;
public System.Windows.Forms.Label lblPathOut;
public System.Windows.Forms.Label lblPath;
public System.Windows.Forms.TextBox txtPathOut;
public System.Windows.Forms.PictureBox MiniMapBox;
public System.Windows.Forms.Panel BottomPanel;
public System.Windows.Forms.SplitContainer SplitContainer1;
public System.Windows.Forms.Label MiniMapLabel;
public System.Windows.Forms.TextBox TheaterText;
public System.Windows.Forms.Label TheaterLabel;
public System.Windows.Forms.TextBox AuthorText;
public System.Windows.Forms.Label AuthorLabel;
public System.Windows.Forms.TextBox TitleText;
public System.Windows.Forms.Label MapNameLabel;
public System.Windows.Forms.TextBox DescTxt;
public System.Windows.Forms.Label DescLabel;
public System.Windows.Forms.Label MapListLabel;
public System.Windows.Forms.Label PathOutLabel;
public System.Windows.Forms.Label PathLabel;
public System.Windows.Forms.TextBox PathOutText;
private System.Windows.Forms.PictureBox pictureBox1;
}
}

View File

@@ -40,7 +40,7 @@ namespace OpenRA.Editor
void MapSelect_Load(object sender, EventArgs e)
{
MapList.Items.Clear();
txtPathOut.Text = MapFolderPath;
PathOutText.Text = MapFolderPath;
if (DirectoryIsEmpty(MapFolderPath))
return;
@@ -55,7 +55,7 @@ namespace OpenRA.Editor
}
// hack
if (txtNew.Text != "unnamed")
if (NewText.Text != "unnamed")
MapList.Items[0].Selected = true;
}
@@ -63,31 +63,30 @@ namespace OpenRA.Editor
{
if (MapList.SelectedItems.Count == 1)
{
txtNew.Text = MapList.SelectedItems[0].Text;
txtNew.Tag = MapList.SelectedItems[0].Tag;
NewText.Text = MapList.SelectedItems[0].Text;
NewText.Tag = MapList.SelectedItems[0].Tag;
var map = new Map(txtNew.Tag as string);
txtTitle.Text = map.Title;
txtAuthor.Text = map.Author;
txtTheater.Text = map.Tileset;
txtDesc.Text = map.Description;
pbMinimap.Image = null;
var map = new Map(NewText.Tag as string);
TitleText.Text = map.Title;
AuthorText.Text = map.Author;
TheaterText.Text = map.Tileset;
DescTxt.Text = map.Description;
MiniMapBox.Image = null;
try
{
pbMinimap.Image = Minimap.AddStaticResources(map, Minimap.TerrainBitmap(map, true));
MiniMapBox.Image = Minimap.AddStaticResources(map, Minimap.TerrainBitmap(map, true));
}
catch (Exception ed)
{
Console.WriteLine("No map preview image found: {0}", ed.ToString());
}
finally { }
}
}
void txtPathOut_TextChanged(object sender, EventArgs e)
void PathOutTextChanged(object sender, EventArgs e)
{
MapFolderPath = txtPathOut.Text;
MapFolderPath = PathOutText.Text;
}
}
}

169
OpenRA.Editor/NewMapDialog.Designer.cs generated Executable file → Normal file
View File

@@ -24,9 +24,8 @@ namespace OpenRA.Editor
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
@@ -43,20 +42,20 @@ namespace OpenRA.Editor
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.cordonBottom = new System.Windows.Forms.NumericUpDown();
this.cordonTop = new System.Windows.Forms.NumericUpDown();
this.cordonRight = new System.Windows.Forms.NumericUpDown();
this.cordonLeft = new System.Windows.Forms.NumericUpDown();
this.height = new System.Windows.Forms.NumericUpDown();
this.width = new System.Windows.Forms.NumericUpDown();
this.CordonBottom = new System.Windows.Forms.NumericUpDown();
this.CordonTop = new System.Windows.Forms.NumericUpDown();
this.CordonRight = new System.Windows.Forms.NumericUpDown();
this.CordonLeft = new System.Windows.Forms.NumericUpDown();
this.MapHeight = new System.Windows.Forms.NumericUpDown();
this.MapWidth = new System.Windows.Forms.NumericUpDown();
this.label4 = new System.Windows.Forms.Label();
this.theater = new System.Windows.Forms.ComboBox();
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.height)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.width)).BeginInit();
this.TheaterBox = new System.Windows.Forms.ComboBox();
((System.ComponentModel.ISupportInitialize)(this.CordonBottom)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.CordonTop)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.CordonRight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.CordonLeft)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.MapHeight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.MapWidth)).BeginInit();
this.SuspendLayout();
//
// button2
@@ -108,121 +107,121 @@ namespace OpenRA.Editor
//
// cordonBottom
//
this.cordonBottom.Location = new System.Drawing.Point(280, 75);
this.cordonBottom.Maximum = new decimal(new int[] {
this.CordonBottom.Location = new System.Drawing.Point(280, 75);
this.CordonBottom.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonBottom.Name = "cordonBottom";
this.cordonBottom.Size = new System.Drawing.Size(105, 20);
this.cordonBottom.TabIndex = 5;
this.cordonBottom.Value = new decimal(new int[] {
this.CordonBottom.Name = "cordonBottom";
this.CordonBottom.Size = new System.Drawing.Size(105, 20);
this.CordonBottom.TabIndex = 5;
this.CordonBottom.Value = new decimal(new int[] {
112,
0,
0,
0});
this.cordonBottom.Enter += new System.EventHandler(this.SelectText);
this.CordonBottom.Enter += new System.EventHandler(this.SelectText);
//
// cordonTop
//
this.cordonTop.Location = new System.Drawing.Point(280, 49);
this.cordonTop.Maximum = new decimal(new int[] {
this.CordonTop.Location = new System.Drawing.Point(280, 49);
this.CordonTop.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonTop.Name = "cordonTop";
this.cordonTop.Size = new System.Drawing.Size(105, 20);
this.cordonTop.TabIndex = 3;
this.cordonTop.Value = new decimal(new int[] {
this.CordonTop.Name = "cordonTop";
this.CordonTop.Size = new System.Drawing.Size(105, 20);
this.CordonTop.TabIndex = 3;
this.CordonTop.Value = new decimal(new int[] {
16,
0,
0,
0});
this.cordonTop.Enter += new System.EventHandler(this.SelectText);
this.CordonTop.Enter += new System.EventHandler(this.SelectText);
//
// cordonRight
//
this.cordonRight.Location = new System.Drawing.Point(169, 75);
this.cordonRight.Maximum = new decimal(new int[] {
this.CordonRight.Location = new System.Drawing.Point(169, 75);
this.CordonRight.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonRight.Name = "cordonRight";
this.cordonRight.Size = new System.Drawing.Size(105, 20);
this.cordonRight.TabIndex = 4;
this.cordonRight.Value = new decimal(new int[] {
this.CordonRight.Name = "cordonRight";
this.CordonRight.Size = new System.Drawing.Size(105, 20);
this.CordonRight.TabIndex = 4;
this.CordonRight.Value = new decimal(new int[] {
112,
0,
0,
0});
this.cordonRight.Enter += new System.EventHandler(this.SelectText);
this.CordonRight.Enter += new System.EventHandler(this.SelectText);
//
// cordonLeft
//
this.cordonLeft.Location = new System.Drawing.Point(169, 49);
this.cordonLeft.Maximum = new decimal(new int[] {
this.CordonLeft.Location = new System.Drawing.Point(169, 49);
this.CordonLeft.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonLeft.Name = "cordonLeft";
this.cordonLeft.Size = new System.Drawing.Size(105, 20);
this.cordonLeft.TabIndex = 2;
this.cordonLeft.Value = new decimal(new int[] {
this.CordonLeft.Name = "cordonLeft";
this.CordonLeft.Size = new System.Drawing.Size(105, 20);
this.CordonLeft.TabIndex = 2;
this.CordonLeft.Value = new decimal(new int[] {
16,
0,
0,
0});
this.cordonLeft.Enter += new System.EventHandler(this.SelectText);
this.CordonLeft.Enter += new System.EventHandler(this.SelectText);
//
// height
//
this.height.Increment = new decimal(new int[] {
this.MapHeight.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.height.Location = new System.Drawing.Point(280, 23);
this.height.Maximum = new decimal(new int[] {
this.MapHeight.Location = new System.Drawing.Point(280, 23);
this.MapHeight.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.height.Name = "height";
this.height.Size = new System.Drawing.Size(105, 20);
this.height.TabIndex = 1;
this.height.Value = new decimal(new int[] {
this.MapHeight.Name = "height";
this.MapHeight.Size = new System.Drawing.Size(105, 20);
this.MapHeight.TabIndex = 1;
this.MapHeight.Value = new decimal(new int[] {
128,
0,
0,
0});
this.height.Enter += new System.EventHandler(this.SelectText);
this.MapHeight.Enter += new System.EventHandler(this.SelectText);
//
// width
//
this.width.Increment = new decimal(new int[] {
this.MapWidth.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.width.Location = new System.Drawing.Point(169, 23);
this.width.Maximum = new decimal(new int[] {
this.MapWidth.Location = new System.Drawing.Point(169, 23);
this.MapWidth.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.width.Name = "width";
this.width.Size = new System.Drawing.Size(105, 20);
this.width.TabIndex = 0;
this.width.Value = new decimal(new int[] {
this.MapWidth.Name = "width";
this.MapWidth.Size = new System.Drawing.Size(105, 20);
this.MapWidth.TabIndex = 0;
this.MapWidth.Value = new decimal(new int[] {
128,
0,
0,
0});
this.width.Enter += new System.EventHandler(this.SelectText);
this.MapWidth.Enter += new System.EventHandler(this.SelectText);
//
// label4
//
@@ -235,12 +234,12 @@ namespace OpenRA.Editor
//
// theater
//
this.theater.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.theater.FormattingEnabled = true;
this.theater.Location = new System.Drawing.Point(169, 121);
this.theater.Name = "theater";
this.theater.Size = new System.Drawing.Size(216, 21);
this.theater.TabIndex = 6;
this.TheaterBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.TheaterBox.FormattingEnabled = true;
this.TheaterBox.Location = new System.Drawing.Point(169, 121);
this.TheaterBox.Name = "theater";
this.TheaterBox.Size = new System.Drawing.Size(216, 21);
this.TheaterBox.TabIndex = 6;
//
// NewMapDialog
//
@@ -249,29 +248,29 @@ namespace OpenRA.Editor
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.button1;
this.ClientSize = new System.Drawing.Size(418, 210);
this.Controls.Add(this.theater);
this.Controls.Add(this.TheaterBox);
this.Controls.Add(this.label4);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.cordonBottom);
this.Controls.Add(this.cordonTop);
this.Controls.Add(this.cordonRight);
this.Controls.Add(this.cordonLeft);
this.Controls.Add(this.height);
this.Controls.Add(this.width);
this.Controls.Add(this.CordonBottom);
this.Controls.Add(this.CordonTop);
this.Controls.Add(this.CordonRight);
this.Controls.Add(this.CordonLeft);
this.Controls.Add(this.MapHeight);
this.Controls.Add(this.MapWidth);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Name = "NewMapDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "New Map";
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.height)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.width)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.CordonBottom)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.CordonTop)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.CordonRight)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.CordonLeft)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.MapHeight)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.MapWidth)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -284,13 +283,13 @@ namespace OpenRA.Editor
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
public System.Windows.Forms.NumericUpDown cordonBottom;
public System.Windows.Forms.NumericUpDown cordonTop;
public System.Windows.Forms.NumericUpDown cordonRight;
public System.Windows.Forms.NumericUpDown cordonLeft;
public System.Windows.Forms.NumericUpDown height;
public System.Windows.Forms.NumericUpDown width;
public System.Windows.Forms.NumericUpDown CordonBottom;
public System.Windows.Forms.NumericUpDown CordonTop;
public System.Windows.Forms.NumericUpDown CordonRight;
public System.Windows.Forms.NumericUpDown CordonLeft;
public System.Windows.Forms.NumericUpDown MapHeight;
public System.Windows.Forms.NumericUpDown MapWidth;
private System.Windows.Forms.Label label4;
public System.Windows.Forms.ComboBox theater;
public System.Windows.Forms.ComboBox TheaterBox;
}
}

View File

@@ -116,9 +116,9 @@
<Compile Include="PropertiesDialog.Designer.cs">
<DependentUpon>PropertiesDialog.cs</DependentUpon>
</Compile>
<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>

View File

@@ -20,7 +20,7 @@ namespace OpenRA.Editor
static class Program
{
[STAThread]
static void Main( string[] args )
static void Main(string[] args)
{
if (args.Length >= 2 && args[0] == "--convert")
{
@@ -40,12 +40,13 @@ namespace OpenRA.Editor
static void UpgradeMaps(string mod)
{
var MapFolderPath = new string[] { Environment.CurrentDirectory, "mods", mod, "maps" }
var mapFolderPath = new string[] { Environment.CurrentDirectory, "mods", mod, "maps" }
.Aggregate(Path.Combine);
foreach (var path in ModData.FindMapsIn(MapFolderPath))
foreach (var path in ModData.FindMapsIn(mapFolderPath))
{
var map = new Map(path);
// Touch the lazy bits to initialize them
map.Actors.Force();
map.Smudges.Force();
@@ -54,6 +55,5 @@ namespace OpenRA.Editor
map.Save(path);
}
}
}
}

View File

@@ -1,46 +0,0 @@
#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.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("OpenRA.Editor")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("OpenRA.Editor")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("e18ea68f-f344-46c9-b026-8bda76fa91f8")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -24,9 +24,8 @@ namespace OpenRA.Editor
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
@@ -41,13 +40,13 @@ namespace OpenRA.Editor
this.button2 = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.title = new System.Windows.Forms.TextBox();
this.TitleBox = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.desc = new System.Windows.Forms.TextBox();
this.selectable = new System.Windows.Forms.CheckBox();
this.DescBox = new System.Windows.Forms.TextBox();
this.SelectableCheckBox = new System.Windows.Forms.CheckBox();
this.label3 = new System.Windows.Forms.Label();
this.author = new System.Windows.Forms.TextBox();
this.useAsShellmap = new System.Windows.Forms.CheckBox();
this.AuthorBox = new System.Windows.Forms.TextBox();
this.ShellmapCheckBox = new System.Windows.Forms.CheckBox();
this.SuspendLayout();
//
// button2
@@ -83,10 +82,10 @@ namespace OpenRA.Editor
//
// title
//
this.title.Location = new System.Drawing.Point(66, 47);
this.title.Name = "title";
this.title.Size = new System.Drawing.Size(286, 20);
this.title.TabIndex = 17;
this.TitleBox.Location = new System.Drawing.Point(66, 47);
this.TitleBox.Name = "title";
this.TitleBox.Size = new System.Drawing.Size(286, 20);
this.TitleBox.TabIndex = 17;
//
// label2
//
@@ -99,20 +98,20 @@ namespace OpenRA.Editor
//
// desc
//
this.desc.Location = new System.Drawing.Point(66, 73);
this.desc.Name = "desc";
this.desc.Size = new System.Drawing.Size(286, 20);
this.desc.TabIndex = 17;
this.DescBox.Location = new System.Drawing.Point(66, 73);
this.DescBox.Name = "desc";
this.DescBox.Size = new System.Drawing.Size(286, 20);
this.DescBox.TabIndex = 17;
//
// selectable
//
this.selectable.AutoSize = true;
this.selectable.Location = new System.Drawing.Point(118, 138);
this.selectable.Name = "selectable";
this.selectable.Size = new System.Drawing.Size(130, 17);
this.selectable.TabIndex = 18;
this.selectable.Text = "Show in Map Chooser";
this.selectable.UseVisualStyleBackColor = true;
this.SelectableCheckBox.AutoSize = true;
this.SelectableCheckBox.Location = new System.Drawing.Point(118, 138);
this.SelectableCheckBox.Name = "selectable";
this.SelectableCheckBox.Size = new System.Drawing.Size(130, 17);
this.SelectableCheckBox.TabIndex = 18;
this.SelectableCheckBox.Text = "Show in Map Chooser";
this.SelectableCheckBox.UseVisualStyleBackColor = true;
//
// label3
//
@@ -125,20 +124,20 @@ namespace OpenRA.Editor
//
// author
//
this.author.Location = new System.Drawing.Point(66, 99);
this.author.Name = "author";
this.author.Size = new System.Drawing.Size(286, 20);
this.author.TabIndex = 17;
this.AuthorBox.Location = new System.Drawing.Point(66, 99);
this.AuthorBox.Name = "author";
this.AuthorBox.Size = new System.Drawing.Size(286, 20);
this.AuthorBox.TabIndex = 17;
//
// checkBox1
//
this.useAsShellmap.AutoSize = true;
this.useAsShellmap.Location = new System.Drawing.Point(118, 161);
this.useAsShellmap.Name = "checkBox1";
this.useAsShellmap.Size = new System.Drawing.Size(105, 17);
this.useAsShellmap.TabIndex = 18;
this.useAsShellmap.Text = "Use as Shellmap";
this.useAsShellmap.UseVisualStyleBackColor = true;
this.ShellmapCheckBox.AutoSize = true;
this.ShellmapCheckBox.Location = new System.Drawing.Point(118, 161);
this.ShellmapCheckBox.Name = "checkBox1";
this.ShellmapCheckBox.Size = new System.Drawing.Size(105, 17);
this.ShellmapCheckBox.TabIndex = 18;
this.ShellmapCheckBox.Text = "Use as Shellmap";
this.ShellmapCheckBox.UseVisualStyleBackColor = true;
//
// PropertiesDialog
//
@@ -147,13 +146,13 @@ namespace OpenRA.Editor
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.button1;
this.ClientSize = new System.Drawing.Size(370, 228);
this.Controls.Add(this.useAsShellmap);
this.Controls.Add(this.selectable);
this.Controls.Add(this.author);
this.Controls.Add(this.ShellmapCheckBox);
this.Controls.Add(this.SelectableCheckBox);
this.Controls.Add(this.AuthorBox);
this.Controls.Add(this.label3);
this.Controls.Add(this.desc);
this.Controls.Add(this.DescBox);
this.Controls.Add(this.label2);
this.Controls.Add(this.title);
this.Controls.Add(this.TitleBox);
this.Controls.Add(this.label1);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
@@ -171,12 +170,12 @@ namespace OpenRA.Editor
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
public System.Windows.Forms.TextBox title;
public System.Windows.Forms.TextBox TitleBox;
private System.Windows.Forms.Label label2;
public System.Windows.Forms.TextBox desc;
public System.Windows.Forms.CheckBox selectable;
public System.Windows.Forms.TextBox DescBox;
public System.Windows.Forms.CheckBox SelectableCheckBox;
private System.Windows.Forms.Label label3;
public System.Windows.Forms.TextBox author;
public System.Windows.Forms.CheckBox useAsShellmap;
public System.Windows.Forms.TextBox AuthorBox;
public System.Windows.Forms.CheckBox ShellmapCheckBox;
}
}

View File

@@ -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))
{

View File

@@ -24,9 +24,8 @@ namespace OpenRA.Editor
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
@@ -38,41 +37,41 @@ namespace OpenRA.Editor
/// </summary>
private void InitializeComponent()
{
this.width = new System.Windows.Forms.NumericUpDown();
this.MapWidth = new System.Windows.Forms.NumericUpDown();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.cordonLeft = new System.Windows.Forms.NumericUpDown();
this.cordonTop = new System.Windows.Forms.NumericUpDown();
this.cordonRight = new System.Windows.Forms.NumericUpDown();
this.cordonBottom = new System.Windows.Forms.NumericUpDown();
this.CordonLeft = new System.Windows.Forms.NumericUpDown();
this.CordonTop = new System.Windows.Forms.NumericUpDown();
this.CordonRight = new System.Windows.Forms.NumericUpDown();
this.CordonBottom = new System.Windows.Forms.NumericUpDown();
this.label3 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.height = new System.Windows.Forms.NumericUpDown();
((System.ComponentModel.ISupportInitialize)(this.width)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.height)).BeginInit();
this.MapHeight = new System.Windows.Forms.NumericUpDown();
((System.ComponentModel.ISupportInitialize)(this.MapWidth)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.CordonLeft)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.CordonTop)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.CordonRight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.CordonBottom)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.MapHeight)).BeginInit();
this.SuspendLayout();
//
// width
//
this.width.Increment = new decimal(new int[] {
this.MapWidth.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.width.Location = new System.Drawing.Point(161, 18);
this.width.Maximum = new decimal(new int[] {
this.MapWidth.Location = new System.Drawing.Point(161, 18);
this.MapWidth.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.width.Name = "width";
this.width.Size = new System.Drawing.Size(105, 20);
this.width.TabIndex = 0;
this.MapWidth.Name = "width";
this.MapWidth.Size = new System.Drawing.Size(105, 20);
this.MapWidth.TabIndex = 0;
//
// label1
//
@@ -94,51 +93,51 @@ namespace OpenRA.Editor
//
// cordonLeft
//
this.cordonLeft.Location = new System.Drawing.Point(161, 44);
this.cordonLeft.Maximum = new decimal(new int[] {
this.CordonLeft.Location = new System.Drawing.Point(161, 44);
this.CordonLeft.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonLeft.Name = "cordonLeft";
this.cordonLeft.Size = new System.Drawing.Size(105, 20);
this.cordonLeft.TabIndex = 0;
this.CordonLeft.Name = "cordonLeft";
this.CordonLeft.Size = new System.Drawing.Size(105, 20);
this.CordonLeft.TabIndex = 0;
//
// cordonTop
//
this.cordonTop.Location = new System.Drawing.Point(272, 44);
this.cordonTop.Maximum = new decimal(new int[] {
this.CordonTop.Location = new System.Drawing.Point(272, 44);
this.CordonTop.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonTop.Name = "cordonTop";
this.cordonTop.Size = new System.Drawing.Size(105, 20);
this.cordonTop.TabIndex = 0;
this.CordonTop.Name = "cordonTop";
this.CordonTop.Size = new System.Drawing.Size(105, 20);
this.CordonTop.TabIndex = 0;
//
// cordonRight
//
this.cordonRight.Location = new System.Drawing.Point(161, 70);
this.cordonRight.Maximum = new decimal(new int[] {
this.CordonRight.Location = new System.Drawing.Point(161, 70);
this.CordonRight.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonRight.Name = "cordonRight";
this.cordonRight.Size = new System.Drawing.Size(105, 20);
this.cordonRight.TabIndex = 0;
this.CordonRight.Name = "cordonRight";
this.CordonRight.Size = new System.Drawing.Size(105, 20);
this.CordonRight.TabIndex = 0;
//
// cordonBottom
//
this.cordonBottom.Location = new System.Drawing.Point(272, 70);
this.cordonBottom.Maximum = new decimal(new int[] {
this.CordonBottom.Location = new System.Drawing.Point(272, 70);
this.CordonBottom.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonBottom.Name = "cordonBottom";
this.cordonBottom.Size = new System.Drawing.Size(105, 20);
this.cordonBottom.TabIndex = 0;
this.CordonBottom.Name = "cordonBottom";
this.CordonBottom.Size = new System.Drawing.Size(105, 20);
this.CordonBottom.TabIndex = 0;
//
// label3
//
@@ -171,20 +170,20 @@ namespace OpenRA.Editor
//
// height
//
this.height.Increment = new decimal(new int[] {
this.MapHeight.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.height.Location = new System.Drawing.Point(272, 18);
this.height.Maximum = new decimal(new int[] {
this.MapHeight.Location = new System.Drawing.Point(272, 18);
this.MapHeight.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.height.Name = "height";
this.height.Size = new System.Drawing.Size(105, 20);
this.height.TabIndex = 0;
this.MapHeight.Name = "height";
this.MapHeight.Size = new System.Drawing.Size(105, 20);
this.MapHeight.TabIndex = 0;
//
// ResizeDialog
//
@@ -198,22 +197,22 @@ namespace OpenRA.Editor
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.cordonBottom);
this.Controls.Add(this.cordonTop);
this.Controls.Add(this.cordonRight);
this.Controls.Add(this.cordonLeft);
this.Controls.Add(this.height);
this.Controls.Add(this.width);
this.Controls.Add(this.CordonBottom);
this.Controls.Add(this.CordonTop);
this.Controls.Add(this.CordonRight);
this.Controls.Add(this.CordonLeft);
this.Controls.Add(this.MapHeight);
this.Controls.Add(this.MapWidth);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Name = "ResizeDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Resize Map";
((System.ComponentModel.ISupportInitialize)(this.width)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.height)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.MapWidth)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.CordonLeft)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.CordonTop)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.CordonRight)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.CordonBottom)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.MapHeight)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -226,11 +225,11 @@ namespace OpenRA.Editor
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
public System.Windows.Forms.NumericUpDown width;
public System.Windows.Forms.NumericUpDown cordonLeft;
public System.Windows.Forms.NumericUpDown cordonTop;
public System.Windows.Forms.NumericUpDown cordonRight;
public System.Windows.Forms.NumericUpDown cordonBottom;
public System.Windows.Forms.NumericUpDown height;
public System.Windows.Forms.NumericUpDown MapWidth;
public System.Windows.Forms.NumericUpDown CordonLeft;
public System.Windows.Forms.NumericUpDown CordonTop;
public System.Windows.Forms.NumericUpDown CordonRight;
public System.Windows.Forms.NumericUpDown CordonBottom;
public System.Windows.Forms.NumericUpDown MapHeight;
}
}

View File

@@ -17,21 +17,21 @@ namespace OpenRA.Editor
{
class ResourceTool : ITool
{
ResourceTemplate Resource;
ResourceTemplate resourceTemplate;
public ResourceTool(ResourceTemplate resource) { Resource = resource; }
public ResourceTool(ResourceTemplate resource) { resourceTemplate = resource; }
public void Apply(Surface surface)
{
surface.Map.MapResources.Value[surface.GetBrushLocation().X, surface.GetBrushLocation().Y]
= new TileReference<byte, byte>
{
type = (byte)Resource.Info.ResourceType,
index = (byte)random.Next(Resource.Info.SpriteNames.Length)
type = (byte)resourceTemplate.Info.ResourceType,
index = (byte)random.Next(resourceTemplate.Info.SpriteNames.Length)
};
var ch = new int2((surface.GetBrushLocation().X) / Surface.ChunkSize,
(surface.GetBrushLocation().Y) / Surface.ChunkSize);
var ch = new int2(surface.GetBrushLocation().X / Surface.ChunkSize,
surface.GetBrushLocation().Y / Surface.ChunkSize);
if (surface.Chunks.ContainsKey(ch))
{
@@ -42,7 +42,7 @@ namespace OpenRA.Editor
public void Preview(Surface surface, SGraphics g)
{
surface.DrawImage(g, Resource.Bitmap, surface.GetBrushLocation(), false, null);
surface.DrawImage(g, resourceTemplate.Bitmap, surface.GetBrushLocation(), false, null);
}
Random random = new Random();

View File

@@ -0,0 +1,344 @@
<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>
<Rule Name="ParameterMustFollowComma">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="SplitParametersMustStartOnLineAfterDeclaration">
<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

@@ -21,10 +21,29 @@ using SGraphics = System.Drawing.Graphics;
namespace OpenRA.Editor
{
static class ActorReferenceExts
{
public static CPos Location(this ActorReference ar)
{
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)
{
g.DrawString(s, f, bg, x - 1, y - 1);
g.DrawString(s, f, bg, x + 1, y - 1);
g.DrawString(s, f, bg, x - 1, y + 1);
g.DrawString(s, f, bg, x + 1, y + 1);
g.DrawString(s, f, fg, x, y);
}
}
class Surface : Control
{
public Map Map { get; private set; }
public TileSet TileSet { get; private set; }
public TileSetRenderer TileSetRenderer { get; private set; }
public Palette Palette { get; private set; }
public Palette PlayerPalette { get; private set; }
public int2 Offset;
@@ -33,11 +52,13 @@ namespace OpenRA.Editor
public float Zoom = 1.0f;
ITool Tool;
ITool currentTool;
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;
@@ -51,27 +72,31 @@ namespace OpenRA.Editor
public event Action<string> MousePositionChanged = _ => { };
public event Action<KeyValuePair<string, ActorReference>> ActorDoubleClicked = _ => { };
Dictionary<string, ActorTemplate> ActorTemplates = new Dictionary<string, ActorTemplate>();
Dictionary<int, ResourceTemplate> ResourceTemplates = new Dictionary<int, ResourceTemplate>();
Dictionary<string, ActorTemplate> actorTemplates = new Dictionary<string, ActorTemplate>();
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, Palette pp)
public void Bind(Map m, TileSet ts, TileSetRenderer tsr, Palette p, Palette pp)
{
Map = m;
TileSet = ts;
TileSetRenderer = tsr;
Palette = p;
PlayerPalette = pp;
PlayerPalettes = null;
playerPalettes = null;
Chunks.Clear();
Tool = null;
currentTool = null;
}
public void SetTool(ITool tool) { Tool = tool; ClearSelection(); }
public void SetTool(ITool tool) { currentTool = tool; ClearSelection(); }
public void BindActorTemplates(IEnumerable<ActorTemplate> templates)
{
ActorTemplates = templates.ToDictionary(a => a.Info.Name.ToLowerInvariant());
actorTemplates = templates.ToDictionary(a => a.Info.Name.ToLowerInvariant());
}
public void BindResourceTemplates(IEnumerable<ResourceTemplate> templates)
@@ -94,7 +119,8 @@ namespace OpenRA.Editor
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;
int2 mousePos;
public void Scroll(int2 dx)
{
@@ -146,18 +172,18 @@ namespace OpenRA.Editor
if (Map == null) return;
var oldMousePos = MousePos;
MousePos = new int2(e.Location);
var oldMousePos = mousePos;
mousePos = new int2(e.Location);
MousePositionChanged(GetBrushLocation().ToString());
if (e.Button == MouseButtons.Middle || (e.Button != MouseButtons.None && IsPanning))
Scroll(oldMousePos - MousePos);
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();
@@ -175,7 +201,7 @@ namespace OpenRA.Editor
brushLocation.Y < 0)
return;
Tool = null;
currentTool = null;
var key = Map.Actors.Value.FirstOrDefault(a => a.Value.Location() == brushLocation);
if (key.Key != null) Map.Actors.Value.Remove(key.Key);
@@ -183,7 +209,7 @@ namespace OpenRA.Editor
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);
var ch = new int2(brushLocation.X / ChunkSize, brushLocation.Y / ChunkSize);
if (Chunks.ContainsKey(ch))
{
Chunks[ch].Dispose();
@@ -197,9 +223,9 @@ namespace OpenRA.Editor
void Draw()
{
if (Tool != null)
if (currentTool != null)
{
Tool.Apply(this);
currentTool.Apply(this);
AfterChange();
}
else if (IsPaste)
@@ -217,7 +243,7 @@ namespace OpenRA.Editor
if (!IsPanning)
{
if (e.Button == MouseButtons.Right) Erase();
if (e.Button == MouseButtons.Left)
if (e.Button == MouseButtons.Left && !IsErasing)
{
Draw();
if (!IsPaste)
@@ -232,8 +258,7 @@ namespace OpenRA.Editor
Bitmap RenderChunk(int u, int v)
{
var bitmap = new Bitmap(ChunkSize * TileSet.TileSize, ChunkSize * TileSet.TileSize);
var bitmap = new Bitmap(ChunkSize * TileSetRenderer.TileSize.Width, ChunkSize * TileSetRenderer.TileSize.Height);
var data = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
@@ -247,12 +272,12 @@ namespace OpenRA.Editor
for (var j = 0; j < ChunkSize; j++)
{
var tr = Map.MapTiles.Value[u * ChunkSize + i, v * ChunkSize + j];
var tile = TileSet.Templates[tr.type].Data;
var index = (tr.index < tile.TileBitmapBytes.Count) ? tr.index : (byte)0;
var rawImage = tile.TileBitmapBytes[index];
for (var x = 0; x < TileSet.TileSize; x++)
for (var y = 0; y < TileSet.TileSize; y++)
p[(j * TileSet.TileSize + y) * stride + i * TileSet.TileSize + x] = Palette.GetColor(rawImage[x + TileSet.TileSize * y]).ToArgb();
var tile = TileSetRenderer.Data(tr.type);
var index = (tr.index < tile.Count) ? tr.index : (byte)0;
var rawImage = tile[index];
for (var x = 0; x < TileSetRenderer.TileSize.Width; x++)
for (var y = 0; y < TileSetRenderer.TileSize.Height; y++)
p[(j * TileSetRenderer.TileSize.Width + y) * stride + i * TileSetRenderer.TileSize.Width + x] = Palette.GetColor(rawImage[x + TileSetRenderer.TileSize.Width * y]).ToArgb();
if (Map.MapResources.Value[u * ChunkSize + i, v * ChunkSize + j].type != 0)
{
@@ -263,12 +288,12 @@ namespace OpenRA.Editor
int* q = (int*)srcdata.Scan0.ToPointer();
var srcstride = srcdata.Stride >> 2;
for (var x = 0; x < TileSet.TileSize; x++)
for (var y = 0; y < TileSet.TileSize; y++)
for (var x = 0; x < TileSetRenderer.TileSize.Width; x++)
for (var y = 0; y < TileSetRenderer.TileSize.Height; y++)
{
var c = q[y * srcstride + x];
if ((c & 0xff000000) != 0) /* quick & dirty, i cbf doing real alpha */
p[(j * TileSet.TileSize + y) * stride + i * TileSet.TileSize + x] = c;
p[(j * TileSetRenderer.TileSize.Width + y) * stride + i * TileSetRenderer.TileSize.Width + x] = c;
}
resourceImage.UnlockBits(srcdata);
@@ -279,12 +304,12 @@ namespace OpenRA.Editor
bitmap.UnlockBits(data);
if (ShowGrid)
using( var g = SGraphics.FromImage(bitmap) )
using (var g = SGraphics.FromImage(bitmap))
{
var rect = new Rectangle(0,0,bitmap.Width, bitmap.Height);
ControlPaint.DrawGrid( g, rect, new Size(2, Game.CellSize), Color.DarkRed );
ControlPaint.DrawGrid( g, rect, new Size(Game.CellSize, 2), Color.DarkRed );
ControlPaint.DrawGrid( g, rect, new Size(Game.CellSize, Game.CellSize), Color.Red );
var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
ControlPaint.DrawGrid(g, rect, new Size(2, Game.CellSize), Color.DarkRed);
ControlPaint.DrawGrid(g, rect, new Size(Game.CellSize, 2), Color.DarkRed);
ControlPaint.DrawGrid(g, rect, new Size(Game.CellSize, Game.CellSize), Color.Red);
}
return bitmap;
@@ -292,17 +317,17 @@ namespace OpenRA.Editor
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 CPos(vX / TileSet.TileSize, vY / TileSet.TileSize);
var vX = (int)Math.Floor((mousePos.X - Offset.X) / Zoom);
var vY = (int)Math.Floor((mousePos.Y - Offset.Y) / Zoom);
return new CPos(vX / TileSetRenderer.TileSize.Width, vY / TileSetRenderer.TileSize.Height);
}
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);
var vX = (int)Math.Floor((mousePos.X - Offset.X) / Zoom);
var vY = (int)Math.Floor((mousePos.Y - Offset.Y) / Zoom);
return new CPos((vX + TileSetRenderer.TileSize.Width - 1) / TileSetRenderer.TileSize.Width,
(vY + TileSetRenderer.TileSize.Height - 1) / TileSetRenderer.TileSize.Height);
}
public void DrawActor(SGraphics g, CPos p, ActorTemplate t, ColorPalette cp)
@@ -316,11 +341,11 @@ namespace OpenRA.Editor
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 - TileSetRenderer.TileSize.Width / 2 : 0;
float drawX = TileSetRenderer.TileSize.Width * 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 - TileSetRenderer.TileSize.Height / 2 : 0;
float drawY = TileSetRenderer.TileSize.Height * location.Y * Zoom + Offset.Y - offsetY;
return new float2(drawX, drawY);
}
@@ -352,18 +377,18 @@ namespace OpenRA.Editor
{
var pr = Map.Players[name];
var pcpi = Rules.Info["player"].Traits.Get<PlayerColorPaletteInfo>();
var remap = new PlayerColorRemap(pcpi.RemapIndex, pr.ColorRamp);
var remap = new PlayerColorRemap(pcpi.RemapIndex, pr.Color, pcpi.Ramp);
return new Palette(PlayerPalette, remap).AsSystemPalette();
}
Cache<string, ColorPalette> PlayerPalettes;
Cache<string, ColorPalette> playerPalettes;
public ColorPalette GetPaletteForPlayer(string player)
{
if (PlayerPalettes == null)
PlayerPalettes = new Cache<string, ColorPalette>(GetPaletteForPlayerInner);
if (playerPalettes == null)
playerPalettes = new Cache<string, ColorPalette>(GetPaletteForPlayerInner);
return PlayerPalettes[player];
return playerPalettes[player];
}
ColorPalette GetPaletteForActor(ActorReference ar)
@@ -386,26 +411,26 @@ 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;
var drawX = TileSetRenderer.TileSize.Width * (float)ChunkSize * (float)x.X * Zoom + Offset.X;
var drawY = TileSetRenderer.TileSize.Height * (float)ChunkSize * (float)x.Y * Zoom + Offset.Y;
RectangleF sourceRect = new RectangleF(0, 0, bmp.Width, bmp.Height);
RectangleF destRect = new RectangleF(DrawX, DrawY, bmp.Width * Zoom, bmp.Height * Zoom);
RectangleF destRect = new RectangleF(drawX, drawY, bmp.Width * Zoom, bmp.Height * Zoom);
e.Graphics.DrawImage(bmp, destRect, sourceRect, GraphicsUnit.Pixel);
}
e.Graphics.DrawRectangle(CordonPen,
Map.Bounds.Left * TileSet.TileSize * Zoom + Offset.X,
Map.Bounds.Top * TileSet.TileSize * Zoom + Offset.Y,
Map.Bounds.Width * TileSet.TileSize * Zoom,
Map.Bounds.Height * TileSet.TileSize * Zoom);
Map.Bounds.Left * TileSetRenderer.TileSize.Width * Zoom + Offset.X,
Map.Bounds.Top * TileSetRenderer.TileSize.Height * Zoom + Offset.Y,
Map.Bounds.Width * TileSetRenderer.TileSize.Width * Zoom,
Map.Bounds.Height * TileSetRenderer.TileSize.Height * 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);
(SelectionStart.X * TileSetRenderer.TileSize.Width * Zoom) + Offset.X,
(SelectionStart.Y * TileSetRenderer.TileSize.Height * Zoom) + Offset.Y,
(SelectionEnd - SelectionStart).X * TileSetRenderer.TileSize.Width * Zoom,
(SelectionEnd - SelectionStart).Y * TileSetRenderer.TileSize.Height * Zoom);
if (IsPaste)
{
@@ -414,16 +439,16 @@ namespace OpenRA.Editor
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));
(loc.X * TileSetRenderer.TileSize.Width * Zoom) + Offset.X,
(loc.Y * TileSetRenderer.TileSize.Height * Zoom) + Offset.Y,
width * (TileSetRenderer.TileSize.Width * Zoom),
height * (TileSetRenderer.TileSize.Height * Zoom));
}
foreach (var ar in Map.Actors.Value)
{
if (ActorTemplates.ContainsKey(ar.Value.Type))
DrawActor(e.Graphics, ar.Value.Location(), ActorTemplates[ar.Value.Type],
if (actorTemplates.ContainsKey(ar.Value.Type))
DrawActor(e.Graphics, ar.Value.Location(), actorTemplates[ar.Value.Type],
GetPaletteForActor(ar.Value));
else
Console.WriteLine("Warning: Unknown or excluded actor: {0}", ar.Value.Type);
@@ -433,19 +458,40 @@ namespace OpenRA.Editor
foreach (var ar in Map.Actors.Value)
if (!ar.Key.StartsWith("Actor")) // if it has a custom name
e.Graphics.DrawStringContrast(Font, ar.Key,
(int)(ar.Value.Location().X * TileSet.TileSize * Zoom + Offset.X),
(int)(ar.Value.Location().Y * TileSet.TileSize * Zoom + Offset.Y),
(int)(ar.Value.Location().X * TileSetRenderer.TileSize.Width * Zoom + Offset.X),
(int)(ar.Value.Location().Y * TileSetRenderer.TileSize.Height * Zoom + Offset.Y),
Brushes.White,
Brushes.Black);
if (Tool != null)
Tool.Preview(this, e.Graphics);
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 * TileSetRenderer.TileSize.Width * Zoom + Offset.X, (Map.Bounds.Top - 8) * TileSetRenderer.TileSize.Height * Zoom + Offset.Y);
e.Graphics.DrawString((i - Map.Bounds.Left).ToString(), MarkerFont, TextBrush, point);
}
}
if (Tool == null)
for (int i = Map.Bounds.Top; i <= Map.Bounds.Bottom; i += 8)
{
if (i % 8 == 0)
{
PointF point = new PointF((Map.Bounds.Left - 8) * TileSetRenderer.TileSize.Width * Zoom + Offset.X, i * TileSetRenderer.TileSize.Height * Zoom + Offset.Y);
e.Graphics.DrawString((i - Map.Bounds.Left).ToString(), MarkerFont, TextBrush, point);
}
}
}
if (currentTool != null)
currentTool.Preview(this, e.Graphics);
if (currentTool == null)
{
var x = Map.Actors.Value.FirstOrDefault(a => a.Value.Location() == GetBrushLocation());
if (x.Key != null)
DrawActorBorder(e.Graphics, x.Value.Location(), ActorTemplates[x.Value.Type]);
DrawActorBorder(e.Graphics, x.Value.Location(), actorTemplates[x.Value.Type]);
}
}
@@ -467,7 +513,7 @@ namespace OpenRA.Editor
{
for (int y = 0; y < height; y++)
{
//todo: crash prevention
// 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];
}
@@ -487,7 +533,7 @@ namespace OpenRA.Editor
var mapX = loc.X + x;
var mapY = loc.Y + y;
//todo: crash prevention for outside of bounds
// TODO: crash prevention for outside of bounds
Map.MapTiles.Value[mapX, mapY] = TileSelection[x, y];
Map.MapResources.Value[mapX, mapY] = ResourceSelection[x, y];
@@ -499,6 +545,7 @@ namespace OpenRA.Editor
}
}
}
AfterChange();
}
@@ -510,22 +557,4 @@ namespace OpenRA.Editor
ResourceSelection = null;
}
}
static class ActorReferenceExts
{
public static CPos Location(this ActorReference ar)
{
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)
{
g.DrawString(s, f, bg, x - 1, y - 1);
g.DrawString(s, f, bg, x + 1, y - 1);
g.DrawString(s, f, bg, x - 1, y + 1);
g.DrawString(s, f, bg, x + 1, y + 1);
g.DrawString(s, f, fg, x, y);
}
}
}

View File

@@ -39,14 +39,15 @@ namespace OpenRA.FileFormats
default: s.Push(int.Parse(t)); break;
}
}
return s.Pop();
}
static void ApplyBinop( Stack<int> s, Func<int,int,int> f )
static void ApplyBinop(Stack<int> s, Func<int, int, int> f)
{
var x = s.Pop();
var y = s.Pop();
s.Push( f(x,y) );
s.Push(f(x, y));
}
static IEnumerable<string> ToPostfix(IEnumerable<string> toks, Dictionary<string, int> syms)

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);
@@ -156,9 +129,9 @@ namespace OpenRA
return xs.Except(ys).Concat(ys.Except(xs));
}
public static IEnumerable<T> Iterate<T>( this T t, Func<T,T> f )
public static IEnumerable<T> Iterate<T>(this T t, Func<T, T> f)
{
for(;;) { yield return t; t = f(t); }
for (;;) { yield return t; t = f(t); }
}
public static int NextPowerOf2(int v)
@@ -172,6 +145,11 @@ 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)
@@ -179,7 +157,7 @@ namespace OpenRA
return string.Join(j, ts.Select(t => t.ToString()).ToArray());
}
public static IEnumerable<T> Append<T>( this IEnumerable<T> ts, params T[] moreTs)
public static IEnumerable<T> Append<T>(this IEnumerable<T> ts, params T[] moreTs)
{
return ts.Concat(moreTs);
}
@@ -226,8 +204,8 @@ namespace OpenRA
// 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);
var badKeysFormatted = string.Join(", ", dupKeys.Select(p => "{0}: [{1}]".F(logKey(p.Key), string.Join(",", p.Value.ToArray()))).ToArray());
var msg = "{0}, duplicate values found for the following keys: {1}".F(debugName, badKeysFormatted);
Log.Write("debug", msg);
throw new ArgumentException(msg);
}
@@ -254,7 +232,31 @@ namespace OpenRA
return result;
}
public static T[,] ResizeArray<T>(T[,] ts, T t, int width, int height)
{
var result = new T[width, height];
for (var i = 0; i < width; i++)
for (var j = 0; j < height; j++)
result[i, j] = i <= ts.GetUpperBound(0) && j <= ts.GetUpperBound(1)
? ts[i, j] : t;
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>

View File

@@ -11,57 +11,58 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Globalization;
namespace OpenRA.FileFormats
{
public static class FieldLoader
{
public static Func<string,Type,string,object> InvalidValueAction = (s,t,f) =>
public static Func<string, Type, string, object> InvalidValueAction = (s, t, f) =>
{
throw new InvalidOperationException("FieldLoader: Cannot parse `{0}` into `{1}.{2}` ".F(s,f,t) );
throw new InvalidOperationException("FieldLoader: Cannot parse `{0}` into `{1}.{2}` ".F(s, f, t));
};
public static Action<string,Type> UnknownFieldAction = (s,f) =>
public static Action<string, Type> UnknownFieldAction = (s, f) =>
{
throw new NotImplementedException( "FieldLoader: Missing field `{0}` on `{1}`".F( s, f.Name ) );
throw new NotImplementedException("FieldLoader: Missing field `{0}` on `{1}`".F(s, f.Name));
};
public static void Load( object self, MiniYaml my )
public static void Load(object self, MiniYaml my)
{
var loadDict = typeLoadInfo[ self.GetType() ];
var loadDict = typeLoadInfo[self.GetType()];
foreach( var kv in loadDict )
foreach (var kv in loadDict)
{
object val;
if( kv.Value != null )
val = kv.Value( kv.Key.Name, kv.Key.FieldType, my );
else if( !TryGetValueFromYaml( kv.Key.Name, kv.Key.FieldType, my, out val ) )
if (kv.Value != null)
val = kv.Value(kv.Key.Name, kv.Key.FieldType, my);
else if (!TryGetValueFromYaml(kv.Key.Name, kv.Key.FieldType, my, out val))
continue;
kv.Key.SetValue( self, val );
kv.Key.SetValue(self, val);
}
}
static bool TryGetValueFromYaml( string fieldName, Type fieldType, MiniYaml yaml, out object ret )
static bool TryGetValueFromYaml(string fieldName, Type fieldType, MiniYaml yaml, out object ret)
{
ret = null;
var n = yaml.Nodes.Where( x=>x.Key == fieldName ).ToList();
if( n.Count == 0 )
var n = yaml.Nodes.Where(x => x.Key == fieldName).ToList();
if (n.Count == 0)
return false;
if( n.Count == 1 && n[ 0 ].Value.Nodes.Count == 0 )
if (n.Count == 1 && n[0].Value.Nodes.Count == 0)
{
ret = GetValue( fieldName, fieldType, n[ 0 ].Value.Value );
ret = GetValue(fieldName, fieldType, n[0].Value.Value);
return true;
}
else if ( n.Count > 1 )
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 ) );
throw new InvalidOperationException("TryGetValueFromYaml: unable to load field {0} (of type {1})".F(fieldName, fieldType));
}
public static T Load<T>(MiniYaml y) where T : new()
@@ -71,19 +72,19 @@ namespace OpenRA.FileFormats
return t;
}
static readonly object[] NoIndexes = {};
public static void LoadField( object self, string key, string value )
static readonly object[] NoIndexes = { };
public static void LoadField(object self, string key, string value)
{
var field = self.GetType().GetField( key.Trim() );
var field = self.GetType().GetField(key.Trim());
if( field != null )
if (field != null)
{
if (!field.HasAttribute<FieldFromYamlKeyAttribute>())
field.SetValue( self, GetValue( field.Name, field.FieldType, value ) );
field.SetValue(self, GetValue(field.Name, field.FieldType, value));
return;
}
var prop = self.GetType().GetProperty( key.Trim() );
var prop = self.GetType().GetProperty(key.Trim());
if (prop != null)
{
@@ -92,47 +93,48 @@ namespace OpenRA.FileFormats
return;
}
UnknownFieldAction( key.Trim(), self.GetType() );
UnknownFieldAction(key.Trim(), self.GetType());
}
public static T GetValue<T>( string field, string value )
public static T GetValue<T>(string field, string value)
{
return (T) GetValue( field, typeof(T), value );
return (T)GetValue(field, typeof(T), value);
}
public static object GetValue( string field, Type fieldType, string x )
public static object GetValue(string field, Type fieldType, string x)
{
if (x != null) x = x.Trim();
if( fieldType == typeof( int ) )
if (fieldType == typeof(int))
{
int res;
if (int.TryParse(x,out res))
if (int.TryParse(x, out res))
return res;
return InvalidValueAction(x,fieldType, field);
return InvalidValueAction(x, fieldType, field);
}
else if( fieldType == typeof( ushort ) )
else if (fieldType == typeof(ushort))
{
ushort res;
if (ushort.TryParse(x,out res))
if (ushort.TryParse(x, out res))
return res;
return InvalidValueAction(x,fieldType, field);
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(float))
{
float res;
if (float.TryParse(x.Replace("%",""), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out res))
return res * (x.Contains( '%' ) ? 0.01f : 1f);
return InvalidValueAction(x,fieldType, field);
if (float.TryParse(x.Replace("%", ""), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out res))
return res * (x.Contains('%') ? 0.01f : 1f);
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(decimal))
{
decimal res;
if (decimal.TryParse(x.Replace("%",""), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out res))
return res * (x.Contains( '%' ) ? 0.01m : 1m);
return InvalidValueAction(x,fieldType, field);
if (decimal.TryParse(x.Replace("%", ""), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out res))
return res * (x.Contains('%') ? 0.01m : 1m);
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(string))
@@ -145,18 +147,75 @@ namespace OpenRA.FileFormats
return Color.FromArgb(int.Parse(parts[0]).Clamp(0, 255), int.Parse(parts[1]).Clamp(0, 255), int.Parse(parts[2]).Clamp(0, 255));
if (parts.Length == 4)
return Color.FromArgb(int.Parse(parts[0]).Clamp(0, 255), int.Parse(parts[1]).Clamp(0, 255), int.Parse(parts[2]).Clamp(0, 255), int.Parse(parts[3]).Clamp(0, 255));
return InvalidValueAction(x,fieldType, field);
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);
}
@@ -183,11 +242,13 @@ namespace OpenRA.FileFormats
ret.SetValue(GetValue(field, fieldType.GetElementType(), parts[i].Trim()), i);
return ret;
}
else if (fieldType == typeof(int2))
{
var parts = x.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
return new int2(int.Parse(parts[0]), int.Parse(parts[1]));
}
else if (fieldType == typeof(float2))
{
var parts = x.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
@@ -200,11 +261,13 @@ namespace OpenRA.FileFormats
yy = res * (parts[1].Contains('%') ? 0.01f : 1f);
return new float2(xx, yy);
}
else if (fieldType == typeof(Rectangle))
{
var parts = x.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
return new Rectangle(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3]));
}
else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Bits<>))
{
var parts = x.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
@@ -213,62 +276,69 @@ namespace OpenRA.FileFormats
return fieldType.GetConstructor(argTypes).Invoke(argValues);
}
UnknownFieldAction("[Type] {0}".F(x),fieldType);
else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
var innerType = fieldType.GetGenericArguments().First();
var innerValue = GetValue("Nullable<T>", innerType, x);
return fieldType.GetConstructor(new []{ innerType }).Invoke(new []{ innerValue });
}
UnknownFieldAction("[Type] {0}".F(x), fieldType);
return null;
}
static object ParseYesNo( string p, System.Type fieldType, string field )
static object ParseYesNo(string p, System.Type fieldType, string field)
{
p = p.ToLowerInvariant();
if( p == "yes" ) return true;
if( p == "true" ) return true;
if( p == "no" ) return false;
if( p == "false" ) return false;
return InvalidValueAction(p,fieldType, field);
if (p == "yes") return true;
if (p == "true") return true;
if (p == "no") return false;
if (p == "false") return false;
return InvalidValueAction(p, fieldType, field);
}
static Cache<Type, Dictionary<FieldInfo, Func<string, Type, MiniYaml, object>>> typeLoadInfo = new Cache<Type, Dictionary<FieldInfo, Func<string, Type, MiniYaml, object>>>( GetTypeLoadInfo );
static Cache<Type, Dictionary<FieldInfo, Func<string, Type, MiniYaml, object>>> typeLoadInfo = new Cache<Type, Dictionary<FieldInfo, Func<string, Type, MiniYaml, object>>>(GetTypeLoadInfo);
static Dictionary<FieldInfo, Func<string, Type, MiniYaml, object>> GetTypeLoadInfo( Type type )
static Dictionary<FieldInfo, Func<string, Type, MiniYaml, object>> GetTypeLoadInfo(Type type)
{
var ret = new Dictionary<FieldInfo, Func<string, Type, MiniYaml, object>>();
foreach( var ff in type.GetFields() )
foreach (var ff in type.GetFields())
{
var field = ff;
var ignore = field.GetCustomAttributes<IgnoreAttribute>( false );
var loadUsing = field.GetCustomAttributes<LoadUsingAttribute>( false );
var fromYamlKey = field.GetCustomAttributes<FieldFromYamlKeyAttribute>( false );
if( loadUsing.Length != 0 )
ret[ field ] = ( _1, fieldType, yaml ) => loadUsing[ 0 ].LoaderFunc( field )( yaml );
else if( fromYamlKey.Length != 0 )
ret[ field ] = ( f, ft, yaml ) => GetValue( f, ft, yaml.Value );
else if( ignore.Length == 0 )
ret[ field ] = null;
var ignore = field.GetCustomAttributes<IgnoreAttribute>(false);
var loadUsing = field.GetCustomAttributes<LoadUsingAttribute>(false);
var fromYamlKey = field.GetCustomAttributes<FieldFromYamlKeyAttribute>(false);
if (loadUsing.Length != 0)
ret[field] = (_1, fieldType, yaml) => loadUsing[0].LoaderFunc(field)(yaml);
else if (fromYamlKey.Length != 0)
ret[field] = (f, ft, yaml) => GetValue(f, ft, yaml.Value);
else if (ignore.Length == 0)
ret[field] = null;
}
return ret;
}
[AttributeUsage( AttributeTargets.Field )]
[AttributeUsage(AttributeTargets.Field)]
public class IgnoreAttribute : Attribute { }
[AttributeUsage( AttributeTargets.Field )]
[AttributeUsage(AttributeTargets.Field)]
public class LoadUsingAttribute : Attribute
{
Func<MiniYaml, object> loaderFuncCache;
public readonly string Loader;
public LoadUsingAttribute( string loader )
public LoadUsingAttribute(string loader)
{
Loader = loader;
}
internal Func<MiniYaml, object> LoaderFunc( FieldInfo field )
internal Func<MiniYaml, object> LoaderFunc(FieldInfo field)
{
const BindingFlags bf = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
if( loaderFuncCache == null )
loaderFuncCache = (Func<MiniYaml, object>)Delegate.CreateDelegate( typeof( Func<MiniYaml, object> ), field.DeclaringType.GetMethod( Loader, bf ) );
const BindingFlags BindingFlag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
if (loaderFuncCache == null)
loaderFuncCache = (Func<MiniYaml, object>)Delegate.CreateDelegate(typeof(Func<MiniYaml, object>), field.DeclaringType.GetMethod(Loader, BindingFlag));
return loaderFuncCache;
}
}
@@ -281,15 +351,15 @@ namespace OpenRA.FileFormats
var nodes = new List<MiniYamlNode>();
string root = null;
foreach( var f in o.GetType().GetFields( BindingFlags.Public | BindingFlags.Instance ) )
foreach (var f in o.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance))
{
if( f.HasAttribute<FieldFromYamlKeyAttribute>() )
root = FormatValue( o, f );
if (f.HasAttribute<FieldFromYamlKeyAttribute>())
root = FormatValue(o, f);
else
nodes.Add( new MiniYamlNode( f.Name, FormatValue( o, f ) ) );
nodes.Add(new MiniYamlNode(f.Name, FormatValue(o, f)));
}
return new MiniYaml( root, nodes );
return new MiniYaml(root, nodes);
}
public static MiniYaml SaveDifferences(object o, object from)
@@ -298,16 +368,14 @@ namespace OpenRA.FileFormats
throw new InvalidOperationException("FieldLoader: can't diff objects of different types");
var fields = o.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance)
.Where(f => FormatValue(o,f) != FormatValue(from,f));
.Where(f => FormatValue(o, f) != FormatValue(from, f));
return new MiniYaml( null, fields.Select( f => new MiniYamlNode(
f.Name,
FormatValue( o, f ) ) ).ToList() );
return new MiniYaml(null, fields.Select(f => new MiniYamlNode(f.Name, FormatValue(o, f))).ToList());
}
public static MiniYamlNode SaveField(object o, string field)
{
return new MiniYamlNode(field, FieldSaver.FormatValue( o, o.GetType().GetField(field) ));
return new MiniYamlNode(field, FieldSaver.FormatValue(o, o.GetType().GetField(field)));
}
public static string FormatValue(object v, Type t)
@@ -351,4 +419,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

@@ -44,8 +44,8 @@ namespace OpenRA.FileFormats
public static class AudLoader
{
static int[] IndexAdjust = { -1, -1, -1, -1, 2, 4, 6, 8 };
static int[] StepTable = {
static int[] indexAdjust = { -1, -1, -1, -1, 2, 4, 6, 8 };
static int[] stepTable = {
7, 8, 9, 10, 11, 12, 13, 14, 16,
17, 19, 21, 23, 25, 28, 31, 34, 37,
41, 45, 50, 55, 60, 66, 73, 80, 88,
@@ -62,14 +62,14 @@ namespace OpenRA.FileFormats
var sb = (b & 8) != 0;
b &= 7;
var delta = (StepTable[index] * b) / 4 + StepTable[index] / 8;
var delta = (stepTable[index] * b) / 4 + stepTable[index] / 8;
if (sb) delta = -delta;
current += delta;
if (current > short.MaxValue) current = short.MaxValue;
if (current < short.MinValue) current = short.MinValue;
index += IndexAdjust[b];
index += indexAdjust[b];
if (index < 0) index = 0;
if (index > 88) index = 88;
@@ -108,7 +108,7 @@ namespace OpenRA.FileFormats
var sampleRate = br.ReadUInt16();
/*var dataSize = */ br.ReadInt32();
var outputSize = br.ReadInt32();
var flags = (SoundFlags) br.ReadByte();
var flags = (SoundFlags)br.ReadByte();
var samples = outputSize;
if (0 != (flags & SoundFlags.Stereo)) samples /= 2;

View File

@@ -59,24 +59,24 @@ namespace OpenRA.FileFormats
// Decode PKWare Compression Library stream.
public static byte[] Decompress(byte[] src)
{
BitReader br = new BitReader(src);
var br = new BitReader(src);
// Are literals coded?
int coded = br.ReadBits(8);
var coded = br.ReadBits(8);
if (coded < 0 || coded > 1)
throw new NotImplementedException("Invalid datastream");
bool EncodedLiterals = (coded == 1);
var EncodedLiterals = coded == 1;
// log2(dictionary size) - 6
int dict = br.ReadBits(8);
var dict = br.ReadBits(8);
if (dict < 4 || dict > 6)
throw new InvalidDataException("Invalid dictionary size");
// output state
ushort next = 0; // index of next write location in out[]
bool first = true; // true to check distances (for first 4K)
byte[] outBuffer = new byte[MAXWIN]; // output buffer and sliding window
var first = true; // true to check distances (for first 4K)
var outBuffer = new byte[MAXWIN]; // output buffer and sliding window
var ms = new MemoryStream();
// decode literals and length/distance pairs
@@ -86,9 +86,11 @@ namespace OpenRA.FileFormats
if (br.ReadBits(1) == 1)
{
// Length
int symbol = Decode(lencode, br);
int len = lengthbase[symbol] + br.ReadBits(extra[symbol]);
if (len == 519) // Magic number for "done"
var symbol = Decode(lencode, br);
var len = lengthbase[symbol] + br.ReadBits(extra[symbol]);
// Magic number for "done"
if (len == 519)
{
for (int i = 0; i < next; i++)
ms.WriteByte(outBuffer[i]);
@@ -97,7 +99,7 @@ namespace OpenRA.FileFormats
// Distance
symbol = len == 2 ? 2 : dict;
int dist = Decode(distcode, br) << symbol;
var dist = Decode(distcode, br) << symbol;
dist += br.ReadBits(symbol);
dist++;
@@ -107,10 +109,10 @@ namespace OpenRA.FileFormats
// copy length bytes from distance bytes back
do
{
int dest = next;
int source = dest - dist;
var dest = next;
var source = dest - dist;
int copy = MAXWIN;
var copy = MAXWIN;
if (next < dist)
{
source += copy;
@@ -127,7 +129,7 @@ namespace OpenRA.FileFormats
// copy with old-fashioned memcpy semantics
// in case of overlapping ranges. this is NOT
// the same as Array.Copy()
while( copy-- > 0 )
while (copy-- > 0)
outBuffer[dest++] = outBuffer[source++];
// Flush window to outstream
@@ -140,9 +142,10 @@ namespace OpenRA.FileFormats
}
} while (len != 0);
}
else // literal value
// literal value
else
{
int symbol = EncodedLiterals ? Decode(litcode, br) : br.ReadBits(8);
var symbol = EncodedLiterals ? Decode(litcode, br) : br.ReadBits(8);
outBuffer[next++] = (byte)symbol;
if (next == MAXWIN)
{
@@ -160,9 +163,9 @@ namespace OpenRA.FileFormats
// Decode a code using huffman table h.
static int Decode(Huffman h, BitReader br)
{
int code = 0; // len bits being decoded
int first = 0; // first code of length len
int index = 0; // index of first code of length len in symbol table
var code = 0; // len bits being decoded
var first = 0; // first code of length len
var index = 0; // index of first code of length len in symbol table
short next = 1;
while (true)
{
@@ -193,8 +196,8 @@ namespace OpenRA.FileFormats
public int ReadBits(int count)
{
int ret = 0;
int filled = 0;
var ret = 0;
var filled = 0;
while (filled < count)
{
if (bitCount == 0)
@@ -208,6 +211,7 @@ namespace OpenRA.FileFormats
bitCount--;
filled++;
}
return ret;
}
}
@@ -226,21 +230,22 @@ namespace OpenRA.FileFormats
public short[] Count; // number of symbols of each length
public short[] Symbol; // canonically ordered symbols
public Huffman(byte[] rep, int n, short SymbolCount)
public Huffman(byte[] rep, int n, short symbolCount)
{
short[] length = new short[256]; // code lengths
int s = 0; // current symbol
var length = new short[256]; // code lengths
var s = 0; // current symbol
// convert compact repeat counts into symbol bit length list
foreach (byte code in rep)
{
int num = (code >> 4) + 1; // Number of codes (top four bits plus 1)
byte len = (byte)(code & 15); // Code length (low four bits)
var num = (code >> 4) + 1; // Number of codes (top four bits plus 1)
var len = (byte)(code & 15); // Code length (low four bits)
do
{
length[s++] = len;
} while (--num > 0);
}
n = s;
// count number of codes of each length
@@ -253,24 +258,22 @@ namespace OpenRA.FileFormats
return;
// check for an over-subscribed or incomplete set of lengths
int left = 1; // one possible code of zero length
var left = 1; // one possible code of zero length
for (int len = 1; len <= Blast.MAXBITS; len++)
{
left <<= 1;
// one more bit, double codes left
left -= Count[len];
// deduct count from possible codes
left <<= 1; // one more bit, double codes left
left -= Count[len]; // deduct count from possible codes
if (left < 0)
throw new InvalidDataException ("over subscribed code set");
throw new InvalidDataException("over subscribed code set");
}
// generate offsets into symbol table for each length for sorting
short[] offs = new short[Blast.MAXBITS + 1];
var offs = new short[Blast.MAXBITS + 1];
for (int len = 1; len < Blast.MAXBITS; len++)
offs[len + 1] = (short)(offs[len] + Count[len]);
// put symbols in table sorted by length, by symbol order within each length
Symbol = new short[SymbolCount];
Symbol = new short[symbolCount];
for (short i = 0; i < n; i++)
if (length[i] != 0)
Symbol[offs[length[i]]++] = i;

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

@@ -20,93 +20,93 @@ namespace OpenRA.FileFormats
{
Dictionary<string, IniSection> sections = new Dictionary<string, IniSection>();
public IniFile( Stream s )
public IniFile(Stream s)
{
Load( s );
Load(s);
}
public IniFile( params Stream[] streams )
public IniFile(params Stream[] streams)
{
foreach( var s in streams )
Load( s );
foreach (var s in streams)
Load(s);
}
public void Load( Stream s )
public void Load(Stream s)
{
StreamReader reader = new StreamReader( s );
StreamReader reader = new StreamReader(s);
IniSection currentSection = null;
while( !reader.EndOfStream )
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
var line = reader.ReadLine();
if( line.Length == 0 ) continue;
if (line.Length == 0) continue;
switch( line[ 0 ] )
switch (line[0])
{
case ';': break;
case '[': currentSection = ProcessSection( line ); break;
default: ProcessEntry( line, currentSection ); break;
case '[': currentSection = ProcessSection(line); break;
default: ProcessEntry(line, currentSection); break;
}
}
}
Regex sectionPattern = new Regex( @"^\[([^]]*)\]" );
Regex sectionPattern = new Regex(@"^\[([^]]*)\]");
IniSection ProcessSection( string line )
IniSection ProcessSection(string line)
{
Match m = sectionPattern.Match( line );
if( m == null || !m.Success )
Match m = sectionPattern.Match(line);
if (m == null || !m.Success)
return null;
string sectionName = m.Groups[ 1 ].Value.ToLowerInvariant();
string sectionName = m.Groups[1].Value.ToLowerInvariant();
IniSection ret;
if( !sections.TryGetValue( sectionName, out ret ) )
sections.Add( sectionName, ret = new IniSection( sectionName ) );
if (!sections.TryGetValue(sectionName, out ret))
sections.Add(sectionName, ret = new IniSection(sectionName));
return ret;
}
bool ProcessEntry( string line, IniSection currentSection )
bool ProcessEntry(string line, IniSection currentSection)
{
int comment = line.IndexOf( ';' );
if( comment >= 0 )
line = line.Substring( 0, comment );
var comment = line.IndexOf(';');
if (comment >= 0)
line = line.Substring(0, comment);
line = line.Trim();
if( line.Length == 0 )
if (line.Length == 0)
return false;
var key = line;
var value = "";
int eq = line.IndexOf( '=' );
if( eq >= 0 )
int eq = line.IndexOf('=');
if (eq >= 0)
{
key = line.Substring( 0, eq );
value = line.Substring( eq + 1, line.Length - eq - 1 );
key = line.Substring(0, eq);
value = line.Substring(eq + 1, line.Length - eq - 1);
}
if( currentSection == null )
throw new InvalidOperationException( "No current INI section" );
if (currentSection == null)
throw new InvalidOperationException("No current INI section");
if( !currentSection.Contains( key ) )
currentSection.Add( key, value );
if (!currentSection.Contains(key))
currentSection.Add(key, value);
return true;
}
public IniSection GetSection( string s )
public IniSection GetSection(string s)
{
return GetSection( s, false );
return GetSection(s, false);
}
public IniSection GetSection( string s, bool allowFail )
public IniSection GetSection(string s, bool allowFail)
{
IniSection section;
if( sections.TryGetValue( s.ToLowerInvariant(), out section ) )
if (sections.TryGetValue(s.ToLowerInvariant(), out section))
return section;
if( allowFail )
return new IniSection( s );
throw new InvalidOperationException( "Section does not exist in map or rules: " + s );
if (allowFail)
return new IniSection(s);
throw new InvalidOperationException("Section does not exist in map or rules: " + s);
}
public IEnumerable<IniSection> Sections { get { return sections.Values; } }
@@ -117,25 +117,25 @@ namespace OpenRA.FileFormats
public string Name { get; private set; }
Dictionary<string, string> values = new Dictionary<string, string>();
public IniSection( string name )
public IniSection(string name)
{
Name = name;
}
public void Add( string key, string value )
public void Add(string key, string value)
{
values[key] = value;
}
public bool Contains( string key )
public bool Contains(string key)
{
return values.ContainsKey( key );
return values.ContainsKey(key);
}
public string GetValue( string key, string defaultValue )
public string GetValue(string key, string defaultValue)
{
string s;
return values.TryGetValue( key, out s ) ? s : defaultValue;
return values.TryGetValue(key, out s) ? s : defaultValue;
}
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()

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();
@@ -125,21 +149,25 @@ namespace OpenRA.FileFormats
public static Stream Open(string filename) { return OpenWithExts(filename, ""); }
public static Stream OpenWithExts( string filename, params string[] exts )
public static Stream OpenWithExts(string filename, params string[] exts)
{
if( filename.IndexOfAny( new char[] { '/', '\\' } ) == -1 )
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)
{
var folder = mountedFolders
var folder = MountedFolders
.Where(x => x.Exists(filename + ext))
.OrderByDescending(x => x.Priority)
.FirstOrDefault();
@@ -151,7 +179,7 @@ namespace OpenRA.FileFormats
throw new FileNotFoundException("File not found: {0}".F(filename), filename);
}
public static bool Exists(string filename) { return mountedFolders.Any(f => f.Exists(filename)); }
public static bool Exists(string filename) { return MountedFolders.Any(f => f.Exists(filename)); }
static Dictionary<string, Assembly> assemblyCache = new Dictionary<string, Assembly>();

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,127 +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).ToDictionaryWithConflictLog(x => x.Hash,
"MixFile.RaHeader", null, x => "(offs={0}, len={1})".F(x.Offset, x.Length)
);
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).ToDictionaryWithConflictLog(x => x.Hash,
"MixFile.TdHeader", null, x => "(offs={0}, len={1})".F(x.Offset, x.Length)
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)
@@ -148,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
@@ -190,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
@@ -214,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

@@ -32,15 +32,17 @@ namespace OpenRA.FileFormats.Graphics
IGraphicsDevice Create( Size size, WindowMode windowMode );
}
public enum BlendMode { None, Alpha, Additive }
public interface IGraphicsDevice
{
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 +53,11 @@ 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 SetBlendMode(BlendMode mode);
}
public interface IVertexBuffer<T>
@@ -61,9 +68,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 +81,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

@@ -0,0 +1,97 @@
#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.Drawing;
using System.IO;
namespace OpenRA.FileFormats
{
public class R8Image
{
public readonly Size Size;
public readonly int2 Offset;
public readonly byte[] Image;
// Legacy variable. Can be removed when the utility command is made sensible.
public readonly Size FrameSize;
public R8Image(Stream s)
{
// Scan forward until we find some data
var type = s.ReadUInt8();
while (type == 0)
type = s.ReadUInt8();
var width = s.ReadInt32();
var height = s.ReadInt32();
var x = s.ReadInt32();
var y = s.ReadInt32();
Size = new Size(width, height);
Offset = new int2(width/2 - x, height/2 - y);
/*var imageOffset = */s.ReadInt32();
var paletteOffset = s.ReadInt32();
var bpp = s.ReadUInt8();
if (bpp != 8)
throw new InvalidDataException("Error: {0} bits per pixel are not supported.".F(bpp));
var frameHeight = s.ReadUInt8();
var frameWidth = s.ReadUInt8();
FrameSize = new Size(frameWidth, frameHeight);
// Skip alignment byte
s.ReadUInt8();
// Ignore palette header
if (type == 1 && paletteOffset != 0)
s.Seek(8, SeekOrigin.Current);
Image = s.ReadBytes(width*height);
// Ignore palette data
if (type == 1 && paletteOffset != 0)
s.Seek(512, SeekOrigin.Current);
}
}
public class R8Reader : IEnumerable<R8Image>
{
readonly List<R8Image> headers = new List<R8Image>();
public readonly int Frames;
public R8Reader(Stream stream)
{
while (stream.Position < stream.Length)
{
headers.Add(new R8Image(stream));
Frames++;
}
}
public R8Image this[int index]
{
get { return headers[index]; }
}
public IEnumerator<R8Image> GetEnumerator()
{
return headers.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}

View File

@@ -62,9 +62,9 @@ namespace OpenRA.FileFormats
int recurseDepth = 0;
public ShpReader( Stream stream )
public ShpReader(Stream stream)
{
using( var reader = new BinaryReader( stream ) )
using (var reader = new BinaryReader(stream))
{
ImageCount = reader.ReadUInt16();
reader.ReadUInt16();
@@ -73,60 +73,60 @@ namespace OpenRA.FileFormats
Height = reader.ReadUInt16();
reader.ReadUInt32();
for( int i = 0 ; i < ImageCount ; i++ )
headers.Add( new ImageHeader( reader ) );
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
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++ )
for (int i = 0 ; i < ImageCount ; i++)
{
var h = headers[ i ];
if( h.Format == Format.Format20 )
h.RefImage = headers[ i - 1 ];
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) );
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:
{
var 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;
}
@@ -135,11 +135,11 @@ 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 :(
var 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);
var compressedBytes = new byte[ compressedLength ];
stream.Read( compressedBytes, 0, compressedLength );
@@ -147,11 +147,11 @@ namespace OpenRA.FileFormats
return compressedBytes;
}
byte[] CopyImageData( byte[] baseImage )
byte[] CopyImageData(byte[] baseImage)
{
var 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;
}

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

@@ -0,0 +1,97 @@
#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;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Reflection;
namespace OpenRA.FileFormats
{
public class TileSetRenderer
{
public TileSet TileSet;
Dictionary<ushort, List<byte[]>> templates;
public Size TileSize;
List<byte[]> LoadTemplate(string filename, string[] exts, Cache<string, R8Reader> r8Cache, int[] frames)
{
if (exts.Contains(".R8") && FileSystem.Exists(filename+".R8"))
{
var data = new List<byte[]>();
foreach (var f in frames)
data.Add(f >= 0 ? r8Cache[filename][f].Image : null);
return data;
}
using (var s = FileSystem.OpenWithExts(filename, exts))
return new Terrain(s).TileBitmapBytes;
}
public TileSetRenderer(TileSet tileset, Size tileSize)
{
this.TileSet = tileset;
this.TileSize = tileSize;
templates = new Dictionary<ushort, List<byte[]>>();
var r8Cache = new Cache<string, R8Reader>(s => new R8Reader(FileSystem.OpenWithExts(s, ".R8")));
foreach (var t in TileSet.Templates)
templates.Add(t.Key, LoadTemplate(t.Value.Image, tileset.Extensions, r8Cache, t.Value.Frames));
}
public Bitmap RenderTemplate(ushort id, Palette p)
{
var template = TileSet.Templates[id];
var templateData = templates[id];
var bitmap = new Bitmap(TileSize.Width * template.Size.X, TileSize.Height * template.Size.Y,
PixelFormat.Format8bppIndexed);
bitmap.Palette = p.AsSystemPalette();
var data = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
unsafe
{
var q = (byte*)data.Scan0.ToPointer();
var stride = data.Stride;
for (var u = 0; u < template.Size.X; u++)
for (var v = 0; v < template.Size.Y; v++)
if (templateData[u + v * template.Size.X] != null)
{
var rawImage = templateData[u + v * template.Size.X];
for (var i = 0; i < TileSize.Width; i++)
for (var j = 0; j < TileSize.Height; j++)
q[(v * TileSize.Width + j) * stride + u * TileSize.Width + i] = rawImage[i + TileSize.Width * j];
}
else
{
for (var i = 0; i < TileSize.Width; i++)
for (var j = 0; j < TileSize.Height; j++)
q[(v * TileSize.Width + j) * stride + u * TileSize.Width + i] = 0;
}
}
bitmap.UnlockBits(data);
return bitmap;
}
public List<byte[]> Data(ushort id)
{
return templates[id];
}
}
}

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,34 +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);
}
/* 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]
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++)
@@ -59,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,10 +19,14 @@ namespace OpenRA.FileFormats
public class Manifest
{
public readonly string[]
Mods, Folders, Packages, Rules, ServerTraits,
Sequences, Cursors, Chrome, Assemblies, ChromeLayout,
Weapons, Voices, Notifications, 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 MiniYaml LobbyDefaults;
public readonly Dictionary<string, Pair<string,int>> Fonts;
public readonly int TileSize = 24;
@@ -29,15 +34,16 @@ 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");
@@ -49,8 +55,10 @@ namespace OpenRA.FileFormats
Movies = YamlList(yaml, "Movies");
TileSets = YamlList(yaml, "TileSets");
ChromeMetrics = YamlList(yaml, "ChromeMetrics");
PackageContents = YamlList(yaml, "PackageContents");
LoadScreen = yaml["LoadScreen"];
LobbyDefaults = yaml["LobbyDefaults"];
Fonts = yaml["Fonts"].NodesDict.ToDictionary(x => x.Key,
x => Pair.New(x.Value.NodesDict["Font"].Value,
int.Parse(x.Value.NodesDict["Size"].Value)));

View File

@@ -21,15 +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;
@@ -37,7 +39,6 @@ namespace OpenRA.FileFormats
public bool LockTeam = false;
public int Team = 0;
public int InitialCash = 0;
public string[] Allies = {};
public string[] Enemies = {};

View File

@@ -16,16 +16,15 @@ namespace OpenRA.FileFormats
public class Terrain
{
public readonly List<byte[]> TileBitmapBytes = new List<byte[]>();
public readonly int Width;
public readonly int Height;
public Terrain( Stream stream, int size )
public Terrain(Stream stream)
{
// Try loading as a cnc .tem
BinaryReader reader = new BinaryReader( stream );
int Width = reader.ReadUInt16();
int Height = reader.ReadUInt16();
if( Width != size || Height != size )
throw new InvalidDataException( "{0}x{1} != {2}x{2}".F(Width, Height, size ) );
Width = reader.ReadUInt16();
Height = reader.ReadUInt16();
/*NumTiles = */reader.ReadUInt16();
/*Zero1 = */reader.ReadUInt16();
@@ -65,8 +64,8 @@ namespace OpenRA.FileFormats
{
if (b != 255)
{
stream.Position = ImgStart + b * size * size;
TileBitmapBytes.Add(new BinaryReader(stream).ReadBytes(size * size));
stream.Position = ImgStart + b * Width * Height;
TileBitmapBytes.Add(new BinaryReader(stream).ReadBytes(Width * Height));
}
else
TileBitmapBytes.Add(null);

View File

@@ -35,24 +35,25 @@ namespace OpenRA.FileFormats
{
public ushort Id;
public string Image;
public int[] Frames;
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" };
static readonly string[] Fields = { "Id", "Image", "Frames", "Size", "PickAny" };
public MiniYaml Save()
{
@@ -60,39 +61,39 @@ 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);
}
public Terrain Data;
}
public class TileSet
{
public string Name;
public string Id;
public int SheetSize = 512;
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"};
static readonly string[] fields = {"Name", "TileSize", "Id", "SheetSize", "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"]);
@@ -106,14 +107,6 @@ namespace OpenRA.FileFormats
.Select(y => new TileTemplate(y)).ToDictionary(t => t.Id);
}
public void LoadTiles()
{
foreach (var t in Templates)
if (t.Value.Data == null)
using( var s = FileSystem.OpenWithExts(t.Value.Image, Extensions) )
t.Value.Data = new Terrain(s, TileSize);
}
public void Save(string filepath)
{
var root = new List<MiniYamlNode>();
@@ -122,82 +115,34 @@ 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 ];
byte[] missingTile = new byte[ TileSize * TileSize ];
for( int i = 0 ; i < missingTile.Length ; i++ )
missingTile[ i ] = 0x36;
return missingTile;
}
public string GetTerrainType(TileReference<ushort, byte> r)
{
var tt = Templates[r.type].Tiles;
string ret;
if (!tt.TryGetValue(r.index, out ret))
return "Clear"; // Default walkable
return ret;
}
public Bitmap RenderTemplate(ushort n, Palette p)
{
var template = Templates[n];
var bitmap = new Bitmap(TileSize * template.Size.X, TileSize * template.Size.Y,
PixelFormat.Format8bppIndexed);
bitmap.Palette = p.AsSystemPalette();
var data = bitmap.LockBits(bitmap.Bounds(),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
unsafe
{
byte* q = (byte*)data.Scan0.ToPointer();
var stride = data.Stride;
for (var u = 0; u < template.Size.X; u++)
for (var v = 0; v < template.Size.Y; v++)
if (template.Data.TileBitmapBytes[u + v * template.Size.X] != null)
{
var rawImage = template.Data.TileBitmapBytes[u + v * template.Size.X];
for (var i = 0; i < TileSize; i++)
for (var j = 0; j < TileSize; j++)
q[(v * TileSize + j) * stride + u * TileSize + i] = rawImage[i + TileSize * j];
}
else
{
for (var i = 0; i < TileSize; i++)
for (var j = 0; j < TileSize; j++)
q[(v * TileSize + j) * stride + u * TileSize + i] = 0;
}
}
bitmap.UnlockBits(data);
return bitmap;
}
}
}

View File

@@ -17,255 +17,6 @@ namespace OpenRA.FileFormats
{
using MiniYamlNodes = List<MiniYamlNode>;
public class MiniYamlNode
{
public struct SourceLocation
{
public string Filename; public int Line;
public override string ToString() { return "{0}:{1}".F(Filename, Line); }
}
public SourceLocation Location;
public string Key;
public MiniYaml Value;
public MiniYamlNode( string k, MiniYaml v )
{
Key = k;
Value = v;
}
public MiniYamlNode( string k, MiniYaml v, SourceLocation loc )
: this( k, v )
{
Location = loc;
}
public MiniYamlNode( string k, string v )
: this( k, v, null )
{
}
public MiniYamlNode( string k, string v, List<MiniYamlNode> n )
: this( k, new MiniYaml( v, n ) )
{
}
public MiniYamlNode( string k, string v, List<MiniYamlNode> n, SourceLocation loc )
: this( k, new MiniYaml( v, n ), loc )
{
}
public override string ToString()
{
return "{{YamlNode: {0} @ {1}}}".F(Key, Location);
}
}
public class MiniYaml
{
public string Value;
public List<MiniYamlNode> Nodes;
public Dictionary<string, MiniYaml> NodesDict
{
get
{
var ret = new Dictionary<string, MiniYaml>();
foreach (var y in Nodes)
{
if (ret.ContainsKey(y.Key))
throw new InvalidDataException("Duplicate key `{0}' in MiniYaml".F(y.Key));
ret.Add(y.Key, y.Value);
}
return ret;
}
}
public MiniYaml( string value ) : this( value, null ) { }
public MiniYaml( string value, List<MiniYamlNode> nodes )
{
Value = value;
Nodes = nodes ?? new List<MiniYamlNode>();
}
public static MiniYaml FromDictionary<K, V>( Dictionary<K, V> dict )
{
return new MiniYaml( null, dict.Select( x => new MiniYamlNode( x.Key.ToString(), new MiniYaml( x.Value.ToString() ) ) ).ToList() );
}
public static MiniYaml FromList<T>( List<T> list )
{
return new MiniYaml( null, list.Select( x => new MiniYamlNode( x.ToString(), new MiniYaml( null ) ) ).ToList() );
}
static List<MiniYamlNode> FromLines(string[] lines, string filename)
{
var levels = new List<List<MiniYamlNode>>();
levels.Add(new List<MiniYamlNode>());
var lineNo = 0;
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)
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 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, location ) );
levels.Add(d);
}
return levels[ 0 ];
}
static string SplitAtColon( ref string t )
{
var colon = t.IndexOf(':');
if( colon == -1 )
return null;
var ret = t.Substring( colon + 1 ).Trim();
if( ret.Length == 0 )
ret = null;
t = t.Substring( 0, colon ).Trim();
return ret;
}
public static List<MiniYamlNode> FromFileInPackage( string path )
{
StreamReader reader = new StreamReader( FileSystem.Open(path) );
List<string> lines = new List<string>();
while( !reader.EndOfStream )
lines.Add(reader.ReadLine());
reader.Close();
return FromLines(lines.ToArray(), path);
}
public static Dictionary<string, MiniYaml> DictFromFile( string path )
{
return FromFile( path ).ToDictionary( x => x.Key, x => x.Value );
}
public static Dictionary<string, MiniYaml> DictFromStream( Stream stream )
{
return FromStream( stream ).ToDictionary( x => x.Key, x => x.Value );
}
public static List<MiniYamlNode> FromFile( string path )
{
return FromLines(File.ReadAllLines( path ), path);
}
public static List<MiniYamlNode> FromStream(Stream s)
{
using (var reader = new StreamReader(s))
return FromString(reader.ReadToEnd());
}
public static List<MiniYamlNode> FromString(string text)
{
return FromLines(text.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries), "<no filename available>");
}
public static List<MiniYamlNode> MergeLiberal(List<MiniYamlNode> a, List<MiniYamlNode> b)
{
return Merge(a, b, false);
}
public static List<MiniYamlNode> MergeStrict(List<MiniYamlNode> a, List<MiniYamlNode> b)
{
return Merge(a, b, true);
}
static List<MiniYamlNode> Merge( List<MiniYamlNode> a, List<MiniYamlNode> b, bool throwErrors )
{
if( a.Count == 0 )
return b;
if( b.Count == 0 )
return a;
var ret = new List<MiniYamlNode>();
var aDict = a.ToDictionary( x => x.Key );
var bDict = b.ToDictionary( x => x.Key );
var keys = aDict.Keys.Union( bDict.Keys ).ToList();
var noInherit = keys.Where(x => x.Length > 0 && x[0] == '-')
.ToDictionary(x => x.Substring(1), x => false);
foreach( var key in keys )
{
MiniYamlNode aa, bb;
aDict.TryGetValue( key, out aa );
bDict.TryGetValue( key, out bb );
if( noInherit.ContainsKey( key ) )
{
if (!throwErrors)
if (aa != null)
ret.Add(aa);
noInherit[key] = true;
}
else
{
var loc = aa == null ? default( MiniYamlNode.SourceLocation ) : aa.Location;
var merged = ( aa == null || bb == null ) ? aa ?? bb : new MiniYamlNode( key, Merge( aa.Value, bb.Value, throwErrors ), loc );
ret.Add( merged );
}
}
if (throwErrors)
if (noInherit.ContainsValue(false))
throw new YamlException("Bogus yaml removals: {0}".F(
noInherit.Where(x => !x.Value).JoinWith(", ")));
return ret;
}
public static MiniYaml MergeLiberal(MiniYaml a, MiniYaml b)
{
return Merge(a, b, false);
}
public static MiniYaml MergeStrict(MiniYaml a, MiniYaml b)
{
return Merge(a, b, true);
}
static MiniYaml Merge( MiniYaml a, MiniYaml b, bool throwErrors )
{
if( a == null )
return b;
if( b == null )
return a;
return new MiniYaml( a.Value ?? b.Value, Merge( a.Nodes, b.Nodes, throwErrors ) );
}
public IEnumerable<string> ToLines(string name)
{
yield return name + ": " + Value;
if (Nodes != null)
foreach (var line in Nodes.ToLines(false))
yield return "\t" + line;
}
}
public static class MiniYamlExts
{
public static void WriteToFile(this MiniYamlNodes y, string filename)
@@ -290,6 +41,257 @@ namespace OpenRA.FileFormats
}
}
public class MiniYamlNode
{
public struct SourceLocation
{
public string Filename; public int Line;
public override string ToString() { return "{0}:{1}".F(Filename, Line); }
}
public SourceLocation Location;
public string Key;
public MiniYaml Value;
public MiniYamlNode(string k, MiniYaml v)
{
Key = k;
Value = v;
}
public MiniYamlNode(string k, MiniYaml v, SourceLocation loc)
: this(k, v)
{
Location = loc;
}
public MiniYamlNode(string k, string v)
: this(k, v, null) { }
public MiniYamlNode(string k, string v, List<MiniYamlNode> n)
: this(k, new MiniYaml(v, n)) { }
public MiniYamlNode(string k, string v, List<MiniYamlNode> n, SourceLocation loc)
: this(k, new MiniYaml(v, n), loc) { }
public override string ToString()
{
return "{{YamlNode: {0} @ {1}}}".F(Key, Location);
}
}
public class MiniYaml
{
public string Value;
public List<MiniYamlNode> Nodes;
public Dictionary<string, MiniYaml> NodesDict
{
get
{
var ret = new Dictionary<string, MiniYaml>();
foreach (var y in Nodes)
{
if (ret.ContainsKey(y.Key))
throw new InvalidDataException("Duplicate key `{0}' in {1}".F(y.Key, y.Location));
ret.Add(y.Key, y.Value);
}
return ret;
}
}
public MiniYaml(string value) : this(value, null) { }
public MiniYaml(string value, List<MiniYamlNode> nodes)
{
Value = value;
Nodes = nodes ?? new List<MiniYamlNode>();
}
public static MiniYaml FromDictionary<K, V>(Dictionary<K, V> dict)
{
return new MiniYaml(null, dict.Select(x => new MiniYamlNode(x.Key.ToString(), new MiniYaml(x.Value.ToString()))).ToList());
}
public static MiniYaml FromList<T>(List<T> list)
{
return new MiniYaml(null, list.Select(x => new MiniYamlNode(x.ToString(), new MiniYaml(null))).ToList());
}
public static List<MiniYamlNode> NodesOrEmpty(MiniYaml y, string s)
{
return y.NodesDict.ContainsKey(s) ? y.NodesDict[s].Nodes : new List<MiniYamlNode>();
}
static List<MiniYamlNode> FromLines(string[] lines, string filename)
{
var levels = new List<List<MiniYamlNode>>();
levels.Add(new List<MiniYamlNode>());
var lineNo = 0;
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)
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 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, location));
levels.Add(d);
}
return levels[0];
}
static string SplitAtColon(ref string t)
{
var colon = t.IndexOf(':');
if (colon == -1)
return null;
var ret = t.Substring(colon + 1).Trim();
if (ret.Length == 0)
ret = null;
t = t.Substring(0, colon).Trim();
return ret;
}
public static List<MiniYamlNode> FromFileInPackage(string path)
{
StreamReader reader = new StreamReader(FileSystem.Open(path));
List<string> lines = new List<string>();
while (!reader.EndOfStream)
lines.Add(reader.ReadLine());
reader.Close();
return FromLines(lines.ToArray(), path);
}
public static Dictionary<string, MiniYaml> DictFromFile(string path)
{
return FromFile(path).ToDictionary(x => x.Key, x => x.Value);
}
public static Dictionary<string, MiniYaml> DictFromStream(Stream stream)
{
return FromStream(stream).ToDictionary(x => x.Key, x => x.Value);
}
public static List<MiniYamlNode> FromFile(string path)
{
return FromLines(File.ReadAllLines(path), path);
}
public static List<MiniYamlNode> FromStream(Stream s)
{
using (var reader = new StreamReader(s))
return FromString(reader.ReadToEnd());
}
public static List<MiniYamlNode> FromString(string text)
{
return FromLines(text.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries), "<no filename available>");
}
public static List<MiniYamlNode> MergeLiberal(List<MiniYamlNode> a, List<MiniYamlNode> b)
{
return Merge(a, b, false);
}
public static List<MiniYamlNode> MergeStrict(List<MiniYamlNode> a, List<MiniYamlNode> b)
{
return Merge(a, b, true);
}
static List<MiniYamlNode> Merge(List<MiniYamlNode> a, List<MiniYamlNode> b, bool throwErrors)
{
if (a.Count == 0)
return b;
if (b.Count == 0)
return a;
var ret = new List<MiniYamlNode>();
var dictA = a.ToDictionaryWithConflictLog(x => x.Key, "MiniYaml.Merge", null, x => "{0} (at {1})".F(x.Key, x.Location));
var dictB = b.ToDictionaryWithConflictLog(x => x.Key, "MiniYaml.Merge", null, x => "{0} (at {1})".F(x.Key, x.Location));
var keys = dictA.Keys.Union(dictB.Keys).ToList();
var noInherit = keys.Where(x => x.Length > 0 && x[0] == '-')
.ToDictionary(x => x.Substring(1), x => false);
foreach (var key in keys)
{
MiniYamlNode aa, bb;
dictA.TryGetValue(key, out aa);
dictB.TryGetValue(key, out bb);
if (noInherit.ContainsKey(key))
{
if (!throwErrors)
if (aa != null)
ret.Add(aa);
noInherit[key] = true;
}
else
{
var loc = aa == null ? default(MiniYamlNode.SourceLocation) : aa.Location;
var merged = (aa == null || bb == null) ? aa ?? bb : new MiniYamlNode(key, Merge(aa.Value, bb.Value, throwErrors), loc);
ret.Add(merged);
}
}
if (throwErrors)
if (noInherit.ContainsValue(false))
throw new YamlException("Bogus yaml removals: {0}".F(
noInherit.Where(x => !x.Value).JoinWith(", ")));
return ret;
}
public static MiniYaml MergeLiberal(MiniYaml a, MiniYaml b)
{
return Merge(a, b, false);
}
public static MiniYaml MergeStrict(MiniYaml a, MiniYaml b)
{
return Merge(a, b, true);
}
static MiniYaml Merge(MiniYaml a, MiniYaml b, bool throwErrors)
{
if (a == null)
return b;
if (b == null)
return a;
return new MiniYaml(a.Value ?? b.Value, Merge(a.Nodes, b.Nodes, throwErrors));
}
public IEnumerable<string> ToLines(string name)
{
yield return name + ": " + Value;
if (Nodes != null)
foreach (var line in Nodes.ToLines(false))
yield return "\t" + line;
}
}
public class YamlException : Exception
{
public YamlException(string s) : base(s) { }

View File

@@ -77,7 +77,6 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ColorRamp.cs" />
<Compile Include="Evaluator.cs" />
<Compile Include="Exts.cs" />
<Compile Include="FieldLoader.cs" />
@@ -85,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" />
@@ -126,12 +126,27 @@
<Compile Include="Primitives\Set.cs" />
<Compile Include="Primitives\float2.cs" />
<Compile Include="Primitives\int2.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Support\Log.cs" />
<Compile Include="Support\Stopwatch.cs" />
<Compile Include="Support\Timer.cs" />
<Compile Include="Thirdparty\Random.cs" />
<Compile Include="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" />
<Compile Include="Graphics\R8Reader.cs" />
<Compile Include="Graphics\TileSetRenderer.cs" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">

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)
@@ -51,33 +53,55 @@ namespace OpenRA.FileFormats
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

@@ -39,6 +39,12 @@ namespace OpenRA.FileFormats
get { return colors; }
}
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];
@@ -61,9 +67,8 @@ namespace OpenRA.FileFormats
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)
@@ -71,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;
@@ -88,6 +100,21 @@ namespace OpenRA.FileFormats
return pal;
}
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))

View File

@@ -49,6 +49,10 @@ namespace OpenRA
{
get
{
// Use a local directory in the game root if it exists
if (Directory.Exists("Support"))
return "Support" + Path.DirectorySeparatorChar;
var dir = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
switch (CurrentPlatform)

View File

@@ -8,6 +8,7 @@
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
@@ -24,18 +25,19 @@ namespace OpenRA.FileFormats
return Ramp[i];
}
public PlayerColorRemap(int[] Ramp, ColorRamp c)
public PlayerColorRemap(int[] Ramp, HSLColor c, float rampFraction)
{
var c1 = c.GetColor(0);
var c2 = c.GetColor(1); // temptemp: this can be expressed better
// 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 (int i=15; i>0; i--)
for (var i = 15; i > 0; i--)
RemapRamp = Ramp.Select(r => r - Ramp[15]).ToArray();
}

View File

@@ -1,26 +0,0 @@
#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.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("OpenRA.FileFormats")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OpenRA.FileFormats")]
[assembly: AssemblyCopyright("Copyright © 2007,2009,2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

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

@@ -0,0 +1,349 @@
<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>
<Rule Name="ChainedStatementBlocksMustNotBePrecededByBlankLine">
<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>
<Rule Name="ParameterMustFollowComma">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
<Rule Name="SplitParametersMustStartOnLineAfterDeclaration">
<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

@@ -0,0 +1,159 @@
#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();
}
public static WAngle ArcTan(int y, int x) { return ArcTan(y, x, 1); }
public static WAngle ArcTan(int y, int x, int stride)
{
if (y == 0)
return new WAngle(x >= 0 ? 0 : 512);
if (x == 0)
return new WAngle(Math.Sign(y)*256);
var ay = Math.Abs(y);
var ax = Math.Abs(x);
// Find the closest angle that satisfies y = x*tan(theta)
var bestVal = int.MaxValue;
var bestAngle = 0;
for (var i = 0; i < 256; i+= stride)
{
var val = Math.Abs(1024*ay - ax*TanTable[i]);
if (val < bestVal)
{
bestVal = val;
bestAngle = i;
}
}
// Calculate quadrant
if (x < 0 && y > 0)
bestAngle = 512 - bestAngle;
else if (x < 0 && y < 0)
bestAngle = 512 + bestAngle;
else if (x > 0 && y < 0)
bestAngle = 1024 - bestAngle;
return new WAngle(bestAngle);
}
// 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,92 @@
#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;
using System.Linq;
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 WRange operator /(WRange a, int b) { return new WRange(a.Range / b); }
public static WRange operator *(WRange a, int b) { return new WRange(a.Range * b); }
public static WRange operator *(int a, WRange b) { return new WRange(a * b.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); }
// Sampled a N-sample probability density function in the range [-1024..1024]
// 1 sample produces a rectangular probability
// 2 samples produces a triangular probability
// ...
// N samples approximates a true gaussian
public static WRange FromPDF(Thirdparty.Random r, int samples)
{
return new WRange(Exts.MakeArray(samples, _ => r.Next(-1024, 1024))
.Sum() / samples);
}
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;
}
// Propagate sign to fractional part
if (cell < 0)
subcell = -subcell;
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,95 @@
#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 long LengthSquared { get { return (long)X * X + (long)Y * Y + (long)Z * Z; } }
public int Length { get { return (int)Math.Sqrt(LengthSquared); } }
public long HorizontalLengthSquared { get { return (long)X * X + (long)Y * Y; } }
public int HorizontalLength { get { return (int)Math.Sqrt(HorizontalLengthSquared); } }
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);
}
// Sampled a N-sample probability density function in the range [-1024..1024, -1024..1024]
// 1 sample produces a rectangular probability
// 2 samples produces a triangular probability
// ...
// N samples approximates a true gaussian
public static WVec FromPDF(Thirdparty.Random r, int samples)
{
return new WVec(WRange.FromPDF(r, samples), WRange.FromPDF(r, samples), WRange.Zero);
}
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
@@ -25,43 +26,43 @@ namespace OpenRA
public readonly uint ActorID;
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 CPos Location { get { return occupySpace.Value.TopLeft; } }
public PPos CenterLocation { get { return PPos.FromWPos(occupySpace.Value.CenterPosition); } }
public WPos CenterPosition { get { return occupySpace.Value.CenterPosition; } }
public PPos CenterLocation
public WRot Orientation
{
get
{
if (HasLocation == null)
HasLocation = Trait<IHasLocation>();
return HasLocation.PxPosition;
// 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));
}
}
public Shroud.ActorVisibility Sight;
[Sync]
public Player Owner;
[Sync] public Player Owner;
Activity currentActivity;
public Group Group;
public int Generation;
internal Actor(World world, string name, TypeDictionary initDict )
internal Actor(World world, string name, TypeDictionary initDict)
{
var init = new ActorInitializer( this, initDict );
var init = new ActorInitializer(this, initDict);
World = world;
ActorID = world.NextAID();
if( initDict.Contains<OwnerInit>() )
if (initDict.Contains<OwnerInit>())
Owner = init.Get<OwnerInit,Player>();
occupySpace = Lazy.New( () => TraitOrDefault<IOccupySpace>() );
occupySpace = Lazy.New(() => TraitOrDefault<IOccupySpace>());
if (name != null)
{
@@ -73,7 +74,7 @@ namespace OpenRA
AddTrait(trait.Create(init));
}
Move = Lazy.New( () => TraitOrDefault<IMove>() );
Facing = Lazy.New(() => TraitOrDefault<IFacing>());
Size = Lazy.New(() =>
{
@@ -81,27 +82,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();
});
if(this.HasTrait<RevealsShroud>())
{
Sight = new Shroud.ActorVisibility
{
range = this.Trait<RevealsShroud>().RevealRange,
vis = Shroud.GetVisOrigins(this).ToArray()
};
}
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()
@@ -109,12 +97,7 @@ namespace OpenRA
Bounds.Invalidate();
ExtendedBounds.Invalidate();
currentActivity = Util.RunActivity( this, currentActivity );
}
public void UpdateSight()
{
Sight.vis = Shroud.GetVisOrigins(this).ToArray();
currentActivity = Traits.Util.RunActivity(this, currentActivity);
}
public bool IsIdle
@@ -125,13 +108,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
@@ -146,24 +129,17 @@ namespace OpenRA
var si = Info.Traits.GetOrDefault<SelectableInfo>();
if (si != null && si.Bounds != null && si.Bounds.Length > 2)
{
#if true
loc += new PVecInt(si.Bounds[2], si.Bounds[3]);
#else
loc.X += si.Bounds[2];
loc.Y += si.Bounds[3];
#endif
}
var move = Move.Value;
if (move != null)
var ios = occupySpace.Value;
if (ios != null)
{
#if true
loc -= new PVecInt(0, move.Altitude);
#else
loc.Y -= move.Altitude;
#endif
var altitude = ios.CenterPosition.Z * Game.CellSize / 1024;
loc -= new PVecInt(0, altitude);
if (useAltitude)
size = new PVecInt(size.X, size.Y + move.Altitude);
size = new PVecInt(size.X, size.Y + altitude);
}
return new Rectangle(loc.X, loc.Y, size.X, size.Y);
@@ -252,15 +228,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

@@ -75,6 +75,7 @@ namespace OpenRA
[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; }
}

View File

@@ -64,6 +64,16 @@ namespace OpenRA
SubCell.BottomLeft, SubCell.BottomRight }.Any(b => !AnyUnitsAt(a,b));
}
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;

View File

@@ -21,7 +21,6 @@ namespace OpenRA
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); }
@@ -42,6 +41,10 @@ namespace OpenRA
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 WPos TopLeft { get { return new WPos(1024 * X, 1024 * Y, 0); } }
public WPos BottomRight { get { return new WPos(1024 * X + 1023, 1024 * Y + 1023, 0); } }
public CPos Clamp(Rectangle r)
{
return new CPos(Math.Min(r.Right, Math.Max(X, r.Left)),
@@ -68,4 +71,10 @@ namespace OpenRA
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 WorldCoordinateExtensions
{
public static CPos ToCPos(this WPos a) { return new CPos(a.X / 1024, a.Y / 1024); }
public static CVec ToCVec(this WVec a) { return new CVec(a.X / 1024, a.Y / 1024); }
}
}

View File

@@ -51,6 +51,7 @@ namespace OpenRA
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)
{
@@ -72,5 +73,17 @@ namespace OpenRA
}
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,17 @@ 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 (target.IsInWorld && remainingTicks % 2 == 0)
{
var palette = wr.Palette("highlight");
return target.Render(wr)
.Where(r => !r.IsDecoration)
.Select(r => r.WithPalette(palette));
}
if (remainingTicks % 2 == 0)
foreach (var r in target.Render())
yield return r.WithPalette("highlight");
return SpriteRenderable.None;
}
}
}

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);
}
}

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

@@ -58,7 +58,7 @@ namespace OpenRA
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)
@@ -122,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"))
{
@@ -149,12 +149,12 @@ 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;
Ui.Tick();
@@ -162,26 +162,26 @@ namespace OpenRA
if (orderManager.GameStarted)
++Viewport.TicksSinceLastMove;
Sound.Tick();
Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate(); } );
Sync.CheckSyncUnchanged(world, orderManager.TickImmediate);
if (world != null)
{
var isNetTick = LocalTick % NetTickScale == 0;
if ((!isNetTick || orderManager.IsReadyForNextFrame) && !orderManager.GamePaused )
if (!isNetTick || orderManager.IsReadyForNextFrame)
{
++orderManager.LocalFrameNumber;
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();
@@ -190,7 +190,8 @@ namespace OpenRA
else
if (orderManager.NetFrameNumber == 0)
orderManager.LastTickTime = Environment.TickCount;
Sync.CheckSyncUnchanged(world, () => world.TickRender(worldRenderer));
viewport.Tick();
}
}
@@ -210,23 +211,27 @@ 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;
Ui.SelectedWidget = null;
Ui.MouseFocusWidget = null;
Ui.KeyboardFocusWidget = 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
get
{
var client= orderManager.LobbyInfo.ClientWithIndex (
var client= orderManager.LobbyInfo.ClientWithIndex(
orderManager.Connection.LocalClientId);
return ((client!=null) && client.IsAdmin);
}
@@ -234,7 +239,7 @@ namespace OpenRA
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;
@@ -253,6 +258,16 @@ namespace OpenRA
Log.AddChannel("perf", "perf.log");
Log.AddChannel("debug", "debug.log");
Log.AddChannel("sync", "syncreport.log");
Log.AddChannel("server", "server.log");
Log.AddChannel("sound", "sound.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 );
@@ -264,6 +279,13 @@ namespace OpenRA
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)
@@ -291,10 +313,9 @@ namespace OpenRA
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;
@@ -311,11 +332,11 @@ namespace OpenRA
Game.Settings.Server.Map = WidgetUtils.ChooseInitialMap(Game.Settings.Server.Map);
Game.Settings.Save();
Game.CreateServer(new ServerSettings(Game.Settings.Server));
while(true)
while (true)
{
System.Threading.Thread.Sleep(100);
if((server.State == Server.ServerState.GameStarted)
if ((server.State == Server.ServerState.GameStarted)
&& (server.conns.Count<=1))
{
Console.WriteLine("No one is playing, shutting down...");
@@ -406,13 +427,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)
@@ -426,10 +447,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.AllowUPnP = 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;
}
@@ -439,21 +460,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();

View File

@@ -46,11 +46,11 @@ 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 ); } }
public static IEnumerable<KeyValuePair<string, MusicInfo>> InstalledMusic { get { return Music.Where(m => m.Value.Exists); } }
}
}

View File

@@ -29,13 +29,19 @@ namespace OpenRA.GameRules
public int ExternalPort = 1234;
public bool AdvertiseOnline = true;
public string MasterServer = "http://master.open-ra.org/";
public bool AllowUPnP = false;
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 = 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() { }
@@ -46,13 +52,19 @@ namespace OpenRA.GameRules
ExternalPort = other.ExternalPort;
AdvertiseOnline = other.AdvertiseOnline;
MasterServer = other.MasterServer;
AllowUPnP = other.AllowUPnP;
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;
}
}
@@ -64,6 +76,11 @@ 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 bool ShowFatalErrorDialog = true;
public string FatalErrorDialogFaq = "http://github.com/OpenRA/OpenRA/wiki/FAQ";
}
public class GraphicSettings
@@ -86,18 +103,21 @@ namespace OpenRA.GameRules
public float SoundVolume = 0.5f;
public float MusicVolume = 0.5f;
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 string Device = null;
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";
}
@@ -117,9 +137,32 @@ namespace OpenRA.GameRules
// 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;
@@ -130,6 +173,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;
@@ -144,6 +188,7 @@ namespace OpenRA.GameRules
{"Graphics", Graphics},
{"Server", Server},
{"Debug", Debug},
{"Keys", Keys},
};
// Override fieldloader to ignore invalid entries

View File

@@ -18,28 +18,45 @@ 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 = { }; // 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 = 1; // 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)
public float EffectivenessAgainst(ActorInfo ai)
{
var health = self.Info.Traits.GetOrDefault<HealthInfo>();
if (health == null) return 0f;
var armor = self.Info.Traits.GetOrDefault<ArmorInfo>();
if (armor == null || armor.Type == null) return 1;
var health = ai.Traits.GetOrDefault<HealthInfo>();
if (health == null)
return 0f;
var armor = ai.Traits.GetOrDefault<ArmorInfo>();
if (armor == null || armor.Type == null)
return 1;
float versus;
return Versus.TryGetValue(armor.Type, out versus) ? versus : 1;
@@ -60,8 +77,6 @@ namespace OpenRA.GameRules
}
}
public enum DamageModel
{
Normal, // classic RA damage model: point actors, distance-based falloff
@@ -71,14 +86,12 @@ namespace OpenRA.GameRules
public class ProjectileArgs
{
public WeaponInfo weapon;
public Actor firedBy;
public PPos src;
public int srcAltitude;
public int facing;
public Target target;
public PPos dest;
public int destAltitude;
public float firepowerModifier = 1.0f;
public int facing;
public WPos source;
public Actor sourceActor;
public WPos passiveTarget;
public Target guidedTarget;
}
public interface IProjectileInfo { IEffect Create(ProjectileArgs args); }
@@ -86,7 +99,8 @@ 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;
@@ -122,5 +136,53 @@ 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.Info) <= 0))
return false;
return true;
}
public bool IsValidAgainst(FrozenActor a)
{
var targetable = a.Info.Traits.GetOrDefault<ITargetableInfo>();
if (targetable == null || !ValidTargets.Intersect(targetable.GetTargetTypes()).Any())
return false;
if (Warheads.All(w => w.EffectivenessAgainst(a.Info) <= 0))
return false;
return true;
}
public bool IsValidAgainst(Target target, World world)
{
if (target.Type == TargetType.Actor)
return IsValidAgainst(target.Actor);
if (target.Type == TargetType.FrozenActor)
return IsValidAgainst(target.FrozenActor);
if (target.Type == TargetType.Terrain)
{
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;
}
return false;
}
}
}

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