Compare commits

...

1654 Commits

Author SHA1 Message Date
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
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
Chris Forbes
406b210958 Merge pull request #3140 from psydev/bleed
Tanks' ROF increased
2013-04-21 02:36:05 -07:00
psydev
4872330dce Tanks' ROF increased
Increased ROF of tanks. The guns of Light & Medium Tanks are a bit weak
relative to their role as tanks. They do less damage than bike rockets,
and do less damage against light vehicles than even the hum-vee. Changing
ROF should mitigate this a bit, even though their gun is still not that
powerful (e.g. compared to stealth tank, and even flame tank matched light
tank). The fact that their rivals are often moving fasts also complicates
the slower ROF.

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(v2: less redundant code for PlayVoice/Notifications)

added harvester under attack and battlecontrol terminated
2012-07-01 14:39:30 +12:00
Chris Forbes
5fee165692 fixed #2289 - missing chrono effects on return 2012-07-01 14:24:49 +12:00
Chris Forbes
0a4669b925 Add SimpleTeleport for non-chrono jumps (used in scripts etc) 2012-07-01 14:05:21 +12:00
Chris Forbes
109546d20f fixed #2286 - chrono kills passengers on return too 2012-07-01 13:31:04 +12:00
James Dunne
f5c606266d Fixed shift-tab keyboard shortcut in build palette. 2012-07-01 13:08:00 +12:00
ScottNZ
facf958bae Move towards extraction LZ if einstein isn't in the world. 2012-07-01 13:02:23 +12:00
Matthias Mailänder
480db8be42 non-capturable hospital with heal-zone
will heal engineer, capturing it is useless;
heal-zone makes less sense, but it looks nicer
(otherwise infantry drawn on top of the building)
2012-07-01 13:02:23 +12:00
James Dunne
7c4e32bd94 Applied ToDictionaryWithConflictLog to MixFile reader. 2012-07-01 13:01:54 +12:00
James Dunne
854a9c4eb7 Added new ToDictionaryWithConflictLog to help diagnose ToDictionary bombs. 2012-07-01 13:01:24 +12:00
ScottNZ
cbb0b17c31 Add AutoTargetIgnore for stek 2012-07-01 12:52:36 +12:00
Chris Forbes
f2ab8a8541 generalize rough cursor to be customizable for any terrain type 2012-07-01 12:49:14 +12:00
Matthias Mailänder
63d21eac8c arrakis tileset categorized for editor
thanks to CombineCnR
2012-07-01 12:41:29 +12:00
Matthias Mailänder
579ff04f68 fixes #2253
rough mouse-cursor for infantry-only areas
blue move cursor for d2k rally points
2012-07-01 12:41:23 +12:00
ScottNZ
18d75feb15 Adjust the patrol starting position 2012-07-01 12:14:12 +12:00
James Dunne
11da96fe22 Fix for #2277: Failing to load sounds/music should never crash. 2012-07-01 09:11:27 +12:00
Chris Forbes
9201b1cced fixed #2198 - crates are collected when landing on top of a unit 2012-07-01 09:04:49 +12:00
ScottNZ
e02397da3e Use Sound.PlayMusic for Hell March 2012-07-01 03:47:08 +12:00
ScottNZ
6014f648f4 Add e1, dog, e1 soviet patrol 2012-07-01 03:29:05 +12:00
ScottNZ
2c55a008f1 Reduced cruiser range from 32 to 25 to reduce risk of friendly fire. Increased barrel hitpoints. Removed jeep cargo ability as a workaround for Einstein being removed from the game world and Soviet forces not attacking. 2012-06-30 23:33:09 +12:00
ScottNZ
b9be918b6c Remove some code noise and improved the chinook cargo check 2012-06-30 23:27:14 +12:00
ScottNZ
781cbc00d3 Make Einstein run out of the building when he appears. 2012-06-30 20:27:39 +12:00
Chris Forbes
b9365a149f remove old crates list 2012-06-30 17:06:15 +12:00
1206 changed files with 51506 additions and 21334 deletions

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

@@ -13,11 +13,9 @@ mods/*/*.dll
# ReSharper crap
_ReSharper.*/
# Red Alert binary files
mods/*/packages/*.[mM][iI][xX]
#binary stuff
/*.dll
/*.dll.config
*.pdb
*.mdb
*.exe
@@ -27,9 +25,13 @@ mods/*/packages/*.[mM][iI][xX]
*.orig
\#*
.*.sw?
# dependency DLLs (different for every platform!)
cg.dll
cgGL.dll
freetype6.dll
zlib1.dll
SDL.dll
/OpenRa.Gl.dll
@@ -52,9 +54,12 @@ 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

22
.travis.yml Normal file
View File

@@ -0,0 +1,22 @@
# 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 install mono-gmcs cli-common-dev libgl1-mesa-dev libsdl1.2-dev libopenal-dev
# Run the build script which will automatically call RALint.
script:
- make all
# Only watch the development branch.
branches:
only:
- bleed
# Notify developers when needed.
notifications:
irc: "irc.freenode.net#openra"

16
AUTHORS
View File

@@ -14,25 +14,41 @@ Also thanks to:
* Andrew Riedi
* Barnaby Smith (mvi)
* Bellator
* Bugra Cuhadaroglu (BugraC)
* Christer Ulfsparre (Holloweye)
* Cody Brittain (Generalcamo)
* Daniel Derejvanik (Harisson)
* Danny (Dan9550)
* Erasmus Schroder (rasco)
* Igor Popov (ihptru)
* Iran
* James Dunne (jsd)
* Jeff Harris (jeff_1amstudios)
* Jes (-Jes-)
* Joakim Lindberg (booom3)
* JOo
* Kenny Hoxworth (hoxworth)
* Krishnakanth Mallik
* Kyrre Soerensen (zypres)
* Lawrence Wang
* Lesueur Benjamin (Valkirie)
* Mark Olson (markolson)
* Matthew Gatland (mgatland)
* Matthias Mailänder (Mailaender)
* Maarten Meuris (Nyerguds)
* Max Ugrumov (katzsmile)
* Max621
* Nukem
* Paolo Chiodi (paolochiodi)
* Paul Dovydaitis (pdovy)
* Psydev
* Raymond Martineau (mart0258)
* Riderr3
* Sascha Biedermann (bidifx)
* Tim Mylemans (gecko)
* Tirili
* Tristan Keating (Kilkakon)
* Vladimir Komarov (VrKomarov)
Past developers included:
* Paul Chote (pchote)

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

View File

@@ -1,18 +1,30 @@
CSC = gmcs
CSFLAGS = -nologo -warn:4 -debug:+ -debug:full -optimize- -codepage:utf8 -unsafe
CSFLAGS = -nologo -warn:4 -debug:full -optimize- -codepage:utf8 -unsafe -warnaserror
DEFINE = DEBUG;TRACE
COMMON_LIBS = System.dll System.Core.dll System.Drawing.dll System.Xml.dll thirdparty/ICSharpCode.SharpZipLib.dll
PHONY = core tools package all mods clean distclean
COMMON_LIBS = System.dll System.Core.dll System.Drawing.dll System.Xml.dll thirdparty/ICSharpCode.SharpZipLib.dll thirdparty/FuzzyLogicLibrary.dll thirdparty/Mono.Nat.dll
PHONY = core tools package all mods clean distclean dependencies version
VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
.SUFFIXES:
core: game renderers mods utility tsbuild
tools: editor ralint tsbuild
package: core editor
package: dependencies core editor docs version
mods: mod_ra mod_cnc mod_d2k
all: core tools
clean:
all: dependencies core tools
clean:
@-rm -f *.exe *.dll *.mdb mods/**/*.dll mods/**/*.mdb *.resources
distclean: clean
dependencies:
@ cp -r thirdparty/*.dl* .
@ cp -r thirdparty/Tao/* .
version: mods/ra/mod.yaml mods/cnc/mod.yaml mods/d2k/mod.yaml
@for i in $? ; do \
awk '{sub("Version:.*$$","Version: $(VERSION)"); print $0}' $${i} > $${i}.tmp && \
mv -f $${i}.tmp $${i} ; \
done
default: dependencies core
.DEFAULT_GOAL := default
#
# Core binaries
@@ -29,7 +41,7 @@ game_TARGET = OpenRA.Game.exe
game_KIND = winexe
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)
@@ -101,7 +113,7 @@ 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) $(utility_TARGET)
mod_d2k_DEPS = $(STD_MOD_DEPS) $(mod_ra_TARGET) $(mod_cnc_TARGET) $(utility_TARGET)
mod_d2k_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_ra_TARGET) $(utility_TARGET)
mod_d2k_EXTRA_CMDS = mono --debug RALint.exe d2k
PROGRAMS += mod_d2k
@@ -204,6 +216,10 @@ INSTALL = install
INSTALL_PROGRAM = $(INSTALL)
CORE = fileformats rcg rgl rsdl rnull game editor utility tsbuild
# Documentation (d2k depends on all mod libraries)
docs:
@mono --debug OpenRA.Utility.exe --docs d2k > DOCUMENTATION.md
install: all
@-echo "Installing OpenRA to $(INSTALL_DIR)"
@$(INSTALL_PROGRAM) -d $(INSTALL_DIR)
@@ -245,19 +261,32 @@ install: all
@cp *.ttf $(INSTALL_DIR)
@cp thirdparty/Tao/* $(INSTALL_DIR)
@$(INSTALL_PROGRAM) thirdparty/ICSharpCode.SharpZipLib.dll $(INSTALL_DIR)
@$(INSTALL_PROGRAM) thirdparty/FuzzyLogicLibrary.dll $(INSTALL_DIR)
@$(INSTALL_PROGRAM) thirdparty/SharpFont.dll $(INSTALL_DIR)
@cp thirdparty/SharpFont.dll.config $(INSTALL_DIR)
@$(INSTALL_PROGRAM) thirdparty/Mono.Nat.dll $(INSTALL_DIR)
@echo "#!/bin/sh" > openra
@echo "cd "$(datadir)"/openra" >> openra
@echo "exec mono "$(datadir)"/openra/OpenRA.Game.exe \"$$""@\"" >> openra
@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
@echo "#!/bin/sh" > openra-editor
@echo "cd "$(datadir)"/openra" >> openra-editor
@echo "exec mono "$(datadir)"/openra/OpenRA.Editor.exe \"$$""@\"" >> openra-editor
@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_PROGRAM) -d $(BIN_INSTALL_DIR)
@$(INSTALL_PROGRAM) -m +rx openra $(BIN_INSTALL_DIR)
@$(INSTALL_PROGRAM) -m +rx openra-editor $(BIN_INSTALL_DIR)
@-rm openra
@-rm openra-editor
uninstall:
@-rm -r $(INSTALL_DIR)
@-rm $(DESTDIR)$(bindir)/openra

View File

@@ -104,7 +104,7 @@ namespace OpenRA.Editor
}
}
/* todo: optimize */
/* TODO: optimize */
foreach (var ch in s.Chunks.Values) ch.Dispose();
s.Chunks.Clear();
}

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,
@@ -55,6 +55,29 @@ namespace OpenRA.Editor
this.surface1 = new OpenRA.Editor.Surface();
this.tt = new System.Windows.Forms.ToolTip(this.components);
this.splitContainer3 = new System.Windows.Forms.SplitContainer();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStripMenuItemNew = new System.Windows.Forms.ToolStripButton();
this.toolStripMenuItemOpen = new System.Windows.Forms.ToolStripButton();
this.toolStripMenuItemSave = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItemProperties = new System.Windows.Forms.ToolStripButton();
this.toolStripMenuItemResize = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItemShowActorNames = new System.Windows.Forms.ToolStripButton();
this.toolStripMenuItemShowGrid = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator();
this.zoomIntoolStripButton = new System.Windows.Forms.ToolStripButton();
this.zoomOutToolStripButton = new System.Windows.Forms.ToolStripButton();
this.panToolStripButton = new System.Windows.Forms.ToolStripButton();
this.showRulerToolStripItem = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItemFixOpenAreas = new System.Windows.Forms.ToolStripButton();
this.toolStripMenuItemSetupDefaultPlayers = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
this.eraserToolStripButton = new System.Windows.Forms.ToolStripButton();
this.toolStripMenuItemCopySelection = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
this.QuickhelpToolStripButton = new System.Windows.Forms.ToolStripButton();
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -65,23 +88,45 @@ namespace OpenRA.Editor
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.cCRedAlertMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.bitmapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuExport = new System.Windows.Forms.ToolStripMenuItem();
this.mnuMinimapToPNG = new System.Windows.Forms.ToolStripMenuItem();
this.fullMapRenderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.propertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.resizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
this.showActorNamesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.showGridToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.showRulerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
this.fixOpenAreasToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.setupDefaultPlayersMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this.copySelectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripComboBox1 = new System.Windows.Forms.ToolStripComboBox();
this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.openRAWebsiteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.openRAResourcesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.wikiDocumentationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.discussionForumsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.sourceCodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.issueTrackerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.developerBountiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.toolStripStatusLabelFiller = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStripStatusLabelMousePosition = new System.Windows.Forms.ToolStripStatusLabel();
this.BottomToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.TopToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.RightToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.LeftToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.ContentPanel = new System.Windows.Forms.ToolStripContentPanel();
this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer();
this.cashToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
@@ -97,8 +142,13 @@ namespace OpenRA.Editor
this.splitContainer3.Panel1.SuspendLayout();
this.splitContainer3.Panel2.SuspendLayout();
this.splitContainer3.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.menuStrip1.SuspendLayout();
this.statusStrip1.SuspendLayout();
this.toolStripContainer1.BottomToolStripPanel.SuspendLayout();
this.toolStripContainer1.ContentPanel.SuspendLayout();
this.toolStripContainer1.TopToolStripPanel.SuspendLayout();
this.toolStripContainer1.SuspendLayout();
this.SuspendLayout();
//
// splitContainer1
@@ -114,7 +164,7 @@ namespace OpenRA.Editor
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.surface1);
this.splitContainer1.Size = new System.Drawing.Size(985, 744);
this.splitContainer1.Size = new System.Drawing.Size(985, 695);
this.splitContainer1.SplitterDistance = 198;
this.splitContainer1.TabIndex = 0;
//
@@ -132,8 +182,8 @@ namespace OpenRA.Editor
// splitContainer2.Panel2
//
this.splitContainer2.Panel2.Controls.Add(this.tabControl1);
this.splitContainer2.Size = new System.Drawing.Size(198, 744);
this.splitContainer2.SplitterDistance = 164;
this.splitContainer2.Size = new System.Drawing.Size(198, 695);
this.splitContainer2.SplitterDistance = 153;
this.splitContainer2.TabIndex = 1;
//
// pmMiniMap
@@ -143,7 +193,7 @@ namespace OpenRA.Editor
this.pmMiniMap.Dock = System.Windows.Forms.DockStyle.Fill;
this.pmMiniMap.Location = new System.Drawing.Point(0, 0);
this.pmMiniMap.Name = "pmMiniMap";
this.pmMiniMap.Size = new System.Drawing.Size(198, 164);
this.pmMiniMap.Size = new System.Drawing.Size(198, 153);
this.pmMiniMap.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pmMiniMap.TabIndex = 1;
this.pmMiniMap.TabStop = false;
@@ -160,7 +210,7 @@ namespace OpenRA.Editor
this.tabControl1.Name = "tabControl1";
this.tabControl1.Padding = new System.Drawing.Point(6, 0);
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(198, 576);
this.tabControl1.Size = new System.Drawing.Size(198, 538);
this.tabControl1.TabIndex = 0;
//
// tabPage1
@@ -169,7 +219,7 @@ namespace OpenRA.Editor
this.tabPage1.Location = new System.Drawing.Point(4, 20);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(190, 552);
this.tabPage1.Size = new System.Drawing.Size(190, 514);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "Templates";
this.tabPage1.UseVisualStyleBackColor = true;
@@ -181,7 +231,7 @@ namespace OpenRA.Editor
this.tilePalette.Dock = System.Windows.Forms.DockStyle.Fill;
this.tilePalette.Location = new System.Drawing.Point(3, 3);
this.tilePalette.Name = "tilePalette";
this.tilePalette.Size = new System.Drawing.Size(184, 546);
this.tilePalette.Size = new System.Drawing.Size(184, 508);
this.tilePalette.TabIndex = 1;
//
// tabPage2
@@ -191,7 +241,7 @@ namespace OpenRA.Editor
this.tabPage2.Location = new System.Drawing.Point(4, 20);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(190, 552);
this.tabPage2.Size = new System.Drawing.Size(190, 514);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "Actors";
this.tabPage2.UseVisualStyleBackColor = true;
@@ -202,7 +252,7 @@ namespace OpenRA.Editor
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(3, 24);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(184, 525);
this.panel1.Size = new System.Drawing.Size(184, 487);
this.panel1.TabIndex = 4;
//
// actorPalette
@@ -212,7 +262,7 @@ namespace OpenRA.Editor
this.actorPalette.Dock = System.Windows.Forms.DockStyle.Fill;
this.actorPalette.Location = new System.Drawing.Point(0, 0);
this.actorPalette.Name = "actorPalette";
this.actorPalette.Size = new System.Drawing.Size(184, 525);
this.actorPalette.Size = new System.Drawing.Size(184, 487);
this.actorPalette.TabIndex = 3;
//
// actorOwnerChooser
@@ -233,7 +283,7 @@ namespace OpenRA.Editor
this.tabPage3.Controls.Add(this.resourcePalette);
this.tabPage3.Location = new System.Drawing.Point(4, 20);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Size = new System.Drawing.Size(190, 552);
this.tabPage3.Size = new System.Drawing.Size(190, 514);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "Resources";
this.tabPage3.UseVisualStyleBackColor = true;
@@ -245,7 +295,7 @@ namespace OpenRA.Editor
this.resourcePalette.Dock = System.Windows.Forms.DockStyle.Fill;
this.resourcePalette.Location = new System.Drawing.Point(0, 0);
this.resourcePalette.Name = "resourcePalette";
this.resourcePalette.Size = new System.Drawing.Size(190, 552);
this.resourcePalette.Size = new System.Drawing.Size(190, 514);
this.resourcePalette.TabIndex = 3;
//
// surface1
@@ -254,7 +304,7 @@ namespace OpenRA.Editor
this.surface1.Dock = System.Windows.Forms.DockStyle.Fill;
this.surface1.Location = new System.Drawing.Point(0, 0);
this.surface1.Name = "surface1";
this.surface1.Size = new System.Drawing.Size(783, 744);
this.surface1.Size = new System.Drawing.Size(783, 695);
this.surface1.TabIndex = 5;
this.surface1.Text = "surface1";
//
@@ -273,24 +323,253 @@ namespace OpenRA.Editor
//
// splitContainer3.Panel1
//
this.splitContainer3.Panel1.Controls.Add(this.menuStrip1);
this.splitContainer3.Panel1.Controls.Add(this.toolStrip1);
//
// splitContainer3.Panel2
//
this.splitContainer3.Panel2.Controls.Add(this.splitContainer1);
this.splitContainer3.Size = new System.Drawing.Size(985, 773);
this.splitContainer3.Size = new System.Drawing.Size(985, 724);
this.splitContainer3.SplitterDistance = 25;
this.splitContainer3.TabIndex = 6;
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripMenuItemNew,
this.toolStripMenuItemOpen,
this.toolStripMenuItemSave,
this.toolStripSeparator,
this.toolStripMenuItemProperties,
this.toolStripMenuItemResize,
this.toolStripSeparator8,
this.toolStripMenuItemShowActorNames,
this.toolStripMenuItemShowGrid,
this.toolStripSeparator12,
this.zoomIntoolStripButton,
this.zoomOutToolStripButton,
this.panToolStripButton,
this.showRulerToolStripItem,
this.toolStripSeparator10,
this.toolStripMenuItemFixOpenAreas,
this.toolStripMenuItemSetupDefaultPlayers,
this.toolStripSeparator11,
this.eraserToolStripButton,
this.toolStripMenuItemCopySelection,
this.toolStripSeparator7,
this.QuickhelpToolStripButton});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
this.toolStrip1.Size = new System.Drawing.Size(985, 25);
this.toolStrip1.TabIndex = 0;
this.toolStrip1.Text = "toolStrip1";
//
// toolStripMenuItemNew
//
this.toolStripMenuItemNew.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripMenuItemNew.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItemNew.Image")));
this.toolStripMenuItemNew.ImageTransparentColor = System.Drawing.Color.Fuchsia;
this.toolStripMenuItemNew.Name = "toolStripMenuItemNew";
this.toolStripMenuItemNew.Size = new System.Drawing.Size(23, 22);
this.toolStripMenuItemNew.Text = "&New...";
this.toolStripMenuItemNew.ToolTipText = "Create a new blank map.";
this.toolStripMenuItemNew.Click += new System.EventHandler(this.toolStripMenuItemNewClick);
//
// toolStripMenuItemOpen
//
this.toolStripMenuItemOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripMenuItemOpen.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItemOpen.Image")));
this.toolStripMenuItemOpen.Name = "toolStripMenuItemOpen";
this.toolStripMenuItemOpen.Size = new System.Drawing.Size(23, 22);
this.toolStripMenuItemOpen.Text = "&Open...";
this.toolStripMenuItemOpen.ToolTipText = "Open an existing map.";
this.toolStripMenuItemOpen.Click += new System.EventHandler(this.toolStripMenuItemOpenClick);
//
// toolStripMenuItemSave
//
this.toolStripMenuItemSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripMenuItemSave.Enabled = false;
this.toolStripMenuItemSave.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItemSave.Image")));
this.toolStripMenuItemSave.Name = "toolStripMenuItemSave";
this.toolStripMenuItemSave.Size = new System.Drawing.Size(23, 22);
this.toolStripMenuItemSave.Text = "&Save";
this.toolStripMenuItemSave.ToolTipText = "Quicksave current map.";
this.toolStripMenuItemSave.Click += new System.EventHandler(this.toolStripMenuItemSaveClick);
//
// toolStripSeparator
//
this.toolStripSeparator.Name = "toolStripSeparator";
this.toolStripSeparator.Size = new System.Drawing.Size(6, 25);
//
// toolStripMenuItemProperties
//
this.toolStripMenuItemProperties.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripMenuItemProperties.Enabled = false;
this.toolStripMenuItemProperties.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItemProperties.Image")));
this.toolStripMenuItemProperties.Name = "toolStripMenuItemProperties";
this.toolStripMenuItemProperties.Size = new System.Drawing.Size(23, 22);
this.toolStripMenuItemProperties.Text = "&Properties...";
this.toolStripMenuItemProperties.ToolTipText = "Edit Metadata";
this.toolStripMenuItemProperties.Click += new System.EventHandler(this.toolStripMenuItemPropertiesClick);
//
// toolStripMenuItemResize
//
this.toolStripMenuItemResize.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripMenuItemResize.Enabled = false;
this.toolStripMenuItemResize.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItemResize.Image")));
this.toolStripMenuItemResize.Name = "toolStripMenuItemResize";
this.toolStripMenuItemResize.Size = new System.Drawing.Size(23, 22);
this.toolStripMenuItemResize.Text = "&Resize...";
this.toolStripMenuItemResize.ToolTipText = "Change the map borders and dimensions.";
this.toolStripMenuItemResize.Click += new System.EventHandler(this.toolStripMenuItemResizeClick);
//
// toolStripSeparator8
//
this.toolStripSeparator8.Name = "toolStripSeparator8";
this.toolStripSeparator8.Size = new System.Drawing.Size(6, 25);
//
// toolStripMenuItemShowActorNames
//
this.toolStripMenuItemShowActorNames.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripMenuItemShowActorNames.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItemShowActorNames.Image")));
this.toolStripMenuItemShowActorNames.Name = "toolStripMenuItemShowActorNames";
this.toolStripMenuItemShowActorNames.Size = new System.Drawing.Size(23, 22);
this.toolStripMenuItemShowActorNames.Text = "Show Actor &Names";
this.toolStripMenuItemShowActorNames.ToolTipText = "If the actor has a custom name, display it.";
this.toolStripMenuItemShowActorNames.Click += new System.EventHandler(this.toolStripMenuItemShowActorNamesClick);
//
// toolStripMenuItemShowGrid
//
this.toolStripMenuItemShowGrid.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripMenuItemShowGrid.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItemShowGrid.Image")));
this.toolStripMenuItemShowGrid.Name = "toolStripMenuItemShowGrid";
this.toolStripMenuItemShowGrid.Size = new System.Drawing.Size(23, 22);
this.toolStripMenuItemShowGrid.Text = "Show &Grid";
this.toolStripMenuItemShowGrid.ToolTipText = "Enable a grid overlay for better orientation.";
this.toolStripMenuItemShowGrid.Click += new System.EventHandler(this.toolStripMenuItemShowGridClick);
//
// toolStripSeparator12
//
this.toolStripSeparator12.Name = "toolStripSeparator12";
this.toolStripSeparator12.Size = new System.Drawing.Size(6, 25);
//
// zoomIntoolStripButton
//
this.zoomIntoolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.zoomIntoolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("zoomIntoolStripButton.Image")));
this.zoomIntoolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.zoomIntoolStripButton.Name = "zoomIntoolStripButton";
this.zoomIntoolStripButton.Size = new System.Drawing.Size(23, 22);
this.zoomIntoolStripButton.Text = "Zoom in";
this.zoomIntoolStripButton.Click += new System.EventHandler(this.zoomInToolStripButtonClick);
//
// zoomOutToolStripButton
//
this.zoomOutToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.zoomOutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("zoomOutToolStripButton.Image")));
this.zoomOutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.zoomOutToolStripButton.Name = "zoomOutToolStripButton";
this.zoomOutToolStripButton.Size = new System.Drawing.Size(23, 22);
this.zoomOutToolStripButton.Text = "Zoom out";
this.zoomOutToolStripButton.Click += new System.EventHandler(this.zoomOutToolStripButtonClick);
//
// panToolStripButton
//
this.panToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.panToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("panToolStripButton.Image")));
this.panToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.panToolStripButton.Name = "panToolStripButton";
this.panToolStripButton.Size = new System.Drawing.Size(23, 22);
this.panToolStripButton.Text = "Pan view";
this.panToolStripButton.Click += new System.EventHandler(this.panToolStripButtonClick);
//
// showRulerToolStripItem
//
this.showRulerToolStripItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.showRulerToolStripItem.Image = ((System.Drawing.Image)(resources.GetObject("showRulerToolStripItem.Image")));
this.showRulerToolStripItem.Name = "showRulerToolStripItem";
this.showRulerToolStripItem.Size = new System.Drawing.Size(23, 22);
this.showRulerToolStripItem.Text = "Show Ruler";
this.showRulerToolStripItem.Click += new System.EventHandler(this.showRulerToolStripItemClick);
//
// toolStripSeparator10
//
this.toolStripSeparator10.Name = "toolStripSeparator10";
this.toolStripSeparator10.Size = new System.Drawing.Size(6, 25);
//
// toolStripMenuItemFixOpenAreas
//
this.toolStripMenuItemFixOpenAreas.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripMenuItemFixOpenAreas.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItemFixOpenAreas.Image")));
this.toolStripMenuItemFixOpenAreas.Name = "toolStripMenuItemFixOpenAreas";
this.toolStripMenuItemFixOpenAreas.Size = new System.Drawing.Size(23, 22);
this.toolStripMenuItemFixOpenAreas.Text = "&Fix Open Areas";
this.toolStripMenuItemFixOpenAreas.ToolTipText = "Add some randomness into clear tiles.";
this.toolStripMenuItemFixOpenAreas.Click += new System.EventHandler(this.toolStripMenuItemFixOpenAreasClick);
//
// toolStripMenuItemSetupDefaultPlayers
//
this.toolStripMenuItemSetupDefaultPlayers.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripMenuItemSetupDefaultPlayers.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItemSetupDefaultPlayers.Image")));
this.toolStripMenuItemSetupDefaultPlayers.Name = "toolStripMenuItemSetupDefaultPlayers";
this.toolStripMenuItemSetupDefaultPlayers.Size = new System.Drawing.Size(23, 22);
this.toolStripMenuItemSetupDefaultPlayers.Text = "&Setup Default Players";
this.toolStripMenuItemSetupDefaultPlayers.ToolTipText = "Setup the players for each spawnpoint placed.";
this.toolStripMenuItemSetupDefaultPlayers.Click += new System.EventHandler(this.toolStripMenuItemSetupDefaultPlayersClick);
//
// toolStripSeparator11
//
this.toolStripSeparator11.Name = "toolStripSeparator11";
this.toolStripSeparator11.Size = new System.Drawing.Size(6, 25);
//
// eraserToolStripButton
//
this.eraserToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.eraserToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("eraserToolStripButton.Image")));
this.eraserToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.eraserToolStripButton.Name = "eraserToolStripButton";
this.eraserToolStripButton.Size = new System.Drawing.Size(23, 22);
this.eraserToolStripButton.Text = "Erase actors and resources.";
this.eraserToolStripButton.Click += new System.EventHandler(this.EraserToolStripButtonClick);
//
// toolStripMenuItemCopySelection
//
this.toolStripMenuItemCopySelection.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripMenuItemCopySelection.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItemCopySelection.Image")));
this.toolStripMenuItemCopySelection.Name = "toolStripMenuItemCopySelection";
this.toolStripMenuItemCopySelection.Size = new System.Drawing.Size(23, 22);
this.toolStripMenuItemCopySelection.Text = "Copy Selection";
this.toolStripMenuItemCopySelection.ToolTipText = "Copy the current selection and paste it again on left-click.";
this.toolStripMenuItemCopySelection.Click += new System.EventHandler(this.toolStripMenuItemCopySelectionClick);
//
// toolStripSeparator7
//
this.toolStripSeparator7.Name = "toolStripSeparator7";
this.toolStripSeparator7.Size = new System.Drawing.Size(6, 25);
//
// QuickhelpToolStripButton
//
this.QuickhelpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.QuickhelpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("QuickhelpToolStripButton.Image")));
this.QuickhelpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.QuickhelpToolStripButton.Name = "QuickhelpToolStripButton";
this.QuickhelpToolStripButton.Size = new System.Drawing.Size(23, 22);
this.QuickhelpToolStripButton.Text = "Help";
this.QuickhelpToolStripButton.ToolTipText = "Display the mapping tutorial in the OpenRA wiki.";
this.QuickhelpToolStripButton.Click += new System.EventHandler(this.helpToolStripButton_Click);
//
// menuStrip1
//
this.menuStrip1.Dock = System.Windows.Forms.DockStyle.None;
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem,
this.mapToolStripMenuItem,
this.toolStripComboBox1,
this.toolStripLabel1});
this.fileToolStripMenuItem,
this.mapToolStripMenuItem,
this.toolStripComboBox1,
this.toolStripLabel1,
this.helpToolStripMenuItem});
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
this.menuStrip1.Name = "menuStrip1";
this.menuStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
this.menuStrip1.Size = new System.Drawing.Size(985, 27);
this.menuStrip1.TabIndex = 1;
this.menuStrip1.Text = "menuStrip1";
@@ -298,16 +577,16 @@ namespace OpenRA.Editor
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.newToolStripMenuItem,
this.toolStripSeparator1,
this.openToolStripMenuItem,
this.saveToolStripMenuItem,
this.saveAsToolStripMenuItem,
this.toolStripSeparator2,
this.toolStripMenuItem1,
this.mnuExport,
this.toolStripSeparator3,
this.exitToolStripMenuItem});
this.newToolStripMenuItem,
this.toolStripSeparator1,
this.openToolStripMenuItem,
this.saveToolStripMenuItem,
this.saveAsToolStripMenuItem,
this.toolStripSeparator2,
this.toolStripMenuItem1,
this.mnuExport,
this.toolStripSeparator3,
this.exitToolStripMenuItem});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 23);
this.fileToolStripMenuItem.Text = "&File";
@@ -319,6 +598,7 @@ namespace OpenRA.Editor
this.newToolStripMenuItem.Name = "newToolStripMenuItem";
this.newToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
this.newToolStripMenuItem.Text = "&New...";
this.newToolStripMenuItem.ToolTipText = "Create a new blank map.";
this.newToolStripMenuItem.Click += new System.EventHandler(this.NewClicked);
//
// toolStripSeparator1
@@ -332,6 +612,7 @@ namespace OpenRA.Editor
this.openToolStripMenuItem.Name = "openToolStripMenuItem";
this.openToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
this.openToolStripMenuItem.Text = "&Open...";
this.openToolStripMenuItem.ToolTipText = "Open an existing map.";
this.openToolStripMenuItem.Click += new System.EventHandler(this.OpenClicked);
//
// saveToolStripMenuItem
@@ -341,14 +622,17 @@ namespace OpenRA.Editor
this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
this.saveToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
this.saveToolStripMenuItem.Text = "&Save";
this.saveToolStripMenuItem.ToolTipText = "Quicksave current map.";
this.saveToolStripMenuItem.Click += new System.EventHandler(this.SaveClicked);
//
// saveAsToolStripMenuItem
//
this.saveAsToolStripMenuItem.Enabled = false;
this.saveAsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("saveAsToolStripMenuItem.Image")));
this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
this.saveAsToolStripMenuItem.Text = "Save &As...";
this.saveAsToolStripMenuItem.ToolTipText = "Save the map while choosing a filename.";
this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.SaveAsClicked);
//
// toolStripSeparator2
@@ -359,8 +643,9 @@ namespace OpenRA.Editor
// toolStripMenuItem1
//
this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.cCRedAlertMapToolStripMenuItem,
this.bitmapToolStripMenuItem});
this.cCRedAlertMapToolStripMenuItem});
this.toolStripMenuItem1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem1.Image")));
this.toolStripMenuItem1.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(123, 22);
this.toolStripMenuItem1.Text = "&Import";
@@ -369,22 +654,18 @@ namespace OpenRA.Editor
//
this.cCRedAlertMapToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("cCRedAlertMapToolStripMenuItem.Image")));
this.cCRedAlertMapToolStripMenuItem.Name = "cCRedAlertMapToolStripMenuItem";
this.cCRedAlertMapToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
this.cCRedAlertMapToolStripMenuItem.Text = "&C&&C / Red Alert Map...";
this.cCRedAlertMapToolStripMenuItem.Size = new System.Drawing.Size(188, 22);
this.cCRedAlertMapToolStripMenuItem.Text = "&Legacy Map Format...";
this.cCRedAlertMapToolStripMenuItem.ToolTipText = "Import an original C&C / Red Alert and convert it to the .oramap format.";
this.cCRedAlertMapToolStripMenuItem.Click += new System.EventHandler(this.ImportLegacyMapClicked);
//
// bitmapToolStripMenuItem
//
this.bitmapToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("bitmapToolStripMenuItem.Image")));
this.bitmapToolStripMenuItem.Name = "bitmapToolStripMenuItem";
this.bitmapToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
this.bitmapToolStripMenuItem.Text = "&Bitmap...";
this.bitmapToolStripMenuItem.Visible = false;
//
// mnuExport
//
this.mnuExport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuMinimapToPNG});
this.mnuMinimapToPNG,
this.fullMapRenderToolStripMenuItem});
this.mnuExport.Image = ((System.Drawing.Image)(resources.GetObject("mnuExport.Image")));
this.mnuExport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.mnuExport.Name = "mnuExport";
this.mnuExport.Size = new System.Drawing.Size(123, 22);
this.mnuExport.Text = "&Export";
@@ -396,8 +677,17 @@ namespace OpenRA.Editor
this.mnuMinimapToPNG.Name = "mnuMinimapToPNG";
this.mnuMinimapToPNG.Size = new System.Drawing.Size(163, 22);
this.mnuMinimapToPNG.Text = "Minimap to PNG";
this.mnuMinimapToPNG.ToolTipText = "Save the map radar display as an image.";
this.mnuMinimapToPNG.Click += new System.EventHandler(this.ExportMinimap);
//
// fullMapRenderToolStripMenuItem
//
this.fullMapRenderToolStripMenuItem.Enabled = false;
this.fullMapRenderToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("fullMapRenderToolStripMenuItem.Image")));
this.fullMapRenderToolStripMenuItem.Name = "fullMapRenderToolStripMenuItem";
this.fullMapRenderToolStripMenuItem.Size = new System.Drawing.Size(163, 22);
this.fullMapRenderToolStripMenuItem.Text = "Full Map Render";
//
// toolStripSeparator3
//
this.toolStripSeparator3.Name = "toolStripSeparator3";
@@ -405,20 +695,28 @@ namespace OpenRA.Editor
//
// exitToolStripMenuItem
//
this.exitToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("exitToolStripMenuItem.Image")));
this.exitToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;
this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
this.exitToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
this.exitToolStripMenuItem.Text = "E&xit";
this.exitToolStripMenuItem.ToolTipText = "Quit the map editor.";
this.exitToolStripMenuItem.Click += new System.EventHandler(this.CloseClicked);
//
// mapToolStripMenuItem
//
this.mapToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.propertiesToolStripMenuItem,
this.resizeToolStripMenuItem,
this.showActorNamesToolStripMenuItem,
this.showGridToolStripMenuItem,
this.fixOpenAreasToolStripMenuItem,
this.setupDefaultPlayersMenuItem});
this.propertiesToolStripMenuItem,
this.resizeToolStripMenuItem,
this.toolStripSeparator9,
this.showActorNamesToolStripMenuItem,
this.showGridToolStripMenuItem,
this.showRulerToolStripMenuItem,
this.toolStripSeparator5,
this.fixOpenAreasToolStripMenuItem,
this.setupDefaultPlayersMenuItem,
this.toolStripSeparator4,
this.copySelectionToolStripMenuItem});
this.mapToolStripMenuItem.Name = "mapToolStripMenuItem";
this.mapToolStripMenuItem.Size = new System.Drawing.Size(43, 23);
this.mapToolStripMenuItem.Text = "&Map";
@@ -430,6 +728,7 @@ namespace OpenRA.Editor
this.propertiesToolStripMenuItem.Name = "propertiesToolStripMenuItem";
this.propertiesToolStripMenuItem.Size = new System.Drawing.Size(185, 22);
this.propertiesToolStripMenuItem.Text = "&Properties...";
this.propertiesToolStripMenuItem.ToolTipText = "Edit Metadata";
this.propertiesToolStripMenuItem.Click += new System.EventHandler(this.PropertiesClicked);
//
// resizeToolStripMenuItem
@@ -439,36 +738,77 @@ namespace OpenRA.Editor
this.resizeToolStripMenuItem.Name = "resizeToolStripMenuItem";
this.resizeToolStripMenuItem.Size = new System.Drawing.Size(185, 22);
this.resizeToolStripMenuItem.Text = "&Resize...";
this.resizeToolStripMenuItem.ToolTipText = "Change the map borders and dimensions.";
this.resizeToolStripMenuItem.Click += new System.EventHandler(this.ResizeClicked);
//
// toolStripSeparator9
//
this.toolStripSeparator9.Name = "toolStripSeparator9";
this.toolStripSeparator9.Size = new System.Drawing.Size(182, 6);
//
// showActorNamesToolStripMenuItem
//
this.showActorNamesToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("showActorNamesToolStripMenuItem.Image")));
this.showActorNamesToolStripMenuItem.Name = "showActorNamesToolStripMenuItem";
this.showActorNamesToolStripMenuItem.Size = new System.Drawing.Size(185, 22);
this.showActorNamesToolStripMenuItem.Text = "Show Actor &Names";
this.showActorNamesToolStripMenuItem.Text = "Show &Actor Names";
this.showActorNamesToolStripMenuItem.ToolTipText = "If the actor has a custom name, display it.";
this.showActorNamesToolStripMenuItem.Click += new System.EventHandler(this.ShowActorNamesClicked);
//
// showGridToolStripMenuItem
//
this.showGridToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("showGridToolStripMenuItem.Image")));
this.showGridToolStripMenuItem.Name = "showGridToolStripMenuItem";
this.showGridToolStripMenuItem.Size = new System.Drawing.Size(185, 22);
this.showGridToolStripMenuItem.Text = "Show &Grid";
this.showGridToolStripMenuItem.ToolTipText = "Enable a grid overlay for better orientation.";
this.showGridToolStripMenuItem.Click += new System.EventHandler(this.ShowGridClicked);
//
// showRulerToolStripMenuItem
//
this.showRulerToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("showRulerToolStripMenuItem.Image")));
this.showRulerToolStripMenuItem.Name = "showRulerToolStripMenuItem";
this.showRulerToolStripMenuItem.Size = new System.Drawing.Size(185, 22);
this.showRulerToolStripMenuItem.Text = "Show Ruler";
this.showRulerToolStripMenuItem.Click += new System.EventHandler(this.showRulerToolStripMenuItemClick);
//
// toolStripSeparator5
//
this.toolStripSeparator5.Name = "toolStripSeparator5";
this.toolStripSeparator5.Size = new System.Drawing.Size(182, 6);
//
// fixOpenAreasToolStripMenuItem
//
this.fixOpenAreasToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("fixOpenAreasToolStripMenuItem.Image")));
this.fixOpenAreasToolStripMenuItem.Name = "fixOpenAreasToolStripMenuItem";
this.fixOpenAreasToolStripMenuItem.Size = new System.Drawing.Size(185, 22);
this.fixOpenAreasToolStripMenuItem.Text = "&Fix Open Areas";
this.fixOpenAreasToolStripMenuItem.ToolTipText = "Add some randomness into clear tiles.";
this.fixOpenAreasToolStripMenuItem.Click += new System.EventHandler(this.FixOpenAreas);
//
// setupDefaultPlayersMenuItem
//
this.setupDefaultPlayersMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("setupDefaultPlayersMenuItem.Image")));
this.setupDefaultPlayersMenuItem.Name = "setupDefaultPlayersMenuItem";
this.setupDefaultPlayersMenuItem.Size = new System.Drawing.Size(185, 22);
this.setupDefaultPlayersMenuItem.Text = "&Setup Default Players";
this.setupDefaultPlayersMenuItem.ToolTipText = "Setup the players for each spawnpoint placed.";
this.setupDefaultPlayersMenuItem.Click += new System.EventHandler(this.SetupDefaultPlayers);
//
// toolStripSeparator4
//
this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(182, 6);
//
// copySelectionToolStripMenuItem
//
this.copySelectionToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("copySelectionToolStripMenuItem.Image")));
this.copySelectionToolStripMenuItem.Name = "copySelectionToolStripMenuItem";
this.copySelectionToolStripMenuItem.Size = new System.Drawing.Size(185, 22);
this.copySelectionToolStripMenuItem.Text = "Copy Selection";
this.copySelectionToolStripMenuItem.ToolTipText = "Copy the current selection and paste it again on left-click.";
this.copySelectionToolStripMenuItem.Click += new System.EventHandler(this.copySelectionToolStripMenuItemClick);
//
// toolStripComboBox1
//
this.toolStripComboBox1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
@@ -479,16 +819,115 @@ namespace OpenRA.Editor
// toolStripLabel1
//
this.toolStripLabel1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.toolStripLabel1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripLabel1.Image")));
this.toolStripLabel1.Name = "toolStripLabel1";
this.toolStripLabel1.Size = new System.Drawing.Size(71, 20);
this.toolStripLabel1.Size = new System.Drawing.Size(87, 20);
this.toolStripLabel1.Text = "Active Mod:";
this.toolStripLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.toolStripLabel1.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
this.toolStripLabel1.ToolTipText = "Choose the OpenRA mod whose tilesets and actors shall be used.";
//
// helpToolStripMenuItem
//
this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.openRAWebsiteToolStripMenuItem,
this.openRAResourcesToolStripMenuItem,
this.wikiDocumentationToolStripMenuItem,
this.discussionForumsToolStripMenuItem,
this.sourceCodeToolStripMenuItem,
this.issueTrackerToolStripMenuItem,
this.developerBountiesToolStripMenuItem,
this.toolStripSeparator6,
this.aboutToolStripMenuItem});
this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 23);
this.helpToolStripMenuItem.Text = "&Help";
//
// openRAWebsiteToolStripMenuItem
//
this.openRAWebsiteToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("openRAWebsiteToolStripMenuItem.Image")));
this.openRAWebsiteToolStripMenuItem.Name = "openRAWebsiteToolStripMenuItem";
this.openRAWebsiteToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.openRAWebsiteToolStripMenuItem.Text = "OpenRA &Website";
this.openRAWebsiteToolStripMenuItem.ToolTipText = "Visit the OpenRA homepage.";
this.openRAWebsiteToolStripMenuItem.Click += new System.EventHandler(this.openRAWebsiteToolStripMenuItemClick);
//
// openRAResourcesToolStripMenuItem
//
this.openRAResourcesToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("openRAResourcesToolStripMenuItem.Image")));
this.openRAResourcesToolStripMenuItem.Name = "openRAResourcesToolStripMenuItem";
this.openRAResourcesToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.openRAResourcesToolStripMenuItem.Text = "OpenRA &Resources";
this.openRAResourcesToolStripMenuItem.ToolTipText = "Share your maps and replays by uploading on this file exchange community.";
this.openRAResourcesToolStripMenuItem.Click += new System.EventHandler(this.openRAResourcesToolStripMenuItemClick);
//
// wikiDocumentationToolStripMenuItem
//
this.wikiDocumentationToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("wikiDocumentationToolStripMenuItem.Image")));
this.wikiDocumentationToolStripMenuItem.Name = "wikiDocumentationToolStripMenuItem";
this.wikiDocumentationToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.wikiDocumentationToolStripMenuItem.Text = "Wiki &Documentation";
this.wikiDocumentationToolStripMenuItem.ToolTipText = "Read and contribute to the developer documentation.";
this.wikiDocumentationToolStripMenuItem.Click += new System.EventHandler(this.wikiDocumentationToolStripMenuItemClick);
//
// discussionForumsToolStripMenuItem
//
this.discussionForumsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("discussionForumsToolStripMenuItem.Image")));
this.discussionForumsToolStripMenuItem.Name = "discussionForumsToolStripMenuItem";
this.discussionForumsToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.discussionForumsToolStripMenuItem.Text = "Discussion &Forums";
this.discussionForumsToolStripMenuItem.ToolTipText = "Discuss OpenRA related matters in a bulletin board forum.";
this.discussionForumsToolStripMenuItem.Click += new System.EventHandler(this.discussionForumsToolStripMenuItemClick);
//
// sourceCodeToolStripMenuItem
//
this.sourceCodeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("sourceCodeToolStripMenuItem.Image")));
this.sourceCodeToolStripMenuItem.Name = "sourceCodeToolStripMenuItem";
this.sourceCodeToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.sourceCodeToolStripMenuItem.Text = "Source &Code";
this.sourceCodeToolStripMenuItem.ToolTipText = "Browse and download the source code. Fix what annoys you. Patches are welcome.";
this.sourceCodeToolStripMenuItem.Click += new System.EventHandler(this.sourceCodeToolStripMenuItemClick);
//
// issueTrackerToolStripMenuItem
//
this.issueTrackerToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("issueTrackerToolStripMenuItem.Image")));
this.issueTrackerToolStripMenuItem.Name = "issueTrackerToolStripMenuItem";
this.issueTrackerToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.issueTrackerToolStripMenuItem.Text = "Issue &Tracker";
this.issueTrackerToolStripMenuItem.ToolTipText = "Report problems and request features.";
this.issueTrackerToolStripMenuItem.Click += new System.EventHandler(this.issueTrackerToolStripMenuItemClick);
//
// developerBountiesToolStripMenuItem
//
this.developerBountiesToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("developerBountiesToolStripMenuItem.Image")));
this.developerBountiesToolStripMenuItem.Name = "developerBountiesToolStripMenuItem";
this.developerBountiesToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.developerBountiesToolStripMenuItem.Text = "Developer &Bounties";
this.developerBountiesToolStripMenuItem.ToolTipText = "Hire a developer to get OpenRA modified to your wishes.";
this.developerBountiesToolStripMenuItem.Click += new System.EventHandler(this.developerBountiesToolStripMenuItemClick);
//
// toolStripSeparator6
//
this.toolStripSeparator6.Name = "toolStripSeparator6";
this.toolStripSeparator6.Size = new System.Drawing.Size(180, 6);
//
// aboutToolStripMenuItem
//
this.aboutToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("aboutToolStripMenuItem.Image")));
this.aboutToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.aboutToolStripMenuItem.Text = "&About";
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItemClick);
//
// statusStrip1
//
this.statusStrip1.Dock = System.Windows.Forms.DockStyle.None;
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripStatusLabelFiller,
this.toolStripStatusLabelMousePosition});
this.statusStrip1.Location = new System.Drawing.Point(0, 751);
this.cashToolStripStatusLabel,
this.toolStripStatusLabelFiller,
this.toolStripStatusLabelMousePosition});
this.statusStrip1.Location = new System.Drawing.Point(0, 0);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(985, 22);
this.statusStrip1.TabIndex = 7;
@@ -497,32 +936,103 @@ namespace OpenRA.Editor
// toolStripStatusLabelFiller
//
this.toolStripStatusLabelFiller.Name = "toolStripStatusLabelFiller";
this.toolStripStatusLabelFiller.Size = new System.Drawing.Size(948, 17);
this.toolStripStatusLabelFiller.Size = new System.Drawing.Size(872, 17);
this.toolStripStatusLabelFiller.Spring = true;
//
// toolStripStatusLabelMousePosition
//
this.toolStripStatusLabelMousePosition.Image = ((System.Drawing.Image)(resources.GetObject("toolStripStatusLabelMousePosition.Image")));
this.toolStripStatusLabelMousePosition.Name = "toolStripStatusLabelMousePosition";
this.toolStripStatusLabelMousePosition.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
this.toolStripStatusLabelMousePosition.Size = new System.Drawing.Size(22, 17);
this.toolStripStatusLabelMousePosition.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.toolStripStatusLabelMousePosition.Size = new System.Drawing.Size(38, 17);
this.toolStripStatusLabelMousePosition.Text = "0,0";
//
// BottomToolStripPanel
//
this.BottomToolStripPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
this.BottomToolStripPanel.Location = new System.Drawing.Point(0, 25);
this.BottomToolStripPanel.Name = "BottomToolStripPanel";
this.BottomToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.BottomToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.BottomToolStripPanel.Size = new System.Drawing.Size(985, 0);
//
// TopToolStripPanel
//
this.TopToolStripPanel.Dock = System.Windows.Forms.DockStyle.Top;
this.TopToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.TopToolStripPanel.Name = "TopToolStripPanel";
this.TopToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.TopToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.TopToolStripPanel.Size = new System.Drawing.Size(985, 0);
//
// RightToolStripPanel
//
this.RightToolStripPanel.Dock = System.Windows.Forms.DockStyle.Right;
this.RightToolStripPanel.Location = new System.Drawing.Point(985, 0);
this.RightToolStripPanel.Name = "RightToolStripPanel";
this.RightToolStripPanel.Orientation = System.Windows.Forms.Orientation.Vertical;
this.RightToolStripPanel.RowMargin = new System.Windows.Forms.Padding(0, 3, 0, 0);
this.RightToolStripPanel.Size = new System.Drawing.Size(0, 25);
//
// LeftToolStripPanel
//
this.LeftToolStripPanel.Dock = System.Windows.Forms.DockStyle.Left;
this.LeftToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.LeftToolStripPanel.Name = "LeftToolStripPanel";
this.LeftToolStripPanel.Orientation = System.Windows.Forms.Orientation.Vertical;
this.LeftToolStripPanel.RowMargin = new System.Windows.Forms.Padding(0, 3, 0, 0);
this.LeftToolStripPanel.Size = new System.Drawing.Size(0, 25);
//
// ContentPanel
//
this.ContentPanel.Size = new System.Drawing.Size(985, 25);
//
// toolStripContainer1
//
//
// toolStripContainer1.BottomToolStripPanel
//
this.toolStripContainer1.BottomToolStripPanel.Controls.Add(this.statusStrip1);
//
// toolStripContainer1.ContentPanel
//
this.toolStripContainer1.ContentPanel.AutoScroll = true;
this.toolStripContainer1.ContentPanel.Controls.Add(this.splitContainer3);
this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(985, 724);
this.toolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.toolStripContainer1.Location = new System.Drawing.Point(0, 0);
this.toolStripContainer1.Name = "toolStripContainer1";
this.toolStripContainer1.Size = new System.Drawing.Size(985, 773);
this.toolStripContainer1.TabIndex = 8;
this.toolStripContainer1.Text = "toolStripContainer1";
//
// toolStripContainer1.TopToolStripPanel
//
this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.menuStrip1);
//
// cashToolStripStatusLabel
//
this.cashToolStripStatusLabel.Image = ((System.Drawing.Image)(resources.GetObject("cashToolStripStatusLabel.Image")));
this.cashToolStripStatusLabel.Name = "cashToolStripStatusLabel";
this.cashToolStripStatusLabel.Size = new System.Drawing.Size(29, 17);
this.cashToolStripStatusLabel.Text = "0";
this.cashToolStripStatusLabel.ToolTipText = "Net worth of the maps resources in cash";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(985, 773);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.splitContainer3);
this.Controls.Add(this.toolStripContainer1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.KeyPreview = true;
this.MainMenuStrip = this.menuStrip1;
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "OpenRA Editor";
this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnFormClosing);
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
this.splitContainer1.ResumeLayout(false);
@@ -539,14 +1049,29 @@ namespace OpenRA.Editor
this.splitContainer3.Panel1.PerformLayout();
this.splitContainer3.Panel2.ResumeLayout(false);
this.splitContainer3.ResumeLayout(false);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.toolStripContainer1.BottomToolStripPanel.ResumeLayout(false);
this.toolStripContainer1.BottomToolStripPanel.PerformLayout();
this.toolStripContainer1.ContentPanel.ResumeLayout(false);
this.toolStripContainer1.TopToolStripPanel.ResumeLayout(false);
this.toolStripContainer1.TopToolStripPanel.PerformLayout();
this.toolStripContainer1.ResumeLayout(false);
this.toolStripContainer1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.ToolStripStatusLabel cashToolStripStatusLabel;
private System.Windows.Forms.ToolStripButton panToolStripButton;
private System.Windows.Forms.ToolStripButton zoomOutToolStripButton;
private System.Windows.Forms.ToolStripButton zoomIntoolStripButton;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator12;
private System.Windows.Forms.ToolStripButton showRulerToolStripItem;
private System.Windows.Forms.ToolStripMenuItem showRulerToolStripMenuItem;
private System.Windows.Forms.ToolStripButton eraserToolStripButton;
#endregion
@@ -575,7 +1100,6 @@ namespace OpenRA.Editor
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem cCRedAlertMapToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem bitmapToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mnuExport;
private System.Windows.Forms.ToolStripMenuItem mnuMinimapToPNG;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
@@ -592,7 +1116,44 @@ namespace OpenRA.Editor
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.FlowLayoutPanel actorPalette;
private System.Windows.Forms.ComboBox actorOwnerChooser;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
private System.Windows.Forms.ToolStripMenuItem copySelectionToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem openRAWebsiteToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem issueTrackerToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem developerBountiesToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem discussionForumsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem wikiDocumentationToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem openRAResourcesToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
private System.Windows.Forms.ToolStripMenuItem sourceCodeToolStripMenuItem;
private System.Windows.Forms.ToolStripContainer toolStripContainer1;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
private System.Windows.Forms.ToolStripButton QuickhelpToolStripButton;
private System.Windows.Forms.ToolStripPanel BottomToolStripPanel;
private System.Windows.Forms.ToolStripPanel TopToolStripPanel;
private System.Windows.Forms.ToolStripPanel RightToolStripPanel;
private System.Windows.Forms.ToolStripPanel LeftToolStripPanel;
private System.Windows.Forms.ToolStripContentPanel ContentPanel;
private System.Windows.Forms.ToolStripButton toolStripMenuItemNew;
private System.Windows.Forms.ToolStripButton toolStripMenuItemOpen;
private System.Windows.Forms.ToolStripButton toolStripMenuItemSave;
private System.Windows.Forms.ToolStripButton toolStripMenuItemProperties;
private System.Windows.Forms.ToolStripButton toolStripMenuItemResize;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
private System.Windows.Forms.ToolStripButton toolStripMenuItemShowActorNames;
private System.Windows.Forms.ToolStripButton toolStripMenuItemShowGrid;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator10;
private System.Windows.Forms.ToolStripButton toolStripMenuItemFixOpenAreas;
private System.Windows.Forms.ToolStripButton toolStripMenuItemSetupDefaultPlayers;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator11;
private System.Windows.Forms.ToolStripButton toolStripMenuItemCopySelection;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator9;
private System.Windows.Forms.ToolStripMenuItem fullMapRenderToolStripMenuItem;
}
}

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -42,14 +42,17 @@ namespace OpenRA.Editor
tilePalette.ResumeLayout();
actorPalette.ResumeLayout();
resourcePalette.ResumeLayout();
surface1.Bind(null, null, null);
surface1.Bind(null, null, null, null);
pmMiniMap.Image = null;
currentMod = toolStripComboBox1.SelectedItem as string;
Text = "OpenRA Editor (mod:{0})".F(currentMod);
Game.modData = new ModData(currentMod);
FileSystem.LoadFromManifest(Game.modData.Manifest);
Rules.LoadRules(Game.modData.Manifest, new Map());
var mod = Game.modData.Manifest.Mods[0];
Text = "{0} Mod Version: {1} - OpenRA Editor".F(Mod.AllMods[mod].Title, Mod.AllMods[mod].Version);
loadedMapName = null;
};
@@ -67,6 +70,7 @@ namespace OpenRA.Editor
{
MakeDirty();
pmMiniMap.Image = Minimap.AddStaticResources(surface1.Map, Minimap.TerrainBitmap(surface1.Map, true));
cashToolStripStatusLabel.Text = CalculateTotalResource().ToString();
}
void ActorDoubleClicked(KeyValuePair<string,ActorReference> kv)
@@ -116,6 +120,8 @@ namespace OpenRA.Editor
map.MakeDefaultPlayers();
PrepareMapResources(Game.modData.Manifest, map);
//Calculate total net worth of resources in cash
cashToolStripStatusLabel.Text = CalculateTotalResource().ToString();
dirty = false;
}
@@ -138,14 +144,20 @@ namespace OpenRA.Editor
Rules.LoadRules(manifest, map);
tileset = Rules.TileSets[map.Tileset];
tileset.LoadTiles();
var palette = new Palette(FileSystem.Open(tileset.Palette), true);
int[] ShadowIndex = { 3, 4 };
var palette = new Palette(FileSystem.Open(tileset.Palette), ShadowIndex);
surface1.Bind(map, tileset, palette);
// required for desert terrain in RA
var playerPalette = tileset.PlayerPalette ?? tileset.Palette;
var PlayerPalette = new Palette(FileSystem.Open(playerPalette), ShadowIndex);
surface1.Bind(map, tileset, palette, PlayerPalette);
// construct the palette of tiles
var palettes = new[] { tilePalette, actorPalette, resourcePalette };
foreach (var p in palettes) { p.Visible = false; p.SuspendLayout(); }
foreach (var tc in tileset.Templates.GroupBy(t => t.Value.Category))
string[] 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)";
var categoryHeader = new Label
@@ -210,7 +222,13 @@ namespace OpenRA.Editor
if (etf != null && etf.RequireTilesets != null
&& !etf.RequireTilesets.Contains(tileset.Id)) continue;
var template = RenderUtils.RenderActor(info, tileset, palette);
var TemplatePalette = PlayerPalette;
var rsi = info.Traits.GetOrDefault<RenderSimpleInfo>();
// exception for desert buildings
if (rsi != null && rsi.Palette != null && rsi.Palette.Contains("terrain"))
TemplatePalette = palette;
var template = RenderUtils.RenderActor(info, tileset, TemplatePalette);
var ibox = new PictureBox
{
Image = template.Bitmap,
@@ -241,7 +259,7 @@ namespace OpenRA.Editor
{
try
{
var template = RenderUtils.RenderResourceType(a, tileset.Extensions, palette);
var template = RenderUtils.RenderResourceType(a, tileset.Extensions, PlayerPalette);
var ibox = new PictureBox
{
Image = template.Bitmap,
@@ -278,10 +296,13 @@ namespace OpenRA.Editor
pmMiniMap.Image = Minimap.AddStaticResources(surface1.Map, Minimap.TerrainBitmap(surface1.Map, true));
propertiesToolStripMenuItem.Enabled = true;
toolStripMenuItemProperties.Enabled = true;
resizeToolStripMenuItem.Enabled = true;
toolStripMenuItemResize.Enabled = true;
saveToolStripMenuItem.Enabled = true;
toolStripMenuItemSave.Enabled = true;
saveAsToolStripMenuItem.Enabled = true;
mnuMinimapToPNG.Enabled = true; // todo: what is this VB naming bullshit doing here?
mnuMinimapToPNG.Enabled = true; // TODO: what is this VB naming bullshit doing here?
PopulateActorOwnerChooser();
}
@@ -316,7 +337,7 @@ namespace OpenRA.Editor
if ((int)rd.width.Value != surface1.Map.MapSize.X || (int)rd.height.Value != surface1.Map.MapSize.Y)
{
surface1.Map.Resize((int)rd.width.Value, (int)rd.height.Value);
surface1.Bind(surface1.Map, surface1.TileSet, surface1.Palette); // rebind it to invalidate all caches
surface1.Bind(surface1.Map, surface1.TileSet, surface1.Palette, surface1.PlayerPalette); // rebind it to invalidate all caches
}
surface1.Invalidate();
@@ -385,6 +406,7 @@ namespace OpenRA.Editor
map.ResizeCordon((int)nmd.cordonLeft.Value, (int)nmd.cordonTop.Value,
(int)nmd.cordonRight.Value, (int)nmd.cordonBottom.Value);
map.Players.Clear();
map.MakeDefaultPlayers();
NewMap(map);
@@ -481,12 +503,14 @@ namespace OpenRA.Editor
void ShowActorNamesClicked(object sender, EventArgs e)
{
showActorNamesToolStripMenuItem.Checked ^= true;
toolStripMenuItemShowActorNames.Checked ^= true;
surface1.ShowActorNames = showActorNamesToolStripMenuItem.Checked;
}
void ShowGridClicked(object sender, EventArgs e)
{
showGridToolStripMenuItem.Checked ^= true;
toolStripMenuItemShowGrid.Checked ^= true;
surface1.ShowGrid = showGridToolStripMenuItem.Checked;
surface1.Chunks.Clear();
}
@@ -514,6 +538,7 @@ namespace OpenRA.Editor
void SetupDefaultPlayers(object sender, EventArgs e)
{
dirty = true;
surface1.Map.Players.Clear();
surface1.Map.MakeDefaultPlayers();
surface1.Chunks.Clear();
@@ -545,5 +570,191 @@ namespace OpenRA.Editor
var player = actorOwnerChooser.SelectedItem as PlayerReference;
surface1.NewActorOwner = player.Name;
}
private void copySelectionToolStripMenuItemClick(object sender, EventArgs e)
{
surface1.CopySelection();
}
private void openRAWebsiteToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://www.open-ra.org");
}
private void openRAResourcesToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://content.open-ra.org");
}
private void wikiDocumentationToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA/wiki");
}
private void discussionForumsToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://www.sleipnirstuff.com/forum/viewforum.php?f=80");
}
private void issueTrackerToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA/issues");
}
private void developerBountiesToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.bountysource.com/#repos/OpenRA/OpenRA");
}
private void sourceCodeToolStripMenuItemClick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA");
}
private void aboutToolStripMenuItemClick(object sender, EventArgs e)
{
MessageBox.Show("OpenRA and OpenRA Editor are Free/Libre Open Source Software released under the GNU General Public License version 3. See AUTHORS and COPYING for details.",
"About",
MessageBoxButtons.OK,
MessageBoxIcon.Asterisk);
}
private void helpToolStripButton_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://github.com/OpenRA/OpenRA/wiki/Mapping");
}
private void toolStripMenuItemNewClick(object sender, EventArgs e)
{
NewClicked(sender, e);
}
private void toolStripMenuItemOpenClick(object sender, EventArgs e)
{
OpenClicked(sender, e);
}
private void toolStripMenuItemSaveClick(object sender, EventArgs e)
{
SaveClicked(sender, e);
}
private void toolStripMenuItemPropertiesClick(object sender, EventArgs e)
{
PropertiesClicked(sender, e);
}
private void toolStripMenuItemResizeClick(object sender, EventArgs e)
{
ResizeClicked(sender, e);
}
private void toolStripMenuItemShowActorNamesClick(object sender, EventArgs e)
{
ShowActorNamesClicked(sender, e);
}
private void toolStripMenuItemFixOpenAreasClick(object sender, EventArgs e)
{
FixOpenAreas(sender, e);
}
private void toolStripMenuItemSetupDefaultPlayersClick(object sender, EventArgs e)
{
SetupDefaultPlayers(sender, e);
}
private void toolStripMenuItemCopySelectionClick(object sender, EventArgs e)
{
copySelectionToolStripMenuItemClick(sender, e);
}
private void toolStripMenuItemShowGridClick(object sender, EventArgs e)
{
ShowGridClicked(sender, e);
}
public int CalculateTotalResource()
{
int TotalResource = 0;
for(int i = 0; i < surface1.Map.MapSize.X; i++)
for (int j = 0; j < surface1.Map.MapSize.Y; j++)
{
if (surface1.Map.MapResources.Value[i, j].type != 0)
TotalResource += GetResourceValue(i, j);
}
return TotalResource;
}
int GetAdjecentCellsWith(int ResourceType, int x, int y)
{
int sum = 0;
for (var u = -1; u < 2; u++)
for (var v = -1; v < 2; v++)
{
if (!surface1.Map.IsInMap(new CPos(x + u, y + v)))
continue;
if (surface1.Map.MapResources.Value[x + u, y + v].type == ResourceType)
++sum;
}
return sum;
}
int GetResourceValue(int x, int y)
{
int ImageLength = 0;
int type = surface1.Map.MapResources.Value[x, y].type;
var template = surface1.ResourceTemplates.Where(a => a.Value.Info.ResourceType == type).FirstOrDefault().Value;
if (type == 1)
ImageLength = 12;
else if (type == 2)
ImageLength = 3;
int density = (GetAdjecentCellsWith(type ,x , y) * ImageLength - 1) / 9;
int value = template.Info.ValuePerUnit;
return (density) * value;
}
void zoomInToolStripButtonClick(object sender, System.EventArgs e)
{
if (surface1.Map == null) return;
surface1.Zoom /= .75f;
surface1.Invalidate();
}
void zoomOutToolStripButtonClick(object sender, System.EventArgs e)
{
if (surface1.Map == null) return;
surface1.Zoom *= .75f;
surface1.Invalidate();
}
void panToolStripButtonClick(object sender, System.EventArgs e)
{
panToolStripButton.Checked ^= true;
surface1.IsPanning = panToolStripButton.Checked;
}
void showRulerToolStripMenuItemClick(object sender, EventArgs e)
{
showRulerToolStripMenuItem.Checked ^= true;
showRulerToolStripItem.Checked ^= true;
surface1.ShowRuler = showRulerToolStripMenuItem.Checked;
surface1.Chunks.Clear();
}
void showRulerToolStripItemClick(object sender, System.EventArgs e)
{
showRulerToolStripMenuItemClick(sender, e);
}
void EraserToolStripButtonClick(object sender, System.EventArgs e)
{
eraserToolStripButton.Checked ^= true;
surface1.IsErasing = eraserToolStripButton.Checked;
}
}
}

View File

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

View File

@@ -82,7 +82,7 @@ namespace OpenRA.Editor
// {"scrate","crate"},
};
// todo: fix this -- will have bitrotted pretty badly.
// TODO: fix this -- will have bitrotted pretty badly.
static Dictionary<string,Pair<Color,Color>> namedColorMapping = new Dictionary<string, Pair<Color, Color>>()
{
{"gold",Pair.New(Color.FromArgb(246,214,121),Color.FromArgb(40,32,8))},
@@ -174,10 +174,10 @@ namespace OpenRA.Editor
// Add waypoint actors
foreach( var kv in wps )
{
var a = new ActorReference("mpspawn");
var a = new ActorReference("waypoint");
a.Add(new LocationInit((CPos)kv.Second));
a.Add(new OwnerInit("Neutral"));
Map.Actors.Value.Add("spawn" + kv.First, a);
Map.Actors.Value.Add("waypoint" + kv.First, a);
}
}
@@ -414,8 +414,51 @@ namespace OpenRA.Editor
void LoadPlayer(IniFile file, string section, bool isRA)
{
var c = section == "BadGuy" ? "red" :
isRA ? "blue" : "gold";
string c;
string race;
switch (section)
{
case "Spain":
c = "gold";
race = "allies";
break;
case "England":
c = "green";
race = "allies";
break;
case "Ukraine":
c = "orange";
race = "soviet";
break;
case "Germany":
c = "black";
race = "allies";
break;
case "France":
c = "teal";
race = "allies";
break;
case "Turkey":
c = "salmon";
race = "allies";
break;
case "Greece":
case "GoodGuy":
c = isRA? "blue" : "gold";
race = isRA ? "allies" : "gdi";
break;
case "USSR":
case "BadGuy":
c = "red";
race = isRA ? "soviet" : "nod";
break;
case "Special":
case "Neutral":
default:
c = "neutral";
race = isRA ? "allies" : "gdi";
break;
}
var color = namedColorMapping[c];
@@ -424,7 +467,7 @@ namespace OpenRA.Editor
Name = section,
OwnsWorld = section == "Neutral",
NonCombatant = section == "Neutral",
Race = isRA ? (section == "BadGuy" ? "soviet" : "allies") : (section == "BadGuy" ? "nod" : "gdi"),
Race = race,
ColorRamp = new ColorRamp(
(byte)((color.First.GetHue() / 360.0f) * 255),
(byte)(color.First.GetSaturation() * 255),

View File

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

View File

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

View File

@@ -119,6 +119,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="ActorPropertiesDialog.resx">
<DependentUpon>ActorPropertiesDialog.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>

View File

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

View File

@@ -14,59 +14,41 @@ namespace OpenRA.FileFormats
{
public struct ColorRamp
{
public byte H,S,L,R;
public readonly HSLColor Color;
public byte Ramp;
public ColorRamp(HSLColor color, byte ramp)
{
Color = color;
Ramp = ramp;
}
public ColorRamp(byte h, byte s, byte l, byte r)
{
H = h; S = s; L = l; R = r;
Color = new HSLColor(h, s, l);
Ramp = r;
}
/* returns a color along the Lum ramp */
public Color GetColor( float t )
public Color GetColor(float t)
{
return ColorFromHSL( H / 255f, S / 255f, float2.Lerp( L / 255f, L*R / (255f * 255f), t ) );
var l = float2.Lerp(Color.L, Color.L*Ramp/255f, t);
return HSLColor.RGBFromHSL(Color.H/255f, Color.S/255f, l/255f);
}
public override string ToString()
{
return "{0},{1},{2},{3}".F(H, S, L, R);
}
// hk is hue in the range [0,1] instead of [0,360]
static Color ColorFromHSL(float hk, 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[] rgb = { 0, 0, 0 };
for (int k = 0; k < 3; k++)
{
while (trgb[k] < 0) trgb[k] += 1.0f;
while (trgb[k] > 1) trgb[k] -= 1.0f;
}
for (int k = 0; k < 3; k++)
{
if (trgb[k] < 1 / 6.0f) { rgb[k] = (p + ((q - p) * 6 * trgb[k])); }
else if (trgb[k] >= 1 / 6.0f && trgb[k] < 0.5) { rgb[k] = q; }
else if (trgb[k] >= 0.5f && trgb[k] < 2.0f / 3) { rgb[k] = (p + ((q - p) * 6 * (2.0f / 3 - trgb[k]))); }
else { rgb[k] = p; }
}
return Color.FromArgb((int)(rgb[0] * 255), (int)(rgb[1] * 255), (int)(rgb[2] * 255));
return "{0},{1}".F(Color.ToString(), Ramp);
}
public static bool operator ==(ColorRamp me, ColorRamp other)
{
return (me.H == other.H && me.S == other.S && me.L == other.L && me.R == other.R );
return (me.Color == other.Color && me.Ramp == other.Ramp);
}
public static bool operator !=(ColorRamp me, ColorRamp other) { return !(me == other); }
public override int GetHashCode() { return H.GetHashCode() ^ S.GetHashCode() ^ L.GetHashCode() ^ R.GetHashCode(); }
public override int GetHashCode() { return Color.GetHashCode() ^ Ramp.GetHashCode(); }
public override bool Equals(object obj)
{

View File

@@ -184,6 +184,58 @@ namespace OpenRA
return ts.Concat(moreTs);
}
public static Dictionary<TKey, TSource> ToDictionaryWithConflictLog<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, string debugName, Func<TKey, string> logKey, Func<TSource, string> logValue)
{
return ToDictionaryWithConflictLog(source, keySelector, x => x, debugName, logKey, logValue);
}
public static Dictionary<TKey, TElement> ToDictionaryWithConflictLog<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, string debugName, Func<TKey, string> logKey, Func<TElement, string> logValue)
{
// Fall back on ToString() if null functions are provided:
logKey = logKey ?? (s => s.ToString());
logValue = logValue ?? (s => s.ToString());
// Try to build a dictionary and log all duplicates found (if any):
var dupKeys = new Dictionary<TKey, List<string>>();
var d = new Dictionary<TKey, TElement>();
foreach (var item in source)
{
TKey key = keySelector(item);
TElement element = elementSelector(item);
// Check for a key conflict:
if (d.ContainsKey(key))
{
List<string> dupKeyMessages;
if (!dupKeys.TryGetValue(key, out dupKeyMessages))
{
// Log the initial conflicting value already inserted:
dupKeyMessages = new List<string>();
dupKeyMessages.Add(logValue(d[key]));
dupKeys.Add(key, dupKeyMessages);
}
// Log this conflicting value:
dupKeyMessages.Add(logValue(element));
continue;
}
d.Add(key, element);
}
// If any duplicates were found, log it and throw a descriptive error
if (dupKeys.Count > 0)
{
string badKeysFormatted = String.Join(", ", dupKeys.Select(p => "{0}: [{1}]".F(logKey(p.Key), String.Join(",", p.Value.ToArray()))).ToArray());
string msg = "{0}, duplicate values found for the following keys: {1}".F(debugName, badKeysFormatted);
Log.Write("debug", msg);
throw new ArgumentException(msg);
}
// Return the dictionary we built:
return d;
}
public static Color ColorLerp(float t, Color c1, Color c2)
{
return Color.FromArgb(

View File

@@ -161,6 +161,61 @@ namespace OpenRA.FileFormats
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(WRange))
{
WRange res;
if (WRange.TryParse(x, out res))
return res;
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(WVec))
{
var parts = x.Split(',');
if (parts.Length == 3)
{
WRange rx, ry, rz;
if (WRange.TryParse(parts[0], out rx) && WRange.TryParse(parts[1], out ry) && WRange.TryParse(parts[2], out rz))
return new WVec(rx, ry, rz);
}
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(WPos))
{
var parts = x.Split(',');
if (parts.Length == 3)
{
WRange rx, ry, rz;
if (WRange.TryParse(parts[0], out rx) && WRange.TryParse(parts[1], out ry) && WRange.TryParse(parts[2], out rz))
return new WPos(rx, ry, rz);
}
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(WAngle))
{
int res;
if (int.TryParse(x, out res))
return new WAngle(res);
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType == typeof(WRot))
{
var parts = x.Split(',');
if (parts.Length == 3)
{
int rr, rp, ry;
if (int.TryParse(x, out rr) && int.TryParse(x, out rp) && int.TryParse(x, out ry))
return new WRot(new WAngle(rr), new WAngle(rp), new WAngle(ry));
}
return InvalidValueAction(x, fieldType, field);
}
else if (fieldType.IsEnum)
{
if (!Enum.GetNames(fieldType).Select(a => a.ToLower()).Contains(x.ToLower()))
@@ -351,4 +406,11 @@ namespace OpenRA.FileFormats
}
public class FieldFromYamlKeyAttribute : Attribute { }
// mirrors DescriptionAttribute from System.ComponentModel but we dont want to have to use that everywhere.
public class DescAttribute : Attribute
{
public readonly string[] Lines;
public DescAttribute(params string[] lines) { Lines = lines; }
}
}

View File

@@ -56,9 +56,11 @@ namespace OpenRA.FileFormats
if (isRmix)
{
isEncrypted = 0 != (signature & (uint)MixFileFlags.Encrypted);
if( isEncrypted )
if (isEncrypted)
{
index = ParseRaHeader( s, out dataStart ).ToDictionary(x => x.Hash);
index = ParseRaHeader(s, out dataStart).ToDictionaryWithConflictLog(x => x.Hash,
"MixFile.RaHeader of {0}".F(filename), null, x => "(offs={0}, len={1})".F(x.Offset, x.Length)
);
return;
}
}
@@ -66,7 +68,9 @@ namespace OpenRA.FileFormats
s.Seek( 0, SeekOrigin.Begin );
isEncrypted = false;
index = ParseTdHeader(s, out dataStart).ToDictionary(x => x.Hash);
index = ParseTdHeader(s, out dataStart).ToDictionaryWithConflictLog(x => x.Hash,
"MixFile.TdHeader of {0}".F(filename), null, x => "(offs={0}, len={1})".F(x.Offset, x.Length)
);
}
const long headerStart = 84;

View File

@@ -40,7 +40,6 @@ namespace OpenRA.FileFormats.Graphics
IShader CreateShader( string name );
Size WindowSize { get; }
int GpuMemoryUsed { get; }
void Clear();
void Present();
@@ -61,9 +60,9 @@ 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, float y);
void SetTexture(string param, ITexture texture);
void Render(Action a);
}
public interface ITexture

View File

@@ -0,0 +1,99 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System.Drawing;
namespace OpenRA.FileFormats
{
public struct HSLColor
{
public readonly byte H;
public readonly byte S;
public readonly byte L;
public HSLColor(byte h, byte s, byte l)
{
H = h;
S = s;
L = l;
}
public Color ToColor()
{
return RGBFromHSL(H / 255f, S / 255f, L / 255f);
}
public void ToHSV(out float h, out float s, out float v)
{
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 static HSLColor FromHSV(float h, float s, float v)
{
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));
}
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 = { h + 1 / 3.0f, h, h - 1/3.0f };
float[] rgb = { 0, 0, 0 };
for (int k = 0; k < 3; k++)
{
while (trgb[k] < 0) trgb[k] += 1.0f;
while (trgb[k] > 1) trgb[k] -= 1.0f;
}
for (int k = 0; k < 3; k++)
{
if (trgb[k] < 1 / 6.0f) { rgb[k] = (p + ((q - p) * 6 * trgb[k])); }
else if (trgb[k] >= 1 / 6.0f && trgb[k] < 0.5) { rgb[k] = q; }
else if (trgb[k] >= 0.5f && trgb[k] < 2.0f / 3) { rgb[k] = (p + ((q - p) * 6 * (2.0f / 3 - trgb[k]))); }
else { rgb[k] = p; }
}
return Color.FromArgb((int)(rgb[0] * 255), (int)(rgb[1] * 255), (int)(rgb[2] * 255));
}
public override string ToString()
{
return "{0},{1},{2}".F(H, S, L);
}
public static bool operator ==(HSLColor me, HSLColor other)
{
return (me.H == other.H && me.S == other.S && me.L == other.L);
}
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;
HSLColor o = (HSLColor)obj;
return o == this;
}
}
}

View File

@@ -20,7 +20,7 @@ namespace OpenRA.FileFormats
public readonly string[]
Mods, Folders, Packages, Rules, ServerTraits,
Sequences, Cursors, Chrome, Assemblies, ChromeLayout,
Weapons, Voices, Music, Movies, TileSets, ChromeMetrics;
Weapons, Voices, Notifications, Music, Movies, TileSets, ChromeMetrics;
public readonly MiniYaml LoadScreen;
public readonly Dictionary<string, Pair<string,int>> Fonts;
public readonly int TileSize = 24;
@@ -32,7 +32,7 @@ namespace OpenRA.FileFormats
.Select(m => MiniYaml.FromFile("mods/" + m + "/mod.yaml"))
.Aggregate(MiniYaml.MergeLiberal)).NodesDict;
// Todo: Use fieldloader
// TODO: Use fieldloader
Folders = YamlList(yaml, "Folders");
Packages = YamlList(yaml, "Packages");
Rules = YamlList(yaml, "Rules");
@@ -44,6 +44,7 @@ namespace OpenRA.FileFormats
ChromeLayout = YamlList(yaml, "ChromeLayout");
Weapons = YamlList(yaml, "Weapons");
Voices = YamlList(yaml, "Voices");
Notifications = YamlList(yaml, "Notifications");
Music = YamlList(yaml, "Music");
Movies = YamlList(yaml, "Movies");
TileSets = YamlList(yaml, "TileSets");

View File

@@ -23,6 +23,7 @@ namespace OpenRA.FileFormats
public string Bot = null;
public bool DefaultStartingUnits = false;
public bool AllowBots = true;
public bool Required = false;
public bool LockRace = false;
public string Race;

View File

@@ -23,6 +23,7 @@ namespace OpenRA.FileFormats
public string[] AcceptsSmudgeType = { };
public bool IsWater = false;
public Color Color;
public string CustomCursor;
public TerrainTypeInfo() {}
public TerrainTypeInfo(MiniYaml my) { FieldLoader.Load(this, my); }
@@ -77,10 +78,13 @@ namespace OpenRA.FileFormats
public string Name;
public string Id;
public string Palette;
public string PlayerPalette;
public int TileSize = 24;
public string[] Extensions;
public int WaterPaletteRotationBase = 0x60;
public Dictionary<string, TerrainTypeInfo> Terrain = new Dictionary<string, TerrainTypeInfo>();
public Dictionary<ushort, TileTemplate> Templates = new Dictionary<ushort, TileTemplate>();
public string[] EditorTemplateOrder;
static readonly string[] fields = {"Name", "TileSize", "Id", "Palette", "Extensions"};

View File

@@ -200,8 +200,8 @@ namespace OpenRA.FileFormats
var ret = new List<MiniYamlNode>();
var aDict = a.ToDictionary( x => x.Key );
var bDict = b.ToDictionary( x => x.Key );
var aDict = a.ToDictionaryWithConflictLog(x => x.Key, "MiniYaml.Merge", null, x => "{0} (at {1})".F(x.Key, x.Location));
var bDict = b.ToDictionaryWithConflictLog(x => x.Key, "MiniYaml.Merge", null, x => "{0} (at {1})".F(x.Key, x.Location));
var keys = aDict.Keys.Union( bDict.Keys ).ToList();
var noInherit = keys.Where(x => x.Length > 0 && x[0] == '-')

View File

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

View File

@@ -19,12 +19,6 @@ namespace OpenRA.FileFormats
{
Dictionary<int, Color> remapColors;
static int[] GetRemapRamp(int[] Ramp)
{
var RemapRamp = Ramp.Select(r => r - Ramp[0]).ToArray();
return RemapRamp;
}
public static int GetRemapIndex(int[] Ramp, int i)
{
return Ramp[i];
@@ -33,11 +27,18 @@ namespace OpenRA.FileFormats
public PlayerColorRemap(int[] Ramp, ColorRamp c)
{
var c1 = c.GetColor(0);
var c2 = c.GetColor(1); /* temptemp: this can be expressed better */
var c2 = c.GetColor(1); // temptemp: this can be expressed better
var baseIndex = Ramp[0];
var RemapRamp = GetRemapRamp(Ramp);
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--)
RemapRamp = Ramp.Select(r => r - Ramp[15]).ToArray();
}
remapColors = RemapRamp.Select((x, i) => Pair.New(baseIndex + i, Exts.ColorLerp(x / 16f, c1, c2)))
.ToDictionary(u => u.First, u => u.Second);
}

View File

@@ -101,4 +101,18 @@ namespace OpenRA
public float LengthSquared { get { return X * X + Y * Y; } }
public float Length { get { return (float)Math.Sqrt(LengthSquared); } }
}
public class EWMA
{
readonly float animRate;
float? value;
public EWMA(float animRate) { this.animRate = animRate; }
public float Update(float newValue)
{
value = float2.Lerp(value ?? newValue, newValue, animRate);
return value.Value;
}
}
}

View File

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

View File

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

View File

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

View File

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

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

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

View File

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

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA
@@ -27,6 +28,8 @@ namespace OpenRA
Lazy<IOccupySpace> occupySpace;
IHasLocation HasLocation;
Lazy<IMove> Move;
Lazy<IFacing> Facing;
public Cached<Rectangle> Bounds;
public Cached<Rectangle> ExtendedBounds;
@@ -44,8 +47,28 @@ namespace OpenRA
}
}
[Sync]
public Player Owner;
public WPos CenterPosition
{
get
{
var altitude = Move.Value != null ? Move.Value.Altitude : 0;
return CenterLocation.ToWPos(altitude);
}
}
public WRot Orientation
{
get
{
// TODO: Support non-zero pitch/roll in IFacing (IOrientation?)
var facing = Facing.Value != null ? Facing.Value.Facing : 0;
return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing));
}
}
public Shroud.ActorVisibility Sight;
[Sync] public Player Owner;
Activity currentActivity;
public Group Group;
@@ -71,7 +94,8 @@ namespace OpenRA
AddTrait(trait.Create(init));
}
Move = Lazy.New( () => TraitOrDefault<IMove>() );
Move = Lazy.New(() => TraitOrDefault<IMove>());
Facing = Lazy.New(() => TraitOrDefault<IFacing>());
Size = Lazy.New(() =>
{
@@ -79,17 +103,23 @@ namespace OpenRA
if (si != null && si.Bounds != null)
return new int2(si.Bounds[0], si.Bounds[1]);
// auto size from render
var firstSprite = TraitsImplementing<IRender>().SelectMany(ApplyIRender).FirstOrDefault();
if (firstSprite.Sprite == null) return int2.Zero;
return (firstSprite.Sprite.size * firstSprite.Scale).ToInt2();
return TraitsImplementing<IAutoSelectionSize>().Select(x => x.SelectionSize(this)).FirstOrDefault();
});
ApplyIRender = x => x.Render(this);
ApplyRenderModifier = (m, p) => p.ModifyRender(this, m);
if (this.HasTrait<RevealsShroud>())
{
Sight = new Shroud.ActorVisibility
{
range = this.Trait<RevealsShroud>().RevealRange,
vis = Shroud.GetVisOrigins(this).ToArray()
};
}
Bounds = Cached.New( () => CalculateBounds(false) );
ExtendedBounds = Cached.New( () => CalculateBounds(true) );
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));
}
public void Tick()
@@ -97,7 +127,12 @@ namespace OpenRA
Bounds.Invalidate();
ExtendedBounds.Invalidate();
currentActivity = Util.RunActivity( this, currentActivity );
currentActivity = Traits.Util.RunActivity( this, currentActivity );
}
public void UpdateSight()
{
Sight.vis = Shroud.GetVisOrigins(this).ToArray();
}
public bool IsIdle
@@ -108,13 +143,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<Renderable>> ApplyIRender;
Func<IEnumerable<Renderable>, IRenderModifier, WorldRenderer, IEnumerable<Renderable>> ApplyRenderModifier;
public IEnumerable<Renderable> 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
@@ -129,22 +164,14 @@ 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)
{
#if true
loc -= new PVecInt(0, move.Altitude);
#else
loc.Y -= move.Altitude;
#endif
if (useAltitude)
size = new PVecInt(size.X, size.Y + move.Altitude);
}
@@ -235,15 +262,20 @@ 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;
w.Add(this);
foreach (var t in this.TraitsImplementing<INotifyOwnerChanged>())
t.OnOwnerChanged(this, oldOwner, newOwner);
});
}
}

View File

@@ -21,6 +21,7 @@ namespace OpenRA
public readonly int X, Y;
public CPos(int x, int y) { X = x; Y = y; }
public CPos(WPos a) { X = a.X / 1024; Y = a.Y / 1024; }
public static readonly CPos Zero = new CPos(0, 0);

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<Renderable> Render(WorldRenderer wr) { yield break; }
}
}

View File

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

View File

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

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

@@ -29,6 +29,8 @@ namespace OpenRA
{
public static int CellSize { get { return modData.Manifest.TileSize; } }
public static MouseButtonPreference mouseButtonPreference = new MouseButtonPreference();
public static ModData modData;
static WorldRenderer worldRenderer;
@@ -56,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)
@@ -166,20 +168,20 @@ namespace OpenRA
{
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();
@@ -188,7 +190,8 @@ namespace OpenRA
else
if (orderManager.NetFrameNumber == 0)
orderManager.LastTickTime = Environment.TickCount;
world.TickRender(worldRenderer);
viewport.Tick();
}
}
@@ -208,7 +211,7 @@ 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;
@@ -218,11 +221,14 @@ namespace OpenRA
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 (
orderManager.Connection.LocalClientId);
@@ -251,6 +257,15 @@ namespace OpenRA
Log.AddChannel("perf", "perf.log");
Log.AddChannel("debug", "debug.log");
Log.AddChannel("sync", "syncreport.log");
Log.AddChannel("server", "server.log");
if (Settings.Server.DiscoverNatDevices)
UPnP.TryNatDiscovery();
else
{
Settings.Server.NatDeviceAvailable = false;
Settings.Server.AllowPortForward = false;
}
FileSystem.Mount("."); // Needed to access shaders
Renderer.Initialize( Game.Settings.Graphics.Mode );
@@ -262,6 +277,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,7 +313,7 @@ namespace OpenRA
modData = new ModData( mm );
Renderer.InitializeFonts(modData.Manifest);
modData.LoadInitialAssets();
modData.LoadInitialAssets(true);
PerfHistory.items["render"].hasNormalTick = false;
@@ -302,8 +324,40 @@ namespace OpenRA
JoinLocal();
viewport = new Viewport(new int2(Renderer.Resolution), Rectangle.Empty, Renderer);
modData.LoadScreen.StartGame();
Settings.Save();
if (Game.Settings.Server.Dedicated)
{
while (true)
{
Game.Settings.Server.Map = WidgetUtils.ChooseInitialMap(Game.Settings.Server.Map);
Game.Settings.Save();
Game.CreateServer(new ServerSettings(Game.Settings.Server));
while(true)
{
System.Threading.Thread.Sleep(100);
if((server.State == Server.ServerState.GameStarted)
&& (server.conns.Count<=1))
{
Console.WriteLine("No one is playing, shutting down...");
server.Shutdown();
break;
}
}
if (Game.Settings.Server.DedicatedLoop)
{
Console.WriteLine("Starting a new server instance...");
continue;
}
else
break;
}
System.Environment.Exit(0);
}
else
{
modData.LoadScreen.StartGame();
Settings.Save();
}
}
public static void LoadShellMap()
@@ -378,7 +432,7 @@ namespace OpenRA
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)
@@ -392,10 +446,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;
}
@@ -421,5 +475,29 @@ namespace OpenRA
Game.JoinServer(host, port);
}
public static bool DownloadMap(string mapHash)
{
try
{
var mod = Game.CurrentMods.FirstOrDefault().Value.Id;
var dirPath = "{1}maps{0}{2}".F(Path.DirectorySeparatorChar, Platform.SupportDir, mod);
if(!Directory.Exists(dirPath))
Directory.CreateDirectory(dirPath);
var mapPath = "{1}{0}{2}".F(Path.DirectorySeparatorChar, dirPath, mapHash+".oramap");
Console.Write("Trying to download map to {0} ... ".F(mapPath));
WebClient webClient = new WebClient();
webClient.DownloadFile(Game.Settings.Game.MapRepository + mapHash, mapPath);
Game.modData.AvailableMaps.Add(mapHash, new Map(mapPath));
Console.WriteLine("done");
return true;
}
catch (WebException e)
{
Log.Write("debug", "Could not download map '{0}'", mapHash);
Log.Write("debug", e.ToString());
return false;
}
}
}
}

View File

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

View File

@@ -20,7 +20,8 @@ namespace OpenRA
{
public static Dictionary<string, ActorInfo> Info;
public static Dictionary<string, WeaponInfo> Weapons;
public static Dictionary<string, VoiceInfo> Voices;
public static Dictionary<string, SoundInfo> Voices;
public static Dictionary<string, SoundInfo> Notifications;
public static Dictionary<string, MusicInfo> Music;
public static Dictionary<string, string> Movies;
public static Dictionary<string, TileSet> TileSets;
@@ -30,7 +31,8 @@ namespace OpenRA
// Added support to extend the list of rules (add it to m.LocalRules)
Info = LoadYamlRules(m.Rules, map.Rules, (k, y) => new ActorInfo(k.Key.ToLowerInvariant(), k.Value, y));
Weapons = LoadYamlRules(m.Weapons, map.Weapons, (k, _) => new WeaponInfo(k.Key.ToLowerInvariant(), k.Value));
Voices = LoadYamlRules(m.Voices, map.Voices, (k, _) => new VoiceInfo(k.Value));
Voices = LoadYamlRules(m.Voices, map.Voices, (k, _) => new SoundInfo(k.Value));
Notifications = LoadYamlRules(m.Notifications, map.Notifications, (k, _) => new SoundInfo(k.Value));
Music = LoadYamlRules(m.Music, new List<MiniYamlNode>(), (k, _) => new MusicInfo(k.Key, k.Value));
Movies = LoadYamlRules(m.Movies, new List<MiniYamlNode>(), (k, v) => k.Value.Value);

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,
@@ -29,11 +29,19 @@ namespace OpenRA.GameRules
public int ExternalPort = 1234;
public bool AdvertiseOnline = true;
public string MasterServer = "http://master.open-ra.org/";
public bool AllowUPnP = true;
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 int TimeOut = 0;
public bool Dedicated = false;
public bool DedicatedLoop = true;
public bool LockBots = false;
public bool AllowVersionMismatch = false;
public ServerSettings() { }
@@ -44,11 +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;
}
}
@@ -60,6 +76,7 @@ namespace OpenRA.GameRules
public float LongTickThreshold = 0.001f;
public bool SanityCheckUnsyncedCode = false;
public int Samples = 25;
public bool IgnoreVersionMismatch = false;
}
public class GraphicSettings
@@ -84,7 +101,7 @@ namespace OpenRA.GameRules
public float VideoVolume = 0.5f;
public bool Shuffle = false;
public bool Repeat = false;
public bool ShellmapMusic = true;
public bool MapMusic = true;
public string Engine = "AL";
public SoundCashTicks SoundCashTickType = SoundCashTicks.Extreme;
@@ -108,12 +125,37 @@ namespace OpenRA.GameRules
public MouseScrollType MouseScroll = MouseScrollType.Standard;
public float ViewportEdgeScrollStep = 10f;
public bool UseClassicMouseStyle = false;
// Internal game settings
public int Timestep = 40;
public string ConnectTo = "";
public bool AllowDownloading = true;
public string MapRepository = "http://content.open-ra.org/map/";
}
public class KeySettings
{
public string CycleBaseKey = "backspace";
public string ToLastEventKey = "space";
public string ToSelectionKey = "home";
public string PauseKey = "f9";
public string SellKey = "f10";
public string PowerDownKey = "f11";
public string RepairKey = "f12";
public string AttackMoveKey = "a";
public string StopKey = "s";
public string ScatterKey = "x";
public string DeployKey = "f";
public string StanceCycleKey = "z";
public string CycleTabsKey = "tab";
}
public class Settings
{
string SettingsFile;
@@ -124,6 +166,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;
@@ -138,6 +181,7 @@ namespace OpenRA.GameRules
{"Graphics", Graphics},
{"Server", Server},
{"Debug", Debug},
{"Keys", Keys},
};
// Override fieldloader to ignore invalid entries

View File

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

View File

@@ -18,21 +18,35 @@ namespace OpenRA.GameRules
{
public class WarheadInfo
{
public readonly int Spread = 1; // distance (in pixels) from the explosion center at which damage is 1/2.
[Desc("Distance (in pixels) from the explosion center at which damage is 1/2.")]
public readonly int Spread = 1;
[FieldLoader.LoadUsing( "LoadVersus" )]
public readonly Dictionary<string, float> Versus; // damage vs each armortype
public readonly bool Ore = false; // can this damage ore?
public readonly string Explosion = null; // explosion effect to use
public readonly string WaterExplosion = null; // explosion effect on hitting water (usually a splash)
public readonly string[] SmudgeType = { }; // type of smudge to apply
public readonly int[] Size = { 0, 0 }; // size of the explosion. provide 2 values for a ring effect (outer/inner)
public readonly int InfDeath = 0; // infantry death animation to use
public readonly string ImpactSound = null; // sound to play on impact
public readonly string WaterImpactSound = null; // sound to play on impact with water
public readonly int Damage = 0; // how much (raw) damage to deal
public readonly int Delay = 0; // delay in ticks before dealing the damage. 0=instant (old model)
public readonly DamageModel DamageModel = DamageModel.Normal; // which damage model to use
public readonly bool PreventProne = false; // whether we should prevent prone response in infantry.
[Desc("Damage vs each armortype. 0% = can't target.")]
public readonly Dictionary<string, float> Versus;
[Desc("Can this damage ore?")]
public readonly bool Ore = false;
[Desc("Explosion effect to use.")]
public readonly string Explosion = null;
[Desc("Explosion effect on hitting water (usually a splash).")]
public readonly string WaterExplosion = null;
[Desc("Type of smudge to apply to terrain.")]
public readonly string[] SmudgeType = { };
[Desc("Size of the explosion. provide 2 values for a ring effect (outer/inner).")]
public readonly int[] Size = { 0, 0 };
[Desc("Infantry death animation to use")]
public readonly int InfDeath = 1;
[Desc("Sound to play on impact.")]
public readonly string ImpactSound = null;
[Desc("Sound to play on impact with water")]
public readonly string WaterImpactSound = null;
[Desc("How much (raw) damage to deal")]
public readonly int Damage = 0;
[Desc("Delay in ticks before dealing the damage, 0 = instant (old model).")]
public readonly int Delay = 0;
[Desc("Which damage model to use.")]
public readonly DamageModel DamageModel = DamageModel.Normal;
[Desc("Whether we should prevent prone response for infantry.")]
public readonly bool PreventProne = false;
public float EffectivenessAgainst(Actor self)
{
@@ -86,7 +100,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;

View File

@@ -16,7 +16,7 @@ namespace OpenRA.Graphics
public class AnimationWithOffset
{
public Animation Animation;
public Func<float2> OffsetFunc;
public Func<WorldRenderer, float2> OffsetFunc;
public Func<bool> DisableFunc;
public int ZOffset;
@@ -25,18 +25,18 @@ namespace OpenRA.Graphics
{
}
public AnimationWithOffset(Animation a, Func<float2> o, Func<bool> d)
public AnimationWithOffset(Animation a, Func<WorldRenderer, float2> o, Func<bool> d)
{
this.Animation = a;
this.OffsetFunc = o;
this.DisableFunc = d;
}
public Renderable Image(Actor self, string pal)
public Renderable Image(Actor self, WorldRenderer wr, PaletteReference pal)
{
var p = self.CenterLocation;
var loc = p.ToFloat2() - 0.5f * Animation.Image.size
+ (OffsetFunc != null ? OffsetFunc() : float2.Zero);
+ (OffsetFunc != null ? OffsetFunc(wr) : float2.Zero);
var r = new Renderable(Animation.Image, loc, pal, p.Y);
return ZOffset != 0 ? r.WithZOffset(ZOffset) : r;

View File

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

View File

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

View File

@@ -77,5 +77,12 @@ namespace OpenRA.Graphics
for (float y = r.Top; y < r.Bottom; y++)
DrawLine(new float2(r.Left, y), new float2(r.Right, y), color, color);
}
public void SetViewportParams(Size screen, float zoom, float2 scroll)
{
shader.SetVec("Scroll", (int)scroll.X, (int)scroll.Y);
shader.SetVec("r1", zoom*2f/screen.Width, -zoom*2f/screen.Height);
shader.SetVec("r2", -1, 1);
}
}
}

View File

@@ -139,7 +139,7 @@ namespace OpenRA.Graphics
foreach (var t in world.ActorsWithTrait<IRadarSignature>())
{
if (!world.LocalShroud.IsVisible(t.Actor))
if (world.FogObscures(t.Actor))
continue;
var color = t.Trait.RadarSignatureColor(t.Actor);
@@ -158,7 +158,7 @@ namespace OpenRA.Graphics
var map = world.Map;
var size = Exts.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
var bitmap = new Bitmap(size, size);
if (world.LocalShroud.Disabled)
if (world.RenderPlayer == null)
return bitmap;
var bitmapData = bitmap.LockBits(bitmap.Bounds(),
@@ -174,11 +174,10 @@ namespace OpenRA.Graphics
for (var x = 0; x < map.Bounds.Width; x++)
for (var y = 0; y < map.Bounds.Height; y++)
{
var mapX = x + map.Bounds.Left;
var mapY = y + map.Bounds.Top;
if (!world.LocalShroud.IsExplored(mapX, mapY))
var p = new CPos(x + map.Bounds.Left, y + map.Bounds.Top);
if (world.ShroudObscures(p))
*(c + (y * bitmapData.Stride >> 2) + x) = shroud;
else if (!world.LocalShroud.IsVisible(mapX,mapY))
else if (world.FogObscures(p))
*(c + (y * bitmapData.Stride >> 2) + x) = fog;
}
}

View File

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

View File

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

View File

@@ -18,12 +18,13 @@ namespace OpenRA.Graphics
public class Sequence
{
readonly Sprite[] sprites;
readonly int start, length, facings, tick;
readonly int start, length, stride, facings, tick;
public readonly string Name;
public int Start { get { return start; } }
public int End { get { return start + length; } }
public int Length { get { return length; } }
public int Stride { get { return stride; } }
public int Facings { get { return facings; } }
public int Tick { get { return tick; } }
@@ -43,6 +44,10 @@ namespace OpenRA.Graphics
else
length = int.Parse(d["Length"].Value);
if (d.ContainsKey("Stride"))
stride = int.Parse(d["Stride"].Value);
else
stride = length;
if(d.ContainsKey("Facings"))
facings = int.Parse(d["Facings"].Value);
@@ -54,10 +59,15 @@ namespace OpenRA.Graphics
else
tick = 40;
if (start < 0 || start + facings * length > sprites.Length)
if (length > stride)
throw new InvalidOperationException(
"{0}: Sequence {1}.{2}: Length must be <= stride"
.F(info.Nodes[0].Location, unit, name));
if (start < 0 || start + facings * stride > sprites.Length)
throw new InvalidOperationException(
"{6}: Sequence {0}.{1} uses frames [{2}..{3}] of SHP `{4}`, but only 0..{5} actually exist"
.F(unit, name, start, start + facings * length - 1, srcOverride ?? unit, sprites.Length - 1,
.F(unit, name, start, start + facings * stride - 1, srcOverride ?? unit, sprites.Length - 1,
info.Nodes[0].Location));
}
@@ -69,7 +79,7 @@ namespace OpenRA.Graphics
public Sprite GetSprite(int frame, int facing)
{
var f = Traits.Util.QuantizeFacing( facing, facings );
return sprites[ (f * length) + ( frame % length ) + start ];
return sprites[ (f * stride) + ( frame % length ) + start ];
}
}
}

View File

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

View File

@@ -15,22 +15,14 @@ namespace OpenRA.Graphics
{
public class ShroudRenderer
{
Traits.Shroud shroud;
Map map;
ShroudInfo shroudInfo;
Sprite[] shadowBits = Game.modData.SpriteLoader.LoadAllSprites("shadow");
Sprite[,] sprites, fogSprites;
int shroudHash;
bool dirty = true;
Map map;
public ShroudRenderer(World world)
{
this.shroud = world.LocalShroud;
this.map = world.Map;
sprites = new Sprite[map.MapSize.X, map.MapSize.Y];
fogSprites = new Sprite[map.MapSize.X, map.MapSize.Y];
shroud.Dirty += () => dirty = true;
}
bool initializePalettes = true;
PaletteReference fogPalette, shroudPalette;
static readonly byte[][] SpecialShroudTiles =
{
@@ -52,78 +44,133 @@ namespace OpenRA.Graphics
new byte[] { 46 },
};
Sprite ChooseShroud(int i, int j)
public ShroudRenderer(World world)
{
if( !shroud.IsExplored( i, j ) ) return shadowBits[ 0xf ];
this.map = world.Map;
shroudInfo = Rules.Info["player"].Traits.Get<ShroudInfo>();
// bits are for unexploredness: up, right, down, left
var v = 0;
// bits are for unexploredness: TL, TR, BR, BL
var u = 0;
sprites = new Sprite[map.MapSize.X, map.MapSize.Y];
fogSprites = new Sprite[map.MapSize.X, map.MapSize.Y];
if( !shroud.IsExplored( i, j - 1 ) ) { v |= 1; u |= 3; }
if( !shroud.IsExplored( i + 1, j ) ) { v |= 2; u |= 6; }
if( !shroud.IsExplored( i, j + 1 ) ) { v |= 4; u |= 12; }
if( !shroud.IsExplored( i - 1, j ) ) { v |= 8; u |= 9; }
var uSides = u;
if( !shroud.IsExplored( i - 1, j - 1 ) ) u |= 1;
if( !shroud.IsExplored( i + 1, j - 1 ) ) u |= 2;
if( !shroud.IsExplored( i + 1, j + 1 ) ) u |= 4;
if( !shroud.IsExplored( i - 1, j + 1 ) ) u |= 8;
return shadowBits[ SpecialShroudTiles[ u ^ uSides ][ v ] ];
// Force update on first render
shroudHash = -1;
}
Sprite ChooseFog(int i, int j)
Sprite ChooseShroud(Shroud s, int i, int j)
{
if (!shroud.IsVisible(i,j)) return shadowBits[0xf];
if (!shroud.IsExplored(i, j)) return shadowBits[0xf];
if (!s.IsExplored(i, j))
return shadowBits[0xf];
// bits are for unexploredness: up, right, down, left
var v = 0;
// bits are for unexploredness: TL, TR, BR, BL
var u = 0;
if (!shroud.IsVisible(i, j - 1)) { v |= 1; u |= 3; }
if (!shroud.IsVisible(i + 1, j)) { v |= 2; u |= 6; }
if (!shroud.IsVisible(i, j + 1)) { v |= 4; u |= 12; }
if (!shroud.IsVisible(i - 1, j)) { v |= 8; u |= 9; }
if (!s.IsExplored(i, j - 1)) { v |= 1; u |= 3; }
if (!s.IsExplored(i + 1, j)) { v |= 2; u |= 6; }
if (!s.IsExplored(i, j + 1)) { v |= 4; u |= 12; }
if (!s.IsExplored(i - 1, j)) { v |= 8; u |= 9; }
var uSides = u;
if (!shroud.IsVisible(i - 1, j - 1)) u |= 1;
if (!shroud.IsVisible(i + 1, j - 1)) u |= 2;
if (!shroud.IsVisible(i + 1, j + 1)) u |= 4;
if (!shroud.IsVisible(i - 1, j + 1)) u |= 8;
if (!s.IsExplored(i - 1, j - 1)) u |= 1;
if (!s.IsExplored(i + 1, j - 1)) u |= 2;
if (!s.IsExplored(i + 1, j + 1)) u |= 4;
if (!s.IsExplored(i - 1, j + 1)) u |= 8;
return shadowBits[SpecialShroudTiles[u ^ uSides][v]];
}
internal void Draw( WorldRenderer wr )
Sprite ChooseFog(Shroud s, int i, int j)
{
if (dirty)
{
dirty = false;
for (int i = map.Bounds.Left; i < map.Bounds.Right; i++)
for (int j = map.Bounds.Top; j < map.Bounds.Bottom; j++)
sprites[i, j] = ChooseShroud(i, j);
if (!s.IsVisible(i, j)) return shadowBits[0xf];
if (!s.IsExplored(i, j)) return shadowBits[0xf];
for (int i = map.Bounds.Left; i < map.Bounds.Right; i++)
for (int j = map.Bounds.Top; j < map.Bounds.Bottom; j++)
fogSprites[i, j] = ChooseFog(i, j);
}
// bits are for unexploredness: up, right, down, left
var v = 0;
// bits are for unexploredness: TL, TR, BR, BL
var u = 0;
var clipRect = Game.viewport.WorldBounds(wr.world);
DrawShroud( wr, clipRect, fogSprites, "fog" );
DrawShroud( wr, clipRect, sprites, "shroud" );
if (!s.IsVisible(i, j - 1)) { v |= 1; u |= 3; }
if (!s.IsVisible(i + 1, j)) { v |= 2; u |= 6; }
if (!s.IsVisible(i, j + 1)) { v |= 4; u |= 12; }
if (!s.IsVisible(i - 1, j)) { v |= 8; u |= 9; }
var uSides = u;
if (!s.IsVisible(i - 1, j - 1)) u |= 1;
if (!s.IsVisible(i + 1, j - 1)) u |= 2;
if (!s.IsVisible(i + 1, j + 1)) u |= 4;
if (!s.IsVisible(i - 1, j + 1)) u |= 8;
return shadowBits[SpecialShroudTiles[u ^ uSides][v]];
}
void DrawShroud( WorldRenderer wr, Rectangle clip, Sprite[,] s, string pal )
void GenerateSprites(Shroud shroud)
{
var shroudPalette = wr.GetPaletteIndex(pal);
var hash = shroud != null ? shroud.Hash : 0;
if (shroudHash == hash)
return;
shroudHash = hash;
if (shroud == null)
{
// Players with no shroud see the whole map so we only need to set the edges
var b = map.Bounds;
for (int i = b.Left; i < b.Right; i++)
for (int j = b.Top; j < b.Bottom; j++)
{
var v = 0;
var u = 0;
if (j == b.Top) { v |= 1; u |= 3; }
if (i == b.Right - 1) { v |= 2; u |= 6; }
if (j == b.Bottom - 1) { v |= 4; u |= 12; }
if (i == b.Left) { v |= 8; u |= 9; }
var uSides = u;
if (i == b.Left && j == b.Top) u |= 1;
if (i == b.Right - 1 && j == b.Top) u |= 2;
if (i == b.Right - 1 && j == b.Bottom - 1) u |= 4;
if (i == b.Left && j == b.Bottom - 1) u |= 8;
sprites[i, j] = fogSprites[i, j] = shadowBits[SpecialShroudTiles[u ^ uSides][v]];
}
}
else
{
for (int i = map.Bounds.Left; i < map.Bounds.Right; i++)
for (int j = map.Bounds.Top; j < map.Bounds.Bottom; j++)
sprites[i, j] = ChooseShroud(shroud, i, j);
for (int i = map.Bounds.Left; i < map.Bounds.Right; i++)
for (int j = map.Bounds.Top; j < map.Bounds.Bottom; j++)
fogSprites[i, j] = ChooseFog(shroud, i, j);
}
}
internal void Draw(WorldRenderer wr, Shroud shroud)
{
if (initializePalettes)
{
if (shroudInfo.Fog)
fogPalette = wr.Palette("fog");
shroudPalette = wr.Palette("shroud");
initializePalettes = false;
}
GenerateSprites(shroud);
var clipRect = Game.viewport.WorldBounds(wr.world);
// We draw the shroud when disabled to hide the sharp map edges
DrawShroud(wr, clipRect, sprites, shroudPalette);
if (shroudInfo.Fog)
DrawShroud(wr, clipRect, fogSprites, fogPalette);
}
void DrawShroud(WorldRenderer wr, Rectangle clip, Sprite[,] s, PaletteReference pal)
{
for (var j = clip.Top; j < clip.Bottom; j++)
{
var starti = clip.Left;
@@ -138,14 +185,14 @@ namespace OpenRA.Graphics
{
s[starti, j].DrawAt(
Game.CellSize * new float2(starti, j),
shroudPalette,
pal.Index,
new float2(Game.CellSize * (i - starti), Game.CellSize));
starti = i + 1;
}
s[i, j].DrawAt(
Game.CellSize * new float2(i, j),
shroudPalette);
pal.Index);
starti = i + 1;
last = s[i, j];
}
@@ -153,7 +200,7 @@ namespace OpenRA.Graphics
if (starti < clip.Right)
s[starti, j].DrawAt(
Game.CellSize * new float2(starti, j),
shroudPalette,
pal.Index,
new float2(Game.CellSize * (clip.Right - starti), Game.CellSize));
}
}

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2012 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -13,7 +13,7 @@ using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using OpenRA.FileFormats;
using Tao.FreeType;
using SharpFont;
namespace OpenRA.Graphics
{
@@ -25,12 +25,11 @@ namespace OpenRA.Graphics
{
this.size = size;
if (0 != FT.FT_New_Face(library, name, 0, out face))
throw new InvalidOperationException("FT_New_Face failed");
face = library.NewFace(name, 0);
face.SetPixelSizes((uint)size, (uint)size);
FT.FT_Set_Pixel_Sizes(face, 0, (uint)size);
glyphs = new Cache<Pair<char, Color>, GlyphInfo>(CreateGlyph,
Pair<char,Color>.EqualityComparer);
glyphs = new Cache<Pair<char, Color>, GlyphInfo>(CreateGlyph,
Pair<char,Color>.EqualityComparer);
// setup a 1-channel SheetBuilder for our private use
if (builder == null) builder = new SheetBuilder(TextureChannel.Alpha);
@@ -47,7 +46,7 @@ namespace OpenRA.Graphics
throw new InvalidOperationException();
}
public void DrawText( string text, float2 location, Color c )
public void DrawText (string text, float2 location, Color c)
{
location.Y += size; // baseline vs top
@@ -89,31 +88,28 @@ namespace OpenRA.Graphics
}
Cache<Pair<char,Color>, GlyphInfo> glyphs;
IntPtr face;
Face face;
GlyphInfo CreateGlyph(Pair<char,Color> c)
GlyphInfo CreateGlyph(Pair<char, Color> c)
{
var index = FT.FT_Get_Char_Index(face, (uint)c.First);
if (0 != FT.FT_Load_Glyph(face, index, FT.FT_LOAD_RENDER))
throw new InvalidOperationException( "FT_Load_Glyph failed." );
var _face = (FT_FaceRec)Marshal.PtrToStructure(face, typeof(FT_FaceRec));
var _glyph = (FT_GlyphSlotRec)Marshal.PtrToStructure(_face.glyph, typeof(FT_GlyphSlotRec));
uint index = face.GetCharIndex(c.First);
face.LoadGlyph(index, LoadFlags.Default, LoadTarget.Normal);
face.Glyph.RenderGlyph(RenderMode.Normal);
var s = builder.Allocate(
new Size(_glyph.metrics.width.ToInt32() >> 6,
_glyph.metrics.height.ToInt32() >> 6));
new Size((int)face.Glyph.Metrics.Width >> 6,
(int)face.Glyph.Metrics.Height >> 6));
var g = new GlyphInfo
{
Sprite = s,
Advance = _glyph.metrics.horiAdvance.ToInt32() / 64f,
Offset = { X = _glyph.bitmap_left, Y = -_glyph.bitmap_top }
Advance = (int)face.Glyph.Metrics.HorizontalAdvance / 64f,
Offset = { X = face.Glyph.BitmapLeft, Y = -face.Glyph.BitmapTop }
};
unsafe
{
var p = (byte*)_glyph.bitmap.buffer;
var p = (byte*)face.Glyph.Bitmap.Buffer;
var dest = s.sheet.Data;
var destStride = s.sheet.Size.Width * 4;
@@ -129,19 +125,18 @@ namespace OpenRA.Graphics
dest[q + 3] = p[i];
}
p += _glyph.bitmap.pitch;
p += face.Glyph.Bitmap.Pitch;
}
}
return g;
}
static SpriteFont()
{
FT.FT_Init_FreeType(out library);
library = new Library();
}
static IntPtr library;
static Library library;
static SheetBuilder builder;
}

View File

@@ -8,6 +8,7 @@
*/
#endregion
using System.Drawing;
using OpenRA.FileFormats.Graphics;
namespace OpenRA.Graphics
@@ -27,14 +28,11 @@ namespace OpenRA.Graphics
this.shader = shader;
}
public SpriteRenderer(Renderer renderer)
: this(renderer, renderer.SpriteShader) { }
public void Flush()
{
if (nv > 0)
{
shader.SetValue( "DiffuseTexture", currentSheet.Texture );
shader.SetTexture("DiffuseTexture", currentSheet.Texture);
shader.Render(() =>
{
var vb = renderer.GetTempVertexBuffer();
@@ -49,12 +47,12 @@ namespace OpenRA.Graphics
public void DrawSprite(Sprite s, float2 location, WorldRenderer wr, string palette)
{
DrawSprite(s, location, wr.GetPaletteIndex(palette), s.size);
DrawSprite(s, location, wr.Palette(palette).Index, s.size);
}
public void DrawSprite(Sprite s, float2 location, WorldRenderer wr, string palette, float2 size)
{
DrawSprite(s, location, wr.GetPaletteIndex(palette), size);
DrawSprite(s, location, wr.Palette(palette).Index, size);
}
public void DrawSprite(Sprite s, float2 location, int paletteIndex, float2 size)
@@ -72,7 +70,6 @@ namespace OpenRA.Graphics
nv += 4;
}
// For RGBASpriteRenderer, which doesn't use palettes
public void DrawSprite(Sprite s, float2 location)
{
@@ -83,5 +80,23 @@ namespace OpenRA.Graphics
{
DrawSprite(s, location, 0, size);
}
public void DrawVertexBuffer(IVertexBuffer<Vertex> buffer, int start, int length, PrimitiveType type, Sheet sheet)
{
shader.SetTexture("DiffuseTexture", sheet.Texture);
shader.Render(() => renderer.DrawBatch(buffer, start, length, type));
}
public void SetPalette(ITexture palette)
{
shader.SetTexture("Palette", palette);
}
public void SetViewportParams(Size screen, float zoom, float2 scroll)
{
shader.SetVec("Scroll", (int)scroll.X, (int)scroll.Y);
shader.SetVec("r1", zoom*2f/screen.Width, -zoom*2f/screen.Height);
shader.SetVec("r2", -1, 1);
}
}
}

View File

@@ -39,7 +39,7 @@ namespace OpenRA.Graphics
int nv = 0;
var terrainPalette = Game.modData.Palette.GetPaletteIndex("terrain");
var terrainPalette = wr.Palette("terrain").Index;
for( int j = map.Bounds.Top; j < map.Bounds.Bottom; j++ )
for( int i = map.Bounds.Left; i < map.Bounds.Right; i++ )
@@ -50,7 +50,7 @@ namespace OpenRA.Graphics
nv += 4;
if (tileMapping[map.MapTiles.Value[i, j]].sheet != terrainSheet)
throw new InvalidOperationException("Terrain sprites span multiple sheets");
throw new InvalidOperationException("Terrain sprites span multiple sheets. Try increasing Game.Settings.Graphics.SheetSize.");
}
vertexBuffer = Game.Renderer.Device.CreateVertexBuffer( vertices.Length );
@@ -69,12 +69,9 @@ namespace OpenRA.Graphics
if (lastRow < 0 || firstRow > map.Bounds.Height)
return;
if (firstRow < 0) firstRow = 0;
if (lastRow > map.Bounds.Height) lastRow = map.Bounds.Height;
if (world.LocalPlayer != null && !world.LocalShroud.Disabled && world.LocalShroud.Bounds.HasValue)
if (world.VisibleBounds.HasValue)
{
var r = world.LocalShroud.Bounds.Value;
var r = world.VisibleBounds.Value;
if (firstRow < r.Top - map.Bounds.Top)
firstRow = r.Top - map.Bounds.Top;
@@ -82,13 +79,14 @@ namespace OpenRA.Graphics
firstRow = r.Bottom - map.Bounds.Top;
}
if (firstRow < 0) firstRow = 0;
if (lastRow > map.Bounds.Height) lastRow = map.Bounds.Height;
if( lastRow < firstRow ) lastRow = firstRow;
Game.Renderer.WorldSpriteShader.SetValue( "DiffuseTexture", terrainSheet.Texture );
Game.Renderer.WorldSpriteShader.Render(() =>
Game.Renderer.DrawBatch(vertexBuffer,
verticesPerRow * firstRow, verticesPerRow * (lastRow - firstRow),
PrimitiveType.QuadList));
Game.Renderer.WorldSpriteRenderer.DrawVertexBuffer(
vertexBuffer, verticesPerRow * firstRow, verticesPerRow * (lastRow - firstRow),
PrimitiveType.QuadList, terrainSheet);
foreach (var r in world.WorldActor.TraitsImplementing<IRenderOverlay>())
r.Render( wr );

View File

@@ -128,13 +128,7 @@ namespace OpenRA.Graphics
{
Ui.Draw();
var cursorName = Ui.Root.GetCursorOuter(Viewport.LastMousePos) ?? "default";
var cursorSequence = CursorProvider.GetCursorSequence(cursorName);
var cursorSprite = cursorSequence.GetSprite((int)cursorFrame);
renderer.SpriteRenderer.DrawSprite(cursorSprite,
Viewport.LastMousePos - cursorSequence.Hotspot,
Game.modData.Palette.GetPaletteIndex(cursorSequence.Palette),
cursorSprite.size);
CursorProvider.DrawCursor(renderer, cursorName, Viewport.LastMousePos, (int)cursorFrame);
}
using( new PerfSample("render_flip") )
@@ -170,7 +164,7 @@ namespace OpenRA.Graphics
var avgPos = actors
.Select(a => (PVecInt)a.CenterLocation)
.Aggregate((a, b) => a + b) / actors.Count();
scrollPosition = NormalizeScrollPosition(((PVecFloat)avgPos - (PVecFloat)(1f / (2 * Zoom) * screenSize.ToFloat2())).ToInt2());
scrollPosition = NormalizeScrollPosition((avgPos.ToFloat2() - (1f / (2 * Zoom) * screenSize.ToFloat2())).ToInt2());
}
// Rectangle (in viewport coords) that contains things to be drawn
@@ -202,7 +196,7 @@ namespace OpenRA.Graphics
cachedScroll = scrollPosition;
}
var b = world.LocalShroud.Bounds;
var b = world.VisibleBounds;
return (b.HasValue) ? Rectangle.Intersect(cachedRect, b.Value) : cachedRect;
}
}

View File

@@ -17,27 +17,53 @@ using OpenRA.Traits;
namespace OpenRA.Graphics
{
public class PaletteReference
{
public readonly string Name;
public readonly int Index;
public readonly Palette Palette;
public PaletteReference(string name, int index, Palette palette)
{
Name = name;
Index = index;
Palette = palette;
}
}
public class WorldRenderer
{
public readonly World world;
internal readonly TerrainRenderer terrainRenderer;
internal readonly ShroudRenderer shroudRenderer;
internal readonly HardwarePalette palette;
internal Cache<string, PaletteReference> palettes;
internal WorldRenderer(World world)
{
this.world = world;
this.palette = Game.modData.Palette;
foreach( var pal in world.traitDict.ActorsWithTraitMultiple<IPalette>( world ) )
pal.Trait.InitPalette( this );
palette = new HardwarePalette();
palettes = new Cache<string, PaletteReference>(CreatePaletteReference);
foreach (var pal in world.traitDict.ActorsWithTraitMultiple<IPalette>(world))
pal.Trait.InitPalette(this);
palette.Initialize();
terrainRenderer = new TerrainRenderer(world, this);
shroudRenderer = new ShroudRenderer(world);
}
public int GetPaletteIndex(string name) { return palette.GetPaletteIndex(name); }
public Palette GetPalette(string name) { return palette.GetPalette(name); }
public void AddPalette(string name, Palette pal) { palette.AddPalette(name, pal); }
PaletteReference CreatePaletteReference(string name)
{
var pal = palette.GetPalette(name);
if (pal == null)
throw new InvalidOperationException("Palette `{0}` does not exist".F(name));
return new PaletteReference(name, palette.GetPaletteIndex(name), pal);
}
public PaletteReference Palette(string name) { return palettes[name]; }
public void AddPalette(string name, Palette pal, bool allowModifiers) { palette.AddPalette(name, pal, allowModifiers); }
class SpriteComparer : IComparer<Renderable>
{
@@ -57,10 +83,10 @@ namespace OpenRA.Graphics
bounds.BottomRightAsCPos().ToPPos()
);
var renderables = actors.SelectMany(a => a.Render())
var renderables = actors.SelectMany(a => a.Render(this))
.OrderBy(r => r, comparer);
var effects = world.Effects.SelectMany(e => e.Render());
var effects = world.Effects.SelectMany(e => e.Render(this));
return renderables.Concat(effects);
}
@@ -77,8 +103,8 @@ namespace OpenRA.Graphics
terrainRenderer.Draw(this, Game.viewport);
foreach (var a in world.traitDict.ActorsWithTraitMultiple<IRenderAsTerrain>(world))
foreach (var r in a.Trait.RenderAsTerrain(a.Actor))
r.Sprite.DrawAt(r.Pos, this.GetPaletteIndex(r.Palette), r.Scale);
foreach (var r in a.Trait.RenderAsTerrain(this, a.Actor))
r.Sprite.DrawAt(r.Pos, r.Palette.Index, r.Scale);
foreach (var a in world.Selection.Actors)
if (!a.Destroyed)
@@ -91,7 +117,7 @@ namespace OpenRA.Graphics
world.OrderGenerator.RenderBeforeWorld(this, world);
foreach (var image in SpritesToRender())
image.Sprite.DrawAt(image.Pos, this.GetPaletteIndex(image.Palette), image.Scale);
image.Sprite.DrawAt(image.Pos, image.Palette.Index, image.Scale);
// added for contrails
foreach (var a in world.ActorsWithTrait<IPostRender>())
@@ -101,7 +127,8 @@ namespace OpenRA.Graphics
if (world.OrderGenerator != null)
world.OrderGenerator.RenderAfterWorld(this, world);
shroudRenderer.Draw( this );
var renderShroud = world.RenderPlayer != null ? world.RenderPlayer.Shroud : null;
shroudRenderer.Draw(this, renderShroud);
Game.Renderer.DisableScissor();
foreach (var g in world.Selection.Actors.Where(a => !a.Destroyed)
@@ -170,9 +197,44 @@ namespace OpenRA.Graphics
}
}
public void DrawRangeCircleWithContrast(Color fg, float2 location, float range, Color bg, int offset)
{
if (offset > 0) {
DrawRangeCircle(bg, location, range + (float) offset/Game.CellSize);
DrawRangeCircle(bg, location, range - (float) offset/Game.CellSize);
}
DrawRangeCircle(fg, location, range);
}
public void RefreshPalette()
{
palette.Update( world.WorldActor.TraitsImplementing<IPaletteModifier>() );
palette.ApplyModifiers(world.WorldActor.TraitsImplementing<IPaletteModifier>());
Game.Renderer.SetPalette(palette);
}
// Conversion between world and screen coordinates
public float2 ScreenPosition(WPos pos)
{
var c = Game.CellSize/1024f;
return new float2(c*pos.X, c*(pos.Y - pos.Z));
}
public int2 ScreenPxPosition(WPos pos)
{
return new int2(Game.CellSize*pos.X/1024, Game.CellSize*(pos.Y - pos.Z)/1024);
}
public float ScreenZOffset(WPos pos) { return pos.Z*Game.CellSize/1024f; }
public int2 ScreenPxOffset(WVec vec)
{
return new int2(Game.CellSize*vec.X/1024, Game.CellSize*(vec.Y - vec.Z)/1024);
}
public float[] ScreenOffset(WVec vec)
{
var c = Game.CellSize/1024f;
return new float[] {c*vec.X, c*vec.Y, c*vec.Z};
}
}
}

View File

@@ -39,6 +39,6 @@ namespace OpenRA
id, actors.Select(a => "#{0} {1}".F(a.ActorID, a.Info.Name)).JoinWith(",")));
}
/* todo: add lazy group path crap, groupleader, pruning, etc */
/* TODO: add lazy group path crap, groupleader, pruning, etc */
}
}

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,
@@ -15,32 +15,53 @@ namespace OpenRA
public class NullInputHandler : IInputHandler
{
// ignore all input
public void ModifierKeys( Modifiers mods ) { }
public void OnKeyInput( KeyInput input ) { }
public void OnMouseInput( MouseInput input ) { }
public void ModifierKeys(Modifiers mods) { }
public void OnKeyInput(KeyInput input) { }
public void OnMouseInput(MouseInput input) { }
}
public class DefaultInputHandler : IInputHandler
{
readonly World world;
public DefaultInputHandler( World world )
public DefaultInputHandler(World world)
{
this.world = world;
}
public void ModifierKeys( Modifiers mods )
public void ModifierKeys(Modifiers mods)
{
Game.HandleModifierKeys( mods );
Game.HandleModifierKeys(mods);
}
public void OnKeyInput( KeyInput input )
public void OnKeyInput(KeyInput input)
{
Sync.CheckSyncUnchanged(world, () => Ui.HandleKeyPress(input));
}
public void OnMouseInput( MouseInput input )
public void OnMouseInput(MouseInput input)
{
Sync.CheckSyncUnchanged(world, () => Ui.HandleInput(input));
}
}
public class MouseButtonPreference
{
public MouseButton Action
{
get
{
return Game.Settings.Game.UseClassicMouseStyle ? MouseButton.Left : MouseButton.Right;
}
}
public MouseButton Cancel
{
get
{
return Game.Settings.Game.UseClassicMouseStyle ? MouseButton.Right : MouseButton.Left;
}
}
}
}

View File

@@ -37,6 +37,7 @@ namespace OpenRA
public string Description;
public string Author;
public string Tileset;
public string[] Difficulties;
[FieldLoader.Ignore] public Lazy<Dictionary<string, ActorReference>> Actors;
@@ -60,6 +61,7 @@ namespace OpenRA
[FieldLoader.Ignore] public List<MiniYamlNode> Sequences = new List<MiniYamlNode>();
[FieldLoader.Ignore] public List<MiniYamlNode> Weapons = new List<MiniYamlNode>();
[FieldLoader.Ignore] public List<MiniYamlNode> Voices = new List<MiniYamlNode>();
[FieldLoader.Ignore] public List<MiniYamlNode> Notifications = new List<MiniYamlNode>();
// Binary map data
[FieldLoader.Ignore] public byte TileFormat = 1;
@@ -150,6 +152,7 @@ namespace OpenRA
Sequences = NodesOrEmpty(yaml, "Sequences");
Weapons = NodesOrEmpty(yaml, "Weapons");
Voices = NodesOrEmpty(yaml, "Voices");
Notifications = NodesOrEmpty(yaml, "Notifications");
CustomTerrain = new string[MapSize.X, MapSize.Y];
@@ -176,6 +179,7 @@ namespace OpenRA
"Description",
"Author",
"Tileset",
"Difficulties",
"MapSize",
"Bounds",
"UseAsShellmap",
@@ -204,6 +208,7 @@ namespace OpenRA
root.Add(new MiniYamlNode("Sequences", null, Sequences));
root.Add(new MiniYamlNode("Weapons", null, Weapons));
root.Add(new MiniYamlNode("Voices", null, Voices));
root.Add(new MiniYamlNode("Notifications", null, Notifications));
var entries = new Dictionary<string, byte[]>();
entries.Add("map.bin", SaveBinaryData());
@@ -380,22 +385,24 @@ namespace OpenRA
public void MakeDefaultPlayers()
{
Players.Clear();
var firstRace = OpenRA.Rules.Info["world"].Traits
.WithInterface<CountryInfo>().First(c => c.Selectable).Race;
Players.Add("Neutral", new PlayerReference
{
Name = "Neutral",
Race = firstRace,
OwnsWorld = true,
NonCombatant = true
});
if (!Players.ContainsKey("Neutral"))
Players.Add("Neutral", new PlayerReference
{
Name = "Neutral",
Race = firstRace,
OwnsWorld = true,
NonCombatant = true
});
var numSpawns = GetSpawnPoints().Length;
for (var index = 0; index < numSpawns; index++)
{
if (Players.ContainsKey("Multi{0}".F(index)))
continue;
var p = new PlayerReference
{
Name = "Multi{0}".F(index),

View File

@@ -28,7 +28,6 @@ namespace OpenRA
public ILoadScreen LoadScreen = null;
public SheetBuilder SheetBuilder;
public SpriteLoader SpriteLoader;
public HardwarePalette Palette { get; private set; }
public ModData( params string[] mods )
{
@@ -40,7 +39,7 @@ namespace OpenRA
WidgetLoader = new WidgetLoader( this );
}
public void LoadInitialAssets()
public void LoadInitialAssets(bool enumMaps)
{
// all this manipulation of static crap here is nasty and breaks
// horribly when you use ModData in unexpected ways.
@@ -49,15 +48,14 @@ namespace OpenRA
foreach (var dir in Manifest.Folders)
FileSystem.Mount(dir);
AvailableMaps = FindMaps(Manifest.Mods);
if (enumMaps)
AvailableMaps = FindMaps(Manifest.Mods);
Palette = new HardwarePalette();
ChromeMetrics.Initialize(Manifest.ChromeMetrics);
ChromeProvider.Initialize(Manifest.Chrome);
SheetBuilder = new SheetBuilder(TextureChannel.Red);
SpriteLoader = new SpriteLoader(new string[] { ".shp" }, SheetBuilder);
CursorProvider.Initialize(Manifest.Cursors);
Palette.Update(new IPaletteModifier[] { });
}
public Map PrepareMap(string uid)
@@ -68,7 +66,7 @@ namespace OpenRA
var map = new Map(AvailableMaps[uid].Path);
// Reinit all our assets
LoadInitialAssets();
LoadInitialAssets(false);
foreach (var pkg in Manifest.Packages)
FileSystem.Mount(pkg);
@@ -76,7 +74,8 @@ namespace OpenRA
FileSystem.Mount(FileSystem.OpenPackage(map.Path, int.MaxValue));
Rules.LoadRules(Manifest, map);
SpriteLoader = new SpriteLoader( Rules.TileSets[map.Tileset].Extensions, SheetBuilder );
SpriteLoader = new SpriteLoader(Rules.TileSets[map.Tileset].Extensions, SheetBuilder);
// TODO: Don't load the sequences for assets that are not used in this tileset. Maybe use the existing EditorTilesetFilters.
SequenceProvider.Initialize(Manifest.Sequences, map.Sequences);
return map;

View File

@@ -10,6 +10,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Threading;
namespace OpenRA.Network
{
@@ -36,10 +38,10 @@ namespace OpenRA.Network
static bool AreVersionsCompatible(string a, string b)
{
/* dev versions are assumed compatible; if you're using one,
* we trust that you know what you're doing. */
if (Game.Settings.Debug.IgnoreVersionMismatch)
return true;
return a == "{DEV_VERSION}" || b == "{DEV_VERSION}" || a == b;
return a == b;
}
public bool CanJoin()
@@ -54,7 +56,8 @@ namespace OpenRA.Network
// Don't have the map locally
if (!Game.modData.AvailableMaps.ContainsKey(Map))
return false;
if (!Game.Settings.Game.AllowDownloading)
return false;
return CompatibleVersion();
}
@@ -64,5 +67,33 @@ namespace OpenRA.Network
return UsefulMods.All(m => Game.CurrentMods.ContainsKey(m.Key)
&& AreVersionsCompatible(m.Value, Game.CurrentMods[m.Key].Version));
}
public int Latency = -1;
bool hasBeenPinged;
public void Ping()
{
if (!hasBeenPinged)
{
hasBeenPinged = true;
var pingSender = new Ping();
pingSender.PingCompleted += new PingCompletedEventHandler(pongRecieved);
AutoResetEvent waiter = new AutoResetEvent(false);
pingSender.SendAsync(Address.Split(':')[0], waiter);
}
}
void pongRecieved(object sender, PingCompletedEventArgs e)
{
if (e.Cancelled || e.Error != null)
Latency = -1;
else
{
PingReply pong = e.Reply;
if (pong != null && pong.Status == IPStatus.Success)
Latency = (int)pong.RoundtripTime;
else
Latency = -1;
}
}
}
}

View File

@@ -199,18 +199,17 @@ namespace OpenRA
{
return new Order("HandshakeResponse", null, false) { IsImmediate = true, TargetString = text };
}
public static Order PauseRequest()
public static Order Pong(string pingTime)
{
return new Order("PauseRequest", null, false) { IsImmediate = true, TargetString="" }; //TODO: targetbool?
}
public static Order PauseGame()
{
return new Order("PauseGame", null, false) { IsImmediate = true, TargetString=""}; //TODO: targetbool?
return new Order("Pong", null, false) { IsImmediate = true, TargetString = pingTime };
}
public static Order PauseGame(bool paused)
{
return new Order("PauseGame", null, false) { TargetString = paused ? "Pause" : "UnPause" };
}
public static Order Command(string text)
{
return new Order("Command", null, false) { IsImmediate = true, TargetString = text };

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,
@@ -36,7 +36,6 @@ namespace OpenRA.Network
public int LastTickTime = Environment.TickCount;
public bool GameStarted { get { return NetFrameNumber != 0; } }
public bool GamePaused {get; set;}
public IConnection Connection { get; private set; }
public readonly int SyncHeaderSize = 9;
@@ -140,17 +139,17 @@ namespace OpenRA.Network
if (index >= orders.Count())
OutOfSync(frame);
throw new InvalidOperationException("Out of sync in frame {0}.\n {1}".F(frame, orders.ElementAt(index).Order.ToString()));
throw new InvalidOperationException("Out of sync in frame {0}.\n {1}\n Compare syncreport.log with other players.".F(frame, orders.ElementAt(index).Order.ToString()));
}
void OutOfSync(int frame)
{
throw new InvalidOperationException("Out of sync in frame {0}.\n".F(frame));
throw new InvalidOperationException("Out of sync in frame {0}.\n Compare syncreport.log with other players.".F(frame));
}
void OutOfSync(int frame, string blame)
{
throw new InvalidOperationException("Out of sync in frame {0}: Blame {1}.\n".F(frame, blame));
throw new InvalidOperationException("Out of sync in frame {0}: Blame {1}.\n Compare syncreport.log with other players.".F(frame, blame));
}
public bool IsReadyForNextFrame

View File

@@ -34,12 +34,26 @@ namespace OpenRA.Network
void StartSavingReplay(byte[] initialContent)
{
var filename = chooseFilename();
var replayPath = Path.Combine(Platform.SupportDir, "Replays");
var replaysDirectory = Path.Combine(Platform.SupportDir, "Replays");
if (!Directory.Exists(replayPath))
Directory.CreateDirectory(replayPath);
if (!Directory.Exists(replaysDirectory))
Directory.CreateDirectory(replaysDirectory);
FileStream file = null;
var id = -1;
while (file == null)
{
var fullFilename = Path.Combine(replaysDirectory, id < 0
? "{0}.rep".F(filename)
: "{0}-{1}.rep".F(filename, id));
id++;
try
{
file = File.Create(fullFilename);
}
catch (IOException) { }
}
var file = File.Create(Path.Combine(replayPath, filename));
file.Write(initialContent);
this.writer = new BinaryWriter(file);
}

View File

@@ -37,21 +37,34 @@ namespace OpenRA.Network
return Slots.FirstOrDefault(s => !s.Value.Closed && ClientInSlot(s.Key) == null).Key;
}
public bool IsSinglePlayer
{
get { return Clients.Count(c => c.Bot == null) == 1; }
}
public enum ClientState { NotReady, Ready, Disconnected = 1000 }
public class Client
{
public int Index;
public ColorRamp ColorRamp;
public ColorRamp PreferredColorRamp; // Color that the client normally uses from settings.yaml.
public ColorRamp ColorRamp; // Actual color that the client is using.
// Usually the same as PreferredColorRamp but can be different on maps with locked colors.
public string Country;
public int SpawnPoint;
public string Name;
public string IpAddress;
public ClientState State;
public int Team;
public string Slot; // slot ID, or null for observer
public string Bot; // Bot type, null for real clients
public int BotControllerClientIndex; // who added the bot to the slot
public bool IsAdmin;
public bool IsReady { get { return State == ClientState.Ready; } }
public bool IsObserver { get { return Slot == null; } }
public int Latency = -1;
public int LatencyJitter = -1;
public int[] LatencyHistory = {};
}
public class Slot
@@ -64,6 +77,7 @@ namespace OpenRA.Network
public bool LockColor;
public bool LockTeam;
public bool LockSpawn;
public bool Required;
}
public class Global
@@ -72,10 +86,14 @@ namespace OpenRA.Network
public string Map;
public string[] Ban;
public string[] Mods = { "ra" }; // mod names
public int OrderLatency = 3;
public int OrderLatency = 3; // net tick frames (x 120 = ms)
public int RandomSeed = 0;
public bool LockTeams = true; // don't allow team changes after game start.
public bool FragileAlliances = false; // Allow diplomatic stance changes after game start.
public bool AllowCheats = false;
public bool Dedicated;
public string Difficulty;
public bool Crates = true;
public bool AllowVersionMismatch;
}
public Session(string[] mods)

View File

@@ -9,11 +9,18 @@
#endregion
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System;
using OpenRA.FileFormats;
namespace OpenRA.Network
{
class SyncReport
{
static Cache<Type, Func<object, Dictionary<string, string>>> dumpFuncCache = new Cache<Type, Func<object, Dictionary<string, string>>>( t => GenerateDumpFunc( t ) );
readonly OrderManager orderManager;
const int numSyncReports = 5;
Report[] syncReports = new Report[numSyncReports];
@@ -32,23 +39,114 @@ namespace OpenRA.Network
curIndex = ++curIndex % numSyncReports;
}
public static Dictionary<string, string> DumpSyncTrait( object obj )
{
return dumpFuncCache[ obj.GetType() ]( obj );
}
public static Func<object, Dictionary<string, string>> GenerateDumpFunc(Type t)
{
var dictType = typeof(Dictionary<string, string>);
var d = new DynamicMethod("dump_{0}".F(t.Name), dictType, new Type[] { typeof(object) }, t);
var il = d.GetILGenerator();
var this_ = il.DeclareLocal(t).LocalIndex;
var dict_ = il.DeclareLocal(dictType).LocalIndex;
var obj_ = il.DeclareLocal(typeof(object)).LocalIndex;
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Castclass, t);
il.Emit(OpCodes.Stloc, this_);
var dictAdd_ = dictType.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public, null, new Type[] { typeof(string), typeof(string) }, null);
var dictCtor_ = dictType.GetConstructor(Type.EmptyTypes);
var objToString_ = typeof(object).GetMethod("ToString", BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
il.Emit(OpCodes.Newobj, dictCtor_);
il.Emit(OpCodes.Stloc, dict_);
const BindingFlags bf = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
foreach (var field in t.GetFields(bf).Where(x => x.HasAttribute<SyncAttribute>()))
{
if (field.IsLiteral || field.IsStatic) continue;
var lblNull = il.DefineLabel();
il.Emit(OpCodes.Ldloc, this_);
il.Emit(OpCodes.Ldfld, field);
if (field.FieldType.IsValueType)
il.Emit(OpCodes.Box, field.FieldType);
il.Emit(OpCodes.Dup);
il.Emit(OpCodes.Stloc, obj_);
il.Emit(OpCodes.Brfalse, lblNull);
il.Emit(OpCodes.Ldloc, dict_);
il.Emit(OpCodes.Ldstr, field.Name);
il.Emit(OpCodes.Ldloc, obj_);
il.Emit(OpCodes.Callvirt, objToString_);
il.Emit(OpCodes.Callvirt, dictAdd_);
il.MarkLabel(lblNull);
}
foreach (var prop in t.GetProperties(bf).Where(x => x.HasAttribute<SyncAttribute>()))
{
var lblNull = il.DefineLabel();
il.Emit(OpCodes.Ldloc, this_);
il.EmitCall(OpCodes.Call, prop.GetGetMethod(), null);
if (prop.PropertyType.IsValueType)
il.Emit(OpCodes.Box, prop.PropertyType);
il.Emit(OpCodes.Dup);
il.Emit(OpCodes.Stloc, obj_);
il.Emit(OpCodes.Brfalse, lblNull);
il.Emit(OpCodes.Ldloc, dict_);
il.Emit(OpCodes.Ldstr, prop.Name);
il.Emit(OpCodes.Ldloc, obj_);
il.Emit(OpCodes.Callvirt, objToString_);
il.Emit(OpCodes.Callvirt, dictAdd_);
il.MarkLabel(lblNull);
}
il.Emit(OpCodes.Ldloc, dict_);
il.Emit(OpCodes.Ret);
return (Func<object, Dictionary<string, string>>) d.CreateDelegate(typeof(Func<object, Dictionary<string, string>>));
}
void GenerateSyncReport(Report report)
{
report.Frame = orderManager.NetFrameNumber;
report.SyncedRandom = orderManager.world.SharedRandom.Last;
report.TotalCount = orderManager.world.SharedRandom.TotalCount;
report.Traits.Clear();
foreach (var a in orderManager.world.ActorsWithTrait<ISync>())
{
var sync = Sync.CalculateSyncHash(a.Trait);
if (sync != 0)
report.Traits.Add(new TraitReport()
{
ActorID = a.Actor.ActorID,
Type = a.Actor.Info.Name,
Owner = (a.Actor.Owner == null) ? "null" : a.Actor.Owner.PlayerName,
Trait = a.Trait.GetType().Name,
Hash = sync
});
{
var tr = new TraitReport()
{
ActorID = a.Actor.ActorID,
Type = a.Actor.Info.Name,
Owner = (a.Actor.Owner == null) ? "null" : a.Actor.Owner.PlayerName,
Trait = a.Trait.GetType().Name,
Hash = sync
};
tr.Fields = DumpSyncTrait(a.Trait);
report.Traits.Add(tr);
}
}
}
@@ -58,9 +156,10 @@ namespace OpenRA.Network
if (r.Frame == frame)
{
Log.Write("sync", "Sync for net frame {0} -------------", r.Frame);
Log.Write("sync", "SharedRandom: "+r.SyncedRandom);
Log.Write("sync", "SharedRandom: {0} (#{1})", r.SyncedRandom, r.TotalCount);
Log.Write("sync", "Synced Traits:");
foreach (var a in r.Traits)
{
Log.Write("sync", "\t {0} {1} {2} {3} ({4})".F(
a.ActorID,
a.Type,
@@ -68,6 +167,11 @@ namespace OpenRA.Network
a.Trait,
a.Hash
));
foreach (var f in a.Fields)
Log.Write("sync", "\t\t {0}: {1}".F(f.Key, f.Value));
}
return;
}
Log.Write("sync", "No sync report available!");
@@ -77,6 +181,7 @@ namespace OpenRA.Network
{
public int Frame;
public int SyncedRandom;
public int TotalCount;
public List<TraitReport> Traits = new List<TraitReport>();
}
@@ -87,6 +192,7 @@ namespace OpenRA.Network
public string Owner;
public string Trait;
public int Hash;
public Dictionary<string, string> Fields;
}
}

146
OpenRA.Game/Network/UPnP.cs Normal file
View File

@@ -0,0 +1,146 @@
#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 Mono.Nat;
using Mono.Nat.Pmp;
using Mono.Nat.Upnp;
namespace OpenRA.Network
{
class UPnP
{
public static INatDevice NatDevice;
public static void TryNatDiscovery()
{
try
{
NatUtility.Logger = Log.Channels["server"].Writer;
NatUtility.Verbose = Game.Settings.Server.VerboseNatDiscovery;
NatUtility.DeviceFound += DeviceFound;
NatUtility.DeviceLost += DeviceLost;
Game.Settings.Server.NatDeviceAvailable = false;
NatUtility.StartDiscovery();
Log.Write("server", "NAT discovery started.");
}
catch (Exception e)
{
Log.Write("server", "Can't discover UPnP-enabled device: {0}", e);
Game.Settings.Server.NatDeviceAvailable = false;
Game.Settings.Server.AllowPortForward = false;
}
}
public static void TryStoppingNatDiscovery()
{
Log.Write("server", "Stopping NAT discovery.");
try
{
NatUtility.StopDiscovery();
}
catch (Exception e)
{
Log.Write("server", "Failed to stop NAT device discovery: {0}", e);
Game.Settings.Server.NatDeviceAvailable = false;
Game.Settings.Server.AllowPortForward = false;
}
if (NatDevice == null)
{
Log.Write("server", "No NAT devices with UPnP enabled found within {0} ms deadline. Disabling automatic port forwarding.".F(Game.Settings.Server.NatDiscoveryTimeout));
Game.Settings.Server.NatDeviceAvailable = false;
Game.Settings.Server.AllowPortForward = false;
}
}
public static void DeviceFound(object sender, DeviceEventArgs args)
{
if (args.Device == null)
return;
Log.Write("server", "NAT device discovered.");
Game.Settings.Server.NatDeviceAvailable = true;
Game.Settings.Server.AllowPortForward = true;
try
{
NatDevice = args.Device;
Log.Write("server", "Type: {0}", NatDevice.GetType());
Log.Write("server", "Your external IP is: {0}", NatDevice.GetExternalIP());
foreach (var mp in NatDevice.GetAllMappings())
Log.Write("server", "Existing port mapping: protocol={0}, public={1}, private={2}",
mp.Protocol, mp.PublicPort, mp.PrivatePort);
}
catch (Exception e)
{
Log.Write("server", "Can't fetch information from NAT device: {0}", e);
Game.Settings.Server.NatDeviceAvailable = false;
Game.Settings.Server.AllowPortForward = false;
}
}
public static void DeviceLost(object sender, DeviceEventArgs args)
{
Log.Write("server", "NAT device lost.");
if (args.Device == null)
return;
try
{
NatDevice = args.Device;
Log.Write("server", "Type: {0}", NatDevice.GetType());
}
catch (Exception e)
{
Log.Write("server", "Can't fetch type from lost NAT device: {0}", e);
}
Game.Settings.Server.NatDeviceAvailable = false;
Game.Settings.Server.AllowPortForward = false;
}
public static void ForwardPort()
{
try
{
var mapping = new Mapping(Protocol.Tcp, Game.Settings.Server.ExternalPort, Game.Settings.Server.ListenPort);
NatDevice.CreatePortMap(mapping);
Log.Write("server", "Create port mapping: protocol={0}, public={1}, private={2}", mapping.Protocol, mapping.PublicPort, mapping.PrivatePort);
}
catch (Exception e)
{
Log.Write("server", "Can not forward ports via UPnP: {0}", e);
Game.Settings.Server.AllowPortForward = false;
}
}
public static void RemovePortforward()
{
try
{
var mapping = new Mapping(Protocol.Tcp, Game.Settings.Server.ExternalPort, Game.Settings.Server.ListenPort);
NatDevice.DeletePortMap(mapping);
Log.Write("server", "Remove port mapping: protocol={0}, public={1}, private={2}", mapping.Protocol, mapping.PublicPort, mapping.PrivatePort);
}
catch (Exception e)
{
Log.Write("server", "Can not remove UPnP portforwarding rules: {0}", e);
Game.Settings.Server.AllowPortForward = false;
}
}
}
}

View File

@@ -20,7 +20,7 @@ namespace OpenRA.Network
{
static Player FindPlayerByClient(this World world, Session.Client c)
{
/* todo: this is still a hack.
/* TODO: this is still a hack.
* the cases we're trying to avoid are the extra players on the host's client -- Neutral, other MapPlayers,..*/
return world.Players.FirstOrDefault(
p => (p.ClientIndex == c.Index && p.PlayerReference.Playable));
@@ -44,6 +44,7 @@ namespace OpenRA.Network
{
var player = world != null ? world.FindPlayerByClient(client) : null;
var suffix = (player != null && player.WinState == WinState.Lost) ? " (Dead)" : "";
suffix = client.IsObserver ? " (Spectator)" : suffix;
Game.AddChatLine(client.ColorRamp.GetColor(0), client.Name + suffix, order.TargetString);
}
else
@@ -69,7 +70,7 @@ namespace OpenRA.Network
{
if (world == null)
{
if (client.Team == orderManager.LocalClient.Team)
if (orderManager.LocalClient != null && client.Team == orderManager.LocalClient.Team)
Game.AddChatLine(client.ColorRamp.GetColor(0), client.Name + " (Team)",
order.TargetString);
}
@@ -94,16 +95,20 @@ namespace OpenRA.Network
Game.StartGame(orderManager.LobbyInfo.GlobalSettings.Map, false);
break;
}
case "PauseGame":
{
{
var client = orderManager.LobbyInfo.ClientWithIndex(clientId);
if(client != null)
if (client != null)
{
orderManager.GamePaused = !orderManager.GamePaused;
var pausetext = "The game is {0} by {1}".F( orderManager.GamePaused ? "paused" : "un-paused", client.Name );
Game.AddChatLine(Color.White, "", pausetext);
var pause = order.TargetString == "Pause";
if (orderManager.world.Paused != pause && !world.LobbyInfo.IsSinglePlayer)
{
var pausetext = "The game is {0} by {1}".F(pause ? "paused" : "un-paused", client.Name);
Game.AddChatLine(Color.White, "", pausetext);
}
orderManager.world.Paused = pause;
}
break;
}
@@ -111,14 +116,24 @@ namespace OpenRA.Network
case "HandshakeRequest":
{
var request = HandshakeRequest.Deserialize(order.TargetString);
var localMods = orderManager.LobbyInfo.GlobalSettings.Mods.Select(m => "{0}@{1}".F(m,Mod.AllMods[m].Version)).ToArray();
// Check if mods match
if (localMods.FirstOrDefault().ToString().Split('@')[0] != request.Mods.FirstOrDefault().ToString().Split('@')[0])
throw new InvalidOperationException("Server's mod ({0}) and yours ({1}) don't match".F(localMods.FirstOrDefault().ToString().Split('@')[0], request.Mods.FirstOrDefault().ToString().Split('@')[0]));
// Check that the map exists on the client
if (!Game.modData.AvailableMaps.ContainsKey(request.Map))
throw new InvalidOperationException("Missing map {0}".F(request.Map));
{
if (Game.Settings.Game.AllowDownloading)
Game.DownloadMap(request.Map);
else
throw new InvalidOperationException("Missing map {0}".F(request.Map));
}
var info = new Session.Client()
{
Name = Game.Settings.Player.Name,
PreferredColorRamp = Game.Settings.Player.ColorRamp,
ColorRamp = Game.Settings.Player.ColorRamp,
Country = "random",
SpawnPoint = 0,
@@ -126,7 +141,6 @@ namespace OpenRA.Network
State = Session.ClientState.NotReady
};
var localMods = orderManager.LobbyInfo.GlobalSettings.Mods.Select(m => "{0}@{1}".F(m,Mod.AllMods[m].Version)).ToArray();
var response = new HandshakeResponse()
{
Client = info,
@@ -150,8 +164,7 @@ namespace OpenRA.Network
&& !orderManager.GameStarted)
{
orderManager.FramesAhead = orderManager.LobbyInfo.GlobalSettings.OrderLatency;
Game.Debug(
"Order lag is now {0} frames.".F(orderManager.LobbyInfo.GlobalSettings.OrderLatency));
Game.Debug("Order lag is now {0} frames.".F(orderManager.LobbyInfo.GlobalSettings.OrderLatency));
}
Game.SyncLobbyInfo();
break;
@@ -159,7 +172,7 @@ namespace OpenRA.Network
case "SetStance":
{
if (Game.orderManager.LobbyInfo.GlobalSettings.LockTeams)
if (!Game.orderManager.LobbyInfo.GlobalSettings.FragileAlliances)
return;
var targetPlayer = order.Player.World.Players.FirstOrDefault(p => p.InternalName == order.TargetString);
@@ -177,6 +190,11 @@ namespace OpenRA.Network
Game.Debug("{0} has reciprocated",targetPlayer.PlayerName);
}
break;
}
case "Ping":
{
orderManager.IssueOrder(Order.Pong(order.TargetString));
break;
}
default:
@@ -198,8 +216,8 @@ namespace OpenRA.Network
{
var oldStance = p.Stances[target];
p.Stances[target] = s;
if (target == w.LocalPlayer)
w.WorldActor.Trait<Shroud>().UpdatePlayerStance(w, p, oldStance, s);
target.Shroud.UpdatePlayerStance(w, p, oldStance, s);
p.Shroud.UpdatePlayerStance(w, target, oldStance, s);
foreach (var nsc in w.ActorsWithTrait<INotifyStanceChanged>())
nsc.Trait.StanceChanged(nsc.Actor, p, target, oldStance, s);

28
OpenRA.Game/OpenRA.Game.csproj Executable file → Normal file
View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -60,15 +60,20 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="Tao.FreeType, Version=2.3.5.0, Culture=neutral, PublicKeyToken=e499629dc69cd531">
<Reference Include="SharpFont">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\thirdparty\Tao\Tao.FreeType.dll</HintPath>
<HintPath>..\thirdparty\SharpFont.dll</HintPath>
</Reference>
<Reference Include="Mono.Nat, Version=1.1.0.0, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<Private>False</Private>
<Package>mono.nat</Package>
<HintPath>..\thirdparty\Mono.Nat.dll</HintPath>
</Reference>
<Reference Include="Tao.OpenAl, Version=1.1.0.1, Culture=neutral, PublicKeyToken=a7579dda88828311">
<SpecificVersion>False</SpecificVersion>
@@ -80,10 +85,10 @@
<Compile Include="ActorInitializer.cs" />
<Compile Include="ActorMap.cs" />
<Compile Include="ActorReference.cs" />
<Compile Include="Graphics\QuadRenderer.cs" />
<Compile Include="PSubVec.cs" />
<Compile Include="PSubPos.cs" />
<Compile Include="PVecInt.cs" />
<Compile Include="PVecFloat.cs" />
<Compile Include="PPos.cs" />
<Compile Include="Download.cs" />
<Compile Include="Effects\DelayedAction.cs" />
@@ -94,7 +99,7 @@
<Compile Include="GameRules\MusicInfo.cs" />
<Compile Include="GameRules\Rules.cs" />
<Compile Include="GameRules\Settings.cs" />
<Compile Include="GameRules\VoiceInfo.cs" />
<Compile Include="GameRules\SoundInfo.cs" />
<Compile Include="GameRules\WeaponInfo.cs" />
<Compile Include="Graphics\Animation.cs" />
<Compile Include="Graphics\AnimationWithOffset.cs" />
@@ -151,7 +156,6 @@
<Compile Include="Server\Server.cs" />
<Compile Include="Server\ServerOrder.cs" />
<Compile Include="Server\TraitInterfaces.cs" />
<Compile Include="Server\UPnP.cs" />
<Compile Include="Sound.cs" />
<Compile Include="Support\Arguments.cs" />
<Compile Include="Support\PerfHistory.cs" />
@@ -167,7 +171,6 @@
<Compile Include="Traits\Health.cs" />
<Compile Include="Traits\LintAttributes.cs" />
<Compile Include="Traits\Player\DeveloperMode.cs" />
<Compile Include="Traits\Player\EvaAlerts.cs" />
<Compile Include="Traits\Player\PlayerResources.cs" />
<Compile Include="Traits\Render\RenderSimple.cs" />
<Compile Include="Traits\RevealsShroud.cs" />
@@ -196,6 +199,7 @@
<Compile Include="Widgets\GridLayout.cs" />
<Compile Include="Widgets\ImageWidget.cs" />
<Compile Include="Widgets\LabelWidget.cs" />
<Compile Include="Widgets\LineGraphWidget.cs" />
<Compile Include="Widgets\ListLayout.cs" />
<Compile Include="Widgets\MapPreviewWidget.cs" />
<Compile Include="Widgets\PasswordFieldWidget.cs" />
@@ -216,6 +220,10 @@
<Compile Include="World.cs" />
<Compile Include="WorldUtils.cs" />
<Compile Include="Network\ReplayRecorderConnection.cs" />
<Compile Include="Widgets\TooltipContainerWidget.cs" />
<Compile Include="Traits\DebugPauseState.cs" />
<Compile Include="Network\UPnP.cs" />
<Compile Include="Widgets\ClientTooltipRegionWidget.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">
@@ -261,4 +269,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -17,7 +17,7 @@ namespace OpenRA.Orders
{
class UnitOrderGenerator : IOrderGenerator
{
public IEnumerable<Order> Order( World world, CPos xy, MouseInput mi )
public IEnumerable<Order> Order(World world, CPos xy, MouseInput mi)
{
var underCursor = world.FindUnitsAtMouse(mi.Location)
.Where(a => a.HasTrait<ITargetable>())
@@ -41,9 +41,9 @@ namespace OpenRA.Orders
yield return CheckSameOrder(o.iot, o.trait.IssueOrder(o.self, o.iot, o.target, mi.Modifiers.HasModifier(Modifiers.Shift)));
}
public void Tick( World world ) { }
public void RenderBeforeWorld( WorldRenderer wr, World world ) { }
public void RenderAfterWorld( WorldRenderer wr, World world ) { }
public void Tick(World world) { }
public void RenderBeforeWorld(WorldRenderer wr, World world) { }
public void RenderAfterWorld(WorldRenderer wr, World world) { }
public string GetCursor(World world, CPos xy, MouseInput mi)
{
@@ -54,9 +54,12 @@ namespace OpenRA.Orders
.OrderByDescending(a => a.SelectionPriority())
.FirstOrDefault();
if (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any())
if (underCursor != null && underCursor.HasTrait<Selectable>())
if (underCursor != null && (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any()))
{
var selectable = underCursor.TraitOrDefault<Selectable>();
if (selectable != null && selectable.Info.Selectable)
useSelect = true;
}
var orders = world.Selection.Actors
.Select(a => OrderForUnit(a, xy, mi, underCursor))
@@ -75,35 +78,35 @@ namespace OpenRA.Orders
if (self.Destroyed)
return null;
if( mi.Button == MouseButton.Right )
if (mi.Button == Game.mouseButtonPreference.Action)
{
foreach( var o in self.TraitsImplementing<IIssueOrder>()
.SelectMany( trait => trait.Orders
.Select( x => new { Trait = trait, Order = x } ) )
.OrderByDescending( x => x.Order.OrderPriority ) )
.SelectMany(trait => trait.Orders
.Select(x => new { Trait = trait, Order = x } ))
.OrderByDescending(x => x.Order.OrderPriority))
{
var actorsAt = self.World.ActorMap.GetUnitsAt( xy ).ToList();
var actorsAt = self.World.ActorMap.GetUnitsAt(xy).ToList();
var forceAttack = mi.Modifiers.HasModifier(Modifiers.Ctrl);
var forceQueue = mi.Modifiers.HasModifier(Modifiers.Shift);
string cursor = null;
if( underCursor != null )
if (underCursor != null)
if (o.Order.CanTargetActor(self, underCursor, forceAttack, forceQueue, ref cursor))
return new UnitOrderResult( self, o.Order, o.Trait, cursor, Target.FromActor( underCursor ) );
return new UnitOrderResult(self, o.Order, o.Trait, cursor, Target.FromActor(underCursor));
if (o.Order.CanTargetLocation(self, xy, actorsAt, forceAttack, forceQueue, ref cursor))
return new UnitOrderResult( self, o.Order, o.Trait, cursor, Target.FromCell( xy ) );
return new UnitOrderResult(self, o.Order, o.Trait, cursor, Target.FromCell(xy));
}
}
return null;
}
static Order CheckSameOrder( IOrderTargeter iot, Order order )
static Order CheckSameOrder(IOrderTargeter iot, Order order)
{
if( order == null && iot.OrderID != null )
Game.Debug( "BUG: in order targeter - decided on {0} but then didn't order", iot.OrderID );
else if( iot.OrderID != order.OrderString )
Game.Debug( "BUG: in order targeter - decided on {0} but ordered {1}", iot.OrderID, order.OrderString );
if (order == null && iot.OrderID != null)
Game.Debug("BUG: in order targeter - decided on {0} but then didn't order", iot.OrderID);
else if (iot.OrderID != order.OrderString)
Game.Debug("BUG: in order targeter - decided on {0} but ordered {1}", iot.OrderID, order.OrderString);
return order;
}
@@ -115,7 +118,7 @@ namespace OpenRA.Orders
public readonly string cursor;
public readonly Target target;
public UnitOrderResult( Actor self, IOrderTargeter iot, IIssueOrder trait, string cursor, Target target )
public UnitOrderResult(Actor self, IOrderTargeter iot, IIssueOrder trait, string cursor, Target target)
{
this.self = self;
this.iot = iot;

View File

@@ -23,11 +23,22 @@ namespace OpenRA
public PPos(int x, int y) { X = x; Y = y; }
public static readonly PPos Zero = new PPos(0, 0);
public static PPos FromWPos(WPos pos)
{
return new PPos(Game.CellSize*pos.X/1024, Game.CellSize*pos.Y/1024);
}
// Temporary hack for things that throw away altitude and
// cache screen positions directly. This can go once all
// the callers understand world coordinates
public static PPos FromWPosHackZ(WPos pos)
{
return new PPos(Game.CellSize*pos.X/1024, Game.CellSize*(pos.Y - pos.Z)/1024);
}
public static explicit operator PPos(int2 a) { return new PPos(a.X, a.Y); }
public static explicit operator PVecInt(PPos a) { return new PVecInt(a.X, a.Y); }
public static explicit operator PVecFloat(PPos a) { return new PVecFloat(a.X, a.Y); }
public static PPos operator +(PPos a, PVecInt b) { return new PPos(a.X + b.X, a.Y + b.Y); }
public static PVecInt operator -(PPos a, PPos b) { return new PVecInt(a.X - b.X, a.Y - b.Y); }
@@ -44,6 +55,25 @@ namespace OpenRA
return a + ((PVecInt)(b - a) * mul / div);
}
public static PPos Average(params PPos[] list)
{
if (list == null || list.Length == 0)
throw new ArgumentException("PPos: Cannot calculate average of empty list.");
var x = 0;
var y = 0;
foreach(var pos in list)
{
x += pos.X;
y += pos.Y;
}
x /= list.Length;
y /= list.Length;
return new PPos(x,y);
}
public float2 ToFloat2() { return new float2(X, Y); }
public int2 ToInt2() { return new int2(X, Y); }
public CPos ToCPos() { return new CPos((int)(1f / Game.CellSize * X), (int)(1f / Game.CellSize * Y)); }
@@ -55,6 +85,13 @@ namespace OpenRA
Math.Min(r.Bottom, Math.Max(Y, r.Top)));
}
public WPos ToWPos(int z)
{
return new WPos(1024*X/Game.CellSize,
1024*Y/Game.CellSize,
1024*z/Game.CellSize);
}
public override int GetHashCode() { return X.GetHashCode() ^ Y.GetHashCode(); }
public override bool Equals(object obj)

View File

@@ -29,7 +29,6 @@ namespace OpenRA
public static explicit operator PSubPos(int2 a) { return new PSubPos(a.X, a.Y); }
public static explicit operator PSubVec(PSubPos a) { return new PSubVec(a.X, a.Y); }
public static explicit operator PVecFloat(PSubPos a) { return new PVecFloat(a.X, a.Y); }
public static PSubPos operator +(PSubPos a, PSubVec b) { return new PSubPos(a.X + b.X, a.Y + b.Y); }
public static PSubVec operator -(PSubPos a, PSubPos b) { return new PSubVec(a.X - b.X, a.Y - b.Y); }

View File

@@ -94,10 +94,5 @@ namespace OpenRA
{
return new PSubVec((vec.X * PSubPos.PerPx), (vec.Y * PSubPos.PerPx));
}
public static PSubVec ToPSubVec(this PVecFloat vec)
{
return new PSubVec((int)(vec.X * PSubPos.PerPx), (int)(vec.Y * PSubPos.PerPx));
}
}
}

View File

@@ -1,97 +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;
using System.Drawing;
namespace OpenRA
{
/// <summary>
/// Pixel coordinate vector (fine; float)
/// </summary>
public struct PVecFloat
{
public readonly float X, Y;
public PVecFloat(float x, float y) { X = x; Y = y; }
public PVecFloat(Size p) { X = p.Width; Y = p.Height; }
public static readonly PVecFloat Zero = new PVecFloat(0, 0);
public static explicit operator PVecInt(PVecFloat a) { return new PVecInt((int)a.X, (int)a.Y); }
public static explicit operator PVecFloat(float2 a) { return new PVecFloat(a.X, a.Y); }
public static PVecFloat operator +(PVecFloat a, PVecFloat b) { return new PVecFloat(a.X + b.X, a.Y + b.Y); }
public static PVecFloat operator -(PVecFloat a, PVecFloat b) { return new PVecFloat(a.X - b.X, a.Y - b.Y); }
public static PVecFloat operator *(float a, PVecFloat b) { return new PVecFloat(a * b.X, a * b.Y); }
public static PVecFloat operator *(PVecFloat b, float a) { return new PVecFloat(a * b.X, a * b.Y); }
public static PVecFloat operator /(PVecFloat a, float b) { return new PVecFloat(a.X / b, a.Y / b); }
public static PVecFloat operator -(PVecFloat a) { return new PVecFloat(-a.X, -a.Y); }
public static bool operator ==(PVecFloat me, PVecFloat other) { return (me.X == other.X && me.Y == other.Y); }
public static bool operator !=(PVecFloat me, PVecFloat other) { return !(me == other); }
public static PVecFloat Max(PVecFloat a, PVecFloat b) { return new PVecFloat(Math.Max(a.X, b.X), Math.Max(a.Y, b.Y)); }
public static PVecFloat Min(PVecFloat a, PVecFloat b) { return new PVecFloat(Math.Min(a.X, b.X), Math.Min(a.Y, b.Y)); }
public static float Dot(PVecFloat a, PVecFloat b) { return a.X * b.X + a.Y * b.Y; }
public static PVecFloat FromAngle(float a) { return new PVecFloat((float)Math.Sin(a), (float)Math.Cos(a)); }
public static PVecFloat Lerp(PVecFloat a, PVecFloat b, float t)
{
return new PVecFloat(
float2.Lerp(a.X, b.X, t),
float2.Lerp(a.Y, b.Y, t)
);
}
public static PVecFloat Lerp(PVecFloat a, PVecFloat b, PVecFloat t)
{
return new PVecFloat(
float2.Lerp(a.X, b.X, t.X),
float2.Lerp(a.Y, b.Y, t.Y)
);
}
public PVecFloat Sign() { return new PVecFloat(Math.Sign(X), Math.Sign(Y)); }
public PVecFloat Abs() { return new PVecFloat(Math.Abs(X), Math.Abs(Y)); }
public PVecFloat Round() { return new PVecFloat((float)Math.Round(X), (float)Math.Round(Y)); }
public float LengthSquared { get { return X * X + Y * Y; } }
public float Length { get { return (float)Math.Sqrt(LengthSquared); } }
public float2 ToFloat2() { return new float2(X, Y); }
public int2 ToInt2() { return new int2((int)X, (int)Y); }
static float Constrain(float x, float a, float b) { return x < a ? a : x > b ? b : x; }
public PVecFloat Constrain(PVecFloat min, PVecFloat max)
{
return new PVecFloat(
Constrain(X, min.X, max.X),
Constrain(Y, min.Y, max.Y)
);
}
public override int GetHashCode() { return X.GetHashCode() ^ Y.GetHashCode(); }
public override bool Equals(object obj)
{
if (obj == null)
return false;
PVecFloat o = (PVecFloat)obj;
return o == this;
}
public override string ToString() { return "({0},{1})".F(X, Y); }
}
}

View File

@@ -26,7 +26,6 @@ namespace OpenRA
public static readonly PVecInt Zero = new PVecInt(0, 0);
public static PVecInt OneCell { get { return new PVecInt(Game.CellSize, Game.CellSize); } }
public static implicit operator PVecFloat(PVecInt a) { return new PVecFloat((float)a.X, (float)a.Y); }
public static explicit operator PVecInt(int2 a) { return new PVecInt(a.X, a.Y); }
public static PVecInt FromRadius(int r) { return new PVecInt(r, r); }

View File

@@ -36,7 +36,7 @@ namespace OpenRA
public readonly PlayerReference PlayerReference;
public bool IsBot;
public Shroud Shroud { get { return World.LocalShroud; } }
public Shroud Shroud;
public World World { get; private set; }
static CountryInfo ChooseCountry(World world, string name)
@@ -68,7 +68,7 @@ namespace OpenRA
else
{
// Map player
ClientIndex = 0; // Owned by the host (todo: fix this)
ClientIndex = 0; // Owned by the host (TODO: fix this)
ColorRamp = pr.ColorRamp;
PlayerName = pr.Name;
NonCombatant = pr.NonCombatant;
@@ -76,6 +76,7 @@ namespace OpenRA
Country = ChooseCountry(world, pr.Race);
}
PlayerActor = world.CreateActor("Player", new TypeDictionary { new OwnerInit(this) });
Shroud = PlayerActor.Trait<Shroud>();
// Enable the bot logic on the host
IsBot = botType != null;
@@ -90,11 +91,16 @@ namespace OpenRA
}
}
public void GiveAdvice(string advice)
public override string ToString()
{
Sound.PlayToPlayer(this, advice);
return "{0} ({1})".F(PlayerName, ClientIndex);
}
public Dictionary<Player, Stance> Stances = new Dictionary<Player, Stance>();
public bool IsAlliedWith(Player p)
{
// Observers are considered as allies
return p == null || Stances[p] == Stance.Ally;
}
}
}

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,
@@ -36,7 +36,7 @@ namespace OpenRA
if (isClick)
{
var adjNewSelection = newSelection.Take(1); /* todo: select BEST, not FIRST */
var adjNewSelection = newSelection.Take(1); /* TODO: select BEST, not FIRST */
actors = (isCombine ? oldSelection.SymmetricDifference(adjNewSelection) : adjNewSelection).ToList();
}
else
@@ -64,7 +64,7 @@ namespace OpenRA
Cache<int, List<Actor>> controlGroups = new Cache<int, List<Actor>>(_ => new List<Actor>());
public void DoControlGroup(World world, int group, Modifiers mods)
public void DoControlGroup(World world, int group, Modifiers mods, int MultiTapCount)
{
var addModifier = Platform.CurrentPlatform == PlatformType.OSX ? Modifiers.Meta : Modifiers.Ctrl;
if (mods.HasModifier(addModifier))
@@ -82,7 +82,7 @@ namespace OpenRA
return;
}
if (mods.HasModifier(Modifiers.Alt))
if (mods.HasModifier(Modifiers.Alt) || MultiTapCount >= 2)
{
Game.viewport.Center(controlGroups[group]);
return;

View File

@@ -12,6 +12,8 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Threading;
namespace OpenRA.Server
{
@@ -22,7 +24,6 @@ namespace OpenRA.Server
public ReceiveState State = ReceiveState.Header;
public int ExpectLength = 8;
public int Frame = 0;
public int MostRecentFrame = 0;
/* client data */
@@ -97,7 +98,8 @@ namespace OpenRA.Server
} break;
}
}
}}
}
}
public enum ReceiveState { Header, Data };
}

View File

@@ -16,8 +16,8 @@ using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using UPnP;
using System.Threading;
using OpenRA.FileFormats;
using OpenRA.GameRules;
using OpenRA.Network;
@@ -26,6 +26,13 @@ using XTimer = System.Timers.Timer;
namespace OpenRA.Server
{
public enum ServerState : int
{
WaitingPlayers = 1,
GameStarted = 2,
ShuttingDown = 3
}
public class Server
{
// Valid player connections
@@ -40,9 +47,10 @@ namespace OpenRA.Server
TypeDictionary ServerTraits = new TypeDictionary();
public Session lobbyInfo;
public bool GameStarted = false;
public readonly IPAddress Ip;
public readonly int Port;
int randomSeed;
public readonly Thirdparty.Random Random = new Thirdparty.Random();
@@ -51,13 +59,29 @@ namespace OpenRA.Server
public Map Map;
XTimer gameTimeout;
volatile bool shutdown = false;
public void Shutdown() { shutdown = true; }
protected volatile ServerState pState = new ServerState();
public ServerState State
{
get { return pState; }
protected set { pState = value; }
}
public void Shutdown()
{
State = ServerState.ShuttingDown;
}
public void EndGame()
{
foreach (var t in ServerTraits.WithInterface<IEndGame>())
t.GameEnded(this);
}
public Server(IPEndPoint endpoint, string[] mods, ServerSettings settings, ModData modData)
{
Log.AddChannel("server", "server.log");
pState = ServerState.WaitingPlayers;
listener = new TcpListener(endpoint);
listener.Start();
var localEndpoint = (IPEndPoint)listener.LocalEndpoint;
@@ -69,8 +93,8 @@ namespace OpenRA.Server
randomSeed = (int)DateTime.Now.ToBinary();
if (settings.AllowUPnP)
PortForward();
if (Settings.AllowPortForward)
UPnP.ForwardPort();
foreach (var trait in modData.Manifest.ServerTraits)
ServerTraits.Add( modData.ObjectCreator.CreateObject<ServerTrait>(trait) );
@@ -80,6 +104,7 @@ namespace OpenRA.Server
lobbyInfo.GlobalSettings.Map = settings.Map;
lobbyInfo.GlobalSettings.ServerName = settings.Name;
lobbyInfo.GlobalSettings.Ban = settings.Ban;
lobbyInfo.GlobalSettings.Dedicated = settings.Dedicated;
foreach (var t in ServerTraits.WithInterface<INotifyServerStart>())
t.ServerStarted(this);
@@ -95,32 +120,43 @@ namespace OpenRA.Server
var timeout = ServerTraits.WithInterface<ITick>().Min(t => t.TickTimeout);
for( ; ; )
{
var checkRead = new ArrayList();
var checkRead = new List<Socket>();
checkRead.Add( listener.Server );
foreach( var c in conns ) checkRead.Add( c.socket );
foreach( var c in preConns ) checkRead.Add( c.socket );
Socket.Select( checkRead, null, null, timeout );
if (shutdown)
if (State == ServerState.ShuttingDown)
{
EndGame();
break;
}
foreach( Socket s in checkRead )
foreach( var s in checkRead )
if( s == listener.Server ) AcceptConnection();
else if (preConns.Count > 0)
{
var p = preConns.SingleOrDefault( c => c.socket == s );
if (p != null) p.ReadData( this );
}
else if (conns.Count > 0) conns.Single( c => c.socket == s ).ReadData( this );
else if (conns.Count > 0)
{
var conn = conns.SingleOrDefault( c => c.socket == s );
if (conn != null) conn.ReadData( this );
}
foreach (var t in ServerTraits.WithInterface<ITick>())
t.Tick(this);
if (shutdown)
if (State == ServerState.ShuttingDown)
{
EndGame();
if (Settings.AllowPortForward)
UPnP.RemovePortforward();
break;
}
}
GameStarted = false;
foreach (var t in ServerTraits.WithInterface<INotifyServerShutdown>())
t.ServerShutdown(this);
@@ -129,23 +165,10 @@ namespace OpenRA.Server
try { listener.Stop(); }
catch { }
} ) { IsBackground = true }.Start();
}
void PortForward()
{
if (UPnP.NAT.Discover())
{
Log.Write("server", "UPnP-enabled router discovered.");
UPnP.NAT.ForwardPort(Port, ProtocolType.Tcp, "OpenRA"); //might timeout after second try
Log.Write("server", "Port {0} (TCP) has been forwarded.", Port);
Log.Write("server", "Your IP is: {0}", UPnP.NAT.GetExternalIP() );
}
else
Log.Write("server", "No UPnP-enabled router detected.");
return;
}
/* lobby rework todo:
/* lobby rework TODO:
* - "teams together" option for team games -- will eliminate most need
* for manual spawnpoint choosing.
*/
@@ -198,7 +221,7 @@ namespace OpenRA.Server
{
try
{
if (GameStarted)
if (State == ServerState.GameStarted)
{
Log.Write("server", "Rejected connection from {0}; game is already started.",
newConn.socket.RemoteEndPoint);
@@ -213,12 +236,11 @@ namespace OpenRA.Server
var mods = handshake.Mods;
// Check that the client has compatible mods
var valid = mods.All( m => m.Contains('@')) && //valid format
mods.Count() == Game.CurrentMods.Count() && //same number
mods.Select( m => Pair.New(m.Split('@')[0], m.Split('@')[1])).All(kv => Game.CurrentMods.ContainsKey(kv.First) &&
(kv.Second == "{DEV_VERSION}" || Game.CurrentMods[kv.First].Version == "{DEV_VERSION}" || kv.Second == Game.CurrentMods[kv.First].Version));
var validMod = mods.All(m => m.Contains('@')) && //valid format
mods.Count() == Game.CurrentMods.Count() && //same number
mods.Select(m => Pair.New(m.Split('@')[0], m.Split('@')[1])).All(kv => Game.CurrentMods.ContainsKey(kv.First));
if (!valid)
if (!validMod)
{
Log.Write("server", "Rejected connection from {0}; mods do not match.",
newConn.socket.RemoteEndPoint);
@@ -228,11 +250,26 @@ namespace OpenRA.Server
return;
}
var validVersion = mods.Select(m => Pair.New(m.Split('@')[0], m.Split('@')[1])).All(
kv => kv.Second == Game.CurrentMods[kv.First].Version);
if (!validVersion && !lobbyInfo.GlobalSettings.AllowVersionMismatch)
{
Log.Write("server", "Rejected connection from {0}; Not running the same version.",
newConn.socket.RemoteEndPoint);
SendOrderTo(newConn, "ServerError", "Not running the same version.");
DropClient(newConn);
return;
}
client.IpAddress = ((IPEndPoint)newConn.socket.RemoteEndPoint).Address.ToString();
// Check if IP is banned
if (lobbyInfo.GlobalSettings.Ban != null)
{
var remote_addr = ((IPEndPoint)newConn.socket.RemoteEndPoint).Address.ToString();
if (lobbyInfo.GlobalSettings.Ban.Contains(remote_addr))
if (lobbyInfo.GlobalSettings.Ban.Contains(client.IpAddress))
{
Console.WriteLine("Rejected connection from "+client.Name+"("+newConn.socket.RemoteEndPoint+"); Banned.");
Log.Write("server", "Rejected connection from {0}; Banned.",
@@ -255,12 +292,15 @@ namespace OpenRA.Server
SyncClientToPlayerReference(client, Map.Players[client.Slot]);
lobbyInfo.Clients.Add(client);
//Assume that first validated client is server admin
if(lobbyInfo.Clients.Count==1)
// Assume that first validated client is server admin
if (lobbyInfo.Clients.Where(c1 => c1.Bot == null).Count() == 1)
client.IsAdmin=true;
Log.Write("server", "Client {0}: Accepted connection from {1}",
newConn.PlayerIndex, newConn.socket.RemoteEndPoint);
OpenRA.Network.Session.Client clientAdmin = lobbyInfo.Clients.Where(c1 => c1.IsAdmin).Single();
Log.Write("server", "Client {0}: Accepted connection from {1}.",
newConn.PlayerIndex, newConn.socket.RemoteEndPoint);
foreach (var t in ServerTraits.WithInterface<IClientJoined>())
t.ClientJoined(this, newConn);
@@ -268,9 +308,26 @@ namespace OpenRA.Server
SyncLobbyInfo();
SendChat(newConn, "has joined the game.");
// Send initial ping
SendOrderTo(newConn, "Ping", Environment.TickCount.ToString());
if (File.Exists("{0}motd_{1}.txt".F(Platform.SupportDir, lobbyInfo.GlobalSettings.Mods[0])))
{
var motd = System.IO.File.ReadAllText("{0}motd_{1}.txt".F(Platform.SupportDir, lobbyInfo.GlobalSettings.Mods[0]));
SendChatTo(newConn, motd);
}
if (lobbyInfo.GlobalSettings.Dedicated)
{
if (client.IsAdmin)
SendChatTo(newConn, " You are admin now!");
else
SendChatTo(newConn, " Current admin is {0}".F(clientAdmin.Name));
}
if (mods.Any(m => m.Contains("{DEV_VERSION}")))
SendChat(newConn, "is running a development version, "+
"and may cause desync if they have any incompatible changes.");
SendChat(newConn, "is running a non-versioned development build, "+
"and may cause desync if it contains any incompatible changes.");
}
catch (Exception) { DropClient(newConn); }
}
@@ -281,6 +338,8 @@ namespace OpenRA.Server
return;
if (pr.LockColor)
c.ColorRamp = pr.ColorRamp;
else
c.ColorRamp = c.PreferredColorRamp;
if (pr.LockRace)
c.Country = pr.Race;
if (pr.LockSpawn)
@@ -399,12 +458,35 @@ namespace OpenRA.Server
DispatchOrdersToClient(c, fromIndex, 0, so.Serialize());
break;
case "PauseRequest":
foreach (var c in conns.ToArray())
{ var x = Order.PauseGame();
DispatchOrdersToClient(c, fromIndex, 0, x.Serialize());
}
case "PauseGame":
foreach (var c in conns.Except(conn).ToArray())
DispatchOrdersToClient(c, fromIndex, 0, so.Serialize());
break;
case "Pong":
{
int pingSent;
if (!int.TryParse(so.Data, out pingSent))
{
Log.Write("server", "Invalid order pong payload: {0}", so.Data);
break;
}
var history = fromClient.LatencyHistory.ToList();
history.Add(Environment.TickCount - pingSent);
// Cap ping history at 5 values (25 seconds)
if (history.Count > 5)
history.RemoveRange(0, history.Count - 5);
fromClient.Latency = history.Sum() / history.Count;
fromClient.LatencyJitter = (history.Max() - history.Min())/2;
fromClient.LatencyHistory = history.ToArray();
if (State == ServerState.WaitingPlayers)
SyncLobbyInfo();
break;
}
}
}
@@ -421,16 +503,35 @@ namespace OpenRA.Server
{
conns.Remove(toDrop);
SendChat(toDrop, "Connection Dropped");
if (GameStarted)
OpenRA.Network.Session.Client dropClient = lobbyInfo.Clients.Where(c1 => c1.Index == toDrop.PlayerIndex).Single();
if (State == ServerState.GameStarted)
SendDisconnected(toDrop); /* Report disconnection */
lobbyInfo.Clients.RemoveAll(c => c.Index == toDrop.PlayerIndex);
// reassign admin if necessary
if (lobbyInfo.GlobalSettings.Dedicated && dropClient.IsAdmin && State == ServerState.WaitingPlayers)
{
// clean up the bots that were added by the last admin
lobbyInfo.Clients.RemoveAll(c => c.Bot != null && c.BotControllerClientIndex == toDrop.PlayerIndex);
if (lobbyInfo.Clients.Any(c1 => c1.Bot == null))
{
// client was not alone on the server but he was admin: set admin to the last connected client
OpenRA.Network.Session.Client lastClient = lobbyInfo.Clients.Where(c1 => c1.Bot == null).Last();
lastClient.IsAdmin = true;
SendChat(toDrop, "Admin left! {0} is a new admin now!".F(lastClient.Name));
}
}
DispatchOrders( toDrop, toDrop.MostRecentFrame, new byte[] { 0xbf } );
if (conns.Count != 0)
if (conns.Count != 0 || lobbyInfo.GlobalSettings.Dedicated)
SyncLobbyInfo();
if (!lobbyInfo.GlobalSettings.Dedicated && dropClient.IsAdmin)
Shutdown();
}
try
@@ -442,7 +543,7 @@ namespace OpenRA.Server
public void SyncLobbyInfo()
{
if (!GameStarted) /* don't do this while the game is running, it breaks things. */
if (State != ServerState.GameStarted) /* don't do this while the game is running, it breaks things. */
DispatchOrders(null, 0,
new ServerOrder("SyncInfo", lobbyInfo.Serialize()).Serialize());
@@ -452,8 +553,9 @@ namespace OpenRA.Server
public void StartGame()
{
GameStarted = true;
State = ServerState.GameStarted;
listener.Stop();
Console.WriteLine("Game started");
foreach( var c in conns )
@@ -471,7 +573,7 @@ namespace OpenRA.Server
t.GameStarted(this);
// Check TimeOut
if ( Settings.TimeOut > 10000 )
if (Settings.TimeOut > 10000)
{
gameTimeout = new XTimer(Settings.TimeOut);
gameTimeout.Elapsed += (_,e) =>

View File

@@ -20,6 +20,7 @@ namespace OpenRA.Server
public interface INotifyServerShutdown { void ServerShutdown(Server server); }
public interface IStartGame { void GameStarted(Server server); }
public interface IClientJoined { void ClientJoined(Server server, Connection conn); }
public interface IEndGame { void GameEnded(Server server); }
public interface ITick
{
void Tick(Server server);
@@ -28,7 +29,7 @@ namespace OpenRA.Server
public abstract class ServerTrait {}
public class DebugServerTrait : ServerTrait, IInterpretCommand, IStartGame, INotifySyncLobbyInfo, INotifyServerStart, INotifyServerShutdown
public class DebugServerTrait : ServerTrait, IInterpretCommand, IStartGame, INotifySyncLobbyInfo, INotifyServerStart, INotifyServerShutdown, IEndGame
{
public bool InterpretCommand(Server server, Connection conn, Session.Client client, string cmd)
{
@@ -55,5 +56,10 @@ namespace OpenRA.Server
{
Console.WriteLine("ServerShutdown()");
}
public void GameEnded(Server server)
{
Console.WriteLine("GameEnded()");
}
}
}

View File

@@ -1,137 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2008-2009 http://www.codeproject.com/Members/Harold-Aptroot
* Source: http://www.codeproject.com/Articles/27992/NAT-Traversal-with-UPnP-in-C
* This file is licensed under A Public Domain dedication.
* For more information, see http://creativecommons.org/licenses/publicdomain/
*/
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Xml;
using System.IO;
namespace UPnP
{
public class NAT
{
public static TimeSpan _timeout = new TimeSpan(0, 0, 0, 3);
static string _serviceUrl;
public static bool Discover()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
string req = "M-SEARCH * HTTP/1.1\r\n" +
"HOST: 239.255.255.250:1900\r\n" +
"ST:upnp:rootdevice\r\n" +
"MAN:\"ssdp:discover\"\r\n" +
"MX:3\r\n\r\n";
byte[] data = Encoding.ASCII.GetBytes(req);
IPEndPoint ipe = new IPEndPoint(IPAddress.Broadcast, 1900);
byte[] buffer = new byte[0x1000];
DateTime start = DateTime.Now;
do
{
s.SendTo(data, ipe);
int length = 0;
do
{
length = s.Receive(buffer);
string resp = Encoding.ASCII.GetString(buffer, 0, length).ToLower();
if (resp.Contains("upnp:rootdevice"))
{
resp = resp.Substring(resp.ToLower().IndexOf("location:") + 9);
resp = resp.Substring(0, resp.IndexOf("\r")).Trim();
if (!string.IsNullOrEmpty(_serviceUrl = GetServiceUrl(resp)))
return true;
}
} while (length > 0);
} while ((start - DateTime.Now) < _timeout);
return false;
}
private static String GetServiceUrl(string resp)
{
XmlDocument desc = new XmlDocument();
desc.Load(WebRequest.Create(resp).GetResponse().GetResponseStream());
XmlNamespaceManager nsMgr = new XmlNamespaceManager(desc.NameTable);
nsMgr.AddNamespace("tns", "urn:schemas-upnp-org:device-1-0");
XmlNode typen = desc.SelectSingleNode("//tns:device/tns:deviceType/text()", nsMgr);
if (!typen.Value.Contains("InternetGatewayDevice"))
return null;
XmlNode node = desc.SelectSingleNode("//tns:service[tns:serviceType=\"urn:schemas-upnp-org:service:WANIPConnection:1\"]/tns:controlURL/text()", nsMgr);
if (node == null)
return null;
Uri respUri = new Uri(resp);
Uri combinedUri = new Uri(respUri, node.Value);
return combinedUri.AbsoluteUri;
}
public static void ForwardPort(int port, ProtocolType protocol, string description)
{
if (string.IsNullOrEmpty(_serviceUrl))
throw new Exception("No UPnP service available or Discover() has not been called");
string body = String.Format("<u:AddPortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">"+
"<NewRemoteHost></NewRemoteHost><NewExternalPort>{0}</NewExternalPort>"+
"<NewProtocol>{1}</NewProtocol><NewInternalPort>{0}</NewInternalPort>" +
"<NewInternalClient>{2}</NewInternalClient><NewEnabled>1</NewEnabled>" +
"<NewPortMappingDescription>{3}</NewPortMappingDescription>"+
"<NewLeaseDuration>0</NewLeaseDuration></u:AddPortMapping>",
port, protocol.ToString().ToUpper(),Dns.GetHostAddresses(Dns.GetHostName())[0], description);
SOAPRequest(_serviceUrl, body, "AddPortMapping");
}
public static void DeleteForwardingRule(int port, ProtocolType protocol)
{
if (string.IsNullOrEmpty(_serviceUrl))
throw new Exception("No UPnP service available or Discover() has not been called");
string body = String.Format("<u:DeletePortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">" +
"<NewRemoteHost></NewRemoteHost><NewExternalPort>{0}</NewExternalPort>"+
"<NewProtocol>{1}</NewProtocol></u:DeletePortMapping>", port, protocol.ToString().ToUpper() );
SOAPRequest(_serviceUrl, body, "DeletePortMapping");
}
public static IPAddress GetExternalIP()
{
if (string.IsNullOrEmpty(_serviceUrl))
throw new Exception("No UPnP service available or Discover() has not been called");
XmlDocument xdoc = SOAPRequest(_serviceUrl, "<u:GetExternalIPAddress xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">" +
"</u:GetExternalIPAddress>", "GetExternalIPAddress");
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xdoc.NameTable);
nsMgr.AddNamespace("tns", "urn:schemas-upnp-org:device-1-0");
string IP = xdoc.SelectSingleNode("//NewExternalIPAddress/text()", nsMgr).Value;
return IPAddress.Parse(IP);
}
private static XmlDocument SOAPRequest(string url, string soap, string function)
{
string req = "<?xml version=\"1.0\"?>" +
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" +
"<s:Body>" +
soap +
"</s:Body>" +
"</s:Envelope>";
WebRequest r = HttpWebRequest.Create(url);
r.Method = "POST";
byte[] b = Encoding.UTF8.GetBytes(req);
r.Headers.Add("SOAPACTION", "\"urn:schemas-upnp-org:service:WANIPConnection:1#" + function + "\"");
r.ContentType = "text/xml; charset=\"utf-8\"";
r.ContentLength = b.Length;
r.GetRequestStream().Write(b, 0, b.Length);
XmlDocument resp = new XmlDocument();
WebResponse wres = r.GetResponse();
Stream ress = wres.GetResponseStream();
resp.Load(ress);
return resp;
}
}
}

View File

@@ -29,6 +29,12 @@ namespace OpenRA
static ISoundSource LoadSound(string filename)
{
if (!FileSystem.Exists(filename))
{
Log.Write("debug", "LoadSound, file does not exist: {0}", filename);
return null;
}
return LoadSoundRaw(AudLoader.LoadSound(FileSystem.Open(filename)));
}
@@ -39,8 +45,9 @@ namespace OpenRA
static ISoundEngine CreateEngine(string engine)
{
engine = Game.Settings.Server.Dedicated?"Null":engine;
switch (engine)
{ /* todo: if someone cares about pluggable crap here, ship this out */
{ /* TODO: if someone cares about pluggable crap here, ship this out */
case "AL": return new OpenAlSoundEngine();
case "Null": return new NullSoundEngine();
@@ -66,14 +73,14 @@ namespace OpenRA
static ISound Play(Player player, string name, bool headRelative, PPos pos, float volumeModifier)
{
if (player != null && player != player.World.LocalPlayer)
if (String.IsNullOrEmpty(name))
return null;
if (name == "" || name == null)
if (player != null && player != player.World.LocalPlayer)
return null;
return soundEngine.Play2D(sounds[name],
false, headRelative, pos.ToFloat2(),
InternalSoundVolume * volumeModifier);
InternalSoundVolume * volumeModifier, true);
}
public static ISound Play(string name) { return Play(null, name, true, PPos.Zero, 1); }
@@ -86,7 +93,7 @@ namespace OpenRA
public static void PlayVideo(byte[] raw)
{
rawSource = LoadSoundRaw(raw);
video = soundEngine.Play2D(rawSource, false, true, float2.Zero, InternalSoundVolume);
video = soundEngine.Play2D(rawSource, false, true, float2.Zero, InternalSoundVolume, false);
}
public static void PlayVideo()
@@ -140,10 +147,12 @@ namespace OpenRA
}
StopMusic();
var sound = sounds[m.Filename];
if (sound == null) return;
music = soundEngine.Play2D(sound, false, true, float2.Zero, MusicVolume, false);
currentMusic = m;
MusicPlaying = true;
var sound = sounds[m.Filename];
music = soundEngine.Play2D(sound, false, true, float2.Zero, MusicVolume);
}
public static void PlayMusic()
@@ -238,7 +247,63 @@ namespace OpenRA
get { return (video != null) ? video.SeekPosition : 0; }
}
// Returns true if it played a phrase
// Returns true if played successfully
public static bool PlayPredefined(Player p, Actor voicedUnit, string type, string definition, string variant, bool attentuateVolume)
{
if (definition == null) return false;
if (Rules.Voices == null) return false;
if (Rules.Notifications == null) return false;
var rules = (voicedUnit != null) ? Rules.Voices[type] : Rules.Notifications[type];
if (rules == null) return false;
var ID = (voicedUnit != null) ? voicedUnit.ActorID : 0;
string clip;
var suffix = rules.DefaultVariant;
var prefix = rules.DefaultPrefix;
if (voicedUnit != null)
{
if (!rules.VoicePools.Value.ContainsKey("Attack"))
rules.VoicePools.Value.Add("Attack", rules.VoicePools.Value["Move"]);
if (!rules.VoicePools.Value.ContainsKey("AttackMove"))
rules.VoicePools.Value.Add("AttackMove", rules.VoicePools.Value["Move"]);
if (!rules.VoicePools.Value.ContainsKey(definition))
throw new InvalidOperationException("Can't find {0} in voice pool.".F(definition));
clip = rules.VoicePools.Value[definition].GetNext();
}
else
{
if (!rules.NotificationsPools.Value.ContainsKey(definition))
throw new InvalidOperationException("Can't find {0} in notification pool.".F(definition));
clip = rules.NotificationsPools.Value[definition].GetNext();
}
if (String.IsNullOrEmpty(clip)) return false;
if (variant != null)
{
if (rules.Variants.ContainsKey(variant) && !rules.DisableVariants.Contains(definition))
suffix = rules.Variants[variant][ID % rules.Variants[variant].Length];
if (rules.Prefixes.ContainsKey(variant) && !rules.DisablePrefixes.Contains(definition))
prefix = rules.Prefixes[variant][ID % rules.Prefixes[variant].Length];
}
var name = prefix + clip + suffix;
if (!String.IsNullOrEmpty(name) && (p == null || p == p.World.LocalPlayer))
soundEngine.Play2D(sounds[name],
false, true, float2.Zero,
InternalSoundVolume, attentuateVolume);
return true;
}
public static bool PlayVoice(string phrase, Actor voicedUnit, string variant)
{
if (voicedUnit == null) return false;
@@ -248,28 +313,24 @@ namespace OpenRA
if (mi == null) return false;
if (mi.Voice == null) return false;
var vi = Rules.Voices[mi.Voice.ToLowerInvariant()];
var type = mi.Voice.ToLowerInvariant();
if (!vi.Pools.Value.ContainsKey(phrase))
return false;
return PlayPredefined(null, voicedUnit, type, phrase, variant, true);
}
var clip = vi.Pools.Value[phrase].GetNext();
if (clip == null)
return false;
public static bool PlayNotification(Player player, string type, string notification, string variant)
{
if (type == null) return false;
if (notification == null) return false;
var variantExt = (vi.Variants.ContainsKey(variant) && !vi.DisableVariants.Contains(phrase)) ?
vi.Variants[variant][voicedUnit.ActorID % vi.Variants[variant].Length] : vi.DefaultVariant;
var prefix = (vi.Prefixes.ContainsKey(variant) && !vi.DisablePrefixes.Contains(phrase)) ?
vi.Prefixes[variant][voicedUnit.ActorID % vi.Prefixes[variant].Length] : vi.DefaultPrefix;
Play(prefix + clip + variantExt);
return true;
return PlayPredefined(player, null, type.ToLowerInvariant(), notification, variant, false);
}
}
interface ISoundEngine
{
ISoundSource AddSoundSourceFromMemory(byte[] data, int channels, int sampleBits, int sampleRate);
ISound Play2D(ISoundSource sound, bool loop, bool relative, float2 pos, float volume);
ISound Play2D(ISoundSource sound, bool loop, bool relative, float2 pos, float volume, bool attenuateVolume);
float Volume { get; set; }
void PauseSound(ISound sound, bool paused);
void StopSound(ISound sound);
@@ -290,8 +351,17 @@ namespace OpenRA
class OpenAlSoundEngine : ISoundEngine
{
class PoolSlot
{
public bool isActive;
public int frameStarted;
public float2 pos;
public bool isRelative;
public ISoundSource sound;
}
float volume = 1f;
Dictionary<int, bool> sourcePool = new Dictionary<int, bool>();
Dictionary<int, PoolSlot> sourcePool = new Dictionary<int, PoolSlot>();
const int POOL_SIZE = 32;
public OpenAlSoundEngine()
@@ -315,7 +385,7 @@ namespace OpenRA
return;
}
sourcePool.Add(source, false);
sourcePool.Add(source, new PoolSlot() { isActive = false });
}
}
@@ -323,9 +393,9 @@ namespace OpenRA
{
foreach (var kvp in sourcePool)
{
if (!kvp.Value)
if (!kvp.Value.isActive)
{
sourcePool[kvp.Key] = true;
sourcePool[kvp.Key].isActive = true;
return kvp.Key;
}
}
@@ -343,9 +413,9 @@ namespace OpenRA
return -1;
foreach (int i in freeSources)
sourcePool[i] = false;
sourcePool[i].isActive = false;
sourcePool[freeSources[0]] = true;
sourcePool[freeSources[0]].isActive = true;
return freeSources[0];
}
@@ -355,10 +425,62 @@ namespace OpenRA
return new OpenAlSoundSource(data, channels, sampleBits, sampleRate);
}
public ISound Play2D(ISoundSource sound, bool loop, bool relative, float2 pos, float volume)
const int maxInstancesPerFrame = 3;
const int groupDistance = 64;
const int groupDistanceSqr = groupDistance * groupDistance;
public ISound Play2D(ISoundSource sound, bool loop, bool relative, float2 pos, float volume, bool attenuateVolume)
{
if (sound == null)
{
Log.Write("debug", "Attempt to Play2D a null `ISoundSource`");
return null;
}
var world = Game.orderManager.world;
int currFrame = world != null ? world.FrameNumber : 0;
float atten = 1f;
// Check if max # of instances-per-location reached:
if (attenuateVolume)
{
int instances = 0, activeCount = 0;
foreach (var s in sourcePool.Values)
{
if (!s.isActive)
continue;
if (s.isRelative != relative)
continue;
++activeCount;
if (s.sound != sound)
continue;
if (currFrame - s.frameStarted >= 5)
continue;
// Too far away to count?
var lensqr = (s.pos - pos).LengthSquared;
if (lensqr >= groupDistanceSqr)
continue;
// If we are starting too many instances of the same sound within a short time then stop this one:
if (++instances == maxInstancesPerFrame)
return null;
}
// Attenuate a little bit based on number of active sounds:
atten = 0.66f * ((POOL_SIZE - activeCount * 0.5f) / POOL_SIZE);
}
int source = GetSourceFromPool();
return new OpenAlSound(source, (sound as OpenAlSoundSource).buffer, loop, relative, pos, volume);
if (source == -1) return null;
var slot = sourcePool[source];
slot.pos = pos;
slot.frameStarted = currFrame;
slot.sound = sound;
slot.isRelative = relative;
return new OpenAlSound(source, (sound as OpenAlSoundSource).buffer, loop, relative, pos, volume * atten);
}
public float Volume
@@ -369,6 +491,8 @@ namespace OpenRA
public void PauseSound(ISound sound, bool paused)
{
if (sound == null) return;
int key = ((OpenAlSound)sound).source;
int state;
Al.alGetSourcei(key, Al.AL_SOURCE_STATE, out state);
@@ -410,6 +534,8 @@ namespace OpenRA
public void StopSound(ISound sound)
{
if (sound == null) return;
int key = ((OpenAlSound)sound).source;
int state;
Al.alGetSourcei(key, Al.AL_SOURCE_STATE, out state);
@@ -467,15 +593,14 @@ namespace OpenRA
if (source == -1) return;
this.source = source;
Al.alSourcef(source, Al.AL_PITCH, 1f);
Al.alSourcef(source, Al.AL_GAIN, 1f);
Volume = volume;
Al.alSource3f(source, Al.AL_POSITION, pos.X, pos.Y, 0f);
Al.alSource3f(source, Al.AL_VELOCITY, 0f, 0f, 0f);
Al.alSourcei(source, Al.AL_BUFFER, buffer);
Al.alSourcei(source, Al.AL_LOOPING, looping ? Al.AL_TRUE : Al.AL_FALSE);
Al.alSourcei(source, Al.AL_SOURCE_RELATIVE, relative ? 1 : 0);
Al.alSourcef(source, Al.AL_REFERENCE_DISTANCE, 200);
Al.alSourcef(source, Al.AL_MAX_DISTANCE, 1500);
Volume = volume;
Al.alSourcef(source, Al.AL_REFERENCE_DISTANCE, 160);
Al.alSourcef(source, Al.AL_MAX_DISTANCE, 3200 / Game.viewport.Zoom);
Al.alSourcePlay(source);
}
@@ -517,7 +642,7 @@ namespace OpenRA
return new NullSoundSource();
}
public ISound Play2D(ISoundSource sound, bool loop, bool relative, float2 pos, float volume)
public ISound Play2D(ISoundSource sound, bool loop, bool relative, float2 pos, float volume, bool attenuateVolume)
{
return new NullSound();
}

View File

@@ -13,13 +13,14 @@ using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
using System.Text;
namespace OpenRA
{
static class Program
{
[STAThread]
static void Main( string[] args )
static void Main(string[] args)
{
// brutal hack
Application.CurrentCulture = CultureInfo.InvariantCulture;
@@ -32,19 +33,60 @@ namespace OpenRA
try
{
Run( args );
Run(args);
}
catch( Exception e )
catch (Exception e)
{
Log.AddChannel("exception", "exception.log");
Log.Write("exception", "{0}", e.ToString());
throw;
var rpt = BuildExceptionReport(e).ToString();
Log.Write("exception", "{0}", rpt);
Console.Error.WriteLine(rpt);
}
}
static void Run( string[] args )
static StringBuilder BuildExceptionReport(Exception e)
{
Game.Initialize( new Arguments(args) );
return BuildExceptionReport(e, new StringBuilder(), 0);
}
static void Indent(StringBuilder sb, int d)
{
sb.Append(new string(' ', d * 2));
}
static StringBuilder BuildExceptionReport(Exception e, StringBuilder sb, int d)
{
if (e == null) return sb;
sb.AppendFormat("Exception of type `{0}`: {1}", e.GetType().FullName, e.Message);
if (e is TypeLoadException)
{
var tle = (TypeLoadException)e;
sb.AppendLine();
Indent(sb, d);
sb.AppendFormat("TypeName=`{0}`", tle.TypeName);
}
else // TODO: more exception types
{
}
if (e.InnerException != null)
{
sb.AppendLine();
Indent(sb, d); sb.Append("Inner ");
BuildExceptionReport(e.InnerException, sb, d + 1);
}
sb.AppendLine();
Indent(sb, d); sb.Append(e.StackTrace);
return sb;
}
static void Run(string[] args)
{
Game.Initialize(new Arguments(args));
GC.Collect();
Game.Run();
}

View File

@@ -18,9 +18,11 @@ namespace OpenRA.Traits
public object Create(ActorInitializer init) { return new CreatesShroud(this); }
}
public class CreatesShroud : ITick
public class CreatesShroud : ITick, ISync
{
CreatesShroudInfo Info;
[Sync] CPos previousLocation;
Shroud.ActorVisibility v;
public CreatesShroud(CreatesShroudInfo info)
{
@@ -29,8 +31,29 @@ namespace OpenRA.Traits
public void Tick(Actor self)
{
if (!self.IsDisabled())
self.World.WorldActor.Trait<Shroud>().HideActor(self, Info.Range);
// TODO: don't tick all the time.
if (self.Owner == null)
return;
var shrouds = self.World.ActorsWithTrait<Shroud>().Select(s => s.Actor.Owner.Shroud);
if (previousLocation != self.Location && v != null)
{
previousLocation = self.Location;
foreach (var shroud in shrouds)
shroud.UnhideActor(self, v, Info.Range);
}
if (!self.TraitsImplementing<IDisable>().Any(d => d.Disabled))
foreach (var shroud in shrouds)
shroud.HideActor(self, Info.Range);
else
foreach (var shroud in shrouds)
shroud.UnhideActor(self, v, Info.Range);
v = new Shroud.ActorVisibility {
vis = Shroud.GetVisOrigins(self).ToArray()
};
}
}
}

View File

@@ -0,0 +1,27 @@
#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.Collections.Generic;
using OpenRA.Network;
namespace OpenRA.Traits
{
public class DebugPauseStateInfo : ITraitInfo
{
public object Create(ActorInitializer init) { return new DebugPauseState(init.world); }
}
public class DebugPauseState : ISync
{
World world;
[Sync] public bool Paused { get { return world.Paused; } }
public DebugPauseState(World world) { this.world = world; }
}
}

View File

@@ -13,6 +13,7 @@ namespace OpenRA.Traits
public class EditorAppearanceInfo : TraitInfo<EditorAppearance>
{
public readonly bool RelativeToTopLeft = false;
public readonly bool UseTerrainPalette = false;
}
public class EditorAppearance { }

View File

@@ -69,13 +69,42 @@ namespace OpenRA.Traits
}
}
public void Resurrect(Actor self, Actor repairer)
{
if (!IsDead)
return;
hp = MaxHP;
var ai = new AttackInfo
{
Attacker = repairer,
Damage = -MaxHP,
DamageState = this.DamageState,
PreviousDamageState = DamageState.Dead,
Warhead = null,
};
foreach (var nd in self.TraitsImplementing<INotifyDamage>()
.Concat(self.Owner.PlayerActor.TraitsImplementing<INotifyDamage>()))
nd.Damaged(self, ai);
foreach (var nd in self.TraitsImplementing<INotifyDamageStateChanged>())
nd.DamageStateChanged(self, ai);
if (repairer != null && repairer.IsInWorld && !repairer.IsDead())
foreach (var nd in repairer.TraitsImplementing<INotifyAppliedDamage>()
.Concat(repairer.Owner.PlayerActor.TraitsImplementing<INotifyAppliedDamage>()))
nd.AppliedDamage(repairer, self, ai);
}
public void InflictDamage(Actor self, Actor attacker, int damage, WarheadInfo warhead, bool ignoreModifiers)
{
if (IsDead) return; /* overkill! don't count extra hits as more kills! */
var oldState = this.DamageState;
/* apply the damage modifiers, if we have any. */
var modifier = (float)self.TraitsImplementing<IDamageModifier>()
var modifier = self.TraitsImplementing<IDamageModifier>()
.Concat(self.Owner.PlayerActor.TraitsImplementing<IDamageModifier>())
.Select(t => t.GetDamageModifier(attacker, warhead)).Product();
@@ -160,6 +189,7 @@ namespace OpenRA.Traits
public static void InflictDamage(this Actor self, Actor attacker, int damage, WarheadInfo warhead)
{
if (self.Destroyed) return;
var health = self.TraitOrDefault<Health>();
if (health == null) return;
health.InflictDamage(self, attacker, damage, warhead, false);

View File

@@ -21,6 +21,7 @@ namespace OpenRA.Traits
public bool PathDebug = false;
public bool UnlimitedPower;
public bool BuildAnywhere;
public bool ShowMuzzles;
public object Create (ActorInitializer init) { return new DeveloperMode(this); }
}
@@ -36,6 +37,9 @@ namespace OpenRA.Traits
[Sync] public bool UnlimitedPower;
[Sync] public bool BuildAnywhere;
// Client size only
public bool ShowMuzzles;
public DeveloperMode(DeveloperModeInfo info)
{
Info = info;
@@ -45,6 +49,7 @@ namespace OpenRA.Traits
PathDebug = info.PathDebug;
UnlimitedPower = info.UnlimitedPower;
BuildAnywhere = info.BuildAnywhere;
ShowMuzzles = info.ShowMuzzles;
}
public void ResolveOrder (Actor self, Order order)
@@ -73,11 +78,11 @@ namespace OpenRA.Traits
self.Trait<PlayerResources>().GiveCash(Info.Cash);
break;
}
case "DevShroud":
case "DevShroudDisable":
{
DisableShroud ^= true;
if (self.World.LocalPlayer == self.Owner)
self.World.LocalShroud.Disabled = DisableShroud;
self.World.RenderPlayer = DisableShroud ? null : self.Owner;
break;
}
case "DevPathDebug":
@@ -87,8 +92,12 @@ namespace OpenRA.Traits
}
case "DevGiveExploration":
{
if (self.World.LocalPlayer == self.Owner)
self.World.WorldActor.Trait<Shroud>().ExploreAll(self.World);
self.Owner.Shroud.ExploreAll(self.World);
break;
}
case "DevResetExploration":
{
self.Owner.Shroud.ResetExploration();
break;
}
case "DevUnlimitedPower":

View File

@@ -1,43 +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
namespace OpenRA.Traits
{
public class EvaAlertsInfo : TraitInfo<EvaAlerts>
{
// Sound effects
public readonly string RadarUp = "radaron2.aud";
public readonly string RadarDown = "radardn1.aud";
public readonly string CashTickUp = "cashup1.aud";
public readonly string CashTickDown = "cashdn1.aud";
// Build Palette
public readonly string BuildingCannotPlaceAudio = "nodeply1.aud";
public readonly string NewOptions = "newopt1.aud";
// For manual powerup/down in ra-ng
public readonly string DisablePower = "bleep11.aud";
public readonly string EnablePower = "bleep12.aud";
// Eva speech
public readonly string Repairing = "repair1.aud";
public readonly string LowPower = "lopower1.aud";
public readonly string SilosNeeded = "silond1.aud";
public readonly string PrimaryBuildingSelected = "pribldg1.aud";
// Special powers
public readonly string AbilityInsufficientPower = "nopowr1.aud";
public readonly string LevelUp = "hydrod1.aud";
}
public class EvaAlerts {}
}

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2012 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -75,16 +75,17 @@ namespace OpenRA.Traits
AdviceInterval = info.AdviceInterval;
}
[Sync]
public int Cash;
[Sync] public int Cash;
[Sync]
public int Ore;
[Sync]
public int OreCapacity;
[Sync] public int Ore;
[Sync] public int OreCapacity;
public int DisplayCash;
public int DisplayOre;
public bool AlertSilo;
public int Earned;
public int Spent;
public bool CanGiveOre(int amount)
{
@@ -94,10 +95,13 @@ namespace OpenRA.Traits
public void GiveOre(int num)
{
Ore += num;
Earned += num;
if (Ore > OreCapacity)
{
nextSiloAdviceTime = 0;
Earned -= Ore - OreCapacity;
Ore = OreCapacity;
}
}
@@ -106,6 +110,7 @@ namespace OpenRA.Traits
{
if (Ore < num) return false;
Ore -= num;
Spent += num;
return true;
}
@@ -113,6 +118,7 @@ namespace OpenRA.Traits
public void GiveCash(int num)
{
Cash += num;
Earned += num;
}
public bool TakeCash(int num)
@@ -121,6 +127,7 @@ namespace OpenRA.Traits
// Spend ore before cash
Ore -= num;
Spent += num;
if (Ore < 0)
{
Cash += Ore;
@@ -136,8 +143,6 @@ namespace OpenRA.Traits
public void Tick(Actor self)
{
var eva = self.World.WorldActor.Info.Traits.Get<EvaAlertsInfo>();
if(cashtickallowed > 0) {
cashtickallowed = cashtickallowed - 1;
}
@@ -151,8 +156,13 @@ namespace OpenRA.Traits
if (--nextSiloAdviceTime <= 0)
{
if (Ore > 0.8*OreCapacity)
Owner.GiveAdvice(eva.SilosNeeded);
if (Ore > 0.8 * OreCapacity)
{
Sound.PlayNotification(Owner, "Speech", "SilosNeeded", Owner.Country.Race);
AlertSilo = true;
}
else
AlertSilo = false;
nextSiloAdviceTime = AdviceInterval;
}
@@ -186,27 +196,25 @@ namespace OpenRA.Traits
{
DisplayOre -= move;
playCashTickDown(self);
}
}
}
public void playCashTickUp(Actor self)
{
var eva = self.World.WorldActor.Info.Traits.Get<EvaAlertsInfo>();
if (Game.Settings.Sound.SoundCashTickType != SoundCashTicks.Disabled)
{
Sound.PlayToPlayer(self.Owner, eva.CashTickUp);
Sound.PlayNotification(self.Owner, "Sounds", "CashTickUp", self.Owner.Country.Race);
}
}
public void playCashTickDown(Actor self)
{
var eva = self.World.WorldActor.Info.Traits.Get<EvaAlertsInfo>();
if (
Game.Settings.Sound.SoundCashTickType == SoundCashTicks.Extreme ||
(Game.Settings.Sound.SoundCashTickType == SoundCashTicks.Normal && cashtickallowed == 0)
) {
Sound.PlayToPlayer(self.Owner, eva.CashTickDown);
Sound.PlayNotification(self.Owner, "Sounds", "CashTickDown", self.Owner.Country.Race);
cashtickallowed = 3;
}

View File

@@ -10,29 +10,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.FileFormats;
namespace OpenRA.Traits
{
public class RenderSimpleInfo : ITraitInfo
public class RenderSimpleInfo : ITraitInfo, LocalCoordinatesModelInfo
{
[Desc("Defaults to the actor name.")]
public readonly string Image = null;
[Desc("custom palette name")]
public readonly string Palette = null;
[Desc("custom PlayerColorPalette: BaseName")]
public readonly string PlayerPalette = "player";
[Desc("Change the sprite image size.")]
public readonly float Scale = 1f;
[Desc("Number of facings for gameplay calculations. -1 indiciates auto-detection from sequence")]
public readonly int QuantizedFacings = -1;
public readonly WAngle CameraPitch = WAngle.FromDegrees(40);
public virtual object Create(ActorInitializer init) { return new RenderSimple(init.self); }
public virtual IEnumerable<Renderable> RenderPreview(ActorInfo building, Player owner)
public virtual IEnumerable<Renderable> RenderPreview(ActorInfo building, PaletteReference pr)
{
var anim = new Animation(RenderSimple.GetImage(building), () => 0);
anim.PlayRepeating("idle");
yield return new Renderable(anim.Image, 0.5f * anim.Image.size * (1 - Scale),
Palette ?? (owner != null ? PlayerPalette + owner.InternalName : null), 0, Scale);
yield return new Renderable(anim.Image, 0.5f * anim.Image.size * (1 - Scale), pr, 0, Scale);
}
}
public class RenderSimple : IRender, ITick
public class RenderSimple : IRender, ILocalCoordinatesModel, IAutoSelectionSize, ITick, INotifyOwnerChanged
{
public Dictionary<string, AnimationWithOffset> anims = new Dictionary<string, AnimationWithOffset>();
@@ -55,7 +65,6 @@ namespace OpenRA.Traits
return Info.Image ?? actor.Name;
}
string cachedImage = null;
public string GetImage(Actor self)
{
if (cachedImage != null)
@@ -65,6 +74,9 @@ namespace OpenRA.Traits
}
RenderSimpleInfo Info;
string cachedImage = null;
bool initializePalette = true;
protected PaletteReference palette;
public RenderSimple(Actor self, Func<int> baseFacing)
{
@@ -77,20 +89,40 @@ namespace OpenRA.Traits
anim.PlayRepeating("idle");
}
public string Palette(Player p) { return Info.Palette ?? Info.PlayerPalette + p.InternalName; }
public virtual IEnumerable<Renderable> Render(Actor self)
protected virtual string PaletteName(Actor self)
{
return Info.Palette ?? Info.PlayerPalette + self.Owner.InternalName;
}
protected void UpdatePalette() { initializePalette = true; }
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { UpdatePalette(); }
public virtual IEnumerable<Renderable> Render(Actor self, WorldRenderer wr)
{
if (initializePalette)
{
palette = wr.Palette(PaletteName(self));
initializePalette = false;
}
foreach (var a in anims.Values)
if (a.DisableFunc == null || !a.DisableFunc())
{
Renderable ret = a.Image(self, Palette(self.Owner));
Renderable ret = a.Image(self, wr, palette);
if (Info.Scale != 1f)
ret = ret.WithScale(Info.Scale).WithPos(ret.Pos + 0.5f * ret.Sprite.size * (1 - Info.Scale));
yield return ret;
}
}
public int2 SelectionSize(Actor self)
{
return anims.Values.Where(b => (b.DisableFunc == null || !b.DisableFunc())
&& b.Animation.CurrentSequence != null)
.Select(a => (a.Animation.Image.size*Info.Scale).ToInt2())
.FirstOrDefault();
}
public virtual void Tick(Actor self)
{
foreach (var a in anims.Values)
@@ -112,5 +144,22 @@ namespace OpenRA.Traits
anim.PlayThen(NormalizeSequence(self, name),
() => anim.PlayRepeating(NormalizeSequence(self, "idle")));
}
public WVec LocalToWorld(WVec vec)
{
// RA's 2d perspective doesn't correspond to an orthonormal 3D
// coordinate system, so fudge the y axis to make things look good
return new WVec(vec.Y, -Info.CameraPitch.Sin()*vec.X/1024, vec.Z);
}
public WRot QuantizeOrientation(Actor self, WRot orientation)
{
// Map yaw to the closest facing
var numDirs = Info.QuantizedFacings == -1 ? anim.CurrentSequence.Facings : Info.QuantizedFacings;
var facing = Util.QuantizeFacing(orientation.Yaw.Angle / 4, numDirs) * (256 / numDirs);
// Roll and pitch are always zero
return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing));
}
}
}

View File

@@ -10,16 +10,16 @@
namespace OpenRA.Traits
{
class RevealsShroudInfo : ITraitInfo
public class RevealsShroudInfo : ITraitInfo
{
public readonly int Range = 0;
public object Create(ActorInitializer init) { return new RevealsShroud(this); }
}
class RevealsShroud : ITick
public class RevealsShroud : ITick, ISync
{
RevealsShroudInfo Info;
CPos previousLocation;
[Sync] CPos previousLocation;
public RevealsShroud(RevealsShroudInfo info)
{
@@ -28,12 +28,23 @@ namespace OpenRA.Traits
public void Tick(Actor self)
{
// todo: don't tick all the time.
// TODO: don't tick all the time.
World w = self.World;
if(self.Owner == null) return;
if (previousLocation != self.Location)
{
previousLocation = self.Location;
self.World.WorldActor.Trait<Shroud>().UpdateActor(self);
var actors = w.ActorsWithTrait<Shroud>();
foreach( var s in actors )
s.Actor.Owner.Shroud.RemoveActor(self);
self.UpdateSight();
foreach( var s in actors )
s.Actor.Owner.Shroud.AddActor(self);
}
}

View File

@@ -16,21 +16,30 @@ namespace OpenRA.Traits
{
public class SelectableInfo : ITraitInfo
{
public readonly bool Selectable = true;
public readonly int Priority = 10;
public readonly int[] Bounds = null;
[VoiceReference] public readonly string Voice = null;
public object Create(ActorInitializer init) { return new Selectable(init.self); }
public object Create(ActorInitializer init) { return new Selectable(init.self, this); }
}
public class Selectable : IPostRenderSelection
{
public SelectableInfo Info;
Actor self;
public Selectable(Actor self) { this.self = self; }
public Selectable(Actor self, SelectableInfo info)
{
this.self = self;
Info = info;
}
public void RenderAfterWorld(WorldRenderer wr)
{
if (!Info.Selectable)
return;
var bounds = self.Bounds.Value;
var xy = new float2(bounds.Left, bounds.Top);
@@ -44,6 +53,9 @@ namespace OpenRA.Traits
public void DrawRollover(WorldRenderer wr, Actor self)
{
if (!Info.Selectable)
return;
var bounds = self.Bounds.Value;
var xy = new float2(bounds.Left, bounds.Top);

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