feat(isac): add weapon mod data management

This commit is contained in:
JB
2026-07-25 23:25:25 -04:00
parent 7bb4b92965
commit f0c14d0c9c
14 changed files with 668 additions and 12 deletions
+74 -1
View File
@@ -221,7 +221,7 @@ INSERT OR IGNORE INTO role_permissions(role_id,permission_id) VALUES('role-moder
CREATE TABLE IF NOT EXISTS oauth_states (state_hash TEXT PRIMARY KEY, provider TEXT NOT NULL, mode TEXT NOT NULL, user_id TEXT REFERENCES users(id) ON DELETE CASCADE, expires_at TEXT NOT NULL, created_at TEXT NOT NULL);
CREATE TABLE IF NOT EXISTS data_change_proposals (
id TEXT PRIMARY KEY,
module TEXT NOT NULL CHECK(module IN ('configuration','attributes','talents','brands','gear','weapons','protocols','skillchips')),
module TEXT NOT NULL CHECK(module IN ('configuration','attributes','talents','brands','gear','weapons','weaponmods','protocols','skillchips')),
action TEXT NOT NULL,
entity_id TEXT,
draft_entity_id TEXT,
@@ -611,6 +611,79 @@ CREATE TABLE IF NOT EXISTS skill_chip_talent_effects (
UNIQUE(talent_id, stat_attribute_id),
UNIQUE(talent_id, sort_order)
);
CREATE TABLE IF NOT EXISTS weapon_mods (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
slot_type TEXT NOT NULL CHECK(slot_type IN ('Optics','Muzzle','Underbarrel','Magazine','Barrel','Upper Receiver','Lower Receiver','Trigger')),
exotic_weapon_id TEXT REFERENCES weapons(id),
active INTEGER NOT NULL DEFAULT 1 CHECK(active IN (0,1)),
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS weapon_mods_name_nocase_idx ON weapon_mods(name COLLATE NOCASE);
CREATE TABLE IF NOT EXISTS weapon_mod_compatible_categories (
weapon_mod_id TEXT NOT NULL REFERENCES weapon_mods(id) ON DELETE CASCADE,
weapon_category TEXT NOT NULL CHECK(weapon_category IN ('shotgun','rifle','mmr','ar','lmg','smg')),
PRIMARY KEY(weapon_mod_id,weapon_category)
);
CREATE TABLE IF NOT EXISTS weapon_mod_slots (
weapon_id TEXT NOT NULL REFERENCES weapons(id) ON DELETE CASCADE,
tier INTEGER NOT NULL CHECK(tier BETWEEN 0 AND 2),
slot_type TEXT NOT NULL CHECK(slot_type IN ('Optics','Muzzle','Underbarrel','Magazine','Barrel','Upper Receiver','Lower Receiver','Trigger')),
PRIMARY KEY(weapon_id,tier,slot_type)
);
CREATE TABLE IF NOT EXISTS weapon_mod_quality_values (
weapon_mod_id TEXT NOT NULL REFERENCES weapon_mods(id) ON DELETE CASCADE,
quality TEXT NOT NULL CHECK(quality IN ('Standard','Specialized','Superior','High-end')),
primary_level_1_min REAL NOT NULL,
primary_level_1_max REAL NOT NULL,
primary_level_20_min REAL NOT NULL,
primary_level_20_max REAL NOT NULL,
PRIMARY KEY(weapon_mod_id,quality),
CHECK(primary_level_1_max>=primary_level_1_min),
CHECK(primary_level_20_max>=primary_level_20_min),
CHECK(primary_level_20_min>=primary_level_1_min),
CHECK(primary_level_20_max>=primary_level_1_max)
);
CREATE TABLE IF NOT EXISTS weapon_mod_secondary_options (
weapon_mod_id TEXT NOT NULL REFERENCES weapon_mods(id) ON DELETE CASCADE,
stat_attribute_id TEXT NOT NULL REFERENCES stat_attributes(id),
PRIMARY KEY(weapon_mod_id,stat_attribute_id)
);
CREATE TABLE IF NOT EXISTS weapon_mod_secondary_quality_values (
weapon_mod_id TEXT NOT NULL,
stat_attribute_id TEXT NOT NULL,
quality TEXT NOT NULL CHECK(quality IN ('Standard','Specialized','Superior','High-end')),
min_value REAL NOT NULL,
max_value REAL NOT NULL,
PRIMARY KEY(weapon_mod_id,stat_attribute_id,quality),
FOREIGN KEY(weapon_mod_id,stat_attribute_id) REFERENCES weapon_mod_secondary_options(weapon_mod_id,stat_attribute_id) ON DELETE CASCADE,
CHECK(max_value>=min_value)
);
CREATE TABLE IF NOT EXISTS weapon_mod_exotic_attributes (
id TEXT PRIMARY KEY,
weapon_mod_id TEXT NOT NULL REFERENCES weapon_mods(id) ON DELETE CASCADE,
stat_attribute_id TEXT NOT NULL REFERENCES stat_attributes(id),
level_1_value REAL NOT NULL,
level_20_value REAL NOT NULL,
sort_order INTEGER NOT NULL CHECK(sort_order BETWEEN 1 AND 12),
UNIQUE(weapon_mod_id,stat_attribute_id),
UNIQUE(weapon_mod_id,sort_order)
);
CREATE TABLE IF NOT EXISTS weapon_mod_effects (
id TEXT PRIMARY KEY,
weapon_mod_id TEXT NOT NULL REFERENCES weapon_mods(id) ON DELETE CASCADE,
stat_attribute_id TEXT NOT NULL REFERENCES stat_attributes(id),
sort_order INTEGER NOT NULL CHECK(sort_order BETWEEN 1 AND 2),
UNIQUE(weapon_mod_id,stat_attribute_id),
UNIQUE(weapon_mod_id,sort_order)
);
CREATE TABLE IF NOT EXISTS weapon_mod_effect_quality_values (
effect_id TEXT NOT NULL REFERENCES weapon_mod_effects(id) ON DELETE CASCADE,
quality TEXT NOT NULL CHECK(quality IN ('Standard','Specialized','Superior','High-end')),
value REAL NOT NULL,
PRIMARY KEY(effect_id,quality)
);
CREATE TABLE IF NOT EXISTS game_data_icons (
entity_type TEXT NOT NULL CHECK(entity_type IN ('talent', 'brand_set', 'os_protocol', 'skill_chip')),
entity_id TEXT NOT NULL,