* Split FileStream declarations and definitions
* Split JobPool declarations and definitions
* Split StringBuilder declarations and definitions
* Split StringReader declarations and definitions
* Split ZoomLevel declarations and definitions
* Fix missing include in FileClassifier.cpp
* Remove pragma once from source files
* Fix missing include in StringBuilder.h
* Update Xcode project
* Fix compilation of tests
Co-authored-by: Michael Steenbeek <m.o.steenbeek@gmail.com>
* Stop guests from being forced to the center line of a path over time
Change the way we apply randomness to peep destinations when moving from one tile to the next, to allow peeps that are moving along a straight path to maintain their perpendicular offset relative to the path direction, instead of being (eventually) forced back to the center line.
* Update test expectations
The changes to guest movement mean that the number of steps taken for these expected paths are now slightly different to before.
* Close#12388, refactor:PeepState to use strong enum
* refactor: refactored file PlayTests.cpp
* refactor: change PEEP_STATE_ to PeepState:: and camel case after merging
chore: code reformatting
Consolidate all the guest pathfinding code from Peep.cpp into GuestPathfinding.cpp, and make a dedicated header for GuestPathfinding to help make it easier to see what the actual public interface is to the pathfinding system.
* Reduce use of get_sprite
* Update src/openrct2/world/Sprite.cpp
Co-authored-by: Michael Steenbeek <m.o.steenbeek@gmail.com>
Co-authored-by: Michael Steenbeek <m.o.steenbeek@gmail.com>
* Fix#11963 - Refactor Peep::OutsideOfPark
Changed the definition of Peep::OutsideOfPark from uint8_t to bool and refactored all its occurences in code accordingly.
* Fix#11963 - Refactor Peep::OutsideOfPark
One forgotten instance of Peep::OutsideOfPark occurrence
* Fix#11963 - Refactor Peep::OutsideOfPark
Fix code according to a review suggestion.
* Rename Peep::destination_tolerance to use TitleCase
* Rename Peep::destination_y to use TitleCase
* Rename Peep::destination_x to use TitleCase
* Rename Peep::trousers_colour to use Title Case
* Rename Peep::tshirt_colour to use TitleCase
* Rename Peep::no_of_rides to use Title Case
* Rename Peep::staff_type to use TitleCase
* Rename Peep::type to use TitleCase
* Rename Peep::sprite_type to use TitleCase
* Rename Peep::sub_state to use TitleCase
* Rename Peep::state to use TitleCase
* Rename Peep::outside_of_park to use TitleCase
* Rename Peep::next_flags to use TitleCase
* Rename Peep::name to use TitleCase
* Rename Peep::NoOfRides to GuestNoOfRides
* Rename Peep::Type to AssignedPeepType
* Rename Peep::GuestNoOfRides to GuestNumRides
The code being removed in the patch tries to fast forward a peep into the ride when it is the second peep for a vehicle that is used in pairs. Problem is that funds checking does not happen, so it happens that a peep may pay against its will.
Lets say a rich peep enters in line and a poor peep enters in line right after.
If the price of the ride is such that the rich peep can pay and the poor peep can't, it will be dragged into the ride because funds checking only happened for the first.
The second part of the patch just adjusts we consider the vehicle a full car if the second position is filled.
Add test to verify that a peep is not dragged into a ride it can't pay
This test puts two peeps in a Ferris Wheel. The first peep is rich and the second peep is poor. When they are both in line, the ride price is raised so that the poor peep can't pay.
Make sure the poor peep turns back and leaves the ride.
During development, a mistake in the logic would have broken all rides other than ferris wheels in a way that multiple guests could enter the same car.
Also add a test to make sure that is never broken.
If we want to have more semantically meaningful types (like Direction), it's useful to be able to support those in the DataSerializer too. Swapping bytes for entire structures is probably never going to make sense, but for types that are pure wrappers around integer types, we want to be able to swap them as if they were the integer they wrap.
Introduce RotateEngine and Rct2Engine, FixedSeedSequence and Rct2Seed.
Adhere respectively to requirements `RandomNumberEngine` and `SeedSequence`.
Can be used with C++11 adaptors and distributions in <random>.
It turns out that trying to just give a peep a pathfinding goal and then let them loose doesn't work, because every time they reach a junction, the pathfinder has them walk 'aimlessly' instead of pursuing their target. That's why we were seeing some very large step counts in previous tests - they were (eventually) walking onto the target square, but only after lots of wandering around in circles.
This commit reworks the test data to contain an actual ride for each test scenario, where the peep will path to the tile in front of the ride entrance. A nice side benefit of this is that the ride names must match the test names, so you can now tell from looking at the rides in the test data which one is used for which test instance.
The 'yellow marker' tiles for goal positions are also removed here, as we're deriving goal positions from the ride entrances instead.
To make it a little clearer what the parameter is for, rename FindPath::maxSteps to FindPath::expectedSteps, and extend the comment to describe what happens in negative test scenarios.
There exists a helper function map_get_surface_element_at which already searches a tile's element list for the surface element, so we can just use that.
Introduce some basic scenario-style tests for the pathfinding AI. There
are two tests:
* Test that a peep can get from a given start position to a given end
position, and that it takes them an expected number of ticks to do so.
Also test that they did not walk on any 'forbidden' tiles in the process,
e.g. tiles that are completely the wrong direction from the goal etc.
* Test that a peep can *not* get from a given start position to a given
end position after a given number of ticks.
Each test is parametric, and instantiated for multiple different
start/end positions within the provided test park. If we find a new
situation that needs a test, it should just be a matter of building
that situation in the saved game and then adding a line to the code to
set it up.
Indicating 'forbidden' tiles is done using terrain surface type IDs:
tiles that the pathfinder should never send the peep into should be
painted with the red neon surface type (index 8). This means we have
no way to forbid some path elements on a tile while allowing others,
but we don't need that right now.
Similarly, to help ensure that the test data and code are kept in
sync, the tests also require that peep start tiles are painted with
the green neon surface type (index 11) and that goal tiles are
painted with the yellow neon surface type (index 9).