캐릭터 멀티 조합기 V2.1 — 사화 존재감·버전 차이·운영 코드 원문

개요와 게임기획서에서의 위치

자미두수의 별 조합을 존재감·시선·자세 지시문으로 변환하는 운영 도구입니다. 플레이어와 캐릭터, 아트·음악·영상, 기술·개발의 표현 출력 근거로 연결합니다. 현재 게임 상태를 계산하거나 이미지를 생성하는 엔진은 아닙니다. 이 글은 버전의 독립 원자료와 실행 근거를 보존합니다.

원출처와 확인 범위

(재마너아) 프롬프트 자미두수 성질특성별 분석. 2026-10-04 공개 화면의 V2.1, 페이지에 포함된 JavaScript 전체, 자미→파군→화권 선택과 남녀 전환·초기화를 확인했습니다. 원대화 전체와 최초 게시 시각·작성 주체·설치 스니펫 ID는 미확인입니다.

확인된 구조와 버전 차이

14주성·보좌/길성8·살성6·사화4의 총32항목입니다. 주성의 존재감만 남녀별로 나뉘며 시선과 자세는 공통입니다. V2.1 사화에는 presence만 있고 eye·posture는 없습니다. 화권을 선택하면 strengthened dominant power가 존재감에 붙지만 시선·자세는 자미와 파군 그대로입니다.

V2.2 원문과 실행 결과에서는 사화4개에 시선·자세가 추가되고 존재감 표현도 변경됩니다. V2.1은 시선을 mixed with, 자세를 harmonized with로 연결하고 V2.2는 +로 연결합니다. Grok의 Identity 표기가 Scene/Identity로 바뀌고 Midjourney의 별 이름 연결도 and에서 &로 변경됩니다. 버전 표기만으로 과거 사용자의 채택 순서나 실제 제작 성공을 확정하지 않습니다.

선택 ID와 출력 문자열의 중복을 Set으로 제거하는 문자열 결합입니다. 수치 가중치·충돌 해소·관계/성장 계산·명반 입력 연결·외부 생성 API는 확인 코드에 없습니다. ‘perfectly upright stillness’와 ‘dynamic asymmetric pose’가 함께 남습니다. 선택 순서는 출력 순서에 영향을 줍니다.

실제 실행 출력

남성 output-grok

[Identity: Male | 자미+파군+화권]
Presence: calm authoritative emperor, rebellious innovator, strengthened dominant power
Eyes: direct judge-like gaze mixed with unstable disruptive gaze
Posture: perfectly upright stillness harmonized with dynamic asymmetric pose
Field: cinematic realistic portrait, natural skin texture, 8k, grounded realism

남성 output-mj

Portrait of a Male Korean adult, embodying 자미 and 파군 and 화권 Stars, calm authoritative emperor, rebellious innovator, strengthened dominant power, direct judge-like gaze mixed with unstable disruptive gaze, perfectly upright stillness harmonized with dynamic asymmetric pose, hyper-realistic facial features, 85mm lens, soft cinematic studio lighting, --ar 4:5 --v 6.1

여성 output-grok

[Identity: Female | 자미+파군+화권]
Presence: elegant empress dignity, bold rule-breaker, strengthened dominant power
Eyes: direct judge-like gaze mixed with unstable disruptive gaze
Posture: perfectly upright stillness harmonized with dynamic asymmetric pose
Field: cinematic realistic portrait, natural skin texture, 8k, grounded realism

여성 output-mj

Portrait of a Female Korean adult, embodying 자미 and 파군 and 화권 Stars, elegant empress dignity, bold rule-breaker, strengthened dominant power, direct judge-like gaze mixed with unstable disruptive gaze, perfectly upright stillness harmonized with dynamic asymmetric pose, hyper-realistic facial features, 85mm lens, soft cinematic studio lighting, --ar 4:5 --v 6.1

모두 초기화 후 출력 두 개가 빈 문자열로 돌아왔습니다. 복사 버튼과 실제 이미지·영상 생성은 이번에 시험하지 않았습니다.

사용자 확정·AI 제안·폐기·중복·미확인

사용자 확정: 관련 자료를 추적하고 본문·코드·분석을 독립 자료 글로 보존하라는 현재 지시입니다. 과거 별별 표현에 대한 사용자 확정 원문은 확보하지 못했습니다. AI 제안 주체는 출처 제목만으로 확정하지 않습니다. 이 버전의 직접 거부·폐기 발언은 미확보입니다. V2.2·V2.3과 같은 표현 조합 계열이므로 서로 다른 게임 시스템으로 중복 채택하지 않습니다.

Sol 게임 적용 제안: 게임에서 계산된 캐릭터 상태를 별/표현 ID로 전달하고 존재감·시선·자세를 출력하는 연결부의 후보입니다. 사화의 상태 변화가 시선·자세에 반영되는 V2.2와 비교해 표현 범위를 결정할 수 있습니다. 얼굴 일관성·LoRA 학습·수치 상태 모델·실제 생성 품질은 별도 검증이 필요합니다. 조사 결과를 보존한 것이며 최종 기획 채택은 아닙니다.

관련 자료: 캐릭터 조합기 V2.3 운영·계보 복원, 신수심법 캐릭터 생성기. 다음 연결은 공통 데이터와 출력 차이를 비교하여 중복을 제거하고 기획 담당 GPT가 적용 범위를 판단하는 것입니다.

운영 JavaScript 원문 전체

공개 페이지에 포함된 data:text/javascript;base64 스크립트를 디코딩했습니다. 아래는 보관용 코드이며 이 글에서 실행하지 않습니다.


    const starsData = {
        main: [
            { id: 'ziwei', name: '자미', male: 'calm authoritative emperor', female: 'elegant empress dignity', eye: 'direct judge-like gaze', posture: 'perfectly upright stillness' },
            { id: 'tianji', name: '천기', male: 'intellectual strategist', female: 'clever agile counselor', eye: 'sharp scanning observant eyes', posture: 'quick responsive posture' },
            { id: 'taiyang', name: '태양', male: 'heroic righteous leader', female: 'radiant confident queen', eye: 'bright open passionate eyes', posture: 'open-handed bold stance' },
            { id: 'wuqu', name: '무곡', male: 'stern practical warrior', female: 'capable disciplined manager', eye: 'cold focused metallic gaze', posture: 'rigid disciplined posture' },
            { id: 'tiandong', name: '천동', male: 'warm benevolent scholar', female: 'lovely pure soul', eye: 'soft smiling gentle eyes', posture: 'relaxed comfortable stance' },
            { id: 'lianzhen', name: '염정', male: 'disciplined seductive officer', female: 'sophisticated mysterious lady', eye: 'intense gaze with secrets', posture: 'sleek controlled posture' },
            { id: 'tianfu', name: '천부', male: 'stable generous lord', female: 'graceful stable matriarch', eye: 'relaxed deep calm eyes', posture: 'solid grounded posture' },
            { id: 'taiyin', name: '태음', male: 'sensitive moonlike artist', female: 'mysterious moon goddess', eye: 'dewy soft reflective gaze', posture: 'graceful slender stance' },
            { id: 'tanlang', name: '탐랑', male: 'magnetic charismatic entertainer', female: 'glamorous alluring temptress', eye: 'magnetic assertive gaze', posture: 'dynamic seductive pose' },
            { id: 'jumen', name: '거문', male: 'skeptical sharp critic', female: 'logical articulate observer', eye: 'probing analytical eyes', posture: 'guarded closed posture' },
            { id: 'tianxiang', name: '천상', male: 'refined diplomatic official', female: 'poised elegant diplomat', eye: 'balanced polite gaze', posture: 'formal aligned stance' },
            { id: 'tianliang', name: '천량', male: 'wise guardian mentor', female: 'mature protective sister', eye: 'watchful benevolent eyes', posture: 'stable upright posture' },
            { id: 'qisha', name: '칠살', male: 'fierce commander', female: 'lethal female general', eye: 'sharp piercing killing intent', posture: 'tense body ready to strike' },
            { id: 'pojun', name: '파군', male: 'rebellious innovator', female: 'bold rule-breaker', eye: 'unstable disruptive gaze', posture: 'dynamic asymmetric pose' }
        ],
        lucky: [
            { id: 'zuofu', name: '좌보', presence: 'supportive reliable aid', eye: 'steady helpful gaze', posture: 'leaning in to assist' },
            { id: 'youbi', name: '우필', presence: 'flexible clever helper', eye: 'witty resourceful eyes', posture: 'agile and adaptable stance' },
            { id: 'tiankui', name: '천괴', presence: 'noble elder influence', eye: 'guiding authoritative gaze', posture: 'tall dignified presence' },
            { id: 'tianyue', name: '천월', presence: 'secret benefactor aura', eye: 'gentle protective gaze', posture: 'quiet supportive posture' },
            { id: 'wenchang', name: '문창', presence: 'scholarly literary grace', eye: 'refined artistic eyes', posture: 'graceful and poised' },
            { id: 'wenqu', name: '문곡', presence: 'eloquent creative flair', eye: 'sparkling intelligent gaze', posture: 'expressive and rhythmic body' },
            { id: 'nokjon', name: '녹존', presence: 'prosperous stable abundance', eye: 'heavy satisfied gaze', posture: 'solid and unshakeable' },
            { id: 'cheonma', name: '천마', presence: 'active restless mobility', eye: 'quick moving eyes', posture: 'leaning forward for motion' }
        ],
        cruel: [
            { id: 'qingyang', name: '경양', presence: 'sharp metallic tension', eye: 'piercing blade-like gaze', posture: 'aggressive forward-leaning' },
            { id: 'tuoluo', name: '타라', presence: 'heavy dragging shadow', eye: 'stubborn lingering gaze', posture: 'stagnant and weighted' },
            { id: 'huoxing', name: '화성', presence: 'blazing sudden temper', eye: 'flaming intense eyes', posture: 'explosive energy' },
            { id: 'lingxing', name: '영성', presence: 'chilling silent vibration', eye: 'cold ringing gaze', posture: 'hidden internal tension' },
            { id: 'digong', name: '지공', presence: 'hollow spectral void', eye: 'empty detached gaze', posture: 'weightless floating feel' },
            { id: 'dijie', name: '지겁', presence: 'shattered energy aura', eye: 'unpredictable broken gaze', posture: 'fractured and unstable' }
        ],
        trans: [
            { id: 'hualu', name: '화록', presence: 'flourishing golden prosperity' },
            { id: 'huaquan', name: '화권', presence: 'strengthened dominant power' },
            { id: 'huake', name: '화과', presence: 'reputable honorable fame' },
            { id: 'huaji', name: '화기', presence: 'knotted dark obsession' }
        ]
    };

    let state = {
        gender: 'Male',
        selected: new Set()
    };

    function renderOptions() {
        const renderSet = (containerId, data) => {
            const container = document.getElementById(containerId);
            container.innerHTML = data.map(star => `
                <div class="relative">
                    <input type="checkbox" id="${star.id}" class="star-checkbox hidden" 
                           onchange="toggleStar('${star.id}')" ${state.selected.has(star.id) ? 'checked' : ''}>
                    <label for="${star.id}" class="star-label block p-2 border border-slate-200 rounded-xl text-center cursor-pointer text-xs font-bold transition-all hover:bg-slate-50">
                        ${star.name}
                    </label>
                </div>
            `).join('');
        };

        renderSet('main-container', starsData.main);
        renderSet('lucky-container', starsData.lucky);
        renderSet('cruel-container', starsData.cruel);
        renderSet('trans-container', starsData.trans);
    }

    function toggleStar(starId) {
        if (state.selected.has(starId)) state.selected.delete(starId);
        else state.selected.add(starId);
        updateUI();
    }

    function setGender(g) {
        state.gender = g;
        const maleBtn = document.getElementById('gen-male');
        const femaleBtn = document.getElementById('gen-female');
        if (g === 'Male') {
            maleBtn.className = 'px-6 py-2 rounded-lg font-bold transition-all bg-blue-600 text-white border-none';
            femaleBtn.className = 'px-6 py-2 rounded-lg font-bold transition-all text-slate-400 border-none';
        } else {
            femaleBtn.className = 'px-6 py-2 rounded-lg font-bold transition-all bg-pink-600 text-white border-none';
            maleBtn.className = 'px-6 py-2 rounded-lg font-bold transition-all text-slate-400 border-none';
        }
        updateUI();
    }

    function resetAll() {
        state.selected.clear();
        document.querySelectorAll('.star-checkbox').forEach(cb => cb.checked = false);
        updateUI();
    }

    function updateUI() {
        renderSelectedChips();
        generatePrompts();
    }

    function renderSelectedChips() {
        const container = document.getElementById('selected-list');
        if (state.selected.size === 0) {
            container.innerHTML = '<p class="text-gray-400 text-xs">별을 선택하면 이곳에 조합됩니다.</p>';
            return;
        }
        container.innerHTML = Array.from(state.selected).map(id => {
            const allStars = [...starsData.main, ...starsData.lucky, ...starsData.cruel, ...starsData.trans];
            const star = allStars.find(s => s.id === id);
            return `<span class="bg-slate-800 text-white text-[10px] px-2 py-1 rounded-full flex items-center gap-1">
                ${star.name} <button onclick="toggleStar('${id}')" class="bg-transparent border-none text-white hover:text-red-400 cursor-pointer">×</button>
            </span>`;
        }).join('');
    }

    function generatePrompts() {
        const grokArea = document.getElementById('output-grok');
        const mjArea = document.getElementById('output-mj');

        if (state.selected.size === 0) {
            grokArea.value = "";
            mjArea.value = "";
            return;
        }

        let presences = [], eyes = [], postures = [], names = [];
        const genderKey = state.gender.toLowerCase();
        const allStars = [...starsData.main, ...starsData.lucky, ...starsData.cruel, ...starsData.trans];

        state.selected.forEach(id => {
            const s = allStars.find(x => x.id === id);
            if (!s) return;
            names.push(s.name);
            
            if (s[genderKey]) presences.push(s[genderKey]);
            else if (s.presence) presences.push(s.presence);
            
            if (s.eye) eyes.push(s.eye);
            if (s.posture) postures.push(s.posture);
        });

        const combinedPresence = [...new Set(presences)].join(", ");
        const combinedEyes = [...new Set(eyes)].join(" mixed with ");
        const combinedPostures = [...new Set(postures)].join(" harmonized with ");

        const grokOutput = `[Identity: ${state.gender} | ${names.join("+")}]
Presence: ${combinedPresence}
Eyes: ${combinedEyes}
Posture: ${combinedPostures}
Field: cinematic realistic portrait, natural skin texture, 8k, grounded realism`;

        const mjOutput = `Portrait of a ${state.gender} Korean adult, embodying ${names.join(" and ")} Stars, ${combinedPresence}, ${combinedEyes}, ${combinedPostures}, hyper-realistic facial features, 85mm lens, soft cinematic studio lighting, --ar 4:5 --v 6.1`;

        grokArea.value = grokOutput;
        mjArea.value = mjOutput;
    }

    function copyToClipboard(id) {
        const text = document.getElementById(id).value;
        if (!text) return;
        
        const tempElem = document.createElement('textarea');
        tempElem.value = text;
        document.body.appendChild(tempElem);
        tempElem.select();
        document.execCommand('copy');
        document.body.removeChild(tempElem);

        const btn = document.querySelector(`button[onclick="copyToClipboard('${id}')"]`);
        const originalText = btn.innerText;
        btn.innerText = "복사됨!";
        setTimeout(() => btn.innerText = originalText, 1000);
    }

    window.onload = renderOptions;

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다