Add data pipeline: fetch and parse Cheat mod DBs into JSON
Pulls items/perks/buffs/skills CSVs and command docs from pryans/kcd2-cheat, parses the mod's CSV dialect (backslash-escaped commas, multiline quoted fields) and BBCode command docs into vendored JSON under src/data/. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
04bf6066ac
commit
e0a118f52b
8 files changed
+5076
No files matched your search
@@ -0,0 +1,181 @@
|
||||
// Regenerates src/data/*.json from the KCD2 "Cheat" mod repository
|
||||
// (https://github.com/pryans/kcd2-cheat — source of the Nexus "Cheat" mod).
|
||||
//
|
||||
// Usage: node scripts/fetch-data.mjs
|
||||
//
|
||||
// Output is committed to the repo so builds are offline; re-run to refresh
|
||||
// when the mod updates its item/perk/buff/skill dumps or command docs.
|
||||
|
||||
import { mkdir, writeFile } from 'node:fs/promises';
|
||||
import { dirname, join } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
const BASE = 'https://raw.githubusercontent.com/pryans/kcd2-cheat/main/docs/';
|
||||
const OUT_DIR = join(dirname(fileURLToPath(import.meta.url)), '..', 'src', 'data');
|
||||
|
||||
async function fetchText(name) {
|
||||
const res = await fetch(BASE + name);
|
||||
if (!res.ok) throw new Error(`Fetching ${name} failed: HTTP ${res.status}`);
|
||||
return (await res.text()).replaceAll('\r\n', '\n');
|
||||
}
|
||||
|
||||
// The mod's CSV dialect: fields are double-quoted (header and empty trailing
|
||||
// fields are bare), commas inside fields are backslash-escaped, and quoted
|
||||
// fields may contain literal newlines.
|
||||
function parseCsv(text) {
|
||||
const rows = [];
|
||||
let row = [];
|
||||
let field = '';
|
||||
let inQuotes = false;
|
||||
for (let i = 0; i < text.length; i++) {
|
||||
const c = text[i];
|
||||
if (inQuotes) {
|
||||
if (c === '\\' && i + 1 < text.length) {
|
||||
field += text[++i];
|
||||
} else if (c === '"') {
|
||||
inQuotes = false;
|
||||
} else {
|
||||
field += c;
|
||||
}
|
||||
} else if (c === '"') {
|
||||
inQuotes = true;
|
||||
} else if (c === ',') {
|
||||
row.push(field);
|
||||
field = '';
|
||||
} else if (c === '\n') {
|
||||
row.push(field);
|
||||
if (row.some((f) => f !== '')) rows.push(row);
|
||||
row = [];
|
||||
field = '';
|
||||
} else {
|
||||
field += c;
|
||||
}
|
||||
}
|
||||
row.push(field);
|
||||
if (row.some((f) => f !== '')) rows.push(row);
|
||||
return rows.slice(1); // drop header
|
||||
}
|
||||
|
||||
// Skill/perk descriptions are HTML-entity-encoded rich text; flatten to plain
|
||||
// text with paragraph breaks.
|
||||
function cleanText(s) {
|
||||
return s
|
||||
.replaceAll('<', '<')
|
||||
.replaceAll('>', '>')
|
||||
.replaceAll('"', '"')
|
||||
.replaceAll(''', "'")
|
||||
.replaceAll(''', "'")
|
||||
.replaceAll('&', '&')
|
||||
.replace(/<\/p>\s*<p>/g, '\n\n')
|
||||
.replace(/<br\s*\/?>/g, '\n')
|
||||
.replace(/<[^>]+>/g, '')
|
||||
.trim();
|
||||
}
|
||||
|
||||
const CATEGORY_RULES = [
|
||||
[/money/, 'Money'],
|
||||
[/item|inventory|stash|gear|stolen/, 'Items & Inventory'],
|
||||
[/skill|stat/, 'Skills & Stats'],
|
||||
[/perk/, 'Perks'],
|
||||
[/buff|potion/, 'Buffs'],
|
||||
[/horse/, 'Horse'],
|
||||
[/teleport|_loc$|clip|phys_|checkpoint/, 'Movement & Teleport'],
|
||||
[/npc|kill|spawn|charm|target|revive/, 'NPCs'],
|
||||
[/time|weather|map/, 'World & Time'],
|
||||
[/lockpick|pickpocket/, 'Minigames'],
|
||||
[/hud|compass|statusbar|reticle|third_person|regen|wash|save|state/, 'Player & UI'],
|
||||
[/action|alias|localization|find_/, 'Utility'],
|
||||
];
|
||||
|
||||
function categorize(name) {
|
||||
for (const [re, cat] of CATEGORY_RULES) if (re.test(name)) return cat;
|
||||
return 'Misc';
|
||||
}
|
||||
|
||||
function stripBbcode(s) {
|
||||
return s.replace(/\[\/?(?:b|i|u|size|color|url)(?:=[^\]]*)?\]/g, '').trim();
|
||||
}
|
||||
|
||||
// docs.txt: intro + command index, then one block per command:
|
||||
// [size=4][b]name[/b][/size]
|
||||
// description lines
|
||||
// [b]Arguments:[/b] (optional section, tab-indented "arg: (required type) desc")
|
||||
// [b]Examples:[/b] (optional section, tab-indented caption/command groups)
|
||||
function parseCommandDocs(text) {
|
||||
const version = text.match(/Cheat version ([\d.]+)/)?.[1] ?? null;
|
||||
const commands = [];
|
||||
const blockRe = /^\[size=4\]\[b\](\w+)\[\/b\]\[\/size\]$/gm;
|
||||
const headers = [...text.matchAll(blockRe)];
|
||||
for (let h = 0; h < headers.length; h++) {
|
||||
const name = headers[h][1];
|
||||
const start = headers[h].index + headers[h][0].length;
|
||||
const end = h + 1 < headers.length ? headers[h + 1].index : text.length;
|
||||
const lines = text.slice(start, end).split('\n');
|
||||
|
||||
let section = 'desc';
|
||||
const descLines = [];
|
||||
const args = [];
|
||||
const examples = [];
|
||||
let example = null;
|
||||
for (const rawLine of lines) {
|
||||
const line = rawLine.replace(/\s+$/, '');
|
||||
if (/^\[b\]Arguments:\[\/b\]$/.test(line)) { section = 'args'; continue; }
|
||||
if (/^\[b\]Examples:\[\/b\]$/.test(line)) { section = 'examples'; continue; }
|
||||
if (section === 'desc') {
|
||||
descLines.push(stripBbcode(line));
|
||||
} else if (section === 'args') {
|
||||
const m = line.match(/^\t(\w+): \((required|optional)(?: (\w+))?\)\s*(.*)$/);
|
||||
if (m) args.push({ name: m[1], required: m[2] === 'required', type: m[3] ?? 'string', desc: m[4] });
|
||||
} else if (section === 'examples') {
|
||||
const t = line.replace(/^\t/, '');
|
||||
if (t === '') {
|
||||
if (example?.command) { examples.push(example); example = null; }
|
||||
} else if (t.startsWith(name)) {
|
||||
example ??= { caption: '' };
|
||||
example.command = t;
|
||||
} else {
|
||||
example ??= { caption: '' };
|
||||
example.caption = (example.caption ? example.caption + ' ' : '') + t.replace(/:$/, '');
|
||||
}
|
||||
}
|
||||
}
|
||||
if (example?.command) examples.push(example);
|
||||
commands.push({
|
||||
name,
|
||||
desc: descLines.join('\n').replace(/\n{3,}/g, '\n\n').trim(),
|
||||
args,
|
||||
examples,
|
||||
category: categorize(name),
|
||||
source: 'cheatmod',
|
||||
});
|
||||
}
|
||||
return { version, commands };
|
||||
}
|
||||
|
||||
async function writeJson(name, data) {
|
||||
await writeFile(join(OUT_DIR, name), JSON.stringify(data));
|
||||
console.log(`${name}: ${Array.isArray(data) ? data.length : data.commands?.length ?? ''} records`);
|
||||
}
|
||||
|
||||
await mkdir(OUT_DIR, { recursive: true });
|
||||
|
||||
const [itemsCsv, perksCsv, buffsCsv, skillsCsv, docsTxt] = await Promise.all(
|
||||
['items.csv', 'perks.csv', 'buffs.csv', 'skills.csv', 'docs.txt'].map(fetchText),
|
||||
);
|
||||
|
||||
const items = parseCsv(itemsCsv).map(([id, name, desc]) => ({ id, name, desc: cleanText(desc ?? '') }));
|
||||
const perks = parseCsv(perksCsv).map(([id, name, desc]) => ({ id, name, desc: cleanText(desc ?? '') }));
|
||||
const buffs = parseCsv(buffsCsv).map(([id, name, params, desc]) => ({ id, name, params: params ?? '', desc: cleanText(desc ?? '') }));
|
||||
const skills = parseCsv(skillsCsv).map(([id, name, desc]) => ({ id, name, desc: cleanText(desc ?? '') }));
|
||||
const { version, commands } = parseCommandDocs(docsTxt);
|
||||
|
||||
await writeJson('items.json', items);
|
||||
await writeJson('perks.json', perks);
|
||||
await writeJson('buffs.json', buffs);
|
||||
await writeJson('skills.json', skills);
|
||||
await writeJson('commands-mod.json', commands);
|
||||
await writeJson('meta.json', {
|
||||
source: 'https://github.com/pryans/kcd2-cheat',
|
||||
cheatModDocsVersion: version,
|
||||
fetchedAt: new Date().toISOString(),
|
||||
});
|
||||
Generated
+4889
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1 @@
|
||||
[{"id":"01807959-3249-40f3-a25b-9983b3d9e5cb","name":"Tortured","params":"strength*0.25,agility*0.25,vitality*0.25,srg*0.25","desc":"You were tortured at Trosky, and as a result your Strength, Agility and Vitality are reduced."},{"id":"04218e40-e756-476b-914e-03d67a24e733","name":"Poison","params":"poi=1","desc":"You've been poisoned."},{"id":"053b4122-6dfa-44d1-9a7c-70bf14c67506","name":"inDialog","params":"vision*0.8, hearing*0.8","desc":""},{"id":"0606c003-7419-4e83-b359-59d1ff5ca8f5","name":"svatba_tournamentBuffForNpc","params":"hlh*0.1,slh*0.1,ade*1.2","desc":""},{"id":"061d9f55-6652-461f-bb64-471a631f2d21","name":"item_bridle","params":"vitality+5,agility+3","desc":""},{"id":"0648c02b-ebe8-4a77-85a5-23b43f625dc5","name":"Well Rested","params":"mst*1.2","desc":"You slept well, so you have 20% more Stamina."},{"id":"068143cd-45b5-4c44-8c6c-9d2c622b75de","name":"blacksmithing_stamina","params":"","desc":""},{"id":"072de769-e653-4191-80e6-8c1fcd207d59","name":"Saliva","params":"","desc":"You have a mild alcohol habit, but so far it's had no consequences for you. Long-term abstinence will cure you."},{"id":"076c2e93-347d-4996-bef9-016c3d890008","name":"not_so_tough_guy","params":"hlh*2.5","desc":""},{"id":"07db9dfd-0e0c-4cbe-bf8a-10aaa1add262","name":"test_invisible","params":"ors=-1","desc":""},{"id":"083704b7-e238-41c3-9996-8ebd5cde89e1","name":"boar_easyKill_permanent","params":"hlh=30,slh=100, ble*3","desc":""},{"id":"084023c1-a396-4d48-aaeb-7e0f7981b66d","name":"prepadeni_ptacekBoostSpeed","params":"agility=30","desc":""},{"id":"0873fbf3-a245-4e3e-9b4a-bb2f2df09c02","name":"prepadeniVlasskehoDvora_alcoholAntidoteBooster","params":"apa=0.05","desc":""},{"id":"087ae30d-5484-4223-8814-0bc946a07172","name":"Stamina Frenzy","params":"hlh*0.5,slh*1.8","desc":""},{"id":"0902c0be-711b-40be-bc76-78d93de970aa","name":"meat_str_exp_test","params":"xst*1.1","desc":""},{"id":"09fd5ffb-4972-4b70-8c2e-02c35bd15602","name":"combat_passivity","params":"cag=0","desc":""},{"id":"0a00cd37-3769-4d0f-8f82-088d5a3f9b1b","name":"mlynaruvUcen_stealthTakedownDebuff","params":"fencing=1","desc":""},{"id":"0ba907a9-780f-4427-ba8a-a3b2a788d0bc","name":"unstream_protection_nonpersistent","params":"","desc":""},{"id":"0c903899-fcc9-4cf2-9ee3-1130ac08b0fc","name":"Bleeding","params":"","desc":"You're bleeding. Unless you bandage your wounds, you'll slowly lose health and die. The bleeding won't stop on its own."},{"id":"0d256673-3b7a-4125-a069-b40c20d5071f","name":"boar_charge","params":"cow+1200","desc":""},{"id":"0d635e3e-757d-477a-8196-f504f8afce46","name":"Time Well Spent","params":"strength+1,agility+1,vitality+1,deb+1","desc":"You've had some sweet moments which no one can take away from you. You feel refreshed and invigorated.\n \nYour Strength, Agility and Vitality are temporarily increased by 1."},{"id":"0d7ada24-d3fc-4dc9-abc8-5e57bdf747bc","name":"test_nighthawk_visual","params":"owl+1","desc":""},{"id":"0dcc7c4f-6ea3-4bd7-8f80-79249c4f5a66","name":"haggle_denial","params":"hde+1","desc":""},{"id":"0e553f9a-5da8-4050-912e-0506e4a95c18","name":"Tortured","params":"strength*0.8,agility*0.8,vitality*0.8","desc":"You were tortured at Trosky, and as a result your Strength, Agility and Vitality are reduced."},{"id":"0f6bc79a-fc67-4aab-a797-4a9d4e4c2dc5","name":"death_protection_nonpersistent","params":"imm=1,upr=1","desc":""},{"id":"0fc57667-2401-467a-82ec-90c402c22769","name":"Golden Egg","params":"charisma=20,rcw=3,pt1+0.5,pt5+0.5,dtf+0.75,dbf+0.25","desc":"You ate the golden egg! They say it brings an enormous amount of luck. On the other hand, gold is pretty heavy."},{"id":"10fc25ca-c095-44c6-b88b-d54ad58ab0a6","name":"Injured Left Leg","params":"Run-1,Walk-0.5,LimitSprint","desc":"Your left leg is injured.\n \n Once the injury level reaches 60% or more, you will not be able to run and your walk will slow down.\n \n You can heal your wound by renewing your health, e.g. by sleep, visiting a bathhouse or a imbibing a healing potion. On the contrary, if the level of injury increases, you risk bleeding."},{"id":"117fe105-5c31-4e45-9e77-50993dae4472","name":"quest_utokNebakov_blur_short","params":"","desc":""},{"id":"1191c7f4-2dea-4c1c-8b7d-e1c808871e78","name":"test_extreme_digestion","params":"dig*100","desc":""},{"id":"11f44a76-21e3-4e1a-9b25-4b9341d4b8ef","name":"visualBleeding_protection","params":"btd*0","desc":""},{"id":"1385b27e-0d22-4a92-806b-3a0c94f6a813","name":"combat_morale_context","params":"","desc":""},{"id":"13d87f0e-fc80-489b-97b6-ad31458e93e3","name":"prepadeni_vorechMorale","params":"dmd*0, dmh*0, drn*0","desc":""},{"id":"14353495-866f-471a-b446-7a3e1099c35c","name":"quest_kumaniNaTrosecku_campDrinkingSecondPhaseNotSoDrunk","params":"fpd+0.6","desc":""},{"id":"151ace61-70fb-409e-8b95-57b35d6ad83f","name":"posledniPomazani_healthLossBoost","params":"hlh*10","desc":""},{"id":"1524fad6-ef2e-450c-9f96-b37a8947c025","name":"Anti-alcohol Food.","params":"apa=0.06","desc":"Anti-alcohol Food."},{"id"Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
[{"name":"cheat_action","desc":"This command is used by the Cheat-Keys optional mod to publish keyboard press/hold events to Cheat mod.\nThis command can be used to manually simulate a key press as well.","args":[{"name":"type","required":true,"type":"string","desc":"Action Type"},{"name":"slot","required":true,"type":"string","desc":"Action Slot"}],"examples":[{"caption":"Simulate pressing F5.","command":"cheat_action slot:1 type:press"}],"category":"Utility","source":"cheatmod"},{"name":"cheat_action_begin_binding","desc":"Begins binding commands to the given action slot and type.\nUse cheat_action_bind_console_command and cheat_action_bind_lua_code to bind 1+ commands to the action.\nUse cheat_action_end_binding to complete the process.","args":[{"name":"type","required":true,"type":"string","desc":"Action Type"},{"name":"slot","required":true,"type":"string","desc":"Action Slot"}],"examples":[],"category":"Utility","source":"cheatmod"},{"name":"cheat_action_bind_console_command","desc":"Binds a console command to the current action.","args":[],"examples":[],"category":"Utility","source":"cheatmod"},{"name":"cheat_action_bind_lua_code","desc":"Binds lua code to the current action.","args":[],"examples":[],"category":"Utility","source":"cheatmod"},{"name":"cheat_action_end_binding","desc":"Ends binding a command to the given action slot and type.","args":[],"examples":[],"category":"Utility","source":"cheatmod"},{"name":"cheat_action_reset","desc":"Removes all commands bound to the given action.","args":[{"name":"type","required":true,"type":"string","desc":"Action Type"},{"name":"slot","required":true,"type":"string","desc":"Action Slot"}],"examples":[],"category":"Utility","source":"cheatmod"},{"name":"cheat_action_reset_all","desc":"Removes all commands bound to all actions.","args":[],"examples":[],"category":"Utility","source":"cheatmod"},{"name":"cheat_add_all_codex_perks","desc":"Adds all perks related to the codex.","args":[],"examples":[],"category":"Perks","source":"cheatmod"},{"name":"cheat_add_all_items","desc":"Adds all items the player's inventory. Enjoy!","args":[{"name":"quest","required":false,"type":"boolean","desc":"If true, attempt adding quest items."}],"examples":[{"caption":"Add all items","command":"cheat_add_all_items"}],"category":"Items & Inventory","source":"cheatmod"},{"name":"cheat_add_buff","desc":"Adds matching buffs to the player.","args":[{"name":"any","required":false,"type":"string","desc":"Matches fields partially."},{"name":"exact","required":false,"type":"string","desc":"Matches fields exactly."}],"examples":[{"caption":"Adds all bufss with 'heal' in their name","command":"cheat_add_buff any:heal"},{"caption":"Adds the buff poor_hearing buff by ID","command":"cheat_add_buff exact:29336a21-dd76-447b-a4f0-94dd6b9db466"},{"caption":"Adds the buff healthEatSleep_instant buff by full name","command":"cheat_add_buff exact:healthEatSleep_instant"}],"category":"Buffs","source":"cheatmod"},{"name":"cheat_add_buff_carry_weight","desc":"Applies a custom non-persistent carry weight buff. Cap 120.\nUses carry weight per strength (CPS) derived stat. Buff visible in inventory.","args":[{"name":"amount","required":true,"type":"number","desc":"Carry weight in pounds, rounded to nearest 10 pounds."}],"examples":[{"caption":"Adds 100 pounds per str to player's carry weight.","command":"cheat_add_buff_carry_weight amount:100"},{"caption":"Remove the buff.","command":"cheat_add_buff_carry_weight amount:0"}],"category":"Buffs","source":"cheatmod"},{"name":"cheat_add_buff_heal","desc":"Stop bleeding, removes injuries, and restores all health, stamina, hunger, and exhaust.","args":[],"examples":[{"caption":"Heal bleeding and injuries","command":"cheat_add_buff_heal"}],"category":"Buffs","source":"cheatmod"},{"name":"cheat_add_buff_immortal","desc":"Adds a custom non-persistent buff to make the player immortal. Buff visible on HUD & Buffs.\nUse cheat_remove_buff_immortal to remove this buff or restart the game.","args":[],"examples":[{"caption":"Add immortality","command":"cheat_add_buff_immortal"}],"category":"Buffs","source":"cheatmod"},{"name":"cheat_add_buff_invisible","desc":"Adds a custom non-persistent invisible buff to player. Buff visible on HUD & Buffs.\nSet visibility, conspicuousness and noise to zero.\nUse cheat_remove_buff_invisible to remove this buff or restart the game.","args":[],"examples":[{"caption":"Add invisible buff to player","command":"cheat_add_buff_invisible"}],"category":"Buffs","source":"cheatmod"},{"name":"cheat_add_buff_xp","desc":"Adds a custom non-persistent XP multiplier buff. Cap 500%","args":[{"name":"amount","required":true,"type":"number","desc":"Percentage increase in XP gain. Rounded to nearest 50% increment."}],"examples":[{"caption":"Uses XP multiplier (XPM) derived stat. Buff visible in inventory. Adds 200% XP multiplier. Remove the buff.","command":"cheat_add_buff_xp amount:200:"}],"category":"Buffs","source":"cheatmod"},{"name":"cheat_add_item",Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
[{"id":"000a72ec-f904-4e06-8c57-2eac8ab6ec73","name":"Cuman shield","desc":"A circular Cuman shield used by light Hungarian horsemen."},{"id":"0017bb74-7092-498e-98ac-d95af5998784","name":"Broken shield","desc":"The remains of the shield. Good as firewood."},{"id":"001d1fff-a2d1-4dd3-8340-71150610c91e","name":"Freshly picked bouquet","desc":"Fresh fragrant flowers are always a rarity, as is true love."},{"id":"0027df44-5f9c-4c92-9f81-a83ca124c4a8","name":"Wanderer's hood","desc":"Whether the sun is shining, it's raining or snowing, this hood will never let you down. There was one who went all the way to Jerusalem wearing it, and when his bereaved sold it, he had a nice funeral out of it too."},{"id":"00393f8f-6999-431a-b6ec-e8cfd32b04e1","name":"Broken shield","desc":"The remains of the shield. Good as firewood."},{"id":"003c862e-e1a9-480b-80b9-be6a2ccf055f","name":"Leather apron","desc":"A short linen tunic joined with a leather apron for harder work in the workshop."},{"id":"0067c708-9a85-4034-b9fb-94975eda6bf3","name":"Bathhouse bedchamber key","desc":"The key to the bedchamber shared by the bathwenches at Adam's bathhouse."},{"id":"0068874e-067a-474a-8af9-3b9a466b34d1","name":"Cuman caftan","desc":"A caftan is a long men's overcoat with long sleeves. It is a traditional part of the male dress of nomads from the eastern steppes. This one is heavily decorated with an embroidered hem."},{"id":"0077dfa2-b9be-4ae3-ae59-2803ba49dfcb","name":"Ornate Cuman bow","desc":"The Cuman riding bows are one of the lighter bows, easy to handle even from the horse's saddle. Their strength comes from the layering of different materials similar to better crossbows. This piece is exceptionally well crafted and therefore slightly stronger than normal."},{"id":"007907cf-aeb9-4dfa-ad3f-e0262893e423","name":"Reinforced bludgeon","desc":"A wooden bludgeon reinforced with blunt spikes that can quickly turn anyone's face to a bloody mash. A weapon like this can put a swift end to any tavern brawl or absent-minded traveller's life."},{"id":"009a655e-189d-4519-b437-ccc4b92be48d","name":"Bag of nails","desc":"Half a pound of metal nails. Theresa would be very happy."},{"id":"00b0039b-daa4-4f32-ac7f-69a6a2e0add8","name":"Dagger mace","desc":"A fine, agile weapon with a dangerous tip forged into the shape of a dagger. No pauper can get his hands on a weapon like this, unless he steals it."},{"id":"00b7ed62-a7bd-4269-acfa-8d852366579b","name":"Short gambeson","desc":"A quilted combat coat made of several layers of plain linen. Can be worn alone or as a basic soft layer under other types of armour."},{"id":"00ca0662-0569-4b69-8ff3-b9e396c49298","name":"Sketch – Racing horseshoes","desc":"A blacksmith's horseshoe sketch. Because every master had to start somehow."},{"id":"00ca5817-d30a-4afc-a9f0-72bfa3760a91","name":"Broken shield","desc":"The remains of the shield. Good as firewood."},{"id":"00cbcdca-e6ee-4fe6-bf87-2acd9f2b21aa","name":"The Art of the Sword I","desc":"A skill book on Sword combat."},{"id":"00cca9e3-8ef2-46db-8cbf-86ec51930919","name":"Duelling longsword","desc":"A perfectly balanced sword with a slender blade for true sword masters. The longsword is a noble weapon for swordfighting and a quick way to send any fool to the other side."},{"id":"00ec7e8d-4d4a-4365-97fe-5323d02bff49","name":"Smugglers's map","desc":"A map I found on a dead smuggler in the Kuttenberg underground."},{"id":"00f104b3-e95c-41ee-95a9-35d0331ac295","name":"Cuman shield","desc":"A circular Cuman shield used by light Hungarian horsemen."},{"id":"01076303-fcd7-4afa-b40f-de8509245819","name":"Broad battle coif","desc":"A quilted hood with a wide collar protecting the neck and shoulders of the fighter."},{"id":"01151dab-bb77-4524-be5f-3bf94b00575f","name":"Hose joined","desc":"Long hose are a staple of men's clothing. They are worn by noble lords as well as simple folks. However, they differ in quality of fabric, cut or richness of colour. These hose are fashionably joined at the crotch by a separate flap."},{"id":"0116b44d-972d-43a1-8a59-dfe40b2ae916","name":"Worn gambeson","desc":"A heavily worn, patch-covered quilted gambeson. Sadly, adding more patches to it won't make it any better."},{"id":"012dee46-cfc3-4632-81ef-075c0bdaf0d4","name":"Riding waffenrock","desc":"The Waffenrock is a loose outer garment, usually linen, worn over armour. It carried the colours of the lord, town or ruler the wearer bore allegiance to, and as such was the precursor of the military uniform. It also protects its wearers armour from dust and harsh sun."},{"id":"0146b4e9-1698-4f02-a6c4-f50e2d659540","name":"Dried valerian","desc":"To be found on forest paths, in mires and peat bogs and everywhere that ground is damp."},{"id":"014e4e12-5574-4756-8460-2c5078a3285c","name":"Hemmed waffenrock","desc":"The Waffenrock is a loose outer garment, usually linen, worn over armour. It carried the colours of the lord, town or ruler the wearer bore allegiance to, and as such was the prLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"source":"https://github.com/pryans/kcd2-cheat","cheatModDocsVersion":"2.18","fetchedAt":"2026-07-13T07:06:21.835Z"}
|
||||
@@ -0,0 +1 @@
|
||||
[{"id":"0133008f-09cf-4b68-a434-ea7f7b0283b3","name":"Burial","desc":""},{"id":"01c3b32a-5751-4c98-b6ab-258d02370382","name":"Hardcore Mode - Constants","desc":""},{"id":"01e845c3-34ca-4bd1-9f08-72ac0e19af57","name":"Kitchens","desc":""},{"id":"0298f5cd-21e3-4284-95ff-87114609832b","name":"Rabbi","desc":""},{"id":"029ab094-21b6-45f2-a242-557a6d340eb0","name":"Mint Masters","desc":""},{"id":"032ecad8-f7fd-48d6-b268-573025598e37","name":"Witchcraft","desc":""},{"id":"0335c283-6c1b-402d-acd8-0edd48ef38ae","name":"The Conquest of Kuttenberg","desc":""},{"id":"051028ac-d94c-4538-99be-fc76c1abdfbf","name":"Jail","desc":""},{"id":"06940cc6-0c96-421a-ae90-1c4079f87c0f","name":"Negotiator","desc":""},{"id":"0731a146-6220-43aa-989b-f2993d3390a7","name":"Holy Roman Empire","desc":""},{"id":"075e3563-168f-481b-8a25-d0566763a05c","name":"John II of Liechtenstein","desc":""},{"id":"07bda032-e4b0-45b7-a462-6e525b2ba69c","name":"Ius Regale Montanorum","desc":""},{"id":"084dd7fd-daee-4041-bae1-c58a0c132292","name":"Relieved","desc":"You've confessed to all your wrongdoing, made reparation to Virgin Mary and undertaken a pilgrimage of repentance. You have succeeded in cleansing yourself of your sins. Try to keep it that way! Now, when you get a good sleep (at least 4 hours), you'll subsequently learn new things faster and improve in skills you already have."},{"id":"0856ace1-3956-4cec-8283-f3c5374f5d1a","name":"Sir Hanush of Leipa","desc":""},{"id":"09d81b58-1a30-4d96-8eb4-80db04446870","name":"Miners","desc":""},{"id":"0a3d5815-b962-4198-b003-1eb0a7459903","name":"Gamekeeper Rules the Woods","desc":""},{"id":"0b129319-de62-41f2-97ef-4b9c10f370c9","name":"Player Theresa - fader protection","desc":""},{"id":"0c358b88-0305-497e-89ea-8637c67b6209","name":"Taverns, Inns and Innkeepers","desc":""},{"id":"0d3322fe-5b3f-47c5-8a21-1fa5e5cffe36","name":"Charcoal-Burners","desc":""},{"id":"0ef3b73a-3c20-4f82-981e-e1fc57a4f1f6","name":"Player Theresa - companion-horse","desc":""},{"id":"0f22368c-4d37-4250-b536-0c0b707b00fd","name":"Silver mining","desc":""},{"id":"0f783667-e997-4211-83fe-bfbaa29c9a49","name":"Towns and Cities","desc":""},{"id":"118def30-4fc4-4fbe-96ac-01f7d1626204","name":"Swordsmiths and Armourers","desc":""},{"id":"12bbb8f4-4d0e-440a-8adf-9563120a2389","name":"Invective","desc":""},{"id":"12c75fff-d00d-4cb0-8c27-4a8e4838dc14","name":"test_dummy_perk","desc":""},{"id":"148c15e7-9be5-4b05-8db6-548823f7a800","name":"Dragon Bones","desc":""},{"id":"14c9a9c7-84ef-426b-8fae-1fe98b3bb048","name":"Prokop of Luxembourg","desc":""},{"id":"15e3f93f-7a6f-4895-91f6-458a762858eb","name":"Ponds of the Trosky Region","desc":""},{"id":"1627a1b6-64c5-422f-ac2d-3a6abc071690","name":"Hunt attack","desc":""},{"id":"1672a664-8b97-42b5-b390-84378bdefbf3","name":"Clothing and Fashion","desc":""},{"id":"169e4028-ccef-4ff1-b89f-b14d4ba2853e","name":"Arabian Blood","desc":""},{"id":"18460049-f8c3-488c-a2df-6cac92762bb1","name":"Windmills","desc":""},{"id":"191fa81a-fb9d-42d3-a2bf-d161a54eebb9","name":"Books and Libraries","desc":""},{"id":"1944cf3a-3048-4ab0-ad70-063961007e02","name":"Construction works","desc":""},{"id":"194658be-facc-4e14-bac9-9cff09de36eb","name":"Player Theresa - Jail Recovery","desc":""},{"id":"1a306045-415a-438d-b612-6f354b8717e2","name":"Bakers","desc":""},{"id":"1a775793-dc9b-4d14-b2b6-5dde2f314322","name":"Zimburg Family","desc":""},{"id":"1acdcbbd-c47d-45a1-a839-4a292cb9e646","name":"Fabrics","desc":""},{"id":"1b86388a-99d5-4321-9f8c-345eb6f5e62b","name":"Jews","desc":""},{"id":"1b879096-d118-46d9-8e0f-281045f50e30","name":"Courtliness","desc":""},{"id":"1ba52d97-abef-4e36-8d2f-71d4a3c61123","name":"Municipal Finances","desc":""},{"id":"1baabb30-8619-4fe9-a8ea-5322b6d13e77","name":"Sedletz Ossuary","desc":""},{"id":"1bb2892a-43a1-40c0-88cb-0f8753ea92dc","name":"Gothic Architecture","desc":""},{"id":"1c52755d-c0b3-49e2-8af4-89d308f4df91","name":"first_aid_I_ability","desc":""},{"id":"1c8ff24a-e3fb-48db-90c9-f2034c129886","name":"Noble Officials","desc":""},{"id":"1d8d37bf-67fb-41d1-9661-edfebbc9b0d2","name":"Prague","desc":""},{"id":"1e481442-0ea3-4af1-8ea4-47d579ffa51a","name":"Charity","desc":""},{"id":"1e53b07d-8012-44b1-ace6-3504558f04aa","name":"Hardcore Mode","desc":""},{"id":"1e7c2255-b068-47a0-9447-4e0fe5205e8c","name":"Hardcore Mode - Buff","desc":""},{"id":"1f0caa02-f824-4421-8621-97cc4d6baafb","name":"Jitka of Kunstadt","desc":""},{"id":"1f8a2070-c21e-4d11-b3e0-f379c5394291","name":"Stonemason","desc":""},{"id":"1fe29784-4e8a-4e1f-9f78-06ee76bd7e93","name":"Tools","desc":""},{"id":"200a9a17-be64-437d-9354-d993f97b8182","name":"Armoury","desc":""},{"id":"21cf8626-284c-4f85-a1ed-0eaaeae8d6ed","name":"tackle - companion","desc":""},{"id":"2381b050-5d9d-4f8b-977f-c20d70b6759c","name":"Noble Marriages","desc":""},{"id":"23d8345b-a8f0-4bf2-84de-f6a5ce232822","name":"Alchemy","desc":""},{"id":"245b6b57-655a-4b04-a5af-8679dd7cb3ed","name":"Hygiene","desc":""},{"id":"24a9b014-9415-44af-9053-40c224ce7f42","name":"LoLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
[{"id":"0","name":"Stealth","desc":"The art of concealment and camouflage. The ability to observe and not be seen, to act and escape the consequences of one's actions. This art is not talked about in polite society, but everyone knows the value of a good spy, and some know the importance of a suitable murder.\n\nThe higher your skill, the less noise you make when sneaking, and the harder it will be for enemies to see and detect you. You will also find it easier to avoid complications on the move when using fast travel.\n\nYou gain skill by successfully picking pockets, picking locks, stealthily disposing of enemies, and especially by sneaking near enemies."},{"id":"1","name":"Horsemanship","desc":"Horsemanship, meaning the ability to stay in the saddle, knowledge of riding manoeuvres, mounted combat and care of riding animals. Every nobleman and man-at-arms should master this art.\n\nAs your skill increases, your horse's stamina consumption will decrease when riding at high speeds, your horse will be less skittish when threatened, and it will be more difficult for enemies to throw you from the saddle.\n\nYou gain experience by riding whenever you travel a considerable distance in the saddle. Be careful though, you won't gain experience by using fast travel. In mounted combat, you will gain experience of every enemy you defeat from the saddle."},{"id":"2","name":"Warfare","desc":"Your overall skill as a warrior, reflecting your knowledge of combat and all matters regarding war, your ability to navigate battlefields, the experience gained in countless skirmishes and your growing skill in handling weapons.\n\nThe higher your Warfare skill, the faster your attacks will be, and the harder it will be for your opponents to read your intentions and parry your attacks. Your weapons will also take less damage during combat.\n\nYour Warfare level will increase as you improve your skills with individual weapons or unarmed combat."},{"id":"3","name":"Bard","desc":"Bard skill would allow you to woo audience with your stories of valour."},{"id":"4","name":"Thievery","desc":"Thievery may not be an honourable way to make a living, but if done correctly, not a shadow of suspicion should fall upon your reputation.\n\nThis skill makes lockpicking and pickpocketing easier. As your level increases, you can tackle more complex locks and the process will be less sensitive to your mistakes. When pickpocketing, your victim is less likely to notice your probing hand, making the whole process easier, and you'll also be able to identify some items in their pockets or pouches beforehand.\n\nYou gain experience by lockpicking and pickpocketing. The stronger the lock you overcome or the more valuable the items you manage to steal, the more experience you will gain."},{"id":"6","name":"Alchemy","desc":"The art of transmutation, i.e. the knowledge of the right combination of substances and their transformation into higher and nobler forms.\n\nTo make the alchemical process successful, it is necessary to observe the correct cooking time. The greater your Alchemy skill, the more you can deviate from in without repercussions. In addition, to achieve trulymasterful potions, you will need to follow the recipe procedure exactly and have the ingredients as fresh as possible.\n\nYou will gain experience by brewing potions, and the more precisely you follow the procedure, the more experience you will gain."},{"id":"7","name":"Cooking","desc":"Cooking skill would make cooking easier."},{"id":"8","name":"Craftsmanship","desc":"Craft has always been with man and is a showcase of his skill, activity and ingenuity. It is also a source of joy, for few things surpass the satisfaction of one's own work.\n\nAs your skill grows, it will become easier to achieve a good result in weapon sharpening or blacksmithing, and you will be able to forge more advanced weapons. You will also be able to repair higher quality items when maintaining your own equipment, and you will generally use fewer resources for repairs or laundry.\n\nYou will gain experience by practicing the craft, i.e. blacksmithing, sharpening weapons, and using repair kits or washing clothes."},{"id":"10","name":"Fishing","desc":"Fishing skill would allow you to catch fish."},{"id":"11","name":"Mining","desc":"Mining skill would allow you to mine silver in Kuttenberg mines."},{"id":"12","name":"First Aid","desc":"First Aid skill makes applying bandages more efficient, staunching Bleeding with fewer bandages."},{"id":"13","name":"Drinking","desc":"Bibit Hera, bibit herus, bibit miles, bibit clerus, bibit ille, bibit illa, bibit servus cum ancilla!\n\nAs your drinking skill increases, alcohol will have less of an effect on you, therefore you won't get drunk as quickly, and if you do, the hangover will be milder and pass sooner. You'll also be at less risk of succumbing to a pernicious addiction through frequent drinking. But beware, however high your Drinking skill, you will never completely rid yoursLine truncated
|
||||
Reference in new issue
Block a user