From 61a6d899d2d9c4a77f723dda4a508567bbfbda7c Mon Sep 17 00:00:00 2001 From: Ghommie Date: Wed, 26 Jun 2019 00:21:06 +0200 Subject: [PATCH] Should be ready. --- code/game/machinery/computer/arcade.dm | 12 +- .../machinery/computer/arcade/minesweeper.dm | 208 +++++++++--------- code/modules/client/asset_cache.dm | 24 +- icons/misc/minesweeper_tiles.dmi | Bin 4583 -> 0 bytes icons/misc/minesweeper_tiles/eight.png | Bin 0 -> 392 bytes icons/misc/minesweeper_tiles/empty.png | Bin 0 -> 84 bytes icons/misc/minesweeper_tiles/five.png | Bin 0 -> 454 bytes icons/misc/minesweeper_tiles/flag.png | Bin 0 -> 487 bytes icons/misc/minesweeper_tiles/four.png | Bin 0 -> 491 bytes icons/misc/minesweeper_tiles/hidden.png | Bin 0 -> 164 bytes icons/misc/minesweeper_tiles/mine.png | Bin 0 -> 275 bytes icons/misc/minesweeper_tiles/minehit.png | Bin 0 -> 256 bytes icons/misc/minesweeper_tiles/one.png | Bin 0 -> 326 bytes icons/misc/minesweeper_tiles/seven.png | Bin 0 -> 352 bytes icons/misc/minesweeper_tiles/six.png | Bin 0 -> 468 bytes icons/misc/minesweeper_tiles/three.png | Bin 0 -> 449 bytes icons/misc/minesweeper_tiles/two.png | Bin 0 -> 503 bytes 17 files changed, 126 insertions(+), 118 deletions(-) delete mode 100644 icons/misc/minesweeper_tiles.dmi create mode 100644 icons/misc/minesweeper_tiles/eight.png create mode 100644 icons/misc/minesweeper_tiles/empty.png create mode 100644 icons/misc/minesweeper_tiles/five.png create mode 100644 icons/misc/minesweeper_tiles/flag.png create mode 100644 icons/misc/minesweeper_tiles/four.png create mode 100644 icons/misc/minesweeper_tiles/hidden.png create mode 100644 icons/misc/minesweeper_tiles/mine.png create mode 100644 icons/misc/minesweeper_tiles/minehit.png create mode 100644 icons/misc/minesweeper_tiles/one.png create mode 100644 icons/misc/minesweeper_tiles/seven.png create mode 100644 icons/misc/minesweeper_tiles/six.png create mode 100644 icons/misc/minesweeper_tiles/three.png create mode 100644 icons/misc/minesweeper_tiles/two.png diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 6f064d64df..11698ae586 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -41,7 +41,6 @@ /obj/item/toy/toy_xeno = ARCADE_WEIGHT_TRICK, /obj/item/toy/windupToolbox = ARCADE_WEIGHT_TRICK, - /obj/item/twohanded/dualsaber/toy = ARCADE_WEIGHT_RARE, /mob/living/simple_animal/bot/secbot/grievous/toy = ARCADE_WEIGHT_RARE, /obj/item/clothing/mask/facehugger/toy = ARCADE_WEIGHT_RARE, /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = ARCADE_WEIGHT_TRICK, @@ -93,7 +92,7 @@ return INITIALIZE_HINT_QDEL Reset() -/obj/machinery/computer/arcade/proc/prizevend(mob/user) +/obj/machinery/computer/arcade/proc/prizevend(mob/user, list/rarity_classes) SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade) if(prob(1) && prob(1) && prob(1)) //Proper 1 in a million @@ -101,7 +100,14 @@ SSmedals.UnlockMedal(MEDAL_PULSE, usr.client) if(!contents.len) - var/prizeselect = pickweight(prizes) + var/list/toy_raffle + if(rarity_classes) + for(var/A in prizes) + if(prizes[A] in rarity_classes) + LAZYSET(toy_raffle, A, prizes[A]) + if(!toy_raffle) + toy_raffle = prizes + var/prizeselect = pickweight(toy_raffle) new prizeselect(src) var/atom/movable/prize = pick(contents) diff --git a/code/game/machinery/computer/arcade/minesweeper.dm b/code/game/machinery/computer/arcade/minesweeper.dm index f3f810a5fc..fe69860f76 100644 --- a/code/game/machinery/computer/arcade/minesweeper.dm +++ b/code/game/machinery/computer/arcade/minesweeper.dm @@ -2,7 +2,7 @@ #define MINESWEEPER_GAME_PLAYING 1 #define MINESWEEPER_GAME_LOST 2 #define MINESWEEPER_GAME_WON 3 -#define MINESWEEPERIMG(what) {""} //Basically bypassing asset.icon_tag() +#define MINESWEEPERIMG(what) {""} //Basically bypassing asset.icon_tag() /obj/machinery/computer/arcade/minesweeper name = "Minesweeper" @@ -25,51 +25,51 @@ var/rows = 1 var/columns = 1 var/table[31][51] //Make the board boys, 30x50 board + var/spark_spam = FALSE /obj/machinery/computer/arcade/minesweeper/interact(mob/user) - var/web_difficulty_menu = " Reveal all the squares without hitting a mine!
What difficulty do you want to play?



Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom" - var/static_web = "Minesweeper
Minesweeper
" //When we need to revert to the main menu we set web as this - var/static_emagged_web = "Minesweeper
Minesweeper EXTREME EDITION: Iteration #[randomnumber]
" //Different colour mix for every random number made - var/emagged_web_difficulty_menu = "Explode in the game, explode in real life!
What difficulty do you want to play?



Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom" + var/emagged = CHECK_BITFIELD(obj_flags, EMAGGED) + var/dat + if(game_status == MINESWEEPER_GAME_MAIN_MENU) + dat += "Minesweeper
Minesweeper[emagged ? " EXTREME EDITION: Iteration #[randomnumber]" : ""]
" //Different colour mix for every random number made + dat += " [emagged ? "Explode in the game, explode in real life" : "Reveal all the squares without hitting a mine"]!
What difficulty do you want to play?



Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom" + else + dat = saved_web user = usr - var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/minesweeper) + var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/simple/minesweeper) assets.send(user) - if(game_status == MINESWEEPER_GAME_MAIN_MENU) - if(obj_flags & EMAGGED) - playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, 0, extrarange = -3, falloff = 10) - user << browse(static_emagged_web+emagged_web_difficulty_menu,"window=minesweeper,size=400x500") - else - playsound(loc, 'sound/arcade/minesweeper_startup.ogg', 50, 0, extrarange = -3, falloff = 10) - user << browse(static_web+web_difficulty_menu,"window=minesweeper,size=400x500") - else - playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10) - user << browse(saved_web,"window=minesweeper,size=400x500") - if(obj_flags & EMAGGED) - do_sparks(5, 1, src) + user << browse(dat,"window=minesweeper,size=400x500") add_fingerprint(user) - ..() + . = ..() + +/obj/machinery/computer/arcade/minesweeper/proc/reset_spark_spam() + spark_spam = FALSE /obj/machinery/computer/arcade/minesweeper/Topic(href, href_list) - if(..()) + . = ..() + if(.) return - var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/minesweeper) var/exploding_hell = FALSE //For emagged failures var/reset_board = FALSE - var/prizevended = TRUE var/mob/living/user = usr //To identify who the hell is using this window, this should also make things like aliens and monkeys able to use the machine!! var/web_difficulty_menu = " Reveal all the squares without hitting a mine!
What difficulty do you want to play?



Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom" var/web = "Minesweeper
Minesweeper
" var/static_web = "Minesweeper
Minesweeper
" //When we need to revert to the main menu we set web as this web = static_web - web += sheet.css_tag() - if(obj_flags & EMAGGED) + if(CHECK_BITFIELD(obj_flags, EMAGGED)) web = "Minesweeper
Minesweeper EXTREME EDITION: Iteration #[randomnumber]
" //Different colour mix for every random number made - do_sparks(5, 1, src) + if(!spark_spam) + do_sparks(5, 1, src) + spark_spam = TRUE + addtimer(CALLBACK(src, .proc/reset_spark_spam), 30) + + + var/startup_sound = CHECK_BITFIELD(obj_flags, EMAGGED) ? 'sound/arcade/minesweeper_emag2.ogg' : 'sound/arcade/minesweeper_startup.ogg' if(href_list["Main_Menu"]) game_status = MINESWEEPER_GAME_MAIN_MENU @@ -78,7 +78,7 @@ columns = 0 mine_placed = 0 if(href_list["Easy"]) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10) flag_text = "OFF" game_status = MINESWEEPER_GAME_PLAYING reset_board = TRUE @@ -87,7 +87,7 @@ columns = 10 mine_limit = 10 if(href_list["Intermediate"]) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10) flag_text = "OFF" game_status = MINESWEEPER_GAME_PLAYING reset_board = TRUE @@ -96,7 +96,7 @@ columns = 17 mine_limit = 40 if(href_list["Hard"]) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) + playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10) flag_text = "OFF" game_status = MINESWEEPER_GAME_PLAYING reset_board = TRUE @@ -105,16 +105,12 @@ columns = 31 mine_limit = 99 if(href_list["Custom"]) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) - flag_text = "OFF" - game_status = MINESWEEPER_GAME_PLAYING - reset_board = TRUE - difficulty = "Custom" - rows = text2num(input(usr, "How many rows do you want? (Maximum of 30 allowed)", "Minesweeper Rows"))+1 //+1 as dm arrays start at 1 - columns = text2num(input(usr, "How many columns do you want? (Maximum of 50 allowed)", "Minesweeper Squares"))+1 //+1 as dm arrays start at 1 - var/grid_area = (rows-1)*(columns-1) - mine_limit = text2num(input(usr, "How many mines do you want? (Maximum of [round(grid_area*0.85)] allowed)", "Minesweeper Mines")) - custom_generation() + if(custom_generation(usr)) + flag_text = "OFF" + game_status = MINESWEEPER_GAME_PLAYING + reset_board = TRUE + difficulty = "Custom" + playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10) if(href_list["Flag"]) playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10) if(!flagging) @@ -125,7 +121,7 @@ flag_text = "OFF" if(game_status == MINESWEEPER_GAME_MAIN_MENU) - if(obj_flags & EMAGGED) + if(CHECK_BITFIELD(obj_flags, EMAGGED)) playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, 0, extrarange = -3, falloff = 10) web += "Explode in the game, explode in real life!
What difficulty do you want to play?



Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom" else @@ -133,7 +129,6 @@ web += web_difficulty_menu if(game_status == MINESWEEPER_GAME_PLAYING) - prizevended = FALSE mine_sound = TRUE area = (rows-1)*(columns-1) @@ -161,7 +156,7 @@ else if(game_status != MINESWEEPER_GAME_LOST && game_status != MINESWEEPER_GAME_WON) game_status = MINESWEEPER_GAME_LOST - if(obj_flags & EMAGGED && !exploding_hell) + if(CHECK_BITFIELD(obj_flags, EMAGGED) && !exploding_hell) exploding_hell = TRUE explode_EVERYTHING() if(mine_sound) @@ -204,17 +199,17 @@ if(game_status != MINESWEEPER_GAME_PLAYING) web += "[MINESWEEPERIMG(flag)]" else - web += "" + web += "[MINESWEEPERIMG(flag)]" if(0) if(game_status != MINESWEEPER_GAME_PLAYING) web += "[MINESWEEPERIMG(mine)]" else - web += "" //Make unique hrefs for every square + web += "[MINESWEEPERIMG(hidden)]" //Make unique hrefs for every square if(1 to 9) if(game_status != MINESWEEPER_GAME_PLAYING) web += "[MINESWEEPERIMG(hidden)]" else - web += "" //Make unique hrefs for every square + web += "[MINESWEEPERIMG(hidden)]" //Make unique hrefs for every square if(10) web += "[MINESWEEPERIMG(minehit)]" if(11) @@ -242,40 +237,37 @@ if(safe_squares_revealed >= win_condition && game_status == MINESWEEPER_GAME_PLAYING) game_status = MINESWEEPER_GAME_WON + if(rows < 10 || columns < 10) //If less than easy difficulty + playsound(loc, 'sound/arcade/minesweeper_winfail.ogg', 50, 0, extrarange = -3, falloff = 10) + say("You cleared the board of all mines, but you picked too small of a board! Try again with at least a 9x9 board!") + else + playsound(loc, 'sound/arcade/minesweeper_win.ogg', 50, 0, extrarange = -3, falloff = 10) + say("You cleared the board of all mines! Congratulations!") + if(CHECK_BITFIELD(obj_flags, EMAGGED)) + var/itemname + switch(rand(1,3)) + if(1) + itemname = "a syndicate bomb beacon" + new /obj/item/sbeacondrop/bomb(loc) + if(2) + itemname = "a grenade launcher" + new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(loc) + new /obj/item/ammo_casing/a40mm(loc) + new /obj/item/ammo_casing/a40mm(loc) + new /obj/item/ammo_casing/a40mm(loc) + if(3) + itemname = "two bags of c4" + new /obj/item/storage/backpack/duffelbag/syndie/c4(loc) + new /obj/item/storage/backpack/duffelbag/syndie/x4(loc) + message_admins("[key_name_admin(user)] won emagged Minesweeper and got [itemname]!") + visible_message("[src] dispenses [itemname]!", "You hear a chime and a clunk.") + DISABLE_BITFIELD(obj_flags, EMAGGED) + else + var/dope_prizes = (area >= 480) ? list(ARCADE_WEIGHT_RARE) : (area >= 256) ? list(ARCADE_WEIGHT_RARE, ARCADE_WEIGHT_TRICK) : null + prizevend(user, dope_prizes) if(game_status == MINESWEEPER_GAME_WON) - if(rows < 10 || columns < 10) //If less than easy difficulty - if(!prizevended) - playsound(loc, 'sound/arcade/minesweeper_winfail.ogg', 50, 0, extrarange = -3, falloff = 10) - say("You cleared the board of all mines, but you picked too small of a board! Try again with at least a 9x9 board!") - prizevended = TRUE - web += "You won, but your board was too small! Pick a bigger board next time!
Want to play again?
Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom

Play on the same board
Return to Main Menu

" - else - if(!prizevended) - playsound(loc, 'sound/arcade/minesweeper_win.ogg', 50, 0, extrarange = -3, falloff = 10) - say("You cleared the board of all mines! Congratulations!") - if(obj_flags & EMAGGED) - var/itemname - switch(rand(1,3)) - if(1) - itemname = "a syndicate bomb beacon" - new /obj/item/sbeacondrop/bomb(loc) - if(2) - itemname = "a grenade launcher" - new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(loc) - new /obj/item/ammo_casing/a40mm(loc) - new /obj/item/ammo_casing/a40mm(loc) - new /obj/item/ammo_casing/a40mm(loc) - if(3) - itemname = "two bags of c4" - new /obj/item/storage/backpack/duffelbag/syndie/c4(loc) - new /obj/item/storage/backpack/duffelbag/syndie/x4(loc) - message_admins("[key_name_admin(user)] won emagged Minesweeper and got [itemname]!") - visible_message("[src] dispenses [itemname]!", "You hear a chime and a clunk.") - else - prizevend(user) - prizevended = TRUE - web += "Congratulations, you have won!
Want to play again?
Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom

Play on the same board
Return to Main Menu

" + web += "[(rows < 10 || columns < 10) ? "You won, but your board was too small! Pick a bigger board next time!" : "Congratulations, you have won!"]
Want to play again?
Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom

Play on the same board
Return to Main Menu
" if(game_status == MINESWEEPER_GAME_LOST) web += "You have lost!
Try again?
Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom

Play on the same board
Return to Main Menu
" @@ -285,18 +277,20 @@ web += "
Difficulty: [difficulty]
Mines: [mine_placed]
Rows: [rows-1]
Columns: [columns-1]
Flagging mode: [flag_text]
" web += "
" - saved_web = web - user << browse(web,"window=minesweeper,size=400x500") + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/minesweeper) + saved_web = sheet.css_tag() + saved_web += web + updateDialog() return /obj/machinery/computer/arcade/minesweeper/emag_act(mob/user) - if(obj_flags & EMAGGED) + if(CHECK_BITFIELD(obj_flags, EMAGGED)) return desc = "An arcade machine that generates grids. It's clunking and sparking everywhere, almost as if threatening to explode at any moment!" do_sparks(5, 1, src) randomnumber = rand(1,255) randomcolour = rgb(randomnumber,randomnumber/2,randomnumber/3) - obj_flags |= EMAGGED + ENABLE_BITFIELD(obj_flags, EMAGGED) if(game_status == MINESWEEPER_GAME_MAIN_MENU) to_chat(user, "An ominous tune plays from the arcade's speakers!") playsound(user, 'sound/arcade/minesweeper_emag1.ogg', 100, 0, extrarange = 3, falloff = 10) @@ -305,33 +299,29 @@ playsound(user, 'sound/machines/buzz-sigh.ogg', 100, 0, extrarange = 3, falloff = 10) //Loud buzz game_status = MINESWEEPER_GAME_MAIN_MENU -/obj/machinery/computer/arcade/minesweeper/proc/custom_generation() +/obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user) playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) //Entered into the menu so ping sound - if(rows < 4) - rows = text2num(input(usr, "You must put at least 4 rows! Pick a higher amount of rows", "Minesweeper Rows"))+1 //+1 as dm arrays start at 1 - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) - custom_generation() - if(columns < 4) - columns = text2num(input(usr, "You must put at least 4 columns! Pick a higher amount of columns", "Minesweeper Columns"))+1 //+1 as dm arrays start at 1 - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) - custom_generation() - if(rows > 31) - rows = text2num(input(usr, "A maximum of 30 rows are allowed! Pick a lower amount of rows", "Minesweeper Rows"))+1 //+1 as dm arrays start at 1 - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) - custom_generation() - if(columns > 51) - columns = text2num(input(usr, "A maximum of 50 columns are allowed! Pick a lower amount of columns", "Minesweeper Columns"))+1//+1 as dm arrays start at 1 - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) - custom_generation() - var/grid_area = (rows-1)*(columns-1) //Need a live update of this, won't update if we use the area var in topic - if(mine_limit > round(grid_area*0.85)) - mine_limit = text2num(input(usr, "You can only put in [round(grid_area*0.85)] mines on this board! Pick a lower amount of mines to insert", "Minesweeper Mines")) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) - custom_generation() - if(mine_limit < round(grid_area/6.4)) //Same mine density as intermediate difficulty - mine_limit = text2num(input(usr, "You must at least put [round(grid_area/6.4)] mines on this board! Pick a higher amount of mines to insert", "Minesweeper Mines")) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) - custom_generation() + var/new_rows = input(user, "How many rows do you want? (Minimum: 4, Maximum: 30)", "Minesweeper Rows") as null|num + if(!new_rows || !user.canUseTopic(src, !issilicon(user))) + return FALSE + new_rows = CLAMP(new_rows + 1, 4, 30) + playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) + var/new_columns = input(user, "How many columns do you want? (Minimum: 4, Maximum: 50)", "Minesweeper Squares") as null|num + if(!new_columns || !user.canUseTopic(src, !issilicon(user))) + return FALSE + new_columns = CLAMP(new_columns + 1, 4, 50) + playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) + var/grid_area = (new_rows - 1) * (new_columns - 1) + var/lower_limit = round(grid_area*0.156) + var/upper_limit = round(grid_area*0.85) + var/new_mine_limit = input(user, "How many mines do you want? (Minimum: [lower_limit], Maximum: [upper_limit])", "Minesweeper Mines") as null|num + if(!new_mine_limit || !user.canUseTopic(src, !issilicon(user))) + return FALSE + playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) + rows = new_rows + columns = new_columns + mine_limit = CLAMP(new_mine_limit, lower_limit, upper_limit) + return TRUE /obj/machinery/computer/arcade/minesweeper/proc/make_mines(var/reset_everything) if(mine_placed < mine_limit) @@ -381,9 +371,9 @@ column_limit = 10 if(mine_limit > (rows*columns) * 0.25) mine_limit_v2 = 24 - message_admins("[key_name_admin(user)] failed Minesweeper and has unleashed an explosion armageddon of size [row_limit],[column_limit] around [ADMIN_LOOKUPFLW(user.loc)]!") + message_admins("[key_name_admin(user)] failed an emagged Minesweeper arcade and has unleashed an explosion armageddon of size [row_limit],[column_limit] around [ADMIN_LOOKUPFLW(user.loc)]!") if(mine_limit_v2 < 10) - explosion(loc, 2, 4, 8, 16) //Thought you could survive by putting as few mines as possible, huh?? + explosion(loc, 2, 5, 10, 15) //Thought you could survive by putting as few mines as possible, huh?? else explosion(loc, 1, 3, rand(1,5), rand(1,10)) for(var/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 Rd-?zX002ovPDHLkV1mi!+5i9m diff --git a/icons/misc/minesweeper_tiles/eight.png b/icons/misc/minesweeper_tiles/eight.png new file mode 100644 index 0000000000000000000000000000000000000000..3a5c4179efe59564ee6031ed3a20da3736d961f3 GIT binary patch literal 392 zcmV;30eAk1P)gM)Z@c(b#!t*xzneSO2j!>+EbkdTm;mX?*3m6w;7 zj*gCohK8`Pu+GlT#l^*^r>BB~f|Qh$ot>SWoSc!7k*TSv#KgqL#>RkvfTE(JcXxNQ zjW%Ea005*(L_t&-m0gd?7J@Jg09%j-N(0ojxBzaTh`90p-zII*_jGQV!z3Yu5c+{w zsN-53Yv{;hpkaQX4do#SjG`zOkjUQ9F%$7*I-4&Pq}+%l;L4Tm8aKj-EKgan-R%$T zSY{>?c%TqbfnS;VbgtQ@xi&5HZgwyCY(!BSj0J%J#E{-7_ dGm{e(c!4|v21e&8+tYz822WQ%mvv4FO#p3M5fuOc literal 0 HcmV?d00001 diff --git a/icons/misc/minesweeper_tiles/five.png b/icons/misc/minesweeper_tiles/five.png new file mode 100644 index 0000000000000000000000000000000000000000..dacf837f9bd93f6662caafb957d8afc3568e9151 GIT binary patch literal 454 zcmV;%0XhDOP)3KtO^D3(4HvzrMf5($dD$)5+c3u7`(( z6cxkD%C3rvu8WMXjEu38lb%{ygANdQ004jk0+2d9$JNxy+uMZ_6NC~HgcKBm4iAz$ zJI?9p#?{s2bm)2j005>*L_t&-m2J=062c%5g<&8HMv02OMvbwT*n98q|3vO$^vdsU z|2e}9gb>QUC_&5!d<7ZY)Zkov@Q?``7Um)%EfkH#br2DiNTxtKll6nl#q*$0#8)x! zQrWicO0}kgqw21bQYyF6Y(b&zPPYg81I~vYPDbMin$Dz{W1x%WY7I79SL`q_$FlZF wiNo=Pi}U4r)9#Na(|<8N-%H=H`62(j0e>(Pi@vp_E&u=k07*qoM6N<$g5qwzA91t=ZYL$;rC9x^8Z6fPjFxxw*f;zren}xYX3J?d{=K zR{sD1-(6k2%*?>Qzreu2vgzsTIy(3f5&Q=S-ehETb#=M8xVhEU?<*_*007-&WW318 z%bT0}4-dQ0(9ws7(}IHVEG*?@WWC47y3o+no13gBC!1bg#LUdb#>Uj#+*4v=Rb5@u z($de*&yJ3ce}8{CI5;&mHJqHB&d$!o#l^|V$(ov)BO@aK001*HGnJKHgA{V%_@FE&DdaXdmcjO`Am%WcOPdjx`z zm-_sHAcVpqV~l@;FA|N#Az?uB1*vofAPc!Kc=LrKz%PiUa-|A23#eFcG+XTs{Q{#> zx7Qz7APwcwcru;MKd_LOD@9S(n=NMm-t85$!_i!*r}O3A^`;q5JyhM9Y3!~O#0k8W dP6&FC|DL^W8($AV&jn#8P literal 0 HcmV?d00001 diff --git a/icons/misc/minesweeper_tiles/four.png b/icons/misc/minesweeper_tiles/four.png new file mode 100644 index 0000000000000000000000000000000000000000..17a2bdfeb460016c3c8c8e64344751211c9a6585 GIT binary patch literal 491 zcmV=ph@ya<9lSmw$+ATJ zUMGVCK_wK9P$e4s2#6<=G?mU!mK8n%=kiP~6ibwqEA|nn*6NzlXttQv?sRzs_xh9& zNhP|j42E35Xgo0tV>)Bne6h5Tz-rCeY$@CAogxPt^T@x%eq9kVPZBx1#pQatKb|fD hOUrs;loyG&JnoxpV*i{Ra*lC@n2Lc<^9ZSy^#$@$(~pB7ho=JY5_^IA$g%G%zT# zrHKm^_@+OYv6YMEN@CC3kmLFVdQ&MBb@0BsjS`v3p{ literal 0 HcmV?d00001 diff --git a/icons/misc/minesweeper_tiles/mine.png b/icons/misc/minesweeper_tiles/mine.png new file mode 100644 index 0000000000000000000000000000000000000000..e16c89c2a83b7fbc685d616cc67454d99a403957 GIT binary patch literal 275 zcmV+u0qp*XP)zP{Ml*u}-g>FMcaW@Z2Y0J^%mQc_Y64-W_k2uMgs1_lOpc6L}; zSj)@H|NsAujg3l5N@ZnbjEsyxKtRyiynp}z0DwtEK~xx(WslnugD?n0v#7a{1XFFb z{r?|rK&La-ePKAj0?wI01osnwVH}4Zj(qZgVoH&MpRDdVmnu?AX0JU6d1h6cb1*=K zA6S$Wb;cSipupDzYGlj85j~67-|_9 zSQr={F)$P|Fo-cQ@GvkuWMD`Es$^i`U|=YzuHL_Ye?&yY|NsAcdwb&<7-|?8dU|>s z92}Av7&6#oErIHaJzX3_B&MeJNAev|;BZOZwPI~q{JZ+gRvELloNI4U=Sk@CVlZ6q z!s6R3axZ>C?oY3CyYE@OpZnHYwJDJ&M5di7XU4PEBSI?d;?GKxdlz$mJKX+s567R4 z%FRlww}O`Fn)F(pUnWz1{QZslNmpNeExi9({!21z@7cu%cYxgK>FVdQ&MBb@017== Ap#T5? literal 0 HcmV?d00001 diff --git a/icons/misc/minesweeper_tiles/one.png b/icons/misc/minesweeper_tiles/one.png new file mode 100644 index 0000000000000000000000000000000000000000..a84e6010a3e87f1072a65cd67c34075c3053fd7c GIT binary patch literal 326 zcmV-M0lEH(P)OXbhcy58NjWMtg}0{%}=eh` zTzb*|$_w;>E?i*VnjHRO8pzx5dT2$jH5ulg*Zu%sV^l z7#Q}{)VVb??GF$66cqP0GwjvXx7^&e)z!H9Q9-2u004SPL_t&-m2J$~5`r)ch2bQ1 zIk;O8t%~d-;QK$H4s>dn@xT1$Bt&B@On#zfb6;e!M6mjatT$Wilmpoxj(~Q+p#~x! zPH}wp7sMBHodB`Y)5Yzc0Lde@!dYIFKw0G3C~PVWRmMX7Y+m1*wzfCY^+RuQUv2cS Y4=`&72M5N+#*~zlD=RA)7#NL>jmyi+&(F_qZ*L(XA>rZSpP!#NI5->}9DRL# z%*@Qu(a~aJVmv%N-rnA(rlv+lMiUbgXJ=>4&CSrz&_zW>S65dI3=CFQRx(Q_>i_@% zf=NU{R2Y?Qj7Ji}Fc1WHWf(9biX2T&#>VFVk7EU8EeHBGU0p*&Y$}*MCaP7`jckq( zXf&lUv5J-z!R=1h)9V8RFNocT;RqPp@2zJtongLM2EnT}ut`kVZo9+&aMa**1}<0K y?siA|$W-J{pwNIgE6VbvflsW>f3_Hb{__SJp9nJCv~iID00000ZeE*2l-&$;lRkh5&wk0Dpi0d3peL zcK~#D7lVY^$;jc$%K&+{wwB zv$NC2#)hq~6oiFlqN9^gM$== zggTIt>CVpA$H&#j#&^(4U;qFBu1Q2eR2Y?Q&)F8iFc5&@Bq#}`V=J|_N>MwtQ?)Pe z|3I3iz4P7WKXWDtLI`0ZU?jxi2|*&_oJ>*1(R7B-U^$ypAnz*_OFWP=Rn$sV)3jQ> z5rk$-ftqgk+QC*H%ud&`tX^M=CI&VDsB}0QV-e_NI-4&{bLoTuR`Ock0NVz^zs26| z562T_E)Q5bGX|dLsqAt!_}19%{&;fk>n+|+K92Au;qPz+{qqCtWfO~6z&#fL0000< KMNUMnLSTYo*Whsg literal 0 HcmV?d00001 diff --git a/icons/misc/minesweeper_tiles/three.png b/icons/misc/minesweeper_tiles/three.png new file mode 100644 index 0000000000000000000000000000000000000000..1c128d88eefcb05fa5520ba581eb55493a76a4c2 GIT binary patch literal 449 zcmV;y0Y3hTP)`4AAd+}ys!#k$bYxYgCQ-`~-Qi2Mf!yv)qmaB$^IOXN^c;#5@bGc)!W7|@N4 zyvxhE)YR}UF7Pcavg+!*%F5M#e&1nX-DG6kX=&*|K=>6E(}97##>TqO&$-jn(uRin z2?^1PiqDIS&y0-Cl9J(BS^5tTwBh0Y0RiedI=R)=w%gnI5fS(j6897o`4124Iy$oH z>9^V0w%ptbm~vtO005y$L_t&-m2J+|7Q!$PMbS)(++xLAin|nt;_mSOUj#`5PwcnM znw*3&MqD8#am}ar1L90t5W0j=n2Uu76dlpn=N1|9gpf=DX;Wm#vaF14XLCT_^tx0i zmdceXYW0R1G+Q##?r`s6a=N|#V2IJUAR80In7Xbu1LmSZ&SJUxSZ{!>81UWqAJ`v` rV&inaT&3InA*1~HQta;|KkT13RGbk@`>(Y@00000NkvXXu0mjfmuKh{ literal 0 HcmV?d00001 diff --git a/icons/misc/minesweeper_tiles/two.png b/icons/misc/minesweeper_tiles/two.png new file mode 100644 index 0000000000000000000000000000000000000000..ff74af5c82544f4de75dbfec809082e421ede6bc GIT binary patch literal 503 zcmVi6_^`*Wt_I0CoTXaR6 zr-EjkW-p2_i>!;%#?p4Ac6X(B8ig9n!^{DF0XUC1RhCtkt(V)%+t0<%0CxZZe*vSm zqm;3fjIE4}u8fbbkIBQy0(%18$=%z@+Y*8j6oV8ai6hy`*<`)a$p8QVxk*GpR2Y?Q z&({)yFc1aMBv>OVBnb9~V(-28UQqx4VgRsl0vJ(o8M#S-zASpi_hFf!Fzy`eN) zZF>>ybbI{)A<}Tfb9X$M5;ExbK6#d%E8fL&wcZ#N)*x+*cVcpXIG*(L#a_$4MZy+( ty|J}-(|mBLr)tl<(qAgFkAXknk2g3v6}RRjXZt$# literal 0 HcmV?d00001