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 = [
"breasts",
"small breasts",
"medium breasts",
"large breasts",
"huge breasts",
"alternate breast size",
"mole on breast",
"between breasts",
"breasts apart",
"hanging breasts",
"bouncing breasts",
];
export const BODY_BREASTS = {
"小%3": "small breast",
"中%1": "medium breast",
"大%5": "big breast"
};
export const BODY_CLOTHING = {
"晚礼服%1": "evening dress",
"短裙%3": "Skirt",
"长裙%3": "Long skirt",
"水手服%5": "sailor suit",
"JK%5": "JK",
"黑色丝袜": "black silk stocking",
"白色丝袜": "white silk stocking",
"西装%3": "suit",
export const BODY_CLOTHING = [
"sailor collar",
"hat",
"shirt",
"serafuku",
"sailor suite",
"sailor shirt",
"shorts under skirt",
"collared shirt",
"school uniform",
"seifuku",
"business_suit",
"jacket",
"suit",
"garreg mach monastery uniform",
"revealing dress",
"pink lucency full dress",
"cleavage dress",
"sleeveless dress",
"whitedress",
"wedding_dress",
"Sailor dress",
"sweater dress",
"ribbed sweater",
"sweater jacket",
"dungarees",
"brown cardigan",
"hoodie",
"robe",
"cape",
"cardigan",
"apron",
"gothic",
"lolita_fashion",
"gothic_lolita",
"western",
"tartan",
"off_shoulder",
"bare_shoulders",
"barefoot",
"bare_legs",
"striped",
"polka_dot",
"frills",
"lace",
"buruma",
"sportswear",
"gym_uniform",
"tank_top",
"cropped jacket",
"black sports bra",
"crop top",
"pajamas",
"japanese_clothes",
"obi",
"mesh",
"sleeveless shirt",
"detached_sleeves",
"white bloomers",
"high - waist shorts",
"pleated_skirt",
"skirt",
"miniskirt",
"short shorts",
"summer_dress",
"bloomers",
"shorts",
"bike_shorts",
"dolphin shorts",
"belt",
"bikini",
"sling bikini",
"bikini_top",
"bikini top only",
"side - tie bikini bottom",
"side-tie_bikini",
"friled bikini",
"bikini under clothes",
"swimsuit",
"school swimsuit",
"one-piece swimsuit",
"competition swimsuit",
"Sukumizu",
];
"湿衣服%5": "wet clothes",
"比基尼%5": "bikini",
"领子%1": "sailor collar",
"帽子%1": "hat",
"衬衫%1": "shirt",
"水手服 ": "shorts under skirt",
"有领衬衣%1": "collared shirt ",
"学校制服": "school uniform",
"日本学生服": "seifuku",
"职场制服%2": "business_suit",
"夹克%2": "jacket",
"火焰纹章军服%3": "garreg mach monastery uniform",
"礼服长裙": "revealing dress",
"礼服": "pink lucency full dress",
"露出胸口部分的连衣裙%4": "cleavage dress",
"无袖连衣裙": "sleeveless dress",
"白色连衣裙": "whitedress",
"婚纱%3": "wedding_dress",
"水手连衣裙": "Sailor dress",
"毛衣裙": "sweater dress",
"罗纹毛衣": "ribbed sweater",
"毛衣夹克": "sweater jacket",
"工装服": "dungarees",
"棕色开襟衫(外套)": "brown cardigan ",
"连帽衫,卫衣%3": "hoodie ",
"长袍%2": "robe",
"斗篷%3": "cape",
"羊毛衫%2": "cardigan",
"围裙": "apron",
"哥特风格%4": "gothic",
"洛丽塔风格%4": "lolita_fashion",
"哥特洛丽塔风格%4": "gothic_lolita",
"西部风格": "western",
"格子花纹": "tartan",
"露单肩": "off_shoulder",
"露双肩": "bare_shoulders",
"赤脚": "barefoot",
"裸足": "bare_legs",
"横条花纹的": "striped",
"点状花纹的": "polka_dot",
"皱边的": "frills",
"花边": "lace",
"日本女生运动短裤": "buruma",
"运动服": "gym_uniform",
"女用背心": "tank_top",
"裁剪短夹克": "cropped jacket ",
"运动胸罩": "black sports bra ",
"漏脐装": "crop top",
"睡衣": "pajamas",
"和服": "japanese_clothes",
"衣带和服用": "obi",
"网眼上衣": "mesh",
"无袖上衣": "sleeveless shirt",
"袖肩分离装": "detached_sleeves",
"白色灯笼裤": "white bloomers",
"高腰腿裤": "high - waist shorts",
"百褶裙": "pleated_skirt",
"裙子": "skirt",
"迷你裙": "miniskirt",
"热裤": "short shorts",
"夏日长裙": "summer_dress",
"灯笼裤": "bloomers",
"短裤": "shorts",
"自行车短裤": "bike_shorts",
"海豚短裤": "dolphin shorts",
"腰带": "belt",
"吊索比基尼": "sling bikini",
"比基尼乳罩": "bikini_top",
"上身比基尼": " bikini top only ",
"侧边系带比基尼下装": "side - tie bikini bottom",
"系带式比基尼": "side-tie_bikini",
"褶边比基尼": "friled bikini",
"比基尼内衣": " bikini under clothes",
"泳装": "swimsuit",
"学校泳衣": "school swimsuit",
"连体泳衣": "one-piece swimsuit",
"竞技泳衣": "competition swimsuit",
"死库水": "Sukumizu",
"没胸罩": "no bra",
"胸罩": "bra ",
"褶边文胸": "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 = [
"bare legs",
@ -205,14 +222,38 @@ export const BODY_LEG_ORNAMENTS = [
"latex legwear",
];
export const BODY_SHOES = [
"shoes",
"boots",
"loafers",
"high heels",
"cross-laced_footwear",
"mary_janes",
"uwabaki",
"slippers",
"knee_boots",
];
export const BODY_SHOES = {
"鞋子%1": "shoes ",
"靴子%1": "boots",
"乐福鞋%2": "loafers",
"高跟鞋%2": "high heels",
"系带靴%2": "cross-laced_footwear",
"玛丽珍鞋%2": "mary_janes",
"女式学生鞋": "uwabaki",
"拖鞋%2": "slippers",
"马靴": "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 = [
"food on face",
"light blush",
"facepaint",
"makeup",
"cute face",
"white colored eyelashes",
"longeyelashes",
"white eyebrows",
"tsurime",
"gradient",
"beautiful detailed eyes",
"tareme",
"slit pupils",
"heterochromia",
"heterochromia blue red",
"aqua eyes",
"looking at viewer",
"eyeball",
"stare",
"visible through hair",
"looking to the side",
"constricted pupils",
"symbol",
"heart in eye",
"heart",
"wink",
"mole under eye",
"eyes closed",
"no",
"fake animal ears",
"animal ear fluff",
"animal",
"fox",
"bunny",
"cat",
"dog",
"mouse",
"hair ear",
"pointy ears",
];
export const FACIAL_FEATURE = {
"食物在脸上(食物可替换)": "food on face",
"淡淡腮红%R": "light blush",
"面纹%N": "facepaint",
"浓妆%R": "makeup ",
"可爱表情%N": "cute face",
"白色睫毛%SR": "white colored eyelashes",
"长睫毛%R": "longeyelashes",
"白色眉毛%R": "white eyebrows",
"吊眼角": "tsurime",
"渐变眼": "gradient_eyes",
"垂眼角": "tareme",
"猫眼%SR": "slit pupils ",
"异色瞳%SSR": "heterochromia ",
"红蓝眼%SSR": "heterochromia blue red",
"水汪汪大眼%SR": "aqua eyes",
"看你": "looking at viewer",
"盯着看": "eyeball",
"凝视": "stare",
"透过刘海看": "visible through hair",
"看旁边": "looking to the side ",
"收缩的瞳孔": "constricted pupils",
"符号形状的瞳孔%SSR": "symbol-shaped pupils ",
"❤%SSR": "heart in eye",
"爱心瞳孔%SSR": "heart-shaped pupils",
"眨眼%SR": "wink ",
"眼下痣%R": "mole under eye",
"闭眼%N": "eyes closed",
"没鼻子": "no_nose",
"动物耳朵%SR": "animal_ears",
"动物耳绒毛%SR": "animal ear fluff ",
"狐狸耳朵%SR": "fox_ears",
"兔子耳朵%SR": "bunny_ears",
"猫耳%SR": "cat_ears",
"狗耳%SR": "dog_ears",
"叔耳": "mouse_ears",
"头发上耳朵": "hair ear",
"尖耳": "pointy ears"
};
export const FACIAL_EXPRESSION = [
"light smile",
"seductive smile",
"grin",
"laughing",
"teeth",
"excited",
"embarrassed",
"blush",
"shy",
"nose blush",
"expressionless",
"expressionless eyes",
"sleepy",
"drunk",
"tears",
"crying with eyes open",
"sad",
"pout",
"sigh",
"wide eyed",
"angry",
"annoyed",
"frown",
"smirk",
"serious",
"jitome",
"scowl",
"crazy",
"dark",
"smirk",
"smug",
"naughty",
"one eye closed",
"half-closed eyes",
"nosebleed",
"eyelid pull",
"tongue",
"tongue out",
"closed mouth",
"open mouth",
"lipstick",
"fangs",
"clenched teeth",
":3",
":p",
":q",
":t",
":d",
];
export const FACIAL_EXPRESSION = {
"微笑%1": "smirk",
"诱惑笑%5": "seductive smile",
"露齿而笑%2": "grin",
"笑": "laughing",
"牙": "teeth ",
"兴奋%3": "excited",
"害羞%3": "nose blush ",
"脸红%4": "blush",
"无表情%4": "expressionless",
"失神%1": "expressionless eyes",
"困%2": "sleepy",
"喝醉的%4": "drunk",
"哭%3": "crying with eyes open",
"悲伤的": "sad",
"别扭努嘴%4": "pout",
"叹气": "sigh",
"睁大眼睛%3": "wide eyed",
"生气%2": "angry",
"苦恼的%1": "annoyed",
"皱眉": "frown",
"严肃": "serious",
"鄙夷": "jitome",
"锐利": "scowl",
"疯狂的": "crazy",
"黑化的%5": "dark_persona",
"得意": "smug",
"一只眼睛闭上%4": "one eye closed",
"半闭眼睛%3": "half-closed eyes",
"鼻血": "nosebleed",
"做鬼脸%4": "eyelid pull ",
"舌头": "tongue",
"吐舌%4": "tongue out",
"闭嘴": "closed mouth",
"张嘴": "open mouth",
"口红": "lipstick",
"尖牙": "fangs",
"咬紧牙关": "clenched teeth",
"ω猫嘴%4": ":3",
"向下吐舌头%3": ":p",
"向上吐舌头%3": ":q",
"不耐烦%2": ":t",
"杯型笑脸": ":d",
"下流的表情": "naughty_face",
"忍耐的表情": "endured_face",
"阿黑颜": "ahegao",
"血在脸上": "blood on face",
"唾液": "saliva"
};

@ -4,67 +4,48 @@
/** 通用特征 */
export const GENERAL_PROMPTS = {};
export const STYLE = [
"artbook",
"game_cg",
"comic",
"4koma",
"animated_gif gif",
"dakimakura",
"cosplay",
"crossover",
"dark",
"light",
"night",
"guro",
"realistic",
"photo",
"real",
"landscape",
"cityscape",
"science_fiction",
"original",
"parody",
"personification",
"checkered",
"lowres",
"highres",
"absurdres",
"incredibly_absurdres",
"huge_filesize",
"wallpaper",
"pixel_art",
"monochrome",
"colorful",
"optical_illusion",
"fine_art_parody",
"sketch",
"traditional_media",
"watercolor_",
"silhouette",
"covr",
"album",
"sample",
"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 STYLE = {
"原画": "artbook",
"游戏": "game_cg",
"漫画": "comic",
"四格": "4koma",
"格式图片": "animated_gif",
"抱枕": "dakimakura",
"角色扮演": "cosplay",
"穿越": "crossover",
"暗的": "dark",
"亮的": "light",
"猎奇": "guro",
"写实": "realistic",
"照片": "photo",
"真实": "real",
"风景": "landscape/scenery",
"城市风景": "cityscape",
"科技幻想": "science_fiction",
"原创": "original",
"拙劣的模仿": "parody",
"拟人": "personification",
"视觉错误": "optical_illusion",
"名画模仿": "fine_art_parody",
"素描": "sketch",
"传统媒体(基本上是手绘稿)": "traditional_media",
"透明水彩绘": "watercolor_(medium)",
"剪影": "silhouette",
"封面": "covr",
"专辑": "album",
"图上有字样": "sample",
"背影像": "back",
"半身像": "bust",
"侧面绘": "profile",
"表情绘(各种表情)": "expressions",
"一部作品中的主要人物集齐": "everyone",
"一列列小图组成大图": "column_lineup",
"透明的背景": "transparent_background",
"简单的背景无背景": "simple_background",
"渐变的背景": "gradient_background",
"背景是前景的放大版": "zoom_layer"
};
export const CHARACTER = [
"1girl",
@ -93,47 +74,49 @@ export const CHARACTER = [
"harem",
];
export const ROLE = [
"angel",
"cheerleader",
"chibi Q",
"crossdressing",
"devil",
"doll",
"elf",
"fairy",
"female",
"furry",
"orc",
"giantess",
"harem",
"idol",
"kemonomimi_mode",
"loli",
"magical_girl",
"maid",
"male",
"mermaid",
"miko",
"milf",
"minigirl",
"monster",
"multiple_girls",
"ninja",
"no_humans",
"nun",
"nurse",
"shota",
"stewardess",
"student",
"trap",
"vampire",
"waitress",
"witch",
"yaoi",
"yukkuri_shiteitte_ne",
"yuri",
];
export const ROLE = {
"女王%SR": "queen",
"学生%N": "student",
"医生%R": "doctor",
"护士%SR": "nurse",
"警察%R": "police",
"士兵%R": "soldier",
"骑士%SR": "knight",
"女仆%SSR": "housemaid",
"天使%SR": "angel",
"啦啦队%SR": "cheerleader",
"版人物": "chibi",
"伪娘%R": "trap",
"魔鬼%SR": "devil",
"人偶%R": "doll",
"妖精%SR": "elf",
"小精灵%SR": "fairy",
"女人%N": "female",
"兽人%N": "furry",
"半兽人%N": "orc",
"女巨人%N": "giantess",
"后宫": "harem",
"偶像%R": "idol",
"兽耳萝莉%SR": "kemonomimi_mode",
"魔法少女%SSR": "magical_girl",
"男人": "male",
"美人鱼%SR": "mermaid",
"巫女%SR": "miko",
"迷你女孩%R": "minigirl",
"怪物": "monster",
"魔幻少女": "multiple_girls",
"忍者%SR": "ninja",
"非人": "no_humans",
"修女%SR": "nun",
"空姐%SR": "stewardess",
"吸血鬼%SR": "vampire",
"女服务员%R": "waitress",
"女巫%R": "witch",
"搞基": "yaoi",
"油库里": "yukkuri_shiteitte_ne",
"百合": "yuri"
};
export const ACTION = [
"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 = [
"blonde hair",
"brown hair",
"black hair",
"blue hair",
"purple hair",
"pink hair",
"white hair",
"red hair",
"grey hair",
"green hair",
"silver 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_COLOR = {
"白发%1": "white hair",
"金发%4": "blonde hair ",
"银发%5": "silver hair",
"灰发%2": "grey hair ",
"紫发%2": "purple hair",
"红发%3": "red hair",
"黄发%3": "yellow hair",
"绿发%5": "green hair",
"蓝发%3": "blue hair",
"黑发%4": "black hair",
"棕发%2": "brown hair",
};
/** 发型特征 */
export const HAIR_STYLE = [
"ahoge",
"antenna hair",
"bob cut",
"hime_cut",
"crossed bangs",
"hair wings",
"disheveled hair",
"wavy hair",
"curly_hair",
"hair in takes",
"forehead",
"drill hair",
"hair bun",
"double",
"straight hair",
"spiked hair",
"short hair with long locks",
"low",
"asymmetrical hair",
"alternate hairstyle",
"big hair",
"hair strand",
"hair twirling",
"pointy hair",
"hair slicked back",
"hair pulled back",
"split",
];
export const HAIR_STYLE = {
"短发%1": "short hair",
"卷发%2": "curly hair",
"长发%4": "long hair",
"马尾%3": "pony-tail",
"双马尾%5": "bunches",
"挑染": "streaked hair",
"灰色渐变%3": "grey gradient hair",
"亮棕": "light brown hair",
"双色": "two-tone hair",
"五颜六色": "multicolored hair",
"高马尾": "high ponytail",
"双马尾 ": "twintails",
"马尾编发": "braided ponytail ",
"马尾辫%2": "ponytail",
"短马尾%2": "short_ponytail",
"双辫子%1": "twin_braids",
"短发 ": "short hair",
"中发": "medium hair",
"长发 ": "long hair",
"超长发%5": "very long hair",
"辫子刘海%2": "braided bangs",
"侧扫刘海": "swept bangs",
"眼间头发%3": "hair between eyes",
"妹妹切%3": "bob cut",
"公主切%4": "hime_cut",
"交叉刘海%3": "crossed bangs",
"刘海%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 = [

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

@ -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 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 { Message } from "./ui";
import { randomSelectNoRepeat } from "utils/random";
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 = {
setPrompts: React.Dispatch<React.SetStateAction<string[]>>;
} & SceneProps;
type ActivePromptToken = {
type: string;
label: string;
rarity: 'N' | 'R' | 'SR' | 'SSR'; // 稀有度
prompt: string;
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) => {
const [activeTokens, setActiveTokens] = useState<ActivePromptToken[]>([]);
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 { getPrompts } = await OpenAIService();
// const prompts = await getPrompts(
// activeTokens.filter((token) => token.active).map((token) => token.value)
// );
let figurePrompts = initPrompts();
const promptsInit = {} as any;
Object.entries(pointPrompts).forEach(([attr, value]) => {
promptsInit[attr] = value.prompt;
})
let figurePrompts = initPrompts(promptsInit);
activeTokens
.filter((token) => token.active)
.forEach((token) => {
figurePrompts = mergePrompts(figurePrompts, token.prompts);
figurePrompts = mergePrompts(figurePrompts, {
[token.type]: token.prompt,
});
});
const prompts = getPrompts(figurePrompts);
console.log(prompts);
if (prompts) setPrompts(prompts);
}, [setPrompts, activeTokens]);
}, [setPrompts, activeTokens, pointPrompts]);
return (
<div>
<Button
variant="outlined"
onClick={() => {
setActiveTokens(
randomSelectNoRepeat(LOTTERY_POOL, 10, (obj) => {
return {
...obj,
active: false,
};
})
);
}}
>
</Button>
<Divider />
{activeTokens.map((token, index) => (
<p>穿</p>
{step === 1 && <div>
<p>10</p>
<p>{count}</p>
<Button
variant={token.active ? "contained" : "outlined"}
key={token.value}
variant="outlined"
onClick={() => {
const tokens = [...activeTokens];
tokens[index].active = !activeTokens[index].active;
setActiveTokens(tokens);
setActiveTokens(
randomSelectNoRepeat(LOTTERY_POOL, 10, (obj) => {
return {
...obj,
active: false,
};
})
);
}}
>
{token.value}
</Button>
))}
<Divider />
<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>
<Divider />
{activeTokens.map((token, index) => (
<Button
size="small"
variant={token.active ? "contained" : "outlined"}
style={{
color: RARITY_PROPS[token.rarity].color
}}
key={index}
disabled={!activeTokens[index].active && count <= 0}
onClick={() => {
const tokens = [...activeTokens];
if (activeTokens[index].active) setCount(count + 1);
else setCount(count - 1);
tokens[index].active = !activeTokens[index].active;
setActiveTokens(tokens);
}}
>
{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>
);
};

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

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

Loading…
Cancel
Save