- 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.
368 lines
7.7 KiB
JSON
368 lines
7.7 KiB
JSON
{
|
|
"name": "anders",
|
|
"rollerInfo": {},
|
|
"shopInfo": {},
|
|
"tabInfo": {
|
|
"rp": 2,
|
|
"xp": 0,
|
|
"xpSpent": 0,
|
|
"charName": "char1",
|
|
"gear": [],
|
|
"chapter": "blood angels",
|
|
"demeanour": "",
|
|
"speciality": "devastator",
|
|
"rank": "1",
|
|
"powerArmour": false,
|
|
"description": "marine",
|
|
"pastEvent": "",
|
|
"personalDemeanour": "calculating",
|
|
"characteristics": {
|
|
"ws": 4,
|
|
"bs": 4,
|
|
"s": 0,
|
|
"t": 0,
|
|
"ag": 0,
|
|
"int": 0,
|
|
"per": 0,
|
|
"wp": 0,
|
|
"fel": 0
|
|
},
|
|
"skills": {
|
|
"Acrobatics (Ag)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Awareness (Per)": {
|
|
"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
|
|
},
|
|
"Charm (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
|
|
},
|
|
"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
|
|
},
|
|
"Adeptus Astartes": {
|
|
"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
|
|
},
|
|
"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
|
|
},
|
|
"Dodge (Ag)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Drive (Ag)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Evaluate": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Forbidden Lore (Int)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Xenos": {
|
|
"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
|
|
},
|
|
"Intimidate (S)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Invocation (WP)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Lip Reading (Per)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Literacy (Int)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Logic (Int)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Medicae (Int)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Navigation (Int)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Surface": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Performer (Fel)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Pilot (Ag)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Psyniscience (Per)": {
|
|
"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
|
|
},
|
|
"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
|
|
},
|
|
"Silent Move (Ag)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Sleight of Hand (Ag)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Speak Language (Int)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Survival (Int)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Swim (S)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Tactics (Int)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Tech-Use (Int)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Tracking (Int)": {
|
|
"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 Combat Knife",
|
|
"class": "",
|
|
"damage": "",
|
|
"type": "",
|
|
"pen": "",
|
|
"range": "",
|
|
"rof": "",
|
|
"clip": "",
|
|
"rld": "",
|
|
"special": ""
|
|
},
|
|
{
|
|
"name": "Astartes Combat Knife",
|
|
"class": "One-Handed Melee - Primitive",
|
|
"damage": "1d10 R; Pen 2",
|
|
"type": "Melee Weapon",
|
|
"pen": "2",
|
|
"range": "",
|
|
"rof": "",
|
|
"clip": "",
|
|
"rld": "",
|
|
"special": "1d10 R; Pen 2 | Living Errata v1.1 p155"
|
|
}
|
|
],
|
|
"armour": {},
|
|
"talents": "",
|
|
"psychic": "",
|
|
"wounds": 0,
|
|
"insanity": {},
|
|
"movement": 0,
|
|
"fate": {
|
|
"total": 1,
|
|
"current": 1
|
|
},
|
|
"corruption": 0,
|
|
"renown": "None",
|
|
"notes": "",
|
|
"inventory": [
|
|
{
|
|
"name": "Astartes Combat Knife",
|
|
"source": "armoury"
|
|
}
|
|
]
|
|
},
|
|
"pw": "",
|
|
"pwHash": "$2b$10$jJB9rqzxJaOtG9ucVM4JGeTFujBAa/3X1CERBIBYYuH5OtIgl/l.m",
|
|
"_id": 38,
|
|
"createdAt": "2025-08-15 12:26:31",
|
|
"updatedAt": "2025-08-16 08:13:24"
|
|
} |