Commit graph

52 commits

Author SHA1 Message Date
Drew Stratford 80cb833594 Minesweeper: refactor on_square_clicked and flood_mark
Both on_square_clicked and flood_mark were very similar so I've
introduced the on_square_clicked_impl function which is now
called by on_square_clicked and flood_fill.
2019-07-29 19:34:31 +02:00
Drew Stratford 6b757a152a Minesweeper: updated flood_fill to use Queue 2019-07-29 19:34:31 +02:00
Drew Stratford 77cb83b629 Minesweeper: make Field::flood_fill iterative
This change uses an iterative traversal to avoid stack overflows
in, the previously recursive, flood_fill.
2019-07-29 19:34:31 +02:00
Andreas Kling 841b2e5d13 WindowServer+LibGUI: Pass window icons as shared buffers rather than paths.
Now that we support more than 2 clients per shared buffer, we can use them
for window icons. I didn't do that previously since it would have made the
Taskbar process unable to access the icons.

This opens up some nice possibilities for programmatically generated icons.
2019-07-28 10:18:49 +02:00
Andreas Kling 72a3f69df7 LibGUI: Get rid of GWindow::should_exit_event_loop_on_close().
This behavior and API was extremely counter-intuitive since our default
behavior was for applications to never exit after you close all of their
windows.

Now that we exit the event loop by default when the very last GWindow is
deleted, we don't have to worry about this.
2019-07-23 18:20:00 +02:00
Andreas Kling aa2224a2f0 GWidget: Add set_preferred_size(width, height) overload.
It was annoying to always write set_preferred_size({ width, height }). :^)
2019-07-20 22:39:24 +02:00
Andreas Kling 1c0669f010 LibDraw: Introduce (formerly known as SharedGraphics.)
Instead of LibGUI and WindowServer building their own copies of the drawing
and graphics code, let's it in a separate LibDraw library.

This avoids building the code twice, and will encourage better separation
of concerns. :^)
2019-07-18 10:18:16 +02:00
Andreas Kling 8327b12291 Minesweeper: Remove use of copy_ref(). 2019-07-11 15:53:01 +02:00
Andreas Kling b79112e6d6 AK: Add String::number() for creating a String from a number.
Instead of manually doing String::format("%d"/"%u") everywhere, let's have
a String API for this. It's just a wrapper around format() for now, but it
could be made more efficient in the future.
2019-07-03 14:56:27 +02:00
Jookia eb4c42bfa8 Minesweeper: Move configuration reading to Field
This makes more sense as it's where configuration writing happens.
2019-07-01 09:51:03 +02:00
Jookia 9dbf453015 Minesweeper: Allow single-click chording
This is how other Minesweeper games I've played usually behave.
Single-click chording can be disabled from the menu or config file.
2019-07-01 09:51:03 +02:00
VAN BOSSUYT Nicolas 802d4dcb6b Meta: Removed all gitignore in the source tree only keeping the root one 2019-06-30 10:41:26 +02:00
Andreas Kling 315716d193 GUI: Use Win2K-like "warm gray" color instead of the older colder gray.
Someone suggested this a long time ago and I never got around to it.
So here we go, here's the warm gray! I have to admit I like it better. :^)
2019-06-30 09:23:16 +02:00
Andreas Kling d403e56494 Snake: Use NonnullRefPtrVector. 2019-06-27 13:46:31 +02:00
Andreas Kling 90b1354688 AK: Rename RetainPtr => RefPtr and Retained => NonnullRefPtr. 2019-06-21 18:37:47 +02:00
Andreas Kling 39d1a9ae66 Meta: Tweak .clang-format to not wrap braces after enums. 2019-06-07 17:13:23 +02:00
Andreas Kling fba2c971e7 Games: Run clang-format on everything. 2019-06-07 11:48:15 +02:00
Robin Burchell 0dc9af5f7e Add clang-format file
Also run it across the whole tree to get everything using the One True Style.
We don't yet run this in an automated fashion as it's a little slow, but
there is a snippet to do so in makeall.sh.
2019-05-28 17:31:20 +02:00
Robin Burchell 40a5eb4e6e Minesweeper: Make things a little more friendly at the start
Rather than having the first click hit a bomb, if the first click would
hit a bomb, instead, reset the game board.

This is a (sort of) feature of Windows minesweeper, and IMO makes
playing a bit more fun :-)
2019-05-19 21:33:50 +02:00
Andreas Kling 852d648912 Fix "make clean" not deleting app binaries. 2019-05-13 14:56:18 +02:00
Andreas Kling ab42180e83 Fix some more victims of the new default layout spacing. 2019-05-11 03:06:18 +02:00
Andreas Kling ac67a2ed5e Minesweeper: Flag unflagged mines on win. 2019-05-06 13:27:58 +02:00
Andreas Kling 13b8c7eab8 Minesweeper: Fix lag when changing the field size.
Use a number of techniques to avoid freezing the UI for too long.

- Keep reusing the same widgets for the squares once they've been created.
- Temporarily disable widget updates.
- Avoid some redundant work on each run of reset().
2019-05-02 04:21:21 +02:00
Andreas Kling 75734aa003 Minesweeper: Add considering feature, where middle clicking marks with '?'
This is useful in the harder modes, for trying out different possibilities.
2019-04-28 13:55:41 +02:00
Andreas Kling 146aedc32c Minesweeper: Implement some feature requests.
Someone was playing this game and suggested a number of improvements so here
we go trying to address them:

- Add "chording" support, where you can click a numbered square using both
  mouse buttons simultaneously to sweep all non-flagged adjacent squares.

- Mis-flagged squares are now revealed as such on game over, with a special
  "bad flag" icon.

- The game timer now shows tenths of seconds. It also doesn't start until
  you click the first square.

- Add the three difficulty modes from the classic Windows version.
2019-04-26 19:54:31 +02:00
Andreas Kling 08bc5d44e7 Games: Use Makefile.common here too. 2019-04-26 15:14:28 +02:00
Andreas Kling b3f7f5436a Snake+Minesweeper: Exit process when game window is closed. 2019-04-21 04:11:29 +02:00
Andreas Kling a56e1afb64 Snake: Show the highest score achieved so far (in this session.) 2019-04-20 21:24:38 +02:00
Andreas Kling 0dcb7a234e LibGUI+Minesweeper: Add GWindow::set_resizable(). 2019-04-20 21:24:02 +02:00
Andreas Kling a0633c298b Snake: Add a window icon. :^) 2019-04-20 20:14:02 +02:00
Andreas Kling ca9a430965 Snake: Disable double-buffering for the game window.
There's no need to use automatic double-buffering here since we manage the
backing store manually.
2019-04-20 19:51:10 +02:00
Andreas Kling c9b86be1cc Snake: Add some more fruit types. 2019-04-20 18:50:41 +02:00
Andreas Kling 4619019481 Snake: Tweak game speed so it's not too easy. 2019-04-20 17:46:59 +02:00
Andreas Kling 79573ce7e6 Snake: Try to only repaint the parts that actually changed between ticks. 2019-04-20 15:04:34 +02:00
Andreas Kling 301a269ca0 Get rid of SERENITY macro since the compiler already defines __serenity__
This makes it a bit easier to use AK templates out-of-tree.
2019-04-20 12:58:49 +02:00
Andreas Kling 6ef8e2df5a Snake: Use a vegetable icon for the fruit. 2019-04-20 04:00:32 +02:00
Andreas Kling 09c087177c Snake: Clear the movement queue on game reset. 2019-04-20 03:47:35 +02:00
Andreas Kling b41e95b578 Snake: Use a queue for the movement inputs.
This makes it a lot less finicky to make rapid moves like staircasing and
sudden turns.
2019-04-20 03:44:56 +02:00
Andreas Kling e24e486714 Snake: Flesh out a basic snake game :^) 2019-04-20 03:24:50 +02:00
Andreas Kling eca9494adf Snake: Import skeleton of a new snake game. 2019-04-20 01:54:10 +02:00
Andreas Kling c8e601a5d5 Minesweeper: Add little icons to the flags and timer labels. 2019-04-15 03:12:28 +02:00
Andreas Kling 791e8f5bb0 Minesweeper: Paint a grid pattern below the mines. 2019-04-15 02:45:04 +02:00
Andreas Kling bc5148354f LibCore: Add a CConfigFile class, a simple INI file parser.
You open the configuration for an app like so:

    auto config = CConfigFile::get_for_app("MyApp");

This will then open ~/MyApp.ini and parse it for you.
Immediately start using it in Minesweeper to load the field size and mine
count from a config file.
2019-04-15 02:23:20 +02:00
Andreas Kling 1503834c3b Minesweeper: Add flag counter and game timer. 2019-04-14 21:01:52 +02:00
Andreas Kling 0e30f4e412 Minesweeper: Flood fill should include the first numbered found. 2019-04-14 05:53:13 +02:00
Andreas Kling c09c114d77 WindowServer+LibGUI: Add ability to set per-window icons.
The icons are passed around as filesystem paths for now, since the shared
memory bitmaps only support 2 sides.
2019-04-13 16:59:55 +02:00
Andreas Kling 28cf9a41fe Minesweeper: Make it possible to win the game. :^) 2019-04-13 15:51:29 +02:00
Andreas Kling 198a1a6877 Minesweeper: Add some menus. 2019-04-13 14:32:18 +02:00
Andreas Kling 49b63efddb Minesweeper: Turn the field into a GFrame for that containery look. 2019-04-13 14:22:40 +02:00
Andreas Kling 3f37665492 Minesweeper: Fix wrong adjacency numbers on right and bottom edges. 2019-04-13 14:14:38 +02:00