Advertisement
Guest User

Untitled

a guest
Apr 3rd, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #SingleInstance,Force
  2. global wb,Settings:=new XML("Settings")
  3. SetBatchLines,-1
  4. Defaults()
  5. Tetris:=new Tetris(),Tetris.Settings(),Tetris.Size:=20
  6. if(Tetris.XML.SSN("//hold"),Current:=Tetris.XML.EA("//current")){
  7.     if((ea:=Tetris.XML.EA("//hold")).Orientation)
  8.         Tetris.Tetrimino(ea.Piece,ea.Orientation,"Hold",ea.Color)
  9.     Run(Tetris.Tetrimino(Current.Piece,Current.Orientation,0,Current.Color)),Tetris.Score:=Tetris.XML.SSN("//score").text,Tetris.Lines:=Tetris.XML.SSN("//lines").text,Tetris.SetScore()
  10. }else
  11.     Run(Tetris.Tetrimino(Shape,Orientation))
  12. Tetris.FillQueue(Tetris.XML.SN("//queue"))
  13. /*
  14.     Random()
  15. */
  16. if((All:=Tetris.XML.SN("//dot")).length)
  17.     Tetris.Load(All)
  18. else
  19.     RegisterTetrimino(0,1)
  20. Rem:=Tetris.XML.SN("//queue")
  21. while(rr:=Rem.item[A_Index-1])
  22.     rr.ParentNode.RemoveChild(rr)
  23. EvalGhost(1)
  24. Tetris.Debug:=0
  25. if(Tetris.Debug)
  26.     Debug()
  27. /*
  28.     m(wb.Document.Body.OuterHtml)
  29. */
  30. Gui,Show
  31. RegisterTetrimino(0)
  32. SetTimer,Run,20
  33. return
  34. F3::
  35. Tetris.SetBoardWidth(Tetris.BoardWidth=400?200:400)
  36. return
  37. GuiEscape:
  38. GuiClose:
  39. /*
  40.     m("Disabled","time:.5")
  41.     ExitApp
  42. */
  43. SetTimer,Run,Off
  44. for a,b in Tetris.queue
  45.     Tetris.XML.Add("queue",{piece:b.Piece,orientation:b.Orientation,color:b.Color},,1)
  46. top:=Tetris.XML.SSN("//Board"),Tetrimino:=Tetris.CurrentTetrimino
  47. Tetris.XML.Add("current",{piece:Tetrimino.Piece,orientation:Tetrimino.Orientation,color:Tetrimino.Color})
  48. Tetris.XML.Add("score").text:=Tetris.Score,Tetris.XML.Add("lines").text:=Tetris.Lines
  49. if(Tetris.Hold.Orientation)
  50.     Tetris.XML.Add("hold",{piece:Tetris.Hold.Piece,orientation:Tetris.Hold.Orientation,color:Tetris.Hold.Color})
  51. for a,b in {width:Tetris.BoardWidth,height:Tetris.BoardHeight}
  52.     top.SetAttribute(a,b)
  53. Tetris.XML.Transform()
  54. Tetris.XML.Save()
  55. ExitApp
  56. return
  57. CheckHeld(Tetrimino){
  58.     static LastTick,Last:=[]
  59.     Tick:=A_TickCount,Controls:=Tetris.Controls
  60.     if(!Left:=GetKeyState(Controls.Left.Button,"P"))
  61.         Right:=GetKeyState(Controls.Right.Button,"P")
  62.     if(!Clockwise:=GetKeyState(Controls.Rotate_Clockwise.Button,"P"))
  63.         CounterClockwise:=GetKeyState(Controls.Rotate_CounterClockwise.Button,"P")
  64.     if(!Left&&!Right&&!Clockwise&&!CounterClockwise)
  65.         return Last:=[],LastTick:=Tick-70
  66.     if(Tick-LastTick<70&&LastTick)
  67.         return
  68.     Size:=Tetris.Size
  69.     if(Left||Right){
  70.         XPos:=[],YPos:=[],Sleep:=Controls[Left?"Left":"Right"]
  71.         for a,b in Tetrimino.For
  72.             x:=b.x,y:=b.y,YPos[y]:=1,XPos[x]:=1,YPos[y+Size]:=1,XPos[x+Size]:=1,Search.=" or (" (Left?"@x=" x-Size:"@x=" x+Size) " and (@y+" Size-1 ">=" y " and @y<='" y+Size-1 "'))"
  73.         if(!Tetris.XML.SSN("//dot[" Trim(Search," or ") "]")){
  74.             x:=Tetrimino.Position.x
  75.             if(Left){
  76.                 if(XPos.MinIndex()-Tetris.Size>=0)
  77.                     Tetrimino.Position.x:=x-Tetris.Size,Tetris.DrawTetrimino()
  78.             }else if(Right){
  79.                 if(XPos.MaxIndex()+Tetris.Size<=Tetris.BoardWidth)
  80.                     Tetrimino.Position.x:=x+Tetris.Size,Tetris.DrawTetrimino()
  81.             }LastTick:=Tick+(Last[Left?"Left":"Right"]?Sleep.Sleep:Sleep.FirstPressSleep)
  82.         }else
  83.             LastTick:=LastTick
  84.         EvalGhost()
  85.     }if(Clockwise||CounterClockwise){
  86.         Orientation:=Tetrimino.Orientation
  87.         if(Clockwise)
  88.             Orientation:=Orientation=4?1:Orientation+1
  89.         else
  90.             Orientation:=Orientation=1?4:Orientation-1
  91.         Shape:=Tetris.Tetriminos[Tetrimino.Piece,Orientation]
  92.         for a,b in Shape{
  93.             x:=Tetrimino.Position.x+b.1*Tetris.Size,y:=Tetrimino.Position.y+b.2*Tetris.Size
  94.             if(Tetris.XML.SSN("//dot[@x='" x "' and (@y>='" y "'and @y<='" y+Size "')]"))
  95.                 return LastTick:=Tick
  96.         }Tetrimino.Orientation:=Orientation,Tetris.DrawTetrimino(),Sleep:=Controls[Clockwise?"Rotate_Clockwise":"Rotate_CounterClockwise"],LastTick:=Tick+(Last.Up?Sleep.Sleep:Sleep.FirstPressSleep)
  97.         EvalGhost()
  98.     }Last:={Left:Left,Right:Right,Up:Up}
  99. }
  100. Class Tetris{
  101.     __New(){
  102.         this.Body:=[],this.Score:=[],this.XML:=New XML("Board"),this.Size:=20,this.x:=this.Size*4+20,this.y:=26,this.BoardWidth:=200,this.BoardHeight:=500,this.Items:=[],this.Controls:=[]
  103.         I:=[[[0,4],[1,4],[2,4],[3,4]],[[2,1],[2,2],[2,3],[2,4]],[[0,4],[1,4],[2,4],[3,4]],[[2,1],[2,2],[2,3],[2,4]]]
  104.         T:=[[[0,1],[1,1],[2,1],[1,2]],[[1,0],[0,1],[1,1],[1,2]],[[0,2],[1,2],[2,2],[1,1]],[[0,0],[0,1],[1,1],[0,2]]]
  105.         M:=[[[0,1],[1,1],[2,1],[0,2]],[[0,0],[1,0],[1,1],[1,2]],[[2,1],[0,2],[1,2],[2,2]],[[0,0],[0,1],[0,2],[1,2]]]
  106.         L:=[[[0,1],[1,1],[2,1],[2,2]],[[1,0],[1,1],[1,2],[0,2]],[[0,1],[0,2],[1,2],[2,2]],[[1,0],[2,0],[1,1],[1,2]]]
  107.         Z:=[[[0,2],[1,2],[1,1],[2,1]],[[0,0],[0,1],[1,1],[1,2]],[[0,2],[1,2],[1,1],[2,1]],[[0,0],[0,1],[1,1],[1,2]]]
  108.         S:=[[[0,1],[1,1],[1,2],[2,2]],[[1,0],[1,1],[0,1],[0,2]],[[0,1],[1,1],[1,2],[2,2]],[[1,0],[1,1],[0,1],[0,2]]]
  109.         O:=[[[0,0],[0,1],[1,0],[1,1]],[[0,0],[0,1],[1,0],[1,1]],[[0,0],[0,1],[1,0],[1,1]],[[0,0],[0,1],[1,0],[1,1]]]
  110.         this.Tetriminos:={1:I,2:T,3:L,4:M,5:Z,6:S,7:O},this.QueueCount:=4,this.Score:=0,this.Lines:=0,this.Board:=[]
  111.        
  112.         this.AllDots:=[]
  113.        
  114.         if(!this.Init){
  115.             Gui,Margin,0,0
  116.             Gui,+hwndMain -Caption -DPIScale
  117.             def:=this.FixIE(11)
  118.             Gui,Add,ActiveX,% "w500 h" this.BoardHeight+this.y+8 " vwb hwndIE",mshtml
  119.             this.Init:=1,this.FixIE(def),this.IEHWND:=IE,this.Main:=Main
  120.         }wb.Navigate("about:<html><script>onerror=function(event){return true;};onmessage=function(event){return false;};onclick=function(event){ahk_event('OnClick',event);};onchange=function(event){ahk_event('OnChange',event);};oninput=function(event){ahk_event('OnInput',event);};onprogresschange=function(event){ahk_event('OnProgressChange',event);};</script><body style='background-color:Black;margin:0px;'><div id='Settings' Style='Visibility:Hidden'></div><svg></svg></body></html>")
  121.         while(wb.ReadyState!=4)
  122.             Sleep,10
  123.         this.Main:=Main,this.IE:=wb,this.IE.Document.ParentWindow.ahk_event:=Tetris._Event.Bind(Tetris),this.Doc:=this.IE.Document,this.svg:=wb.Document.GetElementsByTagName("svg").item[0]
  124.         this.MainBorder:=this.CreateElementNS(this.svg,0,0,this.BoardWidth+1,this.BoardHeight+1)
  125.         ea:=this.XML.EA("//Board")
  126.         this.SetBoardWidth(ea.width?ea.width:this.BoardWidth)
  127.         this.CreateElementNS(this.svg,5,25,this.Size*4+4,this.Size*4+4).ID:="Hold"
  128.         this.Hotkeys:=[],this.QueueGraphics:=[],this.Queue:=[]
  129.         Loop,4
  130.             this.QueueGraphics.Push((Obj:=this.CreateElementNS(this.svg,this.x+this.BoardWidth+10,((A_Index-1)*this.Size*4)+25+(A_Index=1?0:(8*(A_Index-1))),this.Size*4+4,this.Size*4+4))),Obj.ID:="Queue" A_Index
  131.         this.CreateText(4,-12,"<center>Hold: Q</center>")
  132.         this.CreateText(4,200,"<center>Press Escape to Exit<br><br>Press F1 to Pause/Play<br><br>Press F3 to Change the Board Size<br><br>S to Drop Piece</center>")
  133.         this.CreateText(this.x+this.BoardWidth+10,-12,"<center>Queue:</center>","Left")
  134.         this.ScoreText:=this.CreateText(this.x,-12,"<font style='word-wrap:break-word'><center>Score: 0</center>",,this.BoardWidth)
  135.         Obj:=this.Ghost:=[],Obj.For:=[],Obj.Position:={x:0,y:0}
  136.         Loop,4{
  137.             this.Ghost.For.Push({obj:this.CreateElementNS(this.svg,0,0,this.Size,this.Size,"DarkGrey","black")})
  138.         }
  139.         return this
  140.         Hotkey:
  141.         Action:=Tetris.Hotkeys[A_ThisHotkey]
  142.         if(Action="Hold"){
  143.             if(Tetris.Swapped)
  144.                 return
  145.             if(!IsObject(Tetris.Hold)){
  146.                 Tetris.Hold:=Tetris.CurrentTetrimino,Tetris.DrawTetrimino(Tetris.Hold,0,"Hold"),Tetris.PullQueue(),Run(Tetris.CurrentTetrimino)
  147.             }else{
  148.                 Hold:=Tetris.Hold.Clone(),Tetris.DrawTetrimino(Tetris.Hold:=Tetris.CurrentTetrimino,0,"Hold")
  149.                 Hold.Position.x:=Floor(Tetris.BoardWidth/2),Hold.Position.y:=0
  150.                 Tetris.DrawTetrimino(Tetris.CurrentTetrimino:=Hold,1),Run(Tetris.CurrentTetrimino)
  151.             }Tetris.Swapped:=1,EvalGhost(1)
  152.         }else if(Action="Pause"){
  153.             Tetris.Play:=Tetris.Play?0:1
  154.             SetTimer,Run,% (Tetris.Play?"Off":40)
  155.         }else if(Action="Drop")
  156.             Tetris.CurrentTetrimino.Position.y:=Tetris.Ghost.Max-Tetris.Size
  157.         return
  158.     }
  159.     _Events(Name,Event){
  160.         Node:=Event.srcElement
  161.         m(Node.OuterHtml)
  162.     }CreateElementNS(Parent,x,y,w,h,Stroke:="blue",Fill:="",Type:="rect"){
  163.         Parent.AppendChild(Item:=wb.Document.CreateElementNS("http://www.w3.org/2000/svg",Type))
  164.         for a,b in {x:x,y:y,width:w,height:h,stroke:Stroke,fill:Fill}
  165.             if(b!="")
  166.                 Item.SetAttribute(a,b)
  167.         return Item
  168.     }CreateText(Left,Top,InnerHtml,Side:="Right",Width:="",Height:=""){
  169.         Width:=Width?Width:this.Size*4+4
  170.         p:=wb.Document.CreateElement("p"),p.InnerHtml:=InnerHtml,Style:=p.Style
  171.         for a,b in {Left:Left,top:Top,position:"absolute",color:"grey",width:Width,textshadow:"1px 1px 3px #cc00cc"}
  172.             Style[a]:=b
  173.         wb.Document.Body.AppendChild(p)
  174.         if(Side="Left")
  175.             this.QueueGraphics.Push(p)
  176.         return p
  177.     }DrawTetrimino(Tetrimino="",MoveTop:=0,Position:="",Stop:=0){
  178.         if(!Tetrimino)
  179.             Tetrimino:=this.CurrentTetrimino
  180.         Shape:=this.Tetriminos[Tetrimino.Piece,Tetrimino.Orientation],Pos:=[],Size:=this.Size
  181.         if(MoveTop||Position)
  182.             for a,b in Tetrimino.For
  183.                 b.Obj.SetAttribute("height",MoveTop?0:Size)
  184.         if(!MoveTop&&!Tetrimino.visibility)
  185.             Tetrimino.visibility:=1,Vis:=1
  186.         for a,b in Shape{
  187.             if(Position)
  188.                 x:=DrawX:=(Tetrimino.Position.x+b.1*Size),y:=DrawY:=(Tetrimino.Position.y+b.2*Size)
  189.             else
  190.                 x:=Tetrimino.Position.x+b.1*Size,DrawX:=x+this.x,y:=Tetrimino.Position.y+b.2*Size,DrawY:=y+this.y
  191.             Tet:=Tetrimino.For[A_Index]
  192.             Tet.Obj.SetAttribute("x",DrawX),Tet.Obj.SetAttribute("y",DrawY)
  193.             if(Vis)
  194.                 Tet.obj.SetAttribute("visibility","visible")
  195.             Pos["x",x]:=1,Pos["y",y]:=1
  196.             Tet.x:=x,Tet.y:=y
  197.             if(Tet.y<0&&!MoveTop&&!Position){
  198.                 Tet.Obj.SetAttribute("height",(Tet.Height:=Size+Tet.y))
  199.                 Tet.Obj.SetAttribute("y",this.y)
  200.             }else if(!Position&&Tet.y>=0&&!MoveTop&&Tet.Height<Size){
  201.                 Tet.Obj.SetAttribute("height",Size),Tet.Height:=Size
  202.             }
  203.         }if(Position="Ghost"){
  204.             /*
  205.                 Tetrimino.Pos:=Pos
  206.             */
  207.             return
  208.         }
  209.         if(Stop)
  210.             return
  211.         if(Position){
  212.             Hold:=wb.Document.GetElementById(Position),HoldPos:=[]
  213.             for a,b in ["x","y","width","height"]
  214.                 HoldPos[b]:=Hold.GetAttribute(b)
  215.             Width:=Pos.x.MaxIndex()-(x:=Pos.x.MinIndex())+this.Size
  216.             Height:=Pos.y.MaxIndex()-(y:=Pos.y.MinIndex())+this.Size
  217.             OPos:=Tetrimino.Position
  218.             OPos.y:=OPos.y-(y-(Floor((HoldPos.Height-Height)/2)+HoldPos.y))
  219.             OPos.x:=OPos.x-(x-(Floor((HoldPos.Width-Width)/2)+HoldPos.x))
  220.             this.DrawTetrimino(Tetrimino,0,"Hold",1)
  221.             return
  222.         }
  223.         Tetrimino.Pos:=Pos
  224.         if(MoveTop)
  225.             return Difference:=Pos.x.MaxIndex()-Pos.x.MinIndex(),x:=Tetrimino.Position.x,Tetrimino.Position.x:=x+(x-Pos.x.MinIndex())-Mod(Difference,this.Size)-this.Size,Tetrimino.Position.y-=(Pos.y.MaxIndex()+Size),this.DrawTetrimino()
  226.         if(Pos.x.MinIndex()<0)
  227.             Tetrimino.Position.x:=0,this.DrawTetrimino()
  228.         else if(Pos.x.MaxIndex()>(Width:=this.BoardWidth-Size))
  229.             Tetrimino.Position.x:=Tetrimino.Position.x-(Pos.x.MaxIndex()-Width),this.DrawTetrimino()
  230.     }FillQueue(All:=""){
  231.         for a,b in this.Queue
  232.             this.DrawTetrimino(b,0,"Queue" A_Index)
  233.         Loop,% this.QueueCount
  234.             if(!this.Queue[A_Index])
  235.                 ea:=XML.EA(All.item[A_Index-1]),this.Queue.Push(this.Tetrimino(ea.Piece,ea.Orientation,"Queue" A_Index,ea.Color))
  236.     }FixIE(Version=0){
  237.         static Key:="Software\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION",Versions:={7:7000,8:8888,9:9999,10:10001,11:11001}
  238.         Version:=Versions[Version]?Versions[Version]:Version
  239.         if(A_IsCompiled)
  240.             ExeName:=A_ScriptName
  241.         else
  242.             SplitPath,A_AhkPath,ExeName
  243.         RegRead,PreviousValue,HKCU,%Key%,%ExeName%
  244.         if(!Version)
  245.             RegDelete,HKCU,%Key%,%ExeName%
  246.         else
  247.             RegWrite,REG_DWORD,HKCU,%Key%,%ExeName%,%Version%
  248.         return PreviousValue
  249.     }Load(All){
  250.         Obj:=[],Obj.For:=[],Size:=this.Size
  251.         while(aa:=all.item[A_Index-1],ea:=XML.EA(aa)){
  252.             rect:=wb.Document.CreateElementNS("http://www.w3.org/2000/svg","rect")
  253.             for e,f in {x:ea.x+this.x,y:ea.y+this.y,width:Size,height:Size,stroke:"black",fill:"#" ea.Color}
  254.                 rect.SetAttribute(e,f),total.=ea.x "x" ea.y "`n"
  255.             Obj.For.Push({obj:rect,x:ea.x,y:ea.y,color:ea.color}),this.svg.AppendChild(rect)
  256.         }this.XML.XML.LoadXML("<Board/>"),RegisterTetrimino(Obj)
  257.     }PullQueue(){
  258.         Obj:=this.Queue.RemoveAt(1),Obj.Position.x:=Floor(this.BoardWidth/2),this.CurrentTetrimino:=Obj
  259.         Obj.Position.y:=0
  260.         this.FillQueue(),this.DrawTetrimino(Obj,1)
  261.         return Obj
  262.     }Tetrimino(Piece:="",Orientation:=1,Hold:=0,Color:=""){
  263.         Size:=this.Size?this.Size:20
  264.         if(!Piece){
  265.             Random,Piece,1,7
  266.             Random,Orientation,1,4
  267.         }if(!Hold)
  268.             Obj:=this.CurrentTetrimino:=[],Obj.For:=[]
  269.         else
  270.             Obj:=Hold="Hold"?this.Hold:=[]:Obj:=[],Obj.For:=[]
  271.         if(!Color)
  272.             Random,Color,222222,999999
  273.         Loop,4
  274.             rect:=this.CreateElementNS(this.svg,0,Size*-4,Size,Size,"black","#" Color),rect.SetAttribute("visibility",(Hold?"visible":"hidden")),Obj.For.Push({x:0,y:0,obj:rect,visibility:(Hold?1:0),color:Color})
  275.         Obj.Position:={x:(Hold?0:Floor(this.BoardWidth/2)),y:0},Obj.Piece:=Piece,Obj.Orientation:=Orientation,this.DrawTetrimino(Obj,Hold?0:1,Hold),obj.Color:=Color
  276.         return Obj
  277.     }Settings(){
  278.         static LastHotkeys:=[]
  279.         Hotkey,IfWinActive,% "ahk_id" this.Main
  280.         for a,b in LastHotkeys
  281.             Hotkey,%b%,Off
  282.         all:=Settings.SN("//*"),LastHotkeys:=[]
  283.         while(aa:=all.item[A_Index-1],ea:=XML.EA(aa)){
  284.             if(!aa.ChildNodes.Length){
  285.                 if(!IsObject(Obj:=this[aa.ParentNode.NodeName]))
  286.                     Obj:=this[aa.ParentNode.NodeName]:=[]
  287.                 Obj:=Obj[aa.Nodename]:=[]
  288.                 for a,b in ea{
  289.                     Obj[a]:=b
  290.                     if(a="Button"){
  291.                         Hotkey,%b%,DeadEnd,On
  292.                         LastHotkeys.Push(b)
  293.                     }if(aa.NodeName="Options"){
  294.                         Hotkey,%b%,Hotkey,On
  295.                         this.Hotkeys[b]:=a,LastHotkeys.Push(b)
  296.                     }
  297.                 }
  298.             }
  299.         }
  300.         return
  301.         DeadEnd:
  302.         return
  303.     }SetBoardWidth(Width){
  304.         static Flash
  305.         OWidth:=this.BoardWidth,this.BoardWidth:=Width
  306.         for a,b in {x:this.x-1,y:this.y-1,width:this.BoardWidth+2,height:this.BoardHeight+2,stroke:"blue"}
  307.             this.MainBorder.SetAttribute(a,b)
  308.         if((all:=this.XML.SN("//dot[@x>='" Width "']")).length){
  309.             SetTimer,Run,Off
  310.             Flash:=[]
  311.             while(aa:=all.item[A_Index-1],ea:=XML.EA(aa))
  312.                 Flash.Push({obj:this.Items[SSN(aa,"@id").text],ea:ea})
  313.             SetTimer,FlashLose,300
  314.             MsgBox,292,Tetris,You will lose the flashing items. Are you sure?
  315.             IfMsgBox,Yes
  316.             {
  317.                 SetTimer,FlashLose,Off
  318.                 while(aa:=all.item[A_Index-1])
  319.                     aa.ParentNode.RemoveChild(aa)
  320.                 for a,b in Flash
  321.                     b.Obj.ParentNode.RemoveChild(b.Obj)
  322.                 flash:=[],RegisterTetrimino(0)
  323.                 for a,b in this.QueueGraphics{
  324.                     if(A_Index<5)
  325.                         b.SetAttribute("x",this.x+this.BoardWidth+10),this.DrawTetrimino(this.Queue[a],0,"Queue" a)
  326.                     else
  327.                         b.Style.Left:=this.x+this.BoardWidth+10
  328.                 }Gui,Show,% "w" Width+200 " xCenter"
  329.             }else{
  330.                 this.BoardWidth:=OWidth
  331.                 for a,b in {x:this.x-1,y:this.y-1,width:this.BoardWidth+2,height:this.BoardHeight+2,stroke:"blue"}
  332.                     this.MainBorder.SetAttribute(a,b)
  333.                 SetTimer,FlashLose,Off
  334.                 for a,b in Flash{
  335.                     b.obj.SetAttribute("fill",b.ea.Color)
  336.                 }
  337.             }
  338.             SetTimer,Run,40
  339.             return
  340.             FlashLose:
  341.             Random,Random,111111,999999
  342.             for a,b in Flash
  343.                 b.Obj.SetAttribute("fill",Random)
  344.             return
  345.         }for a,b in this.QueueGraphics{
  346.             if(A_Index<5)
  347.                 b.SetAttribute("x",this.x+this.BoardWidth+10),this.DrawTetrimino(this.Queue[a],0,"Queue" a)
  348.             else
  349.                 b.Style.Left:=this.x+this.BoardWidth+10
  350.         }GuiControl,1:Move,% this.IEHWND,% "w" Width+200
  351.         Gui,Show,% "w" Width+200 " xCenter"
  352.     }SetScore(){
  353.         this.ScoreText.InnerHtml:="<font style='word-wrap:break-word'><center>Score:" this.Score " Lines: " this.Lines "</center>"
  354.     }
  355. }
  356. Class XML{
  357.     keep:=[]
  358.     __Get(x=""){
  359.         return this.XML.xml
  360.     }__New(param*){
  361.         if(!FileExist(A_ScriptDir "\lib"))
  362.             FileCreateDir,%A_ScriptDir%\lib
  363.         ;temp.preserveWhiteSpace:=1
  364.         root:=param.1,file:=param.2,file:=file?file:root ".xml",temp:=ComObjCreate("MSXML2.DOMDocument"),temp.SetProperty("SelectionLanguage","XPath"),this.xml:=temp,this.file:=file,XML.keep[root]:=this
  365.         if(FileExist(file)){
  366.             ;FileRead,info,%file%
  367.             ff:=FileOpen(file,"R","UTF-8"),info:=ff.Read(ff.Length),ff.Close()
  368.             if(info=""){
  369.                 this.xml:=this.CreateElement(temp,root)
  370.                 FileDelete,%file%
  371.             }else
  372.                 temp.LoadXML(info),this.xml:=temp
  373.         }else
  374.             this.xml:=this.CreateElement(temp,root)
  375.     }Add(XPath,Att:="",Text:="",Dup:=0){
  376.         Obj:=StrSplit(XPath,"/")
  377.         if(!Node:=this.SSN("//" XPath)){
  378.             for a,b in Obj
  379.                 (!Exist:=this.SSN("//" Trim(Build.=b "/","/")))?(Node:=(A_Index=1?this.SSN("//*"):Node).AppendChild(this.CreateElement(b))):(Node:=Exist)
  380.         }else if(Dup)
  381.             Node:=Node.ParentNode.AppendChild(this.CreateElement(Obj.Pop()))
  382.         for a,b in Att
  383.             Node.SetAttribute(a,b)
  384.         if(Text)
  385.             Node.Text:=Text
  386.         return Node
  387.     }CreateElement(doc,root:=""){
  388.         if(!root)
  389.             return this.SSN("//*").AppendChild(this.XML.CreateElement(doc))
  390.         return doc.AppendChild(this.XML.CreateElement(root)).ParentNode
  391.     }EA(XPath,att:=""){
  392.         list:=[]
  393.         if(att)
  394.             return XPath.NodeName?SSN(XPath,"@" att).text:this.SSN(XPath "/@" att).text
  395.         nodes:=XPath.NodeName?XPath.SelectNodes("@*"):nodes:=this.SN(XPath "/@*")
  396.         while(nn:=nodes.item[A_Index-1])
  397.             list[nn.NodeName]:=nn.text
  398.         return list
  399.     }Find(info*){
  400.         static last:=[]
  401.         doc:=info.1.NodeName?info.1:this.xml
  402.         if(info.1.NodeName)
  403.             node:=info.2,find:=info.3,return:=info.4!=""?"SelectNodes":"SelectSingleNode",search:=info.4
  404.         else
  405.             node:=info.1,find:=info.2,return:=info.3!=""?"SelectNodes":"SelectSingleNode",search:=info.3
  406.         if(InStr(info.2,"descendant"))
  407.             last.1:=info.1,last.2:=info.2,last.3:=info.3,last.4:=info.4
  408.         if(InStr(find,"'"))
  409.             return doc[return](node "[.=concat('" RegExReplace(find,"'","'," Chr(34) "'" Chr(34) ",'") "')]/.." (search?"/" search:""))
  410.         else
  411.             return doc[return](node "[.='" find "']/.." (search?"/" search:""))
  412.     }Get(XPath,Default){
  413.         text:=this.SSN(XPath).text
  414.         return text?text:Default
  415.     }ReCreate(XPath,new){
  416.         rem:=this.SSN(XPath),rem.ParentNode.RemoveChild(rem),new:=this.Add(new)
  417.         return new
  418.     }Save(x*){
  419.         if(x.1=1)
  420.             this.Transform()
  421.         if(this.XML.SelectSingleNode("*").xml="")
  422.             return m("Errors happened while trying to save " this.file ". Reverting to old version of the XML")
  423.         FileName:=this.file?this.file:x.1.1,ff:=FileOpen(FileName,"R"),text:=ff.Read(ff.length),ff.Close()
  424.         if(ff.encoding!="UTF-8")
  425.             FileDelete,%FileName%
  426.         if(!this[])
  427.             return m("Error saving the " this.file " XML.  Please get in touch with maestrith if this happens often")
  428.         if(!FileExist(FileName))
  429.             FileAppend,% this[],%FileName%,UTF-8
  430.         else if(text!=this[])
  431.             file:=FileOpen(FileName,"W","UTF-8"),file.Write(this[]),file.Length(file.Position),file.Close()
  432.     }SSN(XPath){
  433.         return this.XML.SelectSingleNode(XPath)
  434.     }SN(XPath){
  435.         return this.XML.SelectNodes(XPath)
  436.     }Transform(){
  437.         static
  438.         if(!IsObject(xsl))
  439.             xsl:=ComObjCreate("MSXML2.DOMDocument"),xsl.LoadXML("<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:output method='xml' indent='yes' encoding='UTF-8'/><xsl:template match='@*|node()'><xsl:copy>`n<xsl:apply-templates select='@*|node()'/><xsl:for-each select='@*'><xsl:text></xsl:text></xsl:for-each></xsl:copy>`n</xsl:template>`n</xsl:stylesheet>")
  440.         this.XML.TransformNodeToObject(xsl,this.xml)
  441.     }Under(under,node,att:="",text:="",list:=""){
  442.         new:=under.AppendChild(this.XML.CreateElement(node))
  443.         for a,b in att
  444.             new.SetAttribute(a,b)
  445.         for a,b in StrSplit(list,",")
  446.             new.SetAttribute(b,att[b])
  447.         if(text)
  448.             new.text:=text
  449.         return new
  450.     }
  451. }
  452. SSN(node,XPath){
  453.     return node.SelectSingleNode(XPath)
  454. }
  455. SN(node,XPath){
  456.     return node.SelectNodes(XPath)
  457. }
  458. Debug(){
  459.     static
  460.     if(!WinExist("ahk_id" HWND)){
  461.         Gui,2:Destroy
  462.         Gui,2:+hwndHWND
  463.         Gui,2:Color,0,0
  464.         Gui,2:Add,Edit,w500 h1000 c0x00ff00
  465.         Gui,2:Show,x0 y0 NA,Debug
  466.     }
  467. }
  468. Defaults(){
  469.     if(!Settings.SSN("//Controls/Left"))
  470.         for a,b in {Left:"Left",Right:"Right",Rotate_Clockwise:"Up",Rotate_CounterClockwise:"w"}{
  471.             for c,d in {FirstPressSleep:100,Sleep:0,Button:b}
  472.                 Settings.Add("Controls/" a,{(c):d}),Updated:=1
  473.         }
  474.     if(!Settings.SSN("//Options"))
  475.         Settings.Add("Options",{Pause:"F1",Hold:"q",Drop:"s"}),Updated:=1
  476.     if(Updated){
  477.         Settings.Save(1)
  478.     }
  479. }
  480. m(x*){
  481.     active:=WinActive("A")
  482.     ControlGetFocus,Focus,A
  483.     ControlGet,hwnd,hwnd,,%Focus%,ahk_id%active%
  484.     static list:={btn:{oc:1,ari:2,ync:3,yn:4,rc:5,ctc:6},ico:{"x":16,"?":32,"!":48,"i":64}},msg:=[],msgbox
  485.     list.title:="Tetris",list.def:=0,list.time:=0,value:=0,msgbox:=1,txt:=""
  486.     for a,b in x
  487.         obj:=StrSplit(b,":"),(vv:=List[obj.1,obj.2])?(value+=vv):(list[obj.1]!="")?(List[obj.1]:=obj.2):txt.=b "`n"
  488.     msg:={option:value+262144+(list.def?(list.def-1)*256:0),title:list.title,time:list.time,txt:txt}
  489.     Sleep,120
  490.     MsgBox,% msg.option,% msg.title,% msg.txt,% msg.time
  491.     msgbox:=0
  492.     for a,b in {OK:value?"OK":"",Yes:"YES",No:"NO",Cancel:"CANCEL",Retry:"RETRY"}
  493.         IfMsgBox,%a%
  494.     {
  495.         WinActivate,ahk_id%active%
  496.         ControlFocus,%Focus%,ahk_id%active%
  497.         return b
  498.     }
  499. }
  500. Random(){
  501.     Size:=Tetris.Size,CountW:=Floor(Tetris.BoardWidth/Size)+1,StartY:=200,Tetris.CurrentTetrimino:=[],Tetris.CurrentTetrimino.For:=[]
  502.     While(StartY<Tetris.BoardHeight){
  503.         Random,Color,222222,999999
  504.         StartX:=0
  505.         While(Mod(A_Index,CountW)){
  506.             if(StartX=120){
  507.                 Startx+=Size
  508.                 Continue
  509.             }
  510.             rect:=wb.Document.CreateElementNS("http://www.w3.org/2000/svg","rect")
  511.             for e,f in {x:StartX+Tetris.x,y:StartY+Tetris.y,width:Size,height:Size,stroke:"black",fill:"#" Color}
  512.                 rect.SetAttribute(e,f)
  513.             Tetris.CurrentTetrimino.For.Push({obj:rect,x:StartX,y:StartY}),Tetris.svg.AppendChild(rect)
  514.             /*
  515.                 Obj:=Tetris.CurrentTetrimino[Tetris.CurrentTetrimino.MaxIndex()],Obj.x:=StartX,Obj.y:=StartY
  516.             */
  517.             StartX+=Size
  518.             Index++
  519.         }
  520.         StartY+=Size
  521.     }
  522.     RegisterTetrimino(Tetris.CurrentTetrimino)
  523. }
  524. RegisterTetrimino(Tetrimino,Stop:=0){
  525.     static init:=0,ID:=0
  526.     for a,b in Tetrimino.For{
  527.         xx:=Tetris.XML,Root:=xx.SSN("//*")
  528.         if(!Node:=xx.SSN("//row[@y='" b.y "']")){
  529.             Node:=xx.Add("row",{y:b.y},,1)
  530.             all:=Tetris.XML.SN("//row"),Order:=[]
  531.             while(aa:=all.item[A_Index-1])
  532.                 Order[SSN(aa,"@y").text]:=aa
  533.             for c,d in Order
  534.                 d.ParentNode.AppendChild(d)
  535.         }New:=xx.Under(Node,"dot",{x:b.x,y:b.y,id:++ID,color:b.Color}),Tetris.Items[ID]:=b.Obj
  536.        
  537.         Tetris.AllDots[b.x,b.y]:=b.Obj
  538.        
  539.     }Size:=Tetris.Size,Tetris.Board:=[],StartX:=0
  540.     Size:=Tetris.Size,Remove:=[],all:=Tetris.XML.SN("//dot[not(@y=preceding-sibling::dot/@y)]/@y")
  541.     Add:=0,MoveDown:=[],xx:=Tetris.XML,Count:=Floor(Tetris.BoardWidth/Size)
  542.     while(aa:=all.item[All.Length-A_Index]){
  543.         More:=xx.SN("//dot[@y='" aa.text "' and not(.=(preceding-sibling::*/@x))]")
  544.         if(More.Length=Count)
  545.             Add+=Size,Remove.Push(More.Item[0].ParentNode)
  546.         else{
  547.             Subtract:=SN(More.item[0].ParentNode,"descendant-or-self::*[@y]")
  548.             while(ss:=Subtract.item[A_Index-1])
  549.                 ss.SetAttribute("y",SSN(ss,"@y").text+Add)
  550.             MoveDown.Push(More.Item[0].ParentNode)
  551.         }
  552.     }Flash:=[]
  553.     for a,b in Remove{
  554.         all:=SN(b,"dot")
  555.         while(aa:=all.item[A_Index-1],ea:=XML.EA(aa))
  556.             Flash.Push(Tetris.Items[ea.ID])
  557.         b.ParentNode.RemoveChild(b)
  558.     }
  559.     if(Flash.1){
  560.         Loop,10{
  561.             Random,Color,111111,999999
  562.             for a,b in Flash
  563.                 b.SetAttribute("fill",Color)
  564.             Sleep,50
  565.         }for a,b in Flash
  566.             b.ParentNode.RemoveChild(b)
  567.         for a,b in MoveDown{
  568.             list.=a "`n"
  569.             all:=SN(b,"dot")
  570.             while(aa:=all.item[A_Index-1],ea:=XML.EA(aa)){
  571.                 Tetris.Items[ea.ID].SetAttribute("y",ea.y+Tetris.y)
  572.             }
  573.         }
  574.     }
  575.     if(Tetris.Debug=1){
  576.         xx.Transform()
  577.         GuiControl,2:,Edit1,% xx[]
  578.     }else if(Tetris.Debug=2){
  579.         for a,b in Tetris.AllDots
  580.             for c,d in b
  581.                 list.=a " = " c " x " d " - "  "`r`n"
  582.         GuiControl,2:,Edit1,%List%
  583.     }if(Lines:=Floor(Add/Size))
  584.         Tetris.Score+=Lines*(Floor(Tetris.BoardWidth/Size)*(Lines=4?20:10)),Tetris.Lines+=Lines,Tetris.SetScore()
  585.     /*
  586.         while(StartX<=Tetris.BoardWidth-Size)
  587.             Val:=Tetris.XML.SSN("//dot[@x='" StartX "' and not(@y>@y)][1]/@y").text,Val:=Val?Val:Tetris.BoardHeight,Tetris.Board[StartX]:=Val,StartX+=Size
  588.     */
  589. }
  590. Run(Tet:=""){
  591.     static Count:=0,Tetrimino,Jitter:=0,JitterTotal:=0
  592.     if(Tet)
  593.         return Tetrimino:=Tet
  594.     Tetris.DrawTetrimino(),Size:=Tetris.Size
  595.     CheckHeld(Tetrimino)
  596.     for a,b in Tetrimino.For
  597.         Search.=" or (@y='" b.y+Size "' and @x='" b.x "')"
  598.     All:=Tetris.XML.SSN("//dot[" Trim(Search," or ") "]"),Count++
  599.     if(All){
  600.         if(Count=1){
  601.             FileDelete,Board.xml
  602.             if(m("Final Score: " Tetris.Score,"Lines: " Tetris.Lines,"btn:ync")="Yes")
  603.                 Reload
  604.             ExitApp
  605.         }return RegisterTetrimino(Tetrimino),Tetris.Swapped:=0,Count:=0,Tetrimino:=Tetris.PullQueue(),EvalGhost(1)
  606.     }
  607.     Max:=Tetris.BoardHeight-Size,MaxY:=Tetrimino.Pos.y.MaxIndex()
  608.     if(GetKeyState("Down","P")){
  609.         Sub:=Mod(MaxY,Tetris.Size)
  610.         y:=MaxY+Size-Sub<Max?Size-Sub:Max-MaxY
  611.     }else if(MaxY<=Max)
  612.         y:=Max-MaxY>1?1:Max-MaxY
  613.     if(MaxY>=Max)
  614.         return RegisterTetrimino(Tetrimino),Tetris.Swapped:=0,Count:=0,Tetrimino:=Tetris.PullQueue(),EvalGhost(1)
  615.     Tetrimino.Position.y+=y
  616. }
  617. t(x*){
  618.     for a,b in x
  619.         msg.=b "`n"
  620.     ToolTip,%msg%
  621. }
  622. EvalGhost(Color:=0){
  623.     Tetrimino:=Tetris.CurrentTetrimino,Size:=Tetris.Size,Ghost:=Tetris.Ghost,Max:=0,Shape:=Tetris.Tetriminos[Tetrimino.Piece,Tetrimino.Orientation],Search:=[]
  624.     Tetris.Board:=[]
  625.     for a in Tetrimino.Pos.x{
  626.         Val:=Tetris.XML.SSN("//dot[@x='" a "' and @y>'" Tetrimino.Position.y "' and not(@y>@y)][1]/@y").text
  627.         Val:=Val?Val:Tetris.BoardHeight
  628.         Tetris.Board[a]:=Val
  629.     }
  630.     for a,b in Tetrimino.For
  631.         Max:=Max<Tetris.Board[b.x]?Tetris.Board[b.x]:Max
  632.     while(Max>0){
  633.         for a,b in Shape{
  634.             x:=Tetrimino.Position.x+b.1*Size,y:=Max+b.2*Size
  635.             if(Tetris.Board[x]<y){
  636.                 Max-=Size
  637.                 Break
  638.             }if(a=4)
  639.                 Break,2
  640.     }}Ghost:=Tetris.Ghost,Ghost.Position.y:=Max+(Tetris.y-Size),Ghost.Position.x:=Tetrimino.Position.x+Tetris.x,Ghost.Piece:=Tetrimino.Piece,Ghost.Orientation:=Tetrimino.Orientation,Tetris.DrawTetrimino(Tetris.Ghost,0,"Ghost")
  641.     if(Color)
  642.         for a,b in Ghost.For
  643.             b.Obj.SetAttribute("fill",Tetrimino.Color),b.Obj.SetAttribute("fill-opacity",.2)
  644.     Ghost.Max:=Max
  645. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement