xXm0dzXx

MineCeption Tew Point Oh Beta

Sep 1st, 2013
443
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 15.89 KB | None | 0 0
  1. --- xXm0dzXx Default Programming API ---
  2. -- All my programs will have this :DD --
  3. ----------------------------------------
  4.  
  5. if not term.isColor() then
  6.     error("You need a advanced compootah to play dis game!")
  7. end
  8.  
  9. local x,y = term.getSize()
  10.  
  11. local function cPrint( txt ) --Version 2.0 of cPrint
  12.     local function printC( text )
  13.         x2,y2 = term.getCursorPos()
  14.         term.setCursorPos(math.ceil((x / 2) - (text:len() / 2)), y2)
  15.         write(text.. "\n")
  16.     end
  17.    
  18.     if type(txt) == "string" then
  19.         printC( txt )
  20.     elseif type(txt) == "table" then
  21.         for i=1,#txt do
  22.             printC( txt[i] )
  23.         end
  24.     end
  25. end
  26.  
  27. local drawingBoard = {
  28.     ["A"] = colors.white,
  29.     ["B"] = colors.orange,
  30.     ["C"] = colors.magenta,
  31.     ["D"] = colors.lightBlue,
  32.     ["E"] = colors.yellow,
  33.     ["F"] = colors.lime,
  34.     ["G"] = colors.pink,
  35.     ["H"] = colors.gray,
  36.     ["I"] = colors.lightGray,
  37.     ["J"] = colors.cyan,
  38.     ["K"] = colors.purple,
  39.     ["L"] = colors.blue,
  40.     ["M"] = colors.brown,
  41.     ["N"] = colors.green,
  42.     ["O"] = colors.red,
  43.     ["P"] = colors.black,
  44. }
  45.  
  46. local function advWrite( pos1, pos2, str )
  47.     for i=1,#str do
  48.         local symb = drawingBoard[ string.sub( str, i, i) ]
  49.         term.setCursorPos( pos1 + (i-1) , pos2 )
  50.         if symb then
  51.             term.setBackgroundColour( symb )
  52.             write(" ")
  53.         end
  54.     end
  55. end
  56.  
  57. local function setBG( col, colz )
  58.     term.setBackgroundColour( col )
  59.     term.clear()
  60.     term.setCursorPos(1,1)
  61.     term.setTextColour( colz )
  62. end
  63.  
  64. local function getLines( path )
  65.     local tLines = {}
  66.     local file = fs.open( path, "r" )
  67.     if file then
  68.         line = file.readLine()
  69.         while line do
  70.             tLines[ #tLines+1 ] = line
  71.             line = file.readLine()
  72.         end
  73.         file.close()
  74.     end
  75.    
  76.     return tLines
  77. end
  78.  
  79. -- End of API --
  80.  
  81. local playedIntro = false
  82.  
  83. local skipIntro = false
  84. local _sIntro = 0
  85.  
  86. function introSleep( timah )
  87.     if skipIntro ~= true then -- theres also == false and not skipIntro
  88.         dahtim = os.startTimer(timah)
  89.        
  90.         event, key = os.pullEvent()
  91.         if event == "key" then
  92.             if key ~= 1 then
  93.                 skipIntro = true
  94.             end
  95.         end
  96.     end
  97. end
  98.  
  99. function slideUp()
  100.     local x,y = term.getSize()
  101.     term.scroll(1)
  102.     term.setCursorPos( 1, y-1 )
  103.     for i=1,x do
  104.         write("-")
  105.     end
  106.  
  107.     introSleep(0)
  108.     for i=1,y do
  109.         term.scroll(1)
  110.         introSleep(0)
  111.     end
  112.    
  113.     for i=1,y * 3 do
  114.         term.scroll(1)
  115.         for i=1, math.random(1, 3) do
  116.             if math.random( 1, 3 ) == 3 then
  117.                 term.setCursorPos( math.random( 1, x ), y )
  118.                 term.setTextColour( colors.white )
  119.                 write("*")
  120.             end
  121.         end
  122.        
  123.         introSleep(0)
  124.     end
  125.    
  126.    
  127.     for i=1,y*2 do
  128.         term.setBackgroundColour( colors.blue )
  129.         term.scroll(1)
  130.        
  131.         if i <= y / 2 then
  132.             for i=1, math.random(1, 3) do
  133.                 if math.random( 1, 5 ) == 3 then
  134.                     term.setCursorPos( math.random( 1, x ), y )
  135.                     term.setTextColour( colors.white )
  136.                     write("*")
  137.                 end
  138.             end
  139.         end
  140.        
  141.         introSleep(0)
  142.     end
  143.    
  144.     for i=1,y*4-(y-3) do
  145.         if i == y*3 then
  146.             term.setBackgroundColour( colors.green )
  147.         elseif i == y*3 + 1 then
  148.             term.setBackgroundColour( colors.brown )
  149.         elseif i >= y*3 + 2 then
  150.             term.setBackgroundColour( colors.gray )
  151.         else
  152.             term.setBackgroundColour( colors.lightBlue )
  153.         end
  154.        
  155.         term.scroll(1)
  156.        
  157.         if i == y*2-1 and not playedIntro then
  158.             term.setTextColour( colors.white )
  159.             term.setCursorPos(1, y)
  160.             textutils.slowWrite("CCF11 Presents...")
  161.             sleep(0.5)
  162.         end
  163.        
  164.         if i >= y*2 and i <= y*3 - 14 then
  165.             for i=1, math.random(3, 8) do
  166.                 if math.random( 1, 3 ) == 3 then
  167.                     local cloudLength = math.random(2,4)
  168.                     term.setCursorPos( math.random( 1, x-cloudLength ), y )
  169.                     term.setBackgroundColour( colors.white )
  170.                     write( string.rep(" ", cloudLength) )
  171.                 end
  172.             end
  173.            
  174.             if skipIntro and not playedIntro then
  175.                 sleep(0)
  176.             end
  177.         end
  178.        
  179.         introSleep(0)
  180.     end
  181. end
  182.  
  183. function drawMenu()
  184.     slideUp()
  185.     playedIntro = true
  186.     skipIntro = true
  187.     term.setBackgroundColour( colors.lightBlue )
  188.     term.setTextColour( colors.white )
  189.     term.setCursorPos( 1, y/2 - 3 )
  190.     cPrint("Mine-Ception 2.0")
  191.     print()
  192.     term.setBackgroundColour( colors.lightGray )
  193.     cPrint(" Edit Profile ")
  194.     print()
  195.     term.setBackgroundColour( colors.lightGray )
  196.     cPrint(" SinglePlayer ")
  197.     print()
  198.     cPrint(" Multi-Player ")
  199.     print()
  200. end
  201.  
  202. term.setBackgroundColour( colors.black )
  203.  
  204. if not fs.exists(".m-ception") then
  205.     fs.makeDir(".m-ception")
  206.     file = fs.open(".m-ception/profile", "w")
  207.     file.writeLine( colors.orange )
  208.     file.writeLine( colors.white )
  209.     file.writeLine(" ")
  210.     file.writeLine( colors.cyan )
  211.     file.writeLine( colors.white )
  212.     file.writeLine(" ")
  213.     file.close()
  214. end
  215.  
  216. drawMenu()
  217.  
  218. local _x = 1
  219. local _y = y-4
  220.  
  221. function drawPlayer( x, y )
  222.     term.setCursorPos( x, y-1 )
  223.    
  224.     file = fs.open(".m-ception/profile", "r")
  225.    
  226.     term.setBackgroundColour( tonumber( file.readLine() ) )
  227.     term.setTextColour( tonumber( file.readLine() ) )
  228.    
  229.     write( file.readLine() )
  230.    
  231.     term.setCursorPos( x, y )
  232.    
  233.     term.setBackgroundColour( tonumber( file.readLine() ) )
  234.     term.setTextColour( tonumber( file.readLine() ) )
  235.    
  236.     write( file.readLine() )
  237.    
  238.     file.close()
  239. end
  240.  
  241. function mainMenu()
  242.     _x = 1
  243.     _y = y-4
  244.  
  245.     _cloudz = os.startTimer(3)
  246.     _player = os.startTimer(math.random(0,2))
  247.  
  248.     _gravity = os.startTimer(0)
  249.     playerDragTimer = nil
  250.  
  251.     local dragPlayer = false
  252.  
  253.     while true do
  254.         drawPlayer( 3 + _x, _y )
  255.        
  256.         local event, key, p1, p2 = os.pullEvent()
  257.        
  258.         if event == "timer" then
  259.             if key == _cloudz then
  260.                 drawMenu()
  261.                 _cloudz = os.startTimer(3)
  262.             elseif key == _player then
  263.                 if not dragPlayer then
  264.                     term.setBackgroundColour( colors.lightBlue )
  265.                    
  266.                     term.setCursorPos( _x + 3, _y )
  267.                     write(" ")
  268.                    
  269.                     term.setCursorPos( _x + 3, _y-1 )
  270.                     write(" ")
  271.                    
  272.                     _x = _x + math.random(-1, 1)
  273.                 end
  274.                 _player = os.startTimer(math.random(0,2))
  275.             elseif key == playerDragTimer then
  276.                 dragPlayer = false
  277.             elseif key == _gravity then
  278.                 if not dragPlayer then
  279.                     if _y < y-4 then
  280.                         term.setCursorPos( _x + 3, _y )
  281.                         term.setBackgroundColour( colors.lightBlue )
  282.                         write(" ")
  283.                        
  284.                         term.setCursorPos( _x + 3, _y-1 )
  285.                         write(" ")
  286.                         _y = _y +1
  287.                     end
  288.                 end
  289.                
  290.                 _gravity = os.startTimer(0)
  291.             end
  292.         elseif event == "mouse_click" then
  293.             if key == 1 then
  294.                 if p1 == 3 + _x and p2 == _y -1 then
  295.                     dragPlayer = true
  296.                 else
  297.                     dragPlayer = false
  298.                     if p2 == y-11 then
  299.                         profileEditor( true )
  300.                     elseif p2 == y-9 then
  301.                         singlePlayer()
  302.                     elseif p2 == y-7 then
  303.                        
  304.                     end
  305.                 end
  306.             end
  307.         elseif event == "mouse_drag" then
  308.             if dragPlayer then
  309.                 term.setCursorPos( _x + 3, _y )
  310.                 term.setBackgroundColour( colors.lightBlue )
  311.                 write(" ")
  312.                
  313.                 term.setCursorPos( _x + 3, _y-1 )
  314.                 write(" ")
  315.                
  316.                 _x = p1 - 3
  317.                 _y = p2
  318.                 playerDragTimer = os.startTimer( 0.5 )
  319.             end
  320.         end
  321.     end
  322. end
  323.  
  324. idonteven = nil
  325.  
  326. function singlePlayer()
  327.     fs.makeDir(".m-ception/saves")
  328.     term.setBackgroundColour( colors.gray )
  329.     for i=1,y do
  330.         term.scroll(1)
  331.         sleep(0)
  332.     end
  333.    
  334.     term.setTextColour( colors.white )
  335.     term.setCursorPos(1,2)
  336.     cPrint("SinglePlayer")
  337.     term.setBackgroundColour( colors.lightGray )
  338.     print()
  339.     cPrint(" World 1 ")
  340.     print()
  341.     cPrint(" World 2 ")
  342.     print()
  343.     cPrint(" World 3 ")
  344.     print()
  345.     cPrint(" World 4 ")
  346.     print()
  347.     cPrint(" World 5 ")
  348.     term.setCursorPos(1, y-1)
  349.     cPrint("Back To Main Menu")
  350.    
  351.     while true do
  352.         local event, key, p1, p2 = os.pullEvent()
  353.         if event == "mouse_click" then
  354.             if key == 1 then
  355.                 if p2 == 2 then
  356.                     term.setCursorPos(1, 2)
  357.                     term.setBackgroundColour( colors.gray )
  358.                     cPrint("*Cough* Loner")
  359.                     idonteven = os.startTimer(0.3)
  360.                 elseif p2 == 4 then
  361.                     loadWorld("world_1")
  362.                 elseif p2 == 6 then
  363.                     loadWorld("world_2")
  364.                 elseif p2 == 8 then
  365.                     loadWorld("world_3")
  366.                 elseif p2 == 10 then
  367.                     loadWorld("world_4")
  368.                 elseif p2 == 12 then
  369.                     loadWorld("world_5")
  370.                 elseif p2 == y-1 then
  371.                     drawMenu()
  372.                     mainMenu()
  373.                 end
  374.             end
  375.         elseif event == "timer" and key == idonteven then
  376.             term.setCursorPos(1, 2)
  377.             term.setBackgroundColour( colors.gray )
  378.             term.clearLine()
  379.             cPrint("SinglePlayer")
  380.         end
  381.     end
  382. end
  383.  
  384. local selection = 1
  385.  
  386. function b( num )
  387.     term.setCursorPos( 11, 1 + num )
  388.    
  389.     if num == selection then
  390.         write("[x] ")
  391.     else
  392.         write("[ ] ")
  393.     end
  394. end
  395.  
  396. function saveChar( p1, p2, p3, p4, p5, p6 )
  397.     fs.delete(".m-ception/profile")
  398.     file = fs.open(".m-ception/profile", "w")
  399.     file.writeLine( p1 )
  400.     file.writeLine( p2 )
  401.     file.writeLine( p3 )
  402.     file.writeLine( p4 )
  403.     file.writeLine( p5 )
  404.     file.writeLine( p6 )
  405.     file.close()
  406. end
  407.  
  408. local s1 = 0
  409. local s2 = 0
  410. local s3 = 0
  411. local s4 = 0
  412.  
  413. function profileEditor( scrol )
  414.     if scrol then
  415.         selection = 1
  416.         term.setBackgroundColour( colors.gray )
  417.         for i=1,y do
  418.             term.scroll(1)
  419.             sleep(0)
  420.         end
  421.     end
  422.    
  423.     for i=2, 8 do
  424.         for j=y/2-3, y/2+2 do
  425.             term.setCursorPos(i, j)
  426.             term.setBackgroundColour( colors.lightBlue )
  427.             if j == y/2+1 then
  428.                 term.setBackgroundColour( colors.green )
  429.             elseif j == y/2+2 then
  430.                 term.setBackgroundColour( colors.brown )
  431.             end
  432.            
  433.             write(" ")
  434.            
  435.         end
  436.     end
  437.    
  438.     term.setCursorPos(2, y/2+4)
  439.     term.setBackgroundColour( colors.lightGray )
  440.     term.setTextColour( colors.white )
  441.     write(" Leave ")
  442.    
  443.     drawPlayer( 5, y/2 )
  444.    
  445.     for i=11, x-1 do
  446.         for j=2, y-1 do
  447.             term.setCursorPos(i, j)
  448.             term.setBackgroundColour( colors.lightGray )
  449.             write(" ")
  450.         end
  451.     end
  452.    
  453.     term.setTextColor( colours.white )
  454.    
  455.    
  456.     file = fs.open(".m-ception/profile", "r")
  457.    
  458.     local skinColor = ( tonumber( file.readLine() ) )
  459.     local charColor1 = ( tonumber( file.readLine() ) )
  460.    
  461.     local skinChar = ( file.readLine() )
  462.    
  463.     local shirtColor = ( tonumber( file.readLine() ) )
  464.     local charColor2 = ( tonumber( file.readLine() ) )
  465.    
  466.     local shirtChar = ( file.readLine() )
  467.    
  468.     file.close()
  469.    
  470.     b(1)
  471.     print("Head Char        | " ..skinChar)
  472.     b(2)
  473.     print("Skin Color       | " ..skinColor)
  474.     b(3)
  475.     print("Shirt Color      | " ..shirtColor)
  476.     b(4)
  477.     print("Shirt Char       | " ..shirtChar)
  478.     b(5)
  479.     print("Head Char Color  | " ..charColor1)
  480.     b(6)
  481.     print("Shirt Char Color | " ..charColor2)
  482.     b(7)
  483.     print("Randomize Color  | ")
  484.     local xx, yy = term.getCursorPos()
  485.     term.setCursorPos( 11, yy   )
  486.     term.setBackgroundColour( colors.gray )
  487.     write( string.rep( " ", x-11 ) )
  488.     term.setCursorPos( 11, yy+1 )
  489.     write( string.rep( " ", x-11 ) )
  490.     term.setCursorPos( 11, yy+1 )
  491.     write("Description")
  492.     term.setBackgroundColour( colors.lightGray )
  493.     term.setCursorPos( 11, yy+2 )
  494.     print("Descriptions coming soon...")
  495.    
  496.     while true do
  497.         event, key, p1, p2 = os.pullEvent()
  498.        
  499.         if event == "char" or event == "key" then
  500.             if event == "char" and (selection == 1 or selection == 4) then
  501.                 if selection == 1 then
  502.                     skinChar = key
  503.                 elseif selection == 4 then
  504.                     shirtChar = key
  505.                 end
  506.                
  507.                 saveChar( skinColor, charColor1, skinChar, shirtColor, charColor2, shirtChar )
  508.             else
  509.                 if key == keys.up then
  510.                     if selection ~= 1 then
  511.                         selection = selection -1
  512.                     end
  513.                 elseif key == keys.down then
  514.                     if selection ~= 7 then
  515.                         selection = selection +1
  516.                     end
  517.                 elseif key == keys.enter then
  518.                     if selection == 7 then
  519.                         fs.delete(".m-ception/profile")
  520.                        
  521.                         file = fs.open(".m-ception/profile", "w")
  522.                         file.writeLine( 2^math.random(1,15) )
  523.                         file.writeLine( 2^math.random(1,15) )
  524.                         file.writeLine(skinChar)
  525.                         file.writeLine( 2^math.random(1,15) )
  526.                         file.writeLine( 2^math.random(1,15) )
  527.                         file.writeLine(shirtChar)
  528.                         file.close()
  529.                     end
  530.                 elseif key == keys.left then
  531.                     if selection == 2 then
  532.                         if s1 ~= 0 then
  533.                             s1 = s1 -1
  534.                         end
  535.                        
  536.                         saveChar( 2 ^ s1, charColor1, skinChar, shirtColor, charColor2, shirtChar )
  537.                     elseif selection == 5 then
  538.                         if s2 ~= 0 then
  539.                             s2 = s2 -1
  540.                         end
  541.                        
  542.                         saveChar( skinColor, 2 ^ s2, skinChar, shirtColor, charColor2, shirtChar )
  543.                     elseif selection == 3 then
  544.                         if s3 ~= 0 then
  545.                             s3 = s3 -1
  546.                         end
  547.                        
  548.                         saveChar( skinColor, charColor1, skinChar, 2 ^ s3, charColor2, shirtChar )
  549.                     elseif selection == 6 then
  550.                         if s4 ~= 0 then
  551.                             s4 = s4 -1
  552.                         end
  553.                        
  554.                         saveChar( skinColor, charColor1, skinChar, shirtColor, 2 ^ s4, shirtChar )
  555.                     end
  556.                 elseif key == keys.right then
  557.                     if selection == 2 then
  558.                         if s1 ~= 15 then
  559.                             s1 = s1 +1
  560.                         end
  561.                        
  562.                         saveChar( 2 ^ s1, charColor1, skinChar, shirtColor, charColor2, shirtChar )
  563.                     elseif selection == 5 then
  564.                         if s2 ~= 15 then
  565.                             s2 = s2 +1
  566.                         end
  567.                        
  568.                         saveChar( skinColor, 2 ^ s2, skinChar, shirtColor, charColor2, shirtChar )
  569.                     elseif selection == 3 then
  570.                         if s3 ~= 15 then
  571.                             s3 = s3 +1
  572.                         end
  573.                        
  574.                         saveChar( skinColor, charColor1, skinChar, 2 ^ s3, charColor2, shirtChar )
  575.                     elseif selection == 6 then
  576.                         if s4 ~= 15 then
  577.                             s4 = s4 +1
  578.                         end
  579.                        
  580.                         saveChar( skinColor, charColor1, skinChar, shirtColor, 2 ^ s4, shirtChar )
  581.                     end
  582.                 end
  583.             end
  584.            
  585.             profileEditor()
  586.         elseif event == "mouse_click" then
  587.             if key == 1 then
  588.                 term.setCursorPos( 1,1 )
  589.                 if p2 == (y/2+4) - .5 then
  590.                     drawMenu()
  591.                     mainMenu()
  592.                 elseif p2 >= 2 and p2 <= 8 then
  593.                     selection = p2 -1
  594.                     profileEditor()
  595.                 end
  596.             end
  597.         end
  598.     end
  599. end
  600.  
  601. local loadedWorld = "world_1"
  602.  
  603. --Modding API--
  604. gameListeners = {
  605.     ["onTick"] = {},
  606.     }
  607.  
  608. blocks = {}
  609. mod = {}
  610.  
  611. blocks.newBlock = function( id, blockname, blockColor, blockChar )
  612.     blocks[id] = {}
  613.     blocks[id].blockName = blockname
  614.     blocks[id].blockColor = blockColor
  615.     blocks[id].blockChar = blockChar
  616. end
  617.  
  618. --Current listeners:
  619. -- onTick - Called every tick
  620. mod.addListener = function( trigger, target ) --Every time the trigger (event) is called, target() is ran.
  621.     if gameListeners[ trigger ] == nil then
  622.         return false
  623.     end
  624.    
  625.     gameListeners[ trigger ][ #gameListeners[ trigger ] + 1 ] = target
  626.    
  627.     return true
  628. end
  629.  
  630. --End Modding API--
  631.  
  632. blocks.newBlock( 1, "Grass", colours.green, " " )
  633. blocks.newBlock( 2, "Dirt", colours.green, " " )
  634. blocks.newBlock( 3, "Stone", colours.gray, " " )
  635. blocks.newBlock( 4, "Cobblestone", colours.lightGray, " " )
  636. blocks.newBlock( 5, "Water", colours.cyan, " " )
  637.  
  638. ticks = {}
  639.  
  640. ticks.gravity = function()
  641.     if getBlockAt(x, y-1) == false then
  642.         pY = pY -1
  643.     end
  644. end
  645.  
  646. function getBlockAt( x, y )
  647.     if theWorld[x] ~= nil then
  648.         if theWorld[x][y] ~= nil then
  649.             return theWorld[x][y]
  650.         end
  651.     end
  652.    
  653.     return false
  654. end
  655.  
  656. function gameTick()
  657.     while true do
  658.         local ontickmethods = gameListeners[ "onTick" ]
  659.         for i=1,#ontickmethods do
  660.             ontickmethods[i]()
  661.         end
  662.        
  663.         sleep(0)
  664.     end
  665. end
  666.  
  667. function loadWorld( worldName )
  668.     loadedWorld = worldName
  669.    
  670.     mod.addListener( "onTick", ticks.gravity )
  671.    
  672.     if fs.exists( ".m-ception/mods" ) and fs.isDir( ".m-ception/mods" ) then
  673.         tAll = fs.list( ".m-ception/mods" )
  674.        
  675.         for n, sItem in pairs( tAll ) do
  676.             local sPath = fs.combine( ".m-ception/mods/", sItem )
  677.            
  678.             os.loadAPI( sPath )
  679.         end
  680.     else
  681.         fs.delete( ".m-ception/mods")
  682.         fs.makeDir( ".m-ception/mods" )
  683.     end
  684.    
  685.     parallel.waitForAll( theGame, gameTick )
  686. end
  687.  
  688. --- End the GUI coding, now for the actual game... (wow, so much lines of code just for a main menu without the multiplayer GUI) ---
  689.  
  690. theWorld = {}
  691.  
  692. skyColor = colours.lightBlue
  693. skyTime = 0
  694.  
  695. pX = 0
  696. pY = 64
  697.  
  698. function placeBlock( x, y, id )
  699.     if tonumber( id ) ~= id then
  700.         for i=1,#blocks do
  701.             if blocks[i].blockName == id then
  702.                 id = i
  703.             end
  704.         end
  705.     end
  706.    
  707.    
  708. end
  709.  
  710. function theGame()
  711.     while true do
  712.         drawPlayer( x/2, y/2+1 )
  713.        
  714.         local event, key, p1, p2 = os.pullEvent()
  715.        
  716.         if event == "key" then
  717.             if key == keys.left then
  718.                 pX = pX -1
  719.             elseif key == keys.right then
  720.                 pX = pX +1
  721.             end
  722.         end
  723.     end
  724. end
  725.  
  726. --- End Game Coding, lets begin the game! --- got bored/tired beyond this point
  727.  
  728. --[[mainMenu() --LET THE GAMES BEGIN
  729. Commented out, wasn't dramatic enough]]
  730.  
  731. function BEGINDAHGAMEZ( PARAMAETERZZZZZZZZZZZZZZZZZZ )
  732.     mainMenu()
  733. end
  734.  
  735. BEGINDAHGAMEZ( "MUAHAHAHAHHAHAHHAHAHHAHHA" )
Advertisement
Add Comment
Please, Sign In to add comment