diff --git a/src/prompts/action.ts b/src/prompts/action.ts new file mode 100644 index 0000000..11bc76f --- /dev/null +++ b/src/prompts/action.ts @@ -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" +} \ No newline at end of file diff --git a/src/prompts/body.ts b/src/prompts/body.ts index b1eb83c..229ff8b 100644 --- a/src/prompts/body.ts +++ b/src/prompts/body.ts @@ -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" +}; diff --git a/src/prompts/facial.ts b/src/prompts/facial.ts index 5227631..00054e6 100644 --- a/src/prompts/facial.ts +++ b/src/prompts/facial.ts @@ -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" +}; diff --git a/src/prompts/general.ts b/src/prompts/general.ts index ebc8aa9..ba74305 100644 --- a/src/prompts/general.ts +++ b/src/prompts/general.ts @@ -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", diff --git a/src/prompts/global.ts b/src/prompts/global.ts new file mode 100644 index 0000000..3657c02 --- /dev/null +++ b/src/prompts/global.ts @@ -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, +} \ No newline at end of file diff --git a/src/prompts/hair.ts b/src/prompts/hair.ts index 58ba2cb..90c84c2 100644 --- a/src/prompts/hair.ts +++ b/src/prompts/hair.ts @@ -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 = [ diff --git a/src/prompts/ornament.ts b/src/prompts/ornament.ts index 694bbc6..2ee3e8c 100644 --- a/src/prompts/ornament.ts +++ b/src/prompts/ornament.ts @@ -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 " +}; diff --git a/src/scene/lottery.tsx b/src/scene/lottery.tsx index e8fe077..7a414f8 100644 --- a/src/scene/lottery.tsx +++ b/src/scene/lottery.tsx @@ -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>; } & 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([]); const [loading, setLoading] = useState(false); - const LOTTERY_POOL = getLotteryPool(); + const [step, setStep] = useState(1); + + const [activeTokens, setActiveTokens] = useState([]); + 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 + { + Object.entries(option).filter(([key]) => key.includes("%")).map(([key, prompt]) => { + const [label, kpoint] = key.split('%'); + const opt = { + key, + label, + point: parseInt(kpoint), + prompt + } + return + }) + }; + }, [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 (
- - - {activeTokens.map((token, index) => ( +

你穿越到了异世界,可以对你的老婆进行私人定制!

+ {step === 1 &&
+

第一阶段:你将抽取10个随机属性,并选取其中三个。

+

当前阶段你还可以选取{count}个属性。

- ))} - - + + {activeTokens.map((token, index) => ( + + ))} + + +
+ } + {step === 2 &&
+

第二阶段:请分配天赋点,不同的词条需要不同数量的天赋点数,请仔细选择。

+

当前阶段你剩余{point}个天赋点。

+ + 发色:{SinglePointSelector('hairColor', HAIR_COLOR)} + + 发型:{SinglePointSelector('hairStyle', HAIR_STYLE)} + + 胸部:{SinglePointSelector('bodyBreasts', BODY_BREASTS)} + + 表情:{SinglePointSelector('facialExpression', FACIAL_EXPRESSION)} + + 服饰:{SinglePointSelector('bodyClothing', BODY_CLOTHING)} + + 腿部:{SinglePointSelector('bodyShoes', BODY_SHOES)} + + + +
} +
); }; diff --git a/src/utils/prompt.ts b/src/utils/prompt.ts index 0d7c5ab..e425afb 100644 --- a/src/utils/prompt.ts +++ b/src/utils/prompt.ts @@ -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; }; diff --git a/src/utils/random.ts b/src/utils/random.ts index 5980097..363e2d1 100644 --- a/src/utils/random.ts +++ b/src/utils/random.ts @@ -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;