001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    import java.io.BufferedReader;
006    import java.io.InputStreamReader;
007    import java.nio.charset.Charset;
008    import java.util.ArrayList;
009    import java.util.List;
010    import java.util.Random;
011    import org.lwjgl.opengl.GL11;
012    
013    @SideOnly(Side.CLIENT)
014    public class GuiWinGame extends GuiScreen
015    {
016        /** Counts the number of screen updates. */
017        private int updateCounter = 0;
018    
019        /** List of lines on the ending poem and credits. */
020        private List lines;
021        private int field_73989_c = 0;
022        private float field_73987_d = 0.5F;
023    
024        /**
025         * Called from the main game loop to update the screen.
026         */
027        public void updateScreen()
028        {
029            ++this.updateCounter;
030            float var1 = (float)(this.field_73989_c + this.height + this.height + 24) / this.field_73987_d;
031    
032            if ((float)this.updateCounter > var1)
033            {
034                this.respawnPlayer();
035            }
036        }
037    
038        /**
039         * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
040         */
041        protected void keyTyped(char par1, int par2)
042        {
043            if (par2 == 1)
044            {
045                this.respawnPlayer();
046            }
047        }
048    
049        /**
050         * Respawns the player.
051         */
052        private void respawnPlayer()
053        {
054            this.mc.thePlayer.sendQueue.addToSendQueue(new Packet205ClientCommand(1));
055            this.mc.displayGuiScreen((GuiScreen)null);
056        }
057    
058        /**
059         * Returns true if this GUI should pause the game when it is displayed in single-player
060         */
061        public boolean doesGuiPauseGame()
062        {
063            return true;
064        }
065    
066        /**
067         * Adds the buttons (and other controls) to the screen in question.
068         */
069        public void initGui()
070        {
071            if (this.lines == null)
072            {
073                this.lines = new ArrayList();
074    
075                try
076                {
077                    String var1 = "";
078                    String var2 = "\u00a7f\u00a7k\u00a7a\u00a7b";
079                    short var3 = 274;
080                    BufferedReader var4 = new BufferedReader(new InputStreamReader(GuiWinGame.class.getResourceAsStream("/title/win.txt"), Charset.forName("UTF-8")));
081                    Random var5 = new Random(8124371L);
082                    int var6;
083    
084                    while ((var1 = var4.readLine()) != null)
085                    {
086                        String var7;
087                        String var8;
088    
089                        for (var1 = var1.replaceAll("PLAYERNAME", this.mc.session.username); var1.contains(var2); var1 = var7 + "\u00a7f\u00a7k" + "XXXXXXXX".substring(0, var5.nextInt(4) + 3) + var8)
090                        {
091                            var6 = var1.indexOf(var2);
092                            var7 = var1.substring(0, var6);
093                            var8 = var1.substring(var6 + var2.length());
094                        }
095    
096                        this.lines.addAll(this.mc.fontRenderer.listFormattedStringToWidth(var1, var3));
097                        this.lines.add("");
098                    }
099    
100                    for (var6 = 0; var6 < 8; ++var6)
101                    {
102                        this.lines.add("");
103                    }
104    
105                    var4 = new BufferedReader(new InputStreamReader(GuiWinGame.class.getResourceAsStream("/title/credits.txt"), Charset.forName("UTF-8")));
106    
107                    while ((var1 = var4.readLine()) != null)
108                    {
109                        var1 = var1.replaceAll("PLAYERNAME", this.mc.session.username);
110                        var1 = var1.replaceAll("\t", "    ");
111                        this.lines.addAll(this.mc.fontRenderer.listFormattedStringToWidth(var1, var3));
112                        this.lines.add("");
113                    }
114    
115                    this.field_73989_c = this.lines.size() * 12;
116                }
117                catch (Exception var9)
118                {
119                    var9.printStackTrace();
120                }
121            }
122        }
123    
124        private void func_73986_b(int par1, int par2, float par3)
125        {
126            Tessellator var4 = Tessellator.instance;
127            GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("%blur%/gui/background.png"));
128            var4.startDrawingQuads();
129            var4.setColorRGBA_F(1.0F, 1.0F, 1.0F, 1.0F);
130            int var5 = this.width;
131            float var6 = 0.0F - ((float)this.updateCounter + par3) * 0.5F * this.field_73987_d;
132            float var7 = (float)this.height - ((float)this.updateCounter + par3) * 0.5F * this.field_73987_d;
133            float var8 = 0.015625F;
134            float var9 = ((float)this.updateCounter + par3 - 0.0F) * 0.02F;
135            float var10 = (float)(this.field_73989_c + this.height + this.height + 24) / this.field_73987_d;
136            float var11 = (var10 - 20.0F - ((float)this.updateCounter + par3)) * 0.005F;
137    
138            if (var11 < var9)
139            {
140                var9 = var11;
141            }
142    
143            if (var9 > 1.0F)
144            {
145                var9 = 1.0F;
146            }
147    
148            var9 *= var9;
149            var9 = var9 * 96.0F / 255.0F;
150            var4.setColorOpaque_F(var9, var9, var9);
151            var4.addVertexWithUV(0.0D, (double)this.height, (double)this.zLevel, 0.0D, (double)(var6 * var8));
152            var4.addVertexWithUV((double)var5, (double)this.height, (double)this.zLevel, (double)((float)var5 * var8), (double)(var6 * var8));
153            var4.addVertexWithUV((double)var5, 0.0D, (double)this.zLevel, (double)((float)var5 * var8), (double)(var7 * var8));
154            var4.addVertexWithUV(0.0D, 0.0D, (double)this.zLevel, 0.0D, (double)(var7 * var8));
155            var4.draw();
156        }
157    
158        /**
159         * Draws the screen and all the components in it.
160         */
161        public void drawScreen(int par1, int par2, float par3)
162        {
163            this.func_73986_b(par1, par2, par3);
164            Tessellator var4 = Tessellator.instance;
165            short var5 = 274;
166            int var6 = this.width / 2 - var5 / 2;
167            int var7 = this.height + 50;
168            float var8 = -((float)this.updateCounter + par3) * this.field_73987_d;
169            GL11.glPushMatrix();
170            GL11.glTranslatef(0.0F, var8, 0.0F);
171            GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/title/mclogo.png"));
172            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
173            this.drawTexturedModalRect(var6, var7, 0, 0, 155, 44);
174            this.drawTexturedModalRect(var6 + 155, var7, 0, 45, 155, 44);
175            var4.setColorOpaque_I(16777215);
176            int var9 = var7 + 200;
177            int var10;
178    
179            for (var10 = 0; var10 < this.lines.size(); ++var10)
180            {
181                if (var10 == this.lines.size() - 1)
182                {
183                    float var11 = (float)var9 + var8 - (float)(this.height / 2 - 6);
184    
185                    if (var11 < 0.0F)
186                    {
187                        GL11.glTranslatef(0.0F, -var11, 0.0F);
188                    }
189                }
190    
191                if ((float)var9 + var8 + 12.0F + 8.0F > 0.0F && (float)var9 + var8 < (float)this.height)
192                {
193                    String var12 = (String)this.lines.get(var10);
194    
195                    if (var12.startsWith("[C]"))
196                    {
197                        this.fontRenderer.drawStringWithShadow(var12.substring(3), var6 + (var5 - this.fontRenderer.getStringWidth(var12.substring(3))) / 2, var9, 16777215);
198                    }
199                    else
200                    {
201                        this.fontRenderer.fontRandom.setSeed((long)var10 * 4238972211L + (long)(this.updateCounter / 4));
202                        this.fontRenderer.drawStringWithShadow(var12, var6, var9, 16777215);
203                    }
204                }
205    
206                var9 += 12;
207            }
208    
209            GL11.glPopMatrix();
210            GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("%blur%/misc/vignette.png"));
211            GL11.glEnable(GL11.GL_BLEND);
212            GL11.glBlendFunc(GL11.GL_ZERO, GL11.GL_ONE_MINUS_SRC_COLOR);
213            var4.startDrawingQuads();
214            var4.setColorRGBA_F(1.0F, 1.0F, 1.0F, 1.0F);
215            var10 = this.width;
216            int var13 = this.height;
217            var4.addVertexWithUV(0.0D, (double)var13, (double)this.zLevel, 0.0D, 1.0D);
218            var4.addVertexWithUV((double)var10, (double)var13, (double)this.zLevel, 1.0D, 1.0D);
219            var4.addVertexWithUV((double)var10, 0.0D, (double)this.zLevel, 1.0D, 0.0D);
220            var4.addVertexWithUV(0.0D, 0.0D, (double)this.zLevel, 0.0D, 0.0D);
221            var4.draw();
222            GL11.glDisable(GL11.GL_BLEND);
223            super.drawScreen(par1, par2, par3);
224        }
225    }