Files
dwroller/database/backups/phillip.after.1755335781321.json
Alex dde3abda55 feat: Add validation and normalization utilities for player records
- Implemented `validatePlayer` and `normalizeTabInfo` functions in `database/validate.js` for player data validation and normalization.
- Added error handling for required fields and enforced data types and constraints.
- Introduced standardization for characteristics and skills.

feat: Create script for extracting rules from PDF files

- Developed `extract-rules.js` to extract text from PDF rulebooks and categorize rules.
- Integrated `pdftotext` for PDF processing and created a searchable rules database.
- Implemented rule categorization and indexing for efficient searching.

feat: Implement RulesTab component for rule searching

- Created `RulesTab.jsx` for searching and displaying rules with filtering options.
- Added recent searches and quick reference buttons for user convenience.
- Integrated API calls for fetching rules and displaying results dynamically.

feat: Add test script for Rules API

- Created `test-rules.js` to test the functionality of the Rules API endpoints.
- Included tests for search and stats endpoints to ensure proper response handling.
2025-08-16 12:15:32 +02:00

424 lines
8.9 KiB
JSON

{
"name": "phillip",
"rollerInfo": {},
"shopInfo": {},
"tabInfo": {
"rp": 2,
"inventory": [
{
"name": "Astartes Frag Grenade",
"count": 3
},
{
"name": "Astartes Krak Grenade",
"count": 3
}
],
"renown": "Rank 1",
"playerName": "phillip",
"charName": "Brother Skold",
"gear": [
{
"name": "Astartes Frag Grenade",
"qty": 3
},
{
"name": "Astartes Krak Grenade",
"qty": 3
},
{
"name": "Sacris Claymore",
"qty": 1
},
{
"name": "Astartes Power Armour",
"qty": 1
}
],
"characteristics": {
"ws": 42,
"bs": 42,
"s": 42,
"t": 41,
"ag": 40,
"int": 41,
"per": 46,
"wp": 42,
"fel": 43
},
"skills": {
"Acrobatics (Ag)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Awareness (Per)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Charm (Fel)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Climb (S)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Command (Fel)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Common Lore (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Deathwatch": {
"trained": false,
"plus10": false,
"plus20": false
},
"Imperium": {
"trained": false,
"plus10": false,
"plus20": false
},
"War": {
"trained": false,
"plus10": false,
"plus20": false
},
"Dodge (Ag)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Forbidden Lore (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Xenos": {
"trained": false,
"plus10": false,
"plus20": false
},
"Intimidate (S)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Literacy (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Medicae (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Navigation (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Pilot (Ag)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Scholastic Lore (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Codex Astartes": {
"trained": false,
"plus10": false,
"plus20": false
},
"Scrutiny (Per)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Search (Per)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Silent Move (Ag)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Speak Language (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"High Gothic": {
"trained": false,
"plus10": false,
"plus20": false
},
"Low Gothic": {
"trained": false,
"plus10": false,
"plus20": false
},
"Survival (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Tactics (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Tracking (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Tech-Use (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Guns (BS)": {
"trained": true,
"plus10": false,
"plus20": false
},
"Melee (WS)": {
"trained": true,
"plus10": false,
"plus20": false
},
"Adeptus Astartes": {
"trained": false,
"plus10": false,
"plus20": false
},
"Barter (Fel)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Blather (Fel)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Carouse (Fel)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Chem-Use (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Ciphers (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Chapter Runes": {
"trained": false,
"plus10": false,
"plus20": false
},
"Concealment (Ag)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Contortionist (Ag)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Deceive (Fel)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Demolition (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Disguise (Fel)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Drive (Ag)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Evaluate": {
"trained": false,
"plus10": false,
"plus20": false
},
"Gamble (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Inquiry (Fel)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Interrogation (WP)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Invocation (WP)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Lip Reading (Per)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Logic (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Surface": {
"trained": false,
"plus10": false,
"plus20": false
},
"Performer (Fel)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Psyniscience (Per)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Secret Tongue (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Security (Ag)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Shadowing (Ag)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Sleight of Hand (Ag)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Swim (S)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Trade (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Wrangling (Int)": {
"trained": false,
"plus10": false,
"plus20": false
}
},
"weapons": [
{
"name": "Astartes Bolter-Godwyn",
"class": "Basic - Bolt",
"damage": "Range 100m; S/3/-; 1d10+9 X; Pen 4; Clip 28; Reload 1 Full; Two handed; Tearing",
"type": "Ranged Weapon",
"pen": "4",
"range": "100m",
"rof": "",
"clip": "28",
"rld": "1 Full",
"special": "Living Errata v1.1 p146"
},
{
"name": "Astartes Bolt Pistol",
"class": "Pistol - Bolt",
"damage": "Range 30m; S/2/-; 1d10+9 X; Pen 4; Clip 14; Reload 1 Full; Tearing",
"type": "Ranged Weapon",
"pen": "4",
"range": "30m",
"rof": "",
"clip": "14",
"rld": "1 Full",
"special": "Living Errata v1.1 p146"
}
],
"armour": {
"body": "Astartes Power Armour",
"ap": 10,
"head": 0,
"ra": 8,
"la": 8,
"rl": 8,
"ll": 8
},
"wounds": {
"total": 24,
"current": 24,
"fatigue": 0
},
"insanity": {},
"movement": {
"half": 4,
"full": 8,
"charge": 12,
"halfAction": 4,
"fullAction": 8,
"run": 24
},
"fate": {
"total": 2,
"current": 2
},
"demeanour": "test11222",
"xp": 500,
"xpSpent": 0,
"powerArmour": true,
"talents": [
"Bolter Mastery",
"Deathwatch Training"
],
"speciality": "tactical"
},
"pw": "",
"pwHash": "$2b$10$luaCFHf/zNjZGeMHZei2ZO1E.vBb4UkYeWOCcy9FQSY52P5Rq7nT.",
"_id": 3,
"createdAt": "2025-08-15 07:12:29",
"updatedAt": "2025-08-16 09:16:21"
}