From 49a9e08d3846c30c97b406e9b7ee75bb6c83d9a1 Mon Sep 17 00:00:00 2001 From: vikingowl Date: Thu, 21 Aug 2025 00:29:14 +0200 Subject: [PATCH] [feat] extend database schema with new tables and indexes --- database/main/alchemical_recipe.sql | 17 +++++++++++ database/main/ammunition.sql | 11 +++++++ database/main/armor.sql | 13 +++++++++ database/main/availability_level.sql | 9 ++++++ database/main/crafting_recipe.sql | 20 +++++++++++++ database/main/creature.sql | 27 ++++++++++++++++++ database/main/creature_attack.sql | 15 ++++++++++ .../main/creature_attack_has_property.sql | 14 +++++++++ database/main/creature_attack_property.sql | 9 ++++++ database/main/creature_special_ability.sql | 14 +++++++++ database/main/creature_talent.sql | 15 ++++++++++ database/main/culture_trait.sql | 3 -- database/main/deity.sql | 11 +++++++ database/main/item.sql | 15 ++++++++++ database/main/kampftechnik.sql | 18 ++++++------ database/main/liturgy_modification.sql | 17 +++++++++++ database/main/poison_disease.sql | 16 +++++++++++ database/main/profession_trait.sql | 3 -- database/main/ranged_weapon.sql | 18 ++++++++++++ database/main/service_cost.sql | 11 +++++++ database/main/shield.sql | 17 +++++++++++ database/main/social_status.sql | 10 +++++++ database/main/special_ability.sql | 13 +++++---- database/main/species_trait.sql | 3 -- database/main/spell_modification.sql | 17 +++++++++++ database/main/status_effect.sql | 10 +++++++ database/main/tradition_has_deity.sql | 14 +++++++++ database/main/trait.sql | 27 +++++++++--------- database/main/weapon.sql | 18 ++++++++++++ database/main/weapon_has_property.sql | 14 +++++++++ database/main/weapon_property.sql | 9 ++++++ rules.db | Bin 544768 -> 778240 bytes 32 files changed, 392 insertions(+), 36 deletions(-) create mode 100644 database/main/alchemical_recipe.sql create mode 100644 database/main/ammunition.sql create mode 100644 database/main/armor.sql create mode 100644 database/main/availability_level.sql create mode 100644 database/main/crafting_recipe.sql create mode 100644 database/main/creature.sql create mode 100644 database/main/creature_attack.sql create mode 100644 database/main/creature_attack_has_property.sql create mode 100644 database/main/creature_attack_property.sql create mode 100644 database/main/creature_special_ability.sql create mode 100644 database/main/creature_talent.sql create mode 100644 database/main/deity.sql create mode 100644 database/main/item.sql create mode 100644 database/main/liturgy_modification.sql create mode 100644 database/main/poison_disease.sql create mode 100644 database/main/ranged_weapon.sql create mode 100644 database/main/service_cost.sql create mode 100644 database/main/shield.sql create mode 100644 database/main/social_status.sql create mode 100644 database/main/spell_modification.sql create mode 100644 database/main/status_effect.sql create mode 100644 database/main/tradition_has_deity.sql create mode 100644 database/main/weapon.sql create mode 100644 database/main/weapon_has_property.sql create mode 100644 database/main/weapon_property.sql diff --git a/database/main/alchemical_recipe.sql b/database/main/alchemical_recipe.sql new file mode 100644 index 0000000..2b6f893 --- /dev/null +++ b/database/main/alchemical_recipe.sql @@ -0,0 +1,17 @@ +create table alchemical_recipe +( + id INTEGER + primary key, + name TEXT not null + unique, + result_item_id INTEGER + references item, + herstellungs_talent_id INTEGER not null + references talent, + herstellungs_probe_mod INTEGER default 0, + labor_schwierigkeit TEXT, + rezept_kosten_heller INTEGER, + wirkungsbeschreibung TEXT, + wirkung_strukturiert TEXT +); + diff --git a/database/main/ammunition.sql b/database/main/ammunition.sql new file mode 100644 index 0000000..030c7f4 --- /dev/null +++ b/database/main/ammunition.sql @@ -0,0 +1,11 @@ +create table ammunition +( + id INTEGER + primary key, + item_id INTEGER not null + unique + references item + on delete cascade, + passend_fuer_fk_waffe_typ TEXT +); + diff --git a/database/main/armor.sql b/database/main/armor.sql new file mode 100644 index 0000000..f1e5b0f --- /dev/null +++ b/database/main/armor.sql @@ -0,0 +1,13 @@ +create table armor +( + id INTEGER + primary key, + item_id INTEGER not null + unique + references item + on delete cascade, + ruestungsschutz INTEGER not null, + behaelinderung REAL not null, + zonen TEXT +); + diff --git a/database/main/availability_level.sql b/database/main/availability_level.sql new file mode 100644 index 0000000..c1a9efb --- /dev/null +++ b/database/main/availability_level.sql @@ -0,0 +1,9 @@ +create table availability_level +( + id INTEGER + primary key, + stufe INTEGER not null + unique, + beschreibung TEXT +); + diff --git a/database/main/crafting_recipe.sql b/database/main/crafting_recipe.sql new file mode 100644 index 0000000..3a3a25d --- /dev/null +++ b/database/main/crafting_recipe.sql @@ -0,0 +1,20 @@ +create table crafting_recipe +( + id INTEGER + primary key, + result_item_id INTEGER not null + references item, + required_talent_id INTEGER not null + references talent, + required_fw INTEGER not null, + zeitaufwand_in_ze TEXT, + benoetigte_materialien TEXT, + anmerkung TEXT +); + +create index idx_crafting_recipe_item + on crafting_recipe (result_item_id); + +create index idx_crafting_recipe_talent + on crafting_recipe (required_talent_id); + diff --git a/database/main/creature.sql b/database/main/creature.sql new file mode 100644 index 0000000..aed972e --- /dev/null +++ b/database/main/creature.sql @@ -0,0 +1,27 @@ +create table creature +( + id INTEGER + primary key, + optolith_key TEXT + unique, + name TEXT not null, + typ TEXT, + groessenkategorie TEXT, + attr_mu INTEGER, + attr_kl INTEGER, + attr_in INTEGER, + attr_ch INTEGER, + attr_ff INTEGER, + attr_ge INTEGER, + attr_ko INTEGER, + attr_kk INTEGER, + le_formel TEXT, + sk_wert INTEGER, + zk_wert INTEGER, + gs_wert INTEGER, + ini_formel TEXT, + rs_wert INTEGER, + beschreibung TEXT, + fluchtverhalten TEXT +); + diff --git a/database/main/creature_attack.sql b/database/main/creature_attack.sql new file mode 100644 index 0000000..9b5ffd7 --- /dev/null +++ b/database/main/creature_attack.sql @@ -0,0 +1,15 @@ +create table creature_attack +( + id INTEGER + primary key, + creature_id INTEGER not null + references creature + on delete cascade, + name TEXT not null, + at_wert INTEGER, + pa_wert INTEGER, + tp_formel TEXT, + reichweite TEXT, + eigenschaften TEXT +); + diff --git a/database/main/creature_attack_has_property.sql b/database/main/creature_attack_has_property.sql new file mode 100644 index 0000000..d7a0e94 --- /dev/null +++ b/database/main/creature_attack_has_property.sql @@ -0,0 +1,14 @@ +create table creature_attack_has_property +( + attack_id INTEGER not null + references creature_attack + on delete cascade, + property_id INTEGER not null + references creature_attack_property + on delete restrict, + primary key (attack_id, property_id) +); + +create index idx_creature_attack_has_prop_prop + on creature_attack_has_property (property_id); + diff --git a/database/main/creature_attack_property.sql b/database/main/creature_attack_property.sql new file mode 100644 index 0000000..3d1ea24 --- /dev/null +++ b/database/main/creature_attack_property.sql @@ -0,0 +1,9 @@ +create table creature_attack_property +( + id INTEGER + primary key, + name TEXT not null + unique, + beschreibung TEXT +); + diff --git a/database/main/creature_special_ability.sql b/database/main/creature_special_ability.sql new file mode 100644 index 0000000..6bc1328 --- /dev/null +++ b/database/main/creature_special_ability.sql @@ -0,0 +1,14 @@ +create table creature_special_ability +( + creature_id INTEGER not null + references creature + on delete cascade, + special_ability_id INTEGER not null + references special_ability + on delete restrict, + primary key (creature_id, special_ability_id) +); + +create index idx_creature_sa_sa + on creature_special_ability (special_ability_id); + diff --git a/database/main/creature_talent.sql b/database/main/creature_talent.sql new file mode 100644 index 0000000..1a751d4 --- /dev/null +++ b/database/main/creature_talent.sql @@ -0,0 +1,15 @@ +create table creature_talent +( + creature_id INTEGER not null + references creature + on delete cascade, + talent_id INTEGER not null + references talent + on delete restrict, + fertigkeitswert INTEGER not null, + primary key (creature_id, talent_id) +); + +create index idx_creature_talent_talent + on creature_talent (talent_id); + diff --git a/database/main/culture_trait.sql b/database/main/culture_trait.sql index 63e4df8..172b633 100644 --- a/database/main/culture_trait.sql +++ b/database/main/culture_trait.sql @@ -16,6 +16,3 @@ create table culture_trait create index idx_culture_trait_trait on culture_trait (trait_id); -create index idx_culture_trait_trait2 - on culture_trait (trait_id); - diff --git a/database/main/deity.sql b/database/main/deity.sql new file mode 100644 index 0000000..c84c307 --- /dev/null +++ b/database/main/deity.sql @@ -0,0 +1,11 @@ +create table deity +( + id INTEGER + primary key, + name TEXT not null + unique, + aspekte TEXT, + herrschaftsbereich TEXT, + heiliges_tier TEXT +); + diff --git a/database/main/item.sql b/database/main/item.sql new file mode 100644 index 0000000..e9752f9 --- /dev/null +++ b/database/main/item.sql @@ -0,0 +1,15 @@ +create table item +( + id INTEGER + primary key, + name TEXT not null, + typ TEXT not null, + gewicht_in_unzen INTEGER default 0, + preis_in_heller INTEGER default 0, + beschreibung TEXT, + verfuegbarkeit TEXT, + availability_id INTEGER + references availability_level, + check (typ IN ('WAFFE', 'RÜSTUNG', 'SCHILD', 'FERNKAMPFWAFFE', 'MUNITION', 'ALLGEMEIN', 'ALCHEMIKA')) +); + diff --git a/database/main/kampftechnik.sql b/database/main/kampftechnik.sql index 96b52dd..3d3fbd2 100644 --- a/database/main/kampftechnik.sql +++ b/database/main/kampftechnik.sql @@ -1,17 +1,19 @@ create table kampftechnik ( - id INTEGER + id INTEGER primary key, - optolith_key TEXT not null + optolith_key TEXT not null unique, - name TEXT not null, - grundwert INTEGER default 6 not null, - probe_attr1_id INTEGER + name TEXT not null, + grundwert INTEGER default 6 not null, + probe_attr1_id INTEGER references attribute, - probe_attr2_id INTEGER + probe_attr2_id INTEGER references attribute, - probe_attr3_id INTEGER + probe_attr3_id INTEGER references attribute, - beschreibung TEXT + beschreibung TEXT, + leiteigenschaft_id INTEGER + references attribute ); diff --git a/database/main/liturgy_modification.sql b/database/main/liturgy_modification.sql new file mode 100644 index 0000000..8ad145b --- /dev/null +++ b/database/main/liturgy_modification.sql @@ -0,0 +1,17 @@ +create table liturgy_modification +( + id INTEGER + primary key, + liturgy_id INTEGER not null + references liturgy + on delete cascade, + name TEXT not null, + wirkung TEXT not null, + voraussetzung TEXT, + kosten_modifikation TEXT, + unique (liturgy_id, name) +); + +create index idx_liturgy_mod_liturgy + on liturgy_modification (liturgy_id); + diff --git a/database/main/poison_disease.sql b/database/main/poison_disease.sql new file mode 100644 index 0000000..8055b64 --- /dev/null +++ b/database/main/poison_disease.sql @@ -0,0 +1,16 @@ +create table poison_disease +( + id INTEGER + primary key, + name TEXT not null + unique, + typ TEXT not null, + art TEXT, + resistenz_probe_attr TEXT not null, + stufe INTEGER, + wirkungsbeginn TEXT, + schaden_wirkung TEXT, + dauer TEXT, + check (typ IN ('GIFT', 'KRANKHEIT')) +); + diff --git a/database/main/profession_trait.sql b/database/main/profession_trait.sql index 90f7f78..aebb8be 100644 --- a/database/main/profession_trait.sql +++ b/database/main/profession_trait.sql @@ -14,6 +14,3 @@ create table profession_trait create index idx_profession_trait_trait on profession_trait (trait_id); -create index idx_profession_trait_trait2 - on profession_trait (trait_id); - diff --git a/database/main/ranged_weapon.sql b/database/main/ranged_weapon.sql new file mode 100644 index 0000000..e793ac9 --- /dev/null +++ b/database/main/ranged_weapon.sql @@ -0,0 +1,18 @@ +create table ranged_weapon +( + id INTEGER + primary key, + item_id INTEGER not null + unique + references item + on delete cascade, + kampftechnik_id INTEGER not null + references kampftechnik + on delete restrict, + schaden_tp_formel TEXT not null, + ladezeit_in_aktionen INTEGER, + reichweite_nah INTEGER, + reichweite_mittel INTEGER, + reichweite_fern INTEGER +); + diff --git a/database/main/service_cost.sql b/database/main/service_cost.sql new file mode 100644 index 0000000..499b7c8 --- /dev/null +++ b/database/main/service_cost.sql @@ -0,0 +1,11 @@ +create table service_cost +( + id INTEGER + primary key, + name TEXT not null, + kategorie TEXT, + preis_in_heller INTEGER, + preis_bemerkung TEXT, + beschreibung TEXT +); + diff --git a/database/main/shield.sql b/database/main/shield.sql new file mode 100644 index 0000000..ec106bc --- /dev/null +++ b/database/main/shield.sql @@ -0,0 +1,17 @@ +create table shield +( + id INTEGER + primary key, + item_id INTEGER not null + unique + references item + on delete cascade, + kampftechnik_id INTEGER not null + references kampftechnik + on delete restrict, + at_mod INTEGER default 0, + pa_mod INTEGER default 0, + zusatz_rs INTEGER default 0, + zusatz_be REAL default 0 +); + diff --git a/database/main/social_status.sql b/database/main/social_status.sql new file mode 100644 index 0000000..5e8e1df --- /dev/null +++ b/database/main/social_status.sql @@ -0,0 +1,10 @@ +create table social_status +( + id INTEGER + primary key, + name TEXT not null + unique, + ap_kosten INTEGER not null, + beschreibung TEXT +); + diff --git a/database/main/special_ability.sql b/database/main/special_ability.sql index 24f7222..47b8676 100644 --- a/database/main/special_ability.sql +++ b/database/main/special_ability.sql @@ -1,14 +1,15 @@ create table special_ability ( - id INTEGER + id INTEGER primary key, - optolith_key TEXT not null + optolith_key TEXT not null unique, - name TEXT not null, - type_code TEXT + name TEXT not null, + type_code TEXT references sa_type on update cascade, - ap_kosten INTEGER, - beschreibung TEXT + ap_kosten INTEGER, + beschreibung TEXT, + benoetigt_parameter BOOLEAN default 0 not null ); diff --git a/database/main/species_trait.sql b/database/main/species_trait.sql index e733083..aec8b42 100644 --- a/database/main/species_trait.sql +++ b/database/main/species_trait.sql @@ -16,6 +16,3 @@ create table species_trait create index idx_species_trait_trait on species_trait (trait_id); -create index idx_species_trait_trait2 - on species_trait (trait_id); - diff --git a/database/main/spell_modification.sql b/database/main/spell_modification.sql new file mode 100644 index 0000000..0733ba6 --- /dev/null +++ b/database/main/spell_modification.sql @@ -0,0 +1,17 @@ +create table spell_modification +( + id INTEGER + primary key, + spell_id INTEGER not null + references spell + on delete cascade, + name TEXT not null, + wirkung TEXT not null, + voraussetzung TEXT, + kosten_modifikation TEXT, + unique (spell_id, name) +); + +create index idx_spell_mod_spell + on spell_modification (spell_id); + diff --git a/database/main/status_effect.sql b/database/main/status_effect.sql new file mode 100644 index 0000000..14d63b8 --- /dev/null +++ b/database/main/status_effect.sql @@ -0,0 +1,10 @@ +create table status_effect +( + id INTEGER + primary key, + name TEXT not null + unique, + max_stufen INTEGER, + regel_beschreibung TEXT +); + diff --git a/database/main/tradition_has_deity.sql b/database/main/tradition_has_deity.sql new file mode 100644 index 0000000..334beb3 --- /dev/null +++ b/database/main/tradition_has_deity.sql @@ -0,0 +1,14 @@ +create table tradition_has_deity +( + tradition_id INTEGER not null + references tradition + on delete cascade, + deity_id INTEGER not null + references deity + on delete restrict, + primary key (tradition_id, deity_id) +); + +create index idx_trad_deity_deity + on tradition_has_deity (deity_id); + diff --git a/database/main/trait.sql b/database/main/trait.sql index 5e5a538..65f4ac7 100644 --- a/database/main/trait.sql +++ b/database/main/trait.sql @@ -1,20 +1,21 @@ create table trait ( - id INTEGER + id INTEGER primary key, - optolith_key TEXT not null + optolith_key TEXT not null unique, - name TEXT not null, - kind TEXT not null, - is_leveled INTEGER default 0 not null, - level_min INTEGER, - level_max INTEGER, - level_step INTEGER, - ap_cost_mode TEXT default 'FIXED' not null, - ap_wert INTEGER, - ap_per_level INTEGER, - ap_formula TEXT, - beschreibung TEXT, + name TEXT not null, + kind TEXT not null, + is_leveled INTEGER default 0 not null, + level_min INTEGER, + level_max INTEGER, + level_step INTEGER, + ap_cost_mode TEXT default 'FIXED' not null, + ap_wert INTEGER, + ap_per_level INTEGER, + ap_formula TEXT, + beschreibung TEXT, + benoetigt_parameter BOOLEAN default 0 not null, check (ap_cost_mode IN ('FIXED', 'PER_LEVEL', 'TABLE', 'FORMULA')), check (is_leveled IN (0, 1)), check (kind IN ('VORTEIL', 'NACHTEIL')) diff --git a/database/main/weapon.sql b/database/main/weapon.sql new file mode 100644 index 0000000..4e5a2f9 --- /dev/null +++ b/database/main/weapon.sql @@ -0,0 +1,18 @@ +create table weapon +( + id INTEGER + primary key, + item_id INTEGER not null + unique + references item + on delete cascade, + kampftechnik_id INTEGER not null + references kampftechnik + on delete restrict, + schaden_tp_formel TEXT not null, + tp_kk_schwelle INTEGER, + tp_kk_schritt INTEGER, + at_mod INTEGER default 0, + pa_mod INTEGER default 0 +); + diff --git a/database/main/weapon_has_property.sql b/database/main/weapon_has_property.sql new file mode 100644 index 0000000..5952c73 --- /dev/null +++ b/database/main/weapon_has_property.sql @@ -0,0 +1,14 @@ +create table weapon_has_property +( + weapon_id INTEGER not null + references weapon + on delete cascade, + property_id INTEGER not null + references weapon_property + on delete restrict, + primary key (weapon_id, property_id) +); + +create index idx_weapon_has_property_prop + on weapon_has_property (property_id); + diff --git a/database/main/weapon_property.sql b/database/main/weapon_property.sql new file mode 100644 index 0000000..d05e7d6 --- /dev/null +++ b/database/main/weapon_property.sql @@ -0,0 +1,9 @@ +create table weapon_property +( + id INTEGER + primary key, + name TEXT not null + unique, + beschreibung TEXT +); + diff --git a/rules.db b/rules.db index bcf6c6a79f099f5395ba0c6859cc5a2039e6e11a..2dc68b46ce1aa5e1807e90402878b326600f9819 100644 GIT binary patch delta 9487 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 W<3X)2SO|iuH!e-Ya1CtOMgaf}*K8U9 delta 623 zcmZoTpx>}Sae}m96$1l9D+2=LPSi2htYXmX5@BUvVBqAx1d?jy|IPo6|0Dk!{^$IU z`0w)H;J?K5iRm!Y;mv{y)=ZlZGkxNjtou(y*(fPLKbu9JiH(7Qp}dicfq@~fo`HcO zDV2eNAuxi0fx*dR^BaDt2Xf&IeC~X5ykB|xc+|Pgxmj4xvMyq-VRmKu#SqS*F?m0e z@#em-WvrWLv6{0^e#33tZ2r65{5NB}`ERD}=D(TGipcRX=riy$@}1xg=2qi6&;F5p z2b&V>V^&s{YfPz3YTK0rSROG>f6L06$kmeP#xAa{&Dbftoll4*jfq)P*L8Xv539`f z!y+tynYdb`9oWTHRT;Y~x1SPcxy-cvoD_@MQyBq@Xo zEM?5^nd6ymGuiMr@crb=;r+r}$n%w_mirTTAy+r!F-8xD>4FQGd$#Ytz_y>0iGg8y z!!5Rtob}c0;?BB^jndO~;+f>9&%Dj{gr%&KU3`1v9kyadma;N-@$EnEvT-)avN$tv zGhAR`-pgOWd!NUZ>nx`a`*pTRmRC%!3>PK~Ds0+bkicHb$lX-Z$jL74t<2HNIz1qV zU3UAdWcC2Y=}!~c+gKPF7?w{KR9L+IRSLV9^rj6g0*hG|C}83T0uo$|t_+c^$mqIRP(hP%yWA8GU&ihB?i>d>w)?nn)G=z@z1^~4QxL*JO