# Minesweeper by LimeGlass # XXX # X0X # XXX function getSurrounding(slot: number, inventory: inventory) :: numbers: # Left edge if {_slot} mod 9 is not 0: add {_slot} - 1 to {_slots::*} add (({_slot} - 1) + 9) to {_slots::*} add (({_slot} - 1) - 9) to {_slots::*} if {_slot} mod 9 is not 8: add {_slot} + 1 to {_slots::*} add (({_slot} + 1) + 9) to {_slots::*} add (({_slot} + 1) - 9) to {_slots::*} add {_slot} + 9 to {_slots::*} add {_slot} - 9 to {_slots::*} loop {_slots::*}: if loop-value is not between 0 and inventory size of {_inventory}: remove loop-value from {_slots::*} return {_slots::*} # #X# # X0X # #X# function getNextTo(slot: number, inventory: inventory) :: numbers: # Left edge if {_slot} mod 9 is not 0: add {_slot} - 1 to {_slots::*} if {_slot} mod 9 is not 8: add {_slot} + 1 to {_slots::*} add {_slot} + 9 to {_slots::*} add {_slot} - 9 to {_slots::*} loop {_slots::*}: if loop-value is not between 0 and inventory size of {_inventory}: remove loop-value from {_slots::*} return {_slots::*} # Concurrent determining system. function handle(player: player, slot: number, inventory: inventory): # Cut off random digs, and display a single hint on clicked slot. loop getNextTo({_slot}, {_inventory}): if {minesweeper::temp::%{_player}%::bombs::*} contains loop-number: loop getSurrounding({_slot}, {_inventory}): if {minesweeper::temp::%{_player}%::bombs::*} contains loop-number-2: add 1 to {_count} if {_count} is set: set {_item} to blue stained glass pane if {_count} is 2: set {_item} to light green stained glass pane if {_count} is 3: set {_item} to yellow stained glass pane if {_count} is 4: set {_item} to orange stained glass pane if {_count} is 5: set {_item} to red stained glass pane set slot {_slot} of {_inventory} to {_count} of {_item} named "&fThere are &l%{_count}% &fbomb(s) near." stop # Click was not directly next to a bomb. loop getSurrounding({_slot}, {_inventory}): slot loop-number of {_inventory} is white stained glass pane # Calculate the count for the hint. loop getSurrounding(loop-number, {_inventory}): if {minesweeper::temp::%{_player}%::bombs::*} contains loop-number-2: add 1 to {_count} # The area is air. if {_count} is not set: if {minesweeper::temp::%{_player}%::bombs::*} doesn't contain loop-number: set slot loop-number of {_inventory} to air # Open up all the air pockets connected to this air pocket. handle({_player}, loop-number, {_inventory}) # Determine the colour glass to display for the hint. else if {minesweeper::temp::%{_player}%::bombs::*} doesn't contain loop-number: set {_item} to blue stained glass pane if {_count} is 2: set {_item} to light green stained glass pane if {_count} is 3: set {_item} to yellow stained glass pane if {_count} is 4: set {_item} to orange stained glass pane if {_count} is 5: set {_item} to red stained glass pane set slot loop-number of {_inventory} to {_count} of {_item} named "&fThere are &l%{_count}% &fbomb(s) near." clear {_count} # Command for the game. Customize to your liking. command /minesweeper : permission: minesweeper.use usage: /minesweeper trigger: clear {minesweeper::temp::%player%::*} # Show highscores. if argument is "highscores", "highscore" or "hs": set {_uuid} to uuid of player if {minesweeper::%{_uuid}%::highscores::*} is not set: message "&7[&cMinesweeper&7] &cYou have no highscores set." stop set {_spot} to 1 # Sorted Difficulty from hardest to easiest. loop integers between 10 and 1: loop {minesweeper::%{_uuid}%::highscores::%loop-number%::*}: # because Skript toVariableName for timeperiods is dumb. set {_date} to loop-index replace "object:" with "" in {_date} message "&f##&l%{_spot}% - &7Difficulty: &f%loop-number%&7, Time: &f%loop-value-2%&7, Date: &f%{_date}%" stop set {_difficulty} to argument parsed as a number if {_difficulty} is not set: set {_difficulty} to 6 message "&7[&cMinesweeper&7] &c&l%argument% &cis not a number between 1 and 10, defaulting to 6 for difficulty." if {_difficulty} is not between 1 and 10: set {_difficulty} to 10 set {_inventory} to a chest inventory with 6 rows named " &4&lMinesweeper" set {minesweeper::temp::%player%::difficulty} to {_difficulty} loop numbers between 0 and inventory size of {_inventory}: set slot loop-number of {_inventory} to white stained glass pane named "&7Click to reveal" set {minesweeper::temp::%player%::inventory} to {_inventory} open {_inventory} to player play sound "ENTITY_EXPERIENCE_ORB_PICKUP" at volume 0.6 and pitch 2 to player on inventory click: {minesweeper::temp::%player%::inventory} is set event-inventory is {minesweeper::temp::%player%::inventory} cancel event if {minesweeper::temp::%player%::finished} is set: stop # Handle flags if clicked type is right mouse button: if clicked item is a redstone torch: set clicked item to {minesweeper::temp::%player%::past::%clicked slot%} play sound "ENTITY_VILLAGER_NO" at volume 0.6 and pitch 2 to player clear {minesweeper::temp::%player%::past::%clicked slot%} else: # Important to remember past item. set {minesweeper::temp::%player%::past::%clicked slot%} to clicked item set clicked item to redstone torch play sound "ENTITY_ENDER_DRAGON_FLAP" at volume 0.5 and pitch 2 to player stop # Handle digging clicked type is left mouse button play sound "BLOCK_GRASS_STEP" at volume 0.7 and pitch 0 to player # calculate the game on first click, because it's no fun clicking your first slot on a bomb. if {minesweeper::temp::%player%::start} is not set: set {minesweeper::temp::%player%::start} to now # Amount of random bombs based on difficulty. loop random number between 5 and 2 * {minesweeper::temp::%player%::difficulty} times: add random integer between 0 and inventory size of event-inventory - 1 to {minesweeper::temp::%player%::bombs::*} # Remove all surrounding bombs so it's a fair start. loop getSurrounding(clicked slot, event-inventory): remove loop-number from {minesweeper::temp::%player%::bombs::*} remove clicked slot from {minesweeper::temp::%player%::bombs::*} set clicked item to air handle(player, clicked slot, event-inventory) # Winning checker while {minesweeper::temp::%player%::inventory} is set: wait a second # Only bomb clickables left loop items in player's current inventory: loop-item is white stained glass pane if {minesweeper::temp::%player%::bombs::*} contains index of loop-item: add 1 to {_bombs} if amount of white stained glass pane in player's current inventory is less than or equal to {_bombs}: set {_time} to difference between now and {minesweeper::temp::%player%::start} set {_uuid} to uuid of player set {minesweeper::%{_uuid}%::highscores::%{minesweeper::temp::%player%::difficulty}%::%now%} to {_time} message "&7[&cMinesweeper&7] &fYou have found all the bombs! Game took %{_time}%, Good game!" set {minesweeper::temp::%player%::finished} to true wait 15 ticks loop {minesweeper::temp::%player%::bombs::*}: slot loop-value of event-inventory is not tnt wait 5 ticks {minesweeper::temp::%player%::finished} is set set slot loop-value of event-inventory to tnt named "&4&lBOMB" play sound "BLOCK_GRAVEL_PLACE" at volume 0.4 to player wait 3 seconds # Make sure the player is still viewing the game gui. if {minesweeper::temp::%player%::finished} is set: close player's inventory clear {_bombs} # When all bombs are flagged loop {minesweeper::temp::%player%::bombs::*}: if slot loop-value of event-inventory is redstone torch: add 1 to {_bombs} if size of {minesweeper::temp::%player%::bombs::*} is {_bombs}: # Play animation and message player. set {_time} to difference between now and {minesweeper::temp::%player%::start} set {_uuid} to uuid of player set {minesweeper::%{_uuid}%::highscores::%{minesweeper::temp::%player%::difficulty}%::%now%} to {_time} message "&7[&cMinesweeper&7] &fYou have flagged all the bombs! Game took %{_time}%, Good game!" set {minesweeper::temp::%player%::finished} to true wait 15 ticks loop {minesweeper::temp::%player%::bombs::*}: slot loop-value of event-inventory is not tnt wait 5 ticks {minesweeper::temp::%player%::finished} is set set slot loop-value of event-inventory to tnt named "&4&lBOMB" play sound "BLOCK_GRAVEL_PLACE" at volume 0.4 to player wait 3 seconds # Make sure the player is still viewing the game gui. if {minesweeper::temp::%player%::finished} is set: close player's inventory clear {_bombs} stop # Check if the player clicks a bomb. :( if {minesweeper::temp::%player%::bombs::*} contains clicked slot: # Play animation and message player. message "&7[&cMinesweeper&7] &cOh no! You found a bomb! Better luck next time." set {minesweeper::temp::%player%::finished} to true play sound "ENTITY_TNT_PRIMED" at pitch 2 to player set clicked item to tnt named "&4&lBOMB" wait 15 ticks loop {minesweeper::temp::%player%::bombs::*}: slot loop-value of event-inventory is not tnt wait 5 ticks {minesweeper::temp::%player%::finished} is set set slot loop-value of event-inventory to tnt named "&4&lBOMB" play sound "BLOCK_GRAVEL_BREAK" at volume 0.4 to player wait 3 seconds # Make sure the player is still viewing the game gui. if {minesweeper::temp::%player%::finished} is set: close player's inventory stop clicked item is white stained glass pane set clicked item to air handle(player, clicked slot, event-inventory) on inventory close: {minesweeper::temp::%player%::inventory} is set event-inventory is {minesweeper::temp::%player%::inventory} clear {minesweeper::temp::%player%::*} on quit: clear {minesweeper::temp::%player%::*} on script unload: delete {minesweeper::temp::*}