baba-is-auto
C++17 Baba Is You simulator
Loading...
Searching...
No Matches
Game.hpp
Go to the documentation of this file.
1// Copyright (c) 2020-2026 Chris Ohk
2
3// I am making my contributions/submissions to this project solely in our
4// personal capacity and am not conveying any rights to any intellectual
5// property of any third parties.
6
7#ifndef BABA_IS_AUTO_GAME_HPP
8#define BABA_IS_AUTO_GAME_HPP
9
13
14#include <cstdint>
15#include <random>
16#include <string_view>
17#include <vector>
18
19namespace baba_is_auto
20{
26class Game
27{
28 public:
31 explicit Game(std::string_view filename);
32
34 void Reset();
35
38 void SetRandomSeed(std::uint32_t seed);
39
43
46 const Map& GetMap() const;
47
51
55
59
63
64 private:
66 void ParseRules();
67
72 void ParseRule(std::size_t x, std::size_t y, RuleDirection direction);
73
80 bool CanMove(std::size_t x, std::size_t y, Direction dir,
81 const std::vector<ObjectID>& movingIDs = {});
82
85 void ProcessPlayerMove(Direction dir);
86
90 std::vector<ObjectID> GetPlayerIDsAt(const Position& position) const;
91
96 void ProcessPlayerStack(const Position& position,
97 const std::vector<ObjectID>& playerIDs,
98 Direction dir);
99
101 void ProcessMoveProperty();
102
104 struct MoveState
105 {
107 ObjectID id = 0;
108
110 Position position{};
111
113 Direction direction = Direction::NONE;
114
116 std::size_t attempts = 0;
117
119 bool turned = false;
120
122 bool active = true;
123 };
124
129 void AddMoveRuleAttempts(const Rule& rule, std::vector<MoveState>& moving,
130 std::size_t& rounds);
131
137 void AppendMatchingMoveObjects(const Rule& rule,
138 const std::vector<ObjectType>& subjects,
139 const Position& position,
140 std::vector<ObjectID>& matching) const;
141
147 void RegisterEmptyMoveAttemptAt(const Rule& rule, const Position& position,
148 std::vector<MoveState>& moving,
149 std::size_t& rounds);
150
157 static void RegisterMoveAttempt(std::vector<MoveState>& moving, ObjectID id,
158 const Position& position,
159 Direction direction, std::size_t& rounds);
160
164 void ProcessMoveRound(std::vector<MoveState>& moving, std::size_t round);
165
169 void ProcessEmptyMoveState(std::vector<MoveState>& moving,
170 std::size_t index);
171
175 static void MergeEmptyMoveStates(std::vector<MoveState>& moving,
176 std::size_t index);
177
180 void ProcessObjectMoveState(MoveState& state);
181
183 void ProcessDirectionProperties();
184
189 void ApplyDirectionProperties(ObjectInstance& instance,
190 const Position& position,
191 const std::vector<Rule>& rules) const;
192
195 ObjectInstance EmptyAt(const Position& position) const;
196
198 void ProcessTransformations();
199
201 struct Transformation
202 {
204 ObjectType subject;
205
207 ObjectType predicate;
208
210 std::vector<RuleCondition> conditions;
211 };
212
214 struct TransformationResult
215 {
217 bool matched = false;
218
220 bool transforms = false;
221
223 bool expandsAll = false;
224
226 bool protectedByIdentity = false;
227
229 std::vector<ObjectType> targets;
230
232 std::vector<ObjectType> allTargets;
233 };
234
236 struct LocatedInstance
237 {
239 ObjectInstance instance;
240
242 Position position;
243 };
244
246 struct EmptyTransformation
247 {
249 Position position;
250
252 Direction direction;
253
255 TransformationResult result;
256 };
257
260 std::vector<Transformation> FindTransformations() const;
261
266 void AppendSubjectTransformations(
267 const Rule& rule, ObjectType subject,
268 std::vector<Transformation>& transformations) const;
269
274 TransformationResult ResolveTransformation(
275 const LocatedInstance& source,
276 const std::vector<Transformation>& transformations) const;
277
280 void AppendAllTargets(TransformationResult& result) const;
281
286 static ObjectType ResolveTransformationTarget(ObjectType source,
287 ObjectType predicate);
288
292 void CollectTransformationSnapshot(std::vector<LocatedInstance>& instances,
293 std::vector<Position>& emptyTiles) const;
294
298 void AppendTransformationInstancesAt(
299 const Position& position,
300 std::vector<LocatedInstance>& instances) const;
301
305 void ApplyTransformation(const LocatedInstance& source,
306 const TransformationResult& result);
307
313 bool SpawnAllTargets(const Position& position, Direction direction,
314 const std::vector<ObjectType>& targets);
315
318 void ApplyEmptyTransformation(const EmptyTransformation& pending);
319
321 void UpdateAllNouns();
322
325 Direction RandomDirection();
326
328 bool HasPropertyAtPosition(const ObjectInstance& instance,
329 const Position& position,
330 ObjectType property) const;
331
337 bool HasPropertyAt(std::size_t x, std::size_t y, ObjectType property) const;
338
345 bool MatchesConditionsAt(
346 const ObjectInstance& instance, const Position& position,
347 const std::vector<RuleCondition>& conditions) const;
348
355 bool MatchesConditionAt(const ObjectInstance& instance,
356 const Position& position,
357 const RuleCondition& condition) const;
358
360 struct OpenShutInteraction
361 {
363 std::vector<ObjectID> matchedIDs;
365 std::vector<ObjectID> destroyedIDs;
366 };
367
373 OpenShutInteraction GetOpenShutInteraction(
374 const Position& source, const std::vector<ObjectID>& movingIDs,
375 const Position& destination) const;
376
380 std::vector<ObjectID> DestroyOpenShutObjects(
381 const std::vector<ObjectID>& ids);
382
388 void ProcessMove(std::size_t x, std::size_t y, Direction dir,
389 const std::vector<ObjectID>& ids);
390
396 void ProcessPush(std::size_t x, std::size_t y, Direction dir,
397 const std::vector<ObjectID>& ids);
398
400 void ProcessOpenShut();
401
403 void ProcessSink();
404
406 void ProcessWeak();
407
409 void ProcessHotMelt();
410
412 void ProcessDefeat();
413
415 void CheckPlayState();
416
417 Map m_map;
418 RuleManager m_ruleManager;
419
420 PlayState m_playState = PlayState::INVALID;
421 ObjectType m_playerIcon = ObjectType::ICON_EMPTY;
422
423 std::vector<ObjectType> m_playerIcons;
424 std::vector<ObjectType> m_allNouns;
425 std::vector<ObjectID> m_movementGeneratedIDs;
426 std::mt19937 m_randomEngine{ std::random_device{}() };
427};
428} // namespace baba_is_auto
429
430#endif
Game class.
Definition Game.hpp:27
void SetRandomSeed(std::uint32_t seed)
void MovePlayer(Direction dir)
Game(std::string_view filename)
void Reset()
Resets map and rule data.
RuleManager & GetRuleManager()
ObjectType GetPlayerIcon() const
const Map & GetMap() const
PlayState GetPlayState() const
Map class.
Definition Map.hpp:28
RuleManager class.
Definition RuleManager.hpp:22
Definition IAgent.hpp:14
std::uint64_t ObjectID
Definition Object.hpp:17
RuleDirection
An enumerator for identifying the direction of rule.
Definition RuleEnums.hpp:14
ObjectType
An enumerator for identifying the object.
Definition GameEnums.hpp:14
PlayState
An enumerator for identifying the play state.
Definition GameEnums.hpp:133
Direction
An enumerator for identifying the direction.
Definition GameEnums.hpp:142
std::pair< std::size_t, std::size_t > Position
A zero-based (x, y) map position.
Definition Map.hpp:20