Changeset 7960
- Timestamp:
- 2016-07-07 14:59:37 (7 years ago)
- Location:
- 2016/27/AnttiN/SalainenTehtävä
- Files:
-
- 7 added
- 1 deleted
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
2016/27/AnttiN/SalainenTehtävä/SalainenTehtävä/SalainenTehtävä/SalainenTehtävä.cs
r7938 r7960 11 11 12 12 13 const double nopeus = 2000; 14 15 const int RUUDUN_KOKO = 40; 16 17 IntMeter voimaMittari; 18 int kenttaNRO = 1; 19 const int maxKentat = 1; 20 PhysicsObject pelaaja1; 21 22 Image pelaajanKuva = LoadImage("Hahmo"); 23 Image tahtiKuva = LoadImage("tahti"); 24 Image kovaKuutio = LoadImage("kovaKuutio"); 25 Image LaskeutuminenKuva = LoadImage("Laskeutuminen"); 26 Image SahkoansaKuva = LoadImage("Sähköansa"); 27 Image SahkoansaTykkiKuva = LoadImage("SahkoansaTykki"); 28 Image SahkoansaSahkoKuva = LoadImage("SahkoansaSahko"); 29 Image RajahdysKuva = LoadImage("Rajahdys"); 30 Image TykkiKuva = LoadImage("Tykki"); 31 32 AssaultRifle tykkiAse; 33 34 SoundEffect maaliAani = LoadSoundEffect("maali"); 13 private const double nopeus = 2000; 14 15 private const int RUUDUN_KOKO = 40; 16 17 private IntMeter tahtiMittari; 18 private int kenttaNRO = 1; 19 private const int maxKentat = 1; 20 21 int pelaajia = 1; 22 private PhysicsObject pelaaja1; 23 private PhysicsObject pelaaja2; 24 25 private Dictionary<int, int> tahtiaKeratty = new Dictionary<int, int>(); 26 27 [Save] public int[] tahtiaKerattyTaulukko = new int[maxKentat]; 28 29 private Image pelaajanKuva = LoadImage("Hahmo"); 30 private Image pelaajan2Kuva = LoadImage("Hahmo2"); 31 private Image tahtiKuva = LoadImage("tahti"); 32 private Image kovaKuutio = LoadImage("kovaKuutio"); 33 private Image LaskeutuminenKuva = LoadImage("Laskeutuminen"); 34 private Image SahkoansaKuva = LoadImage("Sähköansa"); 35 private Image SahkoansaTykkiKuva = LoadImage("SahkoansaTykki"); 36 private Image SahkoansaSahkoKuva = LoadImage("SahkoansaSahko"); 37 private Image RajahdysKuva = LoadImage("Rajahdys"); 38 private Image TykkiKuva = LoadImage("Tykki"); 39 40 41 private AssaultRifle pelaajan1Ase; 42 private AssaultRifle pelaajan2Ase; 43 44 private SoundEffect maaliAani = LoadSoundEffect("maali"); 35 45 36 46 public override void Begin() 37 47 { 38 48 ClearAll(); 49 LataaTahdet(); 39 50 LuoPaavalikko(); 40 51 } 41 52 53 void LataaTahdet() 54 { 55 for (int i = 1; i <= maxKentat; i++) 56 { 57 tahtiaKeratty.Add(i, 0); 58 } 59 60 if (DataStorage.Exists("tilanne.xml")) 61 { 62 // pelitilanne olemassa, ladataan se 63 LoadGame("tilanne.xml"); 64 int j = 0; 65 for (int i = 1; i <= maxKentat; i++) 66 { 67 tahtiaKeratty[i] = tahtiaKerattyTaulukko[j]; 68 } 69 } 70 71 } 72 73 void PalaaPaavalikkoon(Window ikkuna) 74 { 75 LuoPaavalikko(); 76 } 77 42 78 void LuoPaavalikko() 43 79 { 44 MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko", 45 "Pelaa", "Lopeta"); 80 Level.Background.Image = LoadImage("vuoristo"); 81 Level.Background.FitToLevel(); 82 Camera.ZoomToLevel(); 83 Level.Background.Color = Color.Blue; 84 MultiSelectWindow alkuValikko = new MultiSelectWindow("Pelin alkuvalikko","Pelaa", "Lopeta"); 46 85 Add(alkuValikko); 47 86 alkuValikko.AddItemHandler(0, Pelaa); … … 51 90 void Pelaa() 52 91 { 92 Level.Background.Image = LoadImage("kiviseina"); 93 Level.Background.FitToLevel(); 94 Camera.ZoomToLevel(); 95 Level.Background.Color = Color.Gray; 53 96 MultiSelectWindow alkuValikko = new MultiSelectWindow("Valitse kenttä", 54 "Kenntä 1", "Takaisin"); 97 "Kenntä 1 | Tähtiä " + tahtiaKeratty[1], 98 /*"Kenntä 2 | Tähtiä " + tahtiaKeratty[2],*/ 99 "Takaisin"); 55 100 Add(alkuValikko); 56 alkuValikko.AddItemHandler(0, delegate { AloitaPeli(1); });101 alkuValikko.AddItemHandler(0, delegate { ValitsePelaajat(1); }); 57 102 alkuValikko.AddItemHandler(1, LuoPaavalikko); 58 103 104 } 105 106 void ValitsePelaajat(int kentta) 107 { 108 MultiSelectWindow alkuValikko = new MultiSelectWindow("Kenttä 1. Montako pelaajaa?", "1 Pelaaja", "2 Pelaajaa"); 109 Add(alkuValikko); 110 alkuValikko.AddItemHandler(0, delegate { pelaajia = 1; AloitaPeli(kentta); }); 111 alkuValikko.AddItemHandler(1, delegate { pelaajia = 2; AloitaPeli(kentta); }); 59 112 } 60 113 … … 77 130 kentta.SetTileMethod('#', LisaaTaso); 78 131 kentta.SetTileMethod('*', LisaaTahti); 79 kentta.SetTileMethod('N', LisaaPelaaja );132 kentta.SetTileMethod('N', LisaaPelaaja,1); 80 133 kentta.SetTileMethod('L', LisaaLaskeutuminen); 81 134 kentta.SetTileMethod('R', LisaaSahkoansaTykkiVaaka); 82 135 kentta.SetTileMethod('S', LisaaSahkoansaTykkiPysty); 83 136 kentta.SetTileMethod('T', LisaaTykki); 137 if(pelaajia==2) kentta.SetTileMethod('2', LisaaPelaaja, 2); 84 138 kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO); 85 139 Level.CreateBorders(); … … 90 144 void LuoTahtiLaskuri() 91 145 { 92 voimaMittari = new IntMeter(0,0,3);93 voimaMittari.UpperLimit += VoimaMittariTaynna;146 tahtiMittari = new IntMeter(0,0,3); 147 tahtiMittari.UpperLimit += VoimaMittariTaynna; 94 148 95 149 ProgressBar voimaPalkki = new ProgressBar(150, 50); 96 150 voimaPalkki.X = Screen.Right - 250; 97 151 voimaPalkki.Y = Screen.Bottom + 100; 98 voimaPalkki.BindTo( voimaMittari);152 voimaPalkki.BindTo(tahtiMittari); 99 153 voimaPalkki.Image = LoadImage("harmaatTahdet"); 100 154 voimaPalkki.BarImage = LoadImage("kultaisetTahdet"); … … 126 180 } 127 181 128 void LisaaPelaaja(Vector paikka, double leveys, double korkeus) 129 { 130 pelaaja1 = new PhysicsObject(leveys*0.9, korkeus*0.9); 131 pelaaja1.Position = paikka; 132 pelaaja1.Mass = 4.0; 133 pelaaja1.Image = pelaajanKuva; 134 AddCollisionHandler(pelaaja1, "SahkoansaSahko", TuhoaPelaaja); 135 AddCollisionHandler(pelaaja1, "tahti", TormaaTahteen); 136 AddCollisionHandler(pelaaja1, "Laskeutuminen", TormaaLaskeutumiseen); 137 Add(pelaaja1); 138 pelaaja1.LinearDamping = 0.9; 139 pelaaja1.Tag = "pelaaja"; 140 pelaaja1.CanRotate = false; 141 142 tykkiAse = new AssaultRifle(30, 10); 143 tykkiAse.Power.MaxValue = 50; 144 tykkiAse.FireRate = 1; 145 tykkiAse.ProjectileCollision = AmmusOsui; 146 pelaaja1.Add(tykkiAse); 147 148 182 void LisaaPelaaja(Vector paikka, double leveys, double korkeus, int pelaaja) 183 { 184 if (pelaaja == 1) 185 { 186 pelaaja1 = LuoPelaaja(paikka, leveys, korkeus, pelaajanKuva, "pelaaja1"); 187 pelaajan1Ase = LuoPelaajanAse(pelaaja1); 188 } 189 if (pelaaja == 2) 190 { 191 pelaaja2 = LuoPelaaja(paikka, leveys, korkeus, pelaajan2Kuva, "pelaaja2"); 192 pelaajan2Ase = LuoPelaajanAse(pelaaja2); 193 } 194 } 195 196 PhysicsObject LuoPelaaja(Vector paikka, double leveys, double korkeus,Image kuva, string nimi) 197 { 198 PhysicsObject pelaaja = new PhysicsObject(leveys*0.9, korkeus*0.9); 199 pelaaja.Position = paikka; 200 pelaaja.Mass = 4.0; 201 pelaaja.Image = kuva; 202 AddCollisionHandler(pelaaja, "SahkoansaSahko", TuhoaPelaaja); 203 AddCollisionHandler(pelaaja, "tahti", TormaaTahteen); 204 AddCollisionHandler(pelaaja, "Laskeutuminen", TormaaLaskeutumiseen); 205 Add(pelaaja); 206 pelaaja.LinearDamping = 0.9; 207 pelaaja.Tag = nimi; 208 pelaaja.CanRotate = false; 209 210 return pelaaja; 211 } 212 213 AssaultRifle LuoPelaajanAse(PhysicsObject pelaaja) 214 { 215 AssaultRifle pelaajanAse = new AssaultRifle(30, 10); 216 pelaajanAse.Power.MaxValue = 50; 217 pelaajanAse.FireRate = 1; 218 pelaajanAse.ProjectileCollision = AmmusOsui; 219 pelaaja.Add(pelaajanAse); 220 return pelaajanAse; 149 221 } 150 222 … … 242 314 Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); 243 315 316 //Pelaajan 1 näppäimet 244 317 Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector(-nopeus, 0)); 245 318 Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, new Vector(nopeus, 0)); 246 319 Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Pelaaja liikkuu ylöspäin", pelaaja1, new Vector(0, nopeus)); 247 320 Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "pelaaja liikkuu alaspäin", pelaaja1, new Vector(0, -nopeus)); 248 Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, "Ammu", tykkiAse);321 Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, "Ammu", pelaajan1Ase); 249 322 Mouse.ListenMovement(0.1, Tahtaa, "Tähtää aseella"); 250 323 … … 255 328 ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector(-nopeus, 0)); 256 329 ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja1, new Vector(nopeus, 0)); 257 ControllerOne.Listen(Button.A, ButtonState.Down, AmmuAseella, "Ammu", tykkiAse); 258 ControllerOne.ListenAnalog(AnalogControl.RightStick, 0.1, Tahtaa2, "Liikuta pelaajaa tattia pyörittämällä."); 330 ControllerOne.Listen(Button.A, ButtonState.Down, AmmuAseella, "Ammu", pelaajan1Ase); 331 ControllerOne.ListenAnalog(AnalogControl.RightStick, 0.1, Tahtaa2, "Liikuta pelaajaa tattia pyörittämällä.", pelaajan1Ase); 332 333 334 // Pelaajan 2 ohjaimet 335 ControllerTwo.Listen(Button.DPadUp, ButtonState.Down, Liikuta, "Pelaaja liikkuu ylöspäin", pelaaja2, new Vector(0, nopeus)); 336 ControllerTwo.Listen(Button.DPadDown, ButtonState.Down, Liikuta, "pelaaja liikkuu alaspäin", pelaaja2, new Vector(0, -nopeus)); 337 ControllerTwo.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector(-nopeus, 0)); 338 ControllerTwo.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja2, new Vector(nopeus, 0)); 339 ControllerTwo.Listen(Button.A, ButtonState.Down, AmmuAseella, "Ammu", pelaajan2Ase); 340 ControllerTwo.ListenAnalog(AnalogControl.RightStick, 0.1, Tahtaa2, "Liikuta pelaajaa tattia pyörittämällä.", pelaajan2Ase); 341 342 259 343 260 344 PhoneBackButton.Listen(ConfirmExit, "Lopeta peli"); 261 345 } 262 346 263 void Tahtaa2(AnalogState tatinTila )264 { 265 tykkiAse.Angle = tatinTila.StateVector.Angle;347 void Tahtaa2(AnalogState tatinTila, AssaultRifle ase) 348 { 349 ase.Angle = tatinTila.StateVector.Angle; 266 350 } 267 351 … … 278 362 MessageDisplay.Add("Keräsit tähden!"); 279 363 tahti.Destroy(); 280 voimaMittari.Value += 1;364 tahtiMittari.Value += 1; 281 365 } 282 366 … … 284 368 { 285 369 286 MessageDisplay.Add("Läpäisit tason"); 370 MessageDisplay.Add("Läpäisit tason"); 371 if (tahtiaKeratty[kenttaNRO] < tahtiMittari.Value) tahtiaKeratty[kenttaNRO] = tahtiMittari.Value; 287 372 Timer.SingleShot(1, Voitit); 288 373 } … … 307 392 { 308 393 ammus.Destroy(); 309 if (kohde.Tag.ToString() == "pelaaja ")394 if (kohde.Tag.ToString() == "pelaaja1") 310 395 { 311 396 TuhoaPelaaja(pelaaja1, ammus); 312 397 } 398 if (kohde.Tag.ToString() == "pelaaja2") 399 { 400 TuhoaPelaaja(pelaaja2, ammus); 401 } 313 402 314 403 } … … 316 405 void Tahtaa(AnalogState hiirenLiike) 317 406 { 318 Vector suunta = (Mouse.PositionOnWorld - tykkiAse.AbsolutePosition).Normalize();319 tykkiAse.Angle = suunta.Angle;407 Vector suunta = (Mouse.PositionOnWorld - pelaajan1Ase.AbsolutePosition).Normalize(); 408 pelaajan1Ase.Angle = suunta.Angle; 320 409 } 321 410 void AmmuAseella(AssaultRifle ase) … … 337 426 rajahdys.Position = pelaaja.Position; 338 427 Add(rajahdys); 339 Mouse.Disable(MouseButton.Left); 340 Timer.SingleShot(2, Havisit); 428 429 Timer.SingleShot(2, delegate { if (pelaaja1.IsDestroyed && pelaaja2.IsDestroyed) 430 { 431 Mouse.Disable(MouseButton.Left); 432 Havisit(); 433 } 434 }); 341 435 } 342 436 … … 360 454 voittoValikko.AddItemHandler(0, delegate { AloitaPeli(kenttaNRO); }); 361 455 voittoValikko.AddItemHandler(1, LuoPaavalikko); 362 voittoValikko.AddItemHandler(2, delegate { if ( !(kenttaNRO < maxKentat)) LuoPaavalikko();AloitaPeli(kenttaNRO += 1); });456 voittoValikko.AddItemHandler(2, delegate { if ((kenttaNRO >= maxKentat)) { MessageWindow ikkuna = new MessageWindow("Ei lisää kenttiä vielä!"); Add(ikkuna); ikkuna.Closed += PalaaPaavalikkoon; } else AloitaPeli(kenttaNRO += 1); }); 363 457 voittoValikko.AddItemHandler(3, Exit); 364 458 459 } 460 461 protected override void OnExiting(object sender, EventArgs args) 462 { 463 int j = 0; 464 for (int i = 1; i <= maxKentat; i++) 465 { 466 tahtiaKerattyTaulukko[j] = tahtiaKeratty[i]; 467 } 468 SaveGame("tilanne.xml"); 469 base.OnExiting(sender, args); 365 470 } 366 471 -
2016/27/AnttiN/SalainenTehtävä/SalainenTehtävä/SalainenTehtävä/SalainenTehtävä.csproj.Debug.cachefile
r7938 r7960 7 7 Content\SÀhköansa.xnb 8 8 Content\Hahmo.xnb 9 Content\kiviseina.xnb10 9 Content\SahkoansaTykki.xnb 11 10 Content\SahkoansaSahko.xnb … … 14 13 Content\harmaatTahdet.xnb 15 14 Content\kultaisetTahdet.xnb 15 Content\kiviseina.xnb 16 Content\vuoristo.xnb 17 Content\Hahmo2.xnb -
2016/27/AnttiN/SalainenTehtävä/SalainenTehtävä/SalainenTehtävä/obj/x86/Debug/ContentPipeline-{FB1067CC-FEED-45F1-8CB8-8F3DD59AB260}.xml
r7938 r7960 36 36 <Options>None</Options> 37 37 <Output>C:\MyTemp\AnttiN\SalainenTehtävä\SalainenTehtävä\SalainenTehtävä\bin\x86\Debug\Content\kentta1.xnb</Output> 38 <Time>2016-07-0 6T14:10:40.3641692+03:00</Time>38 <Time>2016-07-07T14:22:57.6011016+03:00</Time> 39 39 </Item> 40 40 <Item> … … 75 75 </Item> 76 76 <Item> 77 <Source>kiviseina.jpg</Source>78 <Name>kiviseina</Name>79 <Importer>TextureImporter</Importer>80 <Processor>TextureProcessor</Processor>81 <Options>None</Options>82 <Output>C:\MyTemp\AnttiN\SalainenTehtävä\SalainenTehtävä\SalainenTehtävä\bin\x86\Debug\Content\kiviseina.xnb</Output>83 <Time>2016-07-05T14:26:32.5351565+03:00</Time>84 </Item>85 <Item>86 77 <Source>SahkoansaTykki.png</Source> 87 78 <Name>SahkoansaTykki</Name> … … 136 127 <Output>C:\MyTemp\AnttiN\SalainenTehtävä\SalainenTehtävä\SalainenTehtävä\bin\x86\Debug\Content\kultaisetTahdet.xnb</Output> 137 128 <Time>2016-07-07T10:47:32.4173983+03:00</Time> 129 </Item> 130 <Item> 131 <Source>kiviseina.png</Source> 132 <Name>kiviseina</Name> 133 <Importer>TextureImporter</Importer> 134 <Processor>TextureProcessor</Processor> 135 <Options>None</Options> 136 <Output>C:\MyTemp\AnttiN\SalainenTehtävä\SalainenTehtävä\SalainenTehtävä\bin\x86\Debug\Content\kiviseina.xnb</Output> 137 <Time>2016-07-07T12:31:19.7555983+03:00</Time> 138 </Item> 139 <Item> 140 <Source>vuoristo.png</Source> 141 <Name>vuoristo</Name> 142 <Importer>TextureImporter</Importer> 143 <Processor>TextureProcessor</Processor> 144 <Options>None</Options> 145 <Output>C:\MyTemp\AnttiN\SalainenTehtävä\SalainenTehtävä\SalainenTehtävä\bin\x86\Debug\Content\vuoristo.xnb</Output> 146 <Time>2016-07-07T12:49:14.1539983+03:00</Time> 147 </Item> 148 <Item> 149 <Source>Hahmo2.png</Source> 150 <Name>Hahmo2</Name> 151 <Importer>TextureImporter</Importer> 152 <Processor>TextureProcessor</Processor> 153 <Options>None</Options> 154 <Output>C:\MyTemp\AnttiN\SalainenTehtävä\SalainenTehtävä\SalainenTehtävä\bin\x86\Debug\Content\Hahmo2.xnb</Output> 155 <Time>2016-07-07T14:33:50.1928461+03:00</Time> 138 156 </Item> 139 157 <BuildSuccessful>true</BuildSuccessful> -
2016/27/AnttiN/SalainenTehtävä/SalainenTehtävä/SalainenTehtävä/obj/x86/Debug/SalainenTehtävä.csproj.FileListAbsolute.txt
r7938 r7960 22 22 C:\MyTemp\AnttiN\SalainenTehtÀvÀ\SalainenTehtÀvÀ\SalainenTehtÀvÀ\bin\x86\Debug\Content\harmaatTahdet.xnb 23 23 C:\MyTemp\AnttiN\SalainenTehtÀvÀ\SalainenTehtÀvÀ\SalainenTehtÀvÀ\bin\x86\Debug\Content\kultaisetTahdet.xnb 24 C:\MyTemp\AnttiN\SalainenTehtÀvÀ\SalainenTehtÀvÀ\SalainenTehtÀvÀ\bin\x86\Debug\Content\vuoristo.xnb 25 C:\MyTemp\AnttiN\SalainenTehtÀvÀ\SalainenTehtÀvÀ\SalainenTehtÀvÀ\bin\x86\Debug\Content\Hahmo2.xnb -
2016/27/AnttiN/SalainenTehtävä/SalainenTehtävä/SalainenTehtävä/obj/x86/Debug/cachefile-{FB1067CC-FEED-45F1-8CB8-8F3DD59AB260}-targetpath.txt
r7938 r7960 7 7 Content\SÀhköansa.xnb 8 8 Content\Hahmo.xnb 9 Content\kiviseina.xnb10 9 Content\SahkoansaTykki.xnb 11 10 Content\SahkoansaSahko.xnb … … 14 13 Content\harmaatTahdet.xnb 15 14 Content\kultaisetTahdet.xnb 15 Content\kiviseina.xnb 16 Content\vuoristo.xnb 17 Content\Hahmo2.xnb -
2016/27/AnttiN/SalainenTehtävä/SalainenTehtävä/SalainenTehtäväContent/SalainenTehtäväContent.contentproj
r7938 r7960 96 96 </ItemGroup> 97 97 <ItemGroup> 98 <Compile Include="kiviseina.jpg">99 <Name>kiviseina</Name>100 <Importer>TextureImporter</Importer>101 <Processor>TextureProcessor</Processor>102 </Compile>103 </ItemGroup>104 <ItemGroup>105 98 <Compile Include="SahkoansaTykki.png"> 106 99 <Name>SahkoansaTykki</Name> … … 144 137 </Compile> 145 138 </ItemGroup> 139 <ItemGroup> 140 <Compile Include="kiviseina.png"> 141 <Name>kiviseina</Name> 142 <Importer>TextureImporter</Importer> 143 <Processor>TextureProcessor</Processor> 144 </Compile> 145 </ItemGroup> 146 <ItemGroup> 147 <Compile Include="vuoristo.png"> 148 <Name>vuoristo</Name> 149 <Importer>TextureImporter</Importer> 150 <Processor>TextureProcessor</Processor> 151 </Compile> 152 </ItemGroup> 153 <ItemGroup> 154 <Compile Include="Hahmo2.png"> 155 <Name>Hahmo2</Name> 156 <Importer>TextureImporter</Importer> 157 <Processor>TextureProcessor</Processor> 158 </Compile> 159 </ItemGroup> 146 160 <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\$(XnaFrameworkVersion)\Microsoft.Xna.GameStudio.ContentPipeline.targets" /> 147 161 <!-- To modify your build process, add your task inside one of the targets below and uncomment it. -
2016/27/AnttiN/SalainenTehtävä/SalainenTehtävä/SalainenTehtäväContent/kentta1.txt
r7911 r7960 5 5 ###### ##### 6 6 ###### S#### 7 #L T N 7 #L T N2 *## 8 8 ###### #### 9 9 ###### #####
Note: See TracChangeset
for help on using the changeset viewer.