/// 自定义世界角色主图提示词脚本。 pub(crate) fn build_character_visual_prompt(prompt_text: &str) -> String { build_master_prompt(prompt_text.trim()) } /// 角色主图被供应商内容审核拦截时使用的安全兜底提示词。 /// /// 这里刻意不继续携带角色姓名、作品名和长设定文本,避免把可疑专名原样送回上游导致连续失败。 pub(crate) fn build_fallback_moderation_safe_character_visual_prompt(prompt_text: &str) -> String { let archetype = resolve_original_role_archetype(prompt_text); build_master_prompt( [ format!("角色定位:{}。", archetype), "原创奇幻冒险角色,成年类人骨架,站姿稳定,表情中性,服装为无品牌旅行装、轻甲或职业装备的原创组合。".to_string(), "不参考任何现有动漫、游戏、影视、小说角色,不使用可识别 IP 元素、商标、队徽、作品名、角色名或知名角色标志性发型服装。".to_string(), "所有图案、配色、武器、饰品都采用原创通用设计,只保留横版像素动作角色所需的清晰轮廓和可读职业特征。".to_string(), ] .join("\n") .as_str(), ) } fn resolve_original_role_archetype(source: &str) -> &'static str { if source.contains("法师") || source.contains("魔法") || source.contains("术士") { return "原创法术职业冒险者"; } if source.contains("骑士") || source.contains("守卫") || source.contains("圣骑") { return "原创重装守护者"; } if source.contains("弓") || source.contains("猎人") || source.contains("游侠") { return "原创远程游侠"; } if source.contains("刺客") || source.contains("盗贼") || source.contains("潜行") { return "原创敏捷潜行者"; } if source.contains("剑") || source.contains("战士") || source.contains("武士") { return "原创近战剑士"; } if source.contains("祭司") || source.contains("牧师") || source.contains("治疗") { return "原创支援祭司"; } "原创冒险者" } /// 角色主图统一提示词骨架,迁移自旧共享 qwenSprite 主链。 fn build_master_prompt(character_brief: &str) -> String { [ "单人,2D像素角色形象,头身比必须控制在1.5头身,主体完整可见,底部轮廓完整,身体比例稳定,轮廓清楚,适合后续制作 sprite sheet 动画。".to_string(), "视角要求:角色采用横版动作素材常用的右向斜侧身站姿,身体整体朝右,但保留少量正面信息,能读到面部轮廓与胸肩结构,不是完全 90 度纯右视图,也不是正面立绘。".to_string(), "主体要求:画面中只保留单个角色主体,不要额外人物、动物、召唤物、载具或陪体。".to_string(), "画面要求:1:1 正方形画布,画面中心构图,角色主体完整置于画面中央,不要裁切主体顶部和底部,不要镜头透视,不要特写。背景固定为纯绿色绿幕,只作为抠像底色,不出现建筑、室内布景、风景、地面道具、漂浮物、烟雾叙事元素、文字或其他角色以外的场景内容。".to_string(), "风格要求:横版像素角色,细节精致,设计感足。使用深色清楚轮廓、稳定剪影、有限大色块和硬朗边缘,不要柔和厚涂插画感,发型、服装、配饰优先形成醒目可读的像素级识别点。".to_string(), "如果角色形象设定没有明确要求非人身体结构,默认优先使用人类或类人动作角色骨架。\ 默认将角色形象设定作用在角色自身的服装剪裁、材质、纹样、饰品、发光细节上。".to_string(), "角色形象设定:".to_string(), character_brief.trim().to_string(), ] .into_iter() .filter(|value| !value.trim().is_empty()) .collect::>() .join("\n") } /// 自定义世界角色主图负面提示词脚本。 pub(crate) fn build_character_visual_negative_prompt() -> String { [ "正面视角", "左朝向", "完全 90 度纯右视图", "镜头透视", "半身像", "脚被裁切", "头顶被裁切", "多角色", "复杂背景", "建筑场景", "漂浮物", "烟雾环境", "武器消失", "武器换手", "额外手臂", "额外腿", "服装变化", "脸部变化", "模糊", "运动模糊", "文字", "水印", "UI 元素", "厚涂插画感", "低对比柔边", ] .join(",") }