Advertisement
MissEshock2002

Sexscripts Memory game - wip

Aug 10th, 2020 (edited)
995
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Groovy 11.92 KB | None | 0 0
  1. // Memory
  2. // by MissEshock2002
  3.  
  4. // This script, from https://ss.deviatenow.com, is protected by this licence:
  5. // CC0
  6.  
  7. boolean DEBUG = false
  8.  
  9. String SCRIPTNAME = "Memory"
  10. String VERSION = "v0.4"
  11.  
  12. setInfos(9, SCRIPTNAME, "Memory game",
  13.         "MissEshock2002",
  14.         VERSION, 0x222222, "en", ["game", "memory", "estim", "electro", "formale", "forfemale"])
  15.  
  16.  
  17. String SOUNDSDIR = "Memory/"
  18. String EXT = ".wav"
  19.  
  20.  
  21. List<String> arrowButtons = ["  ←  ", "  →  ", "  ↑  ", "  ↓  "]
  22.  
  23. // memory game vars:
  24. int numberOfMatchingCards = 2 // number of cards to flip for match
  25. int numberOfPairs = 6
  26. List deck = []
  27. boolean showCardImages = false
  28. boolean showCardText = false
  29. boolean playEstim = false
  30.  
  31. List<List> flipStack = [] // temp. save flipped cards
  32. List rndCards = []
  33. List cards = []
  34. List flippedCards = []
  35. int cols
  36. int rows
  37. int maxRow
  38. int maxCol
  39. int colPos = 0
  40. int rowPos = 0
  41.  
  42. int score = 0
  43. int failed = 0
  44.  
  45.  
  46. int shockTime
  47. List SHOCKTIMERANGE = [1, 10]
  48. List shockTimeRange = SHOCKTIMERANGE
  49. int shockTimePlus = 1
  50.  
  51. def clamp = { value, min, max -> return Math.max(min, Math.min(max, value)) }
  52.  
  53. // TODO sounds:
  54. List sounds = []
  55.  
  56. // graphics:
  57. int cardWidth = 160
  58. int cardHeight = 220
  59. int cardCornerSize = 12
  60. int marginX = 10
  61. int marginY = 10
  62. java.awt.Color cardBGColor = java.awt.Color.DARK_GRAY
  63. java.awt.Color cardBorderColor = java.awt.Color.LIGHT_GRAY
  64. java.awt.Color cardFlippedBorderColor = java.awt.Color.WHITE
  65. java.awt.Color bgColor = new java.awt.Color(24, 24, 24, 128)
  66.  
  67. String fontName = "Serif"
  68. java.awt.Color fontColor = java.awt.Color.GRAY
  69. java.awt.Color fontFlippedColor = java.awt.Color.WHITE
  70.  
  71. java.awt.BasicStroke stroke = new java.awt.BasicStroke(2)
  72. java.awt.BasicStroke cursorStroke = new java.awt.BasicStroke(3)
  73.  
  74. String pathToCardDeck = "images/Bcards/StandardDeck2/"
  75. def sampleImage = java.awt.Toolkit.getDefaultToolkit().getImage(pathToCardDeck + "0.png")
  76. def cardBack = javax.imageio.ImageIO.read(new File(pathToCardDeck + "back.png"))
  77.  
  78. java.awt.geom.RoundRectangle2D cardRect
  79. java.awt.geom.RoundRectangle2D cursorRect
  80. String cardText = "?"
  81. int imageWidth
  82. int imageHeight
  83. def frameBuffer
  84. java.awt.Graphics graphics
  85. java.awt.Font font
  86.  
  87.  
  88. def initGraphics = {
  89.     cardText = "?"
  90.  
  91.     if (showCardImages) {
  92.         cardWidth = sampleImage.getWidth()
  93.         cardHeight = sampleImage.getHeight()
  94.     }
  95.  
  96.     cardRect = new java.awt.geom.RoundRectangle2D.Float(
  97.             0, 0,
  98.             cardWidth, cardHeight,
  99.             cardCornerSize, cardCornerSize)
  100.  
  101.     cursorRect = new java.awt.geom.RoundRectangle2D.Float(
  102.             0, 0,
  103.             cardWidth, cardHeight,
  104.             cardCornerSize, cardCornerSize)
  105.  
  106.     int fontSize = (int) (Math.min(cardWidth, cardHeight)) / 2
  107.     font = new java.awt.Font(fontName, java.awt.Font.PLAIN, fontSize)
  108.  
  109.     imageWidth = (int) (cols * (cardWidth + marginX) + marginX)
  110.     imageHeight = (int) (rows * (cardHeight + marginY) + marginY)
  111.     frameBuffer = new java.awt.image.BufferedImage(imageWidth, imageHeight, java.awt.image.BufferedImage.TYPE_4BYTE_ABGR)
  112.     graphics = frameBuffer.createGraphics()
  113.     graphics.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON)
  114. }
  115.  
  116. def drawCards = {
  117.     if (DEBUG) {
  118.         show("DEBUG:\ncards:\n${cards.toString().replaceAll('],', "],\n")}" +
  119.                 "\n\nflipped cards:\n${flippedCards.toString().replaceAll('],', "],\n")}" +
  120.                 "\n\ncursor pos: col=${colPos}, row=${rowPos}" +
  121.                 "\ncard: ${cards[rowPos][colPos]}" +
  122.                 "\n\nflip stack: ${flipStack}" +
  123.                 "\n\nscore: ${score}" +
  124.                 "\n\nfailed: ${failed}" +
  125.                 "\n\nshockTime: ${shockTime}"
  126.         )
  127.     }
  128.  
  129.     // clear
  130.     graphics.setBackground(bgColor)
  131.     graphics.clearRect(0, 0, imageWidth, imageHeight)
  132.  
  133.     // draw cards
  134.     (0..(rows - 1)).each { r ->
  135.         (0..(cols - 1)).each { c ->
  136.             if (cards[r][c] != null) {
  137.                 if (!showCardImages) {
  138.                     cardRect.x = c * (cardWidth + marginX) + marginX
  139.                     cardRect.y = r * (cardHeight + marginY) + marginY
  140.  
  141.                     // card BG
  142.                     graphics.setColor(cardBGColor)
  143.                     graphics.fill(cardRect)
  144.                     graphics.draw(cardRect)
  145.  
  146.                     // card border
  147.                     if (flippedCards[r][c]) {
  148.                         graphics.setColor(cardFlippedBorderColor)
  149.                     } else {
  150.                         graphics.setColor(cardBorderColor)
  151.                     }
  152.                     graphics.setStroke(stroke)
  153.                     graphics.draw(cardRect)
  154.                 }
  155.  
  156.                 // card from deck of cards
  157.                 if (showCardImages) {
  158.                     // card images
  159.                     def cardImage = cardBack
  160.                     if (flippedCards[r][c]) {
  161.                         cardImage = javax.imageio.ImageIO.read(new File(pathToCardDeck + cards[r][c] + ".png"))
  162.                     }
  163.                     graphics.drawImage(cardImage,
  164.                             c * (cardWidth + marginX) + marginX, r * (cardHeight + marginY) + marginY,
  165.                             cardWidth, cardHeight, null)
  166.                 } else {
  167.                     // card with text/numbers or none
  168.                     if (flippedCards[r][c]) {
  169.                         graphics.setColor(fontFlippedColor)
  170.                         graphics.setFont(font)
  171.                         java.awt.FontMetrics metrics = graphics.getFontMetrics(font)
  172.                         if (showCardText) {
  173.                             cardText = cards[r][c]
  174.                         }
  175.                         graphics.drawString(cardText,
  176.                                 (int) (cardRect.x + (cardRect.width - metrics.stringWidth(cardText)) / 2),
  177.                                 (int) (cardRect.y + ((cardRect.height - metrics.getHeight()) / 2) + metrics.getAscent()))
  178.                     }
  179.                 }
  180.             }
  181.         }
  182.     }
  183.  
  184.     // cursor
  185.     graphics.setColor(java.awt.Color.GREEN)
  186.     graphics.setStroke(cursorStroke)
  187.     cursorRect.x = colPos * (cardWidth + marginX) + marginX
  188.     cursorRect.y = rowPos * (cardHeight + marginY) + marginY
  189.     graphics.draw(cursorRect)
  190.  
  191.     java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream()
  192.     javax.imageio.ImageIO.write(frameBuffer, "png", baos)
  193.     setImage(baos.toByteArray(), 0)
  194. }
  195.  
  196.  
  197. def getEstimFiles = {
  198.     List<String> fileNames = []
  199.     List<String> uniqueNames = []
  200.     File dir = new File("sounds/" + SOUNDSDIR)
  201.     dir.traverse(type: groovy.io.FileType.FILES, maxDepth: 0) { file ->
  202.         if (file.name.endsWith(EXT)) fileNames.add(file.name)
  203.     }
  204.     if (fileNames.isEmpty()) {
  205.         show("ERROR! Missing sound files?")
  206.         showButton("Quit")
  207.         exit()
  208.     }
  209.     return fileNames
  210. }
  211.  
  212.  
  213. List<String> estimFileNames = []
  214.  
  215. def initGame = {
  216.     // reset
  217.     score = 0
  218.     failed = 0
  219.     shockTime = shockTimeRange[0]
  220.     deck = 0..51 // 52 cards
  221.  
  222.     // random cards
  223.     List rndDeck = deck.collect()
  224.     Collections.shuffle(rndDeck)
  225.     (0..(numberOfPairs - 1)).each { n ->
  226.         (0..(numberOfMatchingCards - 1)).each {
  227.             rndCards.add(rndDeck[n])
  228.         }
  229.     }
  230.     Collections.shuffle(rndCards)
  231.  
  232.     // fill cards with null
  233.     cards.clear()
  234.     (0..(rows - 1)).each { c ->
  235.         List newRow = [null] * cols
  236.         (0..(cols - 1)).each { r ->
  237.             int pos = c * cols + r
  238.             newRow[r] = rndCards[pos]
  239.         }
  240.         cards.add(newRow)
  241.     }
  242.  
  243.     // fill flippedCards with false
  244.     flippedCards.clear()
  245.     cards.each { cardRow -> flippedCards.add([false] * cardRow.size()) }
  246.     maxRow = cards[0].size() - 1
  247.     maxCol = cards.size() - 1
  248.  
  249.     // list with sounds
  250.     estimFileNames = getEstimFiles()
  251.     Collections.shuffle(estimFileNames)
  252. }
  253.  
  254. def playSoundNumber = { soundNumber ->
  255.     if (!playEstim) return
  256.  
  257.     String sound = SOUNDSDIR + estimFileNames[soundNumber]
  258.     int repetitions = (int) Math.ceil(shockTime / 10)
  259.     playBackgroundSound(sound, repetitions)
  260.     wait(shockTime)
  261.     playBackgroundSound(null)
  262. }
  263.  
  264. def showStats = {
  265.     String statsText = "Shock Time = " + shockTime
  266.     show(statsText)
  267. }
  268.  
  269. def playMemory = {
  270.     show(null)
  271.  
  272.     initGame()
  273.     initGraphics()
  274.  
  275.     boolean gameOver = false
  276.     while (!gameOver) {
  277.         showStats()
  278.         drawCards()
  279.         int sel = getSelectedValue(null, (arrowButtons + "Flip"))
  280.         if (sel == 0) colPos-- // left
  281.         else if (sel == 1) colPos++ // right
  282.         else if (sel == 2) rowPos-- // up
  283.         else if (sel == 3) rowPos++ // down
  284.         else { // flip
  285.             List<Integer> currFlip = [rowPos, colPos]
  286.             String flipedCard = cards[rowPos][colPos]
  287.             if ((flippedCards[rowPos][colPos] == false) && cards[rowPos][colPos] != null) {
  288.                 flipStack.add(currFlip)
  289.                 flippedCards[rowPos][colPos] = true
  290.                 drawCards()
  291.                 playSoundNumber(cards[rowPos][colPos])
  292.  
  293.                 if (flipStack.size() > 1) {
  294.                     if (flipStack.any { pos -> cards[pos[0]][pos[1]] != cards[flipStack[0][0]][flipStack[0][1]] }) {
  295.                         // TODO punishment
  296.                         failed++
  297.                         show("No match!")
  298.                         wait(2)
  299.                         flipStack.each { pos -> flippedCards[pos[0]][pos[1]] = false }
  300.                         flipStack.clear()
  301.                         shockTime += shockTimePlus
  302.                         shockTime = Math.max(shockTime, shockTimeRange.min())
  303.                         shockTime = Math.min(shockTime, shockTimeRange.max())
  304.                     } else {
  305.                         if (flipStack.size() == numberOfMatchingCards) {
  306.                             // TODO reward
  307.                             score++
  308.                             show("Match!")
  309.                             wait(2)
  310.                             flipStack.each { pos -> cards[pos[0]][pos[1]] = null }
  311.                             flipStack.clear()
  312.                         }
  313.                     }
  314.                 }
  315.             }
  316.         }
  317.         colPos = clamp(colPos, 0, maxRow)
  318.         rowPos = clamp(rowPos, 0, maxCol)
  319.  
  320.         gameOver = cards.every { cardRow -> cardRow.every { card -> card == null } }
  321.     }
  322.  
  323.     show("Game Over")
  324.     wait(2)
  325. }
  326.  
  327.  
  328. boolean endMain = false
  329. while (!endMain) {
  330.     show(null)
  331.     setImage(null)
  332.  
  333.     while (true) {
  334.         numberOfMatchingCards = getInteger("Number of cards to match? Pairs, triplets, ...? (2 - 4)", numberOfMatchingCards)
  335.         if (numberOfMatchingCards >= 2 && numberOfMatchingCards <= 4) {
  336.             break
  337.         }
  338.     }
  339.  
  340.     while (true) {
  341.         numberOfPairs = getInteger("How many pairs, triplets, ...?", numberOfPairs)
  342.         if (numberOfPairs >= 1 && numberOfPairs <= 52 / numberOfMatchingCards) {
  343.             cols = (int) Math.ceil(Math.sqrt(numberOfPairs * numberOfMatchingCards))
  344.             rows = (int) Math.ceil(numberOfPairs * numberOfMatchingCards / cols)
  345.             break
  346.         }
  347.     }
  348.  
  349.     // play with cards, play with text/numbers or none
  350.     int sel = getSelectedValue("Play with cards, play with numbers or blank cards", ["cards", "numbers", "blank"])
  351.     if (sel == 0) {
  352.         showCardImages = true
  353.         showCardText = false
  354.     } else if (sel == 1) {
  355.         showCardImages = false
  356.         showCardText = true
  357.     } else {
  358.         showCardImages = false
  359.         showCardText = false
  360.     }
  361.  
  362.     playEstim = getBoolean("Play eStim?")
  363.  
  364.     if (playEstim) {
  365.         shockTimeRange[0] = getInteger("Min shock time?", shockTimeRange[0])
  366.         shockTimeRange[1] = getInteger("Max shock time?", shockTimeRange[1])
  367.         shockTimePlus = getInteger("Increase shock time per fail?", shockTimePlus)
  368.     }
  369.  
  370.     playMemory()
  371.  
  372.     if (!getBoolean("Play again?")) endMain = true
  373. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement