home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / UltraStar_Deluxe / ultrastardx-1.1-installer-full.exe / plugins / teamduel.usdx < prev   
Text File  |  2010-06-23  |  8KB  |  258 lines

  1. --[[
  2.  * UltraStar Deluxe - Karaoke Game
  3.  *
  4.  * UltraStar Deluxe is the legal property of its developers, whose names
  5.  * are too numerous to list here. Please refer to the COPYRIGHT
  6.  * file distributed with this source distribution.
  7.  *
  8.  * This program is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License
  10.  * as published by the Free Software Foundation; either version 2
  11.  * of the License, or (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; see the file COPYING. If not, write to
  20.  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  21.  * Boston, MA 02110-1301, USA.
  22.  *
  23.  * $URL: http://ultrastardx.svn.sourceforge.net/svnroot/ultrastardx/trunk/game/plugins/teamduel.usdx $
  24.  * $Id: teamduel.usdx 2558 2010-06-23 22:20:13Z whiteshark0 $
  25.  *]]
  26.  
  27. -- some values to adjust the creation of PlayerChanges
  28. local MinPercentage = 0.06;  -- minimal amount of points between changes (in percent)
  29. local MaxPercentage = 0.12; -- maximal amount of points between changes (in percent)
  30. -- position of big progress bar in the center
  31. local BarPos = {};
  32. BarPos.Top = 30
  33. BarPos.Bottom = 50
  34. BarPos.Left = 300
  35. BarPos.Right = 500
  36.  
  37. function plugin_init()
  38.   register('party mode: teamduel', '1.00', 'USDX Team', 'http://www.UltrastarDeluxe.org');
  39.  
  40.   require('math', 'Usdx.Party', 'Usdx.ScreenSing', 'Usdx.Gl', 'Usdx.TextGl');
  41.   local Mode = {}
  42.  
  43.   Mode.Name = 'teamduel';
  44.   Mode.CanParty = true;
  45.   Mode.PlayerCount = {2,3,4,5,6};
  46.  
  47.   Mode.BeforeSing = 'BeforeSing'
  48.   Mode.OnSing = 'Sing';
  49.  
  50.   Usdx.Party.Register(Mode)
  51.  
  52.   ScreenSing.GetBeat();
  53.  
  54.   return true;
  55. end
  56.  
  57. -- called everytime a singing session w/ this party mode is startet
  58. -- we just hook ScreenSing.SongLoaded to prepare the mic changes here
  59. function BeforeSing()
  60.   hSongLoaded = Usdx.Hook('ScreenSing.SongLoaded', 'PrepareChanges');
  61.  
  62.   -- execute default action (e.g. set correct singing playercount)
  63.   return true
  64. end;
  65.  
  66. -- adds a new SentenceChange at Line to the PlayerChanges array
  67. function AddChange(Line)
  68.   PlayerChanges[#PlayerChanges + 1] = {};
  69.   PlayerChanges[#PlayerChanges].OnBeat = Lines[Line].Start;
  70.  
  71.   PlayerChanges[#PlayerChanges].NextPlayer = {}
  72.   for i = 1, #Teams do
  73.     repeat
  74.       PlayerChanges[#PlayerChanges].NextPlayer[i] = math.random(#Teams[i].Players);
  75.     until (1 == #PlayerChanges) or (PlayerChanges[#PlayerChanges].NextPlayer[i] ~= PlayerChanges[#PlayerChanges-1].NextPlayer[i]) or (#Teams[i].Players == 1);
  76.   end;
  77. end;
  78.  
  79. function PrepareChanges()
  80.   Lines = ScreenSing.GetSongLines();
  81.   Teams = Party.GetTeams();
  82.  
  83.   -- get sum of hittable beats (per line and total)
  84.   local TotalBeats = 0;
  85.   local LineValue = {};
  86.   for i = 1, #Lines do
  87.     for j = 1, #Lines[i].Notes do
  88.       LineValue[i] = (LineValue[i] or 0) + Lines[i].Notes[j].Length * Lines[i].Notes[j].NoteType;
  89.     end;
  90.     TotalBeats = TotalBeats + LineValue[i];
  91.   end;
  92.  
  93.   -- calculate changes
  94.   PlayerChanges = {};
  95.   -- fallback if there are only freestyle notes
  96.   -- random count of lines between changes
  97.   if (TotalBeats == 0) then
  98.     local i = 1;
  99.     repeat
  100.       if i > 1 then
  101.         AddChange(i);
  102.       end
  103.  
  104.       local step = math.ceil((MinPercentage + (MaxPercentage - MinPercentage) * math.random()) * #Lines);
  105.       if step < 1 then
  106.         step = 1;
  107.       end;
  108.  
  109.       i = i + step;
  110.     until i >= #Lines;
  111.   else -- calculate changes by amount of hittable beats
  112.     local i = 1;
  113.     local BeatsToChange = math.ceil((MinPercentage + (MaxPercentage - MinPercentage) * math.random()) * TotalBeats);
  114.     local Beats = 0;
  115.  
  116.     repeat
  117.       Beats = Beats + LineValue[i];
  118.       if Beats >= BeatsToChange then
  119.         AddChange(i);
  120.         BeatsToChange = BeatsToChange + math.ceil((MinPercentage + (MaxPercentage - MinPercentage) * math.random()) * TotalBeats);
  121.       end
  122.       i = i + 1;
  123.     until i >= #Lines;
  124.   end;
  125.  
  126.   -- free lines
  127.   Lines = nil;
  128.  
  129.   -- init NextPlayerChange
  130.   NextPlayerChange = 1;
  131.  
  132.   -- calculate OSD position for players
  133.   do
  134.     local RBRect = ScreenSing.GetRBRect();
  135.     OSD = {};
  136.  
  137.     for i = 1, #RBRect do
  138.       OSD[i] = {};
  139.       OSD[i].Left   = RBRect[i].x;
  140.       OSD[i].Right  = RBRect[i].x + RBRect[i].w;
  141.       OSD[i].Top    = RBRect[i].y + RBRect[i].h;
  142.       OSD[i].Bottom = RBRect[i].y + RBRect[i].h + math.max(RBRect[i].h, 13);
  143.     end;
  144.   end;
  145.  
  146.   -- remove hook
  147.   hSongLoaded:Unhook();
  148.   hSongLoaded = nil;
  149. end
  150.  
  151. function DrawPlayerText(i, Text)
  152.   Gl.Disable('GL_TEXTURE_2D');
  153.  
  154.   -- background
  155.   Gl.Color (0, 0, 0, 1);
  156.   Gl.Begin('GL_QUADS');
  157.     Gl.Vertex(OSD[i].Left, OSD[i].Top);
  158.     Gl.Vertex(OSD[i].Left, OSD[i].Bottom);
  159.     Gl.Vertex(OSD[i].Right, OSD[i].Bottom);
  160.     Gl.Vertex(OSD[i].Right, OSD[i].Top);
  161.   Gl.End();
  162.  
  163.   -- text
  164.   Gl.Color(1, 0, 0, 1);
  165.   TextGl.Style(1);
  166.   TextGl.Size(18);
  167.   TextGl.Italic(false);
  168.   local PosX = (OSD[i].Left + OSD[i].Right) / 2;
  169.   PosX = PosX - TextGl.Width(Text) / 2;
  170.  
  171.   TextGl.Pos(PosX, OSD[i].Top - 3);
  172.  
  173.   TextGl.Print(Text);
  174. end;
  175.  
  176. -- draws the progress bar for player i
  177. function DrawPlayerProgress(i, Progress)
  178.   Gl.Disable('GL_TEXTURE_2D');
  179.  
  180.   -- background
  181.   Gl.Color (0, 0, 0, 1);
  182.   Gl.Begin('GL_QUADS');
  183.     Gl.Vertex(OSD[i].Left, OSD[i].Top);
  184.     Gl.Vertex(OSD[i].Left, OSD[i].Bottom);
  185.     Gl.Vertex(OSD[i].Right, OSD[i].Bottom);
  186.     Gl.Vertex(OSD[i].Right, OSD[i].Top);
  187.   Gl.End();
  188.  
  189.   -- bar
  190.   Gl.Color(1, 0, 0, 1);
  191.   Gl.Begin('GL_QUADS');
  192.     Gl.Vertex(OSD[i].Left + 2, OSD[i].Top + 2);
  193.     Gl.Vertex(OSD[i].Left + 2, OSD[i].Bottom - 2);
  194.     Gl.Vertex(OSD[i].Left + 2 + (OSD[i].Right - OSD[i].Left - 4) * Progress, OSD[i].Bottom - 2);
  195.     Gl.Vertex(OSD[i].Left + 2 + (OSD[i].Right - OSD[i].Left - 4) * Progress, OSD[i].Top + 2);
  196.   Gl.End();
  197. end;
  198.  
  199. -- draws the big progress bar in the screen center
  200. function DrawCenterProgress(Progress)
  201.   Gl.Disable('GL_TEXTURE_2D');
  202.  
  203.   -- background
  204.   Gl.Color (0, 0, 0, 1);
  205.   Gl.Begin('GL_QUADS');
  206.     Gl.Vertex(BarPos.Left, BarPos.Top);
  207.     Gl.Vertex(BarPos.Left, BarPos.Bottom);
  208.     Gl.Vertex(BarPos.Right, BarPos.Bottom);
  209.     Gl.Vertex(BarPos.Right, BarPos.Top);
  210.   Gl.End();
  211.  
  212.   -- bar
  213.   Gl.Color(1, 0, 0, 1);
  214.   Gl.Begin('GL_QUADS');
  215.     Gl.Vertex(BarPos.Left + 2, BarPos.Top + 2);
  216.     Gl.Vertex(BarPos.Left + 2, BarPos.Bottom - 2);
  217.     Gl.Vertex(BarPos.Left + 2 + (BarPos.Right - BarPos.Left - 4) * Progress, BarPos.Bottom - 2);
  218.     Gl.Vertex(BarPos.Left + 2 + (BarPos.Right - BarPos.Left - 4) * Progress, BarPos.Top + 2);
  219.   Gl.End();
  220. end;
  221.  
  222. function Sing()
  223.   if (NextPlayerChange <= #PlayerChanges) then
  224.     local BeatsToNextChange = PlayerChanges[NextPlayerChange].OnBeat - ScreenSing.GetBeat();
  225.     local TimeToNextChange = ScreenSing.BeatsToSeconds(BeatsToNextChange);
  226.  
  227.     -- draw next player text or progress bar
  228.     if (TimeToNextChange <= 0) then
  229.       --there is a change
  230.       NextPlayerChange = NextPlayerChange + 1;
  231.  
  232.     elseif (TimeToNextChange <= 5) then
  233.       for i = 1, #Teams do
  234.         DrawPlayerProgress(i, 1 - TimeToNextChange/5);
  235.       end;
  236.     elseif (TimeToNextChange <= 6.5) then
  237.       for i = 1, #Teams do
  238.         DrawPlayerText(i, Teams[i].Players[PlayerChanges[NextPlayerChange].NextPlayer[i]].Name);
  239.       end;
  240.     elseif (TimeToNextChange <= 8) then
  241.       for i = 1, #Teams do
  242.         DrawPlayerText(i, 'Next Player');
  243.       end;
  244.     elseif (TimeToNextChange <= 9.5) then
  245.       for i = 1, #Teams do
  246.         DrawPlayerText(i, Teams[i].Players[PlayerChanges[NextPlayerChange].NextPlayer[i]].Name);
  247.       end;
  248.     elseif (TimeToNextChange <= 11) then
  249.       for i = 1, #Teams do
  250.         DrawPlayerText(i, 'Next Player');
  251.       end;
  252.     end
  253.  
  254.     if (TimeToNextChange <= 11) then
  255.       DrawCenterProgress(1 - TimeToNextChange/11);
  256.     end;
  257.   end;
  258. end