Files
dwroller/database/backups/anders.after.1755335270354.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

431 lines
9.1 KiB
JSON

{
"name": "anders",
"rollerInfo": {},
"shopInfo": {},
"tabInfo": {
"rp": 2,
"xp": 0,
"xpSpent": 0,
"charName": "Brother Sepheran",
"gear": [
{
"name": "Astartes Frag Grenade",
"qty": 3
},
{
"name": "Astartes Krak Grenade",
"qty": 3
},
{
"name": "Astartes Combat Knife",
"qty": 1
},
{
"name": "Astartes Power Armour",
"qty": 1
}
],
"chapter": "blood angels",
"demeanour": "",
"speciality": "devastator",
"rank": "1",
"powerArmour": true,
"description": "marine",
"pastEvent": "",
"personalDemeanour": "calculating",
"characteristics": {
"ws": 47,
"bs": 48,
"s": 41,
"t": 43,
"ag": 42,
"int": 50,
"per": 43,
"wp": 48,
"fel": 38
},
"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
},
"Logic (Int)": {
"trained": false,
"plus10": false,
"plus20": false
},
"Guns (BS)": {
"trained": true,
"plus10": false,
"plus20": false
},
"Melee (WS)": {
"trained": true,
"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
},
"Adeptus Astartes": {
"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
},
"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 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"
},
{
"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
},
"talents": [
"Unrelenting Devastation",
"Deathwatch Training"
],
"psychic": "",
"wounds": {
"total": 23,
"current": 23,
"fatigue": 0
},
"insanity": {},
"movement": {
"half": 5,
"full": 10,
"charge": 15,
"halfAction": 5,
"fullAction": 10,
"run": 30
},
"fate": {
"total": 2,
"current": 2
},
"corruption": 0,
"renown": "Rank 1",
"notes": "",
"inventory": [
{
"name": "Astartes Frag Grenade",
"count": 3
},
{
"name": "Astartes Krak Grenade",
"count": 3
}
]
},
"pw": "",
"pwHash": "$2b$10$jJB9rqzxJaOtG9ucVM4JGeTFujBAa/3X1CERBIBYYuH5OtIgl/l.m",
"_id": 38,
"createdAt": "2025-08-15 12:26:31",
"updatedAt": "2025-08-16 09:07:50"
}