PageRenderTime 29ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/Poing2/SplashScreen.cs

http://github.com/BCProgramming/BASeBlock
C# | 1215 lines | 879 code | 215 blank | 121 comment | 91 complexity | a9b97793caa9c48716fbab77fa21ded6 MD5 | raw file
Possible License(s): BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Drawing;
  7. using System.Drawing.Drawing2D;
  8. using System.Drawing.Imaging;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Reflection;
  12. using System.Text;
  13. using System.Threading;
  14. using System.Windows.Forms;
  15. using BASeCamp.BASeBlock.Particles;
  16. using Img;
  17. using Microsoft.WindowsAPICodePack.Taskbar;
  18. using Timer=System.Threading.Timer;
  19. using BASeCamp.Updating;
  20. namespace BASeCamp.BASeBlock
  21. {
  22. public partial class SplashScreen : Form, iManagerCallback
  23. {
  24. private class drawimagedata
  25. {
  26. public drawimagedata(Image[] frames):this(frames.AsEnumerable())
  27. {
  28. }
  29. public drawimagedata(IEnumerable<Image> frames)
  30. {
  31. _ImageFrames = frames.ToArray();
  32. }
  33. public drawimagedata()
  34. {
  35. }
  36. private Image[] _ImageFrames;
  37. private int _FrameIndex;
  38. private Image _DrawImage { get {return _ImageFrames[_FrameIndex];}
  39. set {
  40. if(_ImageFrames==null) _ImageFrames = new Image[0];
  41. _ImageFrames[_FrameIndex] = value; }
  42. }
  43. public int FrameIndex { get { return _FrameIndex; } set { _FrameIndex = value % _ImageFrames.Length; } }
  44. public Image[] ImageFrames { get { return _ImageFrames; } set { _ImageFrames = value; } }
  45. public Image DrawImage
  46. {
  47. get { return _DrawImage; }
  48. set
  49. {
  50. _DrawImage = value;
  51. }
  52. }
  53. public PointF Location;
  54. public double Angle;
  55. public Size DrawSize
  56. {
  57. get
  58. {
  59. return _DrawImage.Size;
  60. }
  61. }
  62. public void Draw(Graphics g)
  63. {
  64. //Location corresponds to the center of this image...
  65. var copyt = g.Transform.Clone();
  66. g.TranslateTransform(Location.X, Location.Y);
  67. double useangle = (float)(Angle * (180d / Math.PI));
  68. g.RotateTransform((float)(useangle));
  69. g.TranslateTransform((float)-DrawImage.Width / 2, (float)-DrawImage.Height / 2);
  70. //draw the image at 0,0...
  71. g.DrawImage(DrawImage, 0, 0,DrawSize.Width,DrawSize.Height);
  72. //reset the transform.
  73. g.Transform = copyt;
  74. FrameIndex++;
  75. }
  76. }
  77. private System.Threading.Timer delaytimer;
  78. //private System.Threading.Timer alphatimer;
  79. private Thread bobberthread;
  80. // private BobbingTextAnimator Bobber;
  81. // private BobbingTextAnimator Bobber2;
  82. private iManagerCallback filelogwriter;
  83. private Animatable Bobber;
  84. private Animatable Bobber2;
  85. private Graphics ImageBackBufferCanvas;
  86. private Bitmap ImageBackBufferbitmap;
  87. private Bitmap BackgroundBitmap;
  88. private Graphics BackgroundBuffer;
  89. private Thread quickthread;
  90. private Image useBackground;
  91. private double mAlphaIncrement = 0.01;
  92. private bool mProceed = false;
  93. private bool mQuit = false;
  94. public bool DoQuit { get { return mQuit; } set { mQuit = value; } }
  95. private bool ShownAsAbout = false;
  96. private String logfilename;
  97. private List<drawimagedata> imagesdraw = new List<drawimagedata>();
  98. private DateTime? BobberThreadEffectFinish = null;
  99. private DateTime BobberThreadEffectStart;
  100. private bool performingEffect = false;
  101. private int EffectCount = 0;
  102. private PointF prevparticlepos;
  103. private Random rg = new Random();
  104. private void DoInit()
  105. {
  106. try
  107. {
  108. logfilename = Path.Combine(BCBlockGameState.AppDataFolder, "baseblock.log");
  109. filelogwriter = new FileLogCallback(logfilename);
  110. }
  111. catch
  112. {
  113. }
  114. }
  115. public SplashScreen(bool ShowasAbout)
  116. {
  117. ShownAsAbout = ShowasAbout;
  118. mProceed = true;
  119. InitializeComponent();
  120. DoInit();
  121. }
  122. public SplashScreen()
  123. {
  124. InitializeComponent();
  125. DoInit();
  126. }
  127. bool mmimagesloaded=false;
  128. Image[] mmimages=null;
  129. int mmimageframe = 0;
  130. DateTime lastmmFrameChange = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0));
  131. TimeSpan mmFrameDelayTime=new TimeSpan(0,0,0,0,500);
  132. private void BobberThread()
  133. {
  134. int EffectLengthi = 5000;
  135. if (BobberThreadEffectFinish == null)
  136. {
  137. BobberThreadEffectFinish = DateTime.Now;
  138. }
  139. const int numeffects = 6;
  140. while (true)
  141. {
  142. lock (ImageBackBufferCanvas)
  143. {
  144. Thread.Sleep(40);
  145. Thread.SpinWait(15);
  146. while (Form.ActiveForm == null) Thread.Sleep(50);
  147. if (!this.Visible)
  148. {
  149. Thread.Sleep(50); //nothing to do, allow other threads to run.
  150. }
  151. else
  152. {
  153. DrawFrame();
  154. }
  155. if (performingEffect)
  156. {
  157. bool doflip = false;
  158. TimeSpan EffectLength = DateTime.Now - BobberThreadEffectStart;
  159. //currently the only supported "effect" ,draws a bunch of particles across the screen halfway. (Y).
  160. imagesdraw.Clear();
  161. if (EffectLength.TotalMilliseconds > EffectLengthi)
  162. {
  163. performingEffect = false;
  164. prevparticlepos = new PointF(0, 0);
  165. BobberThreadEffectFinish = DateTime.Now;
  166. }
  167. else
  168. {
  169. double currpercent = (double) EffectLength.TotalMilliseconds/(double) EffectLengthi;
  170. int Xpos =
  171. (int)
  172. (((float) (ImageBackBufferbitmap.Width*1.5)*currpercent) -
  173. ((float) (ImageBackBufferbitmap.Width*0.2f)));
  174. Debug.Print("Effect currpercent=" + currpercent);
  175. // PointF addparticlepos = new PointF(Xpos, ImageBackBufferbitmap.Height / 2);
  176. int effectnumber = EffectCount%numeffects;
  177. if (effectnumber%2 == 0)
  178. {
  179. Xpos = ImageBackBufferbitmap.Width - Xpos;
  180. doflip = true;
  181. }
  182. PointF addparticlepos = new PointF(Xpos, 163);
  183. if (prevparticlepos.X == 0 && prevparticlepos.Y == 0) prevparticlepos = addparticlepos;
  184. float usehue = (((float) currpercent*3)%1)*240;
  185. Color particlecolor = new HSLColor(usehue, 240, 120);
  186. const float maxoutspeed = 1f;
  187. const int numparticles = 25;
  188. Image[] usepics = null;
  189. System.Drawing.Size? usesize;
  190. switch (effectnumber)
  191. {
  192. case 0:
  193. case 2:
  194. usepics = new Image[] { rdash.BackgroundImage };
  195. if (effectnumber == 2)
  196. addparticlepos = new PointF(addparticlepos.X,
  197. ((float) Math.Sin(addparticlepos.X/16)*8) +
  198. addparticlepos.Y);
  199. /*for (int addp = 0; addp < numparticles*2; addp++)
  200. {
  201. Particle addparticle = new DustParticle(addparticlepos, (float) (rg.NextDouble()*4),
  202. 7500, particlecolor);
  203. lock (DrawParticles)
  204. {
  205. DrawParticles.Add(addparticle);
  206. }
  207. }*/
  208. //create a spectrum...
  209. const float numlines = 25;
  210. const int totalsize = 100;
  211. for (int i = 0; i < numlines; i++)
  212. {
  213. float useYoffset = (totalsize/2) + (((float) i/numlines)*totalsize);
  214. float pct = ((float) i/numlines);
  215. float percenthue = (pct*240);
  216. PointF offsetamount = new PointF(addparticlepos.X - prevparticlepos.X,
  217. addparticlepos.Y - prevparticlepos.Y);
  218. //PointF firstpoint = new PointF(addparticlepos.X, useYoffset);
  219. //PointF secondpoint = new PointF(firstpoint.X+offsetamount.X,firstpoint.Y+offsetamount.Y);
  220. PointF firstpoint = addparticlepos;
  221. PointF secondpoint = prevparticlepos;
  222. if (firstpoint.X > secondpoint.X)
  223. {
  224. firstpoint = new PointF(firstpoint.X + 2, firstpoint.Y);
  225. secondpoint = new PointF(secondpoint.X - 2, secondpoint.Y);
  226. }
  227. else
  228. {
  229. firstpoint = new PointF(firstpoint.X - 2, firstpoint.Y);
  230. secondpoint = new PointF(secondpoint.X + 2, secondpoint.Y);
  231. }
  232. //float phue = (percenthue + (Xpos/2)%240 )%240;
  233. float phue = percenthue%240;
  234. Color linecoloruse = new HSLColor(phue, 240, 120);
  235. float usevel = (pct - 0.5f)*5;
  236. DustParticle dust1 = new DustParticle(firstpoint, new PointF(0, usevel));
  237. DustParticle dust2 = new DustParticle(secondpoint, new PointF(0, usevel));
  238. LineParticle lp = new LineParticle(dust1, dust2, linecoloruse);
  239. lock (DrawParticles)
  240. {
  241. DrawParticles.Add(lp);
  242. if (Math.Truncate((double) Xpos)%15 == 0)
  243. {
  244. //add a 5-pointed star...
  245. //StarParticle staradd = new StarParticle(addparticlepos, BCBlockGameState.GetRandomVelocity(0,3), 5, 3, 6, Color.Yellow, Color.Black, (float)(rg.NextDouble() * 2));
  246. CharacterDebris staradd = new CharacterDebris(addparticlepos,
  247. BCBlockGameState.
  248. GetRandomVelocity(0, 3),
  249. Color.Yellow, 8, 18);
  250. DrawParticles.Add(staradd);
  251. }
  252. }
  253. }
  254. /*
  255. Particle addParticleA = new DustParticle(addparticlepos, new PointF(0, -2));
  256. Particle addParticleB = new DustParticle(addparticlepos, new PointF(0, 2));
  257. LineParticle lp = new LineParticle(addParticleA, addParticleB, particlecolor);
  258. lock (DrawParticles)
  259. {
  260. DrawParticles.Add(lp);
  261. }
  262. */
  263. break;
  264. case 1:
  265. case 3:
  266. usepics = new Image[] {rdash.BackgroundImage};
  267. if (effectnumber == 3)
  268. addparticlepos = new PointF(addparticlepos.X,
  269. ((float) Math.Sin(addparticlepos.X/32)*16) +
  270. addparticlepos.Y);
  271. for (int addp = 0; addp < numparticles; addp++)
  272. {
  273. float ppercent = (float) addp/(float) numparticles;
  274. float usespeed = (float) (((maxoutspeed*2)*ppercent) - maxoutspeed);
  275. PointF speeduse = new PointF((float) (rg.NextDouble() - 0.5d), usespeed);
  276. particlecolor = new HSLColor(ppercent*240, 240, 120);
  277. //Particle addparticle = new PolyDebris(addparticlepos, rg.NextDouble() * 2, particlecolor, 3, 4, 3, 8);
  278. Particle addparticle = new PolyDebris(addparticlepos, speeduse, particlecolor, 3,
  279. 4,
  280. 3, 8);
  281. lock (DrawParticles)
  282. {
  283. DrawParticles.Add(addparticle);
  284. }
  285. }
  286. break;
  287. case 4:
  288. usepics = new Image[] { ttoaster.BackgroundImage };
  289. for (int addp = 0; addp < numparticles*2; addp++)
  290. {
  291. particlecolor = Color.FromArgb(rg.Next(255), rg.Next(255), 0);
  292. Particle addparticle = new DustParticle(addparticlepos,
  293. (float) (rg.NextDouble()*4),
  294. 7500, particlecolor);
  295. lock (DrawParticles)
  296. {
  297. DrawParticles.Add(addparticle);
  298. }
  299. }
  300. break;
  301. case 5:
  302. /*
  303. */
  304. //megaman sprites...
  305. //since these are loaded
  306. if (!mmimagesloaded)
  307. {
  308. mmimagesloaded = true;
  309. try
  310. {
  311. mmimages = BCBlockGameState.Imageman.getImageFrames("megaman");
  312. }
  313. catch
  314. {
  315. mmimagesloaded = false;
  316. }
  317. }
  318. if (mmimagesloaded)
  319. {
  320. if ((DateTime.Now - lastmmFrameChange) > mmFrameDelayTime)
  321. {
  322. //advance the frame.
  323. mmimageframe++;
  324. }
  325. mmimageframe = mmimageframe%mmimages.Length;
  326. //they are... or should be, loaded now.
  327. usepics = new Image[] {mmimages[mmimageframe]};
  328. usesize = new Size(usepics[0].Size.Width*3, usepics[0].Size.Height*3);
  329. }
  330. break;
  331. /*
  332. case 3:
  333. addparticlepos = new PointF(addparticlepos.X, ((float)Math.Sin(addparticlepos.X / 16) * 8) + addparticlepos.Y);
  334. for (int addp = 0; addp < numparticles; addp++)
  335. {
  336. Particle addparticle = new PolyDebris(addparticlepos, rg.NextDouble()*2, particlecolor, 3, 4, 3, 8);
  337. lock (DrawParticles)
  338. {
  339. DrawParticles.Add(addparticle);
  340. }
  341. }
  342. break;
  343. */
  344. }
  345. drawimagedata dd = new drawimagedata();
  346. //dd.DrawImage = (Image) usepic.Clone();
  347. dd.ImageFrames = usepics;
  348. if (doflip) dd.DrawImage.RotateFlip(RotateFlipType.RotateNoneFlipX);
  349. dd.Location = addparticlepos;
  350. //imagesdraw.Add(new drawimagedata(BCBlockGameState.Imageman.GetLoadedImage("rdash")
  351. double ang = BCBlockGameState.GetAngle(prevparticlepos, addparticlepos);
  352. Debug.Print("chosen angle=" + ang);
  353. dd.Angle = ang;
  354. //if (doflip) dd.Angle += (float) Math.PI;
  355. imagesdraw.Add(dd);
  356. prevparticlepos = addparticlepos;
  357. }
  358. }
  359. else if ((DateTime.Now - BobberThreadEffectFinish.Value).TotalSeconds >= 60)
  360. {
  361. EffectCount++;
  362. EffectCount = EffectCount%numeffects;
  363. switch (EffectCount)
  364. {
  365. case 0:
  366. case 1:
  367. case 2:
  368. case 3:
  369. EffectLengthi = 5000;
  370. if (BCBlockGameState.Soundman != null) //can be null, if you press shift during startup and take a while on the screen presented...
  371. {
  372. if (BCBlockGameState.Soundman.HasSound("asboom"))
  373. {
  374. BCBlockGameState.Soundman.PlaySound("asboom", 3.0f);
  375. }
  376. }
  377. break;
  378. case 4:
  379. iSoundSourceObject grabsound;
  380. if (BCBlockGameState.Soundman != null)
  381. {
  382. if (((grabsound = BCBlockGameState.Soundman.GetSoundRnd("TTOASTER")) != null))
  383. {
  384. grabsound.Play(false, 3.0f);
  385. }
  386. }
  387. break;
  388. case 5:
  389. if(BCBlockGameState.Soundman!=null) BCBlockGameState.Soundman.PlaySound("ray");
  390. break;
  391. }
  392. Debug.Print("invoking effect #" + EffectCount);
  393. performingEffect = true;
  394. BobberThreadEffectStart = DateTime.Now;
  395. }
  396. }
  397. }
  398. }
  399. private List<Particle> DrawParticles = new List<Particle>();
  400. private Point FirstBobberPos;
  401. private Point SecondBobberPos;
  402. private void DrawFrame()
  403. {
  404. try
  405. {
  406. Bobber.PerformFrame();
  407. Bobber2.PerformFrame();
  408. //panImage.Update();
  409. Graphics g = ImageBackBufferCanvas;
  410. lock (g)
  411. {
  412. g.Clear(Color.Transparent);
  413. g.ResetTransform();
  414. //g.DrawImage(panImage.BackgroundImage, 0, 0, panImage.ClientSize.Width, panImage.ClientSize.Height);
  415. Bobber.Draw(g, FirstBobberPos.X, FirstBobberPos.Y);
  416. g.ResetTransform();
  417. Bobber2.Draw(g, SecondBobberPos.X, SecondBobberPos.Y);
  418. List<Particle> removeparts = new List<Particle>();
  419. foreach (Particle drawpart in DrawParticles)
  420. {
  421. if (drawpart.PerformFrame(null))
  422. removeparts.Add(drawpart);
  423. }
  424. lock (DrawParticles)
  425. {
  426. foreach (Particle removeit in removeparts)
  427. {
  428. DrawParticles.Remove(removeit);
  429. }
  430. }
  431. //BobberVersion.Draw(g, (int)g.MeasureString(BobberVersion.DrawString,BobberVersion.DrawFont).Width, 157);
  432. panImage.Invoke((MethodInvoker)(() =>
  433. {
  434. panImage.Invalidate();
  435. panImage.Update();
  436. }));
  437. //panImage.Update();
  438. }
  439. }
  440. catch (Exception ex)
  441. {
  442. Debug.Print("Unexpected Exception (DrawFrame)" + ex.ToString());
  443. }
  444. }
  445. private void AlphaTick(object value)
  446. {
  447. // Debug.Print(this.Opacity.ToString());
  448. this.Opacity += mAlphaIncrement;
  449. if (this.Opacity >= 1) mAlphaIncrement = 0;
  450. if (this.Opacity == 0)
  451. {
  452. Hide();
  453. // frmBaseBlock mbaseblockobj = new frmBaseBlock();
  454. //new frmBaseBlock().Show();
  455. //mbaseblockobj.Show();
  456. //mbaseblockobj.Closed += new EventHandler(mbaseblockobj_Closed);
  457. tmrFade.Enabled = false;
  458. if(BCBlockGameState.Soundman!=null)
  459. BCBlockGameState.Soundman.StopMusic();
  460. Close(); //close the form.
  461. }
  462. }
  463. private void timercallback(object value)
  464. {
  465. //disable timer..
  466. Debug.Print("timercallback");
  467. delaytimer.Dispose();
  468. delaytimer = null;
  469. //invoke the routine to initialize the game state...
  470. if (!ShownAsAbout)
  471. {
  472. quickthread = new Thread(threadinitroutine);
  473. quickthread.Start();
  474. }
  475. bobberthread = new Thread(BobberThread);
  476. bobberthread.Start();
  477. }
  478. private void threadinitroutine()
  479. {
  480. System.Windows.Forms.Cursor.Current = Cursors.AppStarting;
  481. DateTime InitTime = DateTime.Now;
  482. try
  483. {
  484. BCBlockGameState.Initgamestate(this);
  485. //start playing the intro music
  486. String[] introkeys = BCBlockGameState.Shuffle(BCBlockGameState.Soundman.getMultiSounds("INTRO")).ToArray();
  487. Invoke((MethodInvoker)(()=>BCBlockGameState.Soundman.PlayMusic(introkeys, cNewSoundManager.MultiMusicPlayMode.MultiMusic_Random)));
  488. Cursor.Current = Cursors.Default;
  489. mProceed = true;
  490. TimeSpan totalinittime = (DateTime.Now - InitTime);
  491. ShowMessage("Initialization completed in " + totalinittime);
  492. ShowMessage("Click Image above to continue...");
  493. //store that total init time in the initialization time log.
  494. TimeInitLog(totalinittime);
  495. }
  496. catch (Exception exx)
  497. {
  498. mProceed = false; //disallow proceeding to the next screen.
  499. mQuit = true;
  500. ShowMessage("Exception captured during initialization:" + exx.ToString());
  501. ShowMessage("Click Image above to Quit.");
  502. this.BackColor = Color.Red;
  503. if (isWin7())
  504. {
  505. TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Error);
  506. }
  507. }
  508. //cmdCopy.Visible=true;
  509. cmdCopy.Invoke((MethodInvoker) (() => cmdCopy.Visible = true));
  510. }
  511. /// <summary>
  512. /// Adds the given Time to a list of Times. Stored in %APPDATA%, and that keep track of the startup times of the program, for "auditing" purposes, or something.
  513. /// </summary>
  514. /// <param name="Timelogged"></param>
  515. private static void TimeInitLog(TimeSpan Timelogged)
  516. {
  517. //first, what file will it be.
  518. String Initlogfile = Path.Combine(BCBlockGameState.AppDataFolder,"init.log");
  519. FileStream fs = new FileStream(Initlogfile, FileMode.Append, FileAccess.Write);
  520. StreamWriter sw = new StreamWriter(fs);
  521. sw.WriteLine("Version:" + GetExecutingVersion() + " - " + Timelogged.ToString());
  522. sw.Close();
  523. }
  524. private static String GetExecutingVersion()
  525. {
  526. return Assembly.GetExecutingAssembly().GetName().Version.ToString();
  527. }
  528. private String[] randomsel = BCBlockGameState.ExpandIntroStrings();
  529. private Random rgen = new Random();
  530. private String ChooseRandomBobText()
  531. {
  532. int randomindex = rgen.Next(0, randomsel.Length);
  533. return randomsel[randomindex];
  534. }
  535. private Color getrndcolor()
  536. {
  537. var hscolor = new HSLColor(rgen.NextDouble()*240, 240, 120);
  538. return hscolor;
  539. }
  540. private Control LowerPanel = null;
  541. private void ChangeBobText()
  542. {
  543. String randombobtext = ChooseRandomBobText();
  544. Bitmap measurebob = new Bitmap(1, 1);
  545. Font bobberfont = BCBlockGameState.GetScaledFont(new Font("Arial", 72, FontStyle.Bold),128);
  546. Graphics mbob = Graphics.FromImage(measurebob);
  547. SizeF bobtextsize = mbob.MeasureString(randombobtext, bobberfont);
  548. Color RandomColor1 = getrndcolor();
  549. Color RandomColor2 = getrndcolor();
  550. float randomAngle = (float) (2*Math.PI*rgen.NextDouble());
  551. Brush bobtextbrush = new LinearGradientBrush(new RectangleF(0, 0, bobtextsize.Width, bobtextsize.Height),
  552. RandomColor1, RandomColor2, randomAngle, true);
  553. Bobber =
  554. (Animatable)
  555. new BobbingTextAnimator(randombobtext, 35, bobberfont, 0.25f, 0.35f, 0.007f, -35, bobtextbrush);
  556. }
  557. private Image RegUnregImage = null;
  558. private Font Regunregfont = BCBlockGameState.GetScaledFont(new Font("Arial", 16, FontStyle.Bold),22);
  559. private void createregunregimage()
  560. {
  561. //draw "registered" or "unregistered" based on Program.isLicensed.
  562. if(RegUnregImage!=null) return;
  563. String drawstring = Program.isLicensed ? "Registered\n" : "Unregistered\n";
  564. drawstring += BCBlockGameState.PortableMode ? " Portable!" : ""; //add in "portable" too.
  565. //Bitmap measureit = new Bitmap(1, 1);
  566. //Graphics measureg = Graphics.FromImage(measureit);
  567. SizeF textsize = BCBlockGameState.MeasureString(drawstring, Regunregfont);
  568. textsize = new SizeF(textsize.Width + 10, textsize.Height + 10);
  569. //measureg.Dispose();
  570. //measureit.Dispose();
  571. Bitmap stringimage = new Bitmap((int)(Math.Ceiling(textsize.Width)),(int)(Math.Ceiling(textsize.Height)));
  572. Graphics DrawPic = Graphics.FromImage(stringimage);
  573. DrawPic.SmoothingMode = SmoothingMode.HighQuality;
  574. GraphicsPath usepath = new GraphicsPath();
  575. usepath.AddString(drawstring, Regunregfont, new Point(3, 3), StringFormat.GenericDefault);
  576. DrawPic.FillPath(new SolidBrush(Color.White), usepath);
  577. DrawPic.DrawPath(new Pen(Color.White), usepath);
  578. usepath = new GraphicsPath();
  579. usepath.AddString(drawstring,Regunregfont,new Point(0,0),StringFormat.GenericDefault);
  580. DrawPic.FillPath(new SolidBrush(Color.Black),usepath);
  581. DrawPic.DrawPath(new Pen(Color.Gray),usepath);
  582. DrawPic.Dispose();
  583. RegUnregImage=stringimage;
  584. }
  585. private GenericListViewSorter assemblylist;
  586. private void SplashScreen_Load(object sender, EventArgs e)
  587. {
  588. //431, 260
  589. createregunregimage();
  590. chooseimage();
  591. this.AllowTransparency = true;
  592. //first, initialize image panel to 431, 260
  593. panImage.Location = new Point(0, 0);
  594. //change this if the image is changed...
  595. Size UseSize = new Size(431, 260);
  596. PointF ScaleValue = DPIHelper.GetDPIScaling(this);
  597. UseSize = new Size((int)((float)UseSize.Width*ScaleValue.X),(int)((float)UseSize.Height*ScaleValue.Y));
  598. panImage.Size = UseSize;
  599. Size = new Size(panImage.Width, panImage.Height + panProgress.Height);
  600. //clear the background of the panImage to speed drawing
  601. //panImage.BackgroundImage=null;
  602. InitBackground();
  603. //ImageBackBufferCanvas.DrawImage(useBackground, 0, 0, BackgroundBitmap.Width, BackgroundBitmap.Height);
  604. //move the lower pane...
  605. panProgress.Location = new Point(0, panImage.Bottom);
  606. panProgress.Size = new Size(panImage.Width, ClientSize.Height - panImage.Bottom);
  607. panProgress.Visible = !ShownAsAbout;
  608. PanelAbout.Visible = ShownAsAbout;
  609. PanelAbout.Size = panProgress.Size;
  610. if (ShownAsAbout)
  611. {
  612. LowerPanel = PanelAbout;
  613. PanelAbout.Visible = true;
  614. }
  615. else
  616. {
  617. LowerPanel = panProgress;
  618. }
  619. LowerPanel.Visible = true;
  620. LowerPanel.Location = new Point(0, panImage.Bottom);
  621. this.Size = new Size(panImage.Width, LowerPanel.Bottom);
  622. //resize the textbox to show exactly two lines
  623. //panProgress.Height = txtprogress.Height;
  624. //this.ClientSize = new Size(this.ClientSize.Width,panImage.Height + panProgress.Height);
  625. this.Height = LowerPanel.Bottom + 5;
  626. //put in middle of the screen, as well.
  627. //get appropriate screen...
  628. Screen usescreen = Screen.FromHandle(this.Handle);
  629. //center on working area...
  630. Point uselocation = new Point(usescreen.WorkingArea.Width/2 - Width/2,
  631. usescreen.WorkingArea.Height/2 - Height/2);
  632. this.Location = uselocation;
  633. mAlphaIncrement = 0.01;
  634. this.Opacity = 100;
  635. // Bobber = new BobbingTextAnimator("BETA", 35, new Font("Arial", 72,FontStyle.Bold),0.25f,0.35f,0.007f,-35);
  636. //Bobber = new BobbingTextAnimator(GetExecutingVersion(), 35, new Font("Arial", 72, FontStyle.Bold), 0.25f, 0.35f, 0.007f, -35);
  637. String randombobtext = ChooseRandomBobText();
  638. Bitmap measurebob = new Bitmap(1, 1);
  639. Font bobberfont = BCBlockGameState.GetScaledFont(new Font("Arial", 72, FontStyle.Bold),90);
  640. Font biggerbobberfont = BCBlockGameState.GetScaledFont(new Font("Arial", 72, FontStyle.Bold), 128);
  641. Graphics mbob = Graphics.FromImage(measurebob);
  642. SizeF bobtextsize = mbob.MeasureString(randombobtext, bobberfont);
  643. Color RandomColor1 = getrndcolor();
  644. Color RandomColor2 = getrndcolor();
  645. float randomAngle = (float) (2*Math.PI*rgen.NextDouble());
  646. Brush bobtextbrush = new LinearGradientBrush(new RectangleF(0, 0, bobtextsize.Width, bobtextsize.Height),
  647. RandomColor1, RandomColor2, randomAngle, true);
  648. FirstBobberPos = new Point((int)(320f*ScaleValue.X),(int)(157f*ScaleValue.Y));
  649. SecondBobberPos = new Point((int)(70f * ScaleValue.X), (int)(157f * ScaleValue.Y));
  650. Bobber =
  651. (Animatable)
  652. new BobbingTextAnimator(randombobtext, 35, bobberfont, 0.25f, 0.35f, 0.007f, -35, bobtextbrush);
  653. Bobber2 =
  654. (Animatable)
  655. new BobbingTextAnimator(GetExecutingVersion(), 35,biggerbobberfont, 0.25f, 0.35f,
  656. 0.007f, 32, new SolidBrush(Color.Yellow));
  657. delaytimer = new Timer(timercallback, null, 0, 0);
  658. //alphatimer = new Timer(AlphaTick, null, 0, 10);
  659. tmrFade.Enabled = true;
  660. //BCBlockGameState.Initgamestate(this);
  661. assemblylist = new GenericListViewSorter(lvwAssemblies);
  662. }
  663. private void InitBackground()
  664. {
  665. BackgroundBitmap = new Bitmap(panImage.Size.Width, panImage.Size.Height);
  666. //draw the background pic to it...
  667. BackgroundBuffer = Graphics.FromImage(BackgroundBitmap);
  668. BackgroundBuffer.DrawImage(useBackground, 0, 0, BackgroundBitmap.Width, BackgroundBitmap.Height);
  669. ImageBackBufferbitmap = new Bitmap(panImage.Size.Width, panImage.Size.Height);
  670. ImageBackBufferCanvas = Graphics.FromImage(ImageBackBufferbitmap);
  671. ImageBackBufferCanvas.Clear(Color.Transparent);
  672. }
  673. private float CurrentProgress = 0;
  674. #region iManagerCallback Members
  675. private bool isWin7()
  676. {
  677. var osverinfo = Environment.OSVersion;
  678. //Win7 is version 6.1; anything larger supports the API codepack, presumably.
  679. return (osverinfo.Version > new Version(6, 1)) && Microsoft.WindowsAPICodePack.Taskbar.TaskbarManager.IsPlatformSupported;
  680. }
  681. public void UpdateProgress(float ProgressPercentage)
  682. {
  683. CurrentProgress = ProgressPercentage;
  684. //Microsoft.WindowsAPICodePack.Taskbar
  685. if (isWin7())
  686. {
  687. Microsoft.WindowsAPICodePack.Taskbar.TaskbarManager.Instance.SetProgressValue((int)(ProgressPercentage * 100), 100);
  688. }
  689. Debug.Print("Progress set to " + ProgressPercentage);
  690. }
  691. public List<Tuple<String, Exception>> LoadErrors = new List<Tuple<string, Exception>>();
  692. public void FlagError(String ErrorDescription, Exception AttachedException)
  693. {
  694. LoadErrors.Add(new Tuple<string, Exception>(ErrorDescription, AttachedException));
  695. }
  696. public void ShowMessage(string message)
  697. {
  698. if(filelogwriter!=null) filelogwriter.ShowMessage(message);
  699. if (txtprogress.InvokeRequired)
  700. {
  701. txtprogress.Invoke((MethodInvoker) (() =>
  702. {
  703. txtprogress.Text += Environment.NewLine + message;
  704. txtprogress.SelectionStart = txtprogress.Text.Length;
  705. txtprogress.ScrollToCaret();
  706. }));
  707. }
  708. else
  709. {
  710. {
  711. txtprogress.Text += "\n" + message;
  712. txtprogress.ScrollToCaret();
  713. }
  714. }
  715. #endregion
  716. }
  717. private void panImage_Paint(object sender, PaintEventArgs e)
  718. {
  719. e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
  720. e.Graphics.Clear(Color.Transparent);
  721. e.Graphics.DrawImageUnscaled(BackgroundBitmap, 0, 0);
  722. lock (DrawParticles)
  723. {
  724. foreach (Particle drawpart in DrawParticles)
  725. {
  726. drawpart.Draw(e.Graphics);
  727. }
  728. }
  729. lock (imagesdraw)
  730. {
  731. foreach (drawimagedata loopdata in imagesdraw)
  732. {
  733. // e.Graphics.DrawImage(loopdata.DrawImage, loopdata.Location);
  734. loopdata.Draw(e.Graphics);
  735. }
  736. }
  737. e.Graphics.DrawImageUnscaled(ImageBackBufferbitmap, 0, 0);
  738. if (CurrentProgress < 1.0f && !ShownAsAbout)
  739. {
  740. //get the appropriate dimensions...
  741. float widthprogress = ImageBackBufferbitmap.Width*CurrentProgress;
  742. RectangleF drawprect = new RectangleF((float) widthprogress, 0,
  743. ImageBackBufferbitmap.Width - widthprogress,
  744. ImageBackBufferbitmap.Height);
  745. e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, Color.Red)), drawprect);
  746. SizeF measuresize;
  747. String loadingtext = "Loading" + dupe('.', DateTime.Now.Millisecond/100%5);
  748. System.Drawing.Font loadingtextfont = new Font("Arabia", 48);
  749. measuresize = e.Graphics.MeasureString(loadingtext, loadingtextfont);
  750. RectangleF largerect = new RectangleF((float) panImage.ClientRectangle.Left,
  751. (float) panImage.ClientRectangle.Top,
  752. (float) panImage.ClientRectangle.Width,
  753. (float) panImage.ClientRectangle.Height);
  754. RectangleF userect = BCBlockGameState.CenterRect(largerect, measuresize);
  755. GraphicsPath pusepath = new GraphicsPath();
  756. pusepath.AddString(loadingtext, loadingtextfont.FontFamily, (int) loadingtextfont.Style,
  757. loadingtextfont.Size, new PointF(48, 48), StringFormat.GenericDefault);
  758. e.Graphics.FillPath(new SolidBrush(Color.Yellow), pusepath);
  759. e.Graphics.DrawPath(new Pen(Color.Black, 2), pusepath);
  760. }
  761. }
  762. private String dupe(char character, int number)
  763. {
  764. StringBuilder sb = new StringBuilder("");
  765. for (int i = 0; i < number; i++)
  766. {
  767. sb.Append(character);
  768. }
  769. return sb.ToString();
  770. }
  771. private Image[] SplashImages = null;
  772. private void GetSplashImages()
  773. {
  774. if(SplashImages==null)
  775. {
  776. List<Image> PrepareList = new List<Image>();
  777. //get the Appdata location.
  778. String SplashLocation = Path.Combine(BCBlockGameState.AppDataFolder, "Splash");
  779. if(!Directory.Exists(SplashLocation)) throw new DirectoryNotFoundException("Failed to find Splash folder " + SplashLocation);
  780. int SuffixNumber = 0;
  781. while(true)
  782. {
  783. String Suffix = SuffixNumber == 0 ? "" : SuffixNumber.ToString();
  784. String GrabFile = Path.Combine(SplashLocation, "splash" + Suffix + ".png");
  785. if (!File.Exists(GrabFile)) break;
  786. using (FileStream fs = new FileStream(GrabFile, FileMode.Open, FileAccess.Read))
  787. {
  788. Image LoadImage = Image.FromStream(fs);
  789. LoadImage = BCBlockGameState.ResizeImage(LoadImage, 431, 256);
  790. PrepareList.Add(LoadImage);
  791. }
  792. SuffixNumber++;
  793. }
  794. SplashImages = PrepareList.ToArray();
  795. }
  796. }
  797. private void chooseimage()
  798. {
  799. //April 6th, birthday of windows 3.1
  800. if (DateTime.Now.Month == 4 && DateTime.Now.Day == 6)
  801. {
  802. useBackground = panWin31.BackgroundImage;
  803. }
  804. else
  805. {
  806. //select a random start image from the available start images.
  807. GetSplashImages();
  808. Image[] selectfrom = SplashImages;
  809. Image useimage = selectfrom[rgen.Next(selectfrom.Length)];
  810. useBackground = useimage;
  811. }
  812. //new as of July 14th 2011: colourize to a random hue 50% of the time.
  813. if (rgen.NextDouble() > 0.5d)
  814. {
  815. //choose a random colour...
  816. Color colourizeto = new HSLColor(rgen.NextDouble() * 240, 240, 120);
  817. ImageAttributes attribcolourize = new ImageAttributes();
  818. QColorMatrix qc = new QColorMatrix();
  819. qc.RotateHue((float)(rgen.NextDouble()*255));
  820. attribcolourize.SetColorMatrix(qc.ToColorMatrix());
  821. // ColorMatrices.AddColourizer(attribcolourize, colourizeto);
  822. useBackground = BCBlockGameState.AppyImageAttributes(useBackground, attribcolourize);
  823. }
  824. Graphics drawtoit = Graphics.FromImage(useBackground);
  825. drawtoit.DrawImageUnscaled(RegUnregImage, 2, 2);
  826. drawtoit.Dispose();
  827. }
  828. private void mbaseblockobj_Closed(object sender, EventArgs e)
  829. {
  830. //when the main form closes, close this splash as well.
  831. Close();
  832. }
  833. private void tmrFade_Tick(object sender, EventArgs e)
  834. {
  835. AlphaTick(null);
  836. }
  837. private void panImage_Click(object sender, EventArgs e)
  838. {
  839. if (mProceed || mQuit)
  840. {
  841. //hide this form, load main form, and show it.
  842. mAlphaIncrement = -0.01;
  843. }
  844. }
  845. private void txtprogress_TextChanged(object sender, EventArgs e)
  846. {
  847. }
  848. private void txtprogress_MouseEnter(object sender, EventArgs e)
  849. {
  850. //
  851. }
  852. private void txtprogress_MouseLeave(object sender, EventArgs e)
  853. {
  854. //
  855. }
  856. private void cmdCopy_Click(object sender, EventArgs e)
  857. {
  858. Clipboard.SetText(txtprogress.Text);
  859. }
  860. private void SplashScreen_Deactivate(object sender, EventArgs e)
  861. {
  862. }
  863. private void SplashScreen_Activated(object sender, EventArgs e)
  864. {
  865. LowerPanel.Visible = true;
  866. }
  867. private void ShowPlugins(ListView showinlvw)
  868. {
  869. showinlvw.Items.Clear();
  870. showinlvw.Columns.Clear();
  871. showinlvw.View=View.Details;
  872. showinlvw.Columns.Add("NAME", "Name",-2);
  873. showinlvw.Columns.Add("DESCRIPTION","Description",-2);
  874. showinlvw.Columns.Add("TYPE SPECIFIER", "Type Specifier",-2);
  875. foreach (var plugin in BCBlockGameState.LoadedPlugins)
  876. {
  877. String[] additem = new string[] {plugin.getName(),plugin.getDescription(),plugin.GetType().FullName};
  878. var AddedItem = new ListViewItem(additem);
  879. showinlvw.Items.Add(AddedItem);
  880. }
  881. }
  882. private void ShowLoadedAssemblies(ListView showinlvw)
  883. {
  884. showinlvw.Items.Clear();
  885. showinlvw.Columns.Clear();
  886. showinlvw.View = View.Details;
  887. Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
  888. //add the columns
  889. showinlvw.Columns.Add("NAME", "Name",-2);
  890. showinlvw.Columns.Add("PATH", "Full Path",-2);
  891. showinlvw.Columns.Add("VERSION", "Version",-2);
  892. ImageList generateiml = new ImageList();
  893. generateiml.ImageSize = new Size(16,16);
  894. showinlvw.SmallImageList = generateiml;
  895. foreach (Assembly loopassembly in loadedAssemblies)
  896. {
  897. String[] createdstring = new String[]
  898. {
  899. loopassembly.GetName().Name, loopassembly.Location,
  900. loopassembly.GetName().Version.ToString()
  901. };
  902. var returnicon = Win32Find.GetIcon(loopassembly.Location, true);
  903. String imkey = loopassembly.Location;
  904. generateiml.Images.Add(imkey,returnicon);
  905. ListViewItem newitem = new ListViewItem(createdstring,imkey);
  906. newitem.Tag = loopassembly;
  907. showinlvw.Items.Add(newitem);
  908. }
  909. }
  910. private void chkShowLoaded_CheckedChanged(object sender, EventArgs e)
  911. {
  912. if (chkShowLoaded.Checked)
  913. {
  914. ShowLoadedAssemblies(lvwAssemblies);
  915. }
  916. var lvwOwner = pandetails.Parent;
  917. pandetails.Location = new Point(lvwOwner.ClientRectangle.Left, lvwOwner.ClientRectangle.Top);
  918. pandetails.Size = new Size(ClientSize.Width, panProgress.Top-ClientRectangle.Top);
  919. pandetails.Visible = chkShowLoaded.Checked;
  920. pandetails_Resize(pandetails, e);
  921. }
  922. private void SplashScreen_Shown(object sender, EventArgs e)
  923. {
  924. LowerPanel.Visible = true;
  925. Debug.Print("LowerPanel Visible:" + LowerPanel.Visible.ToString());
  926. }
  927. private void SplashScreen_FormClosed(object sender, FormClosedEventArgs e)
  928. {
  929. if (quickthread != null && quickthread.IsAlive)
  930. {
  931. quickthread.Abort();
  932. quickthread = null;
  933. }
  934. if (bobberthread != null && bobberthread.IsAlive)
  935. {
  936. bobberthread.Abort();
  937. bobberthread = null;
  938. }
  939. }
  940. private void SplashScreen_KeyPress(object sender, KeyPressEventArgs e)
  941. {
  942. }
  943. private void SplashScreen_KeyDown(object sender, KeyEventArgs e)
  944. {
  945. if (e.KeyCode == Keys.F12 && e.Shift)
  946. {
  947. ChangeBobText();
  948. }
  949. else if (e.KeyCode == Keys.F12 && e.Control)
  950. {
  951. if(BCBlockGameState.Soundman!=null)
  952. BCBlockGameState.Soundman.PauseMusic();
  953. }
  954. else if (e.KeyCode == Keys.F11)
  955. {
  956. chooseimage();
  957. InitBackground();
  958. }
  959. else if (e.KeyCode == Keys.F7 && e.Control)
  960. {
  961. var currentPlaying = BCBlockGameState.Soundman.GetPlayingMusic_Active();
  962. if (currentPlaying is cNewSoundManager.QueuedSoundManager)
  963. {
  964. cNewSoundManager.QueuedSoundManager qsm = (cNewSoundManager.QueuedSoundManager)currentPlaying;
  965. qsm.Skip();
  966. }
  967. }
  968. }
  969. private void panProgress_Resize(object sender, EventArgs e)
  970. {
  971. txtprogress.Location = new Point(0, 0);
  972. txtprogress.Size = new Size(panProgress.ClientSize.Width - cmdCopy.Width, panProgress.ClientSize.Height);
  973. cmdCopy.Location = new Point(panProgress.ClientSize.Width - cmdCopy.Width, 0);
  974. }
  975. private void pandetails_Resize(object sender, EventArgs e)
  976. {
  977. tabDetails.Location = Point.Empty;
  978. tabDetails.Size = pandetails.ClientSize;
  979. }
  980. private void ta

Large files files are truncated, but you can click here to view the full file