- 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.
261 lines
5.3 KiB
JSON
261 lines
5.3 KiB
JSON
{
|
|
"name": "andreas",
|
|
"rollerInfo": {},
|
|
"shopInfo": {},
|
|
"tabInfo": {
|
|
"charName": "Brother Lucian",
|
|
"playerName": "andreas",
|
|
"chapter": "ultramarines",
|
|
"speciality": "apothecary",
|
|
"rank": "1",
|
|
"characteristics": {
|
|
"ws": 46,
|
|
"bs": 40,
|
|
"s": 41,
|
|
"t": 40,
|
|
"ag": 43,
|
|
"int": 43,
|
|
"per": 41,
|
|
"wp": 42,
|
|
"fel": 43
|
|
},
|
|
"skills": {
|
|
"Acrobatics (Ag)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Awareness (Per)": {
|
|
"trained": true,
|
|
"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": true,
|
|
"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": true,
|
|
"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": true,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Navigation (Int)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Pilot (Ag)": {
|
|
"trained": false,
|
|
"plus10": false,
|
|
"plus20": false
|
|
},
|
|
"Scholastic Lore (Int)": {
|
|
"trained": true,
|
|
"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
|
|
}
|
|
},
|
|
"weapons": [
|
|
{
|
|
"name": "Astartes Chainsword",
|
|
"class": "One-Handed Melee - Chain",
|
|
"damage": "1d10+3 R; Pen 3; Balanced, Tearing",
|
|
"type": "Melee Weapon",
|
|
"pen": "3",
|
|
"range": "",
|
|
"rof": "",
|
|
"clip": "",
|
|
"rld": "",
|
|
"special": "Living Errata v1.1 p153"
|
|
},
|
|
{
|
|
"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"
|
|
}
|
|
],
|
|
"inventory": [
|
|
{
|
|
"name": "Astartes Frag Grenade",
|
|
"count": 3
|
|
},
|
|
{
|
|
"name": "Astartes Krak Grenade",
|
|
"count": 3
|
|
}
|
|
],
|
|
"gear": [
|
|
{
|
|
"name": "Astartes Frag Grenade",
|
|
"qty": 3
|
|
},
|
|
{
|
|
"name": "Astartes Krak Grenade",
|
|
"qty": 3
|
|
},
|
|
{
|
|
"name": "Astartes Chainsword",
|
|
"qty": 1
|
|
},
|
|
{
|
|
"name": "Astartes Power Armour",
|
|
"qty": 1
|
|
}
|
|
],
|
|
"armour": {
|
|
"body": "Astartes Power Armour",
|
|
"ap": 10,
|
|
"head": 0,
|
|
"ra": 8,
|
|
"la": 8,
|
|
"rl": 8,
|
|
"ll": 8
|
|
},
|
|
"talents": [
|
|
"Enhance Healing",
|
|
"Deathwatch Training"
|
|
],
|
|
"fate": {
|
|
"total": 2,
|
|
"current": 2
|
|
},
|
|
"wounds": {
|
|
"total": 19,
|
|
"current": 19,
|
|
"fatigue": 0
|
|
},
|
|
"movement": {
|
|
"half": 5,
|
|
"full": 10,
|
|
"charge": 15,
|
|
"halfAction": 5,
|
|
"fullAction": 10,
|
|
"run": 30
|
|
},
|
|
"renown": "Rank 1",
|
|
"powerArmour": true
|
|
},
|
|
"pw": "",
|
|
"pwHash": "",
|
|
"_id": 67,
|
|
"createdAt": "2025-08-16 09:18:29",
|
|
"updatedAt": "2025-08-16 09:18:29"
|
|
} |