Compare commits

...

1080 Commits

Author SHA1 Message Date
Chris Forbes
f62fc7acd3 Updated CHANGELOG 2011-09-03 10:12:54 +12:00
Chris Forbes
8316ffc07e remove spurious trait lookup in AutoHeal 2011-09-01 16:18:36 +12:00
Curtis S
2cce16fe3d Minor ore changes to Doughnut map 2011-08-30 21:51:52 -06:00
Curtis S
43c5137dce Fixed ore distribution on mjolnir-2 2011-08-30 21:51:33 -06:00
Curtis S
6f70b113c8 Fix #1132; Infantry/Husks don't stay above water when bridge beneath is destroyed 2011-08-30 20:58:57 -06:00
Curtis S
3d48c454dc Vehicle husks should not appear on water 2011-08-30 20:55:27 -06:00
Curtis S
29b32dd656 Added new RA map: Doughnut 2011-08-29 17:13:00 +12:00
Curtis S
dc181f495f Added new RA map: Mjolnir 2 2011-08-29 17:12:54 +12:00
Chris Forbes
4b2717118f fix #1130 -- LaserZap beam color is configurable 2011-08-27 13:40:30 +12:00
Curtis S
02d644a09f Reduced Inaccuracy of Cruiser's 8Inch from 120 to 80 2011-08-27 08:21:31 +12:00
Chris Forbes
7b9f389ed1 Updated CHANGELOG 2011-08-22 18:33:31 +12:00
Chris Forbes
064b996ea2 slight tidy in nuke 2011-08-22 07:14:24 +12:00
Chris Forbes
2231436c2f fixed #837 -- hind, yak weapons ignore walls 2011-08-21 22:28:43 +12:00
Chris Forbes
dd306c7b7c fixed #766 -- minelayers not entering FIX properly 2011-08-21 22:17:50 +12:00
Chris Forbes
be7c4193a4 remove duplicated Tick 2011-08-21 22:05:41 +12:00
Chris Forbes
fe40fbf7f7 removed duplicated ResolveOrder 2011-08-21 22:05:41 +12:00
Chris Forbes
c0fd252b9f removed duplicate AttackActivity from AttackPopupTurreted 2011-08-21 22:05:41 +12:00
Chris Forbes
33ec2b3f5e have AttackPopupTurreted inherit AttackTurreted 2011-08-21 22:05:41 +12:00
Chris Forbes
7437e8fabb fix naming of turret member 2011-08-21 21:34:47 +12:00
Chris Forbes
c11b7041f4 push turret facing check down to turret 2011-08-21 21:32:39 +12:00
Chris Forbes
6a092dbfda declare AttackTurreted -> Turreted dep; do trait lookup at spawn time 2011-08-21 21:27:36 +12:00
Chris Forbes
78a0c3e506 move Attack traits into Attack dir 2011-08-21 21:10:49 +12:00
Chris Forbes
05d1c8ee82 move AttackPopupTurreted into RA where it can be fixed. 2011-08-21 21:05:29 +12:00
Chris Forbes
6daeb73471 stop spraying all these damned parentheses where they aren't needed 2011-08-21 21:02:19 +12:00
Chris Forbes
3a5682a1f7 remove Quit option from ingame menu; rename Disconnect to Abort Mission 2011-08-21 20:56:37 +12:00
Chris Forbes
2c5c069480 slow down power bar lerp slightly; extract constant 2011-08-21 20:49:34 +12:00
Chris Forbes
8b33c6c8b0 tidy up spurious typenames in PowerBinWidget 2011-08-21 20:45:47 +12:00
Chris Forbes
6346373e0c remove power manager lookup every render 2011-08-21 20:44:37 +12:00
Chris Forbes
339d5c3405 fix phantom radarbin 2011-08-21 20:40:32 +12:00
Chris Forbes
896cbaae39 clean up ModData package mounting 2011-08-21 20:26:00 +12:00
Chris Forbes
840f6131ac tidy up some spurious trait lookups in HackyAI 2011-08-21 19:39:44 +12:00
Chris Forbes
5a3f5d9f3a move BuildState into BaseBuilder where it belongs 2011-08-21 19:37:22 +12:00
Chris Forbes
b95f49d6f3 remove pointless null checks for owner 2011-08-21 19:34:45 +12:00
Chris Forbes
ee2be405ca fix AppearsFriendlyTo/AppearsHostileTo 2011-08-21 19:31:20 +12:00
Chris Forbes
da4811abe8 rip out ActorStance garbage 2011-08-21 18:59:20 +12:00
Curtis S
8e9045d7f4 Removed ra maps fire alley, isle wars 3, ore isle 2011-08-21 18:51:22 +12:00
Chris Forbes
0e3d07f0b2 adjust size of mcv husk 2011-08-21 18:49:54 +12:00
Chris Forbes
42ab7908d0 adjust size of harvester husk 2011-08-21 18:49:06 +12:00
Chris Forbes
d75784df64 factor out build palette overlays; add timers 2011-08-21 14:26:28 +12:00
Chris Forbes
96860033fb #1121 fixed -- [Sync] and ISync inheritance rules made the same 2011-08-21 10:58:16 +12:00
Chris Forbes
8cc455d23f fix #1105; decloak sound was never used 2011-08-21 10:21:07 +12:00
Chris Forbes
f7fdd885fb produce much better exceptions for missing files in map packages 2011-08-20 14:23:09 +12:00
Chris Forbes
8428eb0499 tidy up new-map-from-tileset support 2011-08-20 14:17:56 +12:00
Chris Forbes
1fe5c1d60f catch map load failures 2011-08-20 14:13:52 +12:00
Chris Forbes
a9d25b603c factor out duplicated hardcoded font in CashTick 2011-08-17 07:52:35 +12:00
Chris Forbes
e922051282 factor formatting code out of CashTick ctor 2011-08-17 07:52:35 +12:00
Chris Forbes
257bd6f431 fixed #849 -- forceMove plumbing removed, noone uses it. 2011-08-17 07:52:35 +12:00
Chris Forbes
67b4ef3084 #1108 changed BuildingInfo.WaterBound to a list of terraintypes. makes it possible to have buildings with custom terrain requirements 2011-08-17 07:52:35 +12:00
Chris Forbes
55ec88316a #1050 Extract generic PlayMusicOnMapLoad trait from cnc shellmap script 2011-08-17 07:52:34 +12:00
Curtis S
c47833e9a0 Fixed a frame in harvempty.shp 2011-08-15 19:15:57 -06:00
Chris Forbes
36f6e503ef clean up some of the noise in Move 2011-08-15 14:48:17 +12:00
Chris Forbes
a74fd17d39 remove a Turreted lookup every render for RenderBuildingTurreted 2011-08-15 14:32:10 +12:00
Chris Forbes
1aa80e0377 fix #960 -- HackyAI shouldn't put itself in low power so much. 2011-08-15 14:23:54 +12:00
Chris Forbes
cc716ab8c7 #1106 fixed -- mac-specific hack should only be applied on a mac. 2011-08-15 14:15:55 +12:00
Chris Forbes
6dd0452c95 drop unused SupportDir= option from 'openra' script produced by 'make install' 2011-08-13 15:01:42 +12:00
Chris Forbes
f3ea06c373 Include OpenRA.Renderer.SdlCommon.dll in 'make install'.
Merged from gentoo ebuild, https://github.com/cerebrum/dr/blob/master/games-strategy/openra/files/Makefile_rsdl.patch
2011-08-13 15:01:42 +12:00
Curtis S
499d9736cc Fix #802; BRIK health reduced to 500. Arty effectiveness remains the same. 2011-08-13 15:01:42 +12:00
Curtis S
cc8a9552b5 Made ATEK a prerequisite for Allied Longbow 2011-08-13 15:01:42 +12:00
Curtis S
d420701e5a Split hellfire missiles into AA/AG definitions 2011-08-13 15:01:42 +12:00
Chris Forbes
99f2f1bab2 fixed #1098; idle animation speed for e2 2011-08-13 15:01:42 +12:00
Chris Forbes
7902c9847e rename Technician -> Civilian 2011-08-13 15:01:42 +12:00
Chris Forbes
5546e977a8 add audio feedback for Stop order 2011-08-13 15:01:42 +12:00
Chris Forbes
c4666df6b9 fix long line in Mobile 2011-08-13 15:01:41 +12:00
Chris Forbes
54df44d43a split recoil into PrimaryRecoil/SecondaryRecoil; make recovery rate configurable per turret; #1069 2011-08-13 15:01:41 +12:00
Chris Forbes
954b0a617f don't consider HideMapCrateAction if the player has GPS 2011-08-13 15:01:41 +12:00
Chris Forbes
ca385e41ea fix bogus file name for HideMapCrateAction 2011-08-13 15:01:41 +12:00
Chris Forbes
9f0f8d381f map scatter->move for audio; #1093 2011-08-13 15:01:41 +12:00
Chris Forbes
d3def71340 Add ReturnToBase (F) support for aircraft; #1084 2011-08-13 15:01:41 +12:00
Chris Forbes
663a323f29 remove trait lookup spam everywhere for IOccupySpace. 2011-08-13 15:01:41 +12:00
Chris Forbes
aff3111eac internals for #919 2011-08-13 15:01:41 +12:00
Curtis S
b6560e6026 Fixed #1090; pilots don't drop for dead players 2011-08-13 15:01:40 +12:00
Chris Forbes
132ca5c667 update text for instant charge time option 2011-08-13 15:01:40 +12:00
Chris Forbes
f2867fbc61 UnregisterEvents functions do not need to be public 2011-08-13 15:01:40 +12:00
Chris Forbes
8d9f7b715d remove Lock Teams checkbox from RA lobby 2011-08-09 08:51:36 +12:00
Chris Forbes
9b9f13ed1b remove some duplication in LobbyLogic's color picker handling 2011-08-09 08:51:36 +12:00
Chris Forbes
e329c9dc55 fix some whitespace issues in LobbyLogic 2011-08-09 08:51:36 +12:00
Chris Forbes
89a209ff52 remove bogus FirstOrDefault + deref in Teleport; just use Trait<> 2011-08-09 08:51:36 +12:00
Paul Chote
5d3ed6aa6a Remove obsolete bits from linux packaging 2011-08-09 08:51:36 +12:00
Paul Chote
21197c702e Update CHANGELOG 2011-08-09 08:51:36 +12:00
Chris Forbes
3051b147f5 fix whitespace in NullGraphicsDevice 2011-08-09 08:51:36 +12:00
Chris Forbes
4e11702a99 fix #1088; gpsdot should not be given to opponents 2011-08-09 08:51:36 +12:00
Chris Forbes
a79cc0a0e0 drop unused parameter on IGraphicsDevice.Clear() 2011-08-09 08:51:36 +12:00
Chris Forbes
2bf7cb1496 fix #1052; tidy up *Init; route initial turret facing for husks through new TurretFacingInit 2011-08-09 08:51:36 +12:00
Chris Forbes
096fe7759c fix ThrowsParticles/ThrowsParticle naming inconsistency 2011-08-09 08:51:35 +12:00
Chris Forbes
18481afda2 fix #1063; don't issue orders while dragging a selection box 2011-08-09 08:51:35 +12:00
Chris Forbes
78e6d69103 fix #1064; always show an arrow while dragging a selection box 2011-08-09 08:51:35 +12:00
Chris Forbes
cfa8298190 remove duplication of initial map choice logic 2011-08-09 08:51:35 +12:00
Chris Forbes
b748e4b11b fix whitespace issues in CncMenuLogic 2011-08-09 08:51:35 +12:00
Chris Forbes
8844ea8e2f fix #1082; setting a bot's color no longer clobbers saved player color 2011-08-09 08:51:35 +12:00
Chris Forbes
5a9cb18881 fix #1070; allow GiveCashCrateAction to generate a cashtick 2011-08-09 08:51:35 +12:00
Chris Forbes
fa78793927 fix #1057 -- bogus trait lookup in RenderUnitSpinner 2011-08-09 08:51:35 +12:00
Chris Forbes
ddc1311d87 Make RenderUnit require IFacing; RenderSimple can be used for crates, mines, etc; fix husk facing init 2011-08-09 08:51:35 +12:00
Chris Forbes
7044d81a40 remove dead makedist.cmd 2011-08-09 08:51:35 +12:00
Chris Forbes
833533b4c3 fix #1056 2011-08-09 08:51:35 +12:00
Chris Forbes
7429c8ef89 don't look up IFacing (twice!) every frame for every actor with RenderUnit; fixes #1054 2011-08-09 08:51:35 +12:00
Chris Forbes
2797ea72cb fix stupid default support dir. if there's something we can't identify reliably, it's going to be a *nix 2011-08-09 08:51:28 +12:00
Matthew Bowra-Dean
21f172228d Fix compilation with Visual Studio
OpenRA.Renderer.SdlCommon was missing the /unsafe compiler flag and RALint was missing a reference to System.Drawing.
2011-08-08 11:17:10 +12:00
Paul Chote
c84f53c10d Extract tile overlays into a shp instead of rolling our own in code; Remove UIOverlay. Fixes #1061. 2011-07-27 21:48:32 +12:00
Paul Chote
08ed7f0316 Hook up empty/full harvester husk variants in RA. 2011-07-27 20:09:37 +12:00
Paul Chote
5fe5addc0c Make Harvester.Fullness an int 2011-07-27 20:00:23 +12:00
Paul Chote
d62ef64fa6 Make ralint give useful stacktraces under mono 2011-07-27 19:58:37 +12:00
Paul Chote
ad12352f41 Add mcv husk by Daniel Hernandez 2011-07-27 19:26:41 +12:00
Paul Chote
a4814b82c8 Display cost/power tooltip labels in red if there are insufficient funds/power. Fixes #1076. 2011-07-27 17:38:37 +12:00
Paul Chote
1c7a9ce08e Fix desert civ building animations (bug #1097). 2011-07-27 16:59:44 +12:00
Paul Chote
4e68ad2b12 Fix default civ building husk walkability 2011-07-27 16:57:23 +12:00
Paul Chote
9df7348683 Add two missing desert buildings 2011-07-27 16:57:12 +12:00
Paul Chote
b216d73ac9 Fix civ structure sequence ordering 2011-07-27 16:34:46 +12:00
Paul Chote
2b3f58e3a4 Fix hospital animation and add husk 2011-07-27 13:36:49 +12:00
Paul Chote
39a3dfffd1 Disallow capturing hospitals until they give something useful 2011-07-27 13:36:49 +12:00
Paul Chote
4c60639a0d Remove build radius from tech structures 2011-07-27 13:36:49 +12:00
Paul Chote
8087f16df0 `The Sentinel' tweaks: replace blue tib fields with hospitals; move starting spawns closer to the center; remove excess tib trees. 2011-07-27 13:36:49 +12:00
Paul Chote
0946bf52c3 Tweak tib and add oil derricks to Chokepoint. 2011-07-27 13:36:49 +12:00
Paul Chote
e62ec6caa1 Remove extra tib trees from `Instant Karma' 2011-07-27 13:36:49 +12:00
Paul Chote
86bc01cf65 Fix tib trees in `dead in motion' (bug #1072) 2011-07-27 13:36:49 +12:00
Paul Chote
8a6a3eac85 Make nod airfield fly the width of the map instead of spawning a fixed distance outside the map. Increase aircraft speed to compensate. Fixes #283. 2011-07-27 13:36:49 +12:00
Paul Chote
d9174b7e3b Kill RenderSimple.OverrideTileset/OverrideImage. 2011-07-27 13:36:48 +12:00
Paul Chote
64ab44c3ea Log a message when trying to render a nonexistent actor in the editor 2011-07-27 13:36:48 +12:00
Paul Chote
d98649e7e1 Switch `minus two' to desert variants. 2011-07-27 13:36:48 +12:00
Paul Chote
2778752a17 Switch `instant karma' to desert variants. 2011-07-27 13:36:48 +12:00
Paul Chote
a0d1686fd1 Fix bogus desert variant in shellmap 2011-07-27 13:36:48 +12:00
Paul Chote
e1691a4a70 Switch `chokepoint' to desert variants. 2011-07-27 13:36:48 +12:00
Paul Chote
6fecb82c98 Switch `break of day' to desert variants. 2011-07-27 13:36:48 +12:00
Paul Chote
7211cd10c6 Define desert variants of civilian buildings as real actors instead of visual hacks. 2011-07-27 13:36:48 +12:00
Paul Chote
17d72f17d9 Add an EditorTilesetFilter trait for filtering the actor palette based on tileset. 2011-07-27 13:36:47 +12:00
Paul Chote
9f7c5791f9 Make vehicle husks unselectable 2011-07-27 13:36:47 +12:00
Paul Chote
7e3cfd7ee9 Don't show a selection cursor over targetable but unselectable actors 2011-07-27 13:36:47 +12:00
Paul Chote
aa2ae95ce1 Kill DeadBuildingState.Zombie 2011-07-27 13:36:47 +12:00
Paul Chote
f9017567c1 Implement dead civilian buildings ask husks. Fixes #149. 2011-07-27 13:36:47 +12:00
Paul Chote
d6ab8b2456 Fix tech structures: cannot sell, can repair, fix husks. 2011-07-27 13:36:47 +12:00
Paul Chote
3972836cd6 Don't allow engineers to repair neutral structures, it conflicts with capturing. 2011-07-27 13:36:47 +12:00
Paul Chote
d8ec459b97 Declare RenderSimple dep in WithFire 2011-07-27 13:36:47 +12:00
Paul Chote
d9bd49bac3 Tweak East vs West 3. Fixes #921. 2011-07-27 13:36:47 +12:00
Paul Chote
4138c5aeb7 Display version in the load screen 2011-07-27 13:36:46 +12:00
Paul Chote
00ba03cbce Fix #1062 2011-07-27 13:36:46 +12:00
Paul Chote
304601b5ca Split some useful bits from CncIngameMenuLogic into CncWidgetUtils for use elsewhere 2011-07-27 13:36:46 +12:00
Paul Chote
648979c8ae Fix a crash in Demolish 2011-07-27 13:36:40 +12:00
Paul Chote
cf9ac8d801 Fix a dumb crash & avoid a trait lookup in DragHusk 2011-07-26 10:01:32 +12:00
Paul Chote
59116fc5b8 Include mod version on the ingame menu (Feature #1075) 2011-07-26 01:19:02 +12:00
Paul Chote
0a5f81c39e Drag husks to their final location. Fixes #730. 2011-07-25 23:50:11 +12:00
Paul Chote
49cbaeb1d2 Fix a crash when an infantry is crushed and killed by conventional means in the same tick. 2011-07-25 22:23:21 +12:00
Paul Chote
8ad3f47608 Further resource tweaks:
- Resource value reduced by 25%
 - Resource spawn rate increased by 15%
 - Unload rate decreased by 50%
 - Harvest rate increased by 25%
2011-07-25 22:23:21 +12:00
Paul Chote
9270c9c6b7 Don't clear RA production queues whenever anything dies. 2011-07-25 22:23:21 +12:00
Paul Chote
eba178a427 Resource changes (Feature #970):
- Harvester capacity ~halved
 - Harvester harvesting rate halved
 - Resource value ~doubled
 - Silo/Refinery capacity increased slightly
2011-07-25 22:23:21 +12:00
Paul Chote
eadf6fe6cf Rename RenderBuildingOre -> RenderBuildingSilo 2011-07-25 22:23:21 +12:00
Paul Chote
2231940056 Harvesters harvest the cell in front of them; fix harvester target lines; split harvester activities into their own (correctly named) files. 2011-07-25 22:23:21 +12:00
Paul Chote
a5b2ff4c75 Remove unused proc sequences 2011-07-25 22:23:21 +12:00
Paul Chote
996a5407a9 Use proc tower lights as a fullness indicator (Feature #1035). 2011-07-25 22:23:20 +12:00
Paul Chote
97c608a9b9 Fix harvempty.shp and harvhalf.shp 2011-07-25 22:23:20 +12:00
Paul Chote
69d23e01aa Remove references to unused mix files 2011-07-25 22:23:20 +12:00
Paul Chote
6c129eed3c Split pip artwork into their own files and kill the hardcoded size/offset junk. Add a blue pip to support C&C blue tib. Fixes #836. 2011-07-25 22:23:20 +12:00
Paul Chote
c793e8571f Update CHANGELOG 2011-07-25 22:23:20 +12:00
Paul Chote
ab132fb743 Increase reload time of mammoth missiles 2011-07-25 22:23:20 +12:00
Paul Chote
f4a03e3d73 Increase missile ROT and remove arming delay to ensure that missiles can hit adjacent targets. 2011-07-25 22:23:19 +12:00
Paul Chote
54b7e8f344 Split apache guns into AA/AG variants too. Fixes #946. 2011-07-25 22:23:19 +12:00
Paul Chote
e30e49006f Split orca missiles into AA and AG variants to avoid splash damage leakage. 2011-07-25 22:23:19 +12:00
Paul Chote
22d3e16225 Installing from CD: Volume names / mount points are unreliable identifiers - check for specific files on the disk instead. 2011-07-25 22:23:19 +12:00
Paul Chote
a165a80101 Fix imported map spawn ownership 2011-07-25 22:23:19 +12:00
Paul Chote
abf63b3054 Remove GameInitInfoWidget and routing startup via widgets in RA. 2011-07-25 22:23:19 +12:00
Paul Chote
2d269155b1 Reimplement installing from CD in RA. 2011-07-25 22:23:19 +12:00
Paul Chote
bf6be0424f Remove file prompting and drop all the remaining utility communication plumbing. 2011-07-25 22:23:18 +12:00
Paul Chote
9ec229bef7 Fix utility to use Platform.SupportDir (#1067); drop the --SupportDir arg and the path passed to --settings-value; Update OSX launcher to match. 2011-07-25 22:23:18 +12:00
Paul Chote
ac9a5efd8e Use GL_ARB_vertex_buffer_object calls instead of gl 1.5 core calls. 2011-07-25 22:23:18 +12:00
Paul Chote
f88ea4c25a Add RA settings UI for PixelDouble 2011-07-25 22:23:18 +12:00
Paul Chote
a94a57db32 Add C&C settings UI for PixelDouble 2011-07-25 22:23:18 +12:00
Paul Chote
d2c033dcd3 Add a PixelDouble preference for rendering at 2x zoom. Allowing arbitrary zoom levels leads to too many rendering artifacts. 2011-07-25 22:23:18 +12:00
Paul Chote
626b83ba12 Fix lines not being centered in the middle of a pixel 2011-07-25 22:23:17 +12:00
Paul Chote
8516fa8748 fix viewport scroll limits 2011-07-25 22:23:17 +12:00
Paul Chote
0bfc9a957f Fix radar viewport rectangle 2011-07-25 22:23:17 +12:00
Paul Chote
0b0e3d5f14 Drop unnecessary `this' uses from Viewport. 2011-07-25 22:23:17 +12:00
Paul Chote
6183621a72 Scale line-width to match zoom. 2011-07-25 22:23:17 +12:00
Paul Chote
fc783ddf80 Support custom zoom levels 2011-07-25 22:23:17 +12:00
Paul Chote
926b396605 Fix bogus naming of Shaders/Renderers. Split LineRenderer into world and chrome variants. 2011-07-25 22:23:16 +12:00
Paul Chote
4fa0962d49 Check for bogus subject clients in ValidateOrder. Fixes crash in #1001. 2011-07-25 22:23:16 +12:00
Paul Chote
2b3ee9e5bc Replace fullscreen checkbox and misleading width/height fields in RA settings menu with a mode/resolution selector like C&C. Fixes bugs #118, #791. 2011-07-25 22:23:16 +12:00
Paul Chote
704c784b51 Remove power and silo icon placeholders 2011-07-25 22:23:16 +12:00
Paul Chote
9b96bfb33b Fix #931 ("Unit Ready" played when a production structure is destroyed). 2011-07-25 22:23:16 +12:00
Paul Chote
d42cf25789 Packaging fixes for renderer deduplication. 2011-07-25 22:23:15 +12:00
Paul Chote
c79f5b5365 Ignore damage modifiers when killing a unit via actor.Kill(). Fixes surrender desync (#460); Fixes invulnerable actors surviving in situations where they should be killed (bridge death, losing/surrender, etc). 2011-07-25 22:23:15 +12:00
Paul Chote
6ede28fdbe Fix mammoth tank not crushing infantry 2011-07-25 22:23:15 +12:00
Paul Chote
ac7c25efa3 Prioritize alerted tabs when switching group / via hotkey. 2011-07-25 22:23:15 +12:00
Paul Chote
1bafd35d61 Rework ProductionTabsWidget getting/setting of the current queue. 2011-07-25 22:23:15 +12:00
Paul Chote
9fb72c9063 Play click sound when using `tab' to cycle queues. 2011-07-25 22:23:15 +12:00
Paul Chote
7be84a5390 Remove demo.mix from the packaged build, not the local copy. 2011-07-25 22:23:14 +12:00
Paul Chote
b8ba48ee67 Switch to observer ui on victory/defeat (Feature #1002). 2011-07-25 22:23:14 +12:00
Paul Chote
8f62ce9b25 Show `-' instead of 0 for unteamed players in the objectives panel. 2011-07-25 22:23:14 +12:00
Paul Chote
ee3be9c89b Laser tweaks:
- Expose the beam duration to the projectileinfo
 - Play an explosion animation at the target
 - Beam tracks moving targets
 - Disable player beam color in C&C
2011-07-25 22:23:14 +12:00
Paul Chote
d9d20338bf Increase orca reload time 2011-07-25 22:23:14 +12:00
Paul Chote
e724a3b200 Decrease stnk speed slightly, increase it's health 2011-07-25 22:23:14 +12:00
Chris Forbes
71cf332ee1 trim some crap out of Contrail 2011-07-25 22:23:13 +12:00
Chris Forbes
e4e443b0ab remove unused SidebarButtonWidget 2011-07-25 22:23:13 +12:00
Chris Forbes
e81cbceb99 aircraft sync debug traits dont really need to do trait lookups every time the synchash is taken.. 2011-07-25 22:23:13 +12:00
Chris Forbes
5055e0be62 clean up PlayerResources trait lookup in MoneyBinWidget 2011-07-25 22:23:13 +12:00
Chris Forbes
ac71e60a4b remove SplitOreAndCash from MoneyBinWidget; noone uses it anymore 2011-07-25 22:23:13 +12:00
Chris Forbes
41baa3b7b0 add escape keybinding to settings dialog 2011-07-25 22:23:13 +12:00
Chris Forbes
2ac1d001a4 add enter/escape bindings to replaybrowser 2011-07-25 22:23:13 +12:00
Chris Forbes
7d506f0ab6 rename gamelobby.yaml -> lobby.yaml 2011-07-25 22:23:12 +12:00
Chris Forbes
2a99cdb935 split map-chooser out of gamelobby.yaml 2011-07-25 22:23:12 +12:00
Chris Forbes
14733841e5 add escape/enter bindings for other join-game dialogs 2011-07-25 22:23:12 +12:00
Chris Forbes
0b97122c41 add escape/enter bindings for server browser dialog 2011-07-25 22:23:12 +12:00
Chris Forbes
00543825e7 setup escape/enter bindings for create-server dialog 2011-07-25 22:23:12 +12:00
Chris Forbes
8d2b6edaf1 split create server dialog into its own yaml file 2011-07-25 22:23:12 +12:00
Chris Forbes
fc9ab25c3f add escape key binding to ingame options button 2011-07-25 22:23:12 +12:00
Chris Forbes
70dfcffaea add another lint pass to ensure that every (non-template) actor type is actually constructible 2011-07-25 22:23:12 +12:00
Chris Forbes
b3bdc2df85 declare RenderUnitTurreted -> Turreted,AttackBase deps; remove spurious TraitOrDefault on AttackBase which just failed later; fixes #1053 2011-07-25 22:23:12 +12:00
Chris Forbes
315c00f67f clean up Contrail trait lookups; fixes #1058 2011-07-25 22:23:11 +12:00
Chris Forbes
0bca88d9d3 remove silly trait lookup in RenderBuildingCharge 2011-07-25 22:23:11 +12:00
Chris Forbes
fc15aa47ad dont really need to setup palettes every frame in ResourceLayer 2011-07-25 22:23:11 +12:00
Chris Forbes
5aaca5bb32 drop ISelectionColorModifier; unused 2011-07-19 21:14:12 +12:00
Chris Forbes
3a1613667b drop unnecessary ISync from ProximityCapturable 2011-07-19 21:14:12 +12:00
Chris Forbes
0d018d3eff tidying some font uses in BuildPaletteWidget 2011-07-19 21:14:12 +12:00
Chris Forbes
4448089cb7 use text rendering to show hold/ready indicators rather than SHP 2011-07-19 21:14:12 +12:00
Chris Forbes
8544930db9 ProximityCapturable simplifications 2011-07-19 21:14:12 +12:00
Chris Forbes
70a582df33 more simplification of Strategic* 2011-07-19 21:14:12 +12:00
Chris Forbes
e7228680e8 make RALint quiet unless -v or --verbose is passed 2011-07-19 21:14:12 +12:00
Chris Forbes
68fd2c9744 clean up usings after prev 2011-07-19 21:14:12 +12:00
Chris Forbes
643e0ee7a2 move CheckActorReferences out of the core lint code 2011-07-19 21:14:11 +12:00
Chris Forbes
3340e124e4 simplify Strategic* 2011-07-19 21:14:11 +12:00
Chris Forbes
33704977b9 remove ScrollingTextWidget 2011-07-19 21:14:11 +12:00
Chris Forbes
3d2635fca5 drop CursorSheetBuilder; use normal SheetBuilder for cursors now. 2011-07-19 21:14:11 +12:00
Chris Forbes
5609c8d041 drop format2 support from CursorSheetBuilder 2011-07-19 21:14:11 +12:00
Chris Forbes
d634f9db90 convert cnc mouse3 to td/ra format 2011-07-19 21:14:11 +12:00
Chris Forbes
4b5d6572ef convert RA cursors to TD/RA format 2011-07-17 18:37:27 +12:00
Chris Forbes
2a16172a20 add d2k -> ra shp conversion support to utility 2011-07-17 18:37:12 +12:00
Chris Forbes
239be241ff fix broken cleanup of import folder in editor after failed import; #1012 2011-07-17 17:55:53 +12:00
Chris Forbes
a635e8a4d8 add Passenger to crate; remove special cases in Cargo to support not having Passenger; #851 2011-07-17 17:55:53 +12:00
Chris Forbes
a95b59081f remove duplicated GL setup code 2011-07-17 17:55:52 +12:00
Chris Forbes
2fcb11d7cc remove duplicated SDL input handling 2011-07-17 17:55:52 +12:00
Chris Forbes
31c2306a57 get rid of Cg versions of Texture and VertexBuffer 2011-07-17 17:55:52 +12:00
Chris Forbes
b0ccc58516 remove unused vsync parameter from renderers 2011-07-17 17:55:52 +12:00
Chris Forbes
df1201b4c2 start moving common parts of the renderer into OpenRA.Renderer.SdlCommon 2011-07-17 17:55:52 +12:00
Chris Forbes
2ac6ccd3a4 add player parameter to ReinforceFromSea in prep for using it elsewhere 2011-07-17 17:55:52 +12:00
Chris Forbes
8221b8acca declare Burns -> RenderSimple dep; remove first tick weirdness 2011-07-17 17:55:52 +12:00
Chris Forbes
4a0b7bb003 put AnimationWithOffset in its own file 2011-07-17 17:55:52 +12:00
Chris Forbes
59616671b6 add harvester husks 2011-07-17 17:55:51 +12:00
Chris Forbes
74b894b69f replace Range with MinimumValue/MaximumValue 2011-07-17 17:55:51 +12:00
Chris Forbes
a52e5a92ae adjust copy ctor for SliderWidget -- copying the isMoving state makes *no sense*; Value should be copied though 2011-07-17 17:55:51 +12:00
Chris Forbes
0efe82018a rewrite SliderWidget to be simpler and have much less fail 2011-07-17 17:55:51 +12:00
Chris Forbes
fe6a99c993 fixed #42 -- show harvester fullness in sprites 2011-07-17 17:55:51 +12:00
Chris Forbes
9dd0ad980b remove backwards compatibility crap from RA edgescroll config 2011-07-17 12:43:12 +12:00
Chris Forbes
5c5eb5d5b5 remove config item for match timer in RA 2011-07-17 12:41:21 +12:00
Chris Forbes
2d79c7c424 clean up graphics settings in SettingsMenuLogic.cs 2011-07-17 12:37:54 +12:00
Chris Forbes
10cb967711 tidy SettingsMenuLogic audio settings 2011-07-17 12:33:05 +12:00
Chris Forbes
f973b1a29f SliderWidget's OnChange event has a parameter for a reason.. 2011-07-17 12:30:45 +12:00
Chris Forbes
a302b7999a trim usings after prev 2011-07-17 12:25:32 +12:00
Chris Forbes
413dd0cce4 move CncColorPickerLogic into its own file 2011-07-17 12:23:42 +12:00
Chris Forbes
af05856a5f fix foreach/closure bugs in CncLobbyLogic when setting up spectators 2011-07-17 12:15:20 +12:00
Chris Forbes
c05215c477 fix foreach/closure bugs in RA LobbyLogic; factor out name widget setup 2011-07-17 12:10:49 +12:00
Chris Forbes
8b78bc0602 move ReserveSpawnBuilding out of Plane.Tick and name it 2011-07-17 11:57:07 +12:00
Chris Forbes
2d8b72a5ff fix usings in Spy.cs 2011-07-17 11:38:45 +12:00
Chris Forbes
37656a02d9 have RALint check actor type in EjectOnDeath 2011-07-17 11:28:40 +12:00
Chris Forbes
5f315bc404 split unit smoke out into WithSmoke trait; remove duplication 2011-07-17 11:27:20 +12:00
Chris Forbes
d6819a19b8 declare WithRotor -> RenderSimple dep 2011-07-17 11:08:02 +12:00
Chris Forbes
cfc499e459 tidy usings for MapChooserLogic 2011-07-17 10:52:05 +12:00
Chris Forbes
c401e9c8fb tidy up ra music player 2011-07-17 10:52:05 +12:00
Chris Forbes
f8a9511a15 have RALint check CrateAction.ExcludedActorTypes 2011-07-17 10:32:03 +12:00
Chris Forbes
835d671752 fix 1036 -- GiveUnitCrateAction can give units which don't have BuildableInfo, to anyone 2011-07-17 10:29:00 +12:00
Chris Forbes
6a99ff7931 reinstate CrateAction.ExcludedActorTypes; custom maps use this. 2011-07-16 19:09:28 +12:00
Paul Chote
21ab82f91d Increase infantry crushability slightly. 2011-07-16 05:03:42 +12:00
Paul Chote
5722db0e34 Make Civilians crushable 2011-07-16 05:03:19 +12:00
Paul Chote
87e02ee7b1 Update CHANGELOG 2011-07-16 00:05:44 +12:00
Curtis S
2748c54002 Added new RA map by Buddha: Snowy Island 2011-07-16 00:05:44 +12:00
Curtis S
70a3b0aaba New version of RA Map: Center Of Attention 2011-07-16 00:05:44 +12:00
Chris Forbes
2a08b28094 remove need for #pragma in Bridge.cs 2011-07-16 00:05:44 +12:00
Chris Forbes
b1eea4a4d3 remove the need for warning suppression in Lazy/Cached 2011-07-16 00:05:44 +12:00
Paul Chote
f9b1c4fcc3 Work around a non-interactable window bug exposed by earlier graphics refactoring. 2011-07-15 23:57:29 +12:00
Paul Chote
eabcc51738 Fix gun firing offset (Bug #940). 2011-07-15 21:31:48 +12:00
Paul Chote
e40581149a Fix mtnk firing offset (Bug #938). 2011-07-15 21:31:48 +12:00
Paul Chote
3ae34fabf1 Fix ltnk firing offsets (Bug #939). 2011-07-15 21:31:48 +12:00
Paul Chote
e39d45d108 Add a delay before playing the win/lose audio notification. 2011-07-15 21:31:48 +12:00
Paul Chote
bc1a50693c Toggle repair/sell button state when active. 2011-07-15 21:31:48 +12:00
Paul Chote
1c29c95614 Use toggle artwork for production tabs. Change tab label color on alerted tabs. Contributes towards #1006. 2011-07-15 21:31:48 +12:00
Paul Chote
8f4c2371c7 Rename TooltipButton -> ToggleButton and add an active state. Use for production group icons. 2011-07-15 21:31:48 +12:00
Paul Chote
fef8008c87 Add click sounds to production tabs. Contributes towards #1006. 2011-07-15 21:31:47 +12:00
Paul Chote
05acdc9b98 Clean up some uses of rect.Contains(int2). 2011-07-15 21:31:47 +12:00
Paul Chote
8390644fbe Fix scrollthumb hover state 2011-07-15 21:31:47 +12:00
Paul Chote
4d2310b077 Add left and right arrows for the tabstrip. Rearrange chrome.png layout slightly. 2011-07-15 21:31:47 +12:00
Paul Chote
affc99e1cd Remove obsolete buttons.psd from artsrc. 2011-07-15 21:31:47 +12:00
Paul Chote
a9b479dfea Show (Dead) in the player list in the objectives screen (Bug #1031). 2011-07-15 21:31:47 +12:00
Paul Chote
d6b5b282bf Fix player name color in objectives screen (Bug #1030). 2011-07-15 21:31:47 +12:00
Paul Chote
e333ea89c9 Remove mods/cnc/packages reference from C&C's mod.yaml to match RA. Packages are now loaded exclusively from the support dir for both mods. Completes fix for #1016. 2011-07-15 21:31:47 +12:00
Curtis S
60adc57ca2 Removed .\mods\ra\packages reference in mod.yaml 2011-07-15 21:31:47 +12:00
Curtis S
e73969cb26 Reduced MSUB damage from 400 to 300 2011-07-15 21:31:47 +12:00
Curtis S
33ad765e3b Changed msub cloak time from 50 ticks to 100 2011-07-15 21:31:47 +12:00
Curtis S
4be76fcfc0 Added CashTrickler trait to RA oil derrick 2011-07-15 21:31:47 +12:00
Curtis S
403b05b4db Fixed palette issues in RA oil derrick SHP 2011-07-15 21:31:46 +12:00
Paul Chote
725b0cda40 Fix Production Palette audio (Bug #1004). 2011-07-15 21:31:46 +12:00
Paul Chote
5fceaaec58 New APC turret; art by Daniel Hernandez. 2011-07-15 20:10:22 +12:00
Paul Chote
089cdf14ad Remove the baked harvester animation from proc. Fixes #1009. 2011-07-15 20:10:22 +12:00
Paul Chote
24d220213e Remove extraneous spaces after weapon names 2011-07-15 20:10:22 +12:00
Paul Chote
c981b4322e Increase bike damage by ~16%, give weapon a sensible name. 2011-07-15 20:10:22 +12:00
Paul Chote
6090fda144 Increase building repair rate, cost. 2011-07-15 20:10:21 +12:00
Paul Chote
6433e6b356 Halve Mammoth Tank regen rate 2011-07-15 20:10:21 +12:00
Paul Chote
39338c1d3a Update CHANGELOG 2011-07-15 20:10:21 +12:00
Paul Chote
e9bd03b686 Add crushable infantry support, enabled in C&C. 2011-07-15 20:10:21 +12:00
Paul Chote
7173d193cf Pass the sequence name to the Corpse effect instead of an InfDeath number. Only play death animations for standard deaths. 2011-07-15 20:10:21 +12:00
Paul Chote
19ead53223 Add a WarnCrush method to ICrushable which is called when a crusher begins to enter the cell. 2011-07-15 20:10:21 +12:00
Paul Chote
74d13286a8 Add a force flag to nudging which skips the ownership and idle checks 2011-07-15 20:10:21 +12:00
Paul Chote
98ae8c7630 Take ownership into account when determining crushability. Fixes the important half of #951 (tanks crushing your own walls). 2011-07-14 21:00:50 +12:00
Paul Chote
64b88819a9 Add plumbing to support ownership checks in MobileInfo.CanEnterCell. 2011-07-14 21:00:50 +12:00
Paul Chote
47ba4cb285 Add click sounds to ingame buttons 2011-07-14 21:00:45 +12:00
Paul Chote
195aecec0e Add chat notification audio 2011-07-14 20:29:14 +12:00
Paul Chote
f724da5628 Tweak lobby chat panel 2011-07-14 20:29:14 +12:00
Paul Chote
3f468353fc Fix player name color in lobby chat. 2011-07-14 20:29:14 +12:00
Paul Chote
562931196f Give observers a minimap 2011-07-14 20:29:14 +12:00
Paul Chote
9eb7a3c27b Tweak button positions 2011-07-14 20:29:14 +12:00
Paul Chote
b82b716506 Add icons for options/sell/repair 2011-07-14 20:29:14 +12:00
Paul Chote
dc0c0e744a Production group icons 2011-07-14 20:29:14 +12:00
Paul Chote
32322b1658 Add tooltip descriptions to support powers 2011-07-14 20:29:14 +12:00
Paul Chote
5b2d2265e3 Add 8 maps by Petrenko, remove evw2. 2011-07-14 20:29:14 +12:00
Paul Chote
2049030ad4 Show remaining build time, remove unnecessary calculations from production palette 2011-07-14 20:29:13 +12:00
Paul Chote
29a90021f6 Fix production tabs crash 2011-07-14 20:29:13 +12:00
Paul Chote
07ae0688ff Fix unexplored terrain tooltip 2011-07-14 20:29:13 +12:00
Paul Chote
ef8ed398ce Tweak special powers widget: move unnecessary calculations out of Draw(); display the charge time over the icon. 2011-07-14 20:29:13 +12:00
Paul Chote
574133429a Fix control groups 2011-07-14 20:29:13 +12:00
Paul Chote
3d9a8cc002 Fix a tooltip crash. 2011-07-14 20:29:13 +12:00
Paul Chote
b2bfc5368a Initial production tooltip 2011-07-14 20:29:13 +12:00
Paul Chote
6199ec1404 Hide the objectives panel when opening submenus 2011-07-14 20:29:13 +12:00
Paul Chote
d70e5d3c42 Simple support power tooltips 2011-07-14 20:29:12 +12:00
Paul Chote
e078c8f8d8 Add owner name/flag to world tooltip. 2011-07-14 20:29:12 +12:00
Paul Chote
c965899b8c Better support for dynamic tooltip sizes 2011-07-14 20:29:12 +12:00
Paul Chote
dd7e270780 Update tooltip every render - fixes tooltips for actors changing under the cursor. 2011-07-14 20:29:12 +12:00
Paul Chote
7c72c1564e Add tooltip hook to SupportPowers; save some batches. 2011-07-14 20:29:12 +12:00
Paul Chote
ca77f20f19 Save batches in ProductionPalette 2011-07-14 20:29:12 +12:00
Paul Chote
5f3483ed17 Improve edge-scroll behavior 2011-07-14 20:29:12 +12:00
Paul Chote
ca8605d3ee Remove dialog4 2011-07-14 20:29:12 +12:00
Paul Chote
b1fe085b4d Remove incorrectly hardcoded "dialog4" from WidgetUtils.GetBorderSizes(). 2011-07-14 20:29:12 +12:00
Paul Chote
06990e356f Simple world tooltip. 2011-07-14 20:29:12 +12:00
Paul Chote
88d68f7790 Containers shouldn't steal mouseover focus 2011-07-14 20:29:11 +12:00
Paul Chote
2f9114fcf8 Power/Silo bar tooltips. 2011-07-14 20:29:11 +12:00
Paul Chote
b4489028de Polish button tooltips. Add tooltips/hotkeys for menu/sell/repair 2011-07-14 20:29:11 +12:00
Paul Chote
460451c402 Start implementing new tooltip bits. Test tooltips added for buttons and production palette. 2011-07-14 20:29:11 +12:00
Chris Forbes
608bdc8fcd pull some validation out of individual lobby/player commands 2011-07-14 20:29:11 +12:00
Chris Forbes
2ec88a6f64 remove duplicated NextPowerOf2 definition 2011-07-14 20:29:11 +12:00
Chris Forbes
2259a0e7a5 remove duplication of DrawSelectionBox 2011-07-14 20:29:11 +12:00
Chris Forbes
2ab2ee17c1 remove duplicated HarvestThisTile function from Harvest.cs 2011-07-14 20:29:11 +12:00
Chris Forbes
332d6d82fe add using rather than fully qualifying StackTrace typename 2011-07-14 20:29:11 +12:00
Chris Forbes
6f477a2c14 fix broken detection of desktop resolution on linux 2011-07-14 20:29:10 +12:00
Chris Forbes
88d0c9238c more debug output from Cg renderer setup 2011-07-14 20:29:10 +12:00
Chris Forbes
b06647a079 reduce noise in Renderer 2011-07-14 20:29:10 +12:00
Chris Forbes
ceaca47747 don't use ScrollDirection.Set when it's not needed 2011-07-14 20:29:10 +12:00
Chris Forbes
1196948a13 remove duplicated box-drawing code from WICW 2011-07-14 20:29:10 +12:00
Chris Forbes
2a7be6debd add missing using for MouseScrollType 2011-07-14 20:29:10 +12:00
Chris Forbes
496135d321 clean up ViewportScrollControllerWidget.GetCursor 2011-07-14 20:29:10 +12:00
Chris Forbes
2da523e824 drop unused WorldRenderer.DrawBox 2011-07-14 20:29:10 +12:00
Chris Forbes
98ebb7c87e add DrawRect helper to LineRenderer, use it in both Radar*Widgets 2011-07-14 20:29:09 +12:00
Chris Forbes
5af4476cd8 split AnnounceOnKill into its own file 2011-07-14 20:29:09 +12:00
Chris Forbes
5633d84d21 add lint pass to check whether types with ISync actually have any [Sync] members 2011-07-14 20:29:09 +12:00
Chris Forbes
513b852a67 fix [Sync] being allowed in places that don't make sense 2011-07-14 20:29:09 +12:00
Chris Forbes
74335f0734 fix bogus indent in ObjectCreator 2011-07-14 20:29:09 +12:00
Chris Forbes
b1ee735f3b put CheckAutotargetWiring in its own file 2011-07-14 20:29:09 +12:00
Chris Forbes
60a3f170ab clean up remaining non-generic GetValue uses 2011-07-14 20:29:09 +12:00
Chris Forbes
913ca89d4f use generic GetValue<> in VoiceInfo 2011-07-14 20:29:09 +12:00
Chris Forbes
914b3e1bee use generic GetValue<> in MobileInfo custom loader 2011-07-14 20:29:09 +12:00
Chris Forbes
33e6c7d39f fix namespace on cnc ProductionQueueFromSelection 2011-07-14 20:29:09 +12:00
Chris Forbes
c6cdee6075 more noise reduction in SVC 2011-07-14 20:29:09 +12:00
Chris Forbes
d0ac8b9766 remove spam from SVC 2011-07-14 20:29:08 +12:00
Chris Forbes
6565f7b32c removing some noise from SVC 2011-07-14 20:29:08 +12:00
Chris Forbes
5b481c2445 add Bits<> support to FieldLoader 2011-07-14 20:29:08 +12:00
Chris Forbes
c7c97ec743 rename ColorHSLR.cs to ColorRamp.cs to match classname 2011-07-14 20:29:08 +12:00
Chris Forbes
95e29e06df add Bits/BitAllocator types 2011-07-14 20:29:08 +12:00
Chris Forbes
47e25bb5a1 use common version of AreMutualAllies in PC 2011-07-14 20:29:08 +12:00
Chris Forbes
85bb56fd8f use common version of AreMutualAllies in SPW 2011-07-14 20:29:08 +12:00
Chris Forbes
f37cf32021 use AreMutualAllies in SVC 2011-07-14 20:29:08 +12:00
Chris Forbes
4e1c845303 add common version of AreMutualAllies to WorldUtils 2011-07-14 20:29:07 +12:00
Chris Forbes
c9c31345aa fix broken indent in WorldUtils.cs 2011-07-14 20:29:07 +12:00
Chris Forbes
1076ebb884 declare SVC -> CVC dep, rather than silently not working 2011-07-14 20:29:07 +12:00
Chris Forbes
002a8edb4c remove RatioRequired, CriticalRatioRequired from SVC, use info members 2011-07-14 20:29:07 +12:00
Chris Forbes
6f920e9011 cleanup StrategicVictoryConditions.cs 2011-07-14 20:29:07 +12:00
Chris Forbes
a9c00bdfba fix vis,naming of StrategicVictoryConditions.self 2011-07-14 20:29:07 +12:00
Chris Forbes
e44b965785 fixed #999 -- replace order/first[ordefault] with .ClosestTo(point) 2011-07-14 20:29:07 +12:00
Chris Forbes
5c3a6c81ae tidy HackyAI 2011-07-14 20:29:07 +12:00
Chris Forbes
c1a6b3470a fix indent in HackyAI.DeployMcv 2011-07-14 20:29:06 +12:00
Chris Forbes
b6bdff6f85 [2/2] fixed #998 -- clean up HackyAI.BuildRandom 2011-07-14 20:29:06 +12:00
Chris Forbes
56a38b9463 [1/2] fixed #998 -- clean up HackyAI.BuildRandom 2011-07-14 20:29:06 +12:00
Chris Forbes
6f2d1c54d6 fixed #983 -- don't crash in HackyAI if we can't find a target. 2011-07-14 20:29:06 +12:00
Chris Forbes
14de16eeba fix indent in HackyAI.Activate 2011-07-14 20:29:06 +12:00
Chris Forbes
b69ed51fb1 remove spurious second BuildRandom(Vehicle) call 2011-07-14 20:29:06 +12:00
Chris Forbes
bccac29297 simplify FieldSaver.FormatValue 2011-07-14 20:29:06 +12:00
Chris Forbes
be1754d424 bug #997 -- remove duplication from HackyAIInfo 2011-07-14 20:29:06 +12:00
Chris Forbes
847a248a26 bug #997 -- introduce generic version of FieldLoader.GetValue 2011-07-14 20:29:06 +12:00
Chris Forbes
7e162ad744 remove done todos from hackyai 2011-07-14 20:29:06 +12:00
Chris Forbes
0cb1f98e7e fixed #994 - use FormatTimeSeconds in MusicPlayerLogic 2011-07-14 20:29:06 +12:00
Chris Forbes
8610222e2c remove spurious typenames from WidgetUtils.WrapText 2011-07-14 20:29:05 +12:00
Chris Forbes
5b5bca9903 split FormatTime, FormatTimeSeconds 2011-07-14 20:29:05 +12:00
Chris Forbes
d40b071ab1 tidy in WidgetUtils 2011-07-14 20:29:05 +12:00
Chris Forbes
99b8c765c7 fixed #996 -- Rules.InstalledMusic 2011-07-14 20:29:05 +12:00
Chris Forbes
1a2dc8ec1c fixed #995 - remove duplication in next/prev song in MusicPlayerLogic.cs 2011-07-14 20:29:05 +12:00
Chris Forbes
b71e8bfe85 work on #993 -- removed OnMouseUp from DeveloperModeLogic.cs 2011-07-14 20:29:05 +12:00
Chris Forbes
897f578fc4 work on #993 -- removed OnMouseUp from DiplomacyLogic.cs 2011-07-14 20:29:05 +12:00
Chris Forbes
b9834c5b88 work on #993 -- removed OnMouseUp from MapChooserLogic.cs 2011-07-14 20:29:05 +12:00
Chris Forbes
accf94d664 work on #993 -- removed OnMouseUp from ReplayBrowserLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
3bdea009e3 work on #993 -- removed OnMouseUp from CreateServerMenuLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
c4985a043b work on #993 -- removed OnMouseUp from IngameObserverChromeLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
50303107d8 work on #993 -- removed OnMouseUp from SettingsMenuLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
f666dc08f5 work on #993 -- removed OnMouseUp from LobbyLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
bd018484e1 work on #993 -- removed OnMouseUp from IngameChromeLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
dfd73ce209 work on #993 -- removed OnMouseUp from MainMenuButtonsLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
980dc265ef work on #993 -- removed OnMouseUp from ServerBrowserLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
c32e0186b9 work on #993 -- removed OnMouseUp from ConnectionDialogsLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
8e780759bf work on #993 -- removed OnMouseUp from GameInitLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
14f29eb30e work on #993 -- removed OnMouseUp from MusicPLayerLogic.cs 2011-07-14 20:29:04 +12:00
Chris Forbes
d5ee3655f3 fixed #992: removed spurious double-semicolons 2011-07-14 20:29:03 +12:00
Chris Forbes
d95b579ead Makefile: fix various issues
* Add missing dependency between shippable binaries and fixheader
* Remove spam when fixheader is used
* Remove error message on from clean
* Fix minimal rebuilds
* Use strict variables to avoid shelling out so often for file lists
* Reenable RALint checking of mods

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
2011-07-14 20:29:03 +12:00
Chris Forbes
cd63da85d8 remove FieldLoader.LoadAttribute; replace with FieldLoader.IgnoreAttribute 2011-07-14 20:29:03 +12:00
Chris Forbes
a4648cfbcc move SheetSize to Graphics section of settings 2011-07-14 20:29:03 +12:00
Chris Forbes
54dee43590 test for required extensions in Cg renderer too 2011-07-14 20:29:03 +12:00
Chris Forbes
dcd9627c22 fixed #989: don't do renderer setup in a reflected call. 2011-07-14 20:29:03 +12:00
Chris Forbes
a07e151ab5 drop bogus comment in renderer 2011-07-14 20:29:03 +12:00
Paul Chote
0c95b43c87 Save some dumb perf in Widget.RenderBounds. 2011-07-14 20:29:03 +12:00
Paul Chote
e9d67860de Proper mouseover support. 2011-07-14 20:29:02 +12:00
Paul Chote
1114293035 Apply consistent widget method names. Semantic change: Widgets that want to tick when !Visible must override TickOuter() instead of Tick(). 2011-07-14 20:29:02 +12:00
Paul Chote
193999a040 Move OnMouseUp onto ButtonWidget and drop its unnecessary plumbing. 2011-07-14 20:29:02 +12:00
Paul Chote
8189ef109e Reorganize Widget into static/nonstatic. 2011-07-14 20:29:02 +12:00
Paul Chote
e58e354c4b Move IsDisabled checking for OnMouseDown into ButtonWidget. Remove unnecessary bool plumbing. 2011-07-14 20:29:02 +12:00
Paul Chote
bbeaf2047b Remove OnMouseDown from Widget. Define it on just the widgets that want it. 2011-07-14 20:29:02 +12:00
Paul Chote
7a69daa99c Remove Widget.OnMouseMove. 2011-07-14 20:29:01 +12:00
Paul Chote
f905c87b97 New support powers bin 2011-07-14 20:29:01 +12:00
Paul Chote
e787c46a81 Remove border from buildclock overlay. 2011-07-14 20:29:01 +12:00
Paul Chote
5f8beb632a Switch tabs when a queue is lost, hide tab-strip when there are no queues available, rename queueType -> queueGroup. 2011-07-14 20:29:01 +12:00
Paul Chote
a065ba0338 Keyboard support for production palette:
y/u/i/o/p map to Buildings/Defense/Infantry/Vehicles/Aircraft.
Tab or successive y/u/i/o/p will switch tabs within a category.
Successive clicks on category icons will also switch tabs.
Shift + keyboard/click cycles tabs in reverse.
2011-07-14 20:29:01 +12:00
Paul Chote
c1f7152857 Change Widget key support: Move (unused) Widget.OnKeyPress hook onto ButtonWidget; Buttons will respond to keys with modifiers. 2011-07-14 20:28:35 +12:00
Paul Chote
6877c29fa6 Reimplement production queue switching from selection. 2011-07-03 07:02:17 +12:00
Paul Chote
70faee4e9c Remove obsoleted artwork 2011-07-03 06:32:05 +12:00
Paul Chote
8950ef7bcb Hook up sell/repair buttons 2011-07-03 06:29:41 +12:00
Paul Chote
f96840df36 Rewrite production palette. Tooltips will be reimplemented later. 2011-07-03 06:20:02 +12:00
Paul Chote
c76811c5e1 Rewrite production tabs (again): Avoid doing a pile of work every tick; support multiple queue types grouped under one category; Tab numbering is sticky. 2011-07-03 01:48:14 +12:00
Paul Chote
b85fce3b41 Disable queue buttons when there are no tabs 2011-07-02 21:37:31 +12:00
Paul Chote
fe380b13ac Rewrite ProductionTabsWidget. 2011-07-02 21:18:26 +12:00
Paul Chote
d5e63538ad Port production palette from ui2 branch. Needs reworking. Unfinished. 2011-07-02 07:32:34 +12:00
Paul Chote
dba77daae0 Fix namespace 2011-07-02 07:31:39 +12:00
Paul Chote
e922e8028c Hook up tib storage bar 2011-07-02 06:23:48 +12:00
Paul Chote
7e67fdb446 Wire up power bar 2011-07-02 04:27:40 +12:00
Paul Chote
1f92286b51 Wire up cash display 2011-07-02 03:53:13 +12:00
Paul Chote
7e42175a94 Mock up sidebar using existing widgets 2011-07-02 03:45:42 +12:00
Paul Chote
717471a522 New faction flags 2011-07-02 01:31:18 +12:00
Paul Chote
9b3cedd37f Show map title in the lobby 2011-07-01 23:37:53 +12:00
Daniel Hernandez
0224b3b745 Fix stnk husk (Fixes #985). 2011-07-01 23:22:07 +12:00
Paul Chote
3dec6016e7 Remove diplomacy menu, lock teams option (Feature #950). 2011-07-01 23:19:50 +12:00
Paul Chote
fa6b9983d3 Conquest objectives panel (Feature #949). 2011-07-01 23:07:50 +12:00
Paul Chote
c81735911e Add Funcs for custom label Color/ContrastColor 2011-07-01 23:04:48 +12:00
Paul Chote
97186d8bd9 Support custom checkbox symbols. Add a crossed variant to C&C. Correctly copies checkbox state when copying checkboxes. 2011-07-01 23:04:48 +12:00
Paul Chote
7c63138e3f Mechanism for showing mission objectives in the ingame menu. Fixes #948. 2011-07-01 02:34:30 +12:00
Paul Chote
aaa78649fc Make overflow tabs clickable. Fixes #550. 2011-07-01 00:42:53 +12:00
Paul Chote
c2519375b2 Reduce grenadier death damage. Fixes #957. 2011-07-01 00:35:09 +12:00
Paul Chote
0f3be08491 Halve tiberium damage to infantry, deal it smoothly. 2011-07-01 00:19:46 +12:00
Paul Chote
a835edfab1 Increase tiberium pathing penalty for infantry. Fixes #953. 2011-07-01 00:16:28 +12:00
Paul Chote
9cbf372698 Use new reveal-map and heal crate effects. Fixes #977. 2011-07-01 00:12:27 +12:00
Paul Chote
17fa312108 Use new cloak crate effect 2011-07-01 00:08:43 +12:00
Paul Chote
11a9bc7e43 Remove ExcludedActors from crate actions. Use a tag trait for cloakable actors. Ban MCV from receiving cloak. 2011-07-01 00:07:04 +12:00
Paul Chote
f360559869 Remove some crap from Cloak. 2011-06-30 23:54:42 +12:00
Paul Chote
fc10b79e1d Capturable Biolab allows production of player-controlled viceroids. 2011-06-30 20:20:00 +12:00
Paul Chote
0236dd04ae Work around capturable tech bug. 2011-06-30 20:17:49 +12:00
Paul Chote
9657d697fc Add dino/vice icons, dino voices, crate effects from Sole Survivor 2011-06-30 20:16:16 +12:00
Paul Chote
b58e091892 Write graphics.log on Cg renderer errors. Fixes second half of #967. Untested. 2011-06-29 11:37:52 +12:00
Paul Chote
d62a21da14 Improve GLSL renderer debug logging: Define GL_INVALID_OPERATION error code (was previously error 1282); Include GL_RENDERER, GL_VERSION, GL_SHADING_LANGUAGE_VERSION in graphics.log; write graphics.log when CheckGlError fails. Fixes #966 and half of #967. 2011-06-29 11:33:25 +12:00
Chris Forbes
0e45968573 remove 'private' keyword where possible 2011-06-29 09:15:39 +12:00
Chris Forbes
587b2ef0d1 convert Buildable trait construction to concise style 2011-06-29 07:50:20 +12:00
Paul Chote
3305d5fad9 Update CHANGELOG 2011-06-29 02:26:41 +12:00
Paul Chote
adc9318a05 Add Muzzleflash to RA SAM Site. 2011-06-29 02:03:58 +12:00
Paul Chote
05dead8271 Don't ship demo.mix in packages 2011-06-29 00:05:10 +12:00
Paul Chote
3816cca667 Remove Tundra map and the snow tileset. Fixes #969. 2011-06-29 00:05:10 +12:00
Paul Chote
c58284d06f Increase ATWR range by 1. Fixes #941 (detection circle not visible). 2011-06-29 00:05:10 +12:00
Paul Chote
a7670f10ea Reduce SAM Site range. Fixes #954. 2011-06-29 00:05:10 +12:00
Paul Chote
05826c0c9b Fix Apache tooltip, halve it's damage. Fixes #952. 2011-06-29 00:05:10 +12:00
Chris Forbes
11dc069104 fix RALint prereqs checking 2011-06-28 23:36:39 +12:00
Chris Forbes
0080762bbc fixed #359 -- diplomacy panel shows player colors 2011-06-28 23:21:49 +12:00
Chris Forbes
43d8750aad fixed #728: BuildableInfo.BaseNormal -> GivesBuildableArea 2011-06-28 23:11:20 +12:00
Chris Forbes
fb027a5650 fix broken palette handling in editor on linux/mac 2011-06-28 22:05:10 +12:00
Chris Forbes
9ae566cd68 remove some inconsistency from linux packaging script 2011-06-28 21:02:52 +12:00
Paul Chote
3d442afcab Update AUTHORS 2011-06-28 02:03:18 +12:00
Daniel Hernandez
5e0817fc37 Remappable oil derricks. Fixes #502. 2011-06-27 20:43:30 +12:00
Paul Chote
09bcc16cb1 Fix capturable tech structures. 2011-06-27 20:24:05 +12:00
Paul Chote
9886c1f6fe Fix unremappable pixels in heli.shp (Fixes #965). 2011-06-27 20:10:02 +12:00
Paul Chote
de44833457 Don't mangle shadows/cursors 2011-06-27 18:35:47 +12:00
Paul Chote
ebc0cea217 Fix #961 2011-06-27 18:30:44 +12:00
Paul Chote
3ec5693f69 Fix repair depot crash 2011-06-26 16:12:18 +12:00
Paul Chote
2cdc3c4288 Fix e3 firing offset. Fixes #936. 2011-06-26 02:29:25 +12:00
Paul Chote
31cb1c017f Fix e4, e5 firing offsets. 2011-06-26 02:29:25 +12:00
Paul Chote
98f4db750b Support for changing infantry barrel offsets when prone. Fixes #935. 2011-06-26 02:29:25 +12:00
Paul Chote
9b8e927c33 Fix Ion Cannon cursor 2011-06-25 22:04:00 +12:00
Chris Forbes
8df0d973fa add RA:Aftermath music 2011-06-25 18:48:01 +12:00
Chris Forbes
9f5ee7fc1a add RA:Counterstrike music 2011-06-25 18:44:31 +12:00
Chris Forbes
cf4769979d fixed #899 -- OpenRA.Utility --png was missing unlock 2011-06-25 18:20:32 +12:00
Chris Forbes
a3601b1214 drop redundant virtuals from WithMuzzleFlash 2011-06-25 18:12:05 +12:00
Daniel Hernandez
6da5724af8 added new 2x2 oil derrick 2011-06-25 17:51:51 +12:00
Paul Chote
a4e319b9d2 Define a specific harvest cursor. Use attack for cnc harvest. 2011-06-25 17:40:34 +12:00
Paul Chote
fd2d15c0fe Work around #937. May have negative perf impact. 2011-06-25 16:43:51 +12:00
Paul Chote
fc37733c3c Add a screen-space offset to barrel positions, and fix HTNK firing offsets. Fixes #803, 929. 2011-06-25 15:25:22 +12:00
Paul Chote
b64c5e001e Add support for C&C Covert Ops music (fixes half of #824). 2011-06-25 14:43:45 +12:00
Paul Chote
24a649d491 Fix artillery firing offset. Fixes #928. 2011-06-25 14:06:54 +12:00
Paul Chote
2f07a38de0 Fix JEEP turret offset (Fixes #927) 2011-06-25 13:57:05 +12:00
Paul Chote
81d1444b4a Fix turreted muzzleflashes. 2011-06-25 13:54:30 +12:00
Paul Chote
016a082a76 Add Great Shot!' and Map theme' scores. Use Map theme for the shellmap. Fixes #913. 2011-06-25 13:32:16 +12:00
Chris Forbes
fabb89f4da disable component UI in windows installer 2011-06-25 12:26:45 +12:00
Lawrence Wang
1fa4cf5c0a Bug 856- Removal of extra few lines of code 2011-06-25 11:54:19 +12:00
Lawrence Wang
de5db51f25 Fixed #856 - created trait for ammo reload time, set for some aircraft 2011-06-25 11:54:12 +12:00
Chris Forbes
6be55b61aa fixed #934 -- convert all AttackBase.MuzzleFlash uses to WithMuzzleFlash 2011-06-25 11:51:04 +12:00
Chris Forbes
29b81be5bb removed obsolete data sln 2011-06-25 11:41:13 +12:00
Paul Chote
a59ff827b8 Update CHANGELOG 2011-06-25 00:18:17 +12:00
Paul Chote
b39880a845 SAM site muzzleflash (Fixes #923) 2011-06-25 00:17:49 +12:00
Paul Chote
6817332317 Rework apache weapon and firing offsets. Has duel machine guns with 10 shots, reloads all of its ammo every 8 seconds. Damage increased, and can now attack air. Fixes second half of #930. 2011-06-24 23:58:52 +12:00
Paul Chote
44c86928ec Rework orca weapons and firing offsets. Now fires a volley of 10 rockets, which reload at 2 per 3 seconds. Fixes half of #930. 2011-06-24 23:58:30 +12:00
Paul Chote
3b55b92573 Fix BGGY turret location (Fixes #926) 2011-06-24 20:56:45 +12:00
Paul Chote
24266ebc93 Autodetect CD instead of prompting the user. Fixes #911. Requires testing under Windows and Linux. 2011-06-24 19:08:29 +12:00
Paul Chote
dc9b0adba9 Kill unused map installation code. 2011-06-24 17:26:33 +12:00
Paul Chote
916e63710c Fix #892 2011-06-24 17:08:58 +12:00
Paul Chote
8122d63a74 Remove SSM from Nod 2011-06-24 01:40:00 +12:00
Paul Chote
edbc7a028b Artillery goes back to Nod 2011-06-24 01:21:17 +12:00
Paul Chote
06c32a728a Update CHANGELOG 2011-06-24 00:40:58 +12:00
Paul Chote
35a5fc3356 Work around for #902. 2011-06-24 00:40:58 +12:00
Paul Chote
2d34169d79 Fix harv/proc/selling interaction. Fix formatting issues in OreRefinery. (Fixes #901, #903) 2011-06-24 00:40:58 +12:00
Paul Chote
122c7ec569 Don't show bounty cashticks of $0. 2011-06-24 00:40:58 +12:00
Paul Chote
ef8b6b2e71 Remove FlyOffMap.Interruptable. Fixes #906. 2011-06-24 00:40:58 +12:00
Paul Chote
78502317aa APC becomes an Anti-Air transport. Will need new turret artwork. 2011-06-24 00:40:57 +12:00
Paul Chote
1848405795 Rocket Launcher (MSAM) rework. Now fires 6 unguided rockets, has a fixed turret, cannot target air. 2011-06-24 00:40:57 +12:00
Paul Chote
41def5fef5 Split STNK weapon from MSAM, give it burst 2, and set correct barrel offsets. Doubles effective STNK damage. (Fixes #907) 2011-06-23 18:45:35 +12:00
Paul Chote
60a4a06ee4 Restore APC cargo pips (Fixes #910). 2011-06-23 18:13:08 +12:00
Paul Chote
ec3d467858 HackyAI supports teams (Fixes #917). 2011-06-23 17:41:38 +12:00
Paul Chote
6ed0c574be Update CHANGELOG 2011-06-22 22:33:57 +12:00
Paul Chote
099ede0428 Halve bridge strength 2011-06-21 20:44:19 +12:00
Paul Chote
65f1427bf2 Fix some other bogus bits in Bridge 2011-06-21 20:35:19 +12:00
Paul Chote
5e220a9ac7 Fix #306 2011-06-21 20:35:08 +12:00
Paul Chote
af4093f380 Swap the default value for FlyOffMap.Interruptible. The common case (scripted aircraft) don't want to be interruptible. Fixes badr desync caused by the mono 2.6.7 compiler dropping initializers for bools that default to true. 2011-06-21 14:20:08 +12:00
Paul Chote
74b2b36a40 Clean up and merge #883 2011-06-21 13:34:38 +12:00
Curtis S
bb2e514dfd Fixed title in ra map "Center of Attention" 2011-06-21 13:14:05 +12:00
Paul Chote
6feccab5db Add map-player check to SurrenderOnDisconnect 2011-06-21 03:41:36 +12:00
Paul Chote
1cdfd44d43 Fix #897. 2011-06-21 03:40:39 +12:00
Paul Chote
ce65127e34 Fix observer tooltips (Bug #769) 2011-06-21 02:51:50 +12:00
Paul Chote
e33995d71b Don't display a tooltip for actors without the Tooltip trait 2011-06-21 02:48:52 +12:00
Paul Chote
088573f2b7 Disable controls instead of hiding when ready. Fixes #889 2011-06-20 22:50:32 +12:00
Paul Chote
7838896c81 Display bot spawns to everyone, not just the host. 2011-06-20 22:50:32 +12:00
Paul Chote
43aae99dd0 Fix #888 2011-06-20 22:50:32 +12:00
Paul Chote
49dfbd43b7 Fix #896 2011-06-20 22:50:32 +12:00
Paul Chote
347a80f0a7 Unbitrot GDI01. The broken rules overrides have been left as a testcase for #768 2011-06-20 22:50:32 +12:00
Paul Chote
c014731a2f Fix Map.PlayerCount 2011-06-20 22:50:31 +12:00
Paul Chote
bafa411329 Expose LockTeam/LockSpawn to mappers 2011-06-20 22:50:31 +12:00
Paul Chote
8875d1adee Skirmish starts with the last used map. 2011-06-20 22:50:31 +12:00
Paul Chote
4fa9a2ba2b Group the music button on the left 2011-06-20 22:50:31 +12:00
Paul Chote
e00bfd487d Hook up the spawn selector. 2011-06-20 22:50:31 +12:00
Paul Chote
c80fbaacd5 Add a spawnpoint selector for bots (selector logic unimplemented) 2011-06-20 22:50:30 +12:00
Paul Chote
b4ce97691b Use images instead of checkboxes for non-editable status fields and fix player template naming: local/remote -> editable/non-editable. 2011-06-20 22:50:30 +12:00
Paul Chote
ac68f9dab3 Remove Bot: label from bots in the slot dropdown. 2011-06-20 22:50:30 +12:00
Paul Chote
e7543f28df Fix naming of Player.PlayerReference. 2011-06-20 22:50:29 +12:00
Paul Chote
91b31b1981 Rewrite ChooseInitialStance to support bot teams and remove obsolete crap. 2011-06-20 22:50:29 +12:00
Paul Chote
4f172d7ed8 Make bots first-class players.
- Bots have their own Clients, with unique ClientIDs
 - Hosts can set bot team/color in the lobby
 - Bots are kicked when switching to a smaller map without enough slots
 - Order validator assumes that only client 0 has permission to issue bot orders
2011-06-20 22:50:29 +12:00
Paul Chote
0c9190a1af Enforce color/race/team locking 2011-06-20 22:50:28 +12:00
Paul Chote
19d74fef52 Server support for host changing other client's race/color/team/spawn 2011-06-20 22:50:28 +12:00
Paul Chote
d2df5722b5 Fix the lobby slots.
- lobbyInfo.Slots is now a dictionary, keyed by the name of the PlayerReference that the slot is tied to.
 - LockRace/Color/Team is now specified on the slot, avoiding map lookups in the lobby
 - Observers are no longer tied to slots -> players will join as observers instead of crashing the game if there are no available slots
 - Observers are able to change their name and color
2011-06-20 22:50:27 +12:00
Paul Chote
e934baa6e9 Better bot spawning code; better random color and proper player names. 2011-06-20 22:50:27 +12:00
Paul Chote
0899916406 Disable diplomacy and cheats for observers 2011-06-20 22:50:26 +12:00
Paul Chote
532bd42aed Remove obsolete Player index cruft 2011-06-20 22:50:26 +12:00
Paul Chote
bcbd18bb52 Skirmish mode starts with a bot selected. 2011-06-20 22:50:22 +12:00
Paul Chote
c6182f6039 Fix player connected chat message 2011-06-20 14:39:03 +12:00
Chris Forbes
3409d8f046 remove type-specific functions for ChromeMetrics.Get; use FieldLoader 2011-06-20 14:39:03 +12:00
Paul Chote
7095f293ff Fix #865 2011-06-20 14:39:03 +12:00
Paul Chote
63e77755b7 Fix #864 - don't display the depressed state if the checkbox is disabled 2011-06-20 14:38:59 +12:00
Paul Chote
d043f4807f Make the checkbox depressed state optional, and disabled in ra. 2011-06-20 14:34:29 +12:00
Paul Chote
94bca753d2 Fix #866 2011-06-20 13:03:23 +12:00
Paul Chote
9bf0a97327 Fix RMBO death sequences 2011-06-20 13:03:23 +12:00
Paul Chote
fe5ef82cdf Allow bot players to be created via map.yaml 2011-06-20 13:03:23 +12:00
Paul Chote
64497c9b2f Fix exploding walls 2011-06-20 13:03:23 +12:00
Paul Chote
2f86208a9a Swap mod and replay buttons 2011-06-20 13:03:23 +12:00
Paul Chote
568814b15a Display cnc mod version in the main menu 2011-06-20 13:03:23 +12:00
Paul Chote
7fb46bb2b6 Work around CreateLocalServer miscompile 2011-06-20 13:03:20 +12:00
Paul Chote
00b730ab0f Update changelog 2011-06-01 19:18:26 +12:00
Paul Chote
b487476ea9 Remove Game.AfterGameStart 2011-06-01 19:18:21 +12:00
Paul Chote
2ebb2ae921 Remove static handler crap from widget delegates - Register/unregister events manually (ra & cnc). 2011-06-01 19:15:55 +12:00
Paul Chote
add29e845e Fix orphaned DropDown panels (eg when exiting menus using a hotkey) 2011-06-01 18:53:41 +12:00
Paul Chote
ad3f378545 Add a hook for widgets being removed, and ensure widgets are removed consistently. 2011-06-01 18:50:59 +12:00
Paul Chote
bbce4368d9 Remove some crap from ra ServerBrowserLogic 2011-05-31 21:22:29 +12:00
Mike Bundy
fcceac1730 GPS fix 2011-05-31 20:44:01 +12:00
Curtis S
b64f883658 Moved Medic cost down to 500 from 800 2011-05-31 20:44:01 +12:00
Curtis S
571386f987 Added 13 new RA maps by buddha, hamb, seru 2011-05-31 20:44:01 +12:00
Curtis S
ed26c7c0b4 Fixed open grass areas in koth-crossroads 2011-05-31 20:44:01 +12:00
Curtis S
5f8e5d6da5 Fixed open grass/water/sea areas on community made maps 2011-05-31 20:44:01 +12:00
Paul Chote
9a2f04ce2d Fix cheats button width 2011-05-31 20:44:00 +12:00
Paul Chote
bce8e0ab1d Fix ftnk firing offsets. 2011-05-31 20:44:00 +12:00
Paul Chote
e79d8133d4 Fix ATWR firing offsets. Add a burst delay. 2011-05-31 20:44:00 +12:00
Paul Chote
489487c96c Fix OBLI fire offset 2011-05-31 20:44:00 +12:00
Paul Chote
9b858af2b7 Add muzzleflash to GTWR. WithMuzzleFlash now actually uses the turret position. 2011-05-31 20:44:00 +12:00
Paul Chote
99611f66de Nerf FTNK 2011-05-31 20:44:00 +12:00
Paul Chote
41819354ac Fix selection box dragging behind other ui elements 2011-05-31 20:44:00 +12:00
Paul Chote
6512db14cf Fix #845 (spawnpoint artwork leaks across mod change) 2011-05-30 22:15:15 +12:00
Paul Chote
c07abc48b2 Remove some nonfunctional code in BuildPaletteWidget 2011-05-30 22:15:15 +12:00
Paul Chote
b425d770c5 Correct parameter order in IOrderTargeter.CanTargetLocation interface definition 2011-05-30 22:15:15 +12:00
Paul Chote
922f4754f9 Drop the ControlGroupModifier setting. Use Cmd on osx for group addition. 2011-05-30 22:15:15 +12:00
Paul Chote
2d43d656c2 Remove bs settings state tracking 2011-05-30 22:15:14 +12:00
Paul Chote
81515705ec Add keyboard shortcut support to ButtonWidgets.
Hook up 'escape' and 'return' as appropriate for moving through menus.
2011-05-30 22:15:14 +12:00
Paul Chote
124f19f00b Bind skirmish servers to a random available port 2011-05-30 22:15:14 +12:00
Paul Chote
a288c5df15 Use static ctors for static setup. 2011-05-30 22:15:14 +12:00
Chris Forbes
a5fdfbfd60 fix water artifacts on cnc shellmap 2011-05-30 22:03:47 +12:00
Chris Forbes
f84312acb9 add editor hack for fixing open areas in existing ra maps 2011-05-30 21:59:25 +12:00
Chris Forbes
5531715652 fixed 850 -- rallypoint flags staying original owner's color after capture 2011-05-30 21:35:35 +12:00
Chris Forbes
368468e323 format RenderSimple 2011-05-30 21:32:54 +12:00
Chris Forbes
61cde675ea fixed 741 -- use the correct superweapon building when more than one is available and some are disabled 2011-05-30 21:26:05 +12:00
Chris Forbes
7ac57014fb tidy 2011-05-30 21:17:25 +12:00
Chris Forbes
596e64e527 remove ReverseEnterTransport -- 852 2011-05-30 21:15:56 +12:00
Chris Forbes
d54c632812 remove unused LinkProc function 2011-05-30 20:59:11 +12:00
Chris Forbes
09027d4770 fixup in RenderCargo 2011-05-30 20:58:18 +12:00
Chris Forbes
05bb335ce2 fix missing center panel part on fancy tooltips 2011-05-30 20:52:16 +12:00
Chris Forbes
0ba41acf4a add muzzle flashes to pbox/hbox 2011-05-30 20:50:45 +12:00
Chris Forbes
e24c8971b6 fixed 796 -- AttackTurreted sets IsAttacking correctly now. 2011-05-30 20:14:43 +12:00
Chris Forbes
24586ac056 fixed 771 -- adds Passenger.Weight, Cargo.MaxWeight, Cargo.PipCount 2011-05-30 20:09:22 +12:00
Chris Forbes
faf0ea387f small cleanup 2011-05-30 19:37:16 +12:00
Chris Forbes
6fd4b565c9 reinstate required hack in GainsExperience.InnerModifyRender 2011-05-23 22:16:21 +12:00
Chris Forbes
4cafabc1f3 fixed 773 -- ftur firing offset 2011-05-23 19:59:48 +12:00
Chris Forbes
aca4d2ebbb fixed 823 -- mouse interaction with password fields uses the metrics of the mask character, not the actual content 2011-05-23 19:57:40 +12:00
Chris Forbes
0d63e9f999 fix glitchyness on repairing veteran units 2011-05-23 19:48:59 +12:00
Chris Forbes
0bd4d6d417 remove unused duplicated function from GraphicsDevice 2011-05-23 19:47:20 +12:00
Chris Forbes
5ecc1ebefc split IGraphicsDevice.{Present,PumpInput} 2011-05-22 22:10:48 +12:00
Chris Forbes
77686adc1a remove batch spam from PerfGraphWidget 2011-05-22 22:05:49 +12:00
Chris Forbes
ef03d46f13 eradicate 'delegate' misuse 2011-05-22 22:02:09 +12:00
Chris Forbes
4b12a19af0 remove Renderer.Resolution duplication everywhere -- it's not free. 2011-05-22 21:38:54 +12:00
Chris Forbes
5ad2c43761 remove duplicated crap from CncLoadScreen 2011-05-22 21:34:59 +12:00
Chris Forbes
fdfa3fc1d3 start cleaning GameInitDelegate 2011-05-22 21:33:48 +12:00
Chris Forbes
41124a12f2 remove bogus empty delegates dir from Game 2011-05-22 21:33:47 +12:00
Chris Forbes
66c72d14d8 split scrollthumb/button in chrome data; fixes screwed up RA scrollthumbs 2011-05-22 21:33:47 +12:00
Chris Forbes
d8ff3b8d3a fix 704 -- parachute offsets are configurable, and sensible now for infantry 2011-05-22 21:33:46 +12:00
Chris Forbes
b792d07c8c start reworking player setup 2011-05-22 21:33:34 +12:00
Chris Forbes
cf5d49a328 fix some subtle crap in map upgrader 2011-05-22 20:41:38 +12:00
Chris Forbes
3bbcbf4701 fix #772 -- GivesBounty uses Actor.GetSellValue 2011-05-22 20:41:37 +12:00
Chris Forbes
0807f4ca8d 782 fixed -- friendly units no longer trigger mines 2011-05-22 20:41:37 +12:00
Chris Forbes
4c36403b75 783 fixed -- mines are visible to spec and allies now 2011-05-22 20:41:36 +12:00
Chris Forbes
f319307b43 fix 776 -- support custom SHPs & bright/dim zap count in TeslaZap projectile type 2011-05-22 20:41:35 +12:00
Chris Forbes
81eaf091c2 fix 752 -- utility --png takes a palette filename as well 2011-05-22 20:41:35 +12:00
Chris Forbes
a0e015746f move MakeSystemPalette out of editor.RenderUtils; rename to Palette.AsSystemPalette() 2011-05-22 20:41:34 +12:00
Chris Forbes
e839ae33d8 hax 2011-05-22 20:41:34 +12:00
Chris Forbes
90cea9f73d expose temp VBO tuning parameters in settings 2011-05-22 20:41:31 +12:00
Chris Forbes
cd6f77ca7c move terrain palette constant lookup outside terrain setup inner loop 2011-05-22 20:39:01 +12:00
Chris Forbes
83c80377d0 formatting in Building 2011-05-22 20:39:01 +12:00
Chris Forbes
b3908606c3 remove some silly cost centers in Building 2011-05-22 20:39:00 +12:00
Chris Forbes
af083a39f0 actually emit the list of missing extensions in the error message. 2011-05-22 20:38:59 +12:00
Chris Forbes
f406504147 add render_flip to perf history 2011-05-22 20:38:59 +12:00
Chris Forbes
fe392bd42d add render_widgets to perf history 2011-05-22 20:38:58 +12:00
Chris Forbes
52f79f232e correctly requote arguments to zenity 2011-05-22 20:38:58 +12:00
Chris Forbes
9434dd993a slight cleanup in Renderer 2011-05-22 20:38:57 +12:00
Chris Forbes
a52d7fb496 fix leaky textures & vbos 2011-05-22 20:38:56 +12:00
Chris Forbes
75588b050e improve error message in CreateDevice 2011-05-22 20:38:56 +12:00
Chris Forbes
1d406bde75 #753 fixed 2011-05-22 20:38:55 +12:00
Chris Forbes
bc48044788 fix #742 tsla & ttnk offsets (from djohe) 2011-05-22 20:38:55 +12:00
Chris Forbes
0eff17240c fix #743 (from djohe) 2011-05-22 20:38:54 +12:00
Chris Forbes
b22bb84349 make AttackMoveActivity a bit less aggressive about pwning the tick perf 2011-05-22 20:38:54 +12:00
Chris Forbes
375eb90a88 fix perf of HackyAI AssignRoles, to some extent 2011-05-22 20:38:53 +12:00
Chris Forbes
9b3e6c5c4a remove FP sillyness from FindUnits & friends 2011-05-22 20:38:52 +12:00
Chris Forbes
ccc245ded4 reintroduce Cached<T>; use for Actor.Bounds, Actor.ExtendedBounds, which replace Actor.GetBounds(bool) 2011-05-22 20:38:48 +12:00
Chris Forbes
b12a35af4c more trivial cleanups 2011-05-22 20:36:25 +12:00
Chris Forbes
599ee25cb1 adjust strictness of Production query in ChooseBuildTabOnSelect 2011-05-22 20:36:25 +12:00
Paul Chote
d4baf2d757 Refactor UnitInfluence trait -> world.ActorMap 2011-05-22 19:32:53 +12:00
Paul Chote
d6496cb5be Remove GainsExperience from mcv, harv, e6. 2011-05-22 19:32:53 +12:00
Paul Chote
4f7074fdf9 Don't give a levelup crate if the unit can't gain experience 2011-05-22 19:32:53 +12:00
Chris Forbes
668dfa1f6f don't show cashticks when there is no refund 2011-05-22 19:32:52 +12:00
Paul Chote
b0fd954b80 BRIK after AFLD/WEAP 2011-05-22 19:32:52 +12:00
Paul Chote
b9ceaae4dd All vehicles leave husks 2011-05-22 19:32:52 +12:00
Paul Chote
d8262486f9 Fix bogus attack-move with harv and apc 2011-05-22 19:32:52 +12:00
Paul Chote
13a2dc6866 Ftnk explodes on death. 2011-05-22 19:32:52 +12:00
Paul Chote
6f6e1b342c Tweak proc price, footprint 2011-05-22 19:32:52 +12:00
Paul Chote
7a2b78b1d8 Fix diplomacy/cheats menu stacking 2011-05-22 19:32:25 +12:00
Chris Forbes
cd756885a6 remove MasterServerQuery in favour of ServerList 2011-05-22 18:41:33 +12:00
Paul Chote
53426030ee Fix hover for ra dropdowns (also scrollpanels) 2011-05-22 18:41:33 +12:00
Paul Chote
325fd509b0 Remove obsoleted dropdown & label code 2011-05-22 18:41:33 +12:00
Paul Chote
d029b1ff6f Use new mechanism for stances / color picker 2011-05-22 18:41:32 +12:00
Paul Chote
0c9692c0b1 Use new mechanism for mod list 2011-05-22 18:41:32 +12:00
Paul Chote
078972e3be Use new mechanism for ra dropdowns 2011-05-22 18:41:32 +12:00
Paul Chote
ab298e1eae Remove redundancy from dropdown setup 2011-05-22 18:41:32 +12:00
Paul Chote
d7a0445e59 Remove ContainerWidget.Background 2011-05-22 18:41:32 +12:00
Paul Chote
7a21309d67 Use ScrollItem for ra music list 2011-05-22 18:41:32 +12:00
Paul Chote
46c870b967 Use ScrollItem for ra map browser 2011-05-22 18:41:32 +12:00
Paul Chote
db417545e6 Use ScrollItem for ra replay browser 2011-05-22 18:41:32 +12:00
Paul Chote
1d24c5f49c Use ScrollItem in ra server browser 2011-05-22 18:41:32 +12:00
Paul Chote
dc6bd60fcc Kill CheckboxWidget.Bind and related 2011-05-22 18:41:32 +12:00
Paul Chote
b1cc004194 Remove obsolete calls from ra SettingsMenuDelegate 2011-05-22 18:41:31 +12:00
Paul Chote
dbd16076a5 Remove unused video player from ra 2011-05-22 18:41:31 +12:00
Paul Chote
5cb0be6c4b Remove obsolete calls from ra DeveloperModeDelegate 2011-05-22 18:41:31 +12:00
Paul Chote
35673a058a Remove obsolete Bold field from widgets 2011-05-22 18:41:31 +12:00
Paul Chote
8eb4e663d2 Fix obsolete Game.Disconnect() 2011-05-22 18:41:31 +12:00
Paul Chote
16cd1679dd Fix special power bin position 2011-05-22 18:41:31 +12:00
Paul Chote
74d068423b Give a sensible error instead of spawning inaccessible filepickers when Fullscreen. 2011-05-22 18:41:30 +12:00
Paul Chote
cb53bcd17d Loadscreen tweaks 2011-05-22 18:41:30 +12:00
Paul Chote
13ceafb658 Fix music install crash. 2011-05-22 18:41:30 +12:00
Paul Chote
bafd12b88e Loadscreen progress bar 2011-05-22 18:41:30 +12:00
Paul Chote
126e489a10 More fluff 2011-05-22 18:41:30 +12:00
Paul Chote
f2f59e3f93 Eva logo. Disable scanlines 2011-05-22 18:41:30 +12:00
Paul Chote
e73248f55c Use the scrollbar arrow "pressed" variants 2011-05-22 18:41:29 +12:00
Paul Chote
75cee824be Move checkbox and button bits to chrome.svg 2011-05-22 18:41:29 +12:00
Paul Chote
3faf78ddd0 New spawnpoint artwork 2011-05-22 18:41:29 +12:00
Paul Chote
eb6c55e289 Merge music buttons into chrome.svg 2011-05-22 18:41:29 +12:00
Paul Chote
939a667229 Merge install logo into chrome.png. Display faction logos on install screen 2011-05-22 18:41:29 +12:00
Paul Chote
f577525fad Remove redundant cnc art src 2011-05-22 18:41:29 +12:00
Paul Chote
aef6223c6c Add logos to the loadscreen 2011-05-22 18:41:29 +12:00
Paul Chote
dcaa161bd1 Diplomacy menu 2011-05-22 18:41:28 +12:00
Paul Chote
84a99be18e Split CncIngameMenuLogic into its own file 2011-05-22 18:41:28 +12:00
Paul Chote
aaecd6ce92 "Battle control terminated" 2011-05-22 18:41:28 +12:00
Paul Chote
18c9a719ac Mission Accomplished / Lost notifications (cnc + ra) 2011-05-22 18:41:28 +12:00
Paul Chote
9f17afe289 Fix racing ticks at gamestart 2011-05-22 18:41:28 +12:00
Paul Chote
797a95ad93 Fade in the menu palette effect over a few frames 2011-05-22 18:41:25 +12:00
Paul Chote
9822afcdb8 New loadscreen 2011-05-21 17:26:20 +12:00
Paul Chote
3ea1534082 Show current title and volume slider in music player 2011-05-21 17:26:20 +12:00
Paul Chote
91a3aafa67 Split the download/install logic into multiple files. 2011-05-21 17:26:20 +12:00
Paul Chote
c76d2e37dc Make the sound engine less dumb about music. Fix the music player not knowing about already playing tracks. 2011-05-21 17:26:20 +12:00
Paul Chote
42d8722cbc Merge DropDownButtons 2011-05-21 17:26:20 +12:00
Paul Chote
58e3a1f41e Use the new dropdowns everywhere 2011-05-21 17:26:20 +12:00
Paul Chote
b2c60e0876 Fix graphics mode dropdown 2011-05-21 17:26:20 +12:00
Paul Chote
5bc0ef69ad Pass WidgetArgs to Widget.Initialize. Use this to allow for custom substitutions. 2011-05-21 17:26:20 +12:00
Paul Chote
b417118429 Prototype text dropdown 2011-05-21 17:26:20 +12:00
Paul Chote
e8d652ad63 New method for attaching panels to dropdowns. Implemented for colorpicker. 2011-05-21 17:26:20 +12:00
Paul Chote
85c519c073 Normalize checkboxes 2011-05-21 17:26:19 +12:00
Paul Chote
14af766427 Remove some duplication from widgets that draw fake buttons. 2011-05-21 17:26:19 +12:00
Paul Chote
b3f9725872 Mark another obsolete field 2011-05-21 17:26:19 +12:00
Paul Chote
04e5794678 Normalize slider 2011-05-21 17:26:19 +12:00
Paul Chote
e09cd16042 Normalize scrollpanel 2011-05-21 17:26:19 +12:00
Paul Chote
adb67699e1 Move ScrollItem upstream 2011-05-21 17:26:19 +12:00
Paul Chote
e09ccef48b Normalize TextFields 2011-05-21 17:26:19 +12:00
Chris Forbes
aa772db9a7 fix crashy behavior in TextFieldWidget 2011-05-21 17:26:19 +12:00
Chris Forbes
a96b1ce01c add property support to FieldLoader 2011-05-21 17:26:19 +12:00
Chris Forbes
310ecc34ce clean up usings everywhere 2011-05-21 17:26:18 +12:00
Paul Chote
eb8aafced0 Normalize ButtonWidgets 2011-05-21 17:26:18 +12:00
Paul Chote
3eb3ae76f0 Fix progressbars 2011-05-21 17:26:18 +12:00
Paul Chote
a9bbb5f5c2 Improve manifest parsing 2011-05-21 17:26:18 +12:00
Paul Chote
e2bd20f888 Reorder sequence loading to save batches 2011-05-21 17:26:18 +12:00
Paul Chote
239a96718d Throw a slightly more useful error on duplicate keys 2011-05-21 17:26:18 +12:00
Paul Chote
d7f009b218 Use the font dictionary everywhere 2011-05-21 17:26:18 +12:00
Paul Chote
e1c8658fdc Fonts are now defined in mod.yaml 2011-05-21 17:26:18 +12:00
Paul Chote
ab423fbe8c Mark some bits obsolete 2011-05-21 17:26:18 +12:00
Paul Chote
2075c7033b Refactor scrollpanel items into their own widget 2011-05-21 17:26:18 +12:00
Paul Chote
033880862d Remove last uses of Bold: in cnc 2011-05-21 17:26:18 +12:00
Paul Chote
a65021b550 Merge most of the new ui into a single texture 2011-05-21 17:26:17 +12:00
Paul Chote
810953ea94 Cheats menu 2011-05-21 17:26:17 +12:00
Paul Chote
0b0fac3c4b Shellmap music 2011-05-21 17:26:17 +12:00
Paul Chote
cb565e5d3c Wire up the settings panel 2011-05-21 17:26:17 +12:00
Paul Chote
ce901427bc Nonfunctional settings panel prototype 2011-05-21 17:26:17 +12:00
Paul Chote
76545db7fd Allow custom CncCheckbox fonts. Tweak CncScrollbar rendering. 2011-05-21 17:26:17 +12:00
Paul Chote
665b6c2b8e Fix server browser 2011-05-21 17:26:17 +12:00
Paul Chote
87cfd0a077 Fix sidebar interaction 2011-05-21 17:26:17 +12:00
Paul Chote
32640d0300 Remove range slider, add a random button 2011-05-21 17:26:17 +12:00
Paul Chote
3e2a49934c Don't use a static variable for player palette preview. 2011-05-21 17:26:16 +12:00
Paul Chote
1526b6ff37 Make Game.LoadWidget / Widget.LoadWidget consistent. 2011-05-21 17:26:16 +12:00
Paul Chote
21267688b0 Split the colorpicker logic into its own handler. Game.LoadWidget no longer adds the loaded widget to the RootWidget. 2011-05-21 17:26:16 +12:00
Paul Chote
529ed51034 Nit: use ServerSettings to pass info to the server 2011-05-21 17:26:16 +12:00
Paul Chote
f4ea4c5daa Add a WidgetArgs type to work around gmcs not understanding lambda -> Action -> object. 2011-05-21 17:26:16 +12:00
Paul Chote
603379aa96 Fix nits 2011-05-21 17:26:16 +12:00
Paul Chote
61facc7bb1 Let panels handle closing themselves 2011-05-21 17:26:16 +12:00
Paul Chote
5fffc9d816 Don't tell the master server about local servers 2011-05-21 17:26:16 +12:00
Paul Chote
f0f591c6fb Initial settings menu copied from the old impl. 2011-05-21 17:26:16 +12:00
Paul Chote
be79529d9e Perf debug 2011-05-21 17:26:15 +12:00
Paul Chote
00f0773dc1 Clear state correctly on mod transition 2011-05-21 17:26:15 +12:00
Paul Chote
e8926ccad3 Initial no-frills mod selector 2011-05-21 17:26:15 +12:00
Paul Chote
fb4a5d4083 Fix mapchooser button order 2011-05-21 17:26:15 +12:00
Paul Chote
80d5b67bb9 Music installation 2011-05-21 17:26:15 +12:00
Paul Chote
dfb07153c6 Rollover etc CncDropDownButtonWidgets 2011-05-21 17:26:15 +12:00
Paul Chote
86159f9ddc Fix lobby color picker 2011-05-21 17:26:15 +12:00
Paul Chote
c4f40babb5 Reimplement music player 2011-05-21 17:26:14 +12:00
Paul Chote
7c18614bf3 Fix observers 2011-05-21 17:26:14 +12:00
Paul Chote
ab28f5867f Disallow watching replays with zero duration. 2011-05-21 17:26:14 +12:00
Paul Chote
814845730f Work around a race condition with local servers. 2011-05-21 17:26:14 +12:00
Paul Chote
33a4f5e29e Support loopback servers for solo play 2011-05-21 17:26:14 +12:00
Paul Chote
b1a6eec3d3 Stop using MasterServerQuery in server browser 2011-05-21 17:26:14 +12:00
Paul Chote
2f9ec67510 Fix the server browser player count 2011-05-21 17:26:14 +12:00
Paul Chote
655eb123b9 Give more polished error messages 2011-05-21 17:26:14 +12:00
Paul Chote
3d493d3ace Package download works. Download error messages need polish. 2011-05-21 17:26:14 +12:00
Paul Chote
37577afc36 Polish 2011-05-21 17:26:13 +12:00
Paul Chote
6a1f3cfc18 Installing from CD reimplemented 2011-05-21 17:26:13 +12:00
Paul Chote
93e55d0866 Install logo 2011-05-21 17:26:13 +12:00
Paul Chote
372d2f5426 Saner load code for cnc. Installing not yet implemented. 2011-05-21 17:26:10 +12:00
Paul Chote
3d347848f3 Remove another hardcoded widget reference and prepare for saner init code. 2011-05-21 17:25:45 +12:00
Paul Chote
2e1e8fd7e8 Apply desat effect on ingame menu too 2011-05-21 17:25:45 +12:00
Paul Chote
d95138b600 Use the same mechanism for loading ingame and shellmap ui. 2011-05-21 17:25:45 +12:00
Paul Chote
07d5f91325 Add scanlines 2011-05-21 17:25:45 +12:00
Paul Chote
6fa9eeb5bb Prompt before quit / surrender 2011-05-21 17:25:45 +12:00
Paul Chote
33b35f768e Nits 2011-05-21 17:25:44 +12:00
Paul Chote
8957caeaca Basic ingame menu reimplemented. 2011-05-21 17:25:44 +12:00
Paul Chote
5e32cd38eb Fix initial selected map, naming. 2011-05-21 17:25:44 +12:00
Paul Chote
7db1b5a1a0 Add a hover state for scrollpanel entries 2011-05-21 17:25:44 +12:00
Paul Chote
fdf9927854 Remember the last map. Disable the server desc and password fields. Draw the chat entry box on top of the display box. 2011-05-21 17:25:44 +12:00
Paul Chote
805f61cc4b Bugfix when connecting via server browser 2011-05-21 17:25:44 +12:00
Paul Chote
fd6c0a90c6 Show the host/port in the dialogs. Show the failed dialog in the lobby when the server vanishes. 2011-05-21 17:25:43 +12:00
Paul Chote
5c59f7703d Reimplement connecting / connection failed dialogs. 2011-05-21 17:25:43 +12:00
Paul Chote
a607a60b8f New textfield with support for hover and disabled states. 2011-05-21 17:25:43 +12:00
Paul Chote
1881a6b713 Generalize the map chooser to work anywhere. Hook it up in server creation. 2011-05-21 17:25:42 +12:00
Paul Chote
1c1b89948a Add a server password field and map name 2011-05-21 17:13:20 +12:00
Paul Chote
09526ee2dd New create server layout 2011-05-21 17:13:20 +12:00
Paul Chote
99eb6ab774 Start reimplementing server creation 2011-05-21 17:13:20 +12:00
Paul Chote
9f4eba9003 Tweaks. The primary button feels better on the right. 2011-05-21 17:13:20 +12:00
Paul Chote
c9dd1aa4bd Improved replay browser 2011-05-21 17:13:20 +12:00
Paul Chote
14a904ab7a Start reimplementing replay browser 2011-05-21 17:13:18 +12:00
Paul Chote
57530c819b Direct Connect panel 2011-05-21 16:28:20 +12:00
Paul Chote
dded6040d6 Convert remaining buttons and checkboxes to cnc variants 2011-05-21 16:28:20 +12:00
Paul Chote
1e66d57ef1 Refactor font code out of LabelWidget 2011-05-21 16:28:17 +12:00
Paul Chote
188a16fc08 Cnc scrollpanel with support for rollover etc. 2011-05-21 16:27:38 +12:00
Paul Chote
d349c5341e Map chooser 2011-05-21 16:27:38 +12:00
Paul Chote
44d3412c7b Fix checkbox active area 2011-05-21 16:27:38 +12:00
Paul Chote
16c3f75269 Color tweaks 2011-05-21 16:27:38 +12:00
Paul Chote
8685d34703 New chat display 2011-05-21 16:27:37 +12:00
Paul Chote
5647917fda New checkboxes (independent from old checkboxes) that support hover and disable. 2011-05-21 16:27:37 +12:00
Paul Chote
c15d2f5cfe Simply the common case for buttons. 2011-05-21 16:27:37 +12:00
Paul Chote
b73575f37b Missed a couple of static bits. 2011-05-21 16:27:37 +12:00
Paul Chote
6cb0cb7d0e Can now start a game and disconnect from lobby without triggering a reload.
It is now possible to crash the game by starting a new server before the previous one has had time to timeout and release the port binding (the previous loadscreen pause meant this was always hidden).
2011-05-21 16:27:37 +12:00
Paul Chote
03264fa2ca Start reimplementing lobby. 2011-05-21 16:27:37 +12:00
Paul Chote
28cf48459b New menu buttons that support hover and a disabled state 2011-05-21 16:27:37 +12:00
Paul Chote
845b32281d Reimplement server browser 2011-05-21 16:27:37 +12:00
Paul Chote
6e3a88f670 Remove most of the chrome yaml. It will all be rewritten. 2011-05-21 16:27:37 +12:00
Paul Chote
a3b430c24a Remove engine references to MAINMENU_BG. Don't push the menu background onto the window list. Crashes whenever a delegate tries to open MAINMENU_BG. 2011-05-21 16:27:37 +12:00
Paul Chote
f74b1b6d27 Hook up Skirmish button 2011-05-21 16:27:36 +12:00
Paul Chote
8661415e67 Settings submenu 2011-05-21 16:27:36 +12:00
Paul Chote
7dd6857ae7 Add a Multiplayer menu 2011-05-21 16:27:36 +12:00
Paul Chote
3e6d1fc1e2 New button layout 2011-05-21 16:27:36 +12:00
Paul Chote
79674b7418 buttons 2011-05-21 16:27:36 +12:00
Paul Chote
7a49a3436e Shellmap border 2011-05-21 16:27:36 +12:00
Paul Chote
f3244d5750 Add a targeting reticle 2011-05-21 16:27:36 +12:00
Paul Chote
214697a506 Tweak menu layout 2011-05-21 16:27:36 +12:00
Paul Chote
550b4495a8 Add a black&white palettemod 2011-05-21 16:27:34 +12:00
Paul Chote
b825ddbb05 Convert cnc shellmap oramap -> directory 2011-05-21 16:27:07 +12:00
Chris Forbes
24d9e292dd wire up ButtonWidget.VisualHeight to ChromeMetrics as an example 2011-05-21 16:27:06 +12:00
Chris Forbes
b183366d54 add ChromeMetrics for values we dont want to duplicate everywhere 2011-05-21 16:27:06 +12:00
Paul Chote
c270f9ff4a Refactor text wrapping into WidgetUtils 2011-05-21 16:27:06 +12:00
Paul Chote
f3a54a802a Add color support to LabelWidget 2011-05-21 16:27:06 +12:00
Paul Chote
24712825eb Throw a useful exception on duplicated widget Id. 2011-05-21 16:27:06 +12:00
Paul Chote
388324dd69 Throw a sane exception when trying to load an invalid widget. 2011-05-21 16:27:06 +12:00
Chris Forbes
178e4664c7 790 fixed -- Widget.EventHandler was never used, removed 2011-05-21 16:27:06 +12:00
Chris Forbes
ec82e6fe68 make ScrollPanelWidget mouse interaction cheaper 2011-05-21 16:27:06 +12:00
Chris Forbes
0c9a1a03ce make ProgressBarWidget cheaper 2011-05-21 16:27:05 +12:00
Chris Forbes
4d4a07b791 make ScrollPanelWidget cheaper 2011-05-21 16:27:04 +12:00
Chris Forbes
9ee7fcdff1 mark some nonsense in LabelWidget 2011-05-21 16:27:03 +12:00
Chris Forbes
8d78ad2fec fix comment in CheckboxWidget 2011-05-21 16:27:03 +12:00
Chris Forbes
788e4780c6 s/order/event/ in ButtonWidget 2011-05-21 16:27:03 +12:00
Chris Forbes
8adca1960d fix comment spelling in ButtonWidget 2011-05-21 16:27:02 +12:00
Chris Forbes
1cf63ec803 Make ButtonWidget cheaper 2011-05-21 16:27:01 +12:00
Chris Forbes
072a42536e Make DropDownButtonWidget cheaper 2011-05-21 16:27:01 +12:00
Paul Chote
b08d8a02f4 Support custom margins and background on TextFieldWidget 2011-05-21 16:27:00 +12:00
Paul Chote
890136d447 Allow Labels to use any defined font. Add a new font type. 2011-05-21 16:26:59 +12:00
Paul Chote
4ad4c4dfb0 Support contrast on labels 2011-05-21 16:26:59 +12:00
Matthew Bowra-Dean
20458fc552 Move Platform.cs to OpenRA.FileFormats, fix #765. 2011-05-21 11:35:04 +12:00
Matthew Bowra-Dean
608126483e Fix #789 2011-05-21 11:34:59 +12:00
Chris Forbes
6277def7a0 fix utility filepicker on windows 2011-05-18 20:53:54 +12:00
Chris Forbes
7b3f178595 remove --pipe sillyness from Utility; obsoletes fmode's patch 2011-05-18 20:45:03 +12:00
Chris Forbes
4d6b2c7954 IBOless rendering with quads; considerably reduces renderer complexity 2011-05-18 20:42:10 +12:00
Chris Forbes
8e1bc25006 fix compile failure on windows due to missing #ziplib reference 2011-05-18 20:30:33 +12:00
Paul Chote
e0401f61de Rebuild osx launcher with xcode 3 2011-05-11 22:01:03 +12:00
Paul Chote
a6d258fa53 Disable installing from cd 2011-05-11 22:00:57 +12:00
Paul Chote
766ae84bd9 Update changelog 2011-05-11 22:00:15 +12:00
Paul Chote
16e0a6551a Disable capturable husks in cnc 2011-05-11 21:33:59 +12:00
Paul Chote
820895bf85 Update zenity wrapper - untested. 2011-05-04 20:24:04 +12:00
Paul Chote
22cd7ae1ad Fix osx launcher. TODO: needs testing on 10.5 2011-05-04 20:24:04 +12:00
Paul Chote
221d6ebd4f Make it actually work 2011-05-04 20:24:04 +12:00
Paul Chote
07dac11144 Install cnc from cd 2011-05-04 20:24:03 +12:00
Paul Chote
4efebcd6b2 Save packages to the support dir by default, but continue to support mods/*/packages 2011-05-04 20:24:03 +12:00
Paul Chote
96c3679cc9 Strip installer functionality from Utility 2011-05-04 20:24:03 +12:00
Paul Chote
83c026e12b Don't rely on the utility for ra package extraction. Untested. 2011-05-04 20:24:03 +12:00
Paul Chote
0102a9ad93 Don't rely on the utility for zip extraction. 2011-05-04 20:24:03 +12:00
Chris Forbes
65c6a23900 style nits & lambda reduction in ClassicProductionQueue.cs 2011-05-04 19:39:28 +12:00
Chris Forbes
fcdb16c938 remove warning from GpsWatcher 2011-05-04 19:31:50 +12:00
Chris Forbes
de8180f217 moar 2011-05-04 19:30:11 +12:00
Chris Forbes
7341b1f8f8 batch-process INotifyIdle, and add PerfSample wrappers for tick_idle and tick_activities 2011-05-04 19:23:40 +12:00
Chris Forbes
de6ac7e650 cache IMove in Actor 2011-05-04 19:23:05 +12:00
Chris Forbes
efaf0208f5 rationalize queue cycling 2011-05-04 18:56:53 +12:00
Chris Forbes
71313a264d adjust strictness in BuildPaletteWidget 2011-05-04 18:46:44 +12:00
Chris Forbes
433fc27744 fix capitalization of playerResources in RenderBuildingOre 2011-05-04 18:46:17 +12:00
Chris Forbes
ea32b1bc6d remove a bunch of trait lookups for PlayerResources 2011-05-04 18:40:33 +12:00
Chris Forbes
d86e0ec522 rename ITraitPrerequisite<T> to Requires<T> 2011-05-04 18:02:35 +12:00
Chris Forbes
8aa206ef95 fix bogus copy in Blast.cs 2011-05-04 18:02:35 +12:00
Chris Forbes
068ee3320e saner IPostRender dispatch 2011-05-04 18:02:34 +12:00
Paul Chote
6676d59847 Cache IOccupySpace and IHasLocation for some free perf 2011-05-04 11:20:41 +12:00
Paul Chote
2d7f3086f6 Nits 2011-05-04 10:46:51 +12:00
Paul Chote
6495478433 Kill Util.Centered 2011-05-04 09:21:30 +12:00
Paul Chote
71f79ad068 Add a testcase 2011-05-03 22:40:43 +12:00
Paul Chote
6cb5616c77 Fix the color picker 2011-05-03 22:40:35 +12:00
Paul Chote
8f962853f9 Support arbitrary per-player palettes. Will crash if I missed any cases that don't explicitly set the Renderable palette. 2011-05-03 22:21:31 +12:00
Chris Forbes
b937489f2d remove some inaccuracies in HACKING 2011-05-03 17:40:02 +12:00
Chris Forbes
0bc427c683 make helicopters actually inherit the plane stuff as intended. oops. 2011-05-03 08:21:56 +12:00
Chris Forbes
64782fb254 use ToList rather than List<T>.ctor 2011-05-02 22:23:36 +12:00
Chris Forbes
bd0a953d66 clean up text render of SPW 2011-05-02 22:18:42 +12:00
Chris Forbes
aea8b8da99 remove some more insanity from SPW 2011-05-02 22:14:24 +12:00
Chris Forbes
ba7522bed6 remove a little of the most blatant idiocy from StrategicProgressWidget 2011-05-02 22:09:27 +12:00
Chris Forbes
00e9015671 fix minelayer going to faraway FIX 2011-05-02 21:38:16 +12:00
Chris Forbes
093f159d8e tuned gpsdot to be somewhat nicer 2011-05-02 21:15:09 +12:00
Chris Forbes
2912c921de add custom icon for harvester 2011-05-02 20:00:56 +12:00
Chris Forbes
dd4c5508fa gpsdot has sprites 2011-05-02 19:51:15 +12:00
Mike Bundy
25962d58c6 GpsDot removed when actor .Destroyed. GpsDot removed from BADR 2011-05-02 19:34:36 +12:00
Mike Bundy
bcbac667db Changes how GPS is watched. Changes GPS ability. 2011-05-02 19:31:40 +12:00
Chris Forbes
7923f7d83a add --shp and --png commands to util 2011-05-02 19:18:27 +12:00
Chris Forbes
9d7ac73410 pull BuildingInfluence trait lookup out of the inner loop of building placement 2011-05-02 10:47:25 +12:00
Curtis S
f7bd3951e3 Fixed creeps owning badrs in some map yamls 2011-05-01 15:22:25 +12:00
Chris Forbes
702f787899 fix entering helicopters 2011-05-01 15:20:35 +12:00
Chris Forbes
5675f02c84 fix koth maps; drop nuclear winter 2011-05-01 15:20:34 +12:00
Paul Chote
5c7f1aa237 Fix deb packaging 2011-05-01 12:21:24 +12:00
Chris Forbes
eb3f4ef21d remove random Application.DoEvents() from Game.cs 2011-04-30 14:31:02 +12:00
Chris Forbes
7155747337 remove IShader.Commit 2011-04-30 14:29:32 +12:00
Chris Forbes
279413f05b dont crash on disconnect from lobby 2011-04-30 11:14:25 +12:00
Chris Forbes
f84832a24a remove some duplication in parachute use 2011-04-29 19:52:36 +12:00
Chris Forbes
b26d2e07e9 formatting 2011-04-29 19:50:31 +12:00
Chris Forbes
2b0f553d9d remove a silly lookup in RenderSimpleInfo 2011-04-29 19:47:44 +12:00
Chris Forbes
0b0e857b13 write traitreport to a file on disconnect, not stdout 2011-04-29 19:38:54 +12:00
Chris Forbes
3a0dcf3ae4 trim some crap 2011-04-29 19:37:36 +12:00
Chris Forbes
9ebea704ad clean up CrateDrop 2011-04-29 17:48:29 +12:00
Chris Forbes
71ca0f028e remove some sillyness from LightPaletteRotator 2011-04-29 17:25:13 +12:00
Chris Forbes
2d82f68a89 remove a dumb traitinfo lookup every tick in Crate 2011-04-29 17:20:16 +12:00
Paul Chote
88b7e70d64 Retain old deb package naming to avoid breaking the website 2011-04-24 13:30:40 +12:00
Chris Forbes
60ce83e696 cleanup cargo, remove some traitcalls 2011-04-23 10:58:46 +12:45
Chris Forbes
24798adf72 simplify & patch Passenger 2011-04-23 10:43:03 +12:45
Chris Forbes
c7ee613ca0 add trait query report on disconnect 2011-04-22 11:12:50 +12:45
Chris Forbes
e829c01ee6 else after return is silly 2011-04-22 10:32:47 +12:45
Chris Forbes
c34d987e4a remove a couple of trait lookups 2011-04-22 10:31:47 +12:45
Chris Forbes
8dc3fbead6 fix ra crash on placing refinery 2011-04-22 10:23:22 +12:45
Chris Forbes
00c4d1b469 remove FlyAttackLoop 2011-04-19 18:40:24 +12:00
Chris Forbes
4bf484bbe9 make paratroopers use FlyAttack rather than FlyAttackLoop 2011-04-19 18:39:31 +12:00
Chris Forbes
cd9f2bf716 make CrateDrop use FlyAttack rather than FlyAttackLoop 2011-04-19 18:38:25 +12:00
Chris Forbes
4ea9cdb003 allow FlyAttack to work without AttackPlane 2011-04-19 18:37:12 +12:00
Paul Chote
ca379ce007 Remove some needless allocations 2011-04-18 10:50:36 +12:00
Paul Chote
24908b7269 Split Harvest activity into saner chunks; fix pathfinding. 2011-04-18 10:47:10 +12:00
Paul Chote
eff37461d8 Pull Visible crap out of Harvester 2011-04-18 09:34:58 +12:00
Paul Chote
63e40aec68 Remove some crap from OreRefinery 2011-04-18 09:34:43 +12:00
Chris Forbes
73352937ff fix 705 for cnc 2011-04-18 09:09:20 +12:00
Chris Forbes
9d10bb6c69 fix 705 for ra 2011-04-18 09:08:26 +12:00
Chris Forbes
9481408136 remove some duplication from HackyAI 2011-04-18 08:23:16 +12:00
Chris Forbes
2317325591 add a lint pass to catch Mirey's bogus autotarget wiring cases 2011-04-18 07:37:29 +12:00
Paul Chote
a0941db61b Fix warfactory roof glitch 2011-04-17 20:02:02 +12:00
Paul Chote
5adc90a76e Fix map-placed SAM sites 2011-04-17 19:35:49 +12:00
Chris Forbes
76b3e2325b make RenderBuildingOre slightly more robust; remove some junk 2011-04-17 19:22:21 +12:00
Chris Forbes
ae645bbafe fix missing explosion on war factory; remove some nonsense 2011-04-17 19:22:21 +12:00
Chris Forbes
4f76876f05 remove one of the Move constructors 2011-04-17 19:22:21 +12:00
Chris Forbes
9541023456 664 fixed 2011-04-17 19:22:21 +12:00
Chris Forbes
5e0f57d730 tabify 2011-04-17 19:22:21 +12:00
Chris Forbes
e4dcf256aa quick fix for 702 2011-04-17 19:22:21 +12:00
Paul Chote
5a0aea7eb1 *.exe should remain executable 2011-04-17 13:51:35 +12:00
Paul Chote
3f06d6b867 Fix version string order 2011-04-17 13:02:00 +12:00
Paul Chote
35c925bcbe Update the description 2011-04-17 12:54:35 +12:00
Paul Chote
f0df830b69 Put the openra binary in /usr/games 2011-04-17 12:43:36 +12:00
Paul Chote
5862c795a9 Fix changelog format (still not compliant because it doesn't have * before the entries, but close enough...) 2011-04-17 12:34:35 +12:00
Paul Chote
a93ed12ce0 Put the changelog and copyright files in the correct location 2011-04-17 11:54:13 +12:00
Paul Chote
561eda4ba9 Remove postinst and postrm scripts 2011-04-17 11:34:18 +12:00
Paul Chote
952cd47e7a Update copyright, make myself maintainer, remove nonstandard Uploaders field. 2011-04-17 11:33:11 +12:00
Paul Chote
e7b71e7c66 Fonts are provided by ttf-freefont 2011-04-17 11:16:12 +12:00
Paul Chote
9bc0ad5605 Remove the packages directory from the repo/packages (running a source build should now do the correct thing wrt package downloading) 2011-04-17 11:04:41 +12:00
Paul Chote
aa9eb6058d Make built files nonexecutable 2011-04-17 10:46:58 +12:00
Paul Chote
72a783a647 Remove executable bit from files 2011-04-17 10:40:47 +12:00
Paul Chote
b2167adf1a Kill QueuedActivity 2011-04-16 15:37:31 +12:00
Paul Chote
bfceced8a0 Update changelog 2011-04-16 14:15:43 +12:00
Paul Chote
6b5f455c38 Rename CancelableActivity.cs -> Activity.cs 2011-04-16 13:24:34 +12:00
Paul Chote
4f83e994d0 Tidy up Activity.Cancel(), make Tick abstract 2011-04-16 13:18:22 +12:00
alzeih
0a67c68c45 GetTargetQueue -> GetTargets + Exts 2011-04-16 12:57:55 +12:00
alzeih
820f67e46b more for Activity 2011-04-16 12:56:10 +12:00
alzeih
255bac6aff QueuedActivity's Insert is broken 2011-04-16 12:50:13 +12:00
Paul Chote
4e89326134 Fix #701 - cannot select spawnpoints > 8. 2011-04-16 12:10:45 +12:00
Paul Chote
e5506f2455 Rename RenderWarFactory -> RenderBuildingWarFactory 2011-04-16 12:05:02 +12:00
Chris Forbes
9bd5c153ad interfaces cleanup 2011-04-16 12:01:23 +12:00
Chris Forbes
8a4f49485b remove defunct IOrderCursor interface 2011-04-16 12:01:23 +12:00
Chris Forbes
447fd05723 unify handling of order expose + issue for plane/heli; was identical 2011-04-16 12:01:23 +12:00
Chris Forbes
865f3e1b74 factor out resupply activity queueing for plane/heli into aircraft 2011-04-16 11:59:42 +12:00
Mike Bundy
0cb133e038 Bug Fix: GPS is shared across owned ATEKs 2011-04-16 11:59:42 +12:00
Paul Chote
794dcac4d2 Create INotifyDamageStateChanged for nearly everything else that used INotifyDamage. 2011-04-16 11:51:34 +12:00
Paul Chote
8b00e1cfa5 Remove some bogus duplication in Sell (caused the double-sell bug). 2011-04-16 11:39:32 +12:00
Paul Chote
7b0a9136ab Remove some bogosity from RenderBuilding 2011-04-16 11:19:37 +12:00
Paul Chote
1c2574f4f4 Add an INotifyKilled interface, which is what most things that used INotifyDamaged actually cared about. 2011-04-16 10:58:35 +12:00
Chris Forbes
d9fc84b55e cleanup InflictDamage a bit 2011-04-14 22:44:32 +12:00
Paul Chote
7109428058 Fix double-sell fail 2011-04-14 15:50:16 +12:00
Chris Forbes
f45ec6f918 691,697 fixed 2011-04-14 12:13:08 +12:00
Chris Forbes
d221cb1902 report maxplayers to master server 2011-04-13 20:33:10 +12:00
Chris Forbes
93a2e478f9 fix 'exploit detected' spam when selecting someone else's units and pressing s/f/x 2011-04-13 20:13:54 +12:00
Chris Forbes
005d0a6a32 split out aircraft and ships into their own files for cnc too 2011-04-13 19:59:05 +12:00
Chris Forbes
5f76f1ca7f split ships out into their own yaml too 2011-04-13 14:39:49 +12:00
Chris Forbes
33815eaa4e split aircraft out into their own yaml file 2011-04-13 13:27:09 +12:00
Chris Forbes
7be167b4fd fix crash in SatelliteLaunch ctor 2011-04-13 11:37:15 +12:00
Caleb Anderson
5adda21b28 fix build 2011-04-13 07:22:10 +12:00
Chris Forbes
c19881cae3 694 fixed -- the same building can now do both repair and rearm for aircraft 2011-04-12 08:49:58 +12:00
Chris Forbes
e4d2839254 spacing nit 2011-04-12 08:47:55 +12:00
Paul Chote
61db3b3965 Kill HPFraction 2011-04-12 08:42:13 +12:00
Paul Chote
cd64d62b7e Fix bogus silo/wall rendering 2011-04-12 08:42:13 +12:00
Paul Chote
715425d821 Capturable husks for cnc 2011-04-12 08:42:07 +12:00
Paul Chote
362170ee67 Tweak capturing traits 2011-04-12 08:41:25 +12:00
Paul Chote
a31ef3d8e2 Use MakeAnimation activity for make animations 2011-04-12 08:41:25 +12:00
Chris Forbes
394ee0dfe6 add seru's 'Pressure' map 2011-04-12 08:30:11 +12:00
Caleb Anderson
3fe4d32674 helis don't fail to attack on diagonal approach 2011-04-12 08:17:11 +12:00
Mike Bundy
bca2797bb4 Bug Fix: Helicopters spawning under each other 2011-04-10 23:36:49 +01:00
Mike Bundy
7a63858812 Bug Fix: Cash ticks for TRUK and Bounties only show for allies 2011-04-10 21:22:42 +01:00
Chris Forbes
d2d0e4be96 better support for contrail coloring everywhere 2011-04-10 11:15:43 +12:00
Chris Forbes
79079ebe07 working missile trails 2011-04-10 11:15:42 +12:00
Chris Forbes
5fd3cc7977 internal machinery for contrails on missiles 2011-04-10 11:15:41 +12:00
Chris Forbes
6710ad975e split out ContrailHistory from the trait machinery 2011-04-10 11:15:40 +12:00
Chris Forbes
c4a72f016a remove some more bits 2011-04-10 11:15:39 +12:00
Chris Forbes
c2966978f3 start trimming down prox code 2011-04-10 11:15:37 +12:00
Paul Chote
fe4fd8cab0 Use MakeAnimation for selling; Support selling non-buildings 2011-04-10 11:03:42 +12:00
Paul Chote
e4d8680bd5 Pull the make animation crap out of Transforms 2011-04-10 10:53:04 +12:00
Paul Chote
43f81501a8 Split Capturable into its own trait 2011-04-10 10:07:00 +12:00
Chris Forbes
40f6c4e332 clean up unnecessary junk from MoveAdjacentTo 2011-04-09 15:21:16 +12:00
Chris Forbes
3325739035 fix pathing to repair pad being bogus 2011-04-09 15:20:18 +12:00
Chris Forbes
f851e6a212 fix a silly glitch in unit repairing 2011-04-09 15:14:19 +12:00
Chris Forbes
260b95f96d fix utility crashing on windows (hack) 2011-04-09 14:26:47 +12:00
Chris Forbes
abb895d8be fix logfile opening to be sensible 2011-04-09 14:26:46 +12:00
Chris Forbes
19ad0bf0cc improve util arg parsing 2011-04-09 14:26:45 +12:00
Chris Forbes
ba72276b83 some more sanity in util 2011-04-09 14:26:44 +12:00
Chris Forbes
fddfdd5073 remove some crap code in Util 2011-04-09 14:26:43 +12:00
Chris Forbes
b633802ec2 remove one use of Path.DirectorySeparatorChar 2011-04-09 14:26:42 +12:00
Chris Forbes
48a359e202 cleanup header of FileSystem.cs 2011-04-09 14:26:41 +12:00
Chris Forbes
6105859b25 remove some junk from GameInitDelegate 2011-04-09 14:26:40 +12:00
Paul Chote
110f1aacc2 Normalize yaml lineendings 2011-04-09 12:14:33 +12:00
Paul Chote
4c92293814 Remove UnitInfluenceDebug checkbox 2011-04-09 12:10:16 +12:00
Chris Forbes
c99be90548 remove an unused OT 2011-04-09 12:02:21 +12:00
Mike Bundy
3e04b17b46 Feature: Bounties added to Buildings/Units at 10% of value + 1.25 for each lvl 2011-04-09 11:04:59 +12:00
Chris Forbes
7d29d90338 from mirey: pilot parachutes from shot down plane, sometimes 2011-04-09 11:01:17 +12:00
Chris Forbes
ca81871b7b fix broken merging of yaml overrides in maps; we now have a strict mode and a liberal mode. 2011-04-09 10:55:54 +12:00
Chris Forbes
7cd983a83b fix line endings on various yamls 2011-04-09 10:55:53 +12:00
Paul Chote
c775b5ba68 Remove some dead code from UOG. 2011-04-09 10:32:36 +12:00
Paul Chote
c87188e93f Fix ownership of deb contents 2011-04-09 09:04:25 +12:00
Chris Forbes
f47c2a678c remove some unnecessary semantics-muddying 2011-04-08 09:47:42 +12:00
Paul Chote
aba14eec23 Squash compiler warnings 2011-04-07 21:26:57 +12:00
Paul Chote
b0425aff3b Renormalize line endings and fix copyright headers again. 2011-04-07 21:15:42 +12:00
Caleb Anderson
1a49b46af1 Added myself to authors 2011-04-07 20:05:16 +12:00
Chris Forbes
a97ae5a4d5 fix bogus split2/split3 yaml 2011-04-06 09:24:54 +12:00
Curtis S
88d63d07e6 Adds TRUK to both sides - donates cash to others 2011-04-06 09:16:42 +12:00
Chris Forbes
b4fe4818a9 remove slight sillyness from ralint output 2011-04-06 07:21:06 +12:00
Erasmus Schroder
a2060b26ed HackyAI: Corrected squadsize, removed unnecessary lines. 2011-04-06 07:20:04 +12:00
Erasmus Schroder
8e56bdc197 Made HackyAI attackers scan for enemy units 2011-04-06 07:20:01 +12:00
Chris Forbes
9f3107f642 fix #688 2011-04-06 07:16:54 +12:00
Chris Forbes
24a205d992 actually working custom lint passes 2011-04-05 21:56:31 +12:00
Chris Forbes
55c609ee16 fix bug 609 -- removing traits that arent on an actor is an error. 2011-04-05 21:26:32 +12:00
Chris Forbes
576e9b90f6 remove slight fail 2011-04-05 21:26:02 +12:00
Mike Bundy
4d4cd6940b Fixed Bug: Game crash when ATEK destroyed as GPS launched 2011-04-04 12:40:53 +12:00
Curtis S
f6b8e36f36 v2rl arty bridge behaviour fix 2011-04-04 11:22:00 +12:00
Mike Bundy
e544333d9e Bug Fix: Selling ATEK loses GPS 2011-04-04 11:17:37 +12:00
Chris Forbes
1af23079eb make it crash nicely when you inherit from a bogus actor type 2011-04-04 11:14:07 +12:00
Chris Forbes
cee021ef17 fix AudLoader failing to load sounds that use only half of the final byte 2011-04-04 11:13:58 +12:00
Paul Chote
1f12306924 Fix default utility not passing supportdir to zip/install-ra. Fix game crash when utility crashes during extract. 2011-03-30 21:47:48 +13:00
Paul Chote
e63f9c34f8 Log the gpu vendor into graphics.log 2011-03-30 21:14:49 +13:00
Paul Chote
c746a3e81a Upgrade osx launcher project to xcode 4, remove unnecessary webkit reference, fix bogus arg passing to OpenRA.Utility (now passes everything) 2011-03-30 21:07:49 +13:00
Paul Chote
3dda9ee607 Write a utility.log to the logs dir when the utility crashes 2011-03-30 20:52:54 +13:00
Paul Chote
5d762b1f9c Fix root cause for `world owned by creep' bugs 2011-03-29 21:13:01 +13:00
Paul Chote
23eb077417 #672 - Textfield support for home and end 2011-03-26 10:35:58 +13:00
Paul Chote
ea626d4b39 RMBO voices on build and kill. 2011-03-25 20:04:23 +13:00
Paul Chote
a14968810c Add new voice keys for rmbo in preparation for following patches 2011-03-25 19:17:53 +13:00
Paul Chote
2f29e462a8 Fix #661 - map placed SAMs cannot attack 2011-03-25 18:54:53 +13:00
Paul Chote
8c18949861 Change C4Demolition from minutes to ticks; actually use this value. 2011-03-23 21:07:11 +13:00
Paul Chote
6ecf8aaf20 Set autotarget range to sight for all cnc infantry 2011-03-23 20:35:50 +13:00
Paul Chote
b7262b6490 Allow Autotarget to have a custom scan radius, use it for VICE. 2011-03-23 20:31:27 +13:00
Paul Chote
3071cd8240 Kill RenderUnitRotor in favour of RenderUnit + WithRotor. 2011-03-23 08:05:09 +13:00
Paul Chote
c7e2619a98 Explicitly declare dependency on Attack* from AutoTarget/AutoHeal. 2011-03-22 21:36:06 +13:00
Paul Chote
1ceede4322 Fix #656 - base cycling fired on both key down and key up. 2011-03-22 21:21:34 +13:00
Paul Chote
a745f3dc40 Update changelog 2011-03-20 08:47:54 +13:00
Paul Chote
0d53346138 Fix bogus ClampToWorld behavior (allowed helicopters to fly outside map) 2011-03-19 21:01:14 +13:00
Chris Forbes
41a6e94e87 fix visual glitchyness on creating actors that will be selected in their first tick 2011-03-19 19:48:16 +13:00
Chris Forbes
708cdcd855 add CashTick to building refunds 2011-03-19 18:58:04 +13:00
Chris Forbes
0236da0a28 fix up ralint a bit 2011-03-19 18:53:50 +13:00
Chris Forbes
18e1de1d4b prefer to circle over something friendly than leave the map 2011-03-19 18:44:39 +13:00
Chris Forbes
73a34886ec oops 2011-03-19 18:44:38 +13:00
Chris Forbes
2d480c900f patch plane to circle after move 2011-03-19 18:44:37 +13:00
Chris Forbes
0cf022c87a rename FlyCircle -> FlyAttackLoop, for accuracy; new FlyCircleto fly a hold 2011-03-19 18:44:36 +13:00
Paul Chote
dea199400d Fix #630 - Muzzleflashes on cnc apache 2011-03-19 18:40:12 +13:00
Paul Chote
8e079c310a Give Oil Derricks a small sight range 2011-03-19 17:48:56 +13:00
Paul Chote
a5af4e85ce Tweak CashTick and Oil Derricks 2011-03-19 17:48:56 +13:00
Paul Chote
08158a6929 Allow the control group modifier key to be customized. 2011-03-19 17:48:56 +13:00
Paul Chote
6ba6940aad Support the meta key modifier 2011-03-19 17:48:56 +13:00
Chris Forbes
72e0b58912 fix csproj bogosity 2011-03-19 17:28:45 +13:00
Paul Chote
0d2a692d8d Fix bogus prereqs in ra. 2011-03-18 11:27:16 +13:00
Paul Chote
e043f38c00 Whoops, forgot to commit the changelog 2011-03-18 11:01:57 +13:00
alzeih
53f4337129 Don't change mods if the same one is selected in the dropdown 2011-03-18 10:49:29 +13:00
Paul Chote
eb69b697b1 Fix bogus handling of special keyboard characters everywhere else. Textfields now only accept valid characters, support right-delete. 2011-03-18 10:48:12 +13:00
Paul Chote
7d6d488176 Fix #549 - Shift + tab doesn't cycle build tabs backwards. 2011-03-18 09:44:28 +13:00
Paul Chote
c568759e49 Fix #595 - IDisposable crash. 2011-03-17 22:26:28 +13:00
Paul Chote
d05b979e53 Tweak cnc proc cashtick 2011-03-17 22:26:28 +13:00
Paul Chote
86e8c3974f Fix #611 - prereqs handled by traits. Make both cnc power plants valid for prereqs. 2011-03-17 22:26:28 +13:00
Paul Chote
6d1defc53e Use CashTick on harv unloading. 2011-03-17 22:24:17 +13:00
Paul Chote
ffac0221cf CashTick IEffect for Oil Derricks. 2011-03-17 22:24:17 +13:00
Chris Forbes
a3994df925 queries dies 2011-03-17 22:09:10 +13:00
Chris Forbes
caa52b2780 remove CachedView 2011-03-17 22:09:09 +13:00
Chris Forbes
149324ea92 remove most of the crap from queries 2011-03-17 22:09:08 +13:00
Chris Forbes
eba7641125 remove old Sell handler from Building 2011-03-17 22:08:53 +13:00
Chris Forbes
da36ce19e2 fix sellable compile fail 2011-03-17 20:09:43 +13:00
Chris Forbes
7e25947689 yaml changes for sellable 2011-03-17 19:14:20 +13:00
Chris Forbes
4eaa7d5cf2 split out Sellable into its own trait; yaml requires update 2011-03-17 19:14:17 +13:00
Chris Forbes
ff44e34d89 dont be detected by friendly detectors 2011-03-16 20:48:34 +13:00
Chris Forbes
8bef8d5a72 have spies appear a convincing color on radar too 2011-03-16 20:30:23 +13:00
Chris Forbes
048386e6fa add ExperienceInit (MapActor's 'Experience:' key, int) 2011-03-16 19:30:58 +13:00
Chris Forbes
f3dfc422ab fixed #635 2011-03-16 19:16:38 +13:00
Chris Forbes
3b89110202 fix some bogosity in MasterServerPinger (still not right) 2011-03-16 11:02:17 +13:00
Chris Forbes
73d27c822e add IgnoresDisguise; support it in AppearsHostileTo / AppearsFriendlyTo 2011-03-16 09:51:26 +13:00
Chris Forbes
a21deea60b spam the CellInfo messages into the debug log, not the chat 2011-03-15 12:18:08 +13:00
Chris Forbes
981e57bde8 some more overloads etc 2011-03-15 12:18:03 +13:00
Chris Forbes
c313920c7c include the utility in the core target, since the game needs it for package download now 2011-03-15 10:14:56 +13:00
Chris Forbes
cf9e81ea29 fix #645 2011-03-15 09:41:46 +13:00
Chris Forbes
4f79aca484 fix #643 2011-03-15 09:32:25 +13:00
Chris Forbes
5ad196acc3 fix #646 2011-03-15 09:30:24 +13:00
Chris Forbes
e66ebef73c some more bits for .gitignore 2011-03-15 09:29:19 +13:00
768 changed files with 41681 additions and 31248 deletions

5
.gitignore vendored
View File

@@ -50,3 +50,8 @@ OpenRA.Launcher.Mac/OpenRA.xcodeproj/*.perspectivev3
OpenRA.Launcher.Mac/OpenRA.xcodeproj/*.mode1v3
*.config
*.resources
# other crap
Logs/
Replays/
settings.yaml

View File

@@ -9,3 +9,6 @@ The OpenRA developers are:
* Joakim Lindberg
* Andrew Riedi
* Tim Mylemans
* Curtis Shmyr
* Caleb Anderson
* Daniel Hernandez

194
CHANGELOG
View File

@@ -1,10 +1,178 @@
Changes as of adb2ab5ec0aebfe676030223e4badd773f43a670
NEW:
Engine:
Fixed compile failures under Windows
Improved platform detection
Modding support for custom fonts
Video memory leaks fixed
Improved error messages for unsupported graphics cards
Improved support for Intel graphics cards
Fixed incorrect resolution under some Linux systems
Write graphics.log on all graphics-related errors
Significant general performance improvements
Fix crashes when joining a game with no free player slots
Bots players are named after their AI type and pick better random colors
Map support for enforcing team and spawn choice
Fix resource-clearing weapons breaking custom terrain types (bridges)
Added a "Pixel double" mode to draw the world at 2x zoom.
Fixed broken mounting of map packages
Fixed crashes when loading broken maps
Fixed units being left alive but stranded on destroyed bridges
Fixed husks being created on water
Both C&C and Red Alert:
Fixed desync when a player surrenders
Fixed installing from CD
Added Hotkey support:
escape to toggle ingame menu
escape to go up a level in menus / cancel prompts
return to confirm prompts
Changed shortcut for adding units to groups changed from ctrl->cmd on OSX to avoid conflicting with Spaces
Fixed Tooltips for spectators
Fixed cashticks when selling walls
Fixed show explosions when walls are sold
Fixed veteran units not repairing correctly at service depots
Fixed Rally-point color when a building is captured
Fixed selection box dragging behind ui elements
Added Mod support for passengers that take multiple slots
Added Mod support for custom tesla zap effects
Fixed desync when a support aircraft is killed after completing its task
Fixed bugs with selling refineries
Fixed superweapons being fired from disabled structures when multiple are available
Added "Mission Accomplished" / "Mission Failed" notifications when you win or lose a multiplayer game
Fixed husks jumping to the middle of a cell when a unit dies
Fixed decloak sound never being used
Improved HackyAI power management
C&C:
Completely overhauled UI
Added support for installing from original game disks
Added support for installing music from original game disks
Added support for Covert Ops music tracks
Added Skirmish mode (creates a local game against bots)
Added Configurable bot race/team/spawns
Fixed Rocket Launcher turret raising/lowering when attacking
Added muzzle flashes to Guard Tower / SAM site
Fixed firing offsets on all units and structures
Fixed Ion Cannon cursor
Fixed Apache artwork
Fixed uncapturable oil derricks
Added capturable Biolab tech structure: allows you build viceroids
All vehicles leave husks on death
Server/Skirmish creation selects the last played map by default
New animations for cloak and reveal map crates (from C&C Sole Survivor)
Added 8 new maps by Petrenko
Tweaked most existing maps
Removed East vs West 2 map
Fixed Harvester/Refinery docking animation beneath the fog of war
Improved Obelisk laser effect
Added a blue pip for harvested blue tiberium
Changed the Refinery tower lights to indicate the amount of stored tiberium
Fixed an exploit with Nod airfields on the right side of the map
Fixed bot color being saved as player color in lobby
Balance changes:
Refinery footprint changed, price decreased to $1500
Flame tank explodes on death, damage reduced by 40%
Stealth Tank damage increased, speed decreased
Rocket Launcher now fires 6 rockets, loses AA
Orca / Apache weapons reworked. Both now have limited volleys, but reload in the air. Both can attack other air units
APC weapons reworked. Now has a turret, but can attack air units only
Artillery given back to Nod
SSM launcher removed from Nod
Concrete walls require vehicle production to build
MCV, Harvester, Engineer can no longer level up (via crates)
MCV can no longer receive Cloak crates
Advanced Guard Tower range increased
SAM Site range decreased
Bridge HP halved
Infantry tiberium avoidance factor increased by 5x
Decrease tiberium damage to infantry
Rebalanced tiberium value / harvester capacity / harvesting speed
Reduced Grenadier death damage
Mammoth tank regen rate halved, Missile reload rate decreased
Building repair speed, price doubled
Recon Bike damage increased 16%
Infantry can be crushed by tanks
Removed build area radius around tech structures
Red Alert:
Fixed firing offsets on Flame trooper / Tesla trooper / Telsa tank / Tesla coil / Flame turret
Fixed bounties using incorrect unit value
Fixed parachute offsets
Added muzzle flashes to Pillbox / Camo Pillbox / SAM Site
Fixed map reveal when an ally is granted GPS
Added 16 new maps by buddha, hamb, seru
Fixed bounties of $0 displaying
Removed 3 obsolete maps
Fixed Minelayers not entering the Service Depot properly
Fixed Hind, Yak weapons being blocked by walls
Fixed phantom radar bin on subsequent games
Added new Oil Derrick artwork
Added support for Counterstrike & Aftermath music tracks
Added player color to diplomacy panel
Added capturable oil refinery tech structure
Added new harvester artwork for half-empty/empty states
Added new MCV husk artwork
Fixed spy disguise not working
Fixed hellfire missiles splashing back against helicopters
Fixed animation speed for Grenadier idle animations
Removed Lock Teams option
Fixed cursor while dragging selection box
Fixed accidental order issuing while dragging selection box
Balance changes:
Medic cost reduced to $500
Mines are visible to friendlies and spectators
Friendly units don't trigger mines
Increased reload rate for aircraft
Missile sub submerge delay doubled, damage decreased by 25%
Longbow now requires Allied Tech Center
Reduced wall health
Increased cruiser accuracy
Utility:
Fixed --png mode for converting shp -> png
Editor:
Fixed actor rendering on OSX / Linux
Fixed crash relating to incorrect mix file location
20110511:
Engine:
Fix hotkeys firing on both key down and key up
Allow C4 delay to be configurable
Text field support for home and end keys
Fix world actor being owned by Creeps player (causing Neutral to be hostile) on new maps
Include gpu vendor string in graphics.log for unsupported cards
Fix crash with some aud files
Fix a rare crash when a repairing building is killed
Improvements to HackyAI
Generalize capture logic to work for any actor types
Support RA2-style missile trails
Fix helicopters failing to attack targets in some situations
Fix 'exploit detected' when using hotkeys on another players units
Relinquish spawn point in the game lobby when entering a spectator slot
Fix maps with >8 spawnpoints in the game lobby
Yaml loader crashes correctly when trying to inherit from a nonexistant actor
Yaml loader crashes correctly when trying to remove a nonexistant trait
Modding support for multiple player palettes
Fix several crashes when installing packages
Many other general engine improvements
C&C:
Fix Viceroid target-scan radius
Fix map-placed SAM-sites not being able to attack
Commando voice clip when built
Commando voice clip after kills
RA:
New unit: Supply truck for donating funds to another player
Pilots (sometimes) parachute from shot down planes
Bounties on killed units
Use RA2 style missile trails
New GPS logic
New map: Pressure by seru
Packaging:
Utility writes a log to support dir when crashing
Support for Ubuntu 11.04
Fix osx crash when run from a path with spaces
20110320
Engine:
Display range circles when placing defenses
Support a hostile creeps player for viceroids / dinosaurs / ants / etc
General refactoring and performance fixes
Fix crashes caused by blank game title / direct connect server textfields
Fix GPS behavior when alliances change.
Stop/Scatter/Deploy orders give audio feedback
"Allow cheats" option moved into the game lobby, visible to all players
"Build anywhere" developer mode option
@@ -30,6 +198,16 @@ Changes as of adb2ab5ec0aebfe676030223e4badd773f43a670
Fix crash when spawning map actors owned by a nonexisting player
Fix crash when changing mod while playing music
Fix crash with perf graph
Fix crash in replay viewer if replays directory doesn't exist
Fix crash when selling civilian buildings
Fix crashes caused by blank game title / direct connect server textfields
Oil derricks, harvester unloading, selling structures shows cash indicator
Prerequisites system refactoring to allow non-building prerequisites
Fix shift+tab not cycling the build tabs
Fix bogus keyboard input in text fields
Don't change mods if the same one is selected in the dropdown
Support for remapping the control group addition modifier (ctrl) to any modifier key
Fix helicopters flying 1 cell off the right or bottom of the map
C&C:
Viceroids! Infantry killed by tiberium or chem warriors may turn into viceroids
@@ -43,6 +221,8 @@ Changes as of adb2ab5ec0aebfe676030223e4badd773f43a670
Fix a rare crash with stealth tank
New Map: East vs West 3 by pchote
Removed Maps: Wargames, Yellowstone II
Oil Derricks have a small sight range
Apaches have a muzzleflash
RA:
Service depots repair units faster
@@ -68,6 +248,10 @@ Changes as of adb2ab5ec0aebfe676030223e4badd773f43a670
Spys are ignored by enemy units when disguised, tooltips show as disguised unit
Fix crates being paradropped inside trees, buildings
Production hotkey for flame turret changed to t, tesla coil to u
Disguised spys now appear correctly on radar and tooltips
Fix GPS behavior when alliances change.
Aircraft now fly to a target location and circle instead of returning to base
Aircraft no longer fly off the map if their Airfield is destroyed
Editor:
New map format (version 5). Maps < Version 4 are no longer supported by the editor or game.
@@ -79,6 +263,7 @@ Changes as of adb2ab5ec0aebfe676030223e4badd773f43a670
Default player colours has been returned to neutral grey.
Maps can be loaded from the commandline
Option to show actor names
Support for veteran / elite actors to be defined in the map yaml
Packaging:
Rename .deb package to use debian naming conventions
@@ -131,7 +316,6 @@ Changes as of adb2ab5ec0aebfe676030223e4badd773f43a670
Fixed paradrop flare, spyplane from capturing KOTH points
New Map: Nuclear Winter (nudalz)
New Map: Seaside (nudalz)
Editor:
Ability to switch mods after launch
Refactor hardcoded tools into a generic interface
@@ -587,4 +771,4 @@ Changes as of adb2ab5ec0aebfe676030223e4badd773f43a670
Improved debugging for performance issues
"Give Exploration" developer-mode option
Check for .net framework on windows install
Allow the viewport to scroll past the map edge to prevent ui from blocking buildings
Allow the viewport to scroll past the map edge to prevent ui from blocking buildings

View File

@@ -1,5 +1,15 @@
using System;
using System.IO;
#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.IO;
using OpenRA.FileFormats;
namespace FileExtractor
@@ -17,7 +27,7 @@ namespace FileExtractor
}
var mods = args[0].Split(',');
var manifest = new Manifest(mods);
var manifest = new Manifest(mods);
FileSystem.LoadFromManifest( manifest );
try

View File

@@ -1,3 +1,13 @@
#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;
namespace FileExtractor

0
FreeSans.ttf Executable file → Normal file
View File

26
HACKING
View File

@@ -3,7 +3,7 @@ HACKING
There are n main sections to OpenRA: UI, Rendering, unit behaviour, ...
All units/structures/most things in the map are Actors. Actors contain a collection of traits.
Traits consist of an info class and a class that does stuff
Traits consist of an info class and a class that does stuff. There is one instance of the infoclass shared across all actors of the same type. Each actor gets its own instance of the trait class itself. Infoclasses are responsible for instantiating their corresponding trait class -- see ITraitInfo, and TraitInfo<T> for the trivial implementation of this. In some cases the trait class's constructor needs some args, in which case TraitInfo<T> can't be used. This is a limitation of C# generics.
Actor assembly is done via the mod's yaml files. A section exists for each actor type,
and within that section we list the traits the actor should have.
@@ -15,13 +15,10 @@ which are automatically loaded into the corresponding fields on the trait's ITra
as possible - all cross-trait references should be in terms of an interface from
TraitInterfaces.cs.
- Things an actor can be *doing* are represented as IActivity implementations.
Actor has a queue of these. There's a standard set of activities in
OpenRa.Game/Traits/Activities, and mods tend to define more as they need them. (RA
defines various special-infantry actions as activities).
- Things an actor can be *doing* are represented as Activity subclasses.
Actor has a queue of these. The standard set of activities are in OpenRA.Mods.RA/Activities. Ground vehicle movement is more complex, and has bits in OpenRA.Mods.RA/Move. Aircraft use different bits again, in OpenRA.Mods.RA/Air. There are some bits elsewhere for custom infantry behaviors, etc. In some cases, a trait or activity will maintain an internal subqueue of activities. This works exactly the same way as the actor's main activity queue -- its state is evolved by Util.RunActivity().
- Units offer orders they can perform (given context) through traits that implement IIssueOrder.
Every trait with this interface is given a chance to generate orders for the current context.
- Units offer orders they can perform (given context) through traits that implement IIssueOrder. There are two parts to this -- an Orders collection, which exposes IOrderTargeter objects, which describe orders that the actor *could* generate, and the rules for choosing which to perform when the "default action" button is pressed (RMB). The second part is IssueOrder() itself, which resolves an IOrderTargeter into an actual order object to be sent.
- For more complex things that require modal UI (like special abilities,
RA-style sell/repair buttons, etc) we have IOrderGenerator implementations. This can
@@ -52,19 +49,13 @@ containing art assets (typically .mix files), yaml files defining actor defintio
and ini files containing legacy information that have yet to be ported over to
the (relatively new) yaml system.
The unit artwork itself must be defined in a Sequences file (typically Sequences.xml;
check mod.yaml for a list of what the mod uses); the format is self explanatory. There is
also the SequenceEditor tool to make this easy.
The unit artwork itself must be defined in one or more sequences files. These are specified in the manifest. RA puts everything in mods/ra/sequences.yaml.
check mod.yaml for a list of what the mod uses); the format is self explanatory.
Chrome artwork is similarly defined in Chrome.xml. Chrome is already mod dependent. Sortof ;)
mod-dependent *behavior* would be nice too, not just skinning. This is a property of the traits
however; once we port UI into traits this will become a non-issue.
Rendering
OpenRa.Game/Chrome.cs is the user interface.
Three renderers (SpriteRenderer, LineRenderer, Rgba?Renderer) render most stuff. Don't forget
to flush the renderer (if you want to see anything).
UserSettings stores the data loaded from settings.ini (or defaults). Eventually we need to be
able to save values changed in game into settings.ini (not yet implemented)
@@ -74,14 +65,11 @@ We also have a website at http://www.open-ra.org/ .
Our IRC channel is #openra on irc.freenode.net .
As far as using git, get your own repository on github. You probably want to set up the gitbot
to spam irc when you make commits (its nice to know). Push your changes into your git
repository, and it will/might :P be merged into http://github.com/OpenRA/OpenRA .
As far as using git, get your own repository on github. Push your changes into your git repository, and it will/might :P be merged into http://github.com/OpenRA/OpenRA .
See http://help.github.com/ for working with GitHub and see http://progit.org/ for working
with Git.
Other things we probably want to put in here:
- A guide on how to add a generic unit via yaml using existing traits
- and then introduce some element that requires a simple trait change.

101
Makefile
View File

@@ -5,27 +5,26 @@ COMMON_LIBS = System.dll System.Core.dll System.Drawing.dll System.Xml.dll third
PHONY = core tools package all mods clean distclean
.SUFFIXES:
core: game renderers mod_ra mod_cnc
tools: editor ralint seqed filex tsbuild utility
package: fixheader core editor utility
core: game renderers mod_ra mod_cnc utility
tools: editor ralint seqed filex tsbuild
package: core editor
mods: mod_ra mod_cnc
all: core tools
clean:
@-rm *.exe *.dll *.mdb mods/**/*.dll mods/**/*.mdb *.resources
@-rm -f *.exe *.dll *.mdb mods/**/*.dll mods/**/*.mdb *.resources
distclean: clean
#
# Core binaries
#
fileformats_SRCS = $(shell find OpenRA.FileFormats/ -iname '*.cs')
fileformats_SRCS := $(shell find OpenRA.FileFormats/ -iname '*.cs')
fileformats_TARGET = OpenRA.FileFormats.dll
#fileformats_DEPS = fixheader
fileformats_KIND = library
fileformats_LIBS = $(COMMON_LIBS) thirdparty/Tao/Tao.Sdl.dll System.Windows.Forms.dll
PROGRAMS = fileformats
fileformats: $(fileformats_TARGET)
game_SRCS = $(shell find OpenRA.Game/ -iname '*.cs')
game_SRCS := $(shell find OpenRA.Game/ -iname '*.cs')
game_TARGET = OpenRA.Game.exe
game_KIND = winexe
game_DEPS = $(fileformats_TARGET)
@@ -38,60 +37,72 @@ game: $(game_TARGET)
#
# Renderer dlls
#
rcg_SRCS = $(shell find OpenRA.Renderer.Cg/ -iname '*.cs')
rsdl_SRCS := $(shell find OpenRA.Renderer.SdlCommon/ -iname '*.cs')
rsdl_TARGET = OpenRA.Renderer.SdlCommon.dll
rsdl_KIND = library
rsdl_DEPS = $(fileformats_TARGET) $(game_TARGET)
rsdl_LIBS = $(COMMON_LIBS) System.Windows.Forms.dll \
thirdparty/Tao/Tao.OpenGl.dll thirdparty/Tao/Tao.Sdl.dll \
$(rsdl_DEPS)
rcg_SRCS := $(shell find OpenRA.Renderer.Cg/ -iname '*.cs')
rcg_TARGET = OpenRA.Renderer.Cg.dll
rcg_KIND = library
rcg_DEPS = $(fileformats_TARGET) $(game_TARGET)
rcg_DEPS = $(fileformats_TARGET) $(game_TARGET) $(rsdl_TARGET)
rcg_LIBS = $(COMMON_LIBS) System.Windows.Forms.dll \
thirdparty/Tao/Tao.Cg.dll thirdparty/Tao/Tao.OpenGl.dll thirdparty/Tao/Tao.Sdl.dll \
$(rcg_DEPS) $(game_TARGET)
$(rcg_DEPS)
rgl_SRCS = $(shell find OpenRA.Renderer.Gl/ -iname '*.cs')
rgl_SRCS := $(shell find OpenRA.Renderer.Gl/ -iname '*.cs')
rgl_TARGET = OpenRA.Renderer.Gl.dll
rgl_KIND = library
rgl_DEPS = $(fileformats_TARGET) $(game_TARGET)
rgl_DEPS = $(fileformats_TARGET) $(game_TARGET) $(rsdl_TARGET)
rgl_LIBS = $(COMMON_LIBS) System.Windows.Forms.dll \
thirdparty/Tao/Tao.Cg.dll thirdparty/Tao/Tao.OpenGl.dll thirdparty/Tao/Tao.Sdl.dll \
$(rgl_DEPS) $(game_TARGET)
$(rgl_DEPS)
rnull_SRCS = $(shell find OpenRA.Renderer.Null/ -iname '*.cs')
rnull_TARGET = OpenRA.Renderer.Null.dll
rnull_SRCS := $(shell find OpenRA.Renderer.Null/ -iname '*.cs')
rnull_TARGET = OpenRA.Renderer.Null.dll
rnull_KIND = library
rnull_DEPS = $(fileformats_TARGET) $(game_TARGET)
rnull_LIBS = $(COMMON_LIBS) System.Windows.Forms.dll \
$(rnull_DEPS) $(game_TARGET)
PROGRAMS += rcg rgl rnull
renderers: $(rcg_TARGET) $(rgl_TARGET) $(rnull_TARGET)
$(rnull_DEPS)
PROGRAMS += rcg rgl rnull rsdl
renderers: $(rcg_TARGET) $(rgl_TARGET) $(rnull_TARGET) $(rsdl_TARGET)
#
# Official Mods
#
# Red Alert
mod_ra_SRCS = $(shell find OpenRA.Mods.RA/ -iname '*.cs')
mod_ra_TARGET = mods/ra/OpenRA.Mods.RA.dll
STD_MOD_LIBS = $(fileformats_TARGET) $(game_TARGET)
STD_MOD_DEPS = $(STD_MOD_LIBS) $(ralint_TARGET)
mod_ra_SRCS := $(shell find OpenRA.Mods.RA/ -iname '*.cs')
mod_ra_TARGET = mods/ra/OpenRA.Mods.RA.dll
mod_ra_KIND = library
mod_ra_DEPS = $(fileformats_TARGET) $(game_TARGET)
mod_ra_LIBS = $(COMMON_LIBS) $(mod_ra_DEPS)
mod_ra_DEPS = $(STD_MOD_DEPS)
mod_ra_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS)
mod_ra_EXTRA_CMDS = mono --debug RALint.exe ra
PROGRAMS += mod_ra
mod_ra: $(mod_ra_TARGET)
# mono RALint.exe ra
# Command and Conquer
mod_cnc_SRCS = $(shell find OpenRA.Mods.Cnc/ -iname '*.cs')
mod_cnc_SRCS := $(shell find OpenRA.Mods.Cnc/ -iname '*.cs')
mod_cnc_TARGET = mods/cnc/OpenRA.Mods.Cnc.dll
mod_cnc_KIND = library
mod_cnc_DEPS = $(fileformats_TARGET) $(game_TARGET) $(mod_ra_TARGET)
mod_cnc_LIBS = $(COMMON_LIBS) $(mod_cnc_DEPS)
PROGRAMS += mod_cnc
mod_cnc_DEPS = $(STD_MOD_DEPS) $(mod_ra_TARGET)
mod_cnc_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_ra_TARGET)
mod_cnc_EXTRA_CMDS = mono --debug RALint.exe cnc
PROGRAMS += mod_cnc
mod_cnc: $(mod_cnc_TARGET)
# mono RALint.exe cnc
#
# Tools
#
# Sequence editor (defunct)
seqed_SRCS = $(shell find SequenceEditor/ -iname '*.cs')
seqed_TARGET = SequenceEditor.exe
seqed_SRCS := $(shell find SequenceEditor/ -iname '*.cs')
seqed_TARGET = SequenceEditor.exe
seqed_KIND = winexe
seqed_DEPS = $(fileformats_TARGET)
seqed_LIBS = $(COMMON_LIBS) System.Windows.Forms.dll $(seqed_DEPS)
@@ -102,8 +113,8 @@ SequenceEditor.Form1.resources:
seqed: SequenceEditor.Form1.resources $(seqed_TARGET)
# Map Editor
editor_SRCS = $(shell find OpenRA.Editor/ -iname '*.cs')
editor_TARGET = OpenRA.Editor.exe
editor_SRCS := $(shell find OpenRA.Editor/ -iname '*.cs')
editor_TARGET = OpenRA.Editor.exe
editor_KIND = winexe
editor_DEPS = $(fileformats_TARGET) $(game_TARGET)
editor_LIBS = $(COMMON_LIBS) System.Windows.Forms.dll System.Data.dll $(editor_DEPS)
@@ -118,8 +129,8 @@ OpenRA.Editor.Form1.resources:
editor: OpenRA.Editor.MapSelect.resources OpenRA.Editor.Form1.resources $(editor_TARGET)
# Analyses mod yaml for easy to detect errors
ralint_SRCS = $(shell find RALint/ -iname '*.cs')
ralint_TARGET = RALint.exe
ralint_SRCS := $(shell find RALint/ -iname '*.cs')
ralint_TARGET = RALint.exe
ralint_KIND = exe
ralint_DEPS = $(fileformats_TARGET) $(game_TARGET)
ralint_LIBS = $(COMMON_LIBS) $(ralint_DEPS)
@@ -127,8 +138,8 @@ PROGRAMS += ralint
ralint: $(ralint_TARGET)
# Extracts files from packages (mixfiles, zips, etc)
filex_SRCS = $(shell find FileExtractor/ -iname '*.cs')
filex_TARGET = FileExtractor.exe
filex_SRCS := $(shell find FileExtractor/ -iname '*.cs')
filex_TARGET = FileExtractor.exe
filex_KIND = exe
filex_DEPS = $(fileformats_TARGET)
filex_LIBS = $(COMMON_LIBS) $(filex_DEPS)
@@ -136,7 +147,7 @@ PROGRAMS += filex
filex: $(filex_TARGET)
# Builds and exports tilesets from a bitmap
tsbuild_SRCS = $(shell find OpenRA.TilesetBuilder/ -iname '*.cs')
tsbuild_SRCS := $(shell find OpenRA.TilesetBuilder/ -iname '*.cs')
tsbuild_TARGET = TilesetBuilder.exe
tsbuild_KIND = winexe
tsbuild_DEPS = $(fileformats_TARGET) $(game_TARGET)
@@ -151,12 +162,12 @@ tsbuild: OpenRA.TilesetBuilder.Form1.resources $(tsbuild_TARGET)
# Launchers / Utilities
#
# Patches binary headers to work around a mono bug
fixheader: packaging/fixheader.cs
fixheader.exe: packaging/fixheader.cs
@echo CSC fixheader.exe
@$(CSC) packaging/fixheader.cs $(CSFLAGS) -out:fixheader.exe -t:exe $(COMMON_LIBS:%=-r:%)
PHONY += fixheader
# Backend for the launcher apps - queries game/mod info and applies actions to an install
utility_SRCS = $(shell find OpenRA.Utility/ -iname '*.cs')
utility_SRCS := $(shell find OpenRA.Utility/ -iname '*.cs')
utility_TARGET = OpenRA.Utility.exe
utility_KIND = exe
utility_DEPS = $(fileformats_TARGET) $(game_TARGET)
@@ -171,7 +182,7 @@ utility: $(utility_TARGET)
#
define BUILD_ASSEMBLY
$$($(1)_TARGET): $$($(1)_SRCS) Makefile $$($(1)_DEPS)
$$($(1)_TARGET): $$($(1)_SRCS) Makefile $$($(1)_DEPS) fixheader.exe
@echo CSC $$(@)
@$(CSC) $$($(1)_LIBS:%=-r:%) \
-out:$$(@) $(CSFLAGS) $$($(1)_FLAGS) \
@@ -179,7 +190,9 @@ $$($(1)_TARGET): $$($(1)_SRCS) Makefile $$($(1)_DEPS)
-t:"$$($(1)_KIND)" \
$$($(1)_EXTRA) \
$$($(1)_SRCS)
@test -e fixheader.exe && mono fixheader.exe $$(@) || ``
@mono fixheader.exe $$(@) > /dev/null
@test `echo $$(@) | sed 's/^.*\.//'` = "dll" && chmod a-x $$(@) || ``
@$$($(1)_EXTRA_CMDS)
endef
$(foreach prog,$(PROGRAMS),$(eval $(call BUILD_ASSEMBLY,$(prog))))
@@ -196,7 +209,7 @@ BIN_INSTALL_DIR = $(DESTDIR)$(bindir)
INSTALL_DIR = $(DESTDIR)$(datadir)/openra
INSTALL = install
INSTALL_PROGRAM = $(INSTALL)
CORE = fileformats rcg rgl rnull game editor utility
CORE = fileformats rcg rgl rsdl rnull game editor utility
install: all
@-echo "Installing OpenRA to $(INSTALL_DIR)"
@@ -232,7 +245,7 @@ install: all
@echo "#!/bin/sh" > openra
@echo "cd "$(datadir)"/openra" >> openra
@echo "mono "$(datadir)"/openra/OpenRA.Game.exe SupportDir=~/.openra \"$$""@\"" >> openra
@echo "mono "$(datadir)"/openra/OpenRA.Game.exe \"$$""@\"" >> openra
@$(INSTALL_PROGRAM) -d $(BIN_INSTALL_DIR)
@$(INSTALL_PROGRAM) -m +rx openra $(BIN_INSTALL_DIR)

View File

@@ -1,90 +1,100 @@
namespace OpenRA.Editor
{
partial class ErrorListDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.listBox1 = new System.Windows.Forms.ListBox();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// label1
//
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label1.Location = new System.Drawing.Point(10, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(610, 23);
this.label1.TabIndex = 0;
this.label1.Text = "Your map import completed, but with errors:";
//
// listBox1
//
this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.listBox1.FormattingEnabled = true;
this.listBox1.Location = new System.Drawing.Point(13, 30);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(607, 316);
this.listBox1.TabIndex = 1;
//
// button1
//
this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button1.Location = new System.Drawing.Point(545, 359);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 2;
this.button1.Text = "Close";
this.button1.UseVisualStyleBackColor = true;
//
// ErrorListDialog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(632, 394);
this.Controls.Add(this.button1);
this.Controls.Add(this.listBox1);
this.Controls.Add(this.label1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Name = "ErrorListDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Map Import Errors";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Button button1;
}
#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.Editor
{
partial class ErrorListDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.listBox1 = new System.Windows.Forms.ListBox();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// label1
//
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label1.Location = new System.Drawing.Point(10, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(610, 23);
this.label1.TabIndex = 0;
this.label1.Text = "Your map import completed, but with errors:";
//
// listBox1
//
this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.listBox1.FormattingEnabled = true;
this.listBox1.Location = new System.Drawing.Point(13, 30);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(607, 316);
this.listBox1.TabIndex = 1;
//
// button1
//
this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button1.Location = new System.Drawing.Point(545, 359);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 2;
this.button1.Text = "Close";
this.button1.UseVisualStyleBackColor = true;
//
// ErrorListDialog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(632, 394);
this.Controls.Add(this.button1);
this.Controls.Add(this.listBox1);
this.Controls.Add(this.label1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Name = "ErrorListDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Map Import Errors";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Button button1;
}
}

View File

@@ -1,25 +1,25 @@
#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
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
*/
#endregion
using System.Collections.Generic;
using System.Windows.Forms;
namespace OpenRA.Editor
{
public partial class ErrorListDialog : Form
{
public ErrorListDialog( IEnumerable<string> errors )
{
InitializeComponent();
foreach (var e in errors)
listBox1.Items.Add(e);
}
}
}
using System.Collections.Generic;
using System.Windows.Forms;
namespace OpenRA.Editor
{
public partial class ErrorListDialog : Form
{
public ErrorListDialog( IEnumerable<string> errors )
{
InitializeComponent();
foreach (var e in errors)
listBox1.Items.Add(e);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -87,8 +87,7 @@ namespace OpenRA.Editor
// upgrade maps that have no player definitions. editor doesnt care,
// but this breaks the game pretty badly.
if (map.Players.Count == 0)
map.Players.Add("Neutral", new PlayerReference("Neutral",
Rules.Info["world"].Traits.WithInterface<CountryInfo>().First().Race, true, true));
map.MakeDefaultPlayers();
PrepareMapResources(Game.modData.Manifest, map);
@@ -156,6 +155,13 @@ namespace OpenRA.Editor
{
var info = Rules.Info[a];
if (!info.Traits.Contains<RenderSimpleInfo>()) continue;
var etf = info.Traits.GetOrDefault<EditorTilesetFilterInfo>();
if (etf != null && etf.ExcludeTilesets != null
&& etf.ExcludeTilesets.Contains(tileset.Id)) continue;
if (etf != null && etf.RequireTilesets != null
&& !etf.RequireTilesets.Contains(tileset.Id)) continue;
var template = RenderUtils.RenderActor(info, tileset, palette);
var ibox = new PictureBox
{
@@ -321,8 +327,9 @@ namespace OpenRA.Editor
map.Resize((int)nmd.width.Value, (int)nmd.height.Value);
map.ResizeCordon((int)nmd.cordonLeft.Value, (int)nmd.cordonTop.Value,
(int)nmd.cordonRight.Value, (int)nmd.cordonBottom.Value);
map.Players.Add("Neutral", new PlayerReference("Neutral", Rules.Info["world"].Traits.WithInterface<CountryInfo>().First().Race, true, true));
map.Players.Add("Creeps", new PlayerReference("Creeps", Rules.Info["world"].Traits.WithInterface<CountryInfo>().First().Race, true, true));
map.MakeDefaultPlayers();
NewMap(map);
}
}
@@ -367,23 +374,18 @@ namespace OpenRA.Editor
* but something's not right internally in it, unless loaded via the real maploader */
var savePath = Path.Combine(Path.GetTempPath(), "OpenRA.Import");
Directory.CreateDirectory(savePath);
var errors = new List<string>();
var map = LegacyMapImporter.Import(ofd.FileName, a => errors.Add(a));
if (errors.Count > 0)
using (var eld = new ErrorListDialog(errors))
Directory.CreateDirectory(savePath);
var errors = new List<string>();
var map = LegacyMapImporter.Import(ofd.FileName, a => errors.Add(a));
if (errors.Count > 0)
using (var eld = new ErrorListDialog(errors))
eld.ShowDialog();
if (!map.Players.ContainsKey("Neutral"))
map.Players.Add("Neutral", new PlayerReference("Neutral",
Rules.Info["world"].Traits.WithInterface<CountryInfo>().First().Race, true, true));
map.Players.Add("Creeps", new PlayerReference("Creeps",
Rules.Info["world"].Traits.WithInterface<CountryInfo>().First().Race, true, true));
map.MakeDefaultPlayers();
map.Save(savePath);
LoadMap(savePath);
loadedMapName = null; /* editor needs to think this hasnt been saved */
@@ -413,12 +415,32 @@ namespace OpenRA.Editor
if (DialogResult.OK == saveFileDialog.ShowDialog())
pmMiniMap.Image.Save(saveFileDialog.FileName);
}
void ShowActorNamesClicked(object sender, EventArgs e)
{
showActorNamesToolStripMenuItem.Checked ^= true;
surface1.ShowActorNames = showActorNamesToolStripMenuItem.Checked;
}
void ShowActorNamesClicked(object sender, EventArgs e)
{
showActorNamesToolStripMenuItem.Checked ^= true;
surface1.ShowActorNames = showActorNamesToolStripMenuItem.Checked;
}
void FixOpenAreas(object sender, EventArgs e)
{
dirty = true;
var r = new Random();
for (var j = surface1.Map.Bounds.Top; j < surface1.Map.Bounds.Bottom; j++)
for (var i = surface1.Map.Bounds.Left; i < surface1.Map.Bounds.Right; i++)
{
var tr = surface1.Map.MapTiles.Value[i, j];
if (tr.type == 0xff || tr.type == 0xffff || tr.type == 1 || tr.type == 2)
tr.index = (byte)r.Next(0,
Rules.TileSets[surface1.Map.Tileset].Tiles[tr.type].TileBitmapBytes.Count);
surface1.Map.MapTiles.Value[i, j] = tr;
}
surface1.Chunks.Clear();
surface1.Invalidate();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -100,17 +100,17 @@ namespace OpenRA.Editor
int MapSize;
int ActorCount = 0;
Map Map = new Map();
List<string> Players = new List<string>();
List<string> Players = new List<string>();
Action<string> errorHandler;
LegacyMapImporter(string filename, Action<string> errorHandler)
{
{
this.errorHandler = errorHandler;
ConvertIniMap(filename);
}
public static Map Import(string filename, Action<string> errorHandler)
{
{
var converter = new LegacyMapImporter(filename, errorHandler);
return converter.Map;
}
@@ -176,6 +176,7 @@ namespace OpenRA.Editor
{
var a = new ActorReference("mpspawn");
a.Add(new LocationInit(kv.Second));
a.Add(new OwnerInit("Neutral"));
Map.Actors.Value.Add("spawn" + kv.First, a);
}
@@ -364,65 +365,39 @@ namespace OpenRA.Editor
{
//Structures: num=owner,type,health,location,turret-facing,trigger
//Units: num=owner,type,health,location,facing,action,trigger
//Infantry: num=owner,type,health,location,subcell,action,facing,trigger
try
{
var parts = s.Value.Split(',');
var loc = int.Parse(parts[3]);
if (parts[0] == "")
parts[0] = "Neutral";
if (!Players.Contains(parts[0]))
Players.Add(parts[0]);
var stance = ActorStance.Stance.None;
switch (parts[5])
{
case "Area Guard":
case "Guard":
stance = ActorStance.Stance.Guard;
break;
case "Defend Base":
stance = ActorStance.Stance.Defend;
break;
case "Hunt":
case "Rampage":
case "Attack Base":
case "Attack Units":
case "Attack Civil.":
case "Attack Tarcom":
stance = ActorStance.Stance.Hunt;
break;
case "Retreat":
case "Return":
stance = ActorStance.Stance.Retreat;
break;
// do we care about `Harvest' and `Sticky'?
}
//Infantry: num=owner,type,health,location,subcell,action,facing,trigger
try
{
var parts = s.Value.Split(',');
var loc = int.Parse(parts[3]);
if (parts[0] == "")
parts[0] = "Neutral";
if (!Players.Contains(parts[0]))
Players.Add(parts[0]);
var actor = new ActorReference(parts[1].ToLowerInvariant())
{
new LocationInit(new int2(loc % MapSize, loc / MapSize)),
new OwnerInit(parts[0]),
new HealthInit(float.Parse(parts[2], NumberFormatInfo.InvariantInfo)/256),
new FacingInit((section == "INFANTRY") ? int.Parse(parts[6]) : int.Parse(parts[4])),
new ActorStanceInit(stance),
};
if (section == "INFANTRY")
actor.Add(new SubCellInit(int.Parse(parts[4])));
if (!Rules.Info.ContainsKey(parts[1].ToLowerInvariant()))
errorHandler("Ignoring unknown actor type: `{0}`".F(parts[1].ToLowerInvariant()));
else
Map.Actors.Value.Add("Actor" + ActorCount++, actor);
}
catch (Exception)
{
errorHandler("Malformed actor definition: `{0}`".F(s));
};
if (section == "INFANTRY")
actor.Add(new SubCellInit(int.Parse(parts[4])));
if (!Rules.Info.ContainsKey(parts[1].ToLowerInvariant()))
errorHandler("Ignoring unknown actor type: `{0}`".F(parts[1].ToLowerInvariant()));
else
Map.Actors.Value.Add("Actor" + ActorCount++, actor);
}
catch (Exception)
{
errorHandler("Malformed actor definition: `{0}`".F(s));
}
}
}
@@ -440,17 +415,17 @@ namespace OpenRA.Editor
void LoadPlayer(IniFile file, string section, bool isRA)
{
var c = (section == "BadGuy") ? "red" :
(isRA) ? "blue" : "gold";
var c = section == "BadGuy" ? "red" :
isRA ? "blue" : "gold";
var color = namedColorMapping[c];
var pr = new PlayerReference
{
Name = section,
OwnsWorld = (section == "Neutral"),
NonCombatant = (section == "Neutral"),
Race = (isRA) ? ((section == "BadGuy") ? "soviet" : "allies") : ((section == "BadGuy") ? "nod" : "gdi"),
OwnsWorld = section == "Neutral",
NonCombatant = section == "Neutral",
Race = isRA ? (section == "BadGuy" ? "soviet" : "allies") : (section == "BadGuy" ? "nod" : "gdi"),
ColorRamp = new ColorRamp(
(byte)((color.First.GetHue() / 360.0f) * 255),
(byte)(color.First.GetSaturation() * 255),
@@ -458,7 +433,7 @@ namespace OpenRA.Editor
(byte)(color.Second.GetBrightness() * 255))
};
var Neutral = new List<string>(){"Neutral"};
var Neutral = new [] {"Neutral"};
foreach (var s in file.GetSection(section, true))
{
Console.WriteLine(s.Key);

View File

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

View File

@@ -1,74 +1,84 @@
using System;
using System.IO;
using System.Windows.Forms;
using OpenRA.FileFormats;
using OpenRA.Graphics;
using System.Linq;
namespace OpenRA.Editor
{
public partial class MapSelect : Form
{
public string MapFolderPath;
public MapSelect(string currentMod)
{
MapFolderPath = new string[] { Environment.CurrentDirectory, "mods", currentMod, "maps" }
.Aggregate(Path.Combine);
InitializeComponent();
MapIconsList.Images.Add(pictureBox1.Image);
}
void MapSelect_Load(object sender, EventArgs e)
{
MapList.Items.Clear();
txtPathOut.Text = MapFolderPath;
foreach (var map in ModData.FindMapsIn(MapFolderPath))
{
ListViewItem map1 = new ListViewItem();
map1.Tag = map;
map1.Text = Path.GetFileNameWithoutExtension(map);
map1.ImageIndex = 0;
MapList.Items.Add(map1);
}
// hack
if (txtNew.Text != "unnamed")
MapList.Items[0].Selected = true;
}
void MapList_SelectedIndexChanged(object sender, EventArgs e)
{
if (MapList.SelectedItems.Count == 1)
{
txtNew.Text = MapList.SelectedItems[0].Text;
txtNew.Tag = MapList.SelectedItems[0].Tag;
var map = new Map(txtNew.Tag as string);
txtTitle.Text = map.Title;
txtAuthor.Text = map.Author;
txtTheater.Text = map.Tileset;
txtDesc.Text = map.Description;
pbMinimap.Image = null;
try
{
pbMinimap.Image = Minimap.AddStaticResources(map, Minimap.TerrainBitmap(map, true));
}
catch (Exception ed)
{
Console.WriteLine("No map preview image found: {0}", ed.ToString());
}
finally { }
}
}
void txtPathOut_TextChanged(object sender, EventArgs e)
{
MapFolderPath = txtPathOut.Text;
}
}
}
#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.IO;
using System.Windows.Forms;
using OpenRA.FileFormats;
using OpenRA.Graphics;
using System.Linq;
namespace OpenRA.Editor
{
public partial class MapSelect : Form
{
public string MapFolderPath;
public MapSelect(string currentMod)
{
MapFolderPath = new string[] { Environment.CurrentDirectory, "mods", currentMod, "maps" }
.Aggregate(Path.Combine);
InitializeComponent();
MapIconsList.Images.Add(pictureBox1.Image);
}
void MapSelect_Load(object sender, EventArgs e)
{
MapList.Items.Clear();
txtPathOut.Text = MapFolderPath;
foreach (var map in ModData.FindMapsIn(MapFolderPath))
{
ListViewItem map1 = new ListViewItem();
map1.Tag = map;
map1.Text = Path.GetFileNameWithoutExtension(map);
map1.ImageIndex = 0;
MapList.Items.Add(map1);
}
// hack
if (txtNew.Text != "unnamed")
MapList.Items[0].Selected = true;
}
void MapList_SelectedIndexChanged(object sender, EventArgs e)
{
if (MapList.SelectedItems.Count == 1)
{
txtNew.Text = MapList.SelectedItems[0].Text;
txtNew.Tag = MapList.SelectedItems[0].Tag;
var map = new Map(txtNew.Tag as string);
txtTitle.Text = map.Title;
txtAuthor.Text = map.Author;
txtTheater.Text = map.Tileset;
txtDesc.Text = map.Description;
pbMinimap.Image = null;
try
{
pbMinimap.Image = Minimap.AddStaticResources(map, Minimap.TerrainBitmap(map, true));
}
catch (Exception ed)
{
Console.WriteLine("No map preview image found: {0}", ed.ToString());
}
finally { }
}
}
void txtPathOut_TextChanged(object sender, EventArgs e)
{
MapFolderPath = txtPathOut.Text;
}
}
}

View File

@@ -1,177 +1,177 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="MapIconsList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAArjSURBVFhHrVcJUFRXFmVpkE0Wg0ZEMoIBl8RodGSMmVES
R0NiChVxCyIIAmFfhe6maeh9AZodZHFpUFQWcQmKisiuLKLEKFFEcIuljtZMYmI5Uc/c14EZYyapmpq8
qlP/9/+/373v3HPu+19P7/cf+jSlEWHCOEuzZfNn2Yvo3Pj3D/PTjCwYAwtgyeFwFk163Tos2tvtWJZw
zeUjmYFP6vL9fhw31vRPI8/9LnmMrtCWZhtPcJ7hbC/W8DwfnS0LR0t5NKoFazHcqsaprE3YGbMQLrYW
W/7fBAxogjGEd5wcXuPK4jxa60qD75VrfIbKMrYMD7VlPX/Ul49rp8RoyPbFIaEnhpuU6NRGoVa2HKuX
zEj/X8vAVmlIsDY2Nna2sjBd+ee5b7Yq4tfgfm8a7pxNw60OFa6e4uFmhxr/uFSIexfz0VsZh7PaIJzb
F42u8hAcV2/ANz3KF8Hub52kucb+Fv+jAccbm5quWOfxYX5y6Mcnq/IDh1oreX/vOcx9drdbjTudUgye
Tsb1piT0H4/DACUw0JiEh33ZePhlFi7UxOCLtI1o2x6IW2cUqM/egLtdediV9MnjSTYm60bE+Ys8rMzN
zd1c3/vLgVRV3lN1XjkqyzNoNaEUjIvrLXwMtQsw1JqEy/UxuHg0DJcp+KXj8bh0IobOucSGDA8vpqE6
+VNINixBU0kQbp5JJ8jxDSXdeyAE5arlAxTZ/BfRra2tS8Tqwh9L9tQhq6gSabm7odLkoP8oF90V/rjR
LsRgExc32oS40ZFCiQgw2Mgj+gW42pBI4OPSsUh6Jgn1mX4ojXJH865IXDzCx50uDe6fV+P8oQQ4Tx6r
pOATmVteKgdjXu/Mhk1h328rO4TMwn3gp2YhmquEX7gAfYfjcb4qGH0HQ3D5WAiunU7ApfpofH0ymhIS
UwkSqQRb6VoYvm6IZvXG7W4VBVbjwQU1/tanIQZkGDqtwOmSjzHXxXaLsZnZpy85QpdAnfunax/mllRD
ma2FQJyHxORMJAqzwBVpUJgtRLF8E7bxlqKjzA991QEYaIijgFwMt6VggJK60hCFr46F4sqprbjbLaf6
S0icIh1rwy1i3OvNQff+GEgj3r87/c1JLIGfjX1LP/F6KJDlIy1vN4SyQohVRdAU7IVIXQxuSiZ8/OOw
JYyP8EiqfV04Lh2JoHIwMSbiwoFgtO1ah97aTSTMKGIjDl/WhONWl5jKlYrbZ9OJGRWVIg/+axf8SK5a
8WoC5fPm//l2qqIIOaVVECm3QZG5C7L0HZCklYJLTCQKNUiWFYAnykJYRDRaywNxrTGRyhKNKyciiIEY
dFd743z1ZioT6eJkHK41kXDbRFSKbHzTpcJwsxoHc71fTLGzyBix+L/zUFlaWX+VTcFZ4NzSamQXV1Lw
EggkeeBRAsnSfKgyy6DKKcNnxEahIgRfHg5B/7EoDDYn4ma7FD0VAThfG4Cemi3EDI90IKWVq3GbHHKz
nUpCbrh6QokEr5mPTEw4773MQij9aPZY5fNYrC6hEhRAnrkTjJEkcS5ieWokS/IhUZdCrtlJbGQiIjQQ
/YeD0VMVhoTVbmgs8iVBctG11xtdlUHkDGpQpIN7velUAhmG2+W43spclI6K9JWY6TyxlGKOGxWjG53s
5HBMBpZ7+iI6UY44vhoiVTH4ohxCLoTyArqu1OlBll6CZHE20mI9EOjuis3L5uFCbTh6D4Wgu8offYeC
qSRccgcPD/qyMEiBb55VYahFgSuNckhjlr2YaGMqH2ntOiKmEAQGBgbnNviGPg2LFSM4UoiAUD78ghLo
yEVojBhRiQqEx0nAI5sKiBH/z+OgVfuic7c/Lh+NwZndfughDfQdCtL1hKFmEW51ymn1EjpSAh1ytFCL
Pl+nhKebY8XLTYn16DWEgzY2ttdzyI6yjB06+uP4acRANokvhzRRjBR5oe4aN4WupeYgNCIWZ2vj0b17
I/UKf3Tt34jOis9otTyyILmkORUDTRKyqxj9DSI07Y0k26Yhes38Roo3YVQH7OVhGiGR0K7O0epEqCRB
shKwRIQkQrZqMelAIM6ncihII9uQSCXZEi2HSMjDXvVqXKSGdTLbg6z6OVkwGcfLQvHB4jkYbJMS/UL0
1aeSM6So1Hg/oljTR93AupEVYSXhGE+soZa8X+cIlgALzFhg5/HJ6YhIzACXVs9EKiHRMmckSfMQGx0G
rXIldU4/dJSvJx3EoSDZC7OszHByTxTOfZGEq00y9B3lo70iElamhp4Ujy1eN8wIrEOd0BRW6DpiWEwq
giKSdYiIl5IOUskRKh39AmKECZNP7Mg0O6Ci59Pzd4O/NQK7FBvQULyGOmMUpBsX4KqjGTL5qzHQIqJy
iNG6Px5dtYlY7jqhmeKxvUE32C7FGKiP58uf5W6v0ekgPkmNrYIMor4YqcoinQBFdGQrl2ZsB4/cwBJR
Zml/+k0sxcQnQZzgDWHIIni9NQHSHU5IS15EPSEN11ok6G9UQs1dh/lvv/GdkZHR3NEETOhkIUE7zvb1
wRRFwYv0vD3UBTORJCEdSHMhydgFCXVHVnuWEGvZrDewjqmzKbHDNjHmFl5KBlasWokiFwtop5nhyL6p
2JO/CN2HBdSgMpHJ88GH82c8s7b4T1vmUPA3CFxCp19QzBPdtpxdRqon2kkDKRSYXeOJcyBUFMI7IJ70
kYsEgRLTXGbgrzNnwmWqC2Y4OsLZZjx43El4ggXI1zohy24MAFd4u9tj8YLpmD71DTiMtwGHY1A7ygB7
52N29CLULV7qeT+HnFCoPairu87/RC9rTjE8JYJoY/p4lR8lVQAp7Rc+/pHY7OKE61NN8a21MbQpfwC+
m4fbQ7MQNdcCfWMMsTPWDi2yyRgyNkDhOGPYGhpeo97jP5oAcwJjYQ4hk3DOyzvwn9v3HtUJjHXAzSFc
RHHlCAznIyAsCZa2k56u3xT2gtHPmGHCdXtnHh47mKBqjS1K5Q7ITrCjlf8RqXPM0bDUCr3bp2C9nj70
DDinKMYSwmujCbAjY4G9ZrN3tyMLP/D4IT1vP/J21CBeoKaa55MTUhAeK8J7i91v0DMdxqZmgw7Oc74N
iFQ8T5YX6ZzisWI9Uiebo8rKCOcsjLAv1Z72BydUxE5ElcTuKf2P9RunEeGzmD8bTIzsI0I7wc7xdgyf
NiayWVoueZ1qz7zPT8l5McnBqZieYZsYO/a4zF7yaKWP4HlASMKLj9xX4WrXWzhdMxUFlkaI1tPDAZE9
Htc4wWuhOas5Y/oXgUezYDdZdmK2N6zzCfuB1V1GFkulNswT5cFllms73f+QMIWwjCDjGJnUW1rbfu2z
wvXJk85pUH5gieNJdugvd8QV7RSc0TjgiMwevkvH3np1xa/+ZplZE9jecNh14UcPmO8VmnLyfzGr/feU
mB/dY7VjybItdSZhrb6+fvEYY6PuMWOMn7ZbGeILfQNYmnN+mO1o/OBdCw74HAMsMjR8NjL/r+Yx+p3H
XhjKZs93uxMZr4Z/uOb54qWf3bGf4pw3EpC1UPYsS3g0EU9K4uBsI86zYHPOY3MOp4zuRRLyDfT1O941
Mrzvb86Bob4h+0r6zcEmdiFICA2vvT55kLFBYOJhnYt9or06TOmCJ7HTbGxgADpndmaJMU29QxAQKvTo
vhnHkN1nX12/OlgCNoT3CZsIvgRWc9ao2IT/bTD3+BID7N1/zisBWCKOBB/CagKf8PboJP8CoUmu3yhA
ga8AAAAASUVORK5CYII=
</value>
</data>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="MapIconsList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAArjSURBVFhHrVcJUFRXFmVpkE0Wg0ZEMoIBl8RodGSMmVES
R0NiChVxCyIIAmFfhe6maeh9AZodZHFpUFQWcQmKisiuLKLEKFFEcIuljtZMYmI5Uc/c14EZYyapmpq8
qlP/9/+/373v3HPu+19P7/cf+jSlEWHCOEuzZfNn2Yvo3Pj3D/PTjCwYAwtgyeFwFk163Tos2tvtWJZw
zeUjmYFP6vL9fhw31vRPI8/9LnmMrtCWZhtPcJ7hbC/W8DwfnS0LR0t5NKoFazHcqsaprE3YGbMQLrYW
W/7fBAxogjGEd5wcXuPK4jxa60qD75VrfIbKMrYMD7VlPX/Ul49rp8RoyPbFIaEnhpuU6NRGoVa2HKuX
zEj/X8vAVmlIsDY2Nna2sjBd+ee5b7Yq4tfgfm8a7pxNw60OFa6e4uFmhxr/uFSIexfz0VsZh7PaIJzb
F42u8hAcV2/ANz3KF8Hub52kucb+Fv+jAccbm5quWOfxYX5y6Mcnq/IDh1oreX/vOcx9drdbjTudUgye
Tsb1piT0H4/DACUw0JiEh33ZePhlFi7UxOCLtI1o2x6IW2cUqM/egLtdediV9MnjSTYm60bE+Ys8rMzN
zd1c3/vLgVRV3lN1XjkqyzNoNaEUjIvrLXwMtQsw1JqEy/UxuHg0DJcp+KXj8bh0IobOucSGDA8vpqE6
+VNINixBU0kQbp5JJ8jxDSXdeyAE5arlAxTZ/BfRra2tS8Tqwh9L9tQhq6gSabm7odLkoP8oF90V/rjR
LsRgExc32oS40ZFCiQgw2Mgj+gW42pBI4OPSsUh6Jgn1mX4ojXJH865IXDzCx50uDe6fV+P8oQQ4Tx6r
pOATmVteKgdjXu/Mhk1h328rO4TMwn3gp2YhmquEX7gAfYfjcb4qGH0HQ3D5WAiunU7ApfpofH0ymhIS
UwkSqQRb6VoYvm6IZvXG7W4VBVbjwQU1/tanIQZkGDqtwOmSjzHXxXaLsZnZpy85QpdAnfunax/mllRD
ma2FQJyHxORMJAqzwBVpUJgtRLF8E7bxlqKjzA991QEYaIijgFwMt6VggJK60hCFr46F4sqprbjbLaf6
S0icIh1rwy1i3OvNQff+GEgj3r87/c1JLIGfjX1LP/F6KJDlIy1vN4SyQohVRdAU7IVIXQxuSiZ8/OOw
JYyP8EiqfV04Lh2JoHIwMSbiwoFgtO1ah97aTSTMKGIjDl/WhONWl5jKlYrbZ9OJGRWVIg/+axf8SK5a
8WoC5fPm//l2qqIIOaVVECm3QZG5C7L0HZCklYJLTCQKNUiWFYAnykJYRDRaywNxrTGRyhKNKyciiIEY
dFd743z1ZioT6eJkHK41kXDbRFSKbHzTpcJwsxoHc71fTLGzyBix+L/zUFlaWX+VTcFZ4NzSamQXV1Lw
EggkeeBRAsnSfKgyy6DKKcNnxEahIgRfHg5B/7EoDDYn4ma7FD0VAThfG4Cemi3EDI90IKWVq3GbHHKz
nUpCbrh6QokEr5mPTEw4773MQij9aPZY5fNYrC6hEhRAnrkTjJEkcS5ieWokS/IhUZdCrtlJbGQiIjQQ
/YeD0VMVhoTVbmgs8iVBctG11xtdlUHkDGpQpIN7velUAhmG2+W43spclI6K9JWY6TyxlGKOGxWjG53s
5HBMBpZ7+iI6UY44vhoiVTH4ohxCLoTyArqu1OlBll6CZHE20mI9EOjuis3L5uFCbTh6D4Wgu8offYeC
qSRccgcPD/qyMEiBb55VYahFgSuNckhjlr2YaGMqH2ntOiKmEAQGBgbnNviGPg2LFSM4UoiAUD78ghLo
yEVojBhRiQqEx0nAI5sKiBH/z+OgVfuic7c/Lh+NwZndfughDfQdCtL1hKFmEW51ymn1EjpSAh1ytFCL
Pl+nhKebY8XLTYn16DWEgzY2ttdzyI6yjB06+uP4acRANokvhzRRjBR5oe4aN4WupeYgNCIWZ2vj0b17
I/UKf3Tt34jOis9otTyyILmkORUDTRKyqxj9DSI07Y0k26Yhes38Roo3YVQH7OVhGiGR0K7O0epEqCRB
shKwRIQkQrZqMelAIM6ncihII9uQSCXZEi2HSMjDXvVqXKSGdTLbg6z6OVkwGcfLQvHB4jkYbJMS/UL0
1aeSM6So1Hg/oljTR93AupEVYSXhGE+soZa8X+cIlgALzFhg5/HJ6YhIzACXVs9EKiHRMmckSfMQGx0G
rXIldU4/dJSvJx3EoSDZC7OszHByTxTOfZGEq00y9B3lo70iElamhp4Ujy1eN8wIrEOd0BRW6DpiWEwq
giKSdYiIl5IOUskRKh39AmKECZNP7Mg0O6Ci59Pzd4O/NQK7FBvQULyGOmMUpBsX4KqjGTL5qzHQIqJy
iNG6Px5dtYlY7jqhmeKxvUE32C7FGKiP58uf5W6v0ekgPkmNrYIMor4YqcoinQBFdGQrl2ZsB4/cwBJR
Zml/+k0sxcQnQZzgDWHIIni9NQHSHU5IS15EPSEN11ok6G9UQs1dh/lvv/GdkZHR3NEETOhkIUE7zvb1
wRRFwYv0vD3UBTORJCEdSHMhydgFCXVHVnuWEGvZrDewjqmzKbHDNjHmFl5KBlasWokiFwtop5nhyL6p
2JO/CN2HBdSgMpHJ88GH82c8s7b4T1vmUPA3CFxCp19QzBPdtpxdRqon2kkDKRSYXeOJcyBUFMI7IJ70
kYsEgRLTXGbgrzNnwmWqC2Y4OsLZZjx43El4ggXI1zohy24MAFd4u9tj8YLpmD71DTiMtwGHY1A7ygB7
52N29CLULV7qeT+HnFCoPairu87/RC9rTjE8JYJoY/p4lR8lVQAp7Rc+/pHY7OKE61NN8a21MbQpfwC+
m4fbQ7MQNdcCfWMMsTPWDi2yyRgyNkDhOGPYGhpeo97jP5oAcwJjYQ4hk3DOyzvwn9v3HtUJjHXAzSFc
RHHlCAznIyAsCZa2k56u3xT2gtHPmGHCdXtnHh47mKBqjS1K5Q7ITrCjlf8RqXPM0bDUCr3bp2C9nj70
DDinKMYSwmujCbAjY4G9ZrN3tyMLP/D4IT1vP/J21CBeoKaa55MTUhAeK8J7i91v0DMdxqZmgw7Oc74N
iFQ8T5YX6ZzisWI9Uiebo8rKCOcsjLAv1Z72BydUxE5ElcTuKf2P9RunEeGzmD8bTIzsI0I7wc7xdgyf
NiayWVoueZ1qz7zPT8l5McnBqZieYZsYO/a4zF7yaKWP4HlASMKLj9xX4WrXWzhdMxUFlkaI1tPDAZE9
Htc4wWuhOas5Y/oXgUezYDdZdmK2N6zzCfuB1V1GFkulNswT5cFllms73f+QMIWwjCDjGJnUW1rbfu2z
wvXJk85pUH5gieNJdugvd8QV7RSc0TjgiMwevkvH3np1xa/+ZplZE9jecNh14UcPmO8VmnLyfzGr/feU
mB/dY7VjybItdSZhrb6+fvEYY6PuMWOMn7ZbGeILfQNYmnN+mO1o/OBdCw74HAMsMjR8NjL/r+Yx+p3H
XhjKZs93uxMZr4Z/uOb54qWf3bGf4pw3EpC1UPYsS3g0EU9K4uBsI86zYHPOY3MOp4zuRRLyDfT1O941
Mrzvb86Bob4h+0r6zcEmdiFICA2vvT55kLFBYOJhnYt9or06TOmCJ7HTbGxgADpndmaJMU29QxAQKvTo
vhnHkN1nX12/OlgCNoT3CZsIvgRWc9ao2IT/bTD3+BID7N1/zisBWCKOBB/CagKf8PboJP8CoUmu3yhA
ga8AAAAASUVORK5CYII=
</value>
</data>
</root>

View File

@@ -1,286 +1,296 @@
namespace OpenRA.Editor
{
partial class NewMapDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button2 = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.cordonBottom = new System.Windows.Forms.NumericUpDown();
this.cordonTop = new System.Windows.Forms.NumericUpDown();
this.cordonRight = new System.Windows.Forms.NumericUpDown();
this.cordonLeft = new System.Windows.Forms.NumericUpDown();
this.height = new System.Windows.Forms.NumericUpDown();
this.width = new System.Windows.Forms.NumericUpDown();
this.label4 = new System.Windows.Forms.Label();
this.theater = new System.Windows.Forms.ComboBox();
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.height)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.width)).BeginInit();
this.SuspendLayout();
//
// button2
//
this.button2.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button2.Location = new System.Drawing.Point(229, 160);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 7;
this.button2.Text = "OK";
this.button2.UseVisualStyleBackColor = true;
//
// button1
//
this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button1.Location = new System.Drawing.Point(310, 160);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 8;
this.button1.Text = "Cancel";
this.button1.UseVisualStyleBackColor = true;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(31, 77);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(107, 13);
this.label3.TabIndex = 9;
this.label3.Text = "Cordon Right/Bottom";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(31, 51);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(86, 13);
this.label2.TabIndex = 11;
this.label2.Text = "Cordon Left/Top";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(31, 25);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(27, 13);
this.label1.TabIndex = 10;
this.label1.Text = "Size";
//
// cordonBottom
//
this.cordonBottom.Location = new System.Drawing.Point(280, 75);
this.cordonBottom.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonBottom.Name = "cordonBottom";
this.cordonBottom.Size = new System.Drawing.Size(105, 20);
this.cordonBottom.TabIndex = 5;
this.cordonBottom.Value = new decimal(new int[] {
112,
0,
0,
0});
this.cordonBottom.Enter += new System.EventHandler(this.SelectText);
//
// cordonTop
//
this.cordonTop.Location = new System.Drawing.Point(280, 49);
this.cordonTop.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonTop.Name = "cordonTop";
this.cordonTop.Size = new System.Drawing.Size(105, 20);
this.cordonTop.TabIndex = 3;
this.cordonTop.Value = new decimal(new int[] {
16,
0,
0,
0});
this.cordonTop.Enter += new System.EventHandler(this.SelectText);
//
// cordonRight
//
this.cordonRight.Location = new System.Drawing.Point(169, 75);
this.cordonRight.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonRight.Name = "cordonRight";
this.cordonRight.Size = new System.Drawing.Size(105, 20);
this.cordonRight.TabIndex = 4;
this.cordonRight.Value = new decimal(new int[] {
112,
0,
0,
0});
this.cordonRight.Enter += new System.EventHandler(this.SelectText);
//
// cordonLeft
//
this.cordonLeft.Location = new System.Drawing.Point(169, 49);
this.cordonLeft.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonLeft.Name = "cordonLeft";
this.cordonLeft.Size = new System.Drawing.Size(105, 20);
this.cordonLeft.TabIndex = 2;
this.cordonLeft.Value = new decimal(new int[] {
16,
0,
0,
0});
this.cordonLeft.Enter += new System.EventHandler(this.SelectText);
//
// height
//
this.height.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.height.Location = new System.Drawing.Point(280, 23);
this.height.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.height.Name = "height";
this.height.Size = new System.Drawing.Size(105, 20);
this.height.TabIndex = 1;
this.height.Value = new decimal(new int[] {
128,
0,
0,
0});
this.height.Enter += new System.EventHandler(this.SelectText);
//
// width
//
this.width.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.width.Location = new System.Drawing.Point(169, 23);
this.width.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.width.Name = "width";
this.width.Size = new System.Drawing.Size(105, 20);
this.width.TabIndex = 0;
this.width.Value = new decimal(new int[] {
128,
0,
0,
0});
this.width.Enter += new System.EventHandler(this.SelectText);
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(31, 124);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(44, 13);
this.label4.TabIndex = 14;
this.label4.Text = "Tileset";
//
// theater
//
this.theater.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.theater.FormattingEnabled = true;
this.theater.Location = new System.Drawing.Point(169, 121);
this.theater.Name = "theater";
this.theater.Size = new System.Drawing.Size(216, 21);
this.theater.TabIndex = 6;
//
// NewMapDialog
//
this.AcceptButton = this.button2;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.button1;
this.ClientSize = new System.Drawing.Size(418, 210);
this.Controls.Add(this.theater);
this.Controls.Add(this.label4);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.cordonBottom);
this.Controls.Add(this.cordonTop);
this.Controls.Add(this.cordonRight);
this.Controls.Add(this.cordonLeft);
this.Controls.Add(this.height);
this.Controls.Add(this.width);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Name = "NewMapDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "New Map";
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.height)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.width)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
public System.Windows.Forms.NumericUpDown cordonBottom;
public System.Windows.Forms.NumericUpDown cordonTop;
public System.Windows.Forms.NumericUpDown cordonRight;
public System.Windows.Forms.NumericUpDown cordonLeft;
public System.Windows.Forms.NumericUpDown height;
public System.Windows.Forms.NumericUpDown width;
private System.Windows.Forms.Label label4;
public System.Windows.Forms.ComboBox theater;
}
#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.Editor
{
partial class NewMapDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button2 = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.cordonBottom = new System.Windows.Forms.NumericUpDown();
this.cordonTop = new System.Windows.Forms.NumericUpDown();
this.cordonRight = new System.Windows.Forms.NumericUpDown();
this.cordonLeft = new System.Windows.Forms.NumericUpDown();
this.height = new System.Windows.Forms.NumericUpDown();
this.width = new System.Windows.Forms.NumericUpDown();
this.label4 = new System.Windows.Forms.Label();
this.theater = new System.Windows.Forms.ComboBox();
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.height)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.width)).BeginInit();
this.SuspendLayout();
//
// button2
//
this.button2.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button2.Location = new System.Drawing.Point(229, 160);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 7;
this.button2.Text = "OK";
this.button2.UseVisualStyleBackColor = true;
//
// button1
//
this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button1.Location = new System.Drawing.Point(310, 160);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 8;
this.button1.Text = "Cancel";
this.button1.UseVisualStyleBackColor = true;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(31, 77);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(107, 13);
this.label3.TabIndex = 9;
this.label3.Text = "Cordon Right/Bottom";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(31, 51);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(86, 13);
this.label2.TabIndex = 11;
this.label2.Text = "Cordon Left/Top";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(31, 25);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(27, 13);
this.label1.TabIndex = 10;
this.label1.Text = "Size";
//
// cordonBottom
//
this.cordonBottom.Location = new System.Drawing.Point(280, 75);
this.cordonBottom.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonBottom.Name = "cordonBottom";
this.cordonBottom.Size = new System.Drawing.Size(105, 20);
this.cordonBottom.TabIndex = 5;
this.cordonBottom.Value = new decimal(new int[] {
112,
0,
0,
0});
this.cordonBottom.Enter += new System.EventHandler(this.SelectText);
//
// cordonTop
//
this.cordonTop.Location = new System.Drawing.Point(280, 49);
this.cordonTop.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonTop.Name = "cordonTop";
this.cordonTop.Size = new System.Drawing.Size(105, 20);
this.cordonTop.TabIndex = 3;
this.cordonTop.Value = new decimal(new int[] {
16,
0,
0,
0});
this.cordonTop.Enter += new System.EventHandler(this.SelectText);
//
// cordonRight
//
this.cordonRight.Location = new System.Drawing.Point(169, 75);
this.cordonRight.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonRight.Name = "cordonRight";
this.cordonRight.Size = new System.Drawing.Size(105, 20);
this.cordonRight.TabIndex = 4;
this.cordonRight.Value = new decimal(new int[] {
112,
0,
0,
0});
this.cordonRight.Enter += new System.EventHandler(this.SelectText);
//
// cordonLeft
//
this.cordonLeft.Location = new System.Drawing.Point(169, 49);
this.cordonLeft.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonLeft.Name = "cordonLeft";
this.cordonLeft.Size = new System.Drawing.Size(105, 20);
this.cordonLeft.TabIndex = 2;
this.cordonLeft.Value = new decimal(new int[] {
16,
0,
0,
0});
this.cordonLeft.Enter += new System.EventHandler(this.SelectText);
//
// height
//
this.height.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.height.Location = new System.Drawing.Point(280, 23);
this.height.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.height.Name = "height";
this.height.Size = new System.Drawing.Size(105, 20);
this.height.TabIndex = 1;
this.height.Value = new decimal(new int[] {
128,
0,
0,
0});
this.height.Enter += new System.EventHandler(this.SelectText);
//
// width
//
this.width.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.width.Location = new System.Drawing.Point(169, 23);
this.width.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.width.Name = "width";
this.width.Size = new System.Drawing.Size(105, 20);
this.width.TabIndex = 0;
this.width.Value = new decimal(new int[] {
128,
0,
0,
0});
this.width.Enter += new System.EventHandler(this.SelectText);
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(31, 124);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(44, 13);
this.label4.TabIndex = 14;
this.label4.Text = "Tileset";
//
// theater
//
this.theater.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.theater.FormattingEnabled = true;
this.theater.Location = new System.Drawing.Point(169, 121);
this.theater.Name = "theater";
this.theater.Size = new System.Drawing.Size(216, 21);
this.theater.TabIndex = 6;
//
// NewMapDialog
//
this.AcceptButton = this.button2;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.button1;
this.ClientSize = new System.Drawing.Size(418, 210);
this.Controls.Add(this.theater);
this.Controls.Add(this.label4);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.cordonBottom);
this.Controls.Add(this.cordonTop);
this.Controls.Add(this.cordonRight);
this.Controls.Add(this.cordonLeft);
this.Controls.Add(this.height);
this.Controls.Add(this.width);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Name = "NewMapDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "New Map";
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.height)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.width)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
public System.Windows.Forms.NumericUpDown cordonBottom;
public System.Windows.Forms.NumericUpDown cordonTop;
public System.Windows.Forms.NumericUpDown cordonRight;
public System.Windows.Forms.NumericUpDown cordonLeft;
public System.Windows.Forms.NumericUpDown height;
public System.Windows.Forms.NumericUpDown width;
private System.Windows.Forms.Label label4;
public System.Windows.Forms.ComboBox theater;
}
}

View File

@@ -19,9 +19,10 @@ namespace OpenRA.Editor
InitializeComponent();
}
private void SelectText(object sender, System.EventArgs e)
void SelectText(object sender, System.EventArgs e)
{
(sender as NumericUpDown).Select(0, (sender as NumericUpDown).ToString().Length);
var ud = sender as NumericUpDown;
ud.Select(0, ud.ToString().Length);
}
}
}

View File

@@ -1,120 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -1,159 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{00038B75-405B-44F5-8691-BD2546DBE224}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>OpenRA.Editor</RootNamespace>
<AssemblyName>OpenRA.Editor</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ApplicationIcon>OpenRA.Editor.Icon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>false</UseVSHostingProcess>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ActorTemplate.cs" />
<Compile Include="ActorTool.cs" />
<Compile Include="BrushTool.cs" />
<Compile Include="ErrorListDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ErrorListDialog.Designer.cs">
<DependentUpon>ErrorListDialog.cs</DependentUpon>
</Compile>
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="ITool.cs" />
<Compile Include="LegacyMapImporter.cs" />
<Compile Include="MapSelect.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MapSelect.Designer.cs">
<DependentUpon>MapSelect.cs</DependentUpon>
</Compile>
<Compile Include="NewMapDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="NewMapDialog.Designer.cs">
<DependentUpon>NewMapDialog.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="PropertiesDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="PropertiesDialog.Designer.cs">
<DependentUpon>PropertiesDialog.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MapSelect.resx">
<DependentUpon>MapSelect.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="NewMapDialog.resx">
<DependentUpon>NewMapDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="PropertiesDialog.resx">
<DependentUpon>PropertiesDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="ResizeDialog.resx">
<DependentUpon>ResizeDialog.cs</DependentUpon>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<Compile Include="RenderUtils.cs" />
<Compile Include="ResizeDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ResizeDialog.Designer.cs">
<DependentUpon>ResizeDialog.cs</DependentUpon>
</Compile>
<Compile Include="ResourceTool.cs" />
<Compile Include="Surface.cs">
<SubType>Component</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">
<Project>{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}</Project>
<Name>OpenRA.FileFormats</Name>
</ProjectReference>
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj">
<Project>{0DFB103F-2962-400F-8C6D-E2C28CCBA633}</Project>
<Name>OpenRA.Game</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="OpenRA.Editor.Icon.ico" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{00038B75-405B-44F5-8691-BD2546DBE224}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>OpenRA.Editor</RootNamespace>
<AssemblyName>OpenRA.Editor</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ApplicationIcon>OpenRA.Editor.Icon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>false</UseVSHostingProcess>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ActorTemplate.cs" />
<Compile Include="ActorTool.cs" />
<Compile Include="BrushTool.cs" />
<Compile Include="ErrorListDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ErrorListDialog.Designer.cs">
<DependentUpon>ErrorListDialog.cs</DependentUpon>
</Compile>
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="ITool.cs" />
<Compile Include="LegacyMapImporter.cs" />
<Compile Include="MapSelect.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MapSelect.Designer.cs">
<DependentUpon>MapSelect.cs</DependentUpon>
</Compile>
<Compile Include="NewMapDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="NewMapDialog.Designer.cs">
<DependentUpon>NewMapDialog.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="PropertiesDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="PropertiesDialog.Designer.cs">
<DependentUpon>PropertiesDialog.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MapSelect.resx">
<DependentUpon>MapSelect.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="NewMapDialog.resx">
<DependentUpon>NewMapDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="PropertiesDialog.resx">
<DependentUpon>PropertiesDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="ResizeDialog.resx">
<DependentUpon>ResizeDialog.cs</DependentUpon>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<Compile Include="RenderUtils.cs" />
<Compile Include="ResizeDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ResizeDialog.Designer.cs">
<DependentUpon>ResizeDialog.cs</DependentUpon>
</Compile>
<Compile Include="ResourceTool.cs" />
<Compile Include="Surface.cs">
<SubType>Component</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">
<Project>{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}</Project>
<Name>OpenRA.FileFormats</Name>
</ProjectReference>
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj">
<Project>{0DFB103F-2962-400F-8C6D-E2C28CCBA633}</Project>
<Name>OpenRA.Game</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="OpenRA.Editor.Icon.ico" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -6,13 +6,13 @@
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Windows.Forms;
#endregion
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using OpenRA.FileFormats;
namespace OpenRA.Editor
@@ -46,10 +46,10 @@ namespace OpenRA.Editor
foreach (var path in ModData.FindMapsIn(MapFolderPath))
{
var map = new Map(path);
// Touch the lazy bits to initialize them
map.Actors.Force();
map.Smudges.Force();
map.MapTiles.Force();
// Touch the lazy bits to initialize them
map.Actors.Force();
map.Smudges.Force();
map.MapTiles.Force();
map.MapResources.Force();
map.Save(path);
}

View File

@@ -1,36 +1,46 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("OpenRA.Editor")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("OpenRA.Editor")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("e18ea68f-f344-46c9-b026-8bda76fa91f8")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("OpenRA.Editor")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("OpenRA.Editor")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("e18ea68f-f344-46c9-b026-8bda76fa91f8")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@@ -1,172 +1,182 @@
namespace OpenRA.Editor
{
partial class PropertiesDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button2 = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.title = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.desc = new System.Windows.Forms.TextBox();
this.selectable = new System.Windows.Forms.CheckBox();
this.label3 = new System.Windows.Forms.Label();
this.author = new System.Windows.Forms.TextBox();
this.useAsShellmap = new System.Windows.Forms.CheckBox();
this.SuspendLayout();
//
// button2
//
this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.button2.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button2.Location = new System.Drawing.Point(196, 193);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 14;
this.button2.Text = "OK";
this.button2.UseVisualStyleBackColor = true;
//
// button1
//
this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button1.Location = new System.Drawing.Point(277, 193);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 15;
this.button1.Text = "Cancel";
this.button1.UseVisualStyleBackColor = true;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 50);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(27, 13);
this.label1.TabIndex = 16;
this.label1.Text = "Title";
//
// title
//
this.title.Location = new System.Drawing.Point(66, 47);
this.title.Name = "title";
this.title.Size = new System.Drawing.Size(286, 20);
this.title.TabIndex = 17;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(12, 76);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(32, 13);
this.label2.TabIndex = 16;
this.label2.Text = "Desc";
//
// desc
//
this.desc.Location = new System.Drawing.Point(66, 73);
this.desc.Name = "desc";
this.desc.Size = new System.Drawing.Size(286, 20);
this.desc.TabIndex = 17;
//
// selectable
//
this.selectable.AutoSize = true;
this.selectable.Location = new System.Drawing.Point(118, 138);
this.selectable.Name = "selectable";
this.selectable.Size = new System.Drawing.Size(130, 17);
this.selectable.TabIndex = 18;
this.selectable.Text = "Show in Map Chooser";
this.selectable.UseVisualStyleBackColor = true;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(12, 102);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(38, 13);
this.label3.TabIndex = 16;
this.label3.Text = "Author";
//
// author
//
this.author.Location = new System.Drawing.Point(66, 99);
this.author.Name = "author";
this.author.Size = new System.Drawing.Size(286, 20);
this.author.TabIndex = 17;
//
// checkBox1
//
this.useAsShellmap.AutoSize = true;
this.useAsShellmap.Location = new System.Drawing.Point(118, 161);
this.useAsShellmap.Name = "checkBox1";
this.useAsShellmap.Size = new System.Drawing.Size(105, 17);
this.useAsShellmap.TabIndex = 18;
this.useAsShellmap.Text = "Use as Shellmap";
this.useAsShellmap.UseVisualStyleBackColor = true;
//
// PropertiesDialog
//
this.AcceptButton = this.button2;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.button1;
this.ClientSize = new System.Drawing.Size(370, 228);
this.Controls.Add(this.useAsShellmap);
this.Controls.Add(this.selectable);
this.Controls.Add(this.author);
this.Controls.Add(this.label3);
this.Controls.Add(this.desc);
this.Controls.Add(this.label2);
this.Controls.Add(this.title);
this.Controls.Add(this.label1);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Name = "PropertiesDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "PropertiesDialog";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
public System.Windows.Forms.TextBox title;
private System.Windows.Forms.Label label2;
public System.Windows.Forms.TextBox desc;
public System.Windows.Forms.CheckBox selectable;
private System.Windows.Forms.Label label3;
public System.Windows.Forms.TextBox author;
public System.Windows.Forms.CheckBox useAsShellmap;
}
#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.Editor
{
partial class PropertiesDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button2 = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.title = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.desc = new System.Windows.Forms.TextBox();
this.selectable = new System.Windows.Forms.CheckBox();
this.label3 = new System.Windows.Forms.Label();
this.author = new System.Windows.Forms.TextBox();
this.useAsShellmap = new System.Windows.Forms.CheckBox();
this.SuspendLayout();
//
// button2
//
this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.button2.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button2.Location = new System.Drawing.Point(196, 193);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 14;
this.button2.Text = "OK";
this.button2.UseVisualStyleBackColor = true;
//
// button1
//
this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button1.Location = new System.Drawing.Point(277, 193);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 15;
this.button1.Text = "Cancel";
this.button1.UseVisualStyleBackColor = true;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 50);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(27, 13);
this.label1.TabIndex = 16;
this.label1.Text = "Title";
//
// title
//
this.title.Location = new System.Drawing.Point(66, 47);
this.title.Name = "title";
this.title.Size = new System.Drawing.Size(286, 20);
this.title.TabIndex = 17;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(12, 76);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(32, 13);
this.label2.TabIndex = 16;
this.label2.Text = "Desc";
//
// desc
//
this.desc.Location = new System.Drawing.Point(66, 73);
this.desc.Name = "desc";
this.desc.Size = new System.Drawing.Size(286, 20);
this.desc.TabIndex = 17;
//
// selectable
//
this.selectable.AutoSize = true;
this.selectable.Location = new System.Drawing.Point(118, 138);
this.selectable.Name = "selectable";
this.selectable.Size = new System.Drawing.Size(130, 17);
this.selectable.TabIndex = 18;
this.selectable.Text = "Show in Map Chooser";
this.selectable.UseVisualStyleBackColor = true;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(12, 102);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(38, 13);
this.label3.TabIndex = 16;
this.label3.Text = "Author";
//
// author
//
this.author.Location = new System.Drawing.Point(66, 99);
this.author.Name = "author";
this.author.Size = new System.Drawing.Size(286, 20);
this.author.TabIndex = 17;
//
// checkBox1
//
this.useAsShellmap.AutoSize = true;
this.useAsShellmap.Location = new System.Drawing.Point(118, 161);
this.useAsShellmap.Name = "checkBox1";
this.useAsShellmap.Size = new System.Drawing.Size(105, 17);
this.useAsShellmap.TabIndex = 18;
this.useAsShellmap.Text = "Use as Shellmap";
this.useAsShellmap.UseVisualStyleBackColor = true;
//
// PropertiesDialog
//
this.AcceptButton = this.button2;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.button1;
this.ClientSize = new System.Drawing.Size(370, 228);
this.Controls.Add(this.useAsShellmap);
this.Controls.Add(this.selectable);
this.Controls.Add(this.author);
this.Controls.Add(this.label3);
this.Controls.Add(this.desc);
this.Controls.Add(this.label2);
this.Controls.Add(this.title);
this.Controls.Add(this.label1);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Name = "PropertiesDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "PropertiesDialog";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
public System.Windows.Forms.TextBox title;
private System.Windows.Forms.Label label2;
public System.Windows.Forms.TextBox desc;
public System.Windows.Forms.CheckBox selectable;
private System.Windows.Forms.Label label3;
public System.Windows.Forms.TextBox author;
public System.Windows.Forms.CheckBox useAsShellmap;
}
}

View File

@@ -1,120 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -18,17 +18,6 @@ namespace OpenRA.Editor
{
static class RenderUtils
{
public static ColorPalette MakeSystemPalette(Palette p)
{
ColorPalette pal;
using (var b = new Bitmap(1, 1, PixelFormat.Format8bppIndexed))
pal = b.Palette;
for (var i = 0; i < 256; i++)
pal.Entries[i] = p.GetColor(i);
return pal;
}
public static Bitmap RenderTemplate(TileSet ts, ushort n, Palette p)
{
var template = ts.Templates[n];
@@ -37,7 +26,7 @@ namespace OpenRA.Editor
var bitmap = new Bitmap(ts.TileSize * template.Size.X, ts.TileSize * template.Size.Y,
PixelFormat.Format8bppIndexed);
bitmap.Palette = MakeSystemPalette(p);
bitmap.Palette = p.AsSystemPalette();
var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
@@ -74,7 +63,7 @@ namespace OpenRA.Editor
var bitmap = new Bitmap(shp.Width, shp.Height, PixelFormat.Format8bppIndexed);
bitmap.Palette = MakeSystemPalette(p);
bitmap.Palette = p.AsSystemPalette();
var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
@@ -95,8 +84,7 @@ namespace OpenRA.Editor
public static ActorTemplate RenderActor(ActorInfo info, TileSet tileset, Palette p)
{
var ri = info.Traits.Get<RenderSimpleInfo>();
var image = RenderSimple.GetImage(info, tileset.Id);
var image = RenderSimple.GetImage(info);
using (var s = FileSystem.OpenWithExts(image, tileset.Extensions))
{
@@ -134,7 +122,7 @@ namespace OpenRA.Editor
var frame = shp[shp.ImageCount - 1];
var bitmap = new Bitmap(shp.Width, shp.Height, PixelFormat.Format8bppIndexed);
bitmap.Palette = MakeSystemPalette(p);
bitmap.Palette = p.AsSystemPalette();
var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);

View File

@@ -1,226 +1,236 @@
namespace OpenRA.Editor
{
partial class ResizeDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.width = new System.Windows.Forms.NumericUpDown();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.cordonLeft = new System.Windows.Forms.NumericUpDown();
this.cordonTop = new System.Windows.Forms.NumericUpDown();
this.cordonRight = new System.Windows.Forms.NumericUpDown();
this.cordonBottom = new System.Windows.Forms.NumericUpDown();
this.label3 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.height = new System.Windows.Forms.NumericUpDown();
((System.ComponentModel.ISupportInitialize)(this.width)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.height)).BeginInit();
this.SuspendLayout();
//
// width
//
this.width.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.width.Location = new System.Drawing.Point(161, 18);
this.width.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.width.Name = "width";
this.width.Size = new System.Drawing.Size(105, 20);
this.width.TabIndex = 0;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(23, 20);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(27, 13);
this.label1.TabIndex = 1;
this.label1.Text = "Size";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(23, 46);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(86, 13);
this.label2.TabIndex = 1;
this.label2.Text = "Cordon Left/Top";
//
// cordonLeft
//
this.cordonLeft.Location = new System.Drawing.Point(161, 44);
this.cordonLeft.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonLeft.Name = "cordonLeft";
this.cordonLeft.Size = new System.Drawing.Size(105, 20);
this.cordonLeft.TabIndex = 0;
//
// cordonTop
//
this.cordonTop.Location = new System.Drawing.Point(272, 44);
this.cordonTop.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonTop.Name = "cordonTop";
this.cordonTop.Size = new System.Drawing.Size(105, 20);
this.cordonTop.TabIndex = 0;
//
// cordonRight
//
this.cordonRight.Location = new System.Drawing.Point(161, 70);
this.cordonRight.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonRight.Name = "cordonRight";
this.cordonRight.Size = new System.Drawing.Size(105, 20);
this.cordonRight.TabIndex = 0;
//
// cordonBottom
//
this.cordonBottom.Location = new System.Drawing.Point(272, 70);
this.cordonBottom.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonBottom.Name = "cordonBottom";
this.cordonBottom.Size = new System.Drawing.Size(105, 20);
this.cordonBottom.TabIndex = 0;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(23, 72);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(107, 13);
this.label3.TabIndex = 1;
this.label3.Text = "Cordon Right/Bottom";
//
// button1
//
this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button1.Location = new System.Drawing.Point(302, 111);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 2;
this.button1.Text = "Cancel";
this.button1.UseVisualStyleBackColor = true;
//
// button2
//
this.button2.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button2.Location = new System.Drawing.Point(221, 111);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 2;
this.button2.Text = "OK";
this.button2.UseVisualStyleBackColor = true;
//
// height
//
this.height.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.height.Location = new System.Drawing.Point(272, 18);
this.height.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.height.Name = "height";
this.height.Size = new System.Drawing.Size(105, 20);
this.height.TabIndex = 0;
//
// ResizeDialog
//
this.AcceptButton = this.button2;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.button1;
this.ClientSize = new System.Drawing.Size(409, 146);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.cordonBottom);
this.Controls.Add(this.cordonTop);
this.Controls.Add(this.cordonRight);
this.Controls.Add(this.cordonLeft);
this.Controls.Add(this.height);
this.Controls.Add(this.width);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Name = "ResizeDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Resize Map";
((System.ComponentModel.ISupportInitialize)(this.width)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.height)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
public System.Windows.Forms.NumericUpDown width;
public System.Windows.Forms.NumericUpDown cordonLeft;
public System.Windows.Forms.NumericUpDown cordonTop;
public System.Windows.Forms.NumericUpDown cordonRight;
public System.Windows.Forms.NumericUpDown cordonBottom;
public System.Windows.Forms.NumericUpDown height;
}
#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.Editor
{
partial class ResizeDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.width = new System.Windows.Forms.NumericUpDown();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.cordonLeft = new System.Windows.Forms.NumericUpDown();
this.cordonTop = new System.Windows.Forms.NumericUpDown();
this.cordonRight = new System.Windows.Forms.NumericUpDown();
this.cordonBottom = new System.Windows.Forms.NumericUpDown();
this.label3 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.height = new System.Windows.Forms.NumericUpDown();
((System.ComponentModel.ISupportInitialize)(this.width)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.height)).BeginInit();
this.SuspendLayout();
//
// width
//
this.width.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.width.Location = new System.Drawing.Point(161, 18);
this.width.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.width.Name = "width";
this.width.Size = new System.Drawing.Size(105, 20);
this.width.TabIndex = 0;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(23, 20);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(27, 13);
this.label1.TabIndex = 1;
this.label1.Text = "Size";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(23, 46);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(86, 13);
this.label2.TabIndex = 1;
this.label2.Text = "Cordon Left/Top";
//
// cordonLeft
//
this.cordonLeft.Location = new System.Drawing.Point(161, 44);
this.cordonLeft.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonLeft.Name = "cordonLeft";
this.cordonLeft.Size = new System.Drawing.Size(105, 20);
this.cordonLeft.TabIndex = 0;
//
// cordonTop
//
this.cordonTop.Location = new System.Drawing.Point(272, 44);
this.cordonTop.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonTop.Name = "cordonTop";
this.cordonTop.Size = new System.Drawing.Size(105, 20);
this.cordonTop.TabIndex = 0;
//
// cordonRight
//
this.cordonRight.Location = new System.Drawing.Point(161, 70);
this.cordonRight.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonRight.Name = "cordonRight";
this.cordonRight.Size = new System.Drawing.Size(105, 20);
this.cordonRight.TabIndex = 0;
//
// cordonBottom
//
this.cordonBottom.Location = new System.Drawing.Point(272, 70);
this.cordonBottom.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.cordonBottom.Name = "cordonBottom";
this.cordonBottom.Size = new System.Drawing.Size(105, 20);
this.cordonBottom.TabIndex = 0;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(23, 72);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(107, 13);
this.label3.TabIndex = 1;
this.label3.Text = "Cordon Right/Bottom";
//
// button1
//
this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button1.Location = new System.Drawing.Point(302, 111);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 2;
this.button1.Text = "Cancel";
this.button1.UseVisualStyleBackColor = true;
//
// button2
//
this.button2.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button2.Location = new System.Drawing.Point(221, 111);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 2;
this.button2.Text = "OK";
this.button2.UseVisualStyleBackColor = true;
//
// height
//
this.height.Increment = new decimal(new int[] {
8,
0,
0,
0});
this.height.Location = new System.Drawing.Point(272, 18);
this.height.Maximum = new decimal(new int[] {
2048,
0,
0,
0});
this.height.Name = "height";
this.height.Size = new System.Drawing.Size(105, 20);
this.height.TabIndex = 0;
//
// ResizeDialog
//
this.AcceptButton = this.button2;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.button1;
this.ClientSize = new System.Drawing.Size(409, 146);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.cordonBottom);
this.Controls.Add(this.cordonTop);
this.Controls.Add(this.cordonRight);
this.Controls.Add(this.cordonLeft);
this.Controls.Add(this.height);
this.Controls.Add(this.width);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Name = "ResizeDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Resize Map";
((System.ComponentModel.ISupportInitialize)(this.width)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonLeft)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonTop)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonRight)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.cordonBottom)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.height)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
public System.Windows.Forms.NumericUpDown width;
public System.Windows.Forms.NumericUpDown cordonLeft;
public System.Windows.Forms.NumericUpDown cordonTop;
public System.Windows.Forms.NumericUpDown cordonRight;
public System.Windows.Forms.NumericUpDown cordonBottom;
public System.Windows.Forms.NumericUpDown height;
}
}

View File

@@ -1,120 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Editor
ITool Tool;
public bool IsPanning;
public bool IsPanning;
public bool ShowActorNames;
public event Action AfterChange = () => { };
@@ -297,7 +297,7 @@ namespace OpenRA.Editor
var pr = Map.Players[name];
var pcpi = Rules.Info["player"].Traits.Get<PlayerColorPaletteInfo>();
var remap = new PlayerColorRemap(pr.ColorRamp, pcpi.PaletteFormat);
return RenderUtils.MakeSystemPalette(new Palette(Palette, remap));
return new Palette(Palette, remap).AsSystemPalette();
}
Cache<string, ColorPalette> PlayerPalettes;
@@ -338,22 +338,24 @@ namespace OpenRA.Editor
Map.Bounds.Left * TileSet.TileSize * Zoom + Offset.X,
Map.Bounds.Top * TileSet.TileSize * Zoom + Offset.Y,
Map.Bounds.Width * TileSet.TileSize * Zoom,
Map.Bounds.Height * TileSet.TileSize * Zoom);
foreach (var ar in Map.Actors.Value)
{
if (ActorTemplates.ContainsKey(ar.Value.Type))
DrawActor(e.Graphics, ar.Value.Location(), ActorTemplates[ar.Value.Type],
GetPaletteForActor(ar.Value));
}
if (ShowActorNames)
foreach (var ar in Map.Actors.Value)
if (!ar.Key.StartsWith("Actor")) // if it has a custom name
e.Graphics.DrawStringContrast(Font, ar.Key,
(int)(ar.Value.Location().X * TileSet.TileSize * Zoom + Offset.X),
(int)(ar.Value.Location().Y * TileSet.TileSize * Zoom + Offset.Y),
Brushes.White,
Map.Bounds.Height * TileSet.TileSize * Zoom);
foreach (var ar in Map.Actors.Value)
{
if (ActorTemplates.ContainsKey(ar.Value.Type))
DrawActor(e.Graphics, ar.Value.Location(), ActorTemplates[ar.Value.Type],
GetPaletteForActor(ar.Value));
else
Console.WriteLine("Warning: Unknown or excluded actor: {0}", ar.Value.Type);
}
if (ShowActorNames)
foreach (var ar in Map.Actors.Value)
if (!ar.Key.StartsWith("Actor")) // if it has a custom name
e.Graphics.DrawStringContrast(Font, ar.Key,
(int)(ar.Value.Location().X * TileSet.TileSize * Zoom + Offset.X),
(int)(ar.Value.Location().Y * TileSet.TileSize * Zoom + Offset.Y),
Brushes.White,
Brushes.Black);
if (Tool != null)
@@ -373,16 +375,16 @@ namespace OpenRA.Editor
public static int2 Location(this ActorReference ar)
{
return ar.InitDict.Get<LocationInit>().value;
}
public static void DrawStringContrast(this SGraphics g, Font f, string s, int x, int y, Brush fg, Brush bg)
{
g.DrawString(s, f, bg, x - 1, y - 1);
g.DrawString(s, f, bg, x + 1, y - 1);
g.DrawString(s, f, bg, x - 1, y + 1);
g.DrawString(s, f, bg, x + 1, y + 1);
g.DrawString(s, f, fg, x, y);
}
public static void DrawStringContrast(this SGraphics g, Font f, string s, int x, int y, Brush fg, Brush bg)
{
g.DrawString(s, f, bg, x - 1, y - 1);
g.DrawString(s, f, bg, x + 1, y - 1);
g.DrawString(s, f, bg, x - 1, y + 1);
g.DrawString(s, f, bg, x + 1, y + 1);
g.DrawString(s, f, fg, x, y);
}
}
}

View File

@@ -66,7 +66,7 @@ namespace OpenRA.FileFormats
if (!syms.ContainsKey(t))
throw new InvalidOperationException("Substitution `{0}` undefined".F(t));
yield return syms[t].ToString();;
yield return syms[t].ToString();
}
else
{

View File

@@ -105,42 +105,65 @@ namespace OpenRA
public static bool Contains(this RectangleF r, int2 p)
{
return r.Contains(p.ToPointF());
}
public static bool HasModifier(this Modifiers k, Modifiers mod)
{
return (k & mod) == mod;
}
public static V GetOrAdd<K, V>(this Dictionary<K, V> d, K k)
where V : new()
{
return d.GetOrAdd(k, _ => new V());
}
public static V GetOrAdd<K, V>(this Dictionary<K, V> d, K k, Func<K, V> createFn)
{
V ret;
if (!d.TryGetValue(k, out ret))
d.Add(k, ret = createFn(k));
return ret;
}
public static T Random<T>(this IEnumerable<T> ts, Thirdparty.Random r)
{
var xs = ts.ToArray();
return xs[r.Next(xs.Length)];
}
public static float Product(this IEnumerable<float> xs)
{
return xs.Aggregate(1f, (a, x) => a * x);
}
public static IEnumerable<T> SymmetricDifference<T>(this IEnumerable<T> xs, IEnumerable<T> ys)
{
// this is probably a shockingly-slow way to do this, but it's concise.
return xs.Except(ys).Concat(ys.Except(xs));
}
public static bool HasModifier(this Modifiers k, Modifiers mod)
{
return (k & mod) == mod;
}
public static bool IsValidInput(this KeyInput key)
{
return char.IsLetter(key.UnicodeChar) || char.IsDigit(key.UnicodeChar) ||
char.IsSymbol(key.UnicodeChar) || char.IsSeparator(key.UnicodeChar) ||
char.IsPunctuation(key.UnicodeChar);
}
public static V GetOrAdd<K, V>(this Dictionary<K, V> d, K k)
where V : new()
{
return d.GetOrAdd(k, _ => new V());
}
public static V GetOrAdd<K, V>(this Dictionary<K, V> d, K k, Func<K, V> createFn)
{
V ret;
if (!d.TryGetValue(k, out ret))
d.Add(k, ret = createFn(k));
return ret;
}
public static T Random<T>(this IEnumerable<T> ts, Thirdparty.Random r)
{
var xs = ts.ToArray();
return xs[r.Next(xs.Length)];
}
public static float Product(this IEnumerable<float> xs)
{
return xs.Aggregate(1f, (a, x) => a * x);
}
public static IEnumerable<T> SymmetricDifference<T>(this IEnumerable<T> xs, IEnumerable<T> ys)
{
// this is probably a shockingly-slow way to do this, but it's concise.
return xs.Except(ys).Concat(ys.Except(xs));
}
public static IEnumerable<T> Iterate<T>( this T t, Func<T,T> f )
{
for(;;) { yield return t; t = f(t); }
}
public static int NextPowerOf2(int v)
{
--v;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
++v;
return v;
}
}
}

View File

@@ -66,16 +66,33 @@ namespace OpenRA.FileFormats
return t;
}
static readonly object[] NoIndexes = {};
public static void LoadField( object self, string key, string value )
{
var field = self.GetType().GetField( key.Trim() );
if( field == null )
UnknownFieldAction( key.Trim(), self.GetType() );
else if( field.HasAttribute<FieldFromYamlKeyAttribute>() )
if( field != null )
{
if (!field.HasAttribute<FieldFromYamlKeyAttribute>())
field.SetValue( self, GetValue( field.Name, field.FieldType, value ) );
return;
else
field.SetValue( self, GetValue( field.Name, field.FieldType, value ) );
}
var prop = self.GetType().GetProperty( key.Trim() );
if (prop != null)
{
if (!prop.HasAttribute<FieldFromYamlKeyAttribute>())
prop.SetValue(self, GetValue(prop.Name, prop.PropertyType, value), NoIndexes);
return;
}
UnknownFieldAction( key.Trim(), self.GetType() );
}
public static T GetValue<T>( string field, string value )
{
return (T) GetValue( field, typeof(T), value );
}
public static object GetValue( string field, Type fieldType, string x )
@@ -100,7 +117,7 @@ namespace OpenRA.FileFormats
else if (fieldType == typeof(float))
{
float res;
if (float.TryParse(x.Replace("%",""), System.Globalization.NumberStyles.Any, NumberFormatInfo.InvariantInfo, out res))
if (float.TryParse(x.Replace("%",""), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out res))
return res * (x.Contains( '%' ) ? 0.01f : 1f);
return InvalidValueAction(x,fieldType, field);
}
@@ -108,7 +125,7 @@ namespace OpenRA.FileFormats
else if (fieldType == typeof(decimal))
{
decimal res;
if (decimal.TryParse(x.Replace("%",""), System.Globalization.NumberStyles.Any, NumberFormatInfo.InvariantInfo, out res))
if (decimal.TryParse(x.Replace("%",""), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out res))
return res * (x.Contains( '%' ) ? 0.01m : 1m);
return InvalidValueAction(x,fieldType, field);
}
@@ -183,6 +200,13 @@ namespace OpenRA.FileFormats
var parts = x.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
return new Rectangle(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3]));
}
else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Bits<>))
{
var parts = x.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var argTypes = new Type[] { typeof(string[]) };
var argValues = new object[] { parts };
return fieldType.GetConstructor(argTypes).Invoke(argValues);
}
UnknownFieldAction("[Type] {0}".F(x),fieldType);
return null;
@@ -207,26 +231,22 @@ namespace OpenRA.FileFormats
foreach( var ff in type.GetFields() )
{
var field = ff;
var load = field.GetCustomAttributes<LoadAttribute>( false );
var ignore = field.GetCustomAttributes<IgnoreAttribute>( false );
var loadUsing = field.GetCustomAttributes<LoadUsingAttribute>( false );
var fromYamlKey = field.GetCustomAttributes<FieldFromYamlKeyAttribute>( false );
if( loadUsing.Length != 0 )
ret[ field ] = ( _1, fieldType, yaml ) => loadUsing[ 0 ].LoaderFunc( field )( yaml );
else if( fromYamlKey.Length != 0 )
ret[ field ] = ( f, ft, yaml ) => GetValue( f, ft, yaml.Value );
else if( load.Length != 0 )
else if( ignore.Length == 0 )
ret[ field ] = null;
}
if( ret.Count == 0 )
foreach( var f in type.GetFields() )
ret.Add( f, null );
return ret;
}
[AttributeUsage( AttributeTargets.Field )]
public class LoadAttribute : Attribute { }
public class IgnoreAttribute : Attribute { }
[AttributeUsage( AttributeTargets.Field )]
public class LoadUsingAttribute : Attribute
@@ -300,15 +320,20 @@ namespace OpenRA.FileFormats
((int)c.G).Clamp(0, 255),
((int)c.B).Clamp(0, 255));
}
else if (f.FieldType == typeof(Rectangle))
if (f.FieldType == typeof(Rectangle))
{
var r = (Rectangle)v;
return "{0},{1},{2},{3}".F(r.X, r.Y, r.Width, r.Height);
}
return f.FieldType.IsArray
? string.Join(",", ((Array)v).OfType<object>().Select(a => a.ToString()).ToArray())
: v.ToString();
if (f.FieldType.IsArray)
{
var elems = ((Array)v).OfType<object>();
return string.Join(",", elems.Select(a => a.ToString()).ToArray());
}
return v.ToString();
}
}

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
@@ -141,9 +141,13 @@ namespace OpenRA.FileFormats
output[offset++] = (byte)t;
output[offset++] = (byte)(t >> 8);
t = DecodeSample((byte)(b >> 4), ref index, ref currentSample);
output[offset++] = (byte)t;
output[offset++] = (byte)(t >> 8);
if (offset < outputSize)
{
/* possible that only half of the final byte is used! */
t = DecodeSample((byte)(b >> 4), ref index, ref currentSample);
output[offset++] = (byte)t;
output[offset++] = (byte)(t >> 8);
}
}
dataSize -= 8 + chunk.CompressedSize;

View File

@@ -123,7 +123,12 @@ namespace OpenRA.FileFormats
len -= copy;
next += (ushort)copy;
Array.Copy(outBuffer, source, outBuffer, dest, copy);
// copy with old-fashioned memcpy semantics
// in case of overlapping ranges. this is NOT
// the same as Array.Copy()
while( copy-- > 0 )
outBuffer[dest++] = outBuffer[source++];
// Flush window to outstream
if (next == MAXWIN)
@@ -153,7 +158,7 @@ namespace OpenRA.FileFormats
}
// Decode a code using huffman table h.
private static int Decode(Huffman h, BitReader br)
static int Decode(Huffman h, BitReader br)
{
int code = 0; // len bits being decoded
int first = 0; // first code of length len

View File

@@ -11,15 +11,14 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Linq;
using System.Reflection;
namespace OpenRA.FileFormats
{
public static class FileSystem
{
static List<IFolder> mountedFolders = new List<IFolder>();
public static string SpecialPackageRoot = "";
static Cache<uint, List<IFolder>> allFiles = new Cache<uint, List<IFolder>>( _ => new List<IFolder>() );
@@ -75,9 +74,9 @@ namespace OpenRA.FileFormats
var optional = name.StartsWith("~");
if (optional) name = name.Substring(1);
// paths starting with $ are relative to SpecialPackageRoot
if (name.StartsWith("$"))
name = SpecialPackageRoot+name.Substring(1);
// paths starting with ^ are relative to the support dir
if (name.StartsWith("^"))
name = Platform.SupportDir+name.Substring(1);
var a = (Action)(() => FileSystem.MountInner(OpenPackage(name)));

View File

@@ -26,7 +26,7 @@ namespace OpenRA.FileFormats
this.path = path;
this.priority = priority;
if (Directory.Exists(path))
Directory.Delete(path);
Directory.Delete(path, true);
Write(contents);
}
@@ -63,8 +63,8 @@ namespace OpenRA.FileFormats
}
public void Write(Dictionary<string, byte[]> contents)
{
if (!Directory.Exists(path))
{
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
foreach (var file in contents)

View File

@@ -21,29 +21,34 @@ namespace OpenRA.FileFormats.Graphics
public RendererAttribute( Type graphicsDeviceType )
{
if( !typeof( IGraphicsDevice ).IsAssignableFrom( graphicsDeviceType ) )
if( !typeof( IDeviceFactory ).IsAssignableFrom( graphicsDeviceType ) )
throw new InvalidOperationException( "Incorrect type in RendererAttribute" );
Type = graphicsDeviceType;
}
}
public interface IDeviceFactory
{
IGraphicsDevice Create( Size size, WindowMode windowMode );
}
public interface IGraphicsDevice
{
IVertexBuffer<Vertex> CreateVertexBuffer( int length );
IIndexBuffer CreateIndexBuffer( int length );
ITexture CreateTexture( Bitmap bitmap );
ITexture CreateTexture();
IShader CreateShader( string name );
Size WindowSize { get; }
Size WindowSize { get; }
int GpuMemoryUsed { get; }
void Clear( Color color );
void Present( IInputHandler inputHandler );
void Clear();
void Present();
void PumpInput(IInputHandler inputHandler);
void DrawIndexedPrimitives( PrimitiveType type, Range<int> vertexRange, Range<int> indexRange );
void DrawIndexedPrimitives( PrimitiveType type, int vertexPool, int numPrimitives );
void DrawPrimitives( PrimitiveType type, int firstVertex, int numVertices );
void SetLineWidth( float width );
void EnableScissor( int left, int top, int width, int height );
void DisableScissor();
}
@@ -54,17 +59,10 @@ namespace OpenRA.FileFormats.Graphics
void SetData( T[] vertices, int length );
}
public interface IIndexBuffer
{
void Bind();
void SetData( uint[] indices, int length );
}
public interface IShader
{
void SetValue( string name, float x, float y );
void SetValue( string param, ITexture texture );
void Commit();
void Render( Action a );
}
@@ -80,6 +78,7 @@ namespace OpenRA.FileFormats.Graphics
PointList,
LineList,
TriangleList,
QuadList,
}
public struct Range<T>

View File

@@ -57,13 +57,14 @@ namespace OpenRA
Shift = 1,
Alt = 2,
Ctrl = 4,
Meta = 8,
}
public enum KeyInputEvent { Down, Up };
public struct KeyInput
{
public KeyInputEvent Event;
public char KeyChar;
public char UnicodeChar;
public string KeyName;
public Modifiers Modifiers;
public int VirtKey;

View File

@@ -1,181 +1,182 @@
#region Copyright & License Information
/*
* Copyright 2007-2010 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
namespace OpenRA.FileFormats.Graphics
{
public static class PngLoader
{
public static Bitmap Load(string filename)
{
return Load(File.OpenRead(filename));
}
public static Bitmap Load(Stream s)
{
using (var br = new BinaryReader(s))
{
var signature = new byte[] { 137, 80, 78, 71, 13, 10, 26, 10 };
foreach (var b in signature)
if (br.ReadByte() != b)
throw new InvalidDataException("PNG Signature is bogus");
Bitmap bitmap = null;
Color[] palette = null;
List<byte> data = new List<byte>();
for (; ; )
{
var length = IPAddress.NetworkToHostOrder(br.ReadInt32());
var type = Encoding.UTF8.GetString(br.ReadBytes(4));
var content = br.ReadBytes(length);
var crc = br.ReadInt32();
using (var ms = new MemoryStream(content))
using (var cr = new BinaryReader(ms))
switch (type)
{
case "IHDR":
{
var width = IPAddress.NetworkToHostOrder(cr.ReadInt32());
var height = IPAddress.NetworkToHostOrder(cr.ReadInt32());
var bitDepth = cr.ReadByte();
var colorType = (PngColorType)cr.ReadByte();
var compression = cr.ReadByte();
var filter = cr.ReadByte();
var interlace = cr.ReadByte();
if (compression != 0) throw new InvalidDataException("Compression method not supported");
if (interlace != 0) throw new InvalidDataException("Interlacing not supported");
bitmap = new Bitmap(width, height, MakePixelFormat(bitDepth, colorType));
}
break;
case "PLTE":
{
palette = new Color[256];
for (var i = 0; i < 256; i++)
{
var r = cr.ReadByte(); var g = cr.ReadByte(); var b = cr.ReadByte();
palette[i] = Color.FromArgb(r, g, b);
}
}
break;
case "tRNS":
{
for (var i = 0; i < length; i++)
palette[i] = Color.FromArgb(cr.ReadByte(), palette[i]);
}
break;
case "IDAT":
{
data.AddRange(content);
}
break;
case "IEND":
{
var bits = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
using (var ns = new MemoryStream(data.ToArray()))
{
// 'zlib' flags bytes; confuses the DeflateStream.
var flags = (byte)ns.ReadByte();
var moreFlags = (byte)ns.ReadByte();
using (var ds = new DeflateStream(ns, CompressionMode.Decompress))
using (var dr = new BinaryReader(ds))
{
var prevLine = new byte[bitmap.Width]; // all zero
for (var y = 0; y < bitmap.Height; y++)
{
var filter = (PngFilter)dr.ReadByte();
var line = dr.ReadBytes(bitmap.Width);
for (var i = 0; i < bitmap.Width; i++)
line[i] = i > 0
? UnapplyFilter(filter, line[i], line[i - 1], prevLine[i], prevLine[i - 1])
: UnapplyFilter(filter, line[i], 0, prevLine[i], 0);
Marshal.Copy(line, 0, new IntPtr(bits.Scan0.ToInt64() + y * bits.Stride), line.Length);
prevLine = line;
}
}
}
bitmap.UnlockBits(bits);
using (var temp = new Bitmap(1, 1, PixelFormat.Format8bppIndexed))
{
var cp = temp.Palette;
for (var i = 0; i < 256; i++)
cp.Entries[i] = palette[i]; // finalize the palette.
bitmap.Palette = cp;
return bitmap;
}
}
}
}
}
}
static byte UnapplyFilter(PngFilter f, byte x, byte a, byte b, byte c)
{
switch (f)
{
case PngFilter.None: return x;
case PngFilter.Sub: return (byte)(x + a);
case PngFilter.Up: return (byte)(x + b);
case PngFilter.Average: return (byte)(x + (a + b) / 2);
case PngFilter.Paeth: return (byte)(x + Paeth(a, b, c));
default:
throw new InvalidOperationException("Unsupported Filter");
}
}
static byte Paeth(byte a, byte b, byte c)
{
var p = a + b - c;
var pa = Math.Abs(p - a);
var pb = Math.Abs(p - b);
var pc = Math.Abs(p - c);
return (pa <= pb && pa <= pc) ? a :
(pb <= pc) ? b : c;
}
[Flags]
enum PngColorType { Indexed = 1, Color = 2, Alpha = 4 };
enum PngFilter { None, Sub, Up, Average, Paeth };
static PixelFormat MakePixelFormat(byte bitDepth, PngColorType colorType)
{
if (bitDepth == 8 && colorType == (PngColorType.Indexed | PngColorType.Color))
return PixelFormat.Format8bppIndexed;
throw new InvalidDataException("Unknown pixelformat");
}
}
}
#region Copyright & License Information
/*
* Copyright 2007-2010 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
namespace OpenRA.FileFormats.Graphics
{
public static class PngLoader
{
public static Bitmap Load(string filename)
{
using (var s = File.OpenRead(filename))
return Load(s);
}
public static Bitmap Load(Stream s)
{
using (var br = new BinaryReader(s))
{
var signature = new byte[] { 137, 80, 78, 71, 13, 10, 26, 10 };
foreach (var b in signature)
if (br.ReadByte() != b)
throw new InvalidDataException("PNG Signature is bogus");
Bitmap bitmap = null;
Color[] palette = null;
List<byte> data = new List<byte>();
for (; ; )
{
var length = IPAddress.NetworkToHostOrder(br.ReadInt32());
var type = Encoding.UTF8.GetString(br.ReadBytes(4));
var content = br.ReadBytes(length);
/*var crc = */br.ReadInt32();
using (var ms = new MemoryStream(content))
using (var cr = new BinaryReader(ms))
switch (type)
{
case "IHDR":
{
var width = IPAddress.NetworkToHostOrder(cr.ReadInt32());
var height = IPAddress.NetworkToHostOrder(cr.ReadInt32());
var bitDepth = cr.ReadByte();
var colorType = (PngColorType)cr.ReadByte();
var compression = cr.ReadByte();
/*var filter = */cr.ReadByte();
var interlace = cr.ReadByte();
if (compression != 0) throw new InvalidDataException("Compression method not supported");
if (interlace != 0) throw new InvalidDataException("Interlacing not supported");
bitmap = new Bitmap(width, height, MakePixelFormat(bitDepth, colorType));
}
break;
case "PLTE":
{
palette = new Color[256];
for (var i = 0; i < 256; i++)
{
var r = cr.ReadByte(); var g = cr.ReadByte(); var b = cr.ReadByte();
palette[i] = Color.FromArgb(r, g, b);
}
}
break;
case "tRNS":
{
for (var i = 0; i < length; i++)
palette[i] = Color.FromArgb(cr.ReadByte(), palette[i]);
}
break;
case "IDAT":
{
data.AddRange(content);
}
break;
case "IEND":
{
var bits = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
using (var ns = new MemoryStream(data.ToArray()))
{
// 'zlib' flags bytes; confuses the DeflateStream.
/*var flags = (byte)*/ns.ReadByte();
/*var moreFlags = (byte)*/ns.ReadByte();
using (var ds = new DeflateStream(ns, CompressionMode.Decompress))
using (var dr = new BinaryReader(ds))
{
var prevLine = new byte[bitmap.Width]; // all zero
for (var y = 0; y < bitmap.Height; y++)
{
var filter = (PngFilter)dr.ReadByte();
var line = dr.ReadBytes(bitmap.Width);
for (var i = 0; i < bitmap.Width; i++)
line[i] = i > 0
? UnapplyFilter(filter, line[i], line[i - 1], prevLine[i], prevLine[i - 1])
: UnapplyFilter(filter, line[i], 0, prevLine[i], 0);
Marshal.Copy(line, 0, new IntPtr(bits.Scan0.ToInt64() + y * bits.Stride), line.Length);
prevLine = line;
}
}
}
bitmap.UnlockBits(bits);
using (var temp = new Bitmap(1, 1, PixelFormat.Format8bppIndexed))
{
var cp = temp.Palette;
for (var i = 0; i < 256; i++)
cp.Entries[i] = palette[i]; // finalize the palette.
bitmap.Palette = cp;
return bitmap;
}
}
}
}
}
}
static byte UnapplyFilter(PngFilter f, byte x, byte a, byte b, byte c)
{
switch (f)
{
case PngFilter.None: return x;
case PngFilter.Sub: return (byte)(x + a);
case PngFilter.Up: return (byte)(x + b);
case PngFilter.Average: return (byte)(x + (a + b) / 2);
case PngFilter.Paeth: return (byte)(x + Paeth(a, b, c));
default:
throw new InvalidOperationException("Unsupported Filter");
}
}
static byte Paeth(byte a, byte b, byte c)
{
var p = a + b - c;
var pa = Math.Abs(p - a);
var pb = Math.Abs(p - b);
var pc = Math.Abs(p - c);
return (pa <= pb && pa <= pc) ? a :
(pb <= pc) ? b : c;
}
[Flags]
enum PngColorType { Indexed = 1, Color = 2, Alpha = 4 };
enum PngFilter { None, Sub, Up, Average, Paeth };
static PixelFormat MakePixelFormat(byte bitDepth, PngColorType colorType)
{
if (bitDepth == 8 && colorType == (PngColorType.Indexed | PngColorType.Color))
return PixelFormat.Format8bppIndexed;
throw new InvalidDataException("Unknown pixelformat");
}
}
}

View File

@@ -63,7 +63,7 @@ namespace OpenRA.FileFormats
public Size Size { get { return new Size(Width, Height); } }
private readonly List<ImageHeader> headers = new List<ImageHeader>();
readonly List<ImageHeader> headers = new List<ImageHeader>();
int recurseDepth = 0;
@@ -156,7 +156,7 @@ namespace OpenRA.FileFormats
return compressedBytes;
}
private byte[] CopyImageData( byte[] baseImage )
byte[] CopyImageData( byte[] baseImage )
{
byte[] imageData = new byte[ Width * Height ];
for( int i = 0 ; i < Width * Height ; i++ )
@@ -174,5 +174,11 @@ namespace OpenRA.FileFormats
{
return GetEnumerator();
}
public static ShpReader Load(string filename)
{
using (var s = File.OpenRead(filename))
return new ShpReader(s);
}
}
}

View File

@@ -1,46 +1,56 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace OpenRA.FileFormats.Graphics
{
// format80-only SHP writer
public static class ShpWriter
{
public static void Write(Stream s, int width, int height, IEnumerable<byte[]> frames)
{
var compressedFrames = frames.Select(f => Format80.Encode(f)).ToArray();
// note: end-of-file and all-zeroes headers
var dataOffset = 14 + (compressedFrames.Length + 2) * ImageHeader.SizeOnDisk;
using (var bw = new BinaryWriter(s))
{
bw.Write((ushort)compressedFrames.Length);
bw.Write((ushort)0); // unused
bw.Write((ushort)0); // unused
bw.Write((ushort)width);
bw.Write((ushort)height);
bw.Write((uint)0); // unused
foreach (var f in compressedFrames)
{
var ih = new ImageHeader { Format = Format.Format80, Offset = (uint)dataOffset };
dataOffset += f.Length;
ih.WriteTo(bw);
}
var eof = new ImageHeader { Offset = (uint)dataOffset };
eof.WriteTo(bw);
var allZeroes = new ImageHeader { };
allZeroes.WriteTo(bw);
foreach (var f in compressedFrames)
bw.Write(f);
}
}
}
}
#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 System.IO;
using System.Linq;
namespace OpenRA.FileFormats.Graphics
{
// format80-only SHP writer
public static class ShpWriter
{
public static void Write(Stream s, int width, int height, IEnumerable<byte[]> frames)
{
var compressedFrames = frames.Select(f => Format80.Encode(f)).ToArray();
// note: end-of-file and all-zeroes headers
var dataOffset = 14 + (compressedFrames.Length + 2) * ImageHeader.SizeOnDisk;
using (var bw = new BinaryWriter(s))
{
bw.Write((ushort)compressedFrames.Length);
bw.Write((ushort)0); // unused
bw.Write((ushort)0); // unused
bw.Write((ushort)width);
bw.Write((ushort)height);
bw.Write((uint)0); // unused
foreach (var f in compressedFrames)
{
var ih = new ImageHeader { Format = Format.Format80, Offset = (uint)dataOffset };
dataOffset += f.Length;
ih.WriteTo(bw);
}
var eof = new ImageHeader { Offset = (uint)dataOffset };
eof.WriteTo(bw);
var allZeroes = new ImageHeader { };
allZeroes.WriteTo(bw);
foreach (var f in compressedFrames)
bw.Write(f);
}
}
}
}

View File

@@ -84,7 +84,7 @@ namespace OpenRA.FileFormats
/*var unknown3 = */reader.ReadChars(14);
var frameSize = NextPowerOf2(Math.Max(Width,Height));
var frameSize = Exts.NextPowerOf2(Math.Max(Width,Height));
cbf = new byte[Width*Height];
cbp = new byte[Width*Height];
palette = new uint[numColors];
@@ -258,37 +258,34 @@ namespace OpenRA.FileFormats
}
int cachedFrame = -1;
public uint[,] FrameData { get
void DecodeFrameData( int frame )
{
if (cachedFrame != currentFrame)
cachedFrame = currentFrame;
for (var y = 0; y < blocks.Y; y++)
for (var x = 0; x < blocks.X; x++)
{
var px = origData[x + y*blocks.X];
var mod = origData[x + (y + blocks.Y)*blocks.X];
for (var j = 0; j < blockHeight; j++)
for (var i = 0; i < blockWidth; i++)
{
var cbfi = (mod*256 + px)*8 + j*blockWidth + i;
byte color = (mod == 0x0f) ? px : cbf[cbfi];
frameData[y*blockHeight + j, x*blockWidth + i] = palette[color];
}
}
}
public uint[,] FrameData
{
get
{
cachedFrame = currentFrame;
for (var y = 0; y < blocks.Y; y++)
for (var x = 0; x < blocks.X; x++)
{
var px = origData[x + y*blocks.X];
var mod = origData[x + (y + blocks.Y)*blocks.X];
for (var j = 0; j < blockHeight; j++)
for (var i = 0; i < blockWidth; i++)
{
var cbfi = (mod*256 + px)*8 + j*blockWidth + i;
byte color = (mod == 0x0f) ? px : cbf[cbfi];
frameData[y*blockHeight + j, x*blockWidth + i] = palette[color];
}
}
if (cachedFrame != currentFrame)
DecodeFrameData(currentFrame);
return frameData;
}
return frameData;
}}
int NextPowerOf2(int v)
{
--v;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
++v;
return v;
}
}
}

View File

@@ -0,0 +1,131 @@
#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.Collections.Generic;
using System.IO;
using System.Linq;
using ICSharpCode.SharpZipLib;
using ICSharpCode.SharpZipLib.Zip;
namespace OpenRA.FileFormats
{
public static class InstallUtils
{
static IEnumerable<ZipEntry> GetEntries(this ZipInputStream z)
{
for (; ; )
{
var e = z.GetNextEntry();
if (e != null) yield return e; else break;
}
}
public static string GetMountedDisk(Func<string, bool> isValidDisk)
{
var volumes = DriveInfo.GetDrives()
.Where(v => v.DriveType == DriveType.CDRom && v.IsReady)
.Select(v => v.RootDirectory.FullName);
return volumes.FirstOrDefault(v => isValidDisk(v));
}
// TODO: The package should be mounted into its own context to avoid name collisions with installed files
public static bool ExtractFromPackage(string srcPath, string package, string[] files, string destPath, Action<string> onProgress, Action<string> onError)
{
if (!Directory.Exists(destPath))
Directory.CreateDirectory(destPath);
if (!Directory.Exists(srcPath)) { onError("Cannot find "+package); return false; }
FileSystem.Mount(srcPath);
if (!FileSystem.Exists(package)) { onError("Cannot find "+package); return false; }
FileSystem.Mount(package);
foreach (string s in files)
{
var destFile = Path.Combine(destPath, s);
using (var sourceStream = FileSystem.Open(s))
using (var destStream = File.Create(destFile))
{
onProgress("Extracting "+s);
destStream.Write(sourceStream.ReadAllBytes());
}
}
return true;
}
public static bool CopyFiles(string srcPath, string[] files, string destPath, Action<string> onProgress, Action<string> onError)
{
foreach (var file in files)
{
var fromPath = Path.Combine(srcPath, file);
if (!File.Exists(fromPath))
{
onError("Cannot find "+file);
return false;
}
var destFile = Path.GetFileName(file).ToLowerInvariant();
onProgress("Extracting "+destFile);
File.Copy(fromPath, Path.Combine(destPath, destFile), true);
}
return true;
}
public static bool ExtractZip(string zipFile, string dest, Action<string> onProgress, Action<string> onError)
{
if (!File.Exists(zipFile))
{
onError("Invalid path: "+zipFile);
return false;
}
List<string> extracted = new List<string>();
try
{
var z = new ZipInputStream(File.OpenRead(zipFile));
z.ExtractZip(dest, extracted, s => onProgress("Extracting "+s));
}
catch (SharpZipBaseException)
{
foreach(var f in extracted)
File.Delete(f);
onError("Invalid archive");
return false;
}
return true;
}
// TODO: this belongs in FileSystem/ZipFile
static void ExtractZip(this ZipInputStream z, string destPath, List<string> extracted, Action<string> onProgress)
{
foreach (var entry in z.GetEntries())
{
if (!entry.IsFile) continue;
onProgress(entry.Name);
Directory.CreateDirectory(Path.Combine(destPath, Path.GetDirectoryName(entry.Name)));
var path = Path.Combine(destPath, entry.Name);
extracted.Add(path);
using (var f = File.Create(path))
{
int bufSize = 2048;
byte[] buf = new byte[bufSize];
while ((bufSize = z.Read(buf, 0, buf.Length)) > 0)
f.Write(buf, 0, bufSize);
}
}
z.Close();
}
}
}

View File

@@ -20,17 +20,18 @@ namespace OpenRA.FileFormats
public readonly string[]
Mods, Folders, Packages, Rules, ServerTraits,
Sequences, Cursors, Chrome, Assemblies, ChromeLayout,
Weapons, Voices, Music, Movies, TileSets;
public readonly string LoadScreen;
Weapons, Voices, Music, Movies, TileSets, ChromeMetrics;
public readonly MiniYaml LoadScreen;
public readonly Dictionary<string, Pair<string,int>> Fonts;
public readonly int TileSize = 24;
public Manifest(string[] mods)
{
Mods = mods;
var yaml = mods
var yaml = new MiniYaml(null, mods
.Select(m => MiniYaml.FromFile("mods/" + m + "/mod.yaml"))
.Aggregate(MiniYaml.Merge);
.Aggregate(MiniYaml.MergeLiberal)).NodesDict;
// Todo: Use fieldloader
Folders = YamlList(yaml, "Folders");
Packages = YamlList(yaml, "Packages");
@@ -46,20 +47,21 @@ namespace OpenRA.FileFormats
Music = YamlList(yaml, "Music");
Movies = YamlList(yaml, "Movies");
TileSets = YamlList(yaml, "TileSets");
LoadScreen = yaml.First( x => x.Key == "LoadScreen" ).Value.Value;
if (yaml.FirstOrDefault( x => x.Key == "TileSize" ) != null)
TileSize = int.Parse(yaml.First( x => x.Key == "TileSize" ).Value.Value);
ChromeMetrics = YamlList(yaml, "ChromeMetrics");
LoadScreen = yaml["LoadScreen"];
Fonts = yaml["Fonts"].NodesDict.ToDictionary(x => x.Key, x => Pair.New(x.Value.NodesDict["Font"].Value,
int.Parse(x.Value.NodesDict["Size"].Value)));
if (yaml.ContainsKey("TileSize"))
TileSize = int.Parse(yaml["TileSize"].Value);
}
static string[] YamlList(List<MiniYamlNode> ys, string key)
static string[] YamlList(Dictionary<string, MiniYaml> yaml, string key)
{
var y = ys.FirstOrDefault( x => x.Key == key );
if( y == null )
if (!yaml.ContainsKey(key))
return new string[ 0 ];
return y.Value.NodesDict.Keys.ToArray();
return yaml[key].NodesDict.Keys.ToArray();
}
}
}

View File

@@ -20,15 +20,22 @@ namespace OpenRA.FileFormats
public bool OwnsWorld = false;
public bool NonCombatant = false;
public bool Playable = false;
public string Bot = null;
public bool DefaultStartingUnits = false;
public bool AllowBots = true;
public bool LockRace = false;
public string Race;
public bool LockColor = false;
public ColorRamp ColorRamp = new ColorRamp(0,0,238,34);
public bool LockSpawn = false;
public int Spawn = 0;
public bool LockTeam = false;
public int Team = 0;
public int InitialCash = 0;
public string[] Allies = {};
public string[] Enemies = {};
@@ -38,13 +45,5 @@ namespace OpenRA.FileFormats
{
FieldLoader.Load(this, my);
}
public PlayerReference(string name, string race, bool ownsworld, bool noncombatant)
{
Name = name;
Race = race;
OwnsWorld = ownsworld;
NonCombatant = noncombatant;
}
}
}

View File

@@ -19,7 +19,6 @@ namespace OpenRA.FileFormats
public class TerrainTypeInfo
{
public string Type;
public bool Buildable = true;
public bool AcceptSmudge = true;
public bool IsWater = false;
public Color Color;
@@ -31,10 +30,10 @@ namespace OpenRA.FileFormats
public class TileTemplate
{
[FieldLoader.Load] public ushort Id;
[FieldLoader.Load] public string Image;
[FieldLoader.Load] public int2 Size;
[FieldLoader.Load] public bool PickAny;
public ushort Id;
public string Image;
public int2 Size;
public bool PickAny;
[FieldLoader.LoadUsing( "LoadTiles" )]
public Dictionary<byte, string> Tiles = new Dictionary<byte, string>();

View File

@@ -22,6 +22,7 @@ namespace OpenRA.FileFormats
public struct SourceLocation
{
public string Filename; public int Line;
public override string ToString() { return "{0}:{1}".F(Filename, Line); }
}
public SourceLocation Location;
@@ -53,6 +54,11 @@ namespace OpenRA.FileFormats
: this( k, new MiniYaml( v, n ), loc )
{
}
public override string ToString()
{
return "{{YamlNode: {0} @ {1}}}".F(Key, Location);
}
}
public class MiniYaml
@@ -60,7 +66,20 @@ namespace OpenRA.FileFormats
public string Value;
public List<MiniYamlNode> Nodes;
public Dictionary<string, MiniYaml> NodesDict { get { return Nodes.ToDictionary( x => x.Key, x => x.Value ); } }
public Dictionary<string, MiniYaml> NodesDict
{
get
{
var ret = new Dictionary<string, MiniYaml>();
foreach (var y in Nodes)
{
if (ret.ContainsKey(y.Key))
throw new InvalidDataException("Duplicate key `{0}' in MiniYaml".F(y.Key));
ret.Add(y.Key, y.Value);
}
return ret;
}
}
public MiniYaml( string value ) : this( value, null ) { }
@@ -95,7 +114,7 @@ namespace OpenRA.FileFormats
var level = line.Length - t.Length;
if (levels.Count <= level)
throw new InvalidOperationException("Bad indent in miniyaml");
throw new YamlException("Bad indent in miniyaml");
while (levels.Count > level + 1)
levels.RemoveAt(levels.Count - 1);
@@ -158,7 +177,17 @@ namespace OpenRA.FileFormats
return FromLines(text.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries), "<no filename available>");
}
public static List<MiniYamlNode> Merge( List<MiniYamlNode> a, List<MiniYamlNode> b )
public static List<MiniYamlNode> MergeLiberal(List<MiniYamlNode> a, List<MiniYamlNode> b)
{
return Merge(a, b, false);
}
public static List<MiniYamlNode> MergeStrict(List<MiniYamlNode> a, List<MiniYamlNode> b)
{
return Merge(a, b, true);
}
static List<MiniYamlNode> Merge( List<MiniYamlNode> a, List<MiniYamlNode> b, bool throwErrors )
{
if( a.Count == 0 )
return b;
@@ -171,7 +200,8 @@ namespace OpenRA.FileFormats
var bDict = b.ToDictionary( x => x.Key );
var keys = aDict.Keys.Union( bDict.Keys ).ToList();
var noInherit = keys.Where( x => x.Length > 0 && x[ 0 ] == '-' ).Select( x => x.Substring( 1 ) ).ToList();
var noInherit = keys.Where(x => x.Length > 0 && x[0] == '-')
.ToDictionary(x => x.Substring(1), x => false);
foreach( var key in keys )
{
@@ -179,30 +209,48 @@ namespace OpenRA.FileFormats
aDict.TryGetValue( key, out aa );
bDict.TryGetValue( key, out bb );
if( noInherit.Contains( key ) )
if( noInherit.ContainsKey( key ) )
{
if( aa != null )
ret.Add( aa );
if (!throwErrors)
if (aa != null)
ret.Add(aa);
noInherit[key] = true;
}
else
{
var loc = aa == null ? default( MiniYamlNode.SourceLocation ) : aa.Location;
var merged = ( aa == null || bb == null ) ? aa ?? bb : new MiniYamlNode( key, Merge( aa.Value, bb.Value ), loc );
var merged = ( aa == null || bb == null ) ? aa ?? bb : new MiniYamlNode( key, Merge( aa.Value, bb.Value, throwErrors ), loc );
ret.Add( merged );
}
}
if (throwErrors)
if (noInherit.ContainsValue(false))
throw new YamlException("Bogus yaml removals: {0}".F(
string.Join(", ", noInherit.Where(x => !x.Value).Select(x => x.Key).ToArray())));
return ret;
}
public static MiniYaml Merge( MiniYaml a, MiniYaml b )
public static MiniYaml MergeLiberal(MiniYaml a, MiniYaml b)
{
return Merge(a, b, false);
}
public static MiniYaml MergeStrict(MiniYaml a, MiniYaml b)
{
return Merge(a, b, true);
}
static MiniYaml Merge( MiniYaml a, MiniYaml b, bool throwErrors )
{
if( a == null )
return b;
if( b == null )
return a;
return new MiniYaml( a.Value ?? b.Value, Merge( a.Nodes, b.Nodes ) );
return new MiniYaml( a.Value ?? b.Value, Merge( a.Nodes, b.Nodes, throwErrors ) );
}
public IEnumerable<string> ToLines(string name)
@@ -237,4 +285,9 @@ namespace OpenRA.FileFormats
}
}
}
public class YamlException : Exception
{
public YamlException(string s) : base(s) { }
}
}

View File

@@ -1,47 +1,49 @@
#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
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace OpenRA.FileFormats
{
public class Mod
{
public string Title;
public string Description;
public string Version;
public string Author;
public string Requires;
public bool Standalone = false;
public static readonly Dictionary<string, Mod> AllMods = ValidateMods(Directory.GetDirectories("mods").Select(x => x.Substring(5)).ToArray());
public static Dictionary<string, Mod> ValidateMods(string[] mods)
{
var ret = new Dictionary<string, Mod>();
foreach (var m in mods)
{
if (!File.Exists("mods" + Path.DirectorySeparatorChar + m + Path.DirectorySeparatorChar + "mod.yaml"))
continue;
var yaml = new MiniYaml(null, MiniYaml.FromFile("mods" + Path.DirectorySeparatorChar + m + Path.DirectorySeparatorChar + "mod.yaml"));
if (!yaml.NodesDict.ContainsKey("Metadata"))
continue;
ret.Add(m, FieldLoader.Load<Mod>(yaml.NodesDict["Metadata"]));
}
return ret;
}
}
}
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace OpenRA.FileFormats
{
public class Mod
{
public string Id;
public string Title;
public string Description;
public string Version;
public string Author;
public string Requires;
public bool Standalone = false;
public static readonly Dictionary<string, Mod> AllMods = ValidateMods(Directory.GetDirectories("mods").Select(x => x.Substring(5)).ToArray());
public static Dictionary<string, Mod> ValidateMods(string[] mods)
{
var ret = new Dictionary<string, Mod>();
foreach (var m in mods)
{
if (!File.Exists("mods" + Path.DirectorySeparatorChar + m + Path.DirectorySeparatorChar + "mod.yaml"))
continue;
var yaml = new MiniYaml(null, MiniYaml.FromFile("mods" + Path.DirectorySeparatorChar + m + Path.DirectorySeparatorChar + "mod.yaml"));
if (!yaml.NodesDict.ContainsKey("Metadata"))
continue;
ret.Add(m, FieldLoader.Load<Mod>(yaml.NodesDict["Metadata"]));
ret[m].Id = m;
}
return ret;
}
}
}

View File

@@ -1,124 +1,128 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>OpenRA.FileFormats</RootNamespace>
<AssemblyName>OpenRA.FileFormats</AssemblyName>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>2.0</OldToolsVersion>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<OutputPath>..\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Optimize>false</Optimize>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="Tao.Sdl, Version=1.2.13.0, Culture=neutral, PublicKeyToken=9c7a200e36c0094e">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\thirdparty\Tao\Tao.Sdl.dll</HintPath>
</Reference>
<Reference Include="WindowsBase">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\thirdparty\ICSharpCode.SharpZipLib.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ColorHSLR.cs" />
<Compile Include="Evaluator.cs" />
<Compile Include="Exts.cs" />
<Compile Include="FieldLoader.cs" />
<Compile Include="Graphics\IGraphicsDevice.cs" />
<Compile Include="Graphics\IInputHandler.cs" />
<Compile Include="Graphics\PngLoader.cs" />
<Compile Include="Graphics\ShpWriter.cs" />
<Compile Include="Graphics\Vertex.cs" />
<Compile Include="HttpUtil.cs" />
<Compile Include="Manifest.cs" />
<Compile Include="MiniYaml.cs" />
<Compile Include="Mod.cs" />
<Compile Include="PackageEntry.cs" />
<Compile Include="Palette.cs" />
<Compile Include="PlayerColorRemap.cs" />
<Compile Include="Primitives\ActionQueue.cs" />
<Compile Include="Primitives\DisposableAction.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Thirdparty\Random.cs" />
<Compile Include="Support\Log.cs" />
<Compile Include="Support\Stopwatch.cs" />
<Compile Include="Support\Timer.cs" />
<Compile Include="TypeDictionary.cs" />
<Compile Include="Map\TileReference.cs" />
<Compile Include="Map\Terrain.cs" />
<Compile Include="Primitives\Cache.cs" />
<Compile Include="Primitives\float2.cs" />
<Compile Include="Primitives\Pair.cs" />
<Compile Include="Map\TileSet.cs" />
<Compile Include="Primitives\PriorityQueue.cs" />
<Compile Include="Primitives\Lazy.cs" />
<Compile Include="FileFormats\AudLoader.cs" />
<Compile Include="FileFormats\Blowfish.cs" />
<Compile Include="FileFormats\BlowfishKeyProvider.cs" />
<Compile Include="Primitives\Set.cs" />
<Compile Include="Graphics\Dune2ShpReader.cs" />
<Compile Include="FileFormats\Format2.cs" />
<Compile Include="FileFormats\Format40.cs" />
<Compile Include="FileFormats\Format80.cs" />
<Compile Include="FileFormats\IniFile.cs" />
<Compile Include="Graphics\ShpReader.cs" />
<Compile Include="Primitives\int2.cs" />
<Compile Include="Map\SmudgeReference.cs" />
<Compile Include="Map\PlayerReference.cs" />
<Compile Include="Graphics\VqaReader.cs" />
<Compile Include="Filesystem\MixFile.cs" />
<Compile Include="Filesystem\FileSystem.cs" />
<Compile Include="Filesystem\Folder.cs" />
<Compile Include="Filesystem\InstallShieldPackage.cs" />
<Compile Include="FileFormats\Blast.cs" />
<Compile Include="Filesystem\ZipFile.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>OpenRA.FileFormats</RootNamespace>
<AssemblyName>OpenRA.FileFormats</AssemblyName>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>2.0</OldToolsVersion>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<OutputPath>..\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Optimize>false</Optimize>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="Tao.Sdl, Version=1.2.13.0, Culture=neutral, PublicKeyToken=9c7a200e36c0094e">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\thirdparty\Tao\Tao.Sdl.dll</HintPath>
</Reference>
<Reference Include="WindowsBase">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\thirdparty\ICSharpCode.SharpZipLib.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Evaluator.cs" />
<Compile Include="Exts.cs" />
<Compile Include="FieldLoader.cs" />
<Compile Include="Graphics\IGraphicsDevice.cs" />
<Compile Include="Graphics\IInputHandler.cs" />
<Compile Include="Graphics\PngLoader.cs" />
<Compile Include="Graphics\ShpWriter.cs" />
<Compile Include="Graphics\Vertex.cs" />
<Compile Include="HttpUtil.cs" />
<Compile Include="Manifest.cs" />
<Compile Include="MiniYaml.cs" />
<Compile Include="Mod.cs" />
<Compile Include="PackageEntry.cs" />
<Compile Include="Palette.cs" />
<Compile Include="Platform.cs" />
<Compile Include="PlayerColorRemap.cs" />
<Compile Include="Primitives\ActionQueue.cs" />
<Compile Include="Primitives\DisposableAction.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Thirdparty\Random.cs" />
<Compile Include="Support\Log.cs" />
<Compile Include="Support\Stopwatch.cs" />
<Compile Include="Support\Timer.cs" />
<Compile Include="TypeDictionary.cs" />
<Compile Include="Map\TileReference.cs" />
<Compile Include="Map\Terrain.cs" />
<Compile Include="Primitives\Cache.cs" />
<Compile Include="Primitives\float2.cs" />
<Compile Include="Primitives\Pair.cs" />
<Compile Include="Map\TileSet.cs" />
<Compile Include="Primitives\PriorityQueue.cs" />
<Compile Include="Primitives\Lazy.cs" />
<Compile Include="FileFormats\AudLoader.cs" />
<Compile Include="FileFormats\Blowfish.cs" />
<Compile Include="FileFormats\BlowfishKeyProvider.cs" />
<Compile Include="Primitives\Set.cs" />
<Compile Include="Graphics\Dune2ShpReader.cs" />
<Compile Include="FileFormats\Format2.cs" />
<Compile Include="FileFormats\Format40.cs" />
<Compile Include="FileFormats\Format80.cs" />
<Compile Include="FileFormats\IniFile.cs" />
<Compile Include="Graphics\ShpReader.cs" />
<Compile Include="Primitives\int2.cs" />
<Compile Include="Map\SmudgeReference.cs" />
<Compile Include="Map\PlayerReference.cs" />
<Compile Include="Graphics\VqaReader.cs" />
<Compile Include="Filesystem\MixFile.cs" />
<Compile Include="Filesystem\FileSystem.cs" />
<Compile Include="Filesystem\Folder.cs" />
<Compile Include="Filesystem\InstallShieldPackage.cs" />
<Compile Include="FileFormats\Blast.cs" />
<Compile Include="Filesystem\ZipFile.cs" />
<Compile Include="InstallUtils.cs" />
<Compile Include="Primitives\Cached.cs" />
<Compile Include="ColorRamp.cs" />
<Compile Include="Primitives\Bits.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -9,7 +9,10 @@
#endregion
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System;
using System.Reflection;
namespace OpenRA.FileFormats
{
@@ -71,6 +74,23 @@ namespace OpenRA.FileFormats
{
colors = (uint[])p.colors.Clone();
}
public ColorPalette AsSystemPalette()
{
ColorPalette pal;
using (var b = new Bitmap(1, 1, PixelFormat.Format8bppIndexed))
pal = b.Palette;
for (var i = 0; i < 256; i++)
pal.Entries[i] = GetColor(i);
// hack around a mono bug -- the palette flags get set wrong.
if (Platform.CurrentPlatform != PlatformType.Windows)
typeof(ColorPalette).GetField("flags",
BindingFlags.Instance | BindingFlags.NonPublic).SetValue(pal, 1);
return pal;
}
}
public interface IPaletteRemap { Color GetRemappedColor(Color original, int index); }

View File

@@ -0,0 +1,75 @@
#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.Diagnostics;
using System.IO;
using OpenRA.FileFormats;
namespace OpenRA
{
public enum PlatformType { Unknown, Windows, OSX, Linux }
public static class Platform
{
public static PlatformType CurrentPlatform { get { return currentPlatform.Value; } }
static Lazy<PlatformType> currentPlatform = new Lazy<PlatformType>(GetCurrentPlatform);
static PlatformType GetCurrentPlatform()
{
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
return PlatformType.Windows;
try
{
var psi = new ProcessStartInfo("uname", "-s");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
var p = Process.Start(psi);
var kernelName = p.StandardOutput.ReadToEnd();
if (kernelName.Contains("Linux") || kernelName.Contains("BSD"))
return PlatformType.Linux;
if (kernelName.Contains("Darwin"))
return PlatformType.OSX;
}
catch { }
return PlatformType.Unknown;
}
public static string SupportDir
{
get
{
var dir = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
switch (CurrentPlatform)
{
case PlatformType.Windows:
dir += Path.DirectorySeparatorChar + "OpenRA";
break;
case PlatformType.OSX:
dir += "/Library/Application Support/OpenRA";
break;
case PlatformType.Linux:
default:
dir += "/.openra";
break;
}
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
return dir + Path.DirectorySeparatorChar;
}
}
}
}

View File

@@ -18,23 +18,45 @@ namespace OpenRA.FileFormats
public class ActionQueue
{
object syncRoot = new object();
Action actions = () => { };
PriorityQueue<DelayedAction> actions = new PriorityQueue<DelayedAction>();
public void Add(Action a)
public void Add(Action a) { Add(a, 0); }
public void Add(Action a, int delay)
{
lock (syncRoot)
actions += a;
actions.Add(new DelayedAction(a, Environment.TickCount + delay));
}
public void PerformActions()
{
Action a;
Action a = () => {};
lock (syncRoot)
{
a = actions;
actions = () => { };
var t = Environment.TickCount;
while (!actions.Empty && actions.Peek().Time <= t)
{
var da = actions.Pop();
a += da.Action;
}
}
a();
}
}
struct DelayedAction : IComparable<DelayedAction>
{
public int Time;
public Action Action;
public DelayedAction(Action action, int time)
{
Action = action;
Time = time;
}
public int CompareTo(DelayedAction other)
{
return Math.Sign(Time - other.Time);
}
}
}

View File

@@ -0,0 +1,65 @@
#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.Collections.Generic;
using System.Linq;
namespace OpenRA.FileFormats
{
static class BitAllocator<T> where T : struct
{
static int nextVal = 1;
static Cache<string,int> bits;
static BitAllocator() { bits = new Cache<string, int>( _ => Allocate() ); }
static int Allocate()
{
if (nextVal == 0)
throw new InvalidOperationException(
"Too many values in BitAllocator<{0}>".F(typeof(T).Name));
var val = nextVal;
nextVal <<= 1;
return val;
}
public static int GetValue(string[] val)
{
return val.Select( a => bits[a] ).Aggregate( 0, (a,b) => a | b );
}
public static IEnumerable<string> GetStrings(int val)
{
for( var i = 0; i < 32; i++ )
{
var x = 1 << i;
if ((val & x) != 0)
yield return bits.Single( a => a.Value == x ).Key;
}
}
}
public struct Bits<T> where T : struct
{
public int Value;
public Bits(string[] val) { Value = BitAllocator<T>.GetValue(val); }
public Bits(Bits<T> other) { Value = other.Value; }
public override string ToString()
{
return string.Join(",", BitAllocator<T>.GetStrings(Value).ToArray());
}
public override int GetHashCode() { return Value.GetHashCode(); }
}
}

View File

@@ -15,7 +15,7 @@ using System.Collections.Generic;
namespace OpenRA.FileFormats
{
public class Cache<T, U> : IEnumerable<KeyValuePair<T, U>>
{
{
Dictionary<T, U> hax;
Func<T,U> loader;
@@ -26,10 +26,10 @@ namespace OpenRA.FileFormats
throw new ArgumentNullException();
this.loader = loader;
}
public Cache(Func<T, U> loader)
: this(loader, EqualityComparer<T>.Default) { }
}
public Cache(Func<T, U> loader)
: this(loader, EqualityComparer<T>.Default) { }
public U this[T key]
{

View File

@@ -0,0 +1,55 @@
#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;
namespace OpenRA.FileFormats
{
public class Cached<T>
{
Func<T> p;
T value;
bool hasValue;
public Cached(Func<T> p)
{
if (p == null)
throw new ArgumentNullException();
this.p = p;
}
public T Value
{
get
{
if (hasValue)
return value;
value = p();
hasValue = true;
return value;
}
}
public T Force() { return Value; }
public void Invalidate()
{
hasValue = false;
}
}
public static class Cached
{
public static Cached<T> New<T>(Func<T> p) { return new Cached<T>(p); }
}
}

View File

@@ -36,12 +36,9 @@ namespace OpenRA.FileFormats
p = null;
return value;
}
}
public void Force()
{
var ignored = Value;
}
}
public T Force() { return Value; }
}
public static class Lazy

View File

@@ -8,8 +8,8 @@
*/
#endregion
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System;
using System.Drawing;
namespace OpenRA.FileFormats
@@ -25,7 +25,7 @@ namespace OpenRA.FileFormats
Second = second;
}
internal static IEqualityComparer<T> tc = EqualityComparer<T>.Default;
internal static IEqualityComparer<T> tc = EqualityComparer<T>.Default;
internal static IEqualityComparer<U> uc = EqualityComparer<U>.Default;
public static bool operator ==(Pair<T, U> a, Pair<T, U> b)
@@ -60,31 +60,31 @@ namespace OpenRA.FileFormats
public override string ToString()
{
return "({0},{1})".F(First, Second);
}
class PairEqualityComparer : IEqualityComparer<Pair<T, U>>
{
public bool Equals(Pair<T, U> x, Pair<T, U> y) { return x == y; }
public int GetHashCode(Pair<T, U> obj) { return obj.GetHashCode(); }
}
}
class PairEqualityComparer : IEqualityComparer<Pair<T, U>>
{
public bool Equals(Pair<T, U> x, Pair<T, U> y) { return x == y; }
public int GetHashCode(Pair<T, U> obj) { return obj.GetHashCode(); }
}
public static IEqualityComparer<Pair<T, U>> EqualityComparer { get { return new PairEqualityComparer(); } }
}
public static class Pair
{
public static Pair<T, U> New<T, U>(T t, U u) { return new Pair<T, U>(t, u); }
static Pair()
{
Pair<char,Color>.uc = new ColorEqualityComparer();
}
// avoid the default crappy one
class ColorEqualityComparer : IEqualityComparer<Color>
{
public bool Equals(Color x, Color y) { return x.ToArgb() == y.ToArgb(); }
public int GetHashCode(Color obj) { return obj.GetHashCode(); }
}
{
public static Pair<T, U> New<T, U>(T t, U u) { return new Pair<T, U>(t, u); }
static Pair()
{
Pair<char,Color>.uc = new ColorEqualityComparer();
}
// avoid the default crappy one
class ColorEqualityComparer : IEqualityComparer<Color>
{
public bool Equals(Color x, Color y) { return x.ToArgb() == y.ToArgb(); }
public int GetHashCode(Color obj) { return obj.GetHashCode(); }
}
}
}

View File

@@ -62,6 +62,7 @@ namespace OpenRA.FileFormats
return At(lastLevel, lastIndex);
}
public T Peek() { return At(0,0); }
public T Pop()
{
if (level == 0 && index == 0)

View File

@@ -45,22 +45,4 @@ namespace OpenRA.Collections
return GetEnumerator();
}
}
public class CachedView<T,U> : Set<U>
{
public CachedView( Set<T> set, Func<T, bool> include, Func<T, U> store )
: this( set, include, x => new[] { store( x ) } )
{
}
public CachedView( Set<T> set, Func<T,bool> include, Func<T,IEnumerable<U>> store )
{
foreach( var t in set )
if( include( t ) )
store( t ).Do( x => Add( x ) );
set.OnAdd += obj => { if( include( obj ) ) store( obj ).Do( x => Add( x ) ); };
set.OnRemove += obj => { if( include( obj ) ) store( obj ).Do( x => Remove( x ) ); };
}
}
}

View File

@@ -1,36 +1,26 @@
#region Copyright & License Information
/*
* Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford.
* This file is part of OpenRA.
*
* OpenRA is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenRA is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenRA. If not, see <http://www.gnu.org/licenses/>.
*/
#endregion
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("OpenRA.FileFormats")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OpenRA.FileFormats")]
[assembly: AssemblyCopyright("Copyright © 2007,2009,2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("OpenRA.FileFormats")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OpenRA.FileFormats")]
[assembly: AssemblyCopyright("Copyright © 2007,2009,2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -34,33 +34,38 @@ namespace OpenRA
set
{
LogPathPrefix = value;
if (!Directory.Exists(LogPathPrefix))
Directory.CreateDirectory(LogPathPrefix);
Directory.CreateDirectory(LogPathPrefix);
}
}
public static void AddChannel(string channelName, string filename)
{
if (channels.ContainsKey(channelName)) return;
var i = 0;
var f = filename;
while (File.Exists(LogPathPrefix + filename))
try
{
StreamWriter writer = File.CreateText(LogPathPrefix + filename);
writer.AutoFlush = true;
channels.Add(channelName, new ChannelInfo() { Filename = filename, Writer = writer });
return;
}
catch (IOException) { filename = f + ".{0}".F(++i); }
//if no logs exist, just make it
StreamWriter w = File.CreateText(LogPathPrefix + filename);
w.AutoFlush = true;
channels.Add(channelName, new ChannelInfo() { Filename = filename, Writer = w });
}
static IEnumerable<string> FilenamesForChannel(string channelName, string baseFilename)
{
for(var i = 0;; i++ )
yield return Path.Combine(LogPathPrefix,
i > 0 ? "{0}.{1}".F(baseFilename, i) : baseFilename);
}
public static void AddChannel(string channelName, string baseFilename)
{
if (channels.ContainsKey(channelName)) return;
foreach (var filename in FilenamesForChannel(channelName, baseFilename))
try
{
var writer = File.CreateText(filename);
writer.AutoFlush = true;
channels.Add(channelName,
new ChannelInfo()
{
Filename = filename,
Writer = writer
});
return;
}
catch (IOException) { }
}
public static void Write(string channel, string format, params object[] args)
{

View File

@@ -13,7 +13,6 @@ using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Support;
using OpenRA.Traits;
using OpenRA.Traits.Activities;
@@ -26,12 +25,30 @@ namespace OpenRA
public readonly World World;
public readonly uint ActorID;
public int2 Location { get { return Trait<IOccupySpace>().TopLeft; } }
public int2 CenterLocation { get { return Trait<IHasLocation>().PxPosition; } }
Lazy<IOccupySpace> occupySpace;
IHasLocation HasLocation;
Lazy<IMove> Move;
public Cached<Rectangle> Bounds;
public Cached<Rectangle> ExtendedBounds;
public IOccupySpace OccupiesSpace { get { return occupySpace.Value; } }
public int2 Location { get { return occupySpace.Value.TopLeft; } }
public int2 CenterLocation
{
get
{
if (HasLocation == null)
HasLocation = Trait<IHasLocation>();
return HasLocation.PxPosition;
}
}
[Sync]
public Player Owner;
private IActivity currentActivity;
Activity currentActivity;
public Group Group;
internal Actor(World world, string name, TypeDictionary initDict )
@@ -43,6 +60,8 @@ namespace OpenRA
if( initDict.Contains<OwnerInit>() )
Owner = init.Get<OwnerInit,Player>();
occupySpace = Lazy.New( () => TraitOrDefault<IOccupySpace>() );
if (name != null)
{
if (!Rules.Info.ContainsKey(name.ToLowerInvariant()))
@@ -52,29 +71,33 @@ namespace OpenRA
foreach (var trait in Info.TraitsInConstructOrder())
AddTrait(trait.Create(init));
}
Move = Lazy.New( () => TraitOrDefault<IMove>() );
Size = Lazy.New(() =>
{
var si = Info.Traits.GetOrDefault<SelectableInfo>();
if (si != null && si.Bounds != null)
return new float2(si.Bounds[0], si.Bounds[1]);
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 float2.Zero;
return firstSprite.Sprite.size * firstSprite.Scale;
if (firstSprite.Sprite == null) return int2.Zero;
return (firstSprite.Sprite.size * firstSprite.Scale).ToInt2();
});
ApplyIRender = x => x.Render(this);
ApplyIRender = x => x.Render(this);
ApplyRenderModifier = (m, p) => p.ModifyRender(this, m);
Bounds = Cached.New( () => CalculateBounds(false) );
ExtendedBounds = Cached.New( () => CalculateBounds(true) );
}
public void Tick()
{
if (currentActivity == null)
foreach (var ni in TraitsImplementing<INotifyIdle>())
ni.TickIdle(this);
Bounds.Invalidate();
ExtendedBounds.Invalidate();
currentActivity = Util.RunActivity( this, currentActivity );
}
@@ -83,14 +106,14 @@ namespace OpenRA
get { return currentActivity == null; }
}
OpenRA.FileFormats.Lazy<float2> Size;
// note: these delegates are cached to avoid massive allocation.
Func<IRender, IEnumerable<Renderable>> ApplyIRender;
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()
{
var mods = TraitsImplementing<IRenderModifier>();
var mods = TraitsImplementing<IRenderModifier>();
var sprites = TraitsImplementing<IRender>().SelectMany(ApplyIRender);
return mods.Aggregate(sprites, ApplyRenderModifier);
}
@@ -99,36 +122,39 @@ namespace OpenRA
// vertically to altitude = 0 to support FindUnitsInCircle queries
// When false, the bounding box is given for the actor
// at its current altitude
public RectangleF GetBounds(bool useAltitude)
Rectangle CalculateBounds(bool useAltitude)
{
var size = Size.Value;
var loc = CenterLocation - 0.5f * size;
var loc = CenterLocation - size / 2;
var si = Info.Traits.GetOrDefault<SelectableInfo>();
if (si != null && si.Bounds != null && si.Bounds.Length > 2)
loc += new float2(si.Bounds[2], si.Bounds[3]);
{
loc.X += si.Bounds[2];
loc.Y += si.Bounds[3];
}
var move = TraitOrDefault<IMove>();
var move = Move.Value;
if (move != null)
{
loc -= new float2(0, move.Altitude);
loc.Y -= move.Altitude;
if (useAltitude)
size = new float2(size.X, size.Y + move.Altitude);
size = new int2(size.X, size.Y + move.Altitude);
}
return new RectangleF(loc.X, loc.Y, size.X, size.Y);
return new Rectangle(loc.X, loc.Y, size.X, size.Y);
}
public bool IsInWorld { get; internal set; }
public void QueueActivity( bool queued, IActivity nextActivity )
public void QueueActivity( bool queued, Activity nextActivity )
{
if( !queued )
CancelActivity();
QueueActivity( nextActivity );
}
public void QueueActivity( IActivity nextActivity )
public void QueueActivity( Activity nextActivity )
{
if( currentActivity == null )
currentActivity = nextActivity;
@@ -142,7 +168,7 @@ namespace OpenRA
currentActivity.Cancel( this );
}
public IActivity GetCurrentActivity()
public Activity GetCurrentActivity()
{
return currentActivity;
}

View File

@@ -17,6 +17,7 @@ namespace OpenRA
{
public readonly Actor self;
public World world { get { return self.World; } }
internal TypeDictionary dict;
public ActorInitializer( Actor actor, TypeDictionary dict )
@@ -25,23 +26,9 @@ namespace OpenRA
this.dict = dict;
}
public T Get<T>()
where T : IActorInit
{
return dict.Get<T>();
}
public U Get<T,U>()
where T : IActorInit<U>
{
return dict.Get<T>().Value( world );
}
public bool Contains<T>()
where T : IActorInit
{
return dict.Contains<T>();
}
public T Get<T>() where T : IActorInit { return dict.Get<T>(); }
public U Get<T,U>() where T : IActorInit<U> { return dict.Get<T>().Value( world ); }
public bool Contains<T>() where T : IActorInit { return dict.Contains<T>(); }
}
public interface IActorInit {}
@@ -50,76 +37,56 @@ namespace OpenRA
{
T Value( World world );
}
public class FacingInit : IActorInit<int>
{
[FieldFromYamlKey]
public readonly int value = 128;
[FieldFromYamlKey] public readonly int value = 128;
public FacingInit() { }
public FacingInit( int init )
{
value = init;
}
public int Value( World world )
{
return value;
}
public FacingInit( int init ) { value = init; }
public int Value( World world ) { return value; }
}
public class TurretFacingInit : IActorInit<int>
{
[FieldFromYamlKey] public readonly int value = 128;
public TurretFacingInit() { }
public TurretFacingInit( int init ) { value = init; }
public int Value( World world ) { return value; }
}
public class AltitudeInit : IActorInit<int>
{
[FieldFromYamlKey]
public readonly int value = 0;
[FieldFromYamlKey] public readonly int value = 0;
public AltitudeInit() { }
public AltitudeInit( int init )
{
value = init;
}
public int Value( World world )
{
return value;
}
public AltitudeInit( int init ) { value = init; }
public int Value( World world ) { return value; }
}
public class LocationInit : IActorInit<int2>
{
[FieldFromYamlKey]
public readonly int2 value = int2.Zero;
[FieldFromYamlKey] public readonly int2 value = int2.Zero;
public LocationInit() { }
public LocationInit( int2 init ) { value = init; }
public int2 Value( World world ) { return value; }
}
public LocationInit( int2 init )
{
value = init;
}
public int2 Value( World world )
{
return value;
}
public class CenterLocationInit : IActorInit<int2>
{
[FieldFromYamlKey] public readonly int2 value = int2.Zero;
public CenterLocationInit() { }
public CenterLocationInit( int2 init ) { value = init; }
public int2 Value( World world ) { return value; }
}
public class OwnerInit : IActorInit<Player>
{
[FieldFromYamlKey]
public readonly string PlayerName = "Neutral";
[FieldFromYamlKey] public readonly string PlayerName = "Neutral";
Player player;
public OwnerInit() { }
public OwnerInit( string playerName ) { this.PlayerName = playerName; }
public OwnerInit( string playerName )
{
this.PlayerName = playerName;
}
public OwnerInit( Player player )
{
public OwnerInit( Player player ) {
this.player = player;
this.PlayerName = player.InternalName;
}
@@ -128,7 +95,7 @@ namespace OpenRA
{
if( player != null )
return player;
return world.players.Values.First( x => x.InternalName == PlayerName );
return world.Players.First( x => x.InternalName == PlayerName );
}
}
}

View File

@@ -13,15 +13,21 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Traits;
namespace OpenRA.Traits
namespace OpenRA
{
public class UnitInfluenceInfo : ITraitInfo
{
public object Create( ActorInitializer init ) { return new UnitInfluence( init.world ); }
}
public class UnitInfluence
public enum SubCell
{
FullCell,
TopLeft,
TopRight,
Center,
BottomLeft,
BottomRight
}
public class ActorMap
{
class InfluenceNode
{
@@ -33,13 +39,13 @@ namespace OpenRA.Traits
InfluenceNode[,] influence;
Map map;
public UnitInfluence( World world )
public ActorMap( World world )
{
map = world.Map;
influence = new InfluenceNode[world.Map.MapSize.X, world.Map.MapSize.Y];
world.ActorAdded += a => Add( a, a.TraitOrDefault<IOccupySpace>() );
world.ActorRemoved += a => Remove( a, a.TraitOrDefault<IOccupySpace>() );
world.ActorAdded += a => Add( a, a.OccupiesSpace );
world.ActorRemoved += a => Remove( a, a.OccupiesSpace );
}
public IEnumerable<Actor> GetUnitsAt( int2 a )
@@ -65,8 +71,8 @@ namespace OpenRA.Traits
if (!AnyUnitsAt(a))
return true;
return new[]{SubCell.TopLeft, SubCell.TopRight, SubCell.Center,
SubCell.BottomLeft, SubCell.BottomRight}.Any(b => !AnyUnitsAt(a,b));
return new[]{ SubCell.TopLeft, SubCell.TopRight, SubCell.Center,
SubCell.BottomLeft, SubCell.BottomRight }.Any(b => !AnyUnitsAt(a,b));
}
public bool AnyUnitsAt(int2 a)

View File

@@ -10,7 +10,6 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
namespace OpenRA.FileFormats
{

61
OpenRA.Game/Download.cs Normal file
View File

@@ -0,0 +1,61 @@
#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.ComponentModel;
using System.Net;
namespace OpenRA
{
public class Download
{
WebClient wc;
bool cancelled;
public Download(string url, string path, Action<DownloadProgressChangedEventArgs> onProgress, Action<AsyncCompletedEventArgs, bool> onComplete)
{
wc = new WebClient();
wc.Proxy = null;
wc.DownloadProgressChanged += (_,a) => onProgress(a);
wc.DownloadFileCompleted += (_,a) => onComplete(a, cancelled);
Game.OnQuit += () => Cancel();
wc.DownloadFileCompleted += (_,a) => {Game.OnQuit -= () => Cancel();};
wc.DownloadFileAsync(new Uri(url), path);
}
public void Cancel()
{
Game.OnQuit -= () => Cancel();
wc.CancelAsync();
cancelled = true;
}
public static string FormatErrorMessage(Exception e)
{
var ex = e as System.Net.WebException;
if (ex == null) return e.Message;
switch(ex.Status)
{
case WebExceptionStatus.NameResolutionFailure:
case WebExceptionStatus.Timeout:
case WebExceptionStatus.ConnectFailure:
return "Cannot connect to remote server";
case WebExceptionStatus.ProtocolError:
return "File not found on remote server";
default:
return ex.Message;
}
}
}
}

View File

@@ -14,12 +14,10 @@ using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Windows.Forms;
using OpenRA.FileFormats;
using OpenRA.GameRules;
using OpenRA.Graphics;
using OpenRA.Network;
using OpenRA.Server;
using OpenRA.Support;
using OpenRA.Widgets;
@@ -29,12 +27,10 @@ namespace OpenRA
{
public static class Game
{
public static Utilities Utilities;
public static int CellSize { get { return modData.Manifest.TileSize; } }
public static ModData modData;
private static WorldRenderer worldRenderer;
static WorldRenderer worldRenderer;
public static Viewport viewport;
public static Settings Settings;
@@ -46,7 +42,7 @@ namespace OpenRA
public static Renderer Renderer;
public static bool HasInputFocus = false;
public static void MoveViewport(float2 loc)
{
viewport.Center(loc);
@@ -55,7 +51,7 @@ namespace OpenRA
public static void JoinServer(string host, int port)
{
var replayFilename = ChooseReplayFilename();
string path = Path.Combine( Game.SupportDir, "Replays" );
string path = Path.Combine( Platform.SupportDir, "Replays" );
if( !Directory.Exists( path ) ) Directory.CreateDirectory( path );
var replayFile = File.Create( Path.Combine( path, replayFilename ) );
@@ -99,11 +95,35 @@ namespace OpenRA
// Hacky workaround for orderManager visibility
public static Widget OpenWindow(World world, string widget)
{
return Widget.OpenWindow(widget, new Dictionary<string,object>{{ "world", world }, { "orderManager", orderManager }, { "worldRenderer", worldRenderer }});
return Widget.OpenWindow(widget, new WidgetArgs() {{ "world", world }, { "orderManager", orderManager }, { "worldRenderer", worldRenderer }});
}
// Who came up with the great idea of making these things
// impossible for the things that want them to access them directly?
public static Widget OpenWindow(string widget, WidgetArgs args)
{
return Widget.OpenWindow(widget, new WidgetArgs(args)
{
{ "world", worldRenderer.world },
{ "orderManager", orderManager },
{ "worldRenderer", worldRenderer },
});
}
// Load a widget with world, orderManager, worldRenderer args, without adding it to the widget tree
public static Widget LoadWidget(World world, string id, Widget parent, WidgetArgs args)
{
return Game.modData.WidgetLoader.LoadWidget(new WidgetArgs(args)
{
{ "world", world },
{ "orderManager", orderManager },
{ "worldRenderer", worldRenderer },
}, parent, id);
}
static ActionQueue afterTickActions = new ActionQueue();
public static void RunAfterTick(Action a) { afterTickActions.Add(a); }
static ActionQueue delayedActions = new ActionQueue();
public static void RunAfterTick(Action a) { delayedActions.Add(a); }
public static void RunAfterDelay(int delay, Action a) { delayedActions.Add(a, delay); }
static void Tick( OrderManager orderManager, Viewport viewPort )
{
@@ -121,18 +141,18 @@ namespace OpenRA
{
++RenderFrame;
viewport.DrawRegions(worldRenderer, new DefaultInputHandler( orderManager.world ));
Sound.SetListenerPosition(viewport.Location + .5f * new float2(viewport.Width, viewport.Height));
Sound.SetListenerPosition(viewport.CenterLocation);
}
PerfHistory.items["render"].Tick();
PerfHistory.items["batches"].Tick();
PerfHistory.items["render_widgets"].Tick();
PerfHistory.items["render_flip"].Tick();
MasterServerQuery.Tick();
afterTickActions.PerformActions();
delayedActions.PerformActions();
}
private static void Tick( OrderManager orderManager )
static void Tick( OrderManager orderManager )
{
int t = Environment.TickCount;
int dt = t - orderManager.LastTickTime;
@@ -142,7 +162,7 @@ namespace OpenRA
orderManager.LastTickTime += Settings.Game.Timestep;
Widget.DoTick();
var world = orderManager.world;
if( orderManager.GameStarted && world.LocalPlayer != null )
if (orderManager.GameStarted)
++Viewport.TicksSinceLastMove;
Sound.Tick();
Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate(); } );
@@ -184,7 +204,6 @@ namespace OpenRA
LobbyInfoChanged();
}
public static event Action<World> AfterGameStart = _ => {};
public static event Action BeforeGameStart = () => {};
internal static void StartGame(string mapUID)
{
@@ -199,9 +218,9 @@ namespace OpenRA
Widget.SelectedWidget = null;
orderManager.LocalFrameNumber = 0;
orderManager.LastTickTime = Environment.TickCount;
orderManager.StartGame();
worldRenderer.RefreshPalette();
AfterGameStart( orderManager.world );
}
public static bool IsHost
@@ -220,27 +239,20 @@ namespace OpenRA
internal static void Initialize(Arguments args)
{
Console.WriteLine("Platform is {0}", Platform.CurrentPlatform);
AppDomain.CurrentDomain.AssemblyResolve += FileSystem.ResolveAssembly;
var defaultSupport = Environment.GetFolderPath(Environment.SpecialFolder.Personal)
+ Path.DirectorySeparatorChar + "OpenRA";
SupportDir = args.GetValue("SupportDir", defaultSupport);
FileSystem.SpecialPackageRoot = args.GetValue("SpecialPackageRoot", "");
Utilities = new Utilities(args.GetValue("UtilityPath", "OpenRA.Utility.exe"));
Settings = new Settings(SupportDir + "settings.yaml", args);
Settings = new Settings(Platform.SupportDir + "settings.yaml", args);
Settings.Save();
Log.LogPath = SupportDir + "Logs" + Path.DirectorySeparatorChar;
Log.LogPath = Platform.SupportDir + "Logs" + Path.DirectorySeparatorChar;
Log.AddChannel("perf", "perf.log");
Log.AddChannel("debug", "debug.log");
Log.AddChannel("sync", "syncreport.log");
FileSystem.Mount("."); // Needed to access shaders
Renderer.Initialize( Game.Settings.Graphics.Mode );
Renderer.SheetSize = Settings.Game.SheetSize;
Renderer = new Renderer();
Console.WriteLine("Available mods:");
@@ -256,6 +268,10 @@ namespace OpenRA
// Clear static state if we have switched mods
LobbyInfoChanged = () => {};
AddChatLine = (a,b,c) => {};
ConnectionStateChanged = om => {};
BeforeGameStart = () => {};
Widget.ResetAll();
worldRenderer = null;
if (server != null)
server.Shutdown();
@@ -266,30 +282,31 @@ namespace OpenRA
var mm = mods.Where( m => Mod.AllMods.ContainsKey( m ) ).ToArray();
Console.WriteLine("Loading mods: {0}",string.Join(",",mm));
Settings.Game.Mods = mm;
Settings.Save();
Sound.StopMusic();
Settings.Save();
Sound.StopMusic();
Sound.StopVideo();
Sound.Initialize();
Sound.Initialize();
modData = new ModData( mm );
Renderer.InitializeFonts(modData.Manifest);
modData.LoadInitialAssets();
PerfHistory.items["render"].hasNormalTick = false;
PerfHistory.items["batches"].hasNormalTick = false;
PerfHistory.items["render_widgets"].hasNormalTick = false;
PerfHistory.items["render_flip"].hasNormalTick = false;
JoinLocal();
viewport = new Viewport(new int2(Renderer.Resolution), Rectangle.Empty, Renderer);
Widget.RootWidget.RemoveChildren();
modData.WidgetLoader.LoadWidget( new Dictionary<string,object>(), Widget.RootWidget, "INIT_SETUP" );
modData.LoadScreen.StartGame();
}
public static void LoadShellMap()
{
StartGame(ChooseShellmap());
Game.orderManager.LastTickTime = Environment.TickCount;
}
static string ChooseShellmap()
@@ -308,10 +325,8 @@ namespace OpenRA
internal static void Run()
{
while (!quit)
{
Tick( orderManager, viewport );
Application.DoEvents();
}
OnQuit();
}
@@ -323,54 +338,57 @@ namespace OpenRA
{
AddChatLine(Color.White, "Debug", String.Format(s,args));
}
public static void Disconnect()
{
if (IsHost && server != null)
server.Shutdown();
orderManager.Dispose();
var shellmap = ChooseShellmap();
if (orderManager.world != null)
orderManager.world.traitDict.PrintReport();
CloseServer();
JoinLocal();
StartGame(shellmap);
Widget.CloseWindow();
Widget.OpenWindow("MAINMENU_BG");
orderManager.Dispose();
}
static string baseSupportDir = null;
public static string SupportDir
public static void CloseServer()
{
set
{
var dir = value;
// Expand paths relative to the personal directory
if (dir.ElementAt(0) == '~')
dir = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + dir.Substring(1);
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
baseSupportDir = dir + Path.DirectorySeparatorChar;
}
get { return baseSupportDir; }
if (server != null)
server.Shutdown();
}
public static T CreateObject<T>( string name )
{
return modData.ObjectCreator.CreateObject<T>( name );
}
public static void CreateAndJoinServer(Settings settings, string map)
public static void CreateServer(ServerSettings settings)
{
server = new Server.Server(modData, settings, map);
JoinServer(IPAddress.Loopback.ToString(), settings.Server.ListenPort);
}
public static bool IsCurrentWorld(World world)
{
return orderManager != null && orderManager.world == world;
}
server = new Server.Server(new IPEndPoint(IPAddress.Any, settings.ListenPort),
Game.Settings.Game.Mods,
settings,
modData);
}
public static int CreateLocalServer(string map)
{
var settings = new ServerSettings()
{
Name = "Skirmish Game",
Map = map
};
// Work around a miscompile in mono 2.6.7:
// booleans that default to true cannot be set false by an initializer
settings.AdvertiseOnline = false;
server = new Server.Server(new IPEndPoint(IPAddress.Loopback, 0),
Game.Settings.Game.Mods,
settings,
modData);
return server.Port;
}
public static bool IsCurrentWorld(World world)
{
return orderManager != null && orderManager.world == world;
}
}
}

View File

@@ -23,14 +23,30 @@ namespace OpenRA
public ActorInfo( string name, MiniYaml node, Dictionary<string, MiniYaml> allUnits )
{
var mergedNode = MergeWithParent( node, allUnits ).NodesDict;
try
{
var mergedNode = MergeWithParent(node, allUnits).NodesDict;
Name = name;
foreach( var t in mergedNode )
if( t.Key != "Inherits" && !t.Key.StartsWith("-") )
Traits.Add( LoadTraitInfo( t.Key.Split('@')[0], t.Value ) );
Name = name;
foreach (var t in mergedNode)
if (t.Key != "Inherits" && !t.Key.StartsWith("-"))
Traits.Add(LoadTraitInfo(t.Key.Split('@')[0], t.Value));
}
catch (YamlException e)
{
throw new YamlException("Actor type {0}: {1}".F(name, e.Message));
}
}
static IEnumerable<MiniYaml> GetInheritanceChain(MiniYaml node, Dictionary<string, MiniYaml> allUnits)
{
while (node != null)
{
yield return node;
node = GetParent(node, allUnits);
}
}
static MiniYaml GetParent( MiniYaml node, Dictionary<string, MiniYaml> allUnits )
{
MiniYaml inherits;
@@ -40,8 +56,9 @@ namespace OpenRA
MiniYaml parent;
allUnits.TryGetValue( inherits.Value, out parent );
if( parent == null )
return null;
if (parent == null)
throw new InvalidOperationException(
"Bogus inheritance -- actor type {0} does not exist".F(inherits.Value));
return parent;
}
@@ -49,8 +66,14 @@ namespace OpenRA
static MiniYaml MergeWithParent( MiniYaml node, Dictionary<string, MiniYaml> allUnits )
{
var parent = GetParent( node, allUnits );
if( parent != null )
return MiniYaml.Merge( node, MergeWithParent( parent, allUnits ) );
if (parent != null)
{
var result = MiniYaml.MergeStrict(node, MergeWithParent(parent, allUnits));
// strip the '-'
result.Nodes.RemoveAll(a => a.Key.StartsWith("-"));
return result;
}
return node;
}
@@ -69,7 +92,7 @@ namespace OpenRA
while (t.Count != 0)
{
var prereqs = PrerequisitesOf(t[index]);
var unsatisfied = prereqs.Where(n => !ret.Any(x => x.GetType() == n || x.GetType().IsSubclassOf(n)));
var unsatisfied = prereqs.Where(n => !ret.Any(x => x.GetType() == n || n.IsAssignableFrom(x.GetType())));
if (!unsatisfied.Any())
{
ret.Add(t[index]);
@@ -91,7 +114,7 @@ namespace OpenRA
return info
.GetType()
.GetInterfaces()
.Where( t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof( ITraitPrerequisite<> ) )
.Where( t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof( Requires<> ) )
.Select( t => t.GetGenericArguments()[ 0 ] )
.ToList();
}

View File

@@ -16,14 +16,25 @@ namespace OpenRA.GameRules
{
public readonly string Filename = null;
public readonly string Title = null;
public readonly int Length = 0; // seconds
public readonly bool Exists = false;
public int Length { get; private set; } // seconds
public bool Exists { get; private set; }
public MusicInfo( string key, MiniYaml value )
{
Filename = key+".aud";
Title = value.Value;
var nd = value.NodesDict;
var ext = nd.ContainsKey("Extension") ? nd["Extension"].Value : "aud";
Filename = (nd.ContainsKey("Filename") ? nd["Filename"].Value : key)+"."+ext;
if (!FileSystem.Exists(Filename))
return;
Exists = true;
Length = (int)AudLoader.SoundLength(FileSystem.Open(Filename));
}
public void Reload()
{
if (!FileSystem.Exists(Filename))
return;

View File

@@ -44,9 +44,11 @@ namespace OpenRA
static Dictionary<string, T> LoadYamlRules<T>(string[] files, List<MiniYamlNode> dict, Func<MiniYamlNode, Dictionary<string, MiniYaml>, T> f)
{
var y = files.Select(a => MiniYaml.FromFile(a)).Aggregate(dict,MiniYaml.Merge);
var y = files.Select(a => MiniYaml.FromFile(a)).Aggregate(dict,MiniYaml.MergeLiberal);
var yy = y.ToDictionary( x => x.Key, x => x.Value );
return y.ToDictionary(kv => kv.Key.ToLowerInvariant(), kv => f(kv, yy));
}
public static IEnumerable<KeyValuePair<string,MusicInfo>> InstalledMusic { get { return Music.Where( m => m.Value.Exists ); } }
}
}

View File

@@ -27,23 +27,42 @@ namespace OpenRA.GameRules
public bool AdvertiseOnline = true;
public string MasterServer = "http://master.open-ra.org/";
public bool AllowCheats = false;
public string Map = null;
public ServerSettings() { }
public ServerSettings(ServerSettings other)
{
Name = other.Name;
ListenPort = other.ListenPort;
ExternalPort = other.ExternalPort;
AdvertiseOnline = other.AdvertiseOnline;
MasterServer = other.MasterServer;
AllowCheats = other.AllowCheats;
Map = other.Map;
}
}
public class DebugSettings
{
public bool BotDebug = false;
public bool PerfText = false;
public bool PerfGraph = false;
public float LongTickThreshold = 0.001f;
public bool SanityCheckUnsyncedCode = false;
public int Samples = 25;
}
public class GraphicSettings
{
public string Renderer = "Gl";
public WindowMode Mode = WindowMode.PseudoFullscreen;
public int2 FullscreenSize = new int2(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
public int2 FullscreenSize = new int2(0,0);
public int2 WindowedSize = new int2(1024, 768);
public readonly int2 MinResolution = new int2(800, 600);
public bool PixelDouble = false;
public int BatchSize = 8192;
public int NumTempBuffers = 8;
public int SheetSize = 2048;
}
public class SoundSettings
@@ -64,24 +83,25 @@ namespace OpenRA.GameRules
public string LastServer = "localhost:1234";
}
public enum MouseScrollType { Disabled, Standard, Inverted }
public class GameSettings
{
public string[] Mods = { "ra" };
public bool MatchTimer = true;
public bool ShellmapMusic = true;
// Chat settings
public bool TeamChatToggle = false;
// Behaviour settings
public bool ViewportEdgeScroll = true;
public bool InverseDragScroll = false;
public MouseScrollType MouseScroll = MouseScrollType.Standard;
public float ViewportEdgeScrollStep = 10f;
// Internal game settings
public int Timestep = 40;
public int SheetSize = 2048;
}
public class Settings
{
string SettingsFile;
@@ -92,7 +112,6 @@ namespace OpenRA.GameRules
public GraphicSettings Graphics = new GraphicSettings();
public ServerSettings Server = new ServerSettings();
public DebugSettings Debug = new DebugSettings();
public Dictionary<string, object> Sections;
public Settings(string file, Arguments args)
{
@@ -104,7 +123,7 @@ namespace OpenRA.GameRules
{"Sound", Sound},
{"Graphics", Graphics},
{"Server", Server},
{"Debug", Debug}
{"Debug", Debug},
};

View File

@@ -8,26 +8,26 @@
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using OpenRA.FileFormats;
using System;
namespace OpenRA.GameRules
{
public class VoiceInfo
{
public readonly Dictionary<string,string[]> Variants;
public readonly Dictionary<string,string[]> Voices;
[FieldLoader.Ignore] public readonly Dictionary<string,string[]> Variants;
[FieldLoader.Ignore] public readonly Dictionary<string,string[]> Voices;
public readonly string DefaultVariant = ".aud" ;
[FieldLoader.Load] public readonly string[] DisableVariants = { };
public readonly string[] DisableVariants = { };
static Dictionary<string, string[]> Load( MiniYaml y, string name )
{
return y.NodesDict.ContainsKey( name )
? y.NodesDict[ name ].NodesDict.ToDictionary(
a => a.Key,
a => (string[])FieldLoader.GetValue( "(value)", typeof( string[] ), a.Value.Value ) )
a => FieldLoader.GetValue<string[]>( "(value)", a.Value.Value ) )
: new Dictionary<string, string[]>();
}

View File

@@ -18,21 +18,21 @@ namespace OpenRA.GameRules
{
public class WarheadInfo
{
[FieldLoader.Load] public readonly int Spread = 1; // distance (in pixels) from the explosion center at which damage is 1/2.
public readonly int Spread = 1; // distance (in pixels) from the explosion center at which damage is 1/2.
[FieldLoader.LoadUsing( "LoadVersus" )]
public readonly Dictionary<string, float> Versus; // damage vs each armortype
[FieldLoader.Load] public readonly bool Ore = false; // can this damage ore?
[FieldLoader.Load] public readonly string Explosion = null; // explosion effect to use
[FieldLoader.Load] public readonly string WaterExplosion = null; // explosion effect on hitting water (usually a splash)
[FieldLoader.Load] public readonly string SmudgeType = null; // type of smudge to apply
[FieldLoader.Load] public readonly int[] Size = { 0, 0 }; // size of the explosion. provide 2 values for a ring effect (outer/inner)
[FieldLoader.Load] public readonly int InfDeath = 0; // infantry death animation to use
[FieldLoader.Load] public readonly string ImpactSound = null; // sound to play on impact
[FieldLoader.Load] public readonly string WaterImpactSound = null; // sound to play on impact with water
[FieldLoader.Load] public readonly int Damage = 0; // how much (raw) damage to deal
[FieldLoader.Load] public readonly int Delay = 0; // delay in ticks before dealing the damage. 0=instant (old model)
[FieldLoader.Load] public readonly DamageModel DamageModel = DamageModel.Normal; // which damage model to use
[FieldLoader.Load] public readonly bool PreventProne = false; // whether we should prevent prone response in infantry.
public readonly Dictionary<string, float> Versus; // damage vs each armortype
public readonly bool Ore = false; // can this damage ore?
public readonly string Explosion = null; // explosion effect to use
public readonly string WaterExplosion = null; // explosion effect on hitting water (usually a splash)
public readonly string SmudgeType = null; // type of smudge to apply
public readonly int[] Size = { 0, 0 }; // size of the explosion. provide 2 values for a ring effect (outer/inner)
public readonly int InfDeath = 0; // infantry death animation to use
public readonly string ImpactSound = null; // sound to play on impact
public readonly string WaterImpactSound = null; // sound to play on impact with water
public readonly int Damage = 0; // how much (raw) damage to deal
public readonly int Delay = 0; // delay in ticks before dealing the damage. 0=instant (old model)
public readonly DamageModel DamageModel = DamageModel.Normal; // which damage model to use
public readonly bool PreventProne = false; // whether we should prevent prone response in infantry.
public float EffectivenessAgainst(Actor self)
{
@@ -55,7 +55,7 @@ namespace OpenRA.GameRules
return y.NodesDict.ContainsKey( "Versus" )
? y.NodesDict[ "Versus" ].NodesDict.ToDictionary(
a => a.Key,
a => (float)FieldLoader.GetValue( "(value)", typeof( float ), a.Value.Value ) )
a => FieldLoader.GetValue<float>( "(value)", a.Value.Value ) )
: new Dictionary<string, float>();
}
}
@@ -85,15 +85,15 @@ namespace OpenRA.GameRules
public class WeaponInfo
{
[FieldLoader.Load] public readonly float Range = 0;
[FieldLoader.Load] public readonly string Report = null;
[FieldLoader.Load] public readonly int ROF = 1;
[FieldLoader.Load] public readonly int Burst = 1;
[FieldLoader.Load] public readonly bool Charges = false;
[FieldLoader.Load] public readonly bool Underwater = false;
[FieldLoader.Load] public readonly string[] ValidTargets = { "Ground" };
[FieldLoader.Load] public readonly int BurstDelay = 5;
[FieldLoader.Load] public readonly float MinRange = 0;
public readonly float Range = 0;
public readonly string Report = null;
public readonly int ROF = 1;
public readonly int Burst = 1;
public readonly bool Charges = false;
public readonly bool Underwater = false;
public readonly string[] ValidTargets = { "Ground" };
public readonly int BurstDelay = 5;
public readonly float MinRange = 0;
[FieldLoader.LoadUsing( "LoadProjectile" )] public IProjectileInfo Projectile;
[FieldLoader.LoadUsing( "LoadWarheads" )] public List<WarheadInfo> Warheads;

View File

@@ -53,15 +53,15 @@ namespace OpenRA.Graphics
public void PlayRepeating( string sequenceName )
{
backwards = false;
tickAlways = false;
CurrentSequence = SequenceProvider.GetSequence(name, sequenceName);
frame = 0;
tickFunc = () =>
{
++frame;
if (frame >= CurrentSequence.Length)
frame = 0;
backwards = false;
tickAlways = false;
CurrentSequence = SequenceProvider.GetSequence(name, sequenceName);
frame = 0;
tickFunc = () =>
{
++frame;
if (frame >= CurrentSequence.Length)
frame = 0;
};
}

View File

@@ -0,0 +1,51 @@
#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 OpenRA.Traits;
namespace OpenRA.Graphics
{
public class AnimationWithOffset
{
public Animation Animation;
public Func<float2> OffsetFunc;
public Func<bool> DisableFunc;
public int ZOffset;
public AnimationWithOffset(Animation a)
: this(a, null, null)
{
}
public AnimationWithOffset(Animation a, Func<float2> o, Func<bool> d)
{
this.Animation = a;
this.OffsetFunc = o;
this.DisableFunc = d;
}
public Renderable Image(Actor self, string pal)
{
var p = self.CenterLocation;
var loc = p - 0.5f * Animation.Image.size
+ (OffsetFunc != null ? OffsetFunc() : float2.Zero);
var r = new Renderable(Animation.Image, loc, pal, p.Y);
return ZOffset != 0 ? r.WithZOffset(ZOffset) : r;
}
public static implicit operator AnimationWithOffset(Animation a)
{
return new AnimationWithOffset(a);
}
}
}

View File

@@ -36,7 +36,7 @@ namespace OpenRA.Graphics
if (chromeFiles.Length == 0)
return;
var chrome = chromeFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.Merge);
var chrome = chromeFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal);
foreach (var c in chrome)
LoadCollection(c.Key, c.Value);

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Graphics
public static void Initialize(string[] sequenceFiles)
{
cursors = new Dictionary<string, CursorSequence>();
var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.Merge));
var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal));
foreach (var s in sequences.NodesDict["Palettes"].Nodes)
Game.modData.Palette.AddPalette(s.Key, new Palette(FileSystem.Open(s.Value.Value), false));

View File

@@ -28,7 +28,7 @@ namespace OpenRA.Graphics
public CursorSequence(string cursorSrc, string palette, MiniYaml info)
{
sprites = Game.modData.CursorSheetBuilder.LoadAllSprites(cursorSrc);
sprites = Game.modData.SpriteLoader.LoadAllSprites(cursorSrc);
var d = info.NodesDict;
start = int.Parse(d["start"].Value);

View File

@@ -1,45 +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.Linq;
using OpenRA.FileFormats;
namespace OpenRA.Graphics
{
public class CursorSheetBuilder
{
ModData modData;
Cache<string, Sprite[]> cursors;
readonly string[] exts = { ".shp" };
public CursorSheetBuilder( ModData modData )
{
this.modData = modData;
this.cursors = new Cache<string, Sprite[]>( LoadCursors );
}
Sprite[] LoadCursors(string filename)
{
try
{
var shp = new Dune2ShpReader(FileSystem.OpenWithExts(filename, exts));
return shp.Select(a => modData.SheetBuilder.Add(a.Image, a.Size)).ToArray();
}
catch (IndexOutOfRangeException) // This will occur when loading a custom (RA-format) .shp
{
var shp = new ShpReader(FileSystem.OpenWithExts(filename, exts));
return shp.Select(a => modData.SheetBuilder.Add(a.Image, shp.Size)).ToArray();
}
}
public Sprite[] LoadAllSprites(string filename) { return cursors[filename]; }
}
}

View File

@@ -19,7 +19,7 @@ namespace OpenRA.Graphics
{
public class HardwarePalette
{
public const int MaxPalettes = 64;
public const int MaxPalettes = 256;
int allocated = 0;
ITexture texture;
@@ -56,8 +56,8 @@ namespace OpenRA.Graphics
palettes.Add(name, p);
indices.Add(name, allocated++);
}
}
uint[,] data = new uint[MaxPalettes, 256];
public void Update(IEnumerable<IPaletteModifier> paletteMods)
{

View File

@@ -15,63 +15,67 @@ namespace OpenRA.Graphics
{
public class LineRenderer : Renderer.IBatchRenderer
{
public float LineWidth = 1f;
static float2 offset = new float2(0.5f,0.5f);
Renderer renderer;
IShader shader;
Vertex[] vertices = new Vertex[ Renderer.TempBufferSize ];
uint[] indices = new uint[ Renderer.TempBufferSize ];
int nv = 0, ni = 0;
int nv = 0;
public LineRenderer( Renderer renderer )
public LineRenderer( Renderer renderer, IShader shader )
{
this.renderer = renderer;
this.shader = shader;
}
public void Flush()
{
if( ni > 0 )
if( nv > 0 )
{
renderer.LineShader.Render( () =>
shader.Render( () =>
{
var vb = renderer.GetTempVertexBuffer();
var ib = renderer.GetTempIndexBuffer();
vb.SetData( vertices, nv );
ib.SetData( indices, ni );
renderer.DrawBatch( vb, ib,
nv, ni / 2, PrimitiveType.LineList );
renderer.SetLineWidth(LineWidth);
renderer.DrawBatch( vb, 0, nv, PrimitiveType.LineList );
} );
nv = 0; ni = 0;
nv = 0;
}
}
public void DrawRect( float2 tl, float2 br, Color c )
{
var tr = new float2( br.X, tl.Y );
var bl = new float2( tl.X, br.Y );
DrawLine( tl, tr, c, c );
DrawLine( tl, bl, c, c );
DrawLine( tr, br, c, c );
DrawLine( bl, br, c, c );
}
public void DrawLine( float2 start, float2 end, Color startColor, Color endColor )
{
Renderer.CurrentBatchRenderer = this;
if( ni + 2 > Renderer.TempBufferSize )
Flush();
if( nv + 2 > Renderer.TempBufferSize )
Flush();
indices[ ni++ ] = (ushort)nv;
vertices[ nv++ ] = new Vertex( start + offset,
new float2( startColor.R / 255.0f, startColor.G / 255.0f ),
new float2( startColor.B / 255.0f, startColor.A / 255.0f ) );
vertices[ nv++ ] = new Vertex( start,
new float2( startColor.R / 255.0f, startColor.G / 255.0f ),
new float2( startColor.B / 255.0f, startColor.A / 255.0f ) );
indices[ ni++ ] = (ushort)nv;
vertices[ nv++ ] = new Vertex( end,
new float2( endColor.R / 255.0f, endColor.G / 255.0f ),
new float2( endColor.B / 255.0f, endColor.A / 255.0f ) );
vertices[ nv++ ] = new Vertex( end + offset,
new float2( endColor.R / 255.0f, endColor.G / 255.0f ),
new float2( endColor.B / 255.0f, endColor.A / 255.0f ) );
}
public void FillRect( RectangleF r, Color color )
{
for (float y = r.Top; y < r.Bottom; y++)
{
DrawLine(new float2(r.Left, y), new float2(r.Right, y), color, color);
}
}
}
}

View File

@@ -11,10 +11,10 @@
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Traits;
using System.IO;
namespace OpenRA.Graphics
{
@@ -33,10 +33,10 @@ namespace OpenRA.Graphics
if (!actualSize)
{
width = height = Util.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
width = height = Exts.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
}
Bitmap terrain = new Bitmap(width, height);
var terrain = new Bitmap(width, height);
var bitmapData = terrain.LockBits(new Rectangle(0, 0, terrain.Width, terrain.Height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
@@ -57,10 +57,11 @@ namespace OpenRA.Graphics
*(c + (y * bitmapData.Stride >> 2) + x) = tileset.Terrain[type].Color.ToArgb();
}
}
terrain.UnlockBits(bitmapData);
return terrain;
}
// Add the static resources defined in the map; if the map lives
// in a world use AddCustomTerrain instead
public static Bitmap AddStaticResources(Map map, Bitmap terrainBitmap)
@@ -92,6 +93,7 @@ namespace OpenRA.Graphics
*(c + (y * bitmapData.Stride >> 2) + x) = tileset.Terrain[res].Color.ToArgb();
}
}
terrain.UnlockBits(bitmapData);
return terrain;
@@ -100,8 +102,8 @@ namespace OpenRA.Graphics
public static Bitmap CustomTerrainBitmap(World world)
{
var map = world.Map;
var size = Util.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
Bitmap bitmap = new Bitmap(size, size);
var size = Exts.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
var bitmap = new Bitmap(size, size);
var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
@@ -120,6 +122,7 @@ namespace OpenRA.Graphics
*(c + (y * bitmapData.Stride >> 2) + x) = world.TileSet.Terrain[custom].Color.ToArgb();
}
}
bitmap.UnlockBits(bitmapData);
return bitmap;
}
@@ -127,8 +130,8 @@ namespace OpenRA.Graphics
public static Bitmap ActorsBitmap(World world)
{
var map = world.Map;
var size = Util.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
Bitmap bitmap = new Bitmap(size, size);
var size = Exts.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
var bitmap = new Bitmap(size, size);
var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
@@ -136,7 +139,7 @@ namespace OpenRA.Graphics
{
int* c = (int*)bitmapData.Scan0;
foreach (var t in world.Queries.WithTrait<IRadarSignature>())
foreach (var t in world.ActorsWithTrait<IRadarSignature>())
{
if (!world.LocalShroud.IsVisible(t.Actor))
continue;
@@ -155,8 +158,8 @@ namespace OpenRA.Graphics
public static Bitmap ShroudBitmap(World world)
{
var map = world.Map;
var size = Util.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
Bitmap bitmap = new Bitmap(size, size);
var size = Exts.NextPowerOf2(Math.Max(map.Bounds.Width, map.Bounds.Height));
var bitmap = new Bitmap(size, size);
if (world.LocalShroud.Disabled)
return bitmap;

View File

@@ -12,8 +12,10 @@ using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
using OpenRA.FileFormats;
using OpenRA.FileFormats.Graphics;
using OpenRA.Support;
@@ -22,102 +24,92 @@ namespace OpenRA.Graphics
public class Renderer
{
internal static int SheetSize;
internal IShader SpriteShader { get; private set; } /* note: shared shader params */
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 WorldSpriteShader { get; private set; }
internal IShader SpriteShader { get; private set; }
public SpriteRenderer SpriteRenderer { get; private set; }
public SpriteRenderer RgbaSpriteRenderer { get; private set; }
public SpriteRenderer WorldSpriteRenderer { 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;
public readonly SpriteFont RegularFont, BoldFont, TitleFont, TinyFont;
internal const int TempBufferSize = 8192;
const int TempBufferCount = 8;
Queue<IVertexBuffer<Vertex>> tempBuffersV = new Queue<IVertexBuffer<Vertex>>();
Queue<IIndexBuffer> tempBuffersI = new Queue<IIndexBuffer>();
Queue<IVertexBuffer<Vertex>> tempBuffers = new Queue<IVertexBuffer<Vertex>>();
public Dictionary<string, SpriteFont> Fonts;
public Renderer()
{
SpriteShader = device.CreateShader("world-shp");
LineShader = device.CreateShader("world-line");
TempBufferSize = Game.Settings.Graphics.BatchSize;
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");
WorldSpriteShader = device.CreateShader("chrome-shp");
SpriteShader = device.CreateShader("chrome-shp");
SpriteRenderer = new SpriteRenderer( this, SpriteShader );
RgbaSpriteRenderer = new SpriteRenderer( this, RgbaSpriteShader );
WorldSpriteRenderer = new SpriteRenderer( this, WorldSpriteShader );
LineRenderer = new LineRenderer(this);
RegularFont = new SpriteFont("FreeSans.ttf", 14);
BoldFont = new SpriteFont("FreeSansBold.ttf", 14);
TitleFont = new SpriteFont("titles.ttf", 48);
TinyFont = new SpriteFont("FreeSans.ttf", 10);
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++ )
{
tempBuffersV.Enqueue( device.CreateVertexBuffer( TempBufferSize ) );
tempBuffersI.Enqueue( device.CreateIndexBuffer( TempBufferSize ) );
}
tempBuffers.Enqueue( device.CreateVertexBuffer( TempBufferSize ) );
}
public void InitializeFonts(Manifest m)
{
Fonts = m.Fonts.ToDictionary(x => x.Key, x => new SpriteFont(x.Value.First, x.Value.Second));
}
internal IGraphicsDevice Device { get { return device; } }
public void BeginFrame(float2 scroll)
public void BeginFrame(float2 scroll, float zoom)
{
device.Clear(Color.Black);
device.Clear();
WorldLineRenderer.LineWidth = zoom;
float2 r1 = new float2(2f/Resolution.Width, -2f/Resolution.Height);
float2 r2 = new float2(-1, 1);
var zr1 = zoom*r1;
SetShaderParams( SpriteShader, r1, r2, scroll );
SetShaderParams( WorldSpriteShader, zr1, r2, scroll );
SetShaderParams( WorldLineShader, zr1, r2, scroll );
SetShaderParams( LineShader, r1, r2, scroll );
SetShaderParams( RgbaSpriteShader, r1, r2, scroll );
SetShaderParams( WorldSpriteShader, r1, r2, scroll );
SetShaderParams( SpriteShader, r1, r2, scroll );
}
private void SetShaderParams( IShader s, float2 r1, float2 r2, float2 scroll )
void SetShaderParams( IShader s, float2 r1, float2 r2, float2 scroll )
{
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 );
s.Commit();
}
public void EndFrame( IInputHandler inputHandler )
{
Flush();
device.Present( inputHandler );
device.PumpInput(inputHandler);
device.Present();
}
public void DrawBatch<T>(IVertexBuffer<T> vertices, IIndexBuffer indices,
Range<int> vertexRange, Range<int> indexRange, PrimitiveType type, IShader shader)
public void DrawBatch<T>(IVertexBuffer<T> vertices,
int firstVertex, int numVertices, PrimitiveType type)
where T : struct
{
vertices.Bind();
indices.Bind();
device.DrawIndexedPrimitives(type, vertexRange, indexRange);
PerfHistory.Increment("batches", 1);
}
public void DrawBatch<T>(IVertexBuffer<T> vertices, IIndexBuffer indices,
int vertexPool, int numPrimitives, PrimitiveType type)
where T : struct
{
vertices.Bind();
indices.Bind();
device.DrawIndexedPrimitives(type, vertexPool, numPrimitives);
device.DrawPrimitives(type, firstVertex, numVertices);
PerfHistory.Increment("batches", 1);
}
@@ -126,59 +118,56 @@ namespace OpenRA.Graphics
CurrentBatchRenderer = null;
}
public void SetLineWidth(float width)
{
device.SetLineWidth(width);
}
static IGraphicsDevice device;
public static Size Resolution { get { return device.WindowSize; } }
internal static void Initialize( OpenRA.FileFormats.Graphics.WindowMode windowMode )
// Work around a bug in OSX 10.6.8 / mono 2.10.2 / SDL 1.2.14
// which makes the window non-interactive in Windowed/Pseudofullscreen mode.
static Screen FixOSX() { return Screen.PrimaryScreen; }
internal static void Initialize( WindowMode windowMode )
{
if (Platform.CurrentPlatform == PlatformType.OSX)
FixOSX();
var resolution = GetResolution( windowMode );
device = CreateDevice( Assembly.LoadFile( Path.GetFullPath( "OpenRA.Renderer.{0}.dll".F(Game.Settings.Graphics.Renderer) ) ), resolution.Width, resolution.Height, windowMode, false );
var rendererPath = Path.GetFullPath( "OpenRA.Renderer.{0}.dll".F(Game.Settings.Graphics.Renderer) );
device = CreateDevice( Assembly.LoadFile( rendererPath ), resolution.Width, resolution.Height, windowMode );
}
static Size GetResolution(WindowMode windowmode)
{
var desktopResolution = Screen.PrimaryScreen.Bounds.Size;
var customSize = (windowmode == WindowMode.Windowed) ? Game.Settings.Graphics.WindowedSize : Game.Settings.Graphics.FullscreenSize;
if (customSize.X > 0 && customSize.Y > 0)
{
desktopResolution.Width = customSize.X;
desktopResolution.Height = customSize.Y;
}
return new Size(
desktopResolution.Width,
desktopResolution.Height);
var size = (windowmode == WindowMode.Windowed)
? Game.Settings.Graphics.WindowedSize
: Game.Settings.Graphics.FullscreenSize;
return new Size(size.X, size.Y);
}
static IGraphicsDevice CreateDevice( Assembly rendererDll, int width, int height, WindowMode window, bool vsync )
static IGraphicsDevice CreateDevice( Assembly rendererDll, int width, int height, WindowMode window )
{
foreach( RendererAttribute r in rendererDll.GetCustomAttributes( typeof( RendererAttribute ), false ) )
{
return (IGraphicsDevice)r.Type.GetConstructor( new Type[] { typeof( int ), typeof( int ), typeof( WindowMode ), typeof( bool ) } )
.Invoke( new object[] { width, height, window, vsync } );
var factory = (IDeviceFactory) r.Type.GetConstructor( Type.EmptyTypes ).Invoke( null );
return factory.Create( new Size( width, height ), window );
}
throw new NotImplementedException();
throw new InvalidOperationException("Renderer DLL is missing RendererAttribute to tell us what type to use!");
}
internal IVertexBuffer<Vertex> GetTempVertexBuffer()
{
var ret = tempBuffersV.Dequeue();
tempBuffersV.Enqueue( ret );
var ret = tempBuffers.Dequeue();
tempBuffers.Enqueue( ret );
return ret;
}
internal IIndexBuffer GetTempIndexBuffer()
{
var ret = tempBuffersI.Dequeue();
tempBuffersI.Enqueue( ret );
return ret;
}
public interface IBatchRenderer
{
void Flush();
}
public interface IBatchRenderer { void Flush(); }
static IBatchRenderer currentBatchRenderer;
public static IBatchRenderer CurrentBatchRenderer

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Graphics
if (sequenceFiles.Length == 0)
return;
var sequences = sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(sequenceNodes, MiniYaml.Merge);
var sequences = sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(sequenceNodes, MiniYaml.MergeLiberal);
foreach (var s in sequences)
LoadSequencesForUnit(s.Key, s.Value);

View File

@@ -52,22 +52,22 @@ namespace OpenRA.Graphics
public void DrawAt( WorldRenderer wr, float2 location, string palette )
{
Game.Renderer.SpriteRenderer.DrawSprite( this, location, wr, palette, this.size );
Game.Renderer.WorldSpriteRenderer.DrawSprite( this, location, wr, palette, this.size );
}
public void DrawAt( float2 location, int paletteIndex )
{
Game.Renderer.SpriteRenderer.DrawSprite( this, location, paletteIndex, this.size );
Game.Renderer.WorldSpriteRenderer.DrawSprite( this, location, paletteIndex, this.size );
}
public void DrawAt(float2 location, int paletteIndex, float scale)
{
Game.Renderer.SpriteRenderer.DrawSprite(this, location, paletteIndex, this.size * scale);
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, paletteIndex, this.size * scale);
}
public void DrawAt( float2 location, int paletteIndex, float2 size )
{
Game.Renderer.SpriteRenderer.DrawSprite( this, location, paletteIndex, size );
Game.Renderer.WorldSpriteRenderer.DrawSprite( this, location, paletteIndex, size );
}
}

View File

@@ -18,9 +18,8 @@ namespace OpenRA.Graphics
IShader shader;
Vertex[] vertices = new Vertex[Renderer.TempBufferSize];
uint[] indices = new uint[Renderer.TempBufferSize];
Sheet currentSheet = null;
int nv = 0, ni = 0;
int nv = 0;
public SpriteRenderer(Renderer renderer, IShader shader)
{
@@ -33,23 +32,17 @@ namespace OpenRA.Graphics
public void Flush()
{
if (ni > 0)
if (nv > 0)
{
shader.SetValue( "DiffuseTexture", currentSheet.Texture );
shader.Render(() =>
{
var vb = renderer.GetTempVertexBuffer();
var ib = renderer.GetTempIndexBuffer();
vb.SetData(vertices, nv);
ib.SetData(indices, ni);
renderer.DrawBatch(vb, ib,
new Range<int>(0, nv),
new Range<int>(0, ni),
PrimitiveType.TriangleList,
shader);
renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList);
});
nv = 0; ni = 0;
nv = 0;
currentSheet = null;
}
}
@@ -73,12 +66,10 @@ namespace OpenRA.Graphics
if( nv + 4 > Renderer.TempBufferSize )
Flush();
if( ni + 6 > Renderer.TempBufferSize )
Flush();
currentSheet = s.sheet;
Util.FastCreateQuad(vertices, indices, location.ToInt2(), s, paletteIndex, nv, ni, size);
nv += 4; ni += 6;
Util.FastCreateQuad(vertices, location.ToInt2(), s, paletteIndex, nv, size);
nv += 4;
}

View File

@@ -19,7 +19,6 @@ namespace OpenRA.Graphics
class TerrainRenderer
{
IVertexBuffer<Vertex> vertexBuffer;
IIndexBuffer indexBuffer;
Sheet terrainSheet;
World world;
@@ -30,27 +29,25 @@ namespace OpenRA.Graphics
this.world = world;
this.map = world.Map;
Size tileSize = new Size( Game.CellSize, Game.CellSize );
var tileSize = new Size( Game.CellSize, Game.CellSize );
var tileMapping = new Cache<TileReference<ushort,byte>, Sprite>(
x => Game.modData.SheetBuilder.Add(world.TileSet.GetBytes(x), tileSize));
Vertex[] vertices = new Vertex[4 * map.Bounds.Height * map.Bounds.Width];
uint[] indices = new uint[6 * map.Bounds.Height * map.Bounds.Width];
var vertices = new Vertex[4 * map.Bounds.Height * map.Bounds.Width];
terrainSheet = tileMapping[map.MapTiles.Value[map.Bounds.Left, map.Bounds.Top]].sheet;
int nv = 0;
int ni = 0;
var terrainPalette = Game.modData.Palette.GetPaletteIndex("terrain");
for( int j = map.Bounds.Top; j < map.Bounds.Bottom; j++ )
for( int i = map.Bounds.Left; i < map.Bounds.Right; i++ )
{
Sprite tile = tileMapping[map.MapTiles.Value[i, j]];
// TODO: The zero below should explicitly refer to the terrain palette, but this code is called
// before the palettes are created. Therefore assumes that "terrain" is the first palette to be defined
Util.FastCreateQuad(vertices, indices, Game.CellSize * new float2(i, j), tile, Game.modData.Palette.GetPaletteIndex("terrain"), nv, ni, tile.size);
var tile = tileMapping[map.MapTiles.Value[i, j]];
// TODO: move GetPaletteIndex out of the inner loop.
Util.FastCreateQuad(vertices, Game.CellSize * new float2(i, j), tile, terrainPalette, nv, tile.size);
nv += 4;
ni += 6;
if (tileMapping[map.MapTiles.Value[i, j]].sheet != terrainSheet)
throw new InvalidOperationException("Terrain sprites span multiple sheets");
@@ -58,17 +55,13 @@ namespace OpenRA.Graphics
vertexBuffer = Game.Renderer.Device.CreateVertexBuffer( vertices.Length );
vertexBuffer.SetData( vertices, nv );
indexBuffer = Game.Renderer.Device.CreateIndexBuffer( indices.Length );
indexBuffer.SetData( indices, ni );
}
public void Draw( WorldRenderer wr, Viewport viewport )
{
int indicesPerRow = map.Bounds.Width * 6;
int verticesPerRow = map.Bounds.Width * 4;
int visibleRows = (int)(viewport.Height * 1f / Game.CellSize + 2);
int visibleRows = (int)(viewport.Height * 1f / Game.CellSize / viewport.Zoom + 2);
int firstRow = (int)(viewport.Location.Y * 1f / Game.CellSize - map.Bounds.Top);
int lastRow = firstRow + visibleRows;
@@ -91,12 +84,11 @@ namespace OpenRA.Graphics
if( lastRow < firstRow ) lastRow = firstRow;
Game.Renderer.SpriteShader.SetValue( "DiffuseTexture", terrainSheet.Texture );
Game.Renderer.SpriteShader.Render(() =>
Game.Renderer.DrawBatch(vertexBuffer, indexBuffer,
new Range<int>(verticesPerRow * firstRow, verticesPerRow * lastRow),
new Range<int>(indicesPerRow * firstRow, indicesPerRow * lastRow),
PrimitiveType.TriangleList, Game.Renderer.SpriteShader));
Game.Renderer.WorldSpriteShader.SetValue( "DiffuseTexture", terrainSheet.Texture );
Game.Renderer.WorldSpriteShader.Render(() =>
Game.Renderer.DrawBatch(vertexBuffer,
verticesPerRow * firstRow, verticesPerRow * (lastRow - firstRow),
PrimitiveType.QuadList));
foreach (var r in world.WorldActor.TraitsImplementing<IRenderOverlay>())
r.Render( wr );

View File

@@ -44,7 +44,7 @@ namespace OpenRA.Graphics
static float[] channelSelect = { 0.75f, 0.25f, -0.25f, -0.75f };
public static void FastCreateQuad(Vertex[] vertices, uint[] indices, float2 o, Sprite r, int palette, int nv, int ni, float2 size)
public static void FastCreateQuad(Vertex[] vertices, float2 o, Sprite r, int palette, int nv, float2 size)
{
var attrib = new float2(palette / (float)HardwarePalette.MaxPalettes, channelSelect[(int)r.channel]);
@@ -52,23 +52,18 @@ namespace OpenRA.Graphics
r.FastMapTextureCoords(0), attrib);
vertices[nv + 1] = new Vertex(new float2(o.X + size.X, o.Y),
r.FastMapTextureCoords(1), attrib);
vertices[nv + 2] = new Vertex(new float2(o.X, o.Y + size.Y),
vertices[nv + 2] = new Vertex(new float2(o.X + size.X, o.Y + size.Y),
r.FastMapTextureCoords(3), attrib);
vertices[nv + 3] = new Vertex(new float2(o.X, o.Y + size.Y),
r.FastMapTextureCoords(2), attrib);
vertices[nv + 3] = new Vertex(new float2(o.X + size.X, o.Y + size.Y),
r.FastMapTextureCoords(3), attrib);
indices[ni] = (uint)(nv);
indices[ni + 1] = indices[ni + 3] = (uint)(nv + 1);
indices[ni + 2] = indices[ni + 5] = (uint)(nv + 2);
indices[ni + 4] = (uint)(nv + 3);
}
}
static readonly int[] channelMasks = { 2, 1, 0, 3 }; // yes, our channel order is nuts.
public static void FastCopyIntoChannel(Sprite dest, byte[] src)
{
var data = dest.sheet.Data;
var srcStride = dest.bounds.Width;
var destStride = dest.sheet.Size.Width * 4;
var destStride = dest.sheet.Size.Width * 4;
var destOffset = destStride * dest.bounds.Top + dest.bounds.Left * 4 + channelMasks[(int)dest.channel];
var destSkip = destStride - 4 * srcStride;
var height = dest.bounds.Height;
@@ -107,16 +102,5 @@ namespace OpenRA.Graphics
{
return (int)((1 - t) * a + t * b);
}
public static int NextPowerOf2(int v)
{
--v;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
++v;
return v;
}
}
}

View File

@@ -8,25 +8,76 @@
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.Widgets;
using OpenRA.Support;
namespace OpenRA.Graphics
{
[Flags]
public enum ScrollDirection
{
None = 0,
Up = 1,
Left = 2,
Down = 4,
Right = 8
}
public class Viewport
{
readonly int2 screenSize;
int2 scrollPosition;
readonly Renderer renderer;
readonly Rectangle adjustedMapBounds;
readonly Rectangle mapBounds;
Rectangle scrollLimits;
int2 scrollPosition;
// Top-left of the viewport, in world-px units
public float2 Location { get { return scrollPosition; } }
public float2 CenterLocation { get { return scrollPosition + 0.5f/Zoom*screenSize.ToFloat2(); } }
public Rectangle WorldRect
{
get
{
return new Rectangle(scrollPosition.X / Game.CellSize,
scrollPosition.Y / Game.CellSize,
(int)(screenSize.X / Zoom / Game.CellSize),
(int)(screenSize.Y / Zoom / Game.CellSize));
}
}
public int Width { get { return screenSize.X; } }
public int Height { get { return screenSize.Y; } }
float zoom = 1f;
public float Zoom
{
get
{
return zoom;
}
set
{
var oldCenter = CenterLocation;
zoom = value;
// Update scroll limits
var viewTL = (Game.CellSize*new float2(mapBounds.Left, mapBounds.Top)).ToInt2();
var viewBR = (Game.CellSize*new float2(mapBounds.Right, mapBounds.Bottom)).ToInt2();
var border = (.5f/Zoom * screenSize.ToFloat2()).ToInt2();
scrollLimits = Rectangle.FromLTRB(viewTL.X - border.X,
viewTL.Y - border.Y,
viewBR.X - border.X,
viewBR.Y - border.Y);
// Re-center viewport
scrollPosition = NormalizeScrollPosition((oldCenter - 0.5f / Zoom * screenSize.ToFloat2()).ToInt2());
}
}
float cursorFrame = 0f;
public static int TicksSinceLastMove = 0;
@@ -34,85 +85,89 @@ namespace OpenRA.Graphics
public void Scroll(float2 delta)
{
this.Scroll(delta, false);
Scroll(delta, false);
}
public void Scroll(float2 delta, bool ignoreBorders)
{
var d = delta.ToInt2();
// Convert from world-px to viewport-px
var d = (1f/Zoom*delta).ToInt2();
var newScrollPosition = scrollPosition + d;
if(!ignoreBorders)
newScrollPosition = this.NormalizeScrollPosition(newScrollPosition);
newScrollPosition = NormalizeScrollPosition(newScrollPosition);
scrollPosition = newScrollPosition;
}
private int2 NormalizeScrollPosition(int2 newScrollPosition)
int2 NormalizeScrollPosition(int2 newScrollPosition)
{
return newScrollPosition.Clamp(adjustedMapBounds);
return newScrollPosition.Clamp(scrollLimits);
}
public ScrollDirection GetBlockedDirections()
{
ScrollDirection blockedDirections = ScrollDirection.None;
if(scrollPosition.Y <= adjustedMapBounds.Top)
blockedDirections = blockedDirections.Set(ScrollDirection.Up, true);
if(scrollPosition.X <= adjustedMapBounds.Left)
blockedDirections = blockedDirections.Set(ScrollDirection.Left, true);
if(scrollPosition.Y >= adjustedMapBounds.Bottom)
blockedDirections = blockedDirections.Set(ScrollDirection.Down, true);
if(scrollPosition.X >= adjustedMapBounds.Right)
blockedDirections = blockedDirections.Set(ScrollDirection.Right, true);
return blockedDirections;
var ret = ScrollDirection.None;
if(scrollPosition.Y <= scrollLimits.Top) ret |= ScrollDirection.Up;
if(scrollPosition.X <= scrollLimits.Left) ret |= ScrollDirection.Left;
if(scrollPosition.Y >= scrollLimits.Bottom) ret |= ScrollDirection.Down;
if(scrollPosition.X >= scrollLimits.Right) ret |= ScrollDirection.Right;
return ret;
}
public Viewport(int2 screenSize, Rectangle mapBounds, Renderer renderer)
{
this.screenSize = screenSize;
this.renderer = renderer;
this.adjustedMapBounds = new Rectangle(Game.CellSize*mapBounds.X - screenSize.X/2,
Game.CellSize*mapBounds.Y - screenSize.Y/2,
Game.CellSize*mapBounds.Width,
Game.CellSize*mapBounds.Height);
this.scrollPosition = new int2(adjustedMapBounds.Location) + new int2(adjustedMapBounds.Size)/2;
this.mapBounds = mapBounds;
Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1;
scrollPosition = new int2(scrollLimits.Location) + new int2(scrollLimits.Size)/2;
}
public void DrawRegions( WorldRenderer wr, IInputHandler inputHandler )
{
renderer.BeginFrame(scrollPosition);
renderer.BeginFrame(scrollPosition, Zoom);
if (wr != null)
wr.Draw();
Widget.DoDraw();
var cursorName = Widget.RootWidget.GetCursorOuter(Viewport.LastMousePos) ?? "default";
var cursorSequence = CursorProvider.GetCursorSequence(cursorName);
cursorSequence.GetSprite((int)cursorFrame).DrawAt(
Viewport.LastMousePos + Location - cursorSequence.Hotspot,
Game.modData.Palette.GetPaletteIndex(cursorSequence.Palette));
using( new PerfSample("render_widgets") )
{
Widget.DoDraw();
var cursorName = Widget.RootWidget.GetCursorOuter(Viewport.LastMousePos) ?? "default";
var cursorSequence = CursorProvider.GetCursorSequence(cursorName);
var cursorSprite = cursorSequence.GetSprite((int)cursorFrame);
renderer.EndFrame( inputHandler );
renderer.SpriteRenderer.DrawSprite(cursorSprite,
Viewport.LastMousePos - cursorSequence.Hotspot,
Game.modData.Palette.GetPaletteIndex(cursorSequence.Palette),
cursorSprite.size);
}
using( new PerfSample("render_flip") )
{
renderer.EndFrame( inputHandler );
}
}
public void Tick()
{
cursorFrame += 0.5f;
}
// Convert from viewport coords to cell coords (not px)
public float2 ViewToWorld(MouseInput mi) { return ViewToWorld(mi.Location); }
public float2 ViewToWorld(int2 loc)
{
return (1f / Game.CellSize) * (loc.ToFloat2() + Location);
}
public float2 ViewToWorld(MouseInput mi)
{
return ViewToWorld(mi.Location);
return (1f / Game.CellSize) * (1f/Zoom*loc.ToFloat2() + Location);
}
public int2 ViewToWorldPx(int2 loc) { return (1f/Zoom*loc.ToFloat2() + Location).ToInt2(); }
public int2 ViewToWorldPx(MouseInput mi) { return ViewToWorldPx(mi.Location); }
public void Center(float2 loc)
{
scrollPosition = this.NormalizeScrollPosition((Game.CellSize*loc - screenSize / 2).ToInt2());
scrollPosition = NormalizeScrollPosition((Game.CellSize*loc - 1f/(2*Zoom)*screenSize.ToFloat2()).ToInt2());
}
public void Center(IEnumerable<Actor> actors)
@@ -122,27 +177,26 @@ namespace OpenRA.Graphics
var avgPos = actors
.Select(a => a.CenterLocation)
.Aggregate((a, b) => a + b) / actors.Count();
scrollPosition = this.NormalizeScrollPosition((avgPos - screenSize / 2));
scrollPosition = NormalizeScrollPosition((avgPos - 1f/(2*Zoom)*screenSize.ToFloat2()).ToInt2());
}
// Rectangle (in viewport coords) that contains things to be drawn
public Rectangle ViewBounds(World world)
{
var r = WorldBounds(world);
var left = (int)(Game.CellSize * r.Left - Game.viewport.Location.X);
var top = (int)(Game.CellSize * r.Top - Game.viewport.Location.Y);
var right = left + (int)(Game.CellSize * r.Width);
var bottom = top + (int)(Game.CellSize * r.Height);
if (left < 0) left = 0;
if (top < 0) top = 0;
if (right > Game.viewport.Width) right = Game.viewport.Width;
if (bottom > Game.viewport.Height) bottom = Game.viewport.Height;
return new Rectangle(left, top, right - left, bottom - top);
var origin = Location.ToInt2();
var left = Math.Max(0, Game.CellSize * r.Left - origin.X)*Zoom;
var top = Math.Max(0, Game.CellSize * r.Top - origin.Y)*Zoom;
var right = Math.Min((Game.CellSize * r.Right - origin.X) * Zoom, Width);
var bottom = Math.Min((Game.CellSize * r.Bottom - origin.Y) * Zoom, Height);
return Rectangle.FromLTRB((int)left, (int)top, (int)right, (int)bottom);
}
int2 cachedScroll = new int2(int.MaxValue, int.MaxValue);
Rectangle cachedRect;
// Rectangle (in cell coords) of cells that are currently visible on the screen
public Rectangle WorldBounds(World world)
{
if (cachedScroll != scrollPosition)
@@ -150,6 +204,7 @@ namespace OpenRA.Graphics
int2 boundary = new int2(1,1); // Add a curtain of cells around the viewport to account for rounding errors
var tl = ViewToWorld(int2.Zero).ToInt2() - boundary;
var br = ViewToWorld(new int2(Width, Height)).ToInt2() + boundary;
cachedRect = Rectangle.Intersect(Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y), world.Map.Bounds);
cachedScroll = scrollPosition;
}
@@ -158,4 +213,17 @@ namespace OpenRA.Graphics
return (b.HasValue) ? Rectangle.Intersect(cachedRect, b.Value) : cachedRect;
}
}
public static class ViewportExts
{
public static bool Includes(this ScrollDirection d, ScrollDirection s)
{
return (d & s) == s;
}
public static ScrollDirection Set(this ScrollDirection d, ScrollDirection s, bool val)
{
return (d.Includes(s) != val) ? d ^ s : d;
}
}
}

View File

@@ -22,8 +22,6 @@ namespace OpenRA.Graphics
public readonly World world;
internal readonly TerrainRenderer terrainRenderer;
internal readonly ShroudRenderer shroudRenderer;
public readonly UiOverlay uiOverlay;
internal readonly HardwarePalette palette;
internal WorldRenderer(World world)
@@ -35,7 +33,6 @@ namespace OpenRA.Graphics
terrainRenderer = new TerrainRenderer(world, this);
shroudRenderer = new ShroudRenderer(world);
uiOverlay = new UiOverlay();
}
public int GetPaletteIndex(string name) { return palette.GetPaletteIndex(name); }
@@ -52,14 +49,12 @@ namespace OpenRA.Graphics
IEnumerable<Renderable> SpritesToRender()
{
var bounds = Game.viewport.ViewBounds(world);
var bounds = Game.viewport.WorldBounds(world);
var comparer = new SpriteComparer();
bounds.Offset((int)Game.viewport.Location.X, (int)Game.viewport.Location.Y);
var actors = world.FindUnits(
new float2(bounds.Left, bounds.Top),
new float2(bounds.Right, bounds.Bottom));
new int2(Game.CellSize*bounds.Left, Game.CellSize*bounds.Top),
new int2(Game.CellSize*bounds.Right, Game.CellSize*bounds.Bottom));
var renderables = actors.SelectMany(a => a.Render())
.OrderBy(r => r, comparer);
@@ -94,10 +89,9 @@ namespace OpenRA.Graphics
image.Sprite.DrawAt(image.Pos, this.GetPaletteIndex(image.Palette), image.Scale);
// added for contrails
foreach (var a in world.Actors)
if (!a.Destroyed)
foreach (var t in a.TraitsImplementing<IPostRender>())
t.RenderAfterWorld(this, a);
foreach (var a in world.ActorsWithTrait<IPostRender>())
if (!a.Actor.Destroyed)
a.Trait.RenderAfterWorld(this, a.Actor);
if (world.OrderGenerator != null)
world.OrderGenerator.RenderAfterWorld(this, world);
@@ -113,60 +107,52 @@ namespace OpenRA.Graphics
Game.Renderer.Flush();
}
void DrawBox(RectangleF r, Color color)
public void DrawSelectionBox(Actor selectedUnit, Color c)
{
var a = new float2(r.Left, r.Top);
var b = new float2(r.Right - a.X, 0);
var c = new float2(0, r.Bottom - a.Y);
Game.Renderer.LineRenderer.DrawLine(a, a + b, color, color);
Game.Renderer.LineRenderer.DrawLine(a + b, a + b + c, color, color);
Game.Renderer.LineRenderer.DrawLine(a + b + c, a + c, color, color);
Game.Renderer.LineRenderer.DrawLine(a, a + c, color, color);
}
public void DrawSelectionBox(Actor selectedUnit, Color c)
{
var bounds = selectedUnit.GetBounds(false);
var xy = new float2(bounds.Left, bounds.Top);
var Xy = new float2(bounds.Right, bounds.Top);
var xY = new float2(bounds.Left, bounds.Bottom);
var XY = new float2(bounds.Right, bounds.Bottom);
Game.Renderer.LineRenderer.DrawLine(xy, xy + new float2(4, 0), c, c);
Game.Renderer.LineRenderer.DrawLine(xy, xy + new float2(0, 4), c, c);
Game.Renderer.LineRenderer.DrawLine(Xy, Xy + new float2(-4, 0), c, c);
Game.Renderer.LineRenderer.DrawLine(Xy, Xy + new float2(0, 4), c, c);
Game.Renderer.LineRenderer.DrawLine(xY, xY + new float2(4, 0), c, c);
Game.Renderer.LineRenderer.DrawLine(xY, xY + new float2(0, -4), c, c);
Game.Renderer.LineRenderer.DrawLine(XY, XY + new float2(-4, 0), c, c);
Game.Renderer.LineRenderer.DrawLine(XY, XY + new float2(0, -4), c, c);
}
public void DrawRollover(Actor unit)
{
var selectable = unit.TraitOrDefault<Selectable>();
if (selectable != null)
selectable.DrawRollover(this, unit);
var bounds = selectedUnit.Bounds.Value;
var xy = new float2(bounds.Left, bounds.Top);
var Xy = new float2(bounds.Right, bounds.Top);
var xY = new float2(bounds.Left, bounds.Bottom);
var XY = new float2(bounds.Right, bounds.Bottom);
var wlr = Game.Renderer.WorldLineRenderer;
wlr.DrawLine(xy, xy + new float2(4, 0), c, c);
wlr.DrawLine(xy, xy + new float2(0, 4), c, c);
wlr.DrawLine(Xy, Xy + new float2(-4, 0), c, c);
wlr.DrawLine(Xy, Xy + new float2(0, 4), c, c);
wlr.DrawLine(xY, xY + new float2(4, 0), c, c);
wlr.DrawLine(xY, xY + new float2(0, -4), c, c);
wlr.DrawLine(XY, XY + new float2(-4, 0), c, c);
wlr.DrawLine(XY, XY + new float2(0, -4), c, c);
}
public void DrawRollover(Actor unit)
{
var selectable = unit.TraitOrDefault<Selectable>();
if (selectable != null)
selectable.DrawRollover(this, unit);
}
public void DrawLocus(Color c, int2[] cells)
{
var dict = cells.ToDictionary(a => a, a => 0);
var wlr = Game.Renderer.WorldLineRenderer;
foreach (var t in dict.Keys)
{
if (!dict.ContainsKey(t + new int2(-1, 0)))
Game.Renderer.LineRenderer.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(0, 1)),
wlr.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(0, 1)),
c, c);
if (!dict.ContainsKey(t + new int2(1, 0)))
Game.Renderer.LineRenderer.DrawLine(Game.CellSize * (t + new int2(1, 0)), Game.CellSize * (t + new int2(1, 1)),
wlr.DrawLine(Game.CellSize * (t + new int2(1, 0)), Game.CellSize * (t + new int2(1, 1)),
c, c);
if (!dict.ContainsKey(t + new int2(0, -1)))
Game.Renderer.LineRenderer.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(1, 0)),
wlr.DrawLine(Game.CellSize * t, Game.CellSize * (t + new int2(1, 0)),
c, c);
if (!dict.ContainsKey(t + new int2(0, 1)))
Game.Renderer.LineRenderer.DrawLine(Game.CellSize * (t + new int2(0, 1)), Game.CellSize * (t + new int2(1, 1)),
wlr.DrawLine(Game.CellSize * (t + new int2(0, 1)), Game.CellSize * (t + new int2(1, 1)),
c, c);
}
}
@@ -178,7 +164,7 @@ namespace OpenRA.Graphics
var start = location + Game.CellSize * range * float2.FromAngle((float)(Math.PI * i) / 16);
var end = location + Game.CellSize * range * float2.FromAngle((float)(Math.PI * (i + 0.7)) / 16);
Game.Renderer.LineRenderer.DrawLine(start, end, c, c);
Game.Renderer.WorldLineRenderer.DrawLine(start, end, c, c);
}
}

View File

@@ -37,7 +37,7 @@ namespace OpenRA
{
Sync.CheckSyncUnchanged( world, () =>
{
Widget.HandleKeyPress( input );
Widget.DoHandleKeyPress( input );
} );
}
@@ -45,7 +45,7 @@ namespace OpenRA
{
Sync.CheckSyncUnchanged( world, () =>
{
Widget.HandleInput( input );
Widget.DoHandleInput( input );
} );
}
}

View File

@@ -13,62 +13,61 @@ using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using OpenRA.FileFormats;
using System.Text;
using OpenRA.FileFormats;
using OpenRA.Traits;
namespace OpenRA
{
public class Map
{
protected IFolder Container;
[FieldLoader.Ignore] protected IFolder Container;
public string Path {get; protected set;}
// Yaml map data
public string Uid { get; protected set; }
[FieldLoader.Load] public int MapFormat;
[FieldLoader.Load] public bool Selectable;
[FieldLoader.Load] public bool UseAsShellmap;
[FieldLoader.Load] public string RequiresMod;
public int MapFormat;
public bool Selectable;
public bool UseAsShellmap;
public string RequiresMod;
[FieldLoader.Load] public string Title;
[FieldLoader.Load] public string Type = "Conquest";
[FieldLoader.Load] public string Description;
[FieldLoader.Load] public string Author;
[FieldLoader.Load] public string Tileset;
public string Title;
public string Type = "Conquest";
public string Description;
public string Author;
public string Tileset;
public Lazy<Dictionary<string, ActorReference>> Actors;
[FieldLoader.Ignore] public Lazy<Dictionary<string, ActorReference>> Actors;
public int PlayerCount { get { return SpawnPoints.Count(); } }
public int PlayerCount { get { return Players.Count(p => p.Value.Playable); } }
public IEnumerable<int2> SpawnPoints { get { return Actors.Value.Values.Where(a => a.Type == "mpspawn").Select(a => a.InitDict.Get<LocationInit>().value); } }
[FieldLoader.Load] public Rectangle Bounds;
public Rectangle Bounds;
// Yaml map data
public Dictionary<string, PlayerReference> Players = new Dictionary<string, PlayerReference>();
public Lazy<List<SmudgeReference>> Smudges;
[FieldLoader.Ignore] public Dictionary<string, PlayerReference> Players = new Dictionary<string, PlayerReference>();
[FieldLoader.Ignore] public Lazy<List<SmudgeReference>> Smudges;
// Rules overrides
public List<MiniYamlNode> Rules = new List<MiniYamlNode>();
[FieldLoader.Ignore] public List<MiniYamlNode> Rules = new List<MiniYamlNode>();
// Sequences overrides
public List<MiniYamlNode> Sequences = new List<MiniYamlNode>();
[FieldLoader.Ignore] public List<MiniYamlNode> Sequences = new List<MiniYamlNode>();
// Weapon overrides
public List<MiniYamlNode> Weapons = new List<MiniYamlNode>();
[FieldLoader.Ignore] public List<MiniYamlNode> Weapons = new List<MiniYamlNode>();
// Voices overrides
public List<MiniYamlNode> Voices = new List<MiniYamlNode>();
[FieldLoader.Ignore] public List<MiniYamlNode> Voices = new List<MiniYamlNode>();
// Binary map data
public byte TileFormat = 1;
[FieldLoader.Load] public int2 MapSize;
[FieldLoader.Ignore] public byte TileFormat = 1;
public int2 MapSize;
public Lazy<TileReference<ushort, byte>[,]> MapTiles;
public Lazy<TileReference<byte, byte>[,]> MapResources;
public string [,] CustomTerrain;
[FieldLoader.Ignore] public Lazy<TileReference<ushort, byte>[,]> MapTiles;
[FieldLoader.Ignore] public Lazy<TileReference<byte, byte>[,]> MapResources;
[FieldLoader.Ignore] public string [,] CustomTerrain;
public Map()
{
@@ -78,6 +77,8 @@ namespace OpenRA
public static Map FromTileset(string tileset)
{
var tile = OpenRA.Rules.TileSets[tileset].Templates.First();
var tileRef = new TileReference<ushort,byte> { type = tile.Key, index = (byte)0 };
Map map = new Map()
{
Title = "Name your map here",
@@ -86,11 +87,7 @@ namespace OpenRA
MapSize = new int2(1, 1),
Tileset = tileset,
MapResources = Lazy.New(() => new TileReference<byte, byte>[1, 1]),
MapTiles = Lazy.New(() => new TileReference<ushort, byte>[1, 1]
{ { new TileReference<ushort, byte> {
type = tile.Key,
index = (byte)0 }
} }),
MapTiles = Lazy.New(() => new TileReference<ushort, byte>[1, 1] { { tileRef } }),
Actors = Lazy.New(() => new Dictionary<string, ActorReference>()),
Smudges = Lazy.New(() => new List<SmudgeReference>())
};
@@ -106,10 +103,21 @@ namespace OpenRA
public string Owner = null;
}
void AssertExists(string filename)
{
using(var s = Container.GetContent(filename))
if (s == null)
throw new InvalidOperationException("Required file {0} not present in this map".F(filename));
}
public Map(string path)
{
Path = path;
Container = FileSystem.OpenPackage(path, int.MaxValue);
AssertExists("map.yaml");
AssertExists("map.bin");
var yaml = new MiniYaml( null, MiniYaml.FromStream(Container.GetContent("map.yaml")) );
FieldLoader.Load(this, yaml);
Uid = ComputeHash();
@@ -119,7 +127,8 @@ namespace OpenRA
// Support for formats 1-3 dropped 2011-02-11.
// Use release-20110207 to convert older maps to format 4
if (MapFormat < 4)
// Use release-20110511 to convert older maps to format 5
if (MapFormat < 5)
throw new InvalidDataException("Map format {0} is not supported.\n File: {1}".F(MapFormat, path));
// Load players
@@ -137,61 +146,8 @@ namespace OpenRA
ret.Add(kv.Key, new ActorReference(kv.Value.Value, kv.Value.NodesDict));
// Add waypoint actors
if (MapFormat < 5)
foreach( var wp in yaml.NodesDict[ "Waypoints" ].NodesDict )
{
string[] loc = wp.Value.Value.Split( ',' );
var a = new ActorReference("mpspawn");
a.Add(new LocationInit(new int2( int.Parse( loc[ 0 ] ), int.Parse( loc[ 1 ] ) )));
a.Add(new OwnerInit(Players.First(p => p.Value.OwnsWorld).Key));
ret.Add(wp.Key, a);
}
return ret;
});
// Upgrade map to format 5
if (MapFormat < 5)
{
// Define RequiresMod for map installer
RequiresMod = Game.CurrentMods.Keys.First();
var TopLeft = (int2)FieldLoader.GetValue( "", typeof(int2), yaml.NodesDict["TopLeft"].Value);
var BottomRight = (int2)FieldLoader.GetValue( "", typeof(int2), yaml.NodesDict["BottomRight"].Value);
Bounds = Rectangle.FromLTRB(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y);
// Creep player
foreach (var mp in Players.Where(p => !p.Value.NonCombatant && !p.Value.Enemies.Contains("Creeps")))
mp.Value.Enemies = mp.Value.Enemies.Concat(new[] {"Creeps"}).ToArray();
Players.Add("Creeps", new PlayerReference
{
Name = "Creeps",
Race = "Random",
NonCombatant = true,
Enemies = Players.Keys.Where(k => k != "Neutral").ToArray()
});
}
/* hack: make some slots. */
if (!Players.Any(p => p.Value.Playable))
{
for (int index = 0; index < SpawnPoints.Count(); index++)
{
var p = new PlayerReference
{
Name = "Multi{0}".F(index),
Race = "Random",
Playable = true,
DefaultStartingUnits = true,
Enemies = new[]{"Creeps"}
};
Players.Add(p.Name, p);
}
}
// Smudges
Smudges = Lazy.New(() =>
@@ -375,11 +331,11 @@ namespace OpenRA
// File header consists of a version byte, followed by 2 ushorts for width and height
writer.Write(TileFormat);
writer.Write((ushort)MapSize.X);
writer.Write((ushort)MapSize.Y);
if (!OpenRA.Rules.TileSets.ContainsKey(Tileset))
throw new InvalidOperationException(
"Tileset used by the map ({0}) does not exist in this mod. Valid tilesets are: {1}"
writer.Write((ushort)MapSize.Y);
if (!OpenRA.Rules.TileSets.ContainsKey(Tileset))
throw new InvalidOperationException(
"Tileset used by the map ({0}) does not exist in this mod. Valid tilesets are: {1}"
.F(Tileset, string.Join(",", OpenRA.Rules.TileSets.Keys.ToArray())));
// Tile data
@@ -423,11 +379,11 @@ namespace OpenRA
}
public void Resize(int width, int height) // editor magic.
{
var oldMapTiles = MapTiles.Value;
var oldMapResources = MapResources.Value;
MapTiles = Lazy.New(() => ResizeArray(oldMapTiles, oldMapTiles[0, 0], width, height));
{
var oldMapTiles = MapTiles.Value;
var oldMapResources = MapResources.Value;
MapTiles = Lazy.New(() => ResizeArray(oldMapTiles, oldMapTiles[0, 0], width, height));
MapResources = Lazy.New(() => ResizeArray(oldMapResources, oldMapResources[0, 0], width, height));
MapSize = new int2(width, height);
}
@@ -448,5 +404,42 @@ namespace OpenRA
using (var csp = SHA1.Create())
return new string(csp.ComputeHash(data).SelectMany(a => a.ToString("x2")).ToArray());
}
public void MakeDefaultPlayers()
{
Players.Clear();
var firstRace = OpenRA.Rules.Info["world"].Traits
.WithInterface<CountryInfo>().First().Race;
Players.Add("Neutral", new PlayerReference
{
Name = "Neutral",
Race = firstRace,
OwnsWorld = true,
NonCombatant = true
});
for (int index = 0; index < SpawnPoints.Count(); index++)
{
var p = new PlayerReference
{
Name = "Multi{0}".F(index),
Race = "Random",
Playable = true,
DefaultStartingUnits = true,
Enemies = new[] { "Creeps" }
};
Players.Add(p.Name, p);
}
Players.Add("Creeps", new PlayerReference
{
Name = "Creeps",
Race = firstRace,
NonCombatant = true,
Enemies = Players.Where(p => p.Value.Playable).Select(p => p.Key).ToArray()
});
}
}
}

View File

@@ -8,12 +8,14 @@
*/
#endregion
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Traits;
using OpenRA.Widgets;
namespace OpenRA
{
@@ -21,45 +23,41 @@ namespace OpenRA
{
public readonly Manifest Manifest;
public readonly ObjectCreator ObjectCreator;
public Dictionary<string, Map> AvailableMaps {get; private set;}
public Dictionary<string, Map> AvailableMaps { get; private set; }
public readonly WidgetLoader WidgetLoader;
public ILoadScreen LoadScreen = null;
public SheetBuilder SheetBuilder;
public CursorSheetBuilder CursorSheetBuilder;
public SpriteLoader SpriteLoader;
public HardwarePalette Palette { get; private set; }
IFolder previousMapMount = null;
public ModData( params string[] mods )
{
Manifest = new Manifest( mods );
ObjectCreator = new ObjectCreator( Manifest );
LoadScreen = ObjectCreator.CreateObject<ILoadScreen>(Manifest.LoadScreen);
LoadScreen.Init();
LoadScreen = ObjectCreator.CreateObject<ILoadScreen>(Manifest.LoadScreen.Value);
LoadScreen.Init(Manifest.LoadScreen.NodesDict.ToDictionary(x => x.Key, x => x.Value.Value));
LoadScreen.Display();
WidgetLoader = new WidgetLoader( this );
}
public void ReloadMaps()
{
AvailableMaps = FindMaps( Manifest.Mods );
}
public void LoadInitialAssets()
{
// all this manipulation of static crap here is nasty and breaks
// horribly when you use ModData in unexpected ways.
// horribly when you use ModData in unexpected ways.
FileSystem.UnmountAll();
foreach (var dir in Manifest.Folders)
FileSystem.Mount(dir);
ReloadMaps();
AvailableMaps = FindMaps(Manifest.Mods);
Palette = new HardwarePalette();
ChromeProvider.Initialize( Manifest.Chrome );
SheetBuilder = new SheetBuilder( TextureChannel.Red );
CursorSheetBuilder = new CursorSheetBuilder( this );
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[]{});
Palette.Update(new IPaletteModifier[] { });
}
public Map PrepareMap(string uid)
@@ -68,17 +66,14 @@ namespace OpenRA
if (!AvailableMaps.ContainsKey(uid))
throw new InvalidDataException("Invalid map uid: {0}".F(uid));
var map = new Map(AvailableMaps[uid].Path);
// Maps may contain custom assets
// TODO: why are they lowest priority? they should be highest.
if (previousMapMount != null) FileSystem.Unmount(previousMapMount);
previousMapMount = FileSystem.OpenPackage(map.Path, int.MaxValue);
FileSystem.Mount(previousMapMount);
// Reinit all our assets
LoadInitialAssets();
foreach (var pkg in Manifest.Packages)
FileSystem.Mount(pkg);
// Mount map package so custom assets can be used. TODO: check priority.
FileSystem.Mount(FileSystem.OpenPackage(map.Path, int.MaxValue));
Rules.LoadRules(Manifest, map);
SpriteLoader = new SpriteLoader( Rules.TileSets[map.Tileset].Extensions, SheetBuilder );
@@ -102,21 +97,31 @@ namespace OpenRA
Dictionary<string, Map> FindMaps(string[] mods)
{
var paths = mods.SelectMany(p => FindMapsIn("mods{0}{1}{0}maps{0}".F(Path.DirectorySeparatorChar, p)))
.Concat(mods.SelectMany(p => FindMapsIn("{1}maps{0}{2}{0}".F(Path.DirectorySeparatorChar, Game.SupportDir, p))));
.Concat(mods.SelectMany(p => FindMapsIn("{1}maps{0}{2}{0}".F(Path.DirectorySeparatorChar, Platform.SupportDir, p))));
Dictionary<string, Map> ret = new Dictionary<string, Map>();
var ret = new Dictionary<string, Map>();
foreach (var path in paths)
{
var map = new Map(path);
if (ret.ContainsKey(map.Uid))
System.Console.WriteLine("Ignoring duplicate map: {0}", path);
else
try
{
var map = new Map(path);
ret.Add(map.Uid, map);
}
catch(Exception e)
{
Console.WriteLine("Failed to load map: {0}", path);
Console.WriteLine("Details: {0}", e.ToString());
}
}
return ret;
}
}
public interface ILoadScreen { void Display(); void Init(); }
public interface ILoadScreen
{
void Init(Dictionary<string, string> info);
void Display();
void StartGame();
}
}

View File

@@ -1,61 +1,71 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace OpenRA.Network
{
class FrameData
{
public struct ClientOrder
{
public int Client;
public Order Order;
}
readonly Dictionary<int, int> clientQuitTimes = new Dictionary<int, int>();
readonly Dictionary<int, Dictionary<int, byte[]>> framePackets = new Dictionary<int, Dictionary<int, byte[]>>();
public IEnumerable<int> ClientsPlayingInFrame( int frame )
{
return clientQuitTimes
.Where( x => frame <= x.Value )
.Select( x => x.Key )
.OrderBy( x => x );
}
public void ClientQuit( int clientId, int lastClientFrame )
{
clientQuitTimes[clientId] = lastClientFrame;
}
public void AddFrameOrders( int clientId, int frame, byte[] orders )
{
var frameData = framePackets.GetOrAdd( frame );
frameData.Add( clientId, orders );
}
public bool IsReadyForFrame(int frame)
{
return !ClientsNotReadyForFrame(frame).Any();
}
public IEnumerable<int> ClientsNotReadyForFrame(int frame)
{
var frameData = framePackets.GetOrAdd(frame);
return ClientsPlayingInFrame(frame)
.Where(client => !frameData.ContainsKey(client));
}
public IEnumerable<ClientOrder> OrdersForFrame( World world, int frame )
{
var frameData = framePackets[ frame ];
var clientData = ClientsPlayingInFrame( frame )
.ToDictionary( k => k, v => frameData[ v ] );
return clientData
.SelectMany( x => x.Value
.ToOrderList( world )
.Select( o => new ClientOrder { Client = x.Key, Order = o } ) );
}
}
}
#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.Collections.Generic;
using System.Linq;
namespace OpenRA.Network
{
class FrameData
{
public struct ClientOrder
{
public int Client;
public Order Order;
}
readonly Dictionary<int, int> clientQuitTimes = new Dictionary<int, int>();
readonly Dictionary<int, Dictionary<int, byte[]>> framePackets = new Dictionary<int, Dictionary<int, byte[]>>();
public IEnumerable<int> ClientsPlayingInFrame( int frame )
{
return clientQuitTimes
.Where( x => frame <= x.Value )
.Select( x => x.Key )
.OrderBy( x => x );
}
public void ClientQuit( int clientId, int lastClientFrame )
{
clientQuitTimes[clientId] = lastClientFrame;
}
public void AddFrameOrders( int clientId, int frame, byte[] orders )
{
var frameData = framePackets.GetOrAdd( frame );
frameData.Add( clientId, orders );
}
public bool IsReadyForFrame(int frame)
{
return !ClientsNotReadyForFrame(frame).Any();
}
public IEnumerable<int> ClientsNotReadyForFrame(int frame)
{
var frameData = framePackets.GetOrAdd(frame);
return ClientsPlayingInFrame(frame)
.Where(client => !frameData.ContainsKey(client));
}
public IEnumerable<ClientOrder> OrdersForFrame( World world, int frame )
{
var frameData = framePackets[ frame ];
var clientData = ClientsPlayingInFrame( frame )
.ToDictionary( k => k, v => frameData[ v ] );
return clientData
.SelectMany( x => x.Value
.ToOrderList( world )
.Select( o => new ClientOrder { Client = x.Key, Order = o } ) );
}
}
}

View File

@@ -0,0 +1,37 @@
#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 System.Linq;
namespace OpenRA.Network
{
public class GameServer
{
public readonly int Id = 0;
public readonly string Name = null;
public readonly string Address = null;
public readonly int State = 0;
public readonly int Players = 0;
public readonly string Map = null;
public readonly string[] Mods = { };
public readonly int TTL = 0;
public Dictionary<string, string> UsefulMods
{
get
{
return Mods
.Where(v => v.Contains('@'))
.ToDictionary(v => v.Split('@')[0], v => v.Split('@')[1]);
}
}
}
}

View File

@@ -17,8 +17,8 @@ namespace OpenRA.Network
{
public class HandshakeRequest
{
[FieldLoader.Load] public string[] Mods;
[FieldLoader.Load] public string Map;
public string[] Mods;
public string Map;
public string Serialize()
{
@@ -37,9 +37,9 @@ namespace OpenRA.Network
public class HandshakeResponse
{
[FieldLoader.Load] public string[] Mods;
[FieldLoader.Load] public string Password;
public Session.Client Client;
public string[] Mods;
public string Password;
[FieldLoader.Ignore] public Session.Client Client;
public string Serialize()
{
@@ -70,4 +70,4 @@ namespace OpenRA.Network
return handshake;
}
}
}
}

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