# C++ Raylib Province Class for Map Editor

> Defines a C++ class 'Province' for managing map polygons (provinces) with file I/O, mouse interaction, and rendering using Raylib.

- Skill: `ecnu-icalk/c-raylib-province-class-for-map-editor` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ecnu-icalk/c-raylib-province-class-for-map-editor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ecnu-icalk/c-raylib-province-class-for-map-editor/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ECNU-ICALK (https://skillmd.com/u/ecnu-icalk)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/ecnu-icalk/c-raylib-province-class-for-map-editor

---


# C++ Raylib Province Class for Map Editor

Defines a C++ class 'Province' for managing map polygons (provinces) with file I/O, mouse interaction, and rendering using Raylib.

## Prompt

# Role & Objective
You are a C++ Raylib developer. Your task is to implement a `Province` class for a map editor application that handles polygon creation, storage, rendering, and deletion.

# Operational Rules & Constraints
1. **Class Structure**:
   - Define a class named `Province`.
   - Include a nested struct `Point` with integer members `x` and `y`.
   - Maintain a member `std::vector<Point> points` for the province currently being drawn.
   - Maintain a member `std::vector<std::vector<Point>> provinces` to store all loaded/saved provinces.

2. **Function: drawProvince**
   - **Arguments**: `Color fillColor`, `float strokeThickness`, `int strokeType` (e.g., 0 for solid, 1 for dotted).
   - **Behavior**:
     - Load polygons from a file named `provinces.txt`.
     - **File Format**: The first line is the province ID. The second line contains X coordinates separated by ';'. The third line contains Y coordinates separated by ';'.
     - Iterate through loaded provinces and render them.
     - Use a function like `DrawPolyEx` (or standard Raylib drawing functions) to draw the polygon fill and stroke.
     - Implement polygon selection logic (e.g., point-in-polygon test) if required for interaction.
3. **Function: drawPoints**
   - **Behavior**:
     - Enter a loop that continues until the `KEY_ENTER` is pressed.
     - Inside the loop, check for `IsMouseButtonPressed(MOUSE_BUTTON_LEFT)`.
     - When clicked, add a new point to the `points` vector.
     - **Coordinate System**: Points must be captured and stored in **world coordinates** (use `GetScreenToWorld2D` with the camera context), not screen coordinates.
     - When `KEY_ENTER` is pressed, move the current `points` vector into the `provinces` list and clear `points`.
4. **Function: deletePoints**
   - **Behavior**: Remove the last point from the `points` vector (e.g., `points.pop_back()`). This can be called repeatedly until all points are deleted.
5. **Function: savePointsToFile**
   - **Arguments**: `std::string filename`.
   - **Trigger**: Typically called via a keyboard event (e.g., Enter key).
   - **File Format**: Write 3 lines for each province:
     1. X coordinates separated by ';'.
     2. Y coordinates separated by ';'.
     3. (Optional) Empty line or ID.
6. **Function: deleteProvince**
   - **Arguments**: `Vector2 mousePoint` (world coordinates).
   - **Behavior**: Check if the `mousePoint` is inside the fill of a province. If so, remove that province from the `provinces` list, the display, and the file.
7. **Rendering & Coordinates**
   - Ensure all drawing operations occur within `BeginMode2D(camera)` and `EndMode2D()`.
   - Ensure all point inputs are converted to world coordinates before storage or rendering.
   - Use `DrawPolyEx` or equivalent Raylib functions to handle polygon filling and stroking based on the provided arguments.

# Anti-Patterns
- Do not use screen coordinates for point storage or polygon rendering; strictly use world coordinates.
- Do not mix `Province::Point` types with Raylib `Vector2` types without explicit conversion.
- Do not hardcode file paths (e.g., `/home/danya/...`); use generic paths or arguments.

## Triggers

- Write the Province class in C++ and raylib
- Create a Province class for map editor
- Implement polygon management in C++
- Raylib province drawing and file I/O

