feat: 🎸 提示词系统初步搭建

dev
Shawn 3 years ago
parent b2fbfb9d89
commit 8afc44f65d

@ -0,0 +1,93 @@
export const ACTION_BASE = {
"坐": "sitting",
"站": "stand",
"蹲着": "squat",
"趴": "grovel",
"躺": "lie",
"跳": "jump",
"跑": "run",
"走": "walk",
"飞": "fly",
"歪头": "head tilt",
"回头": "looking back",
"向下看": "looking down",
"向上看": "looking up",
"闻": "smelling",
"睡觉": "sleeping",
"洗澡": "bathing",
}
export const ACTION_HAND = {
"手放在嘴边": "hand_to_mouth",
"手放头旁边": "arm at side ",
"手放脑后": "arms behind head",
"手放后面": "arms behind back ",
"手放在自己的胸前": "hand on own chest",
"手交叉于胸前": "arms_crossed",
"手放臀": "hand on another\u0027s hip",
"单手插腰": "hand_on_hip",
"双手叉腰": "hands_on_hips",
"举手": "hands up ",
"伸懒腰": "stretch",
"举手露腋": "armpits",
"手把腿抓着": "leg hold",
"抓住": "grabbing",
"拿着": "holding",
"用手指做出笑脸": "fingersmile",
"拉头发": "hair_pull",
"撮头发": "hair scrunchie",
"手势": "w ",
"耶": "peace symbol ",
"翘大拇指": "thumbs_up",
"比出中指": "middle_finger",
"猫爪手势": "cat_pose",
"手枪手势": "finger_gun",
"嘘手势": "shushing",
"招手": "waving",
"敬礼": "salute",
"张手": "spread_arms",
}
export const ACTION_LEG = {
"张开腿": "spread legs",
"二郎腿": "crossed_legs",
"曲腿至胸": "fetal_position",
"抬一只脚": "leg_lift",
"抬两只脚": "legs_up",
"前倾": "leaning forward",
"婴儿姿势": "fetal position",
"靠墙": " against wall",
"趴着": "on_stomach",
"正坐": "seiza",
"割坐": "wariza/w-sitting",
"侧身坐": "yokozuwari",
"盘腿": "indian_style",
"抱腿": "leg_hug",
"跨坐": "straddling",
"下跪": "kneeling",
"抽烟": "smoking",
"用手支撑住": "arm_support",
}
export const ACTION_COMPOSE = {
"拥抱": "hug",
"膝枕": "lap_pillow",
"公主抱": "princess_carry",
"战斗姿态": "fighting_stance",
"颠倒的": "upside-down",
"趴着翘臀": "top-down_bottom-up",
"翘臀姿势": "bent_over",
"弓身体": "arched_back",
"背对背": "back-to-back",
"手对手": "symmetrical_hand_pose",
"眼对眼(对视)": "eye_contact",
"掏耳勺": "mimikaki",
"牵手": "holding_hands",
"四肢趴地": "all_fours",
"女胸部贴在一起": "symmetrical_docking",
"脱衣服": "undressing",
"掀起裙子": "skirt lift",
"掀起上衣": "shirt lift",
"调整过膝袜": "adjusting_thighhigh"
}

@ -1,101 +1,118 @@
export const BODY_BREASTS = [ export const BODY_BREASTS = {
"breasts", "小%3": "small breast",
"small breasts", "中%1": "medium breast",
"medium breasts", "大%5": "big breast"
"large breasts", };
"huge breasts",
"alternate breast size", export const BODY_CLOTHING = {
"mole on breast", "晚礼服%1": "evening dress",
"between breasts", "短裙%3": "Skirt",
"breasts apart", "长裙%3": "Long skirt",
"hanging breasts", "水手服%5": "sailor suit",
"bouncing breasts", "JK%5": "JK",
]; "黑色丝袜": "black silk stocking",
"白色丝袜": "white silk stocking",
"西装%3": "suit",
export const BODY_CLOTHING = [
"sailor collar", "湿衣服%5": "wet clothes",
"hat",
"shirt", "比基尼%5": "bikini",
"serafuku", "领子%1": "sailor collar",
"sailor suite", "帽子%1": "hat",
"sailor shirt", "衬衫%1": "shirt",
"shorts under skirt", "水手服 ": "shorts under skirt",
"collared shirt", "有领衬衣%1": "collared shirt ",
"school uniform", "学校制服": "school uniform",
"seifuku", "日本学生服": "seifuku",
"business_suit", "职场制服%2": "business_suit",
"jacket", "夹克%2": "jacket",
"suit", "火焰纹章军服%3": "garreg mach monastery uniform",
"garreg mach monastery uniform", "礼服长裙": "revealing dress",
"revealing dress", "礼服": "pink lucency full dress",
"pink lucency full dress", "露出胸口部分的连衣裙%4": "cleavage dress",
"cleavage dress", "无袖连衣裙": "sleeveless dress",
"sleeveless dress", "白色连衣裙": "whitedress",
"whitedress", "婚纱%3": "wedding_dress",
"wedding_dress", "水手连衣裙": "Sailor dress",
"Sailor dress", "毛衣裙": "sweater dress",
"sweater dress", "罗纹毛衣": "ribbed sweater",
"ribbed sweater", "毛衣夹克": "sweater jacket",
"sweater jacket", "工装服": "dungarees",
"dungarees", "棕色开襟衫(外套)": "brown cardigan ",
"brown cardigan", "连帽衫,卫衣%3": "hoodie ",
"hoodie", "长袍%2": "robe",
"robe", "斗篷%3": "cape",
"cape", "羊毛衫%2": "cardigan",
"cardigan", "围裙": "apron",
"apron", "哥特风格%4": "gothic",
"gothic", "洛丽塔风格%4": "lolita_fashion",
"lolita_fashion", "哥特洛丽塔风格%4": "gothic_lolita",
"gothic_lolita", "西部风格": "western",
"western", "格子花纹": "tartan",
"tartan", "露单肩": "off_shoulder",
"off_shoulder", "露双肩": "bare_shoulders",
"bare_shoulders", "赤脚": "barefoot",
"barefoot", "裸足": "bare_legs",
"bare_legs", "横条花纹的": "striped",
"striped", "点状花纹的": "polka_dot",
"polka_dot", "皱边的": "frills",
"frills", "花边": "lace",
"lace", "日本女生运动短裤": "buruma",
"buruma", "运动服": "gym_uniform",
"sportswear", "女用背心": "tank_top",
"gym_uniform", "裁剪短夹克": "cropped jacket ",
"tank_top", "运动胸罩": "black sports bra ",
"cropped jacket", "漏脐装": "crop top",
"black sports bra", "睡衣": "pajamas",
"crop top", "和服": "japanese_clothes",
"pajamas", "衣带和服用": "obi",
"japanese_clothes", "网眼上衣": "mesh",
"obi", "无袖上衣": "sleeveless shirt",
"mesh", "袖肩分离装": "detached_sleeves",
"sleeveless shirt", "白色灯笼裤": "white bloomers",
"detached_sleeves", "高腰腿裤": "high - waist shorts",
"white bloomers", "百褶裙": "pleated_skirt",
"high - waist shorts", "裙子": "skirt",
"pleated_skirt", "迷你裙": "miniskirt",
"skirt", "热裤": "short shorts",
"miniskirt", "夏日长裙": "summer_dress",
"short shorts", "灯笼裤": "bloomers",
"summer_dress", "短裤": "shorts",
"bloomers", "自行车短裤": "bike_shorts",
"shorts", "海豚短裤": "dolphin shorts",
"bike_shorts", "腰带": "belt",
"dolphin shorts", "吊索比基尼": "sling bikini",
"belt", "比基尼乳罩": "bikini_top",
"bikini", "上身比基尼": " bikini top only ",
"sling bikini", "侧边系带比基尼下装": "side - tie bikini bottom",
"bikini_top", "系带式比基尼": "side-tie_bikini",
"bikini top only", "褶边比基尼": "friled bikini",
"side - tie bikini bottom", "比基尼内衣": " bikini under clothes",
"side-tie_bikini", "泳装": "swimsuit",
"friled bikini", "学校泳衣": "school swimsuit",
"bikini under clothes", "连体泳衣": "one-piece swimsuit",
"swimsuit", "竞技泳衣": "competition swimsuit",
"school swimsuit", "死库水": "Sukumizu",
"one-piece swimsuit", "没胸罩": "no bra",
"competition swimsuit", "胸罩": "bra ",
"Sukumizu", "褶边文胸": "frilled bra ",
]; "情趣内衣": "sexy lingerie",
"透明内衣": "transparent underwear",
"缠胸布": "sarashi",
"胸衣": "bustier",
"吊带胸衣": "chemise",
"内衣": "underwear",
"内裤(前加颜色)": "panties",
"条纹内裤": "striped_panties",
"没内裤": "no_panties",
"低腰式内裤": "lowleg_panties/low_leg_panties",
"侧系带内裤": "side-tie_panties",
"高腰内裤": "string_panties",
"丁字裤": "thong",
"日式丁字裤": "fundoshi",
"女用贴身内衣裤": "lingerie"
};
export const BODY_LEG_ORNAMENTS = [ export const BODY_LEG_ORNAMENTS = [
"bare legs", "bare legs",
@ -205,14 +222,38 @@ export const BODY_LEG_ORNAMENTS = [
"latex legwear", "latex legwear",
]; ];
export const BODY_SHOES = [ export const BODY_SHOES = {
"shoes", "鞋子%1": "shoes ",
"boots", "靴子%1": "boots",
"loafers", "乐福鞋%2": "loafers",
"high heels", "高跟鞋%2": "high heels",
"cross-laced_footwear", "系带靴%2": "cross-laced_footwear",
"mary_janes", "玛丽珍鞋%2": "mary_janes",
"uwabaki", "女式学生鞋": "uwabaki",
"slippers", "拖鞋%2": "slippers",
"knee_boots", "马靴": "knee_boots",
]; "连裤袜%4": "pantyhose",
"大腿连裤袜%4": "thighband pantyhose",
"连腰吊带袜": "garter_belt",
"吊带袜%5": "garter straps",
"短袜%4": "socks",
"横条袜": "striped_socks",
"泡泡袜": "loose_socks",
"裹腿": "legwear",
"黑色紧身裤%5": "black leggings ",
"裤袜%4": "leggings ",
"网袜%5": "fishnets",
"渔网袜%5": "fishnet_pantyhose",
"长袜%3": "kneehighs",
"丝袜%3": "stockings",
"过膝袜%5": "thighhighs",
"条纹过膝袜%4": "striped_thighhighs",
"白色过膝袜%5": "white_thighhighs",
"损坏了的过膝袜%5": "torn_thighhighs",
"日式厚底短袜%5": "tabi",
"蕾丝镶边紧身裤%7": "lace-trimmed legwear",
"腿部花边环%4": "leg_garter",
"腿部系带%4": "ankle_lace-up",
"大腿系带%5": "thigh strap",
"短裤下的紧身裤%4": "legwear under shorts"
};

@ -1,92 +1,90 @@
export const FACIAL_FEATURE = [ export const FACIAL_FEATURE = {
"food on face", "食物在脸上(食物可替换)": "food on face",
"light blush", "淡淡腮红%R": "light blush",
"facepaint", "面纹%N": "facepaint",
"makeup", "浓妆%R": "makeup ",
"cute face", "可爱表情%N": "cute face",
"white colored eyelashes", "白色睫毛%SR": "white colored eyelashes",
"longeyelashes", "长睫毛%R": "longeyelashes",
"white eyebrows", "白色眉毛%R": "white eyebrows",
"tsurime", "吊眼角": "tsurime",
"gradient", "渐变眼": "gradient_eyes",
"beautiful detailed eyes", "垂眼角": "tareme",
"tareme", "猫眼%SR": "slit pupils ",
"slit pupils", "异色瞳%SSR": "heterochromia ",
"heterochromia", "红蓝眼%SSR": "heterochromia blue red",
"heterochromia blue red", "水汪汪大眼%SR": "aqua eyes",
"aqua eyes", "看你": "looking at viewer",
"looking at viewer", "盯着看": "eyeball",
"eyeball", "凝视": "stare",
"stare", "透过刘海看": "visible through hair",
"visible through hair", "看旁边": "looking to the side ",
"looking to the side", "收缩的瞳孔": "constricted pupils",
"constricted pupils", "符号形状的瞳孔%SSR": "symbol-shaped pupils ",
"symbol", "❤%SSR": "heart in eye",
"heart in eye", "爱心瞳孔%SSR": "heart-shaped pupils",
"heart", "眨眼%SR": "wink ",
"wink", "眼下痣%R": "mole under eye",
"mole under eye", "闭眼%N": "eyes closed",
"eyes closed", "没鼻子": "no_nose",
"no", "动物耳朵%SR": "animal_ears",
"fake animal ears", "动物耳绒毛%SR": "animal ear fluff ",
"animal ear fluff", "狐狸耳朵%SR": "fox_ears",
"animal", "兔子耳朵%SR": "bunny_ears",
"fox", "猫耳%SR": "cat_ears",
"bunny", "狗耳%SR": "dog_ears",
"cat", "叔耳": "mouse_ears",
"dog", "头发上耳朵": "hair ear",
"mouse", "尖耳": "pointy ears"
"hair ear", };
"pointy ears",
];
export const FACIAL_EXPRESSION = [ export const FACIAL_EXPRESSION = {
"light smile", "微笑%1": "smirk",
"seductive smile", "诱惑笑%5": "seductive smile",
"grin", "露齿而笑%2": "grin",
"laughing", "笑": "laughing",
"teeth", "牙": "teeth ",
"excited", "兴奋%3": "excited",
"embarrassed", "害羞%3": "nose blush ",
"blush", "脸红%4": "blush",
"shy", "无表情%4": "expressionless",
"nose blush", "失神%1": "expressionless eyes",
"expressionless", "困%2": "sleepy",
"expressionless eyes", "喝醉的%4": "drunk",
"sleepy", "哭%3": "crying with eyes open",
"drunk", "悲伤的": "sad",
"tears", "别扭努嘴%4": "pout",
"crying with eyes open", "叹气": "sigh",
"sad", "睁大眼睛%3": "wide eyed",
"pout", "生气%2": "angry",
"sigh", "苦恼的%1": "annoyed",
"wide eyed", "皱眉": "frown",
"angry", "严肃": "serious",
"annoyed", "鄙夷": "jitome",
"frown", "锐利": "scowl",
"smirk", "疯狂的": "crazy",
"serious", "黑化的%5": "dark_persona",
"jitome", "得意": "smug",
"scowl",
"crazy", "一只眼睛闭上%4": "one eye closed",
"dark", "半闭眼睛%3": "half-closed eyes",
"smirk", "鼻血": "nosebleed",
"smug", "做鬼脸%4": "eyelid pull ",
"naughty", "舌头": "tongue",
"one eye closed", "吐舌%4": "tongue out",
"half-closed eyes", "闭嘴": "closed mouth",
"nosebleed", "张嘴": "open mouth",
"eyelid pull", "口红": "lipstick",
"tongue", "尖牙": "fangs",
"tongue out", "咬紧牙关": "clenched teeth",
"closed mouth", "ω猫嘴%4": ":3",
"open mouth", "向下吐舌头%3": ":p",
"lipstick", "向上吐舌头%3": ":q",
"fangs", "不耐烦%2": ":t",
"clenched teeth", "杯型笑脸": ":d",
":3", "下流的表情": "naughty_face",
":p", "忍耐的表情": "endured_face",
":q", "阿黑颜": "ahegao",
":t", "血在脸上": "blood on face",
":d", "唾液": "saliva"
]; };

@ -4,67 +4,48 @@
/** 通用特征 */ /** 通用特征 */
export const GENERAL_PROMPTS = {}; export const GENERAL_PROMPTS = {};
export const STYLE = [ export const STYLE = {
"artbook", "原画": "artbook",
"game_cg", "游戏": "game_cg",
"comic", "漫画": "comic",
"4koma", "四格": "4koma",
"animated_gif gif", "格式图片": "animated_gif",
"dakimakura", "抱枕": "dakimakura",
"cosplay", "角色扮演": "cosplay",
"crossover", "穿越": "crossover",
"dark", "暗的": "dark",
"light", "亮的": "light",
"night",
"guro", "猎奇": "guro",
"realistic", "写实": "realistic",
"photo", "照片": "photo",
"real", "真实": "real",
"landscape", "风景": "landscape/scenery",
"cityscape", "城市风景": "cityscape",
"science_fiction", "科技幻想": "science_fiction",
"original", "原创": "original",
"parody", "拙劣的模仿": "parody",
"personification", "拟人": "personification",
"checkered", "视觉错误": "optical_illusion",
"lowres", "名画模仿": "fine_art_parody",
"highres", "素描": "sketch",
"absurdres", "传统媒体(基本上是手绘稿)": "traditional_media",
"incredibly_absurdres", "透明水彩绘": "watercolor_(medium)",
"huge_filesize", "剪影": "silhouette",
"wallpaper", "封面": "covr",
"pixel_art", "专辑": "album",
"monochrome", "图上有字样": "sample",
"colorful", "背影像": "back",
"optical_illusion", "半身像": "bust",
"fine_art_parody", "侧面绘": "profile",
"sketch", "表情绘(各种表情)": "expressions",
"traditional_media", "一部作品中的主要人物集齐": "everyone",
"watercolor_", "一列列小图组成大图": "column_lineup",
"silhouette", "透明的背景": "transparent_background",
"covr", "简单的背景无背景": "simple_background",
"album", "渐变的背景": "gradient_background",
"sample", "背景是前景的放大版": "zoom_layer"
"back", };
"bust",
"profile",
"expressions",
"everyone",
"column_lineup",
"transparent_background",
"simple_background",
"gradient_background",
"zoom_layer",
"English",
"Chinese",
"French",
"Japanese",
"translation_request",
"bad_id ID",
"tagme",
"artist_request",
"what",
];
export const CHARACTER = [ export const CHARACTER = [
"1girl", "1girl",
@ -93,47 +74,49 @@ export const CHARACTER = [
"harem", "harem",
]; ];
export const ROLE = [ export const ROLE = {
"angel", "女王%SR": "queen",
"cheerleader", "学生%N": "student",
"chibi Q", "医生%R": "doctor",
"crossdressing", "护士%SR": "nurse",
"devil", "警察%R": "police",
"doll", "士兵%R": "soldier",
"elf", "骑士%SR": "knight",
"fairy", "女仆%SSR": "housemaid",
"female", "天使%SR": "angel",
"furry", "啦啦队%SR": "cheerleader",
"orc", "版人物": "chibi",
"giantess", "伪娘%R": "trap",
"harem", "魔鬼%SR": "devil",
"idol", "人偶%R": "doll",
"kemonomimi_mode", "妖精%SR": "elf",
"loli", "小精灵%SR": "fairy",
"magical_girl", "女人%N": "female",
"maid", "兽人%N": "furry",
"male", "半兽人%N": "orc",
"mermaid", "女巨人%N": "giantess",
"miko", "后宫": "harem",
"milf", "偶像%R": "idol",
"minigirl", "兽耳萝莉%SR": "kemonomimi_mode",
"monster",
"multiple_girls", "魔法少女%SSR": "magical_girl",
"ninja", "男人": "male",
"no_humans", "美人鱼%SR": "mermaid",
"nun", "巫女%SR": "miko",
"nurse", "迷你女孩%R": "minigirl",
"shota", "怪物": "monster",
"stewardess", "魔幻少女": "multiple_girls",
"student", "忍者%SR": "ninja",
"trap", "非人": "no_humans",
"vampire", "修女%SR": "nun",
"waitress", "空姐%SR": "stewardess",
"witch", "吸血鬼%SR": "vampire",
"yaoi", "女服务员%R": "waitress",
"yukkuri_shiteitte_ne", "女巫%R": "witch",
"yuri", "搞基": "yaoi",
]; "油库里": "yukkuri_shiteitte_ne",
"百合": "yuri"
};
export const ACTION = [ export const ACTION = [
"head tilt", "head tilt",

@ -0,0 +1,21 @@
import { BODY_BREASTS, BODY_CLOTHING, BODY_LEG_ORNAMENTS, BODY_SHOES } from "./body";
import { FACIAL_EXPRESSION, FACIAL_FEATURE } from "./facial";
import { ROLE, STYLE } from "./general";
import { HAIR_COLOR, HAIR_STYLE } from "./hair";
import { ORNAMENTS } from "./ornament";
/** 全局提示词清单 */
export const GLOBAL_PROMPTS = {
// 抽卡
role: ROLE,
facialFeature: FACIAL_FEATURE,
ornaments: ORNAMENTS,
// 天赋点
hairColor: HAIR_COLOR,
hairStyle: HAIR_STYLE,
facialExpression: FACIAL_EXPRESSION,
bodyBreasts: BODY_BREASTS,
bodyClothing: BODY_CLOTHING,
bodyShoes: BODY_SHOES,
}

@ -11,66 +11,67 @@ export const HAIR_LENGTH = [
]; ];
/** 发色 */ /** 发色 */
export const HAIR_COLOR = [ export const HAIR_COLOR = {
"blonde hair", "白发%1": "white hair",
"brown hair", "金发%4": "blonde hair ",
"black hair", "银发%5": "silver hair",
"blue hair", "灰发%2": "grey hair ",
"purple hair", "紫发%2": "purple hair",
"pink hair", "红发%3": "red hair",
"white hair", "黄发%3": "yellow hair",
"red hair", "绿发%5": "green hair",
"grey hair", "蓝发%3": "blue hair",
"green hair", "黑发%4": "black hair",
"silver hair", "棕发%2": "brown hair",
"orange hair", };
"light brown hair",
"light purple hair",
"light blue hair",
"platinum blonde hair",
"gradient hair",
"multicolored hair",
"shiny hair",
"two",
"streaked hair",
"aqua hair",
"colored inner hair",
"alternate hair color",
"hair up",
"hair down",
"wet hair",
];
/** 发型特征 */ /** 发型特征 */
export const HAIR_STYLE = [ export const HAIR_STYLE = {
"ahoge", "短发%1": "short hair",
"antenna hair", "卷发%2": "curly hair",
"bob cut", "长发%4": "long hair",
"hime_cut", "马尾%3": "pony-tail",
"crossed bangs", "双马尾%5": "bunches",
"hair wings", "挑染": "streaked hair",
"disheveled hair", "灰色渐变%3": "grey gradient hair",
"wavy hair", "亮棕": "light brown hair",
"curly_hair", "双色": "two-tone hair",
"hair in takes", "五颜六色": "multicolored hair",
"forehead", "高马尾": "high ponytail",
"drill hair", "双马尾 ": "twintails",
"hair bun", "马尾编发": "braided ponytail ",
"double", "马尾辫%2": "ponytail",
"straight hair", "短马尾%2": "short_ponytail",
"spiked hair", "双辫子%1": "twin_braids",
"short hair with long locks", "短发 ": "short hair",
"low", "中发": "medium hair",
"asymmetrical hair", "长发 ": "long hair",
"alternate hairstyle", "超长发%5": "very long hair",
"big hair", "辫子刘海%2": "braided bangs",
"hair strand", "侧扫刘海": "swept bangs",
"hair twirling", "眼间头发%3": "hair between eyes",
"pointy hair", "妹妹切%3": "bob cut",
"hair slicked back", "公主切%4": "hime_cut",
"hair pulled back", "交叉刘海%3": "crossed bangs",
"split", "刘海%3": "bangs",
]; "齐刘海": "blunt bangs",
"翼状头发": "hair wings",
"长刘海": "long bangs",
"蓬发": "disheveled hair",
"波浪形头发": "wavy hair",
"卷发 ": "curly_hair",
"收拢": "hair in takes",
"粉色花": "hair pink flowers",
"呆毛%4": "ahoge",
"多根呆毛%4": "antenna hair",
"侧马尾%2": "Side ponytail",
"露额头": "forehead",
"钻头卷公主卷": "drill hair",
"包子头%2": "hair bun",
"俩包子头%3": "double_bun",
"凌乱发型%3": "messy_hair"
};
/** 发辫 */ /** 发辫 */
export const HAIR_BRAID = [ export const HAIR_BRAID = [

@ -1,76 +1,70 @@
export const ORNAMENTS = [ export const ORNAMENTS = {
"halo", "光环%R": "halo",
"mini_top_hat", "迷你礼帽": "mini_top_hat",
"beret", "贝雷帽": "beret",
"hood", "兜帽": "hood",
"nurse cap", "护士帽%SR": "nurse cap",
"tiara", "皇冠%R": "tiara",
"oni horns", "鬼角": "oni horns",
"demon horns", "恶魔角%SSR": "demon horns",
"hair ribbon", "发带%SR": "hair_ribbon",
"flower ribbon", "花丝带": "flower ribbon",
"hairband", "发卡%R": "hairband",
"hairclip", "发夹%R": "hairclip",
"hair_ribbon", "发花": "hair_flower",
"hair_flower", "头饰": "hair_ornament",
"hair_ornament", "蝴蝶结": "bowtie",
"bowtie", "蝴蝶结发饰": "hair_bow",
"hair_bow", "女仆头饰%SSR": "maid_headdress",
"maid_headdress", "服装饰品头部饰品": "bow",
"bow", "发饰": "hair ornament",
"hair ornament", "心形%SR": "heart hair ornament",
"heart hair ornament", "创可贴": "bandaid",
"bandaid hair ornament", "锥形发髻": "cone hair bun",
"hair bun", "双发髻": "double bun",
"cone hair bun", "半无框的眼镜": "semi-rimless eyewear",
"double bun", "太阳镜%SR": "sunglasses",
"semi-rimless eyewear", "风镜": "goggles",
"sunglasses", "眼罩独眼%SSR": "eyepatch",
"goggles", "黑色眼罩": "black blindfold",
"eyepatch", "耳机%N": "headphones",
"black blindfold", "面纱%R": "veil",
"headphones", "口罩%R": "mouth mask",
"veil", "眼镜%R": "glasses",
"mouth mask", "耳环%N": "earrings",
"glasses", "首饰%N": "jewelry",
"earrings", "铃铛%SSR": "bell",
"jewelry", "颈带%N": "ribbon_choker",
"bell", "颈部饰品%N": "black choker ",
"ribbon_choker", "项链%R": "necklace",
"black choker", "耳机套脖子上%SR": "headphones around neck",
"necklace", "项圈%SSR": "collar",
"headphones around neck", "水手领%SR": "sailor_collar",
"collar", "领巾%N": "neckerchief",
"sailor_collar", "领带%N": "necktie",
"neckerchief", "十字架%SR": "cross necklace",
"necktie", "吊坠%N": "pendant",
"cross necklace", "围巾%R": "scarf",
"pendant", "臂章%R": "armband",
"jewelry", "臂环%N": "armlet",
"scarf", "臂带%N": "arm strap",
"armband", "肘部手套%N": "elbow gloves ",
"armlet", "露指手套%N": "half gloves ",
"arm strap", "手镯%R": "bracelet",
"elbow gloves", "手套%R": "gloves",
"half gloves", "五指手套%N": "fingerless gloves",
"fingerless_gloves", "锁链%SSR": "chains",
"gloves", "手链%SSR": "shackles",
"fingerless gloves", "手铐%SSR": "handcuffs",
"chains", "手表%R": "wristwatch",
"shackles", "腕带": "wristband",
"cuffs", "腕饰": "wrist_cuffs",
"handcuffs", "拿着书%R": "holding book",
"bracelet", "拿着剑%SR": "holding sword",
"wristwatch", "球拍%SR": "tennis racket",
"wristband", "手杖%SR": "cane",
"wrist_cuffs", "双肩包": "backpack",
"holding book", "书包%N": "school bag ",
"holding sword", "肩背书包": "satchel",
"tennis racket", "手机%N": "smartphone "
"cane", };
"backpack",
"school bag",
"satchel",
"smartphone",
"bandaid",
];

@ -1,88 +1,237 @@
import { Button, CircularProgress, Divider } from "@mui/material"; import { Button, ButtonGroup, CircularProgress, Divider } from "@mui/material";
import { getLotteryPool } from "../keywords/dict"; import { getLotteryPool } from "../keywords/dict";
import React, { useCallback, useState } from "react"; import React, { useCallback, useState } from "react";
import { GAME_SCENES, Keyword, SceneProps } from "types"; import { FigurePrompts, GAME_SCENES, Keyword, SceneProps } from "types";
// import { OpenAIService } from "service/gpt"; // import { OpenAIService } from "service/gpt";
import { Message } from "./ui"; import { Message } from "./ui";
import { randomSelectNoRepeat } from "utils/random"; import { randomSelectNoRepeat } from "utils/random";
import { getPrompts, initPrompts, mergePrompts } from "utils/prompt"; import { getPrompts, initPrompts, mergePrompts } from "utils/prompt";
import { ROLE } from "prompts/general";
import { FACIAL_EXPRESSION, FACIAL_FEATURE } from "prompts/facial";
import { ORNAMENTS } from "prompts/ornament";
import { HAIR_COLOR, HAIR_STYLE } from "prompts/hair";
import { BODY_BREASTS, BODY_CLOTHING, BODY_LEG_ORNAMENTS, BODY_SHOES } from "prompts/body";
const RARITY_PROPS = {
N: {
color: 'green',
},
R: {
color: 'blue',
},
SR: {
color: 'purple',
},
SSR: {
color: 'gold',
},
}
type LotterySceneProps = { type LotterySceneProps = {
setPrompts: React.Dispatch<React.SetStateAction<string[]>>; setPrompts: React.Dispatch<React.SetStateAction<string[]>>;
} & SceneProps; } & SceneProps;
type ActivePromptToken = { type ActivePromptToken = {
type: string;
label: string;
rarity: 'N' | 'R' | 'SR' | 'SSR'; // 稀有度
prompt: string;
active: boolean; active: boolean;
} & Keyword; };
type ActivePromptSelect = {
label: string;
point: number;
prompt: string;
}
type ActivePromptChoices = {
hairColor?: ActivePromptSelect,
hairStyle?: ActivePromptSelect,
facialExpression?: ActivePromptSelect,
bodyBreasts?: ActivePromptSelect,
bodyClothing?: ActivePromptSelect,
bodyShoes?: ActivePromptSelect,
}
/** 抽奖界面 */ /** 抽奖界面 */
export const LotteryScene = ({ setScene, setPrompts }: LotterySceneProps) => { export const LotteryScene = ({ setScene, setPrompts }: LotterySceneProps) => {
const [activeTokens, setActiveTokens] = useState<ActivePromptToken[]>([]);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const LOTTERY_POOL = getLotteryPool(); const [step, setStep] = useState(1);
const [activeTokens, setActiveTokens] = useState<ActivePromptToken[]>([]);
const [count, setCount] = useState(3);
const [pointPrompts, setPointPrompts] = useState<{[key: string]: any}>({});
const [point, setPoint] = useState(20);
// 十连抽奖池
const LOTTERY_POOL = [
...Object.entries(ROLE).filter(([key]) => key.includes("%")).map(([key, prompt]) => {
const [label, rarity] = key.split('%')
return {
type: 'role',
label: "角色:" + label,
rarity,
prompt,
}
}),
...Object.entries(FACIAL_FEATURE).filter(([key]) => key.includes("%")).map(([key, prompt]) => {
const [label, rarity] = key.split('%')
return {
type: 'facialFeature',
label: "特征:" + label,
rarity,
prompt,
}
}),
...Object.entries(ORNAMENTS).filter(([key]) => key.includes("%")).map(([key, prompt]) => {
const [label, rarity] = key.split('%')
return {
type: 'ornaments',
label: "装饰:" + label,
rarity,
prompt,
}
}),
];
// 天赋点单项
const SinglePointSelector = useCallback((attr: any, option: object) => {
return <ButtonGroup aria-label="outlined primary button group">
{
Object.entries(option).filter(([key]) => key.includes("%")).map(([key, prompt]) => {
const [label, kpoint] = key.split('%');
const opt = {
key,
label,
point: parseInt(kpoint),
prompt
}
return <Button variant={pointPrompts[attr]?.key === key ? "contained" : "outlined"} key={key} disabled={point < opt.point} onClick={() => {
let p = point;
if (pointPrompts[attr]) p += pointPrompts[attr].point;
p -= opt.point;
setPointPrompts({
...pointPrompts,
[attr]: opt,
});
setPoint(p);
}}>{label}{opt.point}</Button>
})
}</ButtonGroup>;
}, [pointPrompts]);
// 转换成prompts
const getPromptsByTokens = useCallback(async () => { const getPromptsByTokens = useCallback(async () => {
// const { getPrompts } = await OpenAIService(); const promptsInit = {} as any;
// const prompts = await getPrompts( Object.entries(pointPrompts).forEach(([attr, value]) => {
// activeTokens.filter((token) => token.active).map((token) => token.value) promptsInit[attr] = value.prompt;
// ); })
let figurePrompts = initPrompts(); let figurePrompts = initPrompts(promptsInit);
activeTokens activeTokens
.filter((token) => token.active) .filter((token) => token.active)
.forEach((token) => { .forEach((token) => {
figurePrompts = mergePrompts(figurePrompts, token.prompts); figurePrompts = mergePrompts(figurePrompts, {
[token.type]: token.prompt,
});
}); });
const prompts = getPrompts(figurePrompts); const prompts = getPrompts(figurePrompts);
console.log(prompts); console.log(prompts);
if (prompts) setPrompts(prompts); if (prompts) setPrompts(prompts);
}, [setPrompts, activeTokens]); }, [setPrompts, activeTokens, pointPrompts]);
return ( return (
<div> <div>
<Button <p>穿</p>
variant="outlined" {step === 1 && <div>
onClick={() => { <p>10</p>
setActiveTokens( <p>{count}</p>
randomSelectNoRepeat(LOTTERY_POOL, 10, (obj) => {
return {
...obj,
active: false,
};
})
);
}}
>
</Button>
<Divider />
{activeTokens.map((token, index) => (
<Button <Button
variant={token.active ? "contained" : "outlined"} variant="outlined"
key={token.value}
onClick={() => { onClick={() => {
const tokens = [...activeTokens]; setActiveTokens(
tokens[index].active = !activeTokens[index].active; randomSelectNoRepeat(LOTTERY_POOL, 10, (obj) => {
setActiveTokens(tokens); return {
...obj,
active: false,
};
})
);
}} }}
> >
{token.value}
</Button> </Button>
))} <Divider />
<Divider /> {activeTokens.map((token, index) => (
<Button <Button
variant={"outlined"} size="small"
onClick={async () => { variant={token.active ? "contained" : "outlined"}
try { style={{
setLoading(true); color: RARITY_PROPS[token.rarity].color
await getPromptsByTokens(); }}
setLoading(false); key={index}
setScene(GAME_SCENES.GENERATE); disabled={!activeTokens[index].active && count <= 0}
} catch (e: any) { onClick={() => {
console.log(e); const tokens = [...activeTokens];
Message.error(e.message); if (activeTokens[index].active) setCount(count + 1);
} else setCount(count - 1);
}} tokens[index].active = !activeTokens[index].active;
> setActiveTokens(tokens);
{loading ? <CircularProgress /> : "开始召唤!"} }}
</Button> >
{token.label}
</Button>
))}
<Divider />
<Button
variant={"outlined"}
onClick={() => {
setStep(2);
}}></Button>
</div>
}
{step === 2 && <div>
<p></p>
<p>{point}</p>
<Divider />
<span></span>{SinglePointSelector('hairColor', HAIR_COLOR)}
<Divider />
<span></span>{SinglePointSelector('hairStyle', HAIR_STYLE)}
<Divider />
<span></span>{SinglePointSelector('bodyBreasts', BODY_BREASTS)}
<Divider />
<span></span>{SinglePointSelector('facialExpression', FACIAL_EXPRESSION)}
<Divider />
<span></span>{SinglePointSelector('bodyClothing', BODY_CLOTHING)}
<Divider />
<span></span>{SinglePointSelector('bodyShoes', BODY_SHOES)}
<Divider />
<Button
variant={"outlined"}
onClick={() => {
setStep(1);
}}
>
</Button>
<Button
variant={"outlined"}
onClick={async () => {
try {
setLoading(true);
await getPromptsByTokens();
setLoading(false);
setScene(GAME_SCENES.GENERATE);
} catch (e: any) {
console.log(e);
Message.error(e.message);
}
}}
>
{loading ? <CircularProgress /> : "开始召唤!"}
</Button>
</div>}
</div> </div>
); );
}; };

@ -28,31 +28,31 @@ export const initPrompts = (p?: FigurePrompts): FigurePrompts => {
const _p: FigurePrompts = { const _p: FigurePrompts = {
base: p?.base || [], base: p?.base || [],
style: p?.style || [], style: p?.style || [],
character: p?.character || randomSelect(CHARACTER), character: p?.character || '1 girl',
role: p?.role || randomSelectNoRepeat(ROLE, 1), role: p?.role,
action: p?.action, action: p?.action,
environmentTime: p?.environmentTime || randomSelect(ENVIRONMENT_TIME), environmentTime: p?.environmentTime || randomSelect(ENVIRONMENT_TIME),
environmentSky: p?.environmentSky || randomSelect(ENVIRONMENT_SKY), environmentSky: p?.environmentSky || randomSelect(ENVIRONMENT_SKY),
environmentLocation: environmentLocation:
p?.environmentLocation || randomSelect(ENVIRONMENT_LOCATION), p?.environmentLocation || randomSelect(ENVIRONMENT_LOCATION),
hairLength: p?.hairLength || randomSelect(HAIR_LENGTH), hairLength: p?.hairLength || randomSelect(HAIR_LENGTH),
hairColor: p?.hairColor || randomSelect(HAIR_COLOR), hairColor: p?.hairColor,
hairStyle: p?.hairStyle || randomSelect(HAIR_STYLE, 0.5), hairStyle: p?.hairStyle,
hairBraid: p?.hairBraid || randomSelect(HAIR_BRAID, 0.8), hairBraid: p?.hairBraid,
hairBangs: p?.hairBangs || randomSelect(HAIR_BANGS, 0.8), hairBangs: p?.hairBangs,
hairOrnament: p?.hairOrnament || randomSelect(HAIR_ORNAMENT, 0.8), hairOrnament: p?.hairOrnament,
eyeColor: p?.eyeColor || randomSelect(EYE_COLOR, 0.5), eyeColor: p?.eyeColor || randomSelect(EYE_COLOR, 0.5),
eyeStyle: p?.eyeStyle || randomSelect(EYE_STYLE, 0.5), eyeStyle: p?.eyeStyle || randomSelect(EYE_STYLE, 0.5),
eyeStatus: p?.eyeStatus || randomSelect(EYE_STATUS, 0.8), eyeStatus: p?.eyeStatus || randomSelect(EYE_STATUS, 0.8),
facialFeature: p?.facialFeature || randomSelect(FACIAL_FEATURE, 0.8), facialFeature: p?.facialFeature,
facialExpression: facialExpression:
p?.facialExpression || randomSelect(FACIAL_EXPRESSION, 0.8), p?.facialExpression,
bodyBreasts: p?.bodyBreasts || randomSelect(BODY_BREASTS, 0.5), bodyBreasts: p?.bodyBreasts,
bodyClothing: p?.bodyClothing || randomSelect(BODY_CLOTHING, 0.5), bodyClothing: p?.bodyClothing,
bodyLegOrnaments: bodyLegOrnaments:
p?.bodyLegOrnaments || randomSelect(BODY_LEG_ORNAMENTS, 0.5), p?.bodyLegOrnaments,
bodyShoes: p?.bodyShoes || randomSelect(BODY_SHOES, 0.5), bodyShoes: p?.bodyShoes,
ornaments: p?.ornaments || randomSelectNoRepeat(ORNAMENTS, 2), ornaments: p?.ornaments,
}; };
return _p; return _p;
}; };

@ -3,6 +3,7 @@ export const randomSelectNoRepeat = (
count: number, count: number,
mapper?: (obj: any) => any mapper?: (obj: any) => any
) => { ) => {
if(arr.length < count) return arr;
const length = arr.length; const length = arr.length;
let availableNum = 0; let availableNum = 0;
let lottery = {} as any; let lottery = {} as any;

Loading…
Cancel
Save