World_Reset kept counting, so after one reset the ball dropped from 60 m was ball 10, not the ball 5 the plain build's output and the log from before the reset name. The agent in the first check noticed and worked around it. Clear now restarts ids at 1, so Reset brings back balls 1 to 5. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
67 lines
1.9 KiB
C++
67 lines
1.9 KiB
C++
// SPDX-License-Identifier: MIT
|
|
// SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
|
|
|
// Balls dropped onto a floor slab, in two dimensions, at a fixed step. y is
|
|
// up, in metres; the slab's top is at floor.top and it is floor.thickness
|
|
// thick.
|
|
export module Basic.World;
|
|
import std;
|
|
|
|
export namespace Basic {
|
|
struct Ball {
|
|
std::int32_t id = 0;
|
|
float x = 0;
|
|
float y = 0;
|
|
float vx = 0;
|
|
float vy = 0;
|
|
float radius = 0.1f;
|
|
// Below the floor, and so out of the scene for good.
|
|
bool lost = false;
|
|
};
|
|
|
|
struct Physics {
|
|
float gravity = -9.81f;
|
|
// The share of its speed a ball keeps when it bounces.
|
|
float restitution = 0.6f;
|
|
// Collision checks per tick.
|
|
std::int32_t substeps = 1;
|
|
};
|
|
|
|
struct Floor {
|
|
float top = 0;
|
|
float thickness = 0.1f;
|
|
};
|
|
|
|
// What `wait --event Bounce` waits for, sent for bounces faster than 1 m/s.
|
|
struct BounceEvent {
|
|
std::int32_t ball = 0;
|
|
float speed = 0;
|
|
};
|
|
|
|
class World {
|
|
public:
|
|
Physics physics;
|
|
Floor floor;
|
|
|
|
// Removes every ball and drops the scene's five, as balls 1 to 5.
|
|
void Reset();
|
|
// Removes every ball; ids start again from 1.
|
|
void Clear();
|
|
// Returns the new ball's id.
|
|
std::int32_t Spawn(float x, float y, float vy, float radius);
|
|
void Tick(float dt);
|
|
|
|
const std::deque<Ball>& Balls() const { return balls; }
|
|
const Ball* Find(std::int32_t id) const;
|
|
double Time() const { return time; }
|
|
std::int32_t Lost() const;
|
|
// The fastest ball's speed in the last tick, in m/s.
|
|
float Fastest() const { return fastest; }
|
|
|
|
private:
|
|
std::deque<Ball> balls;
|
|
std::int32_t nextId = 1;
|
|
double time = 0;
|
|
float fastest = 0;
|
|
};
|
|
}
|