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 = "
MinesweeperMinesweeper 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 += ""
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/y69=y-row_limit;y69