Advertisement
pkteamrocket

TetraTriad

Mar 28th, 2018
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 38.80 KB | None | 0 0
  1. #===============================================================================
  2. # * Poké Tetra - by FL based in Unknown script (Credits will be apreciated)
  3. #===============================================================================
  4. #
  5. # This script is for Pokémon Essentials. It's a variation of
  6. # Triple Triad minigame that is played on a 4x4 board with random neutral
  7. # blocks and with a setting that allows the player to use its party as cards.
  8. #
  9. #===============================================================================
  10. #
  11. # To this script works, put it above main, put a 512x384 background for this
  12. # screen in "Graphics/Pictures/tetrabg" location.
  13. #
  14. # This script called with pbTetraDuel and have the same arguments that
  15. # pbTriadDuel. This script use some of triad classes like TriadSquare.
  16. #
  17. # You can pass a seventh and eighth parameter as arrays at method
  18. # call for using color for the player and the opponent. Each array have
  19. # two Color objects, the first is for the border and the second is for inside.
  20. # There also default color arrays constants at TetraCard class called
  21. # BLUE, RED, GREEN, PINK, YELLOW, CYAN, PURPLE, ORANGE, BROWN, OLIVE,
  22. # DARKGREEN, DARKBLUE, WHITE and BLACK. An example call setting the
  23. # player color to DARKBLUE and the opponent to ORANGE:
  24. # 'pbTetraDuel("name",0,4,nil,nil,nil,TetraCard::DARKBLUE,TetraCard::ORANGE)'
  25. #
  26. # The cards have a +2 point when attacking a type with weakness, -2 for a
  27. # type with resistance and -4 for a type with immunity. To disable this,
  28. # just use "disabletype" as one of game rules.
  29. #
  30. # If you inform a deck for the opponent bigger that the handsize. The cards
  31. # will be randomly remove until the opponent have the right number of cards.
  32. #
  33. #===============================================================================
  34.  
  35. pbDirs()
  36. pbDownloadToFile("http://i.imgur.com/5Fe6Saf.png","Graphics/Pictures/Tetrabg.png") unless File.exists?('Graphics/Pictures/Tetrabg.png')
  37.  
  38.  
  39.     class TetraScreen
  40.       # If true, instead of the you select your cards for his deck,
  41.       # the select pokémon for your current party.
  42.       USEPARTY = false
  43.      
  44.       # When this number of cards is on the board, the game
  45.       # ends and the result is show.
  46.       PLAYABLECARDS = 10
  47.      
  48.       # The hand size of each player.
  49.       HANDSIZE = 6
  50.     end
  51.  
  52. class TetraCard
  53.   attr_reader :north, :east, :south, :west, :type, :species
  54.  
  55.   # colorArrays - Border/Inside
  56.   BLUE=[Color.new(64,64,255),Color.new(160,160,255)]
  57.   RED=[Color.new(255,64,64),Color.new(255,160,160)]
  58.   GREEN=[Color.new(64,255,64),Color.new(160,255,160)]
  59.   PINK=[Color.new(255,64,255),Color.new(255,160,255)] # Magenta
  60.   YELLOW=[Color.new(255,255,64),Color.new(255,255,160)]
  61.   CYAN=[Color.new(64,255,255),Color.new(160,255,255)]
  62.   PURPLE=[Color.new(128,32,128),Color.new(128,80,128)]
  63.   ORANGE=[Color.new(255,128,32),Color.new(255,128,80)]
  64.   BROWN=[Color.new(128,32,32),Color.new(128,80,80)]
  65.   OLIVE=[Color.new(128,128,32),Color.new(128,128,80)]
  66.   DARKGREEN=[Color.new(32,128,32),Color.new(80,128,80)]
  67.   DARKBLUE=[Color.new(32,32,128),Color.new(80,80,128)]
  68.   WHITE=[Color.new(224,224,224),Color.new(255,255,255)]
  69.   BLACK=[Color.new(64,64,64),Color.new(160,160,160)]
  70.  
  71.   WIDTH=84
  72.   HEIGHT=84
  73.  
  74.   def baseStatToValue(stat)
  75.     return 9 if stat>=190
  76.     return 8 if stat>=150
  77.     return 7 if stat>=120
  78.     return 6 if stat>=100
  79.     return 5 if stat>=80
  80.     return 4 if stat>=65
  81.     return 3 if stat>=50
  82.     return 2 if stat>=35
  83.     return 1 if stat>=20
  84.     return 0
  85.   end
  86.  
  87.   def attack(panel)
  88.     return [@west,@east,@north,@south][panel]
  89.   end
  90.  
  91.   def defense(panel)
  92.     return [@east,@west,@south,@north][panel]
  93.   end
  94.  
  95.   def bonus(opponent)
  96.     atype=@type
  97.     otype=opponent.type
  98.     mod=PBTypes.getEffectiveness(atype,otype)
  99.     return -4 if mod==0
  100.     return -2 if mod==1
  101.     return 2 if mod==4
  102.     return 0
  103.   end
  104.  
  105.   def initialize(species)
  106.     dexdata=pbOpenDexData
  107.     @species=species
  108.     pbDexDataOffset(dexdata,species,10)
  109.     hp=baseStatToValue(dexdata.fgetb)
  110.     attack=baseStatToValue(dexdata.fgetb)
  111.     defense=baseStatToValue(dexdata.fgetb)
  112.     speed=baseStatToValue(dexdata.fgetb)
  113.     specialAttack=baseStatToValue(dexdata.fgetb)
  114.     specialDefense=baseStatToValue(dexdata.fgetb)
  115.     @west=(attack>specialAttack) ? attack : specialAttack # Picks the bigger
  116.     @east=(defense>specialDefense) ? defense : specialDefense # Picks the bigger
  117.     @north=hp
  118.     @south=speed
  119.     pbDexDataOffset(dexdata,species,8)
  120.     @type=dexdata.fgetb # Type
  121.     if isConst?(@type,PBTypes,:NORMAL)
  122.       type2=dexdata.fgetb
  123.       @type=type2 if !isConst?(type2,PBTypes,:NORMAL)
  124.     end
  125.     dexdata.close
  126.   end
  127.  
  128.   def self.createBack(type=-1,colorArray=nil)
  129.     bitmap=BitmapWrapper.new(TetraCard::WIDTH,TetraCard::HEIGHT)
  130.     TetraCard.fillColor(bitmap,colorArray) if colorArray # noback==false
  131.     if type>=0
  132.       typebitmap=AnimatedBitmap.new(_INTL("Graphics/Pictures/types"))
  133.       typerect=Rect.new(0,type*28,64,28)
  134.       bitmap.blt((TetraCard::WIDTH-64)/2,(TetraCard::HEIGHT-28)/2,
  135.           typebitmap.bitmap,typerect,192)
  136.       typebitmap.dispose
  137.     end
  138.     return bitmap
  139.   end
  140.  
  141.   def createBitmap(owner,colorArray)
  142.     if owner==0
  143.       return TetraCard.createBack(-1,colorArray)
  144.     end
  145.     bitmap=BitmapWrapper.new(TetraCard::WIDTH,TetraCard::HEIGHT)
  146.     iconfile=pbCheckPokemonIconFiles([@species,0,false,0,false])
  147.     typebitmap=AnimatedBitmap.new(_INTL("Graphics/Pictures/types"))
  148.     icon=AnimatedBitmap.new(iconfile)
  149.     typerect=Rect.new(0,@type*28,64,28)
  150.     TetraCard.fillColor(bitmap,colorArray)
  151.     bitmap.blt((TetraCard::WIDTH-64)/2,(TetraCard::HEIGHT-28)/2,
  152.         typebitmap.bitmap,typerect,192)
  153.     bitmap.blt(10,2,icon.bitmap,Rect.new(0,0,64,64))
  154.     pbSetSmallFont(bitmap)
  155.     pbDrawTextPositions(bitmap,[
  156.       ["0123456789A"[@north,1],TetraCard::HEIGHT/2,2,2,
  157.           Color.new(248,248,248),Color.new(96,96,96)],
  158.       ["0123456789A"[@south,1],TetraCard::HEIGHT/2,(TetraCard::HEIGHT-2)-24,2,
  159.           Color.new(248,248,248),Color.new(96,96,96)],
  160.       ["0123456789A"[@west,1],2,(TetraCard::WIDTH/2)-12,0,
  161.           Color.new(248,248,248),Color.new(96,96,96)],
  162.       ["0123456789A"[@east,1],TetraCard::WIDTH-2,(TetraCard::WIDTH/2)-12,1,
  163.           Color.new(248,248,248),Color.new(96,96,96)]
  164.     ])
  165.     icon.dispose
  166.     typebitmap.dispose
  167.     return bitmap
  168.   end
  169.  
  170.   def self.createBlockBitmap
  171.     bitmap=BitmapWrapper.new(TetraCard::WIDTH,TetraCard::HEIGHT)
  172.     cardColor = Color.new(29,107,64)
  173.     TetraCard.fillColor(bitmap,[cardColor,cardColor])
  174.     return bitmap
  175.   end  
  176.  
  177.   def self.fillColor(bitmap,colorArray)
  178.     bitmap.fill_rect(0,0,TetraCard::WIDTH,TetraCard::HEIGHT,colorArray[0])
  179.     bitmap.fill_rect(2,2,TetraCard::WIDTH-4,TetraCard::HEIGHT-4,colorArray[1])
  180.   end  
  181. end
  182.  
  183. # Scene class for handling appearance of the screen
  184. class TetraScene
  185.  
  186.   # Initialize the colors and the default values
  187.   def initialize(colorArrayPlayer, colorArrayOpponent)
  188.     @colorArrayPlayer = colorArrayPlayer
  189.     @colorArrayOpponent = colorArrayOpponent
  190.     if !@colorArrayPlayer || (@colorArrayPlayer==@colorArrayOpponent &&
  191.         @colorArrayPlayer==TetraCard::RED)
  192.       @colorArrayPlayer = TetraCard::BLUE
  193.     end
  194.     if !@colorArrayOpponent || (@colorArrayPlayer==@colorArrayOpponent &&
  195.         @colorArrayPlayer==TetraCard::BLUE)
  196.       @colorArrayOpponent = TetraCard::RED
  197.     end
  198.   end  
  199.  
  200. # Update the scene here, this is called once each frame
  201.   def pbUpdate
  202.     pbUpdateSpriteHash(@sprites)
  203.   end
  204.  
  205. # End the scene here
  206.   def pbEndScene
  207.     pbBGMFade(1.0)
  208.     # Fade out all sprites
  209.     pbFadeOutAndHide(@sprites) { pbUpdate }
  210.     # Dispose all sprites
  211.     pbDisposeSpriteHash(@sprites)
  212.     @bitmaps.each{|bm| bm.dispose }
  213.     # Dispose the viewport
  214.     @viewport.dispose
  215.   end
  216.  
  217.   FIELDBASEX = 88
  218.   FIELDBASEY = 46
  219.   HANDBASEY = 34
  220.   HANDBONUSY = 48
  221.   PLAYERHANDBASEX = Graphics.width-TetraCard::WIDTH-2
  222.   OPPONENTHANDBASEX = 2
  223.  
  224.   def pbStartScene(battle)
  225.     # Create sprite hash
  226.     @sprites={}
  227.     @bitmaps=[]
  228.     @battle=battle
  229.     # Allocate viewport
  230.     @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  231.     @viewport.z=99999
  232.     addBackgroundPlane(@sprites,"background","tetrabg",@viewport)
  233.     @sprites["helpwindow"]=Window_AdvancedTextPokemon.newWithSize("",
  234.       0,Graphics.height-64,Graphics.width,64,@viewport)
  235.     for i in 0...@battle.width*@battle.height
  236.       @sprites["sprite#{i}"]=SpriteWrapper.new(@viewport)
  237.       cardX=FIELDBASEX + (i%@battle.width)*TetraCard::WIDTH
  238.       cardY=FIELDBASEY + (i/@battle.width)*TetraCard::HEIGHT
  239.       @sprites["sprite#{i}"].z=2
  240.       @sprites["sprite#{i}"].x=cardX
  241.       @sprites["sprite#{i}"].y=cardY
  242.       bm=TetraCard.createBack(@battle.board[i].type)
  243.       @bitmaps.push(bm)
  244.       @sprites["sprite#{i}"].bitmap=bm
  245.     end
  246.     @cardBitmaps=[]
  247.     @opponentCardBitmaps=[]
  248.     @cardIndexes=[]
  249.     @opponentCardIndexes=[]
  250.     @boardSprites=[]
  251.     @boardCards=[]
  252.     for i in 0...TetraScreen::HANDSIZE
  253.       @sprites["player#{i}"]=Sprite.new(@viewport)
  254.       @sprites["player#{i}"].z=2
  255.       @sprites["player#{i}"].x=PLAYERHANDBASEX
  256.       @sprites["player#{i}"].y=HANDBASEY+6+16*i
  257.       @cardIndexes.push(i)
  258.     end
  259.     @sprites["overlay"]=Sprite.new(@viewport)
  260.     @sprites["overlay"].bitmap=BitmapWrapper.new(Graphics.width,Graphics.height)
  261.     pbSetSystemFont(@sprites["overlay"].bitmap)
  262.     pbDrawTextPositions(@sprites["overlay"].bitmap,[
  263.       [@battle.opponentName,54,0,2,
  264.           Color.new(248,248,248),Color.new(96,96,96)],
  265.       [@battle.playerName,Graphics.width-54,0,2,
  266.           Color.new(248,248,248),Color.new(96,96,96)]
  267.     ])
  268.     @sprites["score"]=Sprite.new(@viewport)
  269.     @sprites["score"].bitmap=BitmapWrapper.new(Graphics.width,Graphics.height)
  270.     pbSetSystemFont(@sprites["score"].bitmap)
  271.     pbBGMPlay("021-Field04")
  272.     # Fade in all sprites
  273.     pbFadeInAndShow(@sprites) { pbUpdate }
  274.   end
  275.  
  276.   def pbUpdateScore
  277.     bitmap=@sprites["score"].bitmap
  278.     bitmap.clear
  279.     playerscore=0
  280.     oppscore=0
  281.     for i in 0...@battle.width*@battle.height
  282.       if @boardSprites[i]
  283.         playerscore+=1 if @battle.board[i].owner==1
  284.         oppscore+=1 if @battle.board[i].owner==2
  285.       end
  286.     end
  287.     if @battle.countUnplayedCards
  288.       playerscore+=@cardIndexes.length
  289.       oppscore+=@opponentCardIndexes.length
  290.     end
  291.     pbDrawTextPositions(bitmap,[
  292.       [_INTL("{1}-{2}",oppscore,playerscore),Graphics.width/2,0,2,
  293.           Color.new(248,248,248),Color.new(96,96,96)]
  294.     ])
  295.   end
  296.  
  297.   def pbNotifyCards(playerCards,opponentCards)
  298.     @playerCards=playerCards
  299.     @opponentCards=opponentCards
  300.   end
  301.  
  302.   def pbDisplay(text)
  303.     @sprites["helpwindow"].visible=true
  304.     @sprites["helpwindow"].text=text
  305.     60.times do
  306.       Graphics.update
  307.       Input.update
  308.       pbUpdate
  309.     end
  310.   end
  311.  
  312.   def pbDisplayPaused(text)
  313.     @sprites["helpwindow"].letterbyletter=true
  314.     @sprites["helpwindow"].text=text+"\1"
  315.     loop do
  316.       Graphics.update
  317.       Input.update
  318.       pbUpdate
  319.       if Input.trigger?(Input::C)
  320.         if @sprites["helpwindow"].busy?
  321.           pbPlayDecisionSE() if @sprites["helpwindow"].pausing?
  322.           @sprites["helpwindow"].resume
  323.         else
  324.           break
  325.         end
  326.       end
  327.     end
  328.     @sprites["helpwindow"].letterbyletter=false
  329.     @sprites["helpwindow"].text=""
  330.   end
  331.  
  332.   def pbWindowVisible(visible)
  333.     @sprites["helpwindow"].visible=visible
  334.   end  
  335.  
  336.   def pbShowPlayerCards(cards)
  337.     for i in 0...TetraScreen::HANDSIZE
  338.       @sprites["player#{i}"]=Sprite.new(@viewport)
  339.       @sprites["player#{i}"].z=2
  340.       @sprites["player#{i}"].x=PLAYERHANDBASEX
  341.       @sprites["player#{i}"].y=HANDBASEY+HANDBONUSY*i
  342.       @sprites["player#{i}"].bitmap=TetraCard.new(cards[i]).createBitmap(
  343.           1,colorArrayPlayer)
  344.       @cardBitmaps.push(@sprites["player#{i}"].bitmap)
  345.     end
  346.   end
  347.  
  348.   def pbShowOpponentCards(cards)
  349.     for i in 0...TetraScreen::HANDSIZE
  350.       @sprites["opponent#{i}"]=Sprite.new(@viewport)
  351.       @sprites["opponent#{i}"].z=2
  352.       @sprites["opponent#{i}"].x=OPPONENTHANDBASEX
  353.       @sprites["opponent#{i}"].y=HANDBASEY+HANDBONUSY*i
  354.       @sprites["opponent#{i}"].bitmap=@battle.openHand ?
  355.           TetraCard.new(cards[i]).createBitmap(2,@colorArrayOpponent) :
  356.           TetraCard.createBack(-1,@colorArrayOpponent)
  357.       @opponentCardBitmaps.push(@sprites["opponent#{i}"].bitmap)
  358.       @opponentCardIndexes.push(i)
  359.     end
  360.   end
  361.  
  362.   def pbViewOpponentCards(numCards)
  363.     choice=0
  364.     lastChoice=-1
  365.     loop do
  366.       if lastChoice!=choice
  367.         y=HANDBASEY
  368.         for i in 0...@opponentCardIndexes.length
  369.           index = @opponentCardIndexes[i]
  370.           @sprites["opponent#{index}"].bitmap =@opponentCardBitmaps[index]
  371.           @sprites["opponent#{index}"].z=(i==choice) ? 4 : 2
  372.           @sprites["opponent#{index}"].x=(i==choice) ?
  373.               OPPONENTHANDBASEX+22 : OPPONENTHANDBASEX
  374.           @sprites["opponent#{index}"].y=y
  375.           y+=HANDBONUSY
  376.         end
  377.         lastChoice=choice
  378.       end
  379.       if choice==-1
  380.         break
  381.       end
  382.       Graphics.update
  383.       Input.update
  384.       pbUpdate
  385.       if Input.repeat?(Input::DOWN)
  386.         pbPlayCursorSE()
  387.         choice+=1
  388.         choice=0 if choice>=numCards
  389.       elsif Input.repeat?(Input::UP)
  390.         pbPlayCursorSE()
  391.         choice-=1
  392.         choice=numCards-1 if choice<0
  393.       elsif Input.trigger?(Input::B)
  394.         pbPlayCancelSE()
  395.         choice=-1
  396.       end
  397.     end
  398.     return choice
  399.   end
  400.  
  401.   def pbPlayerChooseCard(numCards)
  402.     pbWindowVisible(false)
  403.     choice=0
  404.     lastChoice=-1
  405.     loop do
  406.       if lastChoice!=choice
  407.         y=HANDBASEY
  408.         for i in 0...@cardIndexes.length
  409.           @sprites["player#{@cardIndexes[i]}"].bitmap=@cardBitmaps[
  410.               @cardIndexes[i]]
  411.           @sprites["player#{@cardIndexes[i]}"].z=(i==choice) ? 4 : 2
  412.           @sprites["player#{@cardIndexes[i]}"].x=(i==choice) ?
  413.               PLAYERHANDBASEX-32 : PLAYERHANDBASEX
  414.           @sprites["player#{@cardIndexes[i]}"].y=y
  415.           y+=HANDBONUSY
  416.         end
  417.         lastChoice=choice
  418.       end
  419.       Graphics.update
  420.       Input.update
  421.       pbUpdate
  422.       if Input.repeat?(Input::DOWN)
  423.         pbPlayCursorSE()
  424.         choice+=1
  425.         choice=0 if choice>=numCards
  426.       elsif Input.repeat?(Input::UP)
  427.         pbPlayCursorSE()
  428.         choice-=1
  429.         choice=numCards-1 if choice<0
  430.       elsif Input.trigger?(Input::C)
  431.         pbPlayDecisionSE()
  432.         break
  433.       elsif Input.trigger?(Input::A) && @battle.openHand
  434.         pbPlayDecisionSE()
  435.         pbViewOpponentCards(numCards)
  436.         pbWindowVisible(false)
  437.         choice=0
  438.         lastChoice=-1
  439.       end
  440.     end
  441.     return choice
  442.   end
  443.  
  444.   def pbRefresh
  445.     for i in 0...@battle.width*@battle.height
  446.       x=i%@battle.width
  447.       y=i/@battle.width
  448.       if @boardSprites[i]
  449.         owner=@battle.getOwner(x,y)
  450.         @boardSprites[i].bitmap.dispose if @boardSprites[i].bitmap
  451.         @boardSprites[i].bitmap = @boardCards[i] ?
  452.             @boardCards[i].createBitmap(owner, owner==2 ? @colorArrayOpponent :
  453.             @colorArrayPlayer) : TetraCard.createBlockBitmap
  454.       end
  455.     end
  456.   end
  457.  
  458.   def pbEndPlaceCard(position, cardIndex)
  459.     spriteIndex=@cardIndexes[cardIndex]
  460.     boardIndex=position[1]*@battle.width+position[0]
  461.     @boardSprites[boardIndex]=@sprites["player#{spriteIndex}"]
  462.     @boardCards[boardIndex]=TetraCard.new(@playerCards[spriteIndex])
  463.     pbRefresh
  464.     @cardIndexes.delete_at(cardIndex)
  465.     pbUpdateScore
  466.   end
  467.  
  468.   def pbEndOpponentPlaceCard(position, cardIndex)
  469.     spriteIndex=@opponentCardIndexes[cardIndex]
  470.     boardIndex=position[1]*@battle.width+position[0]
  471.     @boardSprites[boardIndex]=@sprites["opponent#{spriteIndex}"]
  472.     @boardCards[boardIndex]=TetraCard.new(@opponentCards[spriteIndex])
  473.     pbRefresh
  474.     @opponentCardIndexes.delete_at(cardIndex)
  475.     pbUpdateScore
  476.   end
  477.  
  478.   def pbPutBlockCards(blockArray)
  479.     for i in 0...blockArray.size
  480.       spriteIndex=i
  481.       boardIndex=blockArray[i]
  482.       @sprites["block#{spriteIndex}"]=Sprite.new(@viewport)
  483.       @sprites["block#{spriteIndex}"].z=2
  484.       @sprites["block#{spriteIndex}"].x=FIELDBASEX + (
  485.           boardIndex%@battle.width)*TetraCard::WIDTH
  486.       @sprites["block#{spriteIndex}"].y=FIELDBASEY + (
  487.           boardIndex/@battle.width)*TetraCard::HEIGHT
  488.       @boardSprites[boardIndex]=@sprites["block#{spriteIndex}"]
  489.     end  
  490.     pbRefresh
  491.   end
  492.  
  493.   def pbOpponentPlaceCard(tetraCard, position, cardIndex)
  494.     y=HANDBASEY
  495.     for i in 0...@opponentCardIndexes.length
  496.       sprite=@sprites["opponent#{@opponentCardIndexes[i]}"]
  497.       if i!=cardIndex
  498.         sprite.z=2
  499.         sprite.y=y
  500.         sprite.x=OPPONENTHANDBASEX
  501.         y+=HANDBONUSY
  502.       else
  503.         @opponentCardBitmaps[@opponentCardIndexes[i]]=tetraCard.createBitmap(
  504.             2,@colorArrayOpponent)
  505.         sprite.bitmap.dispose if sprite.bitmap
  506.         sprite.bitmap=@opponentCardBitmaps[@opponentCardIndexes[i]]
  507.         sprite.z=2
  508.         sprite.x=FIELDBASEX + position[0]*TetraCard::WIDTH
  509.         sprite.y=FIELDBASEY + position[1]*TetraCard::HEIGHT
  510.       end
  511.     end
  512.   end
  513.  
  514.   def pbPlayerPlaceCard(card, cardIndex)
  515.     choice=0
  516.     boardX=0
  517.     boardY=0
  518.     doRefresh=true
  519.     loop do
  520.       if doRefresh
  521.         y=HANDBASEY
  522.         for i in 0...@cardIndexes.length
  523.           if i!=cardIndex
  524.             @sprites["player#{@cardIndexes[i]}"].z=2
  525.             @sprites["player#{@cardIndexes[i]}"].y=y
  526.             @sprites["player#{@cardIndexes[i]}"].x=PLAYERHANDBASEX
  527.             y+=HANDBONUSY
  528.           else
  529.             @sprites["player#{@cardIndexes[i]}"].z=4
  530.             @sprites["player#{@cardIndexes[i]}"].x=(
  531.                 FIELDBASEX + boardX*TetraCard::WIDTH)
  532.             @sprites["player#{@cardIndexes[i]}"].y=(
  533.                 FIELDBASEY + boardY*TetraCard::HEIGHT)
  534.           end
  535.         end
  536.         doRefresh=false
  537.       end
  538.       Graphics.update
  539.       Input.update
  540.       pbUpdate
  541.       if Input.repeat?(Input::DOWN)
  542.         pbPlayCursorSE()
  543.         boardY+=1
  544.         boardY=0 if boardY>=@battle.height
  545.         doRefresh=true
  546.       elsif Input.repeat?(Input::UP)
  547.         pbPlayCursorSE()
  548.         boardY-=1
  549.         boardY=@battle.height-1 if boardY<0
  550.         doRefresh=true
  551.       elsif Input.repeat?(Input::LEFT)
  552.         pbPlayCursorSE()
  553.         boardX-=1
  554.         boardX=@battle.width-1 if boardX<0
  555.         doRefresh=true
  556.       elsif Input.repeat?(Input::RIGHT)
  557.         pbPlayCursorSE()
  558.         boardX+=1
  559.         boardX=0 if boardX>=@battle.width
  560.         doRefresh=true
  561.       elsif Input.trigger?(Input::B)
  562.         return nil
  563.       elsif Input.trigger?(Input::C)
  564.         if @battle.isOccupied?(boardX,boardY)
  565.           pbPlayBuzzerSE()
  566.         else
  567.           pbPlayDecisionSE()
  568.           @sprites["player#{@cardIndexes[cardIndex]}"].z=2
  569.           break
  570.         end
  571.       end
  572.     end
  573.     return [boardX,boardY]
  574.   end
  575.  
  576.   def pbChooseTetraCard(cardStorage)
  577.     commands=[]
  578.     chosenCards=[]
  579.     count=0
  580.     for item in cardStorage
  581.         count+=1
  582.         commands.push(_INTL("{3}. {1} x{2}",PBSpecies.getName(item[0]),item[1],count))
  583.     end
  584.     command=Window_CommandPokemonEx.newWithSize(
  585.         commands,0,0,256,Graphics.height-64,@viewport)
  586.     @sprites["helpwindow"].text=_INTL(
  587.         "Choose {1} cards to use for this duel.",TetraScreen::HANDSIZE)
  588.     preview=Sprite.new(@viewport)
  589.     preview.z=4
  590.     preview.x=276
  591.     preview.y=60
  592.     index=-1
  593.     chosenSprites=[]
  594.     for i in 0...TetraScreen::HANDSIZE
  595.       @sprites["player#{i}"]=Sprite.new(@viewport)
  596.       @sprites["player#{i}"].z=2
  597.       @sprites["player#{i}"].x=PLAYERHANDBASEX
  598.       @sprites["player#{i}"].y=HANDBASEY+HANDBONUSY*i
  599.     end
  600.     loop do
  601.       Graphics.update
  602.       Input.update
  603.       pbUpdate
  604.       command.update
  605.       if command.index!=index
  606.         preview.bitmap.dispose if preview.bitmap
  607.         if command.index<cardStorage.length
  608.           item=cardStorage[command.index]
  609.           preview.bitmap=TetraCard.new(item[0]).createBitmap(
  610.               1,@colorArrayPlayer)
  611.         end
  612.         index=command.index
  613.       end
  614.       if Input.trigger?(Input::B)
  615.         if chosenCards.length>0
  616.           item=chosenCards.pop
  617.           @battle.pbAdd(cardStorage,item)
  618.           commands=[]
  619.           count=0
  620.           for item in cardStorage
  621.             count+=1
  622.             commands.push(_INTL("{3}. {1} x{2}",PBSpecies.getName(item[0]),item[1],count))
  623.           end
  624.           command.commands=commands
  625.           index=-1
  626.         else
  627.           pbPlayBuzzerSE()
  628.         end
  629.       elsif Input.trigger?(Input::C)
  630.         if chosenCards.length==TetraScreen::HANDSIZE
  631.           break
  632.         end
  633.         item=cardStorage[command.index]
  634.         if !item || (@battle.pbQuantity(cardStorage,item[0])==0)
  635.           pbPlayBuzzerSE()
  636.         else
  637.           pbPlayDecisionSE()
  638.           sprite=@sprites["player#{chosenCards.length}"]
  639.           sprite.bitmap.dispose if sprite.bitmap
  640.           @cardBitmaps[chosenCards.length]=TetraCard.new(
  641.               item[0]).createBitmap(1,@colorArrayPlayer)
  642.           sprite.bitmap=@cardBitmaps[chosenCards.length]
  643.           chosenCards.push(item[0])
  644.           @battle.pbSubtract(cardStorage,item[0])
  645.           commands=[]
  646.           count=0
  647.           for item in cardStorage
  648.             count+=1
  649.             commands.push(_INTL("{3}. {1} x{2}",PBSpecies.getName(item[0]),item[1],count))
  650.           end
  651.           command.commands=commands
  652.           command.index=commands.length-1 if command.index>=commands.length
  653.           index=-1
  654.         end
  655.       end
  656.       if Input.trigger?(Input::C) || Input.trigger?(Input::B)
  657.         for i in 0...TetraScreen::HANDSIZE
  658.           @sprites["player#{i}"].visible=(i<chosenCards.length)
  659.         end
  660.         if chosenCards.length==TetraScreen::HANDSIZE
  661.           @sprites["helpwindow"].text=_INTL(
  662.               "{1} cards have been chosen.",TetraScreen::HANDSIZE)
  663.           command.visible=false
  664.           command.active=false
  665.           preview.visible=false
  666.         else
  667.           @sprites["helpwindow"].text=_INTL(
  668.               "Choose {1} cards to use for this duel.",TetraScreen::HANDSIZE)
  669.           command.visible=true
  670.           command.active=true
  671.           preview.visible=true
  672.         end
  673.       end
  674.     end
  675.     command.dispose
  676.     preview.bitmap.dispose if preview.bitmap
  677.     preview.dispose
  678.     return chosenCards
  679.   end
  680.  
  681.   def pbAutoSetTetraCard(cardStorage)
  682.     chosenCards=[]
  683.     i=0
  684.     for item in cardStorage
  685.       item[1].times do
  686.         @sprites["player#{i}"]=Sprite.new(@viewport)
  687.         @sprites["player#{i}"].z=2
  688.         @sprites["player#{i}"].x=PLAYERHANDBASEX
  689.         @sprites["player#{i}"].y=HANDBASEY+HANDBONUSY*i
  690.         #@sprites["player#{i}"].dispose if @sprites["player#{i}"].bitmap
  691.         @cardBitmaps[chosenCards.length]=TetraCard.new(item[0]).createBitmap(
  692.             1,@colorArrayPlayer)
  693.         @sprites["player#{i}"].bitmap=@cardBitmaps[chosenCards.length]
  694.         chosenCards.push(item[0])
  695.         #@battle.pbSubtract(cardStorage,item[0])
  696.         i+=1
  697.       end
  698.     end
  699.     return chosenCards
  700.   end
  701. end
  702.  
  703. # Screen class for handling game logic
  704. class TetraScreen
  705.   attr_accessor :openHand,:countUnplayedCards
  706.   attr_reader :width,:height
  707.  
  708.   def initialize(scene)
  709.     @scene=scene
  710.     @width              = 4
  711.     @height            = 4
  712.     @sameWins          = false
  713.     @openHand          = false
  714.     @wrapAround        = false
  715.     @elements          = false
  716.     @randomHand        = false
  717.     @countUnplayedCards = false
  718.     @disableTypeBonus  = false
  719.     @trade              = 0
  720.   end
  721.  
  722.   def board
  723.     @board
  724.   end
  725.  
  726.   def playerName
  727.     @playerName
  728.   end
  729.  
  730.   def opponentName
  731.     @opponentName
  732.   end
  733.  
  734.   def isOccupied?(x,y)
  735.     return @board[y*@width+x].owner!=0
  736.   end
  737.  
  738.   def getOwner(x,y)
  739.     return @board[y*@width+x].owner
  740.   end
  741.  
  742.   def getPanel(x,y)
  743.     return @board[y*@width+x]
  744.   end
  745.  
  746.   def pbQuantity(items,item)
  747.     return ItemStorageHelper.pbQuantity(items,maxSize,item)
  748.   end
  749.  
  750.   def pbAdd(items,item)
  751.     return ItemStorageHelper.pbStoreItem(items,maxSize,maxPerSlot,item,1)
  752.   end
  753.  
  754.   def pbSubtract(items,item)
  755.     return ItemStorageHelper.pbDeleteItem(items,maxSize,
  756.       item,1)
  757.   end
  758.    
  759.   def maxSize
  760.     return PBSpecies.getCount
  761.   end
  762.  
  763.   def maxPerSlot
  764.     return 99
  765.   end
  766.  
  767.   def flipBoard(x,y,attackerParam=nil,recurse=false)
  768.     panels=[x-1,y,x+1,y,x,y-1,x,y+1]
  769.     panels[0]=(@wrapAround ? @width-1 : 0) if panels[0]<0 # left
  770.     panels[2]=(@wrapAround ? 0 : @width-1) if panels[2]>@width-1 # right
  771.     panels[5]=(@wrapAround ? @height-1 : 0) if panels[5]<0 # top
  772.     panels[7]=(@wrapAround ? 0 : @height-1) if panels[7]>@height-1 # bottom
  773.     attacker=attackerParam!=nil ? attackerParam : @board[y*@width+x]
  774.     flips=[]
  775.     return nil if attackerParam!=nil && @board[y*@width+x].owner!=0
  776.     return nil if !attacker.card || attacker.owner==0
  777.     for i in 0...4
  778.       defenderX=panels[i*2]
  779.       defenderY=panels[i*2+1]
  780.       defender=@board[defenderY*@width+defenderX]
  781.       next if !defender.card
  782.       if attacker.owner!=defender.owner
  783.         attack=attacker.attack(i)
  784.         defense=defender.defense(i)
  785.         if @elements
  786.           # If attacker's type matches the tile's element, add
  787.           # a bonus of 1 (only for original attacker, not combos)
  788.           attack+=1 if !recurse && attacker.type==attacker.card.type
  789.         end
  790.         attack+=attacker.bonus(defender) if !@disableTypeBonus # Type bonus
  791.         if attack>defense || (attack==defense && @sameWins)
  792.           flips.push([defenderX,defenderY])
  793.           if attackerParam==nil
  794.             defender.owner=attacker.owner
  795.             if @sameWins
  796.               # Combo with the "sameWins" rule
  797.               ret=flipBoard(defenderX,defenderY,nil,true)
  798.               flips.concat(ret) if ret
  799.             end
  800.           else
  801.             if @sameWins
  802.               # Combo with the "sameWins" rule
  803.               ret=flipBoard(defenderX,defenderY,attackerParam,true)
  804.               flips.concat(ret) if ret
  805.             end
  806.           end
  807.         end
  808.       end
  809.     end
  810.     return flips
  811.   end
  812.  
  813.   def blockPlacement(blockNumber=nil)
  814.     blockNumber = rand(@width*@height-PLAYABLECARDS+1) if !blockNumber
  815.     blockIndexArray=[]  
  816.     while blockIndexArray.size<blockNumber
  817.       index=rand(@board.size)
  818.       blockIndexArray.push(index) if !blockIndexArray.include?(index)
  819.     end
  820.     blockArray2=[]
  821.     # Checks if a square is alone. If so, redo the method (except the
  822.     # blockNumber). Uses a bidimensional array for easily manipulation
  823.     for i in 0...@height
  824.       blockArray2[i]=[]
  825.       for j in 0...@width
  826.         blockArray2[i][j]=blockIndexArray.include?(@height*i+j)
  827.       end
  828.     end
  829.     for i in 0...@height
  830.       for j in 0...@width
  831.         # If is a square, checks the 4 positions. Ignores the @wrapAround rule
  832.         if !blockArray2[i][j] && (
  833.             (i==0 || blockArray2[i-1][j]) && # Checks up
  834.             (i==@height-1 || blockArray2[i+1][j]) && # Checks down
  835.             (j==0 || blockArray2[i][j-1]) && # Checks left
  836.             (j==@width-1 || blockArray2[i][j+1])) # Checks right
  837.           blockPlacement(blockNumber)  
  838.           return    
  839.         end  
  840.       end
  841.     end
  842.     # End of checking
  843.     for blockIndex in blockIndexArray
  844.       square=TriadSquare.new
  845.       square.owner=-1
  846.       @board[blockIndex]=square  
  847.     end  
  848.     @scene.pbPutBlockCards(blockIndexArray)
  849.   end  
  850.  
  851. # If pbStartScreen includes parameters, it should
  852. # pass the parameters to pbStartScene.
  853.   def pbStartScreen(opponentName,minLevel,maxLevel,
  854.       rules=nil,oppdeck=nil,prize=nil)
  855.     if minLevel<0 || minLevel>9
  856.       raise _INTL("Minimum level must be 0 through 9.")
  857.     end
  858.     if maxLevel<0 || maxLevel>9
  859.       raise _INTL("Maximum level must be 0 through 9.")
  860.     end
  861.     if maxLevel<minLevel
  862.       raise _INTL("Maximum level shouldn't be less than the minimum level.")
  863.     end
  864.     if rules && rules.is_a?(Array) && rules.length>0
  865.       for rule in rules
  866.         @useparty          = true if rule=="useparty"
  867.         @sameWins          = true if rule=="samewins"
  868.         @openHand          = true if rule=="openhand"
  869.         @wrapAround        = true if rule=="wrap"
  870.         @elements          = true if rule=="elements"
  871.         @randomHand        = true if rule=="randomhand"
  872.         @countUnplayedCards = true if rule=="countunplayed"
  873.         @disableTypeBonus  = true if rule=="disabletype" # Disable type bonus
  874.         @trade              = 1    if rule=="direct"
  875.         @trade              = 2    if rule=="winall"
  876.       end
  877.     end
  878.     @tetraCards=[]
  879.     count=0
  880.     cardpkmn=Array.new(20);
  881.     if !@useparty
  882.         for i in 0..19         
  883.             cardpkmn.fill {|i| rand(PBSpecies.maxValue)+1}
  884.             ItemStorageHelper.pbStoreItem(@tetraCards,maxSize,maxPerSlot,cardpkmn[i],1)
  885.             count+=1
  886.         end  
  887.     else
  888.         for pokemon in $Trainer.party
  889.             if !pokemon.isEgg?
  890.             ItemStorageHelper.pbStoreItem(@tetraCards,maxSize,maxPerSlot,pokemon.species,1)
  891.             count+=1
  892.             end          
  893.         end
  894.     end
  895.     @board=[]
  896.     @playerName=$Trainer ? $Trainer.name : "Trainer"
  897.     @opponentName=opponentName
  898.     for i in 0...@width*@height
  899.       square=TriadSquare.new
  900.       if @elements
  901.         begin
  902.           square.type=rand(PBTypes.maxValue+1)
  903.         end until !PBTypes.isPseudoType?(square.type)
  904.       end
  905.       @board.push(square)
  906.     end
  907.     @scene.pbStartScene(self) # (param1, param2)
  908.     # Check whether there are enough cards.
  909.     if count<TetraScreen::HANDSIZE
  910.       @scene.pbDisplayPaused(_INTL("You don't have enough cards, you need 6 Pokémon in your party"))
  911.       @scene.pbEndScene
  912.       return 0
  913.     end
  914.     # Set the player's cards.
  915.     cards=[]
  916.     if @randomHand  # Determine hand at random
  917.       TetraScreen::HANDSIZE.times do
  918.         randCard=@tetraCards[rand(@tetraCards.length)]
  919.         pbSubtract(@tetraCards,randCard[0])
  920.         cards.push(randCard[0])
  921.       end
  922.       @scene.pbShowPlayerCards(cards)
  923.     else
  924.       if USEPARTY && TetraScreen::HANDSIZE>6
  925.         raise _INTL("HANDSIZE cannot be bigger than 6 when USEPARTY=true")
  926.       elsif USEPARTY && TetraScreen::HANDSIZE==6
  927.         # When TetraScreen::HANDSIZE it's 6 and USEPARTY, just copy the party
  928.         cards=@scene.pbAutoSetTetraCard(@tetraCards)
  929.       else  
  930.         cards=@scene.pbChooseTetraCard(@tetraCards)
  931.       end
  932.     end
  933.     # Set the opponent's cards.
  934.     if oppdeck && oppdeck.is_a?(Array) && oppdeck.length>=TetraScreen::HANDSIZE
  935.       # If the oppdeck is bigger that the handsize,
  936.       # remove random pokémon until the size is right
  937.       while oppdeck.length>TetraScreen::HANDSIZE
  938.         oppdeck.delete_at(rand(oppdeck.length))
  939.       end  
  940.       opponentCards=[]
  941.       for i in oppdeck
  942.         card=getID(PBSpecies,i)
  943.         if card<=0
  944.           @scene.pbDisplayPaused(
  945.               _INTL("Opponent has an illegal card, \"{1}\".",i))
  946.           @scene.pbEndScene
  947.           return 0
  948.         end
  949.         opponentCards.push(card)
  950.       end
  951.     else
  952.       candidates=[]
  953.       while candidates.length<200
  954.         card=rand(PBSpecies.maxValue)+1
  955.         tetra=TetraCard.new(card)
  956.         total=tetra.north+tetra.south+tetra.east+tetra.west
  957.         # Add random species and its total point count
  958.         candidates.push([card,total])
  959.       end
  960.       # sort by total point count
  961.       candidates.sort!{|a,b| a[1]<=>b[1] }
  962.       minIndex=minLevel*20
  963.       maxIndex=maxLevel*20+20
  964.       opponentCards=[]
  965.       for i in 0...TetraScreen::HANDSIZE
  966.         # generate random card based on level
  967.         index=minIndex+rand(maxIndex-minIndex)
  968.         opponentCards.push(candidates[index][0])
  969.       end
  970.     end
  971.     originalCards=cards.clone
  972.     originalOpponentCards=opponentCards.clone
  973.     @scene.pbNotifyCards(cards.clone,opponentCards.clone)
  974.     @scene.pbShowOpponentCards(opponentCards)
  975.     blockPlacement
  976.     @scene.pbDisplay(_INTL("Choosing the starting player..."))
  977.     @scene.pbUpdateScore
  978.     playerTurn=false
  979.     if rand(2)==0
  980.       @scene.pbDisplay(_INTL("{1} will go first.",@playerName))
  981.       playerTurn=true
  982.     else
  983.       @scene.pbDisplay(_INTL("{1} will go first.",@opponentName))
  984.       playerTurn=false
  985.     end
  986.     for i in 0...TetraScreen::PLAYABLECARDS
  987.       position=nil
  988.       tetraCard=nil
  989.       cardIndex=0
  990.       if playerTurn
  991.         # Player's turn
  992.         while !position
  993.           cardIndex=@scene.pbPlayerChooseCard(cards.length)
  994.           tetraCard=TetraCard.new(cards[cardIndex])
  995.           position=@scene.pbPlayerPlaceCard(tetraCard,cardIndex)
  996.         end
  997.       else
  998.         # Opponent's turn
  999.         @scene.pbDisplay(_INTL("{1} is making a move...",@opponentName))    
  1000.         scores=[]
  1001.         for cardIndex in 0...opponentCards.length
  1002.           square=TriadSquare.new
  1003.           square.card=TetraCard.new(opponentCards[cardIndex])
  1004.           square.owner=2
  1005.           for i in 0...@width*@height
  1006.             x=i%@width
  1007.             y=i/@width
  1008.             square.type=@board[i].type
  1009.             flips=flipBoard(x,y,square)
  1010.             if flips!=nil
  1011.               scores.push([cardIndex,x,y,flips.length])
  1012.             end
  1013.           end
  1014.         end
  1015.         # Sort by number of flips
  1016.         scores.sort!{|a,b|
  1017.           if b[3]==a[3]
  1018.             next [-1,1,0][rand(3)]
  1019.           else
  1020.             next b[3]<=>a[3]
  1021.           end
  1022.         }
  1023.         scores=scores[0,opponentCards.length*3/2] # Get the best results
  1024.         if scores.length==0
  1025.           @scene.pbDisplay(_INTL("{1} can't move somehow...",@opponentName))
  1026.           playerTurn=!playerTurn
  1027.           continue
  1028.         end
  1029.         bestScore = scores[0][3]
  1030.         result=nil
  1031.         while !result
  1032.           result=scores[rand(scores.length)]
  1033.           # A random chance of not choosing the best result
  1034.           result=nil if result[3]<bestScore && rand(10)!=0
  1035.         end  
  1036.         cardIndex=result[0]
  1037.         tetraCard=TetraCard.new(opponentCards[cardIndex])
  1038.         position=[result[1],result[2]]
  1039.         @scene.pbOpponentPlaceCard(tetraCard,position,cardIndex)
  1040.       end
  1041.       boardIndex=position[1]*@width+position[0]
  1042.       board[boardIndex].card=tetraCard
  1043.       board[boardIndex].owner=playerTurn ? 1 : 2
  1044.       flipBoard(position[0],position[1])
  1045.       if playerTurn
  1046.         cards.delete_at(cardIndex)
  1047.         @scene.pbEndPlaceCard(position,cardIndex)
  1048.       else
  1049.         opponentCards.delete_at(cardIndex)
  1050.         @scene.pbEndOpponentPlaceCard(position,cardIndex)
  1051.       end
  1052.       playerTurn=!playerTurn
  1053.     end
  1054.     # Determine the winner
  1055.     playerCount=0
  1056.     opponentCount=0
  1057.     for i in 0...@width*@height
  1058.       playerCount+=1 if board[i].owner==1
  1059.       opponentCount+=1 if board[i].owner==2
  1060.     end
  1061.     if @countUnplayedCards
  1062.       playerCount+=cards.length
  1063.       opponentCount+=opponentCards.length
  1064.     end
  1065.     @scene.pbWindowVisible(true)
  1066.     result=0
  1067.     if playerCount==opponentCount
  1068.       @scene.pbDisplayPaused(_INTL("The game is a draw."))
  1069.       result=3
  1070.       if !USEPARTY
  1071.         case @trade
  1072.         when 1
  1073.           # Keep only cards of your color
  1074.           for card in originalCards
  1075.             $PokemonGlobal.triads.pbDeleteItem(card)
  1076.           end
  1077.           for i in cards
  1078.             $PokemonGlobal.triads.pbStoreItem(i)
  1079.           end
  1080.           for i in 0...@width*@height
  1081.             if board[i].owner==1
  1082.               $PokemonGlobal.triads.pbStoreItem(board[i].card.species)
  1083.             end
  1084.           end
  1085.           @scene.pbDisplayPaused(_INTL("Kept all cards of your color."))
  1086.         end
  1087.       end  
  1088.     elsif playerCount>opponentCount
  1089.         $PokemonGlobal.coins+=40;
  1090.         @scene.pbDisplayPaused(_INTL("{1} won against {2}.",@playerName,@opponentName))
  1091.         pbMEPlay("Jingle - Item")
  1092.         Kernel.pbMessage(_INTL("\\CN\You have win $40 coins, Congratulations!"))
  1093.         result=1
  1094.       if !USEPARTY
  1095.         if prize
  1096.           card=getID(PBSpecies,prize)
  1097.           if card>0 && $PokemonGlobal.triads.pbStoreItem(card)
  1098.             cardname=PBSpecies.getName(card)
  1099.             @scene.pbDisplayPaused(_INTL("Got opponent's {1} card.",cardname))
  1100.           end
  1101.         else
  1102.           case @trade
  1103.             when 0
  1104.               # Gain 1 random card from opponent's deck
  1105.               card=originalOpponentCards[rand(originalOpponentCards.length)]
  1106.               if $PokemonGlobal.triads.pbStoreItem(card)
  1107.                 cardname=PBSpecies.getName(card)
  1108.                 #@scene.pbDisplayPaused(_INTL("Got opponent's {1} card.",cardname))
  1109.               end
  1110.             when 1
  1111.               # Keep only cards of your color
  1112.               for card in originalCards
  1113.                 $PokemonGlobal.triads.pbDeleteItem(card)
  1114.               end
  1115.               for i in cards
  1116.                 $PokemonGlobal.triads.pbStoreItem(i)
  1117.               end
  1118.               for i in 0...@width*@height
  1119.                 if board[i].owner==1
  1120.                   $PokemonGlobal.triads.pbStoreItem(board[i].card.species)
  1121.                 end
  1122.               end
  1123.               @scene.pbDisplayPaused(_INTL("Kept all cards of your color."))
  1124.             when 2
  1125.               # Gain all opponent's cards
  1126.               for card in originalOpponentCards
  1127.                 $PokemonGlobal.triads.pbStoreItem(card)
  1128.               end
  1129.               @scene.pbDisplayPaused(_INTL("Got all opponent's cards."))
  1130.           end
  1131.         end
  1132.       end  
  1133.     else
  1134.       result=2   
  1135.       @scene.pbDisplayPaused(
  1136.           _INTL("{1} lost against {2}.",@playerName,@opponentName))      
  1137.       if !USEPARTY
  1138.         case @trade
  1139.         when 0
  1140.           # Lose 1 random card from your deck
  1141.           card=originalCards[rand(originalCards.length)]
  1142.           $PokemonGlobal.triads.pbDeleteItem(card)
  1143.           cardname=PBSpecies.getName(card)
  1144.           #@scene.pbDisplayPaused(_INTL("Opponent won your {1} card.",cardname))
  1145.         when 1
  1146.           # Keep only cards of your color
  1147.           for card in originalCards
  1148.             $PokemonGlobal.triads.pbDeleteItem(card)
  1149.           end
  1150.           for i in cards
  1151.             $PokemonGlobal.triads.pbStoreItem(i)
  1152.           end
  1153.           for i in 0...@width*@height
  1154.             if board[i].owner==1
  1155.               $PokemonGlobal.triads.pbStoreItem(board[i].card.species)
  1156.             end
  1157.           end
  1158.           @scene.pbDisplayPaused(
  1159.               _INTL("Kept all cards of your color.",cardname))
  1160.         when 2
  1161.           # Lose all your cards
  1162.           for card in originalCards
  1163.             $PokemonGlobal.triads.pbDeleteItem(card)
  1164.           end
  1165.           @scene.pbDisplayPaused(_INTL("Opponent won all your cards."))
  1166.         end  
  1167.       end
  1168.     end
  1169.     @scene.pbEndScene
  1170.     return result
  1171.   end
  1172. end
  1173.  
  1174. def pbTetraDuel(name,minLevel,maxLevel,rules=nil,oppdeck=nil,prize=nil,
  1175.     colorArrayPlayer=nil, colorArrayOpponent=nil)  
  1176.     pbFadeOutInWithMusic(99999){
  1177.     Audio.bgm_play("Audio/BGM/09 - Gustaberg.mp3",100,100)
  1178.     scene=TetraScene.new(colorArrayPlayer,colorArrayOpponent)
  1179.     screen=TetraScreen.new(scene)
  1180.     screen.pbStartScreen(name,minLevel,maxLevel,rules,oppdeck,prize)
  1181.   }
  1182. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement