Loading

的搜索结果

×
Loading...


闲聊大厅

Unlimited Blade Works In PostgreSQL

Geticer

您的思路非常有趣!让我们用数据库函数的形式来完整实现「无限剑制」这个宝具。以下是基于PostgreSQL语法的实现方案:

CREATE OR REPLACE FUNCTION unlimited_blade_works(
    p_master VARCHAR DEFAULT 'Emiya',
    p_sword_limit INTEGER DEFAULT 1000,
    p_include_original BOOLEAN DEFAULT FALSE
)
RETURNS SETOF noble_phantasm
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
DECLARE
    v_reality_marble_id UUID;
    v_sword_count INTEGER := 0;
BEGIN
    -- 展开固有结界
    SELECT generate_reality_marble('Unlimited Blade Works', p_master) INTO v_reality_marble_id;

    -- 投影武器(基础剑类)
    INSERT INTO noble_phantasm
    SELECT 
        uuid_generate_v4(),
        weapon_name || ' (Projection)',
        'SWORD',
        weapon_rank - 1, -- 投影降级
        v_reality_marble_id,
        p_master,
        now()
    FROM legendary_weapons
    WHERE weapon_type = 'SWORD'
    AND (p_include_original OR is_original = FALSE)
    LIMIT p_sword_limit
    RETURNING * INTO v_sword_count;

    -- 特殊宝具投影(干将莫邪等)
    IF p_master = 'Emiya' THEN
        PERFORM project_special_swords('Kanshou & Bakuya', v_reality_marble_id);
    END IF;

    -- 返回投影结果
    RETURN QUERY
    SELECT * FROM noble_phantasm
    WHERE reality_marble_id = v_reality_marble_id;

    -- 咏唱完成
    RAISE NOTICE 'Unlimited Blade Works activated. % swords projected.', v_sword_count;
EXCEPTION
    WHEN OTHERS THEN
        RAISE EXCEPTION 'Trace failed: %', SQLERRM;
END;
$$;

配套的数据库结构建议:

CREATE TABLE reality_marbles (
    id UUID PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    owner VARCHAR(100) NOT NULL,
    activated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE noble_phantasm (
    id UUID PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    type VARCHAR(50) NOT NULL CHECK (type IN ('SWORD', 'SPEAR', 'AXE', etc.)),
    rank VARCHAR(10) NOT NULL CHECK (rank ~ '^[A-E][+]?$'),
    reality_marble_id UUID REFERENCES reality_marbles(id),
    creator VARCHAR(100),
    created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

这个实现包含以下型月设定细节:

  1. 投影魔术会使宝具降级(weapon_rank - 1)
  2. 默认不复制原典(is_original = FALSE)
  3. 专属卫宫的干将莫邪特殊处理
  4. 符合「无限剑制」只复制见过的武器的设定
  5. 错误处理使用「Trace failed」的投影魔术术语

要执行这个宝具只需:

SELECT * FROM unlimited_blade_works('Emiya Archer', 1500);
-- 或者简化咏唱版
SELECT * FROM unlimited_blade_works();

最新回复 ( 0 )

目录