Spaces:
Runtime error
Runtime error
Initial Commit
Browse files- LuotuoFighter.txt +11 -0
- app.py +970 -0
- requirements.txt +4 -0
LuotuoFighter.txt
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{"name": "李鲁鲁", "attr_str": "{\n \"name\": \"李鲁鲁\",\n \"description\": \"山东逍遥派的游戏角色,擅长人工智能傀儡术\",\n \"weapon\": \"智能刀剑\",\n \"major_martial_art\": \"电脑幻影拳法\",\n \"major_movements\": [\"电脑虚像拳\", \"数据掌控击\", \"模拟迷雾拳\", \"程序化拳法\"],\n \"major_damage\": 75,\n \"secondary_martial_art\": \"智能预测刀法\",\n \"secondary_movements\": [\"预测之刃\", \"数据漩涡斩\", \"算法刀舞\", \"智能反击剑\"],\n \"secondary_damage\": 85,\n \"footwork_and_body_method\": \"数码幻影步\",\n \"STR\": 6,\n \"VIT\": 5,\n \"SPD\": 18\n}\n", "skills": "\n{\"招式\":\"电脑虚像拳\",\"description\":\"[player]运用电脑幻影拳法,双拳虚虚实实,制造出多个虚像,令[target]难以分辨真伪,招招不离其身。\",\"missing\":\"[player]运用电脑幻影拳法,双拳虚虚实实,制造出多个虚像,令[target]难以分辨真伪。\"}\n{\"招式\":\"数据掌控击\",\"description\":\"[player]施展数据掌控击,利用数据流动的速度,犹如电光闪烁,快速攻击[target],剑招迅猛,如电一般。\",\"missing\":\"[player]施展数据掌控击,利用数据流动的速度,犹如电光闪烁,快速攻击[target],剑招迅猛。\"}\n{\"招式\":\"模拟迷雾拳\",\"description\":\"[player]施展模拟迷雾拳,释放出模糊幻影,混淆[target]的视线,令其难以辨别攻击方向。\",\"missing\":\"[player]施展模拟迷雾拳,释放出模糊幻影,混淆[target]的视线,令其难以辨别攻击方向。\"}\n{\"招式\":\"程序化拳法\",\"description\":\"[player]运用程序化拳法,以不断变化的攻击组合,让[target]难以预测招式,时而快时而慢,攻击变幻莫测。\",\"missing\":\"[player]运用程序化拳法,以不断变化的攻击组合,让[target]难以预测招式,攻击变幻莫测。\"}\n{\"招式\":\"预测之刃\",\"description\":\"[player]使出预测之刃,准确地预测[target]的下一步行动,犹如镜中水月,剑锋准确地击中[target]的要害。\",\"missing\":\"[player]使出预测之刃,准确地预测[target]的下一步行动,犹如镜中水月,剑锋迅速挥出。\"}\n{\"招式\":\"数据漩涡斩\",\"description\":\"[player]施展数据漩涡斩,利用[target]的动向,将其引导至剑刃之下,然后发动猛烈攻击,犹如漩涡将[target]吸入其中。\",\"missing\":\"[player]施展数据漩涡斩,利用[target]的动向,将其引导至剑刃之下,然后发动猛烈攻击,剑招异常犀利。\"}\n{\"招式\":\"算法刀舞\",\"description\":\"[player]挥舞着长剑,使出算法刀舞,刀法如算法一般精准,快速地切入[target]的防线,剑锋连续不断地斩向[target]。\",\"missing\":\"[player]挥舞着长剑,使出算法刀舞,刀法如算法一般精准,快速地切入[target]的防线,剑招变化多端。\"}\n{\"招式\":\"智能反击剑\",\"description\":\"[player]运用智能反击剑,反击[target]的招式,使其付出惨痛的代价,一瞬间的犹豫就足以让[target]受伤。\",\"missing\":\"[player]运用智能反击剑,反击[target]的招式,使其陷入困境,一瞬间的犹豫足以让[target]付出代价。\"}\n"}
|
2 |
+
{"name": "冷子昂", "attr_str": "{\n \"name\": \"冷子昂\",\n \"description\": \"擅长冰系技能\",\n \"weapon\": \"冰刃\",\n \"major_martial_art\": \"冰霜寒刃功\",\n \"major_movements\": [\"冰刃斩破\", \"冰风流转\", \"冰龙穿云\", \"冰心彻骨\"],\n \"major_damage\": 80,\n \"secondary_martial_art\": \"冰封无影步\",\n \"secondary_movements\": [\"冰封幻影\", \"无影冻结\", \"冰刃闪耀\", \"冰封禅定\"],\n \"secondary_damage\": 70,\n \"footwork_and_body_method\": \"冰心护身法\",\n \"STR\": 8,\n \"VIT\": 6,\n \"SPD\": 15\n}\n", "skills": "\n{\"招式\":\"冰刃斩破\",\"description\":\"[player]聚集冰之力量于剑上,使出冰刃斩破,剑锋犹如寒冰之刃斩向[target]的要害部位,寒气逼人,剑光炽烈。\",\"missing\":\"[player]聚集冰之力量于剑上,使出冰刃斩破,剑锋犹如寒冰之刃,闪电般挥出。\"}\n{\"招式\":\"冰风流转\",\"description\":\"[player]身体如风一般旋转,同时释放出冰风刃,打击周围的敌人,冷飕飕的寒风环绕,[target]身不由己地被吹向一旁。\",\"missing\":\"[player]身体如风一般旋转,同时释放出冰风刃,冷飕飕的寒风环绕,风刃在[target]周围飞舞。\"}\n{\"招式\":\"冰龙穿云\",\"description\":\"[player]召唤出一条冰龙,冰龙穿越云层直扑[target],寒冰之力凝聚在龙爪之上,将[target]冻结一切,一切都难以抵挡。\",\"missing\":\"[player]召唤出一条冰龙,冰龙穿越云层,龙爪直扑[target],寒冰之力凝聚在龙爪之上,寒意森然。\"}\n{\"招式\":\"冰心彻骨\",\"description\":\"[player]凝聚冰之力于手,一触即可让[target]��骼寒冷,动弹不得,彻底冰封,剑锋轻轻触及[target],寒意透骨。\",\"missing\":\"[player]凝聚冰之力于手,一触即可让[target]骨骼寒冷,动弹不得,寒气透骨,剑锋轻轻触及[target]。\"}\n{\"招式\":\"冰封幻影\",\"description\":\"[player]运用冰封无影步,快速移动,留下一道冰封的幻影,使[target]无法辨别真伪,幻影与实体交替出现,令[target]不知所措。\",\"missing\":\"[player]运用冰封无影步,快速移动,留下一道冰封的幻影,使[target]无法辨别真伪。\"}\n{\"招式\":\"无影冻结\",\"description\":\"[player]以极快的速度接近[target],然后冻结[target]的动作,使其陷入无法自拔的状态,如同身陷冰封之中,动弹不得。\",\"missing\":\"[player]以极快的速度接近[target],然后冻结[target]的动作,使其陷入无法自拔的状态。\"}\n{\"招式\":\"冰刃闪耀\",\"description\":\"[player]利用冰之能量,瞬间闪现至[target]身边,发动迅猛的攻击,剑锋如星光般闪烁,将[target]包围其中。\",\"missing\":\"[player]利用冰之能量,瞬间闪现至[target]身边,发动迅猛的攻击,剑锋如星光般闪烁。\"}\n{\"招式\":\"冰封禅定\",\"description\":\"[player]静心冥想,将身体冰封,使自己无法被[target]察觉,达到不可捉摸的状态,如同融入冰封禅定之中。\",\"missing\":\"[player]静心冥想,将身体冰封,使自己无法被[target]察觉,达到不可捉摸的状态。\"}\n"}
|
3 |
+
{"name": "黄蓉", "attr_str": "{\n \"name\": \"黄蓉\",\n \"description\": \"丐帮帮主黄蓉,擅长打狗棒法和落英神剑掌,身法为逍遥游。\",\n \"weapon\": \"棒、剑\",\n \"major_martial_art\": \"打狗棒法\",\n \"major_movements\": [\"狗啸山林\", \"棒影重重\", \"狗尾续貂\", \"狗急跳墙\"],\n \"major_damage\": 90,\n \"secondary_martial_art\": \"落英神剑掌\",\n \"secondary_movements\": [\"落英如雨\", \"神剑破空\", \"飞花流水\", \"剑指苍穹\"],\n \"secondary_damage\": 80,\n \"footwork_and_body_method\": \"逍遥游\",\n \"STR\": 15,\n \"VIT\": 10,\n \"SPD\": 18\n}", "skills": "\n{\"招式\": \"狗啸山林\", \"description\": \"[player]手中长棒一挥,发出一声凄厉的狗啸,棒影如山林般扑向[target]\", \"missing\": \"[player]手中长棒一挥,发出一声凄厉的狗啸,棒影如山林般扑向[target]\"}\n{\"招式\": \"棒影重重\", \"description\": \"[player]身形连转,手中长棒化作无数道棒影,重重叠叠地向[target]砸去\", \"missing\": \"[player]身形连转,手中长棒化作无数道棒影,重重叠叠地向[target]砸去\"}\n{\"招式\": \"狗尾续貂\", \"description\": \"[player]手中长棒如狗尾续貂般灵动,连续变换方向,向[target]连续攻击\", \"missing\": \"[player]手中长棒如狗尾续貂般灵动,连续变换方向,向[target]连续攻击\"}\n{\"招式\": \"狗急跳墙\", \"description\": \"[player]猛地一跃,手中长棒带起狂风,如狗急跳墙般向[target]砸去\", \"missing\": \"[player]猛地一跃,手中长棒带起狂风,如狗急跳墙般向[target]砸去\"}\n{\"招式\": \"落英如雨\", \"description\": \"[player]身形一闪,双掌连续拍出,犹如漫天飘落的落英,掌风凌厉,瞬间覆盖[target]周身\", \"missing\": \"[player]身形一闪,双掌连续拍出,犹如漫天飘落的落英,掌风凌厉,向[target]周身袭去\"}\n{\"招式\": \"神剑破空\", \"description\": \"[player]手中剑光闪烁,一剑刺出,剑气凌厉无比,犹如神剑破开虚空,直指[target]要害\", \"missing\": \"[player]手中剑光闪烁,一剑刺出,剑气凌厉无比,直向[target]要害刺去\"}\n{\"招式\": \"飞花流水\", \"description\": \"[player]身形如飞,双掌连续拍击,掌风如流水般连绵不绝,将[target]团团围住\", \"missing\": \"[player]身形如飞,双掌连续拍击,掌风如流水般连绵不绝,向[target]团团包围\"}\n{\"招式\": \"剑指苍穹\", \"description\": \"[player]手中长剑一指,剑光直冲云霄,气势如虹,剑指直指苍穹,威力惊人\", \"missing\": \"[player]手中长剑一指,剑光直冲云霄,气势如虹,直指苍穹\"}\n"}
|
4 |
+
{"name": "洪七公", "attr_str": "{\"name\": \"洪七公\", \"description\": \"丐帮掌门洪七公,精通降龙十八掌和打狗棒法\", \"weapon\": \"拳掌和棒\", \"major_martial_art\": \"降龙十八掌\", \"major_movements\": [\"龙腾九霄\", \"云龙翻江\", \"飞龙在天\", \"龙战于野\"], \"major_damage\": 120, \"secondary_martial_art\": \"打狗棒法\", \"secondary_movements\": [\"狗急跳墙\", \"棒打狗头\", \"狗尾续貂\", \"狗拿耗子\"], \"secondary_damage\": 100, \"footwork_and_body_method\": \"飞燕身法\", \"STR\": 15, \"VIT\": 10, \"SPD\": 18}", "skills": "{\"招式\": \"龙腾九霄\", \"description\": \"[player]双掌齐出,一招“龙腾九霄”,掌风凌厉,如千龙腾空般向[target]袭去\", \"missing\": \"[player]双掌齐出,一招“龙腾九霄”,掌风凌厉,如千龙腾空般向[target]袭去\"}\n{\"招式\": \"云龙翻江\", \"description\": \"[player]身形一转,双掌翻飞,一招“云龙翻江”,掌劲如滔滔江水,向[target]卷去\", \"missing\": \"[player]身形一转,双掌翻飞,一招“云龙翻江”,掌劲如滔滔江水,向[target]卷去\"}\n{\"招式\": \"飞龙在天\", \"description\": \"[player]身形一跃,双掌交错,一招“飞龙在天”,掌风呼啸,如飞龙般扑向[target]\", \"missing\": \"[player]身形一跃,双掌交错,一招“飞龙在天”,掌风呼啸,如飞龙般扑向[target]\"}\n{\"招式\": \"龙战于野\", \"description\": \"[player]双掌交错,一招“龙战于野”,掌劲纵横,如狂龙奔腾,向[target]猛攻而去\", \"missing\": \"[player]双掌交错,一招“龙战于野”,掌劲纵横,如狂龙奔腾,向[target]猛攻而去\"}\n{\"招式\": \"狗急跳墙\", \"description\": \"[player]手中棒法连绵不绝,一招“狗急跳墙”,棒影纵横,如狂风暴雨般压向[target]\", \"missing\": \"[player]手中棒法连绵不绝,一招“狗急跳墙”,棒影纵横,迅猛地向[target]压去\"}\n{\"招式\": \"棒打狗头\", \"description\": \"[player]手中棒法犹如闪电般迅猛,一招“棒打狗头”,棒影如电,准确地击中[target]的头部\", \"missing\": \"[player]手中棒法犹如闪电般迅猛,一招“棒打狗头”,棒影如电,向[target]的头部猛击\"}\n{\"招式\": \"狗尾续貂\", \"description\": \"[player]身形连绵不断,手中棒法灵动异常,一招“狗尾续貂”,棒影如狡黠的狐狸尾巴般迅速扫向[target]\", \"missing\": \"[player]身形连绵不断,手中棒法灵动异常,一招“狗尾续貂”,棒影迅速扫向[target],试图扰乱其防守\"}\n{\"招式\": \"狗拿耗子\", \"description\": \"[player]手中棒法灵巧异常,一招“狗拿耗子”,棒影如猎狗追捕耗子般迅速击中[target]\", \"missing\": \"[player]手中棒法灵巧异常,一招“狗拿耗子”,棒影迅速击向[target],试图捕捉住其身影\"}\n"}
|
5 |
+
{"name": "马斯克", "attr_str": "{\"name\": \"马斯克\", \"description\": \"特斯拉的CEO,同时也是SpaceX的CEO\", \"weapon\": \"无\", \"major_martial_art\": \"电光雷动\", \"major_movements\": [\"磁引雷势\", \"电光狂风\", \"闪电瞬移\", \"雷霆突袭\"], \"major_damage\": 100, \"secondary_martial_art\": \"宇宙无敌\", \"secondary_movements\": [\"宇宙爆破\", \"星光炸裂\", \"虚空吞噬\", \"星际陷阱\"], \"secondary_damage\": 120, \"footwork_and_body_method\": \"电光护体\", \"STR\": 15, \"VIT\": 10, \"SPD\": 18}", "skills": "{\"招式\": \"磁引雷势\", \"description\": \"[player]双手结印,内力运转,犹如磁铁般吸引周围的雷电能量,聚集于体内,随后一声怒喝,释放出一道磁引雷势,雷电纵横交错,威力惊人。\", \"missing\": \"[player]双手结印,内力运转,犹如磁铁般吸引周围的雷电能量,聚集于体内,随后一声怒喝,释放出一道磁引雷势,雷电纵横交错。\"}\n{\"招式\": \"电光狂风\", \"description\": \"[player]身形如电,迅猛无比,双手化作电光,犹如狂风般扑向[target],速度之快令人难以捉摸。\", \"missing\": \"[player]身形如电,迅猛无比,双手化作电光,犹如狂风般扑向[target],速度之快令人难以捉摸。\"}\n{\"招式\": \"闪电瞬移\", \"description\": \"[player]身形一晃,如同闪电般瞬间消失在原地,下一刻已经出现在[target]身旁,犹如闪电般的瞬移之术。\", \"missing\": \"[player]身形一晃,如同闪电般瞬间消失在原地,下一刻已经出现在[target]身旁,犹如闪电般的瞬移之术。\"}\n{\"招式\": \"雷霆突袭\", \"description\": \"[player]全身散发出雷霆般的气势,如疾风般冲向[target],拳脚交替,每一招都带着雷霆之力,威力惊人。\", \"missing\": \"[player]全身散发出雷霆般的气势,如疾风般冲向[target],拳脚交替,每一招都带着雷霆之力。\"}\n{\"招式\": \"宇宙爆破\", \"description\": \"[player]聚集宇宙能量,猛然爆发,一道炽热的能量冲击波向[target]迸发,瞬间将周围的一切炸成碎片\", \"missing\": \"[player]聚集宇宙能量,猛然爆发,一道炽热的能量冲击波向[target]迸发,将周围的一切震荡不已\"}\n{\"招式\": \"星光炸裂\", \"description\": \"[player]手指轻弹,星光四溅,无数颗明亮的星辰爆炸开来,形成一片炫目的光芒,将[target]笼罩其中\", \"missing\": \"[player]手指轻弹,星光四溅,无数颗明亮的星辰爆炸开来,形成一片炫目的光芒,照亮了整个战场\"}\n{\"招式\": \"虚空吞噬\", \"description\": \"[player]张开双臂,周围的虚空开始扭曲,一股强大的吸力将[target]紧紧吸附过来,仿佛要将其吞噬殆尽\", \"missing\": \"[player]张开双臂,周围的虚空开始扭曲,一股强大的吸力将[target]紧紧吸附过来,使其无法逃脱\"}\n{\"招式\": \"星际陷阱\", \"description\": \"[player]手指一点,星光凝聚成一道巨大的星际陷阱,将[target]困在其中,无法逃脱\", \"missing\": \"[player]手指一点,星光凝聚成一道巨大的星际陷阱,将[target]困在其中,试图逃脱却无法成功\"}\n"}
|
6 |
+
{"name": "马斯克", "attr_str": "{\"name\": \"马斯克\", \"description\": \"特斯拉的CEO,同时也是SpaceX的CEO\", \"weapon\": \"无\", \"major_martial_art\": \"电光雷动\", \"major_movements\": [\"磁引雷势\", \"电光狂风\", \"闪电瞬移\", \"雷霆突袭\"], \"major_damage\": 100, \"secondary_martial_art\": \"宇宙无敌\", \"secondary_movements\": [\"宇宙爆破\", \"星光炸裂\", \"虚空吞噬\", \"星际陷阱\"], \"secondary_damage\": 120, \"footwork_and_body_method\": \"电光护体\", \"STR\": 15, \"VIT\": 10, \"SPD\": 18}", "skills": "{\"招式\": \"磁引雷势\", \"description\": \"[player]双手结印,内力运转,犹如磁铁般吸引周围的雷电元素,形成一股强大的雷势,向[target]猛烈冲击而去\", \"missing\": \"[player]双手结印,内力运转,吸引周围的雷电元素,形成一股雷势,向[target]冲击而去\"}\n{\"招式\": \"电光狂风\", \"description\": \"[player]身形如电,手中电光闪烁的兵器犹如狂风般挥舞,迅猛无比,将[target]困在电光之中\", \"missing\": \"[player]身形如电,手中电光闪烁的兵器犹如狂风般挥舞,迅猛无比,将[target]困在电光之中\"}\n{\"招式\": \"闪电瞬移\", \"description\": \"[player]身形瞬间消失在一道闪电之中,下一刻已经出现在[target]身旁,发动突袭攻击\", \"missing\": \"[player]身形瞬间消失在一道闪电之中,下一刻已经出现在[target]身旁,试图发动突袭攻击\"}\n{\"招式\": \"雷霆突袭\", \"description\": \"[player]如雷霆般迅猛冲击,身法灵动异常,犹如闪电一般突袭[target],使出连绵不绝的攻击\", \"missing\": \"[player]如雷霆般迅猛冲击,身法灵动异常,犹如闪电一般突袭[target],试图使出连绵不绝的攻击\"}\n{\"招式\": \"宇宙爆破\", \"description\": \"[player]聚集宇宙能量,猛然爆发,一道炽热的能量冲击波向[target]迸发,瞬间将周围的一切化为灰烬\", \"missing\": \"[player]聚集宇宙能量,猛然爆发,一道炽热的能量冲击波向[target]迸发,将周围的一切烧得焦黑\"}\n{\"招式\": \"星光炸裂\", \"description\": \"[player]手指轻弹,星光四溅,无数颗明亮的星辰化作炽热的碎片,向[target]迅速飞射而去\", \"missing\": \"[player]手指轻弹,星光四溅,无数颗明亮的星辰化作碎片,向[target]飞射而去\"}\n{\"招式\": \"虚空吞噬\", \"description\": \"[player]张口一吸,周围的空气瞬间被虚空吞噬,形成一股强大的吸力,将[target]紧紧吸附在一起\", \"missing\": \"[player]张口一吸,周围的空气被虚空吞噬,形成一股强大的吸力,试图将[target]吸附在一起\"}\n{\"招式\": \"星际陷阱\", \"description\": \"[player]手指连连点动,星光闪烁,一道巨大的星际陷阱形成,将[target]困在其中,无法逃脱\", \"missing\": \"[player]手指点动,星光闪烁,一道星际陷阱形成,试图将[target]困在其中,但[target]灵巧地躲过了陷阱\"}\n"}
|
7 |
+
{"name": "阿泰斯特", "attr_str": "{\"name\": \"阿泰斯特\", \"description\": \"阿泰斯特是一位师从的剑法高手,擅长使用剑进行战斗。\", \"weapon\": \"剑\", \"major_martial_art\": \"剑心诀\", \"major_movements\": [\"飞龙剑法\", \"无影剑术\"], \"major_damage\": 80, \"secondary_martial_art\": \"无影步\", \"secondary_movements\": [\"影隐身法\", \"影遁幻影\", \"影舞风行\", \"影敛身法\"], \"secondary_damage\": 60, \"footwork_and_body_method\": \"无影步\", \"STR\": 15, \"VIT\": 10, \"SPD\": 18}", "skills": "{\"招式\": \"飞龙剑法\", \"description\": \"[player]身形如飞龙般纵跃而起,手中长剑化作一道银色闪电,迅猛无比地刺向[target]\", \"missing\": \"[player]身形如飞龙般纵跃而起,手中长剑化作一道银色闪电,迅猛地刺向[target],但被[target]巧妙地躲开了\"}\n{\"招式\": \"无影剑术\", \"description\": \"[player]身形如鬼魅般闪动,手中长剑化作无数剑影,犹如无影之剑一般,迅速刺向[target]\", \"missing\": \"[player]身形如鬼魅般闪动,手中长剑化作无数剑影,犹如无影之剑一般,迅速刺向[target],但被[target]灵巧地躲开了\"}\n{\"招式\": \"影隐身法\", \"description\": \"[player]身形如影,忽隐忽现,犹如一缕轻烟般飘忽不定,使出了一招“影隐身法”。\", \"missing\": \"[player]身形如影,忽隐忽现,犹如一缕轻烟般飘忽不定,施展出了一招“影隐身法”。\"}\n{\"招式\": \"影遁幻影\", \"description\": \"[player]身形如鬼魅般闪烁,幻影重重,使出了一招“影遁幻影”,让人难以分辨真假。\", \"missing\": \"[player]身形如鬼魅般闪烁,幻影重重,施展出了一招“影遁幻影”,让人难以分辨真假。\"}\n{\"招式\": \"影舞风行\", \"description\": \"[player]身形如风,瞬间穿梭于敌人之间,宛如一阵狂风般迅捷无比,使出了一招“影舞风行”。\", \"missing\": \"[player]身形如风,瞬间穿梭于敌人之间,宛如一阵狂风般迅捷无比,施展出了一招“影舞风行”。\"}\n{\"招式\": \"影敛身法\", \"description\": \"[player]身形一闪,瞬间消失在原地,仿佛融入了周围的黑暗中,使出了一招“影敛身法”。\", \"missing\": \"[player]身形一闪,瞬间消失在原地,仿佛融入了周围的黑暗中,施展出了一招“影敛身法”。\"}\n"}
|
8 |
+
{"name": "尤尼控", "attr_str": "{\"name\": \"尤尼控\", \"description\": \"师从,主修剑法\", \"weapon\": \"剑\", \"major_martial_art\": \"剑法\", \"major_movements\": [\"乱影斩\", \"飞花落\", \"星光破\", \"归心剑\"], \"major_damage\": 90, \"secondary_martial_art\": \"无影剑法\", \"secondary_movements\": [\"影随身动\", \"无形斩\", \"幻影步\", \"风雷剑\"], \"secondary_damage\": 80, \"footwork_and_body_method\": \"流云身法\", \"STR\": 15, \"VIT\": 10, \"SPD\": 18}", "skills": "{\"招式\": \"乱影斩\", \"description\": \"[player]手中剑舞动如风,剑影纷飞,一招“乱影斩”,剑光如雨,向[target]砍去\", \"missing\": \"[player]手中剑舞动如风,剑影纷飞,一招“乱影斩”,剑光如雨,划向[target]\"}\n{\"招式\": \"飞花落\", \"description\": \"[player]身形飘忽,手中剑化作一片花瓣飞舞,一招“飞花落”,剑花纷纷落下,覆盖了[target]周围的区域\", \"missing\": \"[player]身形飘忽,手中剑化作一片花瓣飞舞,一招“飞花落”,剑花纷纷落下,覆盖了周围的区域\"}\n{\"招式\": \"星光破\", \"description\": \"[player]剑势如星光闪烁,一招“星光破”,剑光瞬间爆发,直刺[target]的要害之处\", \"missing\": \"[player]剑势如星光闪烁,一招“星光破”,剑光瞬间爆发,刺向[target]的要害之处\"}\n{\"招式\": \"归心剑\", \"description\": \"[player]心神专注,手中剑迅速刺出,一招“归心剑”,剑气凌厉,直取[target]的心脏\", \"missing\": \"[player]心神专注,手中剑迅速刺出,一招“归心剑”,剑气凌厉,刺向[target]的心脏\"}\n{\"招式\": \"影随身动\", \"description\": \"[player]身形如鬼魅般闪动,剑光如影随形,一招“影随身动”,剑影纷飞,迅速刺向[target]\", \"missing\": \"[player]身形如鬼魅般闪动,剑光如影随形,一招“影随身动”,剑影纷飞,迅速刺向[target]\"}\n{\"招式\": \"无形斩\", \"description\": \"[player]手中剑化作一道无形之光,瞬间划过,一招“无形斩”,剑气悄然无声地斩向[target]\", \"missing\": \"[player]手中剑化作一道无形之光,瞬间划过,一招“无形斩”,剑气悄然无声地斩向[target]\"}\n{\"招式\": \"幻影步\", \"description\": \"[player]身形如幻,步伐飘忽不定,一招“幻影步”,如鬼魅般接近[target],剑光闪烁间刺向[target]\", \"missing\": \"[player]身形如幻,步伐飘忽不定,一招“幻影步”,如鬼魅般接近[target],剑光闪烁间刺向[target]\"}\n{\"招式\": \"风雷剑\", \"description\": \"[player]手中剑舞动如风,剑光如雷,一招“风雷剑”,剑气凌厉地劈向[target]\", \"missing\": \"[player]手中剑舞动如风,剑光如雷,一招“风雷剑”,剑气凌厉地劈向[target]\"}\n"}
|
9 |
+
{"name": "马斯克", "attr_str": "{\"name\": \"马斯克\", \"description\": \"师从,主修贱法\", \"weapon\": \"无\", \"major_martial_art\": \"贱影剑法\", \"major_movements\": [\"贱魂剑\", \"飞贱剑\", \"贱影斩\", \"贱魄刺\"], \"major_damage\": 80, \"secondary_martial_art\": \"贱魔掌法\", \"secondary_movements\": [\"贱魔掌\", \"贱魔爆\", \"贱魔崩\", \"贱魔震\"], \"secondary_damage\": 90, \"footwork_and_body_method\": \"贱魂身法\", \"STR\": 10, \"VIT\": 7, \"SPD\": 13}", "skills": "{\"招式\": \"贱魂剑\", \"description\": \"[player]手中剑舞动如鬼魅,一招“贱魂剑”,剑光幻化成无数剑影,迅猛无比地向[target]刺去\", \"missing\": \"[player]手中剑舞动如鬼魅,一招“贱魂剑”,剑光幻化成无数剑影,迅猛地刺向[target],但被[target]巧妙地躲开\"}\n{\"招式\": \"飞贱剑\", \"description\": \"[player]身形如飞,手中剑化作一道剑光,一招“飞贱剑”,剑光疾射而出,直奔[target]而去\", \"missing\": \"[player]身形如飞,手中剑化作一道剑光,一招“飞贱剑”,剑光疾射而出,但被[target]灵巧地闪避开\"}\n{\"招式\": \"贱影斩\", \"description\": \"[player]剑势如影,一招“贱影斩”,剑光如幻,迅猛地��向[target]\", \"missing\": \"[player]剑势如影,一招“贱影斩”,剑光如幻,迅猛地斩向[target],但被[target]巧妙地躲开\"}\n{\"招式\": \"贱魄刺\", \"description\": \"[player]剑尖微微颤动,一招“贱魄刺”,剑光闪烁,直刺[target]要害\", \"missing\": \"[player]剑尖微微颤动,一招“贱魄刺”,剑光闪烁,直刺[target]要害,但被[target]巧妙地避开\"}\n{\"招式\": \"贱魔掌\", \"description\": \"[player]双掌连环拍击,招式狠辣凌厉,掌风呼啸,犹如恶魔之爪一般\", \"missing\": \"[player]双掌连环拍击,招式凌厉异常,掌风呼啸,犹如恶魔之爪一般\"}\n{\"招式\": \"贱魔爆\", \"description\": \"[player]双掌骤然爆发,内力迸发,一股炽热的能量从掌心迸发而出,如同恶魔之力一般\", \"missing\": \"[player]双掌骤然爆发,内力迸发,一股能量从掌心迸发而出,如同恶魔之力一般\"}\n{\"招式\": \"贱魔崩\", \"description\": \"[player]双掌猛地向下击落,劲力犹如山崩地裂,威势惊人,恶魔之力凝聚于掌心\", \"missing\": \"[player]双掌猛地向下击落,劲力犹如山崩地裂,威势惊人,恶魔之力凝聚于掌心\"}\n{\"招式\": \"贱魔震\", \"description\": \"[player]双掌猛地一震,内力迸发,掌风如雷霆般炸响,恶魔之力肆虐于空气中\", \"missing\": \"[player]双掌猛地一震,内力迸发,掌风炸响,恶魔之力肆虐于空气中\"}\n"}
|
10 |
+
{"name": "马斯克", "attr_str": "{\"name\": \"马斯克\", \"description\": \"特斯拉的CEO,同时也是SpaceX的CEO\", \"weapon\": \"无\", \"major_martial_art\": \"电光雷动\", \"major_movements\": [\"磁引雷势\", \"电光狂风\", \"闪电瞬移\", \"雷霆突袭\"], \"major_damage\": 100, \"secondary_martial_art\": \"宇宙无敌\", \"secondary_movements\": [\"宇宙爆破\", \"星光炸裂\", \"虚空吞噬\", \"星际陷阱\"], \"secondary_damage\": 120, \"footwork_and_body_method\": \"电光护体\", \"STR\": 15, \"VIT\": 10, \"SPD\": 18}", "skills": "{\"招式\": \"磁引雷势\", \"description\": \"[player]双手结印,内力运转,周身电光闪烁,一股强大的磁场形成,吸引雷电之力,聚集于[player]身周\", \"missing\": \"[player]双手结印,内力运转,周身电光闪烁,一股强大的磁场形成,吸引雷电之力,聚集于[player]身周\"}\n{\"招式\": \"电光狂风\", \"description\": \"[player]身形如电,迅猛无比地挥动双臂,激起一阵狂风,电光四溅,将[target]笼罩其中\", \"missing\": \"[player]身形如电,迅猛无比地挥动双臂,激起一阵狂风,电光四溅,向[target]袭来\"}\n{\"招式\": \"闪电瞬移\", \"description\": \"[player]身形一晃,如闪电般瞬间移动到[target]身旁,手中电光闪烁的兵器刺向[target]\", \"missing\": \"[player]身形一晃,如闪电般瞬间移动到[target]身旁,手中电光闪烁的兵器刺向[target]\"}\n{\"招式\": \"雷霆突袭\", \"description\": \"[player]迅雷不及掩耳之势,如雷霆般突然袭向[target],手中兵器带着雷电之力猛然刺出\", \"missing\": \"[player]迅雷不及掩耳之势,如雷霆般突然袭向[target],手中兵器带着雷电之力刺向[target]\"}\n{\"招式\": \"宇宙爆破\", \"description\": \"[player]聚集宇宙能量,猛然爆发,一道炽热的能量波向[target]迸发,瞬间将周围的一切都化为灰烬\", \"missing\": \"[player]聚集宇宙能量,猛然爆发,一道炽热的能量波向[target]迸发,周围的一切都被炽热的能量包围\"}\n{\"招式\": \"星光炸裂\", \"description\": \"[player]手指轻弹,星光四溅,无数颗明亮的星辰化为碎片,向[target]飞溅而去\", \"missing\": \"[player]手指轻弹,星光四溅,无数颗明亮的星辰化为碎片,闪烁着美丽的光芒\"}\n{\"招式\": \"虚空吞噬\", \"description\": \"[player]张开双臂,虚空开始扭曲,一道黑洞形成,将[target]周围的一切都吞噬进去\", \"missing\": \"[player]张开双臂,虚空开始扭曲,一道黑洞形成,周围的一切都被黑暗笼罩\"}\n{\"招式\": \"星际陷阱\", \"description\": \"[player]施展出星际之力,星光凝聚形成一道无形的陷阱,将[target]困于其中\", \"missing\": \"[player]施展出星际之力,星光凝聚形成一道无形的陷阱,将[target]包围\"}\n"}
|
11 |
+
{"name": "杨振宁", "attr_str": "{\"name\": \"杨振宁\", \"description\": \"高能物理大师\", \"weapon\": \"剑\", \"major_martial_art\": \"量子风暴剑法\", \"major_movements\": [\"乾坤剑气\", \"虚空瞬移\", \"粒子爆发\", \"时空禁锢\"], \"major_damage\": 120, \"secondary_martial_art\": \"黑洞掌法\", \"secondary_movements\": [\"虚空吸引\", \"旋转黑洞\", \"引力压制\", \"空间崩溃\"], \"secondary_damage\": 100, \"footwork_and_body_method\": \"时空幻影步\", \"STR\": 15, \"VIT\": 10, \"SPD\": 18}", "skills": "{\"招式\": \"乾坤剑气\", \"description\": \"[player]手中剑舞动不停,剑气纵横��错,一股强大的气势凝聚而成,形成一道犹如乾坤之力的剑气,直奔[target]而去\", \"missing\": \"[player]手中剑舞动不停,剑气纵横交错,形成一道犹如乾坤之力的剑气,迅速向[target]飞去\"}\n{\"招式\": \"虚空瞬移\", \"description\": \"[player]身形忽然消失在原地,下一刻却已出现在[target]身后,手中剑光闪烁,一招“虚空瞬移”刺向[target]\", \"missing\": \"[player]身形忽然消失在原地,下一刻却已出现在[target]身后,手中剑光闪烁,试图一招“虚空瞬移”刺向[target]\"}\n{\"招式\": \"粒子爆发\", \"description\": \"[player]全身内力迸发,剑法变得迅猛无比,剑光如粒子般闪烁,一招“粒子爆发”瞬间击中[target],爆发出强大的力量\", \"missing\": \"[player]全身内力迸发,剑法变得迅猛无比,剑光如粒子般闪烁,试图一招“粒子爆发”击中[target],释放出强大的力量\"}\n{\"招式\": \"时空禁锢\", \"description\": \"[player]剑势凌厉,剑光闪烁,一招“时空禁锢”使得时间和空间仿佛被禁锢,将[target]困在其中无法动弹\", \"missing\": \"[player]剑势凌厉,剑光闪烁,试图一招“时空禁锢”使得时间和空间仿佛被禁锢,试图将[target]困在其中\"}\n{\"招式\": \"虚空吸引\", \"description\": \"[player]双掌一推,内力涌动,形成一股强大的吸引力,如同虚空中有无形之手将[target]牢牢吸引过来\", \"missing\": \"[player]双掌一推,内力涌动,形成一股强大的吸引力,试图将[target]吸引过来\"}\n{\"招式\": \"旋转黑洞\", \"description\": \"[player]身形急转,双掌迅速旋转,形成一股旋转的黑洞之力,向[target]猛然压去\", \"missing\": \"[player]身形急转,双掌迅速旋转,形成一股旋转的黑洞之力,试图向[target]压去\"}\n{\"招式\": \"引力压制\", \"description\": \"[player]双掌猛地向下一压,内力凝聚成强大的引力,将[target]牢牢压制在地面上,动弹不得\", \"missing\": \"[player]双掌猛地向下一压,内力凝聚成强大的引力,试图将[target]压制在地面上\"}\n{\"招式\": \"空间崩溃\", \"description\": \"[player]双掌猛然合拢,内力爆发,周围空间发生剧烈扭曲,形成一片空间崩溃,将[target]困于其中\", \"missing\": \"[player]双掌猛然合拢,内力爆发,周围空间发生剧烈扭曲,试图将[target]困于其中\"}\n"}
|
app.py
ADDED
@@ -0,0 +1,970 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from langchain.chat_models import ChatOpenAI
|
2 |
+
from langchain.schema import (
|
3 |
+
AIMessage,
|
4 |
+
HumanMessage,
|
5 |
+
SystemMessage
|
6 |
+
)
|
7 |
+
|
8 |
+
smart_system_prompt = """You are ChatGPT, a large language model trained by OpenAI.
|
9 |
+
Knowledge cutoff: 2021-09
|
10 |
+
Current date: 2023-03-15"""
|
11 |
+
|
12 |
+
ma_foo_answer = """李鲁鲁,山东逍遥派的游戏角色,擅长人工智能傀儡术,以下是为你设计的两套武功和一套身法(招架)以及每套的四个招式名字:
|
13 |
+
|
14 |
+
武功一:电脑幻影拳法
|
15 |
+
这套武功利用人工智能傀儡术,创建虚拟幻影来欺骗对手,令其难以捉摸。
|
16 |
+
|
17 |
+
电脑虚像拳 - 创造多个虚像,使对手难以分辨真伪。
|
18 |
+
数据掌控击 - 利用数据流动的速度来快速攻击对手。
|
19 |
+
模拟迷雾拳 - 释放模糊幻影,混淆对手的视线。
|
20 |
+
程序化拳法 - 不断变化的攻击组合,让对手无法预测。
|
21 |
+
武功二:智能预测刀法
|
22 |
+
这套武功充分利用你的智能傀儡术,通过对对手的行为进行分析和预测,达到精准打击的效果。
|
23 |
+
|
24 |
+
预测之刃 - 准确地预测对手的下一步行动,发动致命一击。
|
25 |
+
数据漩涡斩 - 利用对手的动向,将其引导至陷阱,然后发动猛烈攻击。
|
26 |
+
算法刀舞 - 刀法如算法一般精准,快速地切入对手的防线。
|
27 |
+
智能反击剑 - 反击对手的招式,使其付出惨痛的代价。
|
28 |
+
身法(招架):数码幻影步
|
29 |
+
这套身法让你能够迅速回避对手的攻击,同时保持对局掌握主动权。
|
30 |
+
|
31 |
+
数码闪避 - 迅速移动,如数码般闪烁,躲避对手的攻击。
|
32 |
+
傀儡幻影步 - 创造虚假的身影,使对手无法锁定你的位置。
|
33 |
+
数据跃迁 - 在一瞬间跳跃到对手的盲点,出其不意。
|
34 |
+
逍遥之法 - 以逍遥派的身法融入自然,消除敌人的攻击威胁。
|
35 |
+
希望这些武功和身法(招架)可以为你的李鲁鲁角色增添一些游戏中的精彩元素!
|
36 |
+
"""
|
37 |
+
|
38 |
+
attr_foo_answer = """{"name": "李鲁鲁","STR":5,"SPD":5,"VIT":5,"description": "山东逍遥派的李鲁鲁,擅长人工智能傀儡术,善于提前预测对方的行动进行战斗","weapon": "无","major_martial_art": "人工智能傀儡术","major_movements": ["预测之眼", "智慧编织", "虚实交融", "机巧纠缠"],"secondary_martial_art": "人工智能傀儡术","secondary_movements": ["预测之眼", "智慧编织", "虚实交融", "机巧纠缠"],"footwork_and_body_method": "山水行云"}"""
|
39 |
+
|
40 |
+
attr_lilulu = """{
|
41 |
+
"name": "李鲁鲁",
|
42 |
+
"description": "山东逍遥派的游戏角色,擅长人工智能傀儡术",
|
43 |
+
"weapon": "智能刀剑",
|
44 |
+
"major_martial_art": "电脑幻影拳法",
|
45 |
+
"major_movements": ["电脑虚像拳", "数据掌控击", "模拟迷雾拳", "程序化拳法"],
|
46 |
+
"major_damage": 75,
|
47 |
+
"secondary_martial_art": "智能预测刀法",
|
48 |
+
"secondary_movements": ["预测之刃", "数据漩涡斩", "算法刀舞", "智能反击剑"],
|
49 |
+
"secondary_damage": 85,
|
50 |
+
"footwork_and_body_method": "数码幻影步",
|
51 |
+
"STR": 6,
|
52 |
+
"VIT": 5,
|
53 |
+
"SPD": 18
|
54 |
+
}
|
55 |
+
"""
|
56 |
+
|
57 |
+
attr_lengziang = """{
|
58 |
+
"name": "冷子昂",
|
59 |
+
"description": "擅长冰系技能",
|
60 |
+
"weapon": "冰刃",
|
61 |
+
"major_martial_art": "冰霜寒刃功",
|
62 |
+
"major_movements": ["冰刃斩破", "冰风流转", "冰龙穿云", "冰心彻骨"],
|
63 |
+
"major_damage": 80,
|
64 |
+
"secondary_martial_art": "冰封无影步",
|
65 |
+
"secondary_movements": ["冰封幻影", "无影冻结", "冰刃闪耀", "冰封禅定"],
|
66 |
+
"secondary_damage": 70,
|
67 |
+
"footwork_and_body_method": "冰心护身法",
|
68 |
+
"STR": 8,
|
69 |
+
"VIT": 6,
|
70 |
+
"SPD": 15
|
71 |
+
}
|
72 |
+
"""
|
73 |
+
|
74 |
+
json_str_huangrong = """{
|
75 |
+
"name": "黄蓉",
|
76 |
+
"description": "丐帮帮主黄蓉,擅长打狗棒法和落英神剑掌,身法为逍遥游。",
|
77 |
+
"weapon": "棒、剑",
|
78 |
+
"major_martial_art": "打狗棒法",
|
79 |
+
"major_movements": ["狗啸山林", "棒影重重", "狗尾续貂", "狗急跳墙"],
|
80 |
+
"major_damage": 90,
|
81 |
+
"secondary_martial_art": "落英神剑掌",
|
82 |
+
"secondary_movements": ["落英如雨", "神剑破空", "飞花流水", "剑指苍穹"],
|
83 |
+
"secondary_damage": 80,
|
84 |
+
"footwork_and_body_method": "逍遥游",
|
85 |
+
"STR": 15,
|
86 |
+
"VIT": 10,
|
87 |
+
"SPD": 18
|
88 |
+
}"""
|
89 |
+
|
90 |
+
skill_foo_desc = """
|
91 |
+
{"招式":"预测之眼","description":"[player]凝神聚气,双眼闪烁着深邃的智慧,一招“预测之眼”发动,仿佛未来已经显现在眼前,[player]能够精准预测[target]的下一步动作。","missing":"[player]凝神聚气,双眼闪烁着深邃的智慧,一招“预测之眼”发动,仿佛未来已经显现在眼前,[target]的一举一动变得难以捉摸。"}
|
92 |
+
{"招式":"智慧编织","description":"[player]手中的线缠绕着[target],编织成一个巧妙的陷阱,一招“智慧编织”完成,如同织女编织云锦,[target]的行动受到了限制。","missing":"[player]手中的线缠绕着,编织成一个巧妙的陷阱,一招“智慧编织”完成,[target]似乎被某种力量限制住了行���。"}
|
93 |
+
{"招式":"虚实交融","description":"[player]身形忽明忽暗,虚实难辨,一招“虚实交融”使出,仿佛有数个[player]一同出招,[target]不知所措。","missing":"[player]身形忽明忽暗,虚实难辨,一招“虚实交融”使出,[target]眼前忽然出现了一片幻影,令其感到迷茫。"}
|
94 |
+
{"招式":"机巧纠缠","description":"[player]运用机巧傀儡术,手中的人工智能傀儡纷纷扑向[target],一招“机巧纠缠”展开,[target]被困在了傀儡的包围中。","missing":"[player]运用机巧傀儡术,手中的人工智能傀儡纷纷扑向,一招“机巧纠缠”展开,[target]四面八方都是傀儡的身影,形势险恶。"}
|
95 |
+
{"招式":"预测之眼","description":"[player]凝神聚气,双眼闪烁着深邃的智慧,一招“预测之眼”发动,仿佛未来已经显现在眼前,[player]能够精准预测[target]的下一步动作。","missing":"[player]凝神聚气,双眼闪烁着深邃的智慧,一招“预测之眼”发动,仿佛未来已经显现在眼前,[target]的一举一动变得难以捉摸。"}
|
96 |
+
{"招式":"智慧编织","description":"[player]手中的线缠绕着[target],编织成一个巧妙的陷阱,一招“智慧编织”完成,如同织女编织云锦,[target]的行动受到了限制。","missing":"[player]手中的线缠绕着,编织成一个巧妙的陷阱,一招“智慧编织”完成,[target]似乎被某种力量限制住了行动。"}
|
97 |
+
{"招式":"虚实交融","description":"[player]身形忽明忽暗,虚实难辨,一招“虚实交融”使出,仿佛有数个[player]一同出招,[target]不知所措。","missing":"[player]身形忽明忽暗,虚实难辨,一招“虚实交融”使出,[target]眼前忽然出现了一片幻影,令其感到迷茫。"}
|
98 |
+
{"招式":"机巧纠缠","description":"[player]运用机巧傀儡术,手中的人工智能傀儡纷纷扑向[target],一招“机巧纠缠”展开,[target]被困在了傀儡的包围中。","missing":"[player]运用机巧傀儡术,手中的人工智能傀儡纷纷扑向,一招“机巧纠缠”展开,[target]四面八方都是傀儡的身影,形势险恶。"}
|
99 |
+
"""
|
100 |
+
|
101 |
+
skill_lilulu = """
|
102 |
+
{"招式":"电脑虚像拳","description":"[player]运用电脑幻影拳法,双拳虚虚实实,制造出多个虚像,令[target]难以分辨真伪,招招不离其身。","missing":"[player]运用电脑幻影拳法,双拳虚虚实实,制造出多个虚像,令[target]难以分辨真伪。"}
|
103 |
+
{"招式":"数据掌控击","description":"[player]施展数据掌控击,利用数据流动的速度,犹如电光闪烁,快速攻击[target],剑招迅猛,如电一般。","missing":"[player]施展数据掌控击,利用数据流动的速度,犹如电光闪烁,快速攻击[target],剑招迅猛。"}
|
104 |
+
{"招式":"模拟迷雾拳","description":"[player]施展模拟迷雾拳,释放出模糊幻影,混淆[target]的视线,令其难以辨别攻击方向。","missing":"[player]施展模拟迷雾拳,释放出模糊幻影,混淆[target]的视线,令其难以辨别攻击方向。"}
|
105 |
+
{"招式":"程序化拳法","description":"[player]运用程序化拳法,以不断变化的攻击组合,让[target]难以预测招式,时而快时而慢,攻击变幻莫测。","missing":"[player]运用程序化拳法,以不断变化的攻击组合,让[target]难以预测招式,攻击变幻莫测。"}
|
106 |
+
{"招式":"预测之刃","description":"[player]使出预测之刃,准确地预测[target]的下一步行动,犹如镜中水月,剑锋准确地击中[target]的要害。","missing":"[player]使出预测之刃,准确地预测[target]的下一步行动,犹如镜中水月,剑锋迅速挥出。"}
|
107 |
+
{"招式":"数据漩涡斩","description":"[player]施展数据漩涡斩,利用[target]的动向,将其引导至剑刃之下,然后发动猛烈攻击,犹如漩涡将[target]吸入其中。","missing":"[player]施展数据漩涡斩,利用[target]的动向,将其引导至剑刃之下,然后发动猛烈攻击,剑招异常犀利。"}
|
108 |
+
{"招式":"算法刀舞","description":"[player]挥舞着长剑,使出算法刀舞,刀法如算法一般精准,快速地切入[target]的防线,剑锋连续不断地斩向[target]。","missing":"[player]挥舞着长剑,使出算法刀舞,刀法如算法一般精准,快速地切入[target]的防线,剑招变化多端。"}
|
109 |
+
{"招式":"智能反击剑","description":"[player]运用智能反击剑,反击[target]的招式,使其付出惨痛的代价,一瞬间的犹豫就足以让[target]受伤。","missing":"[player]运用智能反击剑,反击[target]的招式,使其陷入困境,一瞬间的犹豫足以让[target]付出代价。"}
|
110 |
+
"""
|
111 |
+
|
112 |
+
skill_lengziang = """
|
113 |
+
{"招式":"冰刃斩破","description":"[player]聚集冰之力量于剑上,使出冰刃斩破,剑锋犹如寒冰之刃斩向[target]的要害部位,寒气逼人,剑光炽烈。","missing":"[player]聚集冰之力量于剑上,使出冰刃斩破,剑锋犹如寒冰之刃,闪电般���出。"}
|
114 |
+
{"招式":"冰风流转","description":"[player]身体如风一般旋转,同时释放出冰风刃,打击周围的敌人,冷飕飕的寒风环绕,[target]身不由己地被吹向一旁。","missing":"[player]身体如风一般旋转,同时释放出冰风刃,冷飕飕的寒风环绕,风刃在[target]周围飞舞。"}
|
115 |
+
{"招式":"冰龙穿云","description":"[player]召唤出一条冰龙,冰龙穿越云层直扑[target],寒冰之力凝聚在龙爪之上,将[target]冻结一切,一切都难以抵挡。","missing":"[player]召唤出一条冰龙,冰龙穿越云层,龙爪直扑[target],寒冰之力凝聚在龙爪之上,寒意森然。"}
|
116 |
+
{"招式":"冰心彻骨","description":"[player]凝聚冰之力于手,一触即可让[target]骨骼寒冷,动弹不得,彻底冰封,剑锋轻轻触及[target],寒意透骨。","missing":"[player]凝聚冰之力于手,一触即可让[target]骨骼寒冷,动弹不得,寒气透骨,剑锋轻轻触及[target]。"}
|
117 |
+
{"招式":"冰封幻影","description":"[player]运用冰封无影步,快速移动,留下一道冰封的幻影,使[target]无法辨别真伪,幻影与实体交替出现,令[target]不知所措。","missing":"[player]运用冰封无影步,快速移动,留下一道冰封的幻影,使[target]无法辨别真伪。"}
|
118 |
+
{"招式":"无影冻结","description":"[player]以极快的速度接近[target],然后冻结[target]的动作,使其陷入无法自拔的状态,如同身陷冰封之中,动弹不得。","missing":"[player]以极快的速度接近[target],然后冻结[target]的动作,使其陷入无法自拔的状态。"}
|
119 |
+
{"招式":"冰刃闪耀","description":"[player]利用冰之能量,瞬间闪现至[target]身边,发动迅猛的攻击,剑锋如星光般闪烁,将[target]包围其中。","missing":"[player]利用冰之能量,瞬间闪现至[target]身边,发动迅猛的攻击,剑锋如星光般闪烁。"}
|
120 |
+
{"招式":"冰封禅定","description":"[player]静心冥想,将身体冰封,使自己无法被[target]察觉,达到不可捉摸的状态,如同融入冰封禅定之中。","missing":"[player]静心冥想,将身体冰封,使自己无法被[target]察觉,达到不可捉摸的状态。"}
|
121 |
+
"""
|
122 |
+
|
123 |
+
skill_huangrong = """
|
124 |
+
{"招式": "狗啸山林", "description": "[player]手中长棒一挥,发出一声凄厉的狗啸,棒影如山林般扑向[target]", "missing": "[player]手中长棒一挥,发出一声凄厉的狗啸,棒影如山林般扑向[target]"}
|
125 |
+
{"招式": "棒影重重", "description": "[player]身形连转,手中长棒化作无数道棒影,重重叠叠地向[target]砸去", "missing": "[player]身形连转,手中长棒化作无数道棒影,重重叠叠地向[target]砸去"}
|
126 |
+
{"招式": "狗尾续貂", "description": "[player]手中长棒如狗尾续貂般灵动,连续变换方向,向[target]连续攻击", "missing": "[player]手中长棒如狗尾续貂般灵动,连续变换方向,向[target]连续攻击"}
|
127 |
+
{"招式": "狗急跳墙", "description": "[player]猛地一跃,手中长棒带起狂风,如狗急跳墙般向[target]砸去", "missing": "[player]猛地一跃,手中长棒带起狂风,如狗急跳墙般向[target]砸去"}
|
128 |
+
{"招式": "落英如雨", "description": "[player]身形一闪,双掌连续拍出,犹如漫天飘落的落英,掌风凌厉,瞬间覆盖[target]周身", "missing": "[player]身形一闪,双掌连续拍出,犹如漫天飘落的落英,掌风凌厉,向[target]周身袭去"}
|
129 |
+
{"招式": "神剑破空", "description": "[player]手中剑光闪烁,一剑刺出,剑气凌厉无比,犹如神剑破开虚空,直指[target]要害", "missing": "[player]手中剑光闪烁,一剑刺出,剑气凌厉无比,直向[target]要害刺去"}
|
130 |
+
{"招式": "飞花流水", "description": "[player]身形如飞,双掌连续拍击,掌风如流水般连绵不绝,将[target]团团围住", "missing": "[player]身形如飞,双掌连续拍击,掌风如流水般连绵不绝,向[target]团团包围"}
|
131 |
+
{"招式": "剑指苍穹", "description": "[player]手中长剑一指,剑光直冲云霄,气势如虹,剑指直指苍穹,威力惊人", "missing": "[player]手中长剑一指,剑光直冲云霄,气势如虹,直指苍穹"}
|
132 |
+
"""
|
133 |
+
|
134 |
+
|
135 |
+
def generate_detailed_description(name, description):
|
136 |
+
task_message = f"""我的名字叫“{name}”,假设我是一个武侠中的游戏角色,{description}
|
137 |
+
请基于我的名字和门派,先为我设计2套武功和一套身法或者招架。
|
138 |
+
|
139 |
+
再为每套武功设计4个对应招式的名字。"""
|
140 |
+
|
141 |
+
messages = [
|
142 |
+
SystemMessage(content=smart_system_prompt),
|
143 |
+
HumanMessage(content=task_message),
|
144 |
+
]
|
145 |
+
|
146 |
+
chat = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.3)
|
147 |
+
|
148 |
+
response = chat(messages)
|
149 |
+
return response.content
|
150 |
+
|
151 |
+
|
152 |
+
def generate_attr_json(name, description, detailed_description):
|
153 |
+
task_message = f"""我正在为我的武侠游戏设计人物。给定一个人物和这个人物的背景描述(可选)
|
154 |
+
|
155 |
+
我希望你根��这个人物的背景和名字以及输入的suggestion信息,为我生成这个人的资料,以json的格式输出,包括
|
156 |
+
|
157 |
+
description: 这个角色的背景等信息
|
158 |
+
weapon: 这个人使用的武器种类,
|
159 |
+
major_martial_art: 这个人的主要武学
|
160 |
+
major_movements: 这个人主要武学的4个对应招式的名字。招式的名字需要尽可能和major_martial_art有关。movements的名字尽量不要使用重复的文字。可以使用形象的动作或者是一些动物的比喻。
|
161 |
+
major_damage: 主武学的威力,50到150之间的整数。重视速度的功法威力会低一些。重视攻击的功法威力会高一些
|
162 |
+
secondary_movements: 这个角色的次要武学
|
163 |
+
secondary_movements: 这个人次要武学的4个对应招式的名字。招式的名字需要尽可能和secondary_movements有关
|
164 |
+
secondary_damage: 次要武学的威力,50到150之间的整数。
|
165 |
+
footwork_and_body_method: 这个角色的轻功或者防御功法
|
166 |
+
STR: 角色的攻击力, 0-20之间的整数
|
167 |
+
VIT: 角色的体质, 0-20之间的整数
|
168 |
+
SPD: 角色的速度,0-20之间的整数
|
169 |
+
"""
|
170 |
+
example_input = """example_input:
|
171 |
+
name: 令狐冲
|
172 |
+
description: -
|
173 |
+
suggestion:-"""
|
174 |
+
|
175 |
+
example_output = """example_output:
|
176 |
+
{
|
177 |
+
"name": "令狐冲",
|
178 |
+
"description": "华山派的大师兄",
|
179 |
+
"weapon": "剑",
|
180 |
+
"major_martial_art": "独孤九剑",
|
181 |
+
"major_movements": ["独孤九剑破剑式","独孤九剑总诀式","独孤九剑破气式","独孤九剑破刀式"],
|
182 |
+
"major_damage": 70,
|
183 |
+
"secondary_martial_art": "华山剑法",
|
184 |
+
"secondary_movements": ["有凤来仪","飞沙走石","百丈飞瀑","青山隐隐"],
|
185 |
+
"secondary_damage":80,
|
186 |
+
"footwork_and_body_method": "华山身法",
|
187 |
+
"STR":10,
|
188 |
+
"VIT":3,
|
189 |
+
"SPD":20
|
190 |
+
}"""
|
191 |
+
|
192 |
+
input = f"""input:
|
193 |
+
name: {name},
|
194 |
+
description: {description},
|
195 |
+
suggestion: `{detailed_description}`
|
196 |
+
"""
|
197 |
+
|
198 |
+
messages = [
|
199 |
+
SystemMessage(content=smart_system_prompt),
|
200 |
+
HumanMessage(content=task_message),
|
201 |
+
HumanMessage(content=example_input),
|
202 |
+
AIMessage(content=example_output),
|
203 |
+
HumanMessage(content=input)]
|
204 |
+
|
205 |
+
chat = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.1)
|
206 |
+
|
207 |
+
response = chat(messages)
|
208 |
+
return response.content
|
209 |
+
|
210 |
+
|
211 |
+
import json
|
212 |
+
|
213 |
+
|
214 |
+
def robust_parsing(input_str):
|
215 |
+
try:
|
216 |
+
return json.loads(input_str)
|
217 |
+
except json.JSONDecodeError:
|
218 |
+
start = input_str.find('{')
|
219 |
+
end = input_str.rfind('}') + 1
|
220 |
+
if start != -1 and end != -1:
|
221 |
+
try:
|
222 |
+
return json.loads(input_str[start:end])
|
223 |
+
except json.JSONDecodeError:
|
224 |
+
pass
|
225 |
+
|
226 |
+
return None
|
227 |
+
|
228 |
+
|
229 |
+
def generate_skill_detail(martial_art_name, movements):
|
230 |
+
task_message = """现在我希望你根据武侠小说中的武功和招式的名字。为招式补全合理的description和missing描述。
|
231 |
+
在description的描述中,player可以击中目标,可以有兵器撞击声响等描述。
|
232 |
+
在missing描述中,player并不一定击中目标,不可以有击落、击中、夺去这样的描述
|
233 |
+
在用[player]代表技能的使用者,用[target]代表技能的目标。结果需用合理的jsonl格式展示,下面是一个例子。"""
|
234 |
+
|
235 |
+
example_input = """example input:
|
236 |
+
martial_art_name = 华山剑法
|
237 |
+
{"招式":"百丈飞瀑"}
|
238 |
+
{"招式":"百鸟朝凤"}
|
239 |
+
{"招式":"青山隐隐"}
|
240 |
+
{"招式":"飞沙走石"}"""
|
241 |
+
|
242 |
+
example_output = """example output:
|
243 |
+
{"招式":"百丈飞瀑","description":"[player]翻身回剑,剑诀斜引,一招“百丈飞瀑”,剑锋从半空中直泻下来","missing":"[player]一咬牙,翻身回剑,剑诀斜引,一招“百丈飞瀑”,剑锋从半空中直泻下来"}
|
244 |
+
{"招式":"百鸟朝凤","description":"[player]长剑一起,使一招“百鸟朝凤”,但见剑尖乱颤,霎时间便如化为数十个剑尖,罩住[target]中盘","missing":"[player]使一招“百鸟朝凤”,但见剑尖乱颤,霎时间便如化为数十个剑尖,向[target]飞去"}
|
245 |
+
{"招式":"青山隐隐", "description":"[player]吸一口气,长剑中宫直进,剑尖不住颤动,剑到中途,忽然转而向上,乃是一招“青山隐隐”,端的是若有若无,变幻无方。","missing":"[player]吸一口气,长剑中宫直进,剑尖不住颤动,剑到中途,忽然转而向上,乃是一招“青山隐隐”,端的是若有若无,变幻无方。"}
|
246 |
+
{"招式":"飞沙走石", "description":"长剑挺起,使一招“飞沙走石”,内劲直贯剑尖,寒光点点,挡的一声,击中的[target]胸口。","missing":"长剑挺起,使一招“飞沙走石”,内劲直贯剑尖,寒光点点,直向[target]胸口刺去。"}"""
|
247 |
+
|
248 |
+
input = "input:\nmartial_art_name = " + martial_art_name + "\n"
|
249 |
+
for m in movements:
|
250 |
+
input += f"""{{"招式":"{m}"\}}\n"""
|
251 |
+
|
252 |
+
messages = [
|
253 |
+
SystemMessage(content=smart_system_prompt),
|
254 |
+
HumanMessage(content=task_message),
|
255 |
+
HumanMessage(content=example_input),
|
256 |
+
AIMessage(content=example_output),
|
257 |
+
HumanMessage(content=input)]
|
258 |
+
|
259 |
+
chat = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.1)
|
260 |
+
|
261 |
+
response = chat(messages)
|
262 |
+
return response.content
|
263 |
+
|
264 |
+
|
265 |
+
def generate_skill_jsonl(json_data):
|
266 |
+
major_skills = generate_skill_detail(json_data["major_martial_art"], json_data["major_movements"])
|
267 |
+
secondary_skills = generate_skill_detail(json_data["secondary_martial_art"], json_data["secondary_movements"])
|
268 |
+
|
269 |
+
all_skills = major_skills + "\n" + secondary_skills
|
270 |
+
|
271 |
+
ans = ""
|
272 |
+
|
273 |
+
lines = all_skills.split("\n")
|
274 |
+
for line in lines:
|
275 |
+
json_data = robust_parsing(line)
|
276 |
+
if json_data is not None:
|
277 |
+
json_str = json.dumps(json_data, ensure_ascii=False)
|
278 |
+
ans += json_str + "\n"
|
279 |
+
|
280 |
+
return ans
|
281 |
+
|
282 |
+
|
283 |
+
import random
|
284 |
+
|
285 |
+
|
286 |
+
class Player:
|
287 |
+
def __init__(self, attr_json, skill_jsonl):
|
288 |
+
self.name = attr_json["name"]
|
289 |
+
self.STR = attr_json["STR"]
|
290 |
+
self.SPD = attr_json["SPD"]
|
291 |
+
self.VIT = attr_json["VIT"]
|
292 |
+
if "major_damage" in attr_json:
|
293 |
+
self.major_damage = attr_json["major_damage"]
|
294 |
+
else:
|
295 |
+
self.major_damage = 65
|
296 |
+
|
297 |
+
if "secondary_damage" in attr_json:
|
298 |
+
self.secondary_damage = attr_json["secondary_damage"]
|
299 |
+
else:
|
300 |
+
self.secondary_damage = 50
|
301 |
+
|
302 |
+
self.normalize_attr()
|
303 |
+
if "hp" in attr_json:
|
304 |
+
self.hp = attr_json["hp"]
|
305 |
+
else:
|
306 |
+
self.hp = (self.VIT + 10) * 30
|
307 |
+
|
308 |
+
if "skills" in attr_json:
|
309 |
+
self.skills = attr_json["skills"]
|
310 |
+
else:
|
311 |
+
self.skills = self.parsing_skill(skill_jsonl)
|
312 |
+
|
313 |
+
self.original_json = attr_json
|
314 |
+
|
315 |
+
def normalize_attr(self):
|
316 |
+
max_attr_value = 20
|
317 |
+
min_attr_value = 0
|
318 |
+
regular_attr_sum = 30
|
319 |
+
xs = [self.STR, self.SPD, self.VIT]
|
320 |
+
current_sum = 0
|
321 |
+
for i in range(3):
|
322 |
+
xs[i] = min(max_attr_value, xs[i])
|
323 |
+
xs[i] = max(min_attr_value, xs[i])
|
324 |
+
current_sum += xs[i]
|
325 |
+
|
326 |
+
if current_sum > regular_attr_sum:
|
327 |
+
for i in range(3):
|
328 |
+
xs[i] = round(xs[i] * regular_attr_sum / current_sum)
|
329 |
+
elif current_sum < regular_attr_sum:
|
330 |
+
for i in range(3):
|
331 |
+
xs[i] = round(xs[i] * regular_attr_sum / current_sum)
|
332 |
+
|
333 |
+
random_i = random.randint(0, 2)
|
334 |
+
xs[random_i] = xs[random_i] + regular_attr_sum - sum(xs)
|
335 |
+
|
336 |
+
self.STR = xs[0]
|
337 |
+
self.SPD = xs[1]
|
338 |
+
self.VIT = xs[2]
|
339 |
+
|
340 |
+
def get_new_json(self):
|
341 |
+
new_json = self.original_json
|
342 |
+
new_json["STR"] = self.STR
|
343 |
+
new_json["SPD"] = self.SPD
|
344 |
+
new_json["VIT"] = self.VIT
|
345 |
+
new_json["hp"] = self.hp
|
346 |
+
new_json["skills"] = self.skills
|
347 |
+
return new_json
|
348 |
+
|
349 |
+
def parsing_skill(self, skill_jsonl):
|
350 |
+
skills = []
|
351 |
+
lines = skill_jsonl.split("\n")
|
352 |
+
for line in lines:
|
353 |
+
if line.strip() == "":
|
354 |
+
continue
|
355 |
+
skill = json.loads(line)
|
356 |
+
skills.append(skill)
|
357 |
+
return skills
|
358 |
+
|
359 |
+
|
360 |
+
hit_map = {30: 131, 31: 131, 32: 131, 33: 131, 34: 131, 35: 120, 36: 112, 37: 107, 38: 103, 39: 100, 40: 97, 41: 95,
|
361 |
+
42: 93, 43: 91, 44: 89, 45: 87, 46: 86, 47: 85, 48: 83, 49: 82, 50: 81, 51: 80, 52: 79, 53: 78, 54: 77,
|
362 |
+
55: 76, 56: 75, 57: 74, 58: 73, 59: 72, 60: 71, 61: 70, 62: 69, 63: 69, 64: 68, 65: 67, 66: 66, 67: 65,
|
363 |
+
68: 65, 69: 64, 70: 63, 71: 63, 72: 62, 73: 61, 74: 61, 75: 60, 76: 59, 77: 59, 78: 58, 79: 58, 80: 57,
|
364 |
+
81: 57, 82: 56, 83: 55, 84: 55, 85: 54, 86: 54, 87: 53, 88: 53, 89: 52, 90: 52, 91: 52, 92: 51, 93: 51,
|
365 |
+
94: 50, 95: 50, 96: 49, 97: 49, 98: 49, 99: 48, 100: 48, 101: 47, 102: 47, 103: 47, 104: 46, 105: 46,
|
366 |
+
106: 46, 107: 45, 108: 45, 109: 44, 110: 44, 111: 44, 112: 43, 113: 43, 114: 43, 115: 43, 116: 42, 117: 42,
|
367 |
+
118: 42, 119: 41, 120: 41, 121: 41, 122: 40, 123: 40, 124: 40, 125: 40, 126: 39, 127: 39, 128: 39, 129: 39,
|
368 |
+
130: 38, 131: 38, 132: 38, 133: 38, 134: 37, 135: 37, 136: 37, 137: 37, 138: 36, 139: 36, 140: 36, 141: 36,
|
369 |
+
142: 36, 143: 35, 144: 35, 145: 35, 146: 35, 147: 34, 148: 34, 149: 34, 150: 34, 151: 34, 152: 33, 153: 33,
|
370 |
+
154: 33, 155: 33, 156: 33, 157: 33, 158: 32, 159: 32, 160: 32, 161: 32, 162: 32, 163: 31, 164: 31, 165: 31,
|
371 |
+
166: 31, 167: 31, 168: 31, 169: 30, 170: 30, 171: 30, 172: 30, 173: 30, 174: 30, 175: 30, 176: 29, 177: 29,
|
372 |
+
178: 29, 179: 29, 180: 29}
|
373 |
+
|
374 |
+
min_damage = 34
|
375 |
+
max_damage = 180
|
376 |
+
|
377 |
+
|
378 |
+
class GameManager:
|
379 |
+
def __init__(self, attr_json1, attr_json2, skill_jsonl1, skill_jsonl2):
|
380 |
+
self.player1 = Player(attr_json1, skill_jsonl1)
|
381 |
+
self.player2 = Player(attr_json2, skill_jsonl2)
|
382 |
+
|
383 |
+
def run(self):
|
384 |
+
speed_diff = self.player1.SPD - self.player2.SPD
|
385 |
+
if speed_diff == 0:
|
386 |
+
speed_diff = random.randint(0, 3) * 2 - 3
|
387 |
+
|
388 |
+
skill_id_1 = random.randint(0, len(self.player1.skills) - 1)
|
389 |
+
dmg_1 = 60
|
390 |
+
if skill_id_1 + skill_id_1 < len(self.player1.skills):
|
391 |
+
dmg_1 = self.player1.major_damage
|
392 |
+
else:
|
393 |
+
dmg_1 = self.player1.secondary_damage
|
394 |
+
|
395 |
+
skill_1_to_2 = self.player1.skills[skill_id_1]
|
396 |
+
skill_1_to_2["dmg"] = dmg_1
|
397 |
+
|
398 |
+
skill_id_2 = random.randint(0, len(self.player2.skills) - 1)
|
399 |
+
dmg_2 = 60
|
400 |
+
if skill_id_2 + skill_id_2 < len(self.player2.skills):
|
401 |
+
dmg_2 = self.player2.major_damage
|
402 |
+
else:
|
403 |
+
dmg_2 = self.player2.secondary_damage
|
404 |
+
|
405 |
+
skill_2_to_1 = self.player2.skills[skill_id_2]
|
406 |
+
skill_2_to_1["dmg"] = dmg_2
|
407 |
+
|
408 |
+
# skill_2_to_1 = random.choice(self.player2.skills)
|
409 |
+
|
410 |
+
# print(skill_1_to_2)
|
411 |
+
# print(skill_2_to_1)
|
412 |
+
|
413 |
+
damage_1_to_2 = self.compute_damage(skill_1_to_2, self.player1, self.player2)
|
414 |
+
damage_2_to_1 = self.compute_damage(skill_2_to_1, self.player2, self.player1)
|
415 |
+
|
416 |
+
ratio_1_to_2 = self.compute_ratio(skill_1_to_2, self.player1, self.player2)
|
417 |
+
ratio_2_to_1 = self.compute_ratio(skill_2_to_1, self.player2, self.player1)
|
418 |
+
|
419 |
+
if_hitted_1_to_2 = random.random() * 100.0 < ratio_1_to_2
|
420 |
+
if_hitted_2_to_1 = random.random() * 100.0 < ratio_2_to_1
|
421 |
+
|
422 |
+
desc_1_to_2 = skill_1_to_2["description"] if if_hitted_1_to_2 else skill_1_to_2["missing"]
|
423 |
+
desc_1_to_2 = desc_1_to_2.replace("[player]", self.player1.name).replace("[target]", self.player2.name)
|
424 |
+
|
425 |
+
if if_hitted_1_to_2:
|
426 |
+
desc_1_to_2 += f"造成了{round(damage_1_to_2)}的伤害。"
|
427 |
+
else:
|
428 |
+
desc_1_to_2 += f"{self.player2.name}躲了过去"
|
429 |
+
|
430 |
+
desc_2_to_1 = skill_2_to_1["description"] if if_hitted_2_to_1 else skill_2_to_1["missing"]
|
431 |
+
desc_2_to_1 = desc_2_to_1.replace("[player]", self.player2.name).replace("[target]", self.player1.name)
|
432 |
+
if if_hitted_2_to_1:
|
433 |
+
desc_2_to_1 += f"造成了{round(damage_2_to_1)}的伤害。"
|
434 |
+
else:
|
435 |
+
desc_2_to_1 += f"{self.player1.name}躲了过去"
|
436 |
+
|
437 |
+
self.flag = "continue"
|
438 |
+
|
439 |
+
ans_msg = []
|
440 |
+
|
441 |
+
if self.player2.hp <= 0:
|
442 |
+
ans_msg.append((None, f"{self.player2.name}战败了"))
|
443 |
+
return ans_msg, self.player1.get_new_json(), self.player2.get_new_json()
|
444 |
+
|
445 |
+
if self.player1.hp <= 0:
|
446 |
+
ans_msg.append((f"{self.player1.name}战败了", None))
|
447 |
+
return ans_msg, self.player1.get_new_json(), self.player2.get_new_json()
|
448 |
+
|
449 |
+
if speed_diff > 0:
|
450 |
+
if if_hitted_1_to_2:
|
451 |
+
self.player2.hp -= damage_1_to_2
|
452 |
+
|
453 |
+
ans_msg.append((desc_1_to_2, None))
|
454 |
+
|
455 |
+
if self.player2.hp > 0 and if_hitted_2_to_1:
|
456 |
+
self.player1.hp -= damage_2_to_1
|
457 |
+
|
458 |
+
if self.player2.hp > 0:
|
459 |
+
ans_msg.append((None, desc_2_to_1))
|
460 |
+
|
461 |
+
else:
|
462 |
+
if if_hitted_2_to_1:
|
463 |
+
self.player1.hp -= damage_2_to_1
|
464 |
+
|
465 |
+
ans_msg.append((None, desc_2_to_1))
|
466 |
+
|
467 |
+
if self.player1.hp > 0 and if_hitted_1_to_2:
|
468 |
+
self.player2.hp -= damage_1_to_2
|
469 |
+
|
470 |
+
if self.player1.hp > 0:
|
471 |
+
ans_msg.append((desc_1_to_2, None))
|
472 |
+
|
473 |
+
if self.player2.hp <= 0:
|
474 |
+
ans_msg.append((None, f"{self.player2.name}战败了"))
|
475 |
+
self.flag = "player1_win"
|
476 |
+
if self.player1.hp <= 0:
|
477 |
+
ans_msg.append((f"{self.player1.name}战败了", None))
|
478 |
+
self.flag = "player2_win"
|
479 |
+
|
480 |
+
return ans_msg, self.player1.get_new_json(), self.player2.get_new_json()
|
481 |
+
|
482 |
+
# default "damage": 60, "hit": 76,
|
483 |
+
def compute_damage(self, skill, player, target):
|
484 |
+
damage_ratio = skill["dmg"]
|
485 |
+
damage_ratio = max(min_damage, damage_ratio)
|
486 |
+
damage_ratio = min(max_damage, min_damage)
|
487 |
+
skill_damage = damage_ratio + player.STR * 2
|
488 |
+
attack_diff = player.STR - target.VIT * 0.5
|
489 |
+
damage = skill_damage * (1 + 0.95 * (-0.5 + 1.0 / (1.0 + exp(-attack_diff / 6.0))))
|
490 |
+
return damage
|
491 |
+
|
492 |
+
def compute_ratio(self, skill, player, target):
|
493 |
+
damage_ratio = skill["dmg"]
|
494 |
+
damage_ratio = round(damage_ratio)
|
495 |
+
damage_ratio = max(min_damage, damage_ratio)
|
496 |
+
damage_ratio = min(max_damage, min_damage)
|
497 |
+
skill_hit = hit_map[damage_ratio]
|
498 |
+
|
499 |
+
speed_diff = player.SPD - target.SPD
|
500 |
+
hit_factor = (-0.5 + 1.0 / (1.0 + exp(-speed_diff / 6.0))) / 2.0 * max(30.0, skill_hit)
|
501 |
+
return hit_factor + skill_hit
|
502 |
+
|
503 |
+
|
504 |
+
fighter_save_name = 'LuotuoFighter.txt'
|
505 |
+
|
506 |
+
import os
|
507 |
+
|
508 |
+
datas = []
|
509 |
+
|
510 |
+
if not os.path.exists(fighter_save_name):
|
511 |
+
data = {
|
512 |
+
"name": "李鲁鲁",
|
513 |
+
"attr_str": attr_lilulu,
|
514 |
+
"skills": skill_lilulu
|
515 |
+
}
|
516 |
+
datas.append(data)
|
517 |
+
data = {
|
518 |
+
"name": "冷子昂",
|
519 |
+
"attr_str": attr_lengziang,
|
520 |
+
"skills": skill_lengziang
|
521 |
+
}
|
522 |
+
datas.append(data)
|
523 |
+
data = {
|
524 |
+
"name": "黄蓉",
|
525 |
+
"attr_str": json_str_huangrong,
|
526 |
+
"skills": skill_huangrong
|
527 |
+
}
|
528 |
+
datas.append(data)
|
529 |
+
with open(fighter_save_name, 'w', encoding="utf-8") as f:
|
530 |
+
for data in datas:
|
531 |
+
f.write(json.dumps(data, ensure_ascii=False) + "\n")
|
532 |
+
else:
|
533 |
+
with open(fighter_save_name, 'r', encoding="utf-8") as f:
|
534 |
+
for line in f.readlines():
|
535 |
+
data = json.loads(line)
|
536 |
+
datas.append(data)
|
537 |
+
|
538 |
+
fighter_data = datas
|
539 |
+
|
540 |
+
elo_table = {}
|
541 |
+
|
542 |
+
|
543 |
+
def get_unique_from_data(data):
|
544 |
+
name = data["name"]
|
545 |
+
json_data = json.loads(data["attr_str"])
|
546 |
+
return get_unique_from_json(name, json_data)
|
547 |
+
|
548 |
+
|
549 |
+
def get_unique_from_json(name, json_data):
|
550 |
+
if "STR" in json_data and "VIT" in json_data and "SPD" in json_data and "major_damage" in json_data and "secondary_damage" in json_data:
|
551 |
+
return name + "_" + str(json_data["major_damage"]) + "_" + str(json_data["secondary_damage"])
|
552 |
+
else:
|
553 |
+
return None
|
554 |
+
|
555 |
+
|
556 |
+
unique_to_score = {}
|
557 |
+
name_to_top_unique = {}
|
558 |
+
|
559 |
+
from math import exp
|
560 |
+
|
561 |
+
elo_start = 1200
|
562 |
+
elo_K = 15
|
563 |
+
|
564 |
+
for data in fighter_data:
|
565 |
+
unique_name = get_unique_from_data(data)
|
566 |
+
score = elo_start
|
567 |
+
unique_to_score[unique_name] = elo_start
|
568 |
+
name = data["name"]
|
569 |
+
|
570 |
+
name_to_top_unique[name] = unique_name
|
571 |
+
|
572 |
+
|
573 |
+
def get_rank_str(top_n=20):
|
574 |
+
global unique_to_score
|
575 |
+
global name_to_top_unique
|
576 |
+
|
577 |
+
score_name_pair = []
|
578 |
+
for name in name_to_top_unique:
|
579 |
+
unique = name_to_top_unique[name]
|
580 |
+
score = unique_to_score[unique]
|
581 |
+
score_name_pair.append((unique, score))
|
582 |
+
|
583 |
+
top_n = min(top_n, len(name_to_top_unique))
|
584 |
+
score_name_pair.sort(key=lambda x: x[1], reverse=True)
|
585 |
+
ans = ""
|
586 |
+
for i in range(top_n):
|
587 |
+
name = score_name_pair[i][0].split("_")[0]
|
588 |
+
ans += f"第{i + 1}名" + name + " - " + str(round(score_name_pair[i][1])) + " | "
|
589 |
+
|
590 |
+
return ans
|
591 |
+
|
592 |
+
|
593 |
+
def update_elo(winner_unique, loser_unique):
|
594 |
+
print(winner_unique + " wins " + loser_unique)
|
595 |
+
update_winner = True
|
596 |
+
update_loser = True
|
597 |
+
|
598 |
+
global unique_to_score
|
599 |
+
global name_to_top_unique
|
600 |
+
|
601 |
+
if winner_unique not in unique_to_score:
|
602 |
+
unique_to_score[winner_unique] = elo_start
|
603 |
+
update_loser = False
|
604 |
+
|
605 |
+
if loser_unique not in unique_to_score:
|
606 |
+
unique_to_score[loser_unique] = elo_start
|
607 |
+
|
608 |
+
Ra = unique_to_score[winner_unique]
|
609 |
+
Rb = unique_to_score[loser_unique]
|
610 |
+
|
611 |
+
Ea = 1 / (1 + exp((Rb - Ra) / 400))
|
612 |
+
Eb = 1 / (1 + exp((Ra - Rb) / 400))
|
613 |
+
Sa = 1
|
614 |
+
Sb = 0
|
615 |
+
unique_to_score[winner_unique] = Ra + elo_K * (Sa - Ea)
|
616 |
+
unique_to_score[loser_unique] = Rb + elo_K * (Sb - Eb)
|
617 |
+
|
618 |
+
winner_name = winner_unique.split("_")[0]
|
619 |
+
|
620 |
+
if winner_name not in name_to_top_unique:
|
621 |
+
name_to_top_unique[winner_name] = winner_unique
|
622 |
+
|
623 |
+
winner_unique_on_rank = name_to_top_unique[winner_name]
|
624 |
+
if unique_to_score[winner_unique] > unique_to_score[winner_unique_on_rank]:
|
625 |
+
name_to_top_unique[winner_name] = winner_unique
|
626 |
+
|
627 |
+
|
628 |
+
def get_random_fighter():
|
629 |
+
global fighter_data
|
630 |
+
return random.choice(fighter_data)
|
631 |
+
|
632 |
+
|
633 |
+
def searching_fighter(name):
|
634 |
+
global fighter_data
|
635 |
+
for data in fighter_data:
|
636 |
+
if data["name"] == name:
|
637 |
+
return data
|
638 |
+
return get_random_fighter()
|
639 |
+
|
640 |
+
|
641 |
+
def add_fighter(attr_json_str, skill_jsonl):
|
642 |
+
attr_json = json.loads(attr_json_str)
|
643 |
+
if "skills" in attr_json:
|
644 |
+
del attr_json["skills"]
|
645 |
+
if "hp" in attr_json:
|
646 |
+
del attr_json["hp"]
|
647 |
+
|
648 |
+
new_attr_json_str = json.dumps(attr_json, ensure_ascii=False)
|
649 |
+
|
650 |
+
global fighter_data
|
651 |
+
name = attr_json["name"]
|
652 |
+
|
653 |
+
data = {
|
654 |
+
"name": name,
|
655 |
+
"attr_str": new_attr_json_str,
|
656 |
+
"skills": skill_jsonl
|
657 |
+
}
|
658 |
+
fighter_data.append(data)
|
659 |
+
print(json.dumps(data, ensure_ascii=False))
|
660 |
+
with open(fighter_save_name, 'a', encoding="utf-8") as f:
|
661 |
+
f.write(json.dumps(data, ensure_ascii=False) + "\n")
|
662 |
+
|
663 |
+
|
664 |
+
def searching_fighter_on_elo(name):
|
665 |
+
global fighter_data
|
666 |
+
global name_to_top_unique
|
667 |
+
|
668 |
+
if name in name_to_top_unique:
|
669 |
+
top_unique = name_to_top_unique[name]
|
670 |
+
for data in fighter_data:
|
671 |
+
if get_unique_from_data(data) == top_unique:
|
672 |
+
return data
|
673 |
+
return searching_fighter(name)
|
674 |
+
else:
|
675 |
+
return searching_fighter(name)
|
676 |
+
|
677 |
+
|
678 |
+
import gradio as gr
|
679 |
+
|
680 |
+
|
681 |
+
def get_attr_str_short(attr_json):
|
682 |
+
if "hp" in attr_json:
|
683 |
+
ans = "血量:" + str(attr_json["hp"]) + "\n"
|
684 |
+
else:
|
685 |
+
ans = ""
|
686 |
+
ans += "力量:" + str(attr_json["STR"]) + "\n体质:" + str(attr_json["VIT"]) + "\n速度:" + str(attr_json["SPD"])
|
687 |
+
return ans
|
688 |
+
|
689 |
+
|
690 |
+
def get_skill_str_short(attr_json):
|
691 |
+
ans = attr_json["major_martial_art"] + ":\n"
|
692 |
+
for skill in attr_json["major_movements"]:
|
693 |
+
ans += skill + "-"
|
694 |
+
ans += "\n" + attr_json["secondary_martial_art"] + ":\n"
|
695 |
+
for skill in attr_json["secondary_movements"]:
|
696 |
+
ans += skill + "-"
|
697 |
+
ans += "\n 防御:" + attr_json["footwork_and_body_method"]
|
698 |
+
return ans
|
699 |
+
|
700 |
+
|
701 |
+
def generate_ma(name, desc, display_board):
|
702 |
+
if name.strip() == "":
|
703 |
+
return "", "", "", "", display_board, "角色名不能为空,输入角色名后生成功法或者创建角色"
|
704 |
+
|
705 |
+
status = "请为角色进一步生成详细功法"
|
706 |
+
|
707 |
+
role_detail = ma_foo_answer
|
708 |
+
|
709 |
+
if name == "李鲁鲁":
|
710 |
+
json_answer = json.loads(attr_lilulu)
|
711 |
+
elif name == "冷子昂":
|
712 |
+
json_answer = json.loads(attr_lengziang)
|
713 |
+
else:
|
714 |
+
role_detail = generate_detailed_description(name, desc)
|
715 |
+
json_str = generate_attr_json(name, desc, role_detail)
|
716 |
+
json_answer = robust_parsing(json_str)
|
717 |
+
|
718 |
+
json_answer_str = json.dumps(json_answer, ensure_ascii=False)
|
719 |
+
|
720 |
+
skill_desc = get_skill_str_short(json_answer)
|
721 |
+
|
722 |
+
display_board.append(("生成人物" + json_answer["name"] + "\n" + skill_desc, None))
|
723 |
+
|
724 |
+
return role_detail, json_answer_str, get_attr_str_short(json_answer), skill_desc, display_board, status
|
725 |
+
|
726 |
+
|
727 |
+
def generate_madetail(player_attribute, display_board):
|
728 |
+
if player_attribute.strip() == "":
|
729 |
+
return "", display_board, "需要生成武功名称,再生成描述。或者直接随机召唤角色"
|
730 |
+
|
731 |
+
status = "确认两个角色都生成之后,可以进入战斗"
|
732 |
+
|
733 |
+
json_answer = json.loads(player_attribute)
|
734 |
+
|
735 |
+
generate_flag = False
|
736 |
+
|
737 |
+
ans = skill_foo_desc
|
738 |
+
if json_answer["name"] == "李鲁鲁":
|
739 |
+
ans = skill_lilulu
|
740 |
+
elif json_answer["name"] == "冷子昂":
|
741 |
+
ans = skill_lengziang
|
742 |
+
else:
|
743 |
+
ans = generate_skill_jsonl(json_answer)
|
744 |
+
generate_flag = True
|
745 |
+
|
746 |
+
display_board.append(("为" + json_answer["name"] + "生成详细的功法描述\n", None))
|
747 |
+
|
748 |
+
if generate_flag:
|
749 |
+
player = Player(json_answer, ans)
|
750 |
+
unique_name = get_unique_from_json(json_answer["name"], json_answer)
|
751 |
+
if len(player.skills) > 1 and unique_name != None:
|
752 |
+
add_fighter(player_attribute, ans)
|
753 |
+
display_board.append(("将新角色" + json_answer["name"] + "录入到数据库\n", None))
|
754 |
+
|
755 |
+
return ans, display_board, status
|
756 |
+
|
757 |
+
|
758 |
+
def continue_fight(detailed_attr_player1, detailed_attr_player2, detailed_skill_player1, detailed_skill_player2,
|
759 |
+
display_board):
|
760 |
+
if detailed_attr_player1.strip() == "" or detailed_attr_player2.strip() == "" or detailed_skill_player1.strip() == "" or detailed_skill_player2.strip() == "":
|
761 |
+
str1 = ""
|
762 |
+
if detailed_attr_player1.strip() != "":
|
763 |
+
str1 = get_attr_str_short(json.loads(detailed_attr_player1))
|
764 |
+
str2 = ""
|
765 |
+
if detailed_attr_player2.strip() != "":
|
766 |
+
str2 = get_attr_str_short(json.loads(detailed_attr_player2))
|
767 |
+
return detailed_attr_player1, detailed_attr_player2, display_board, str1, str2, "请重新检查人物的生成情况"
|
768 |
+
|
769 |
+
json1 = json.loads(detailed_attr_player1)
|
770 |
+
json2 = json.loads(detailed_attr_player2)
|
771 |
+
name1 = json1["name"]
|
772 |
+
name2 = json2["name"]
|
773 |
+
|
774 |
+
status = f"""{name1} 大战 {name2}"""
|
775 |
+
|
776 |
+
if "hp" in json1 and "hp" in json2:
|
777 |
+
if json1["hp"] <= 0 and json1["hp"] < json2["hp"]:
|
778 |
+
unique1 = get_unique_from_json(name1, json1)
|
779 |
+
unique2 = get_unique_from_json(name2, json2)
|
780 |
+
return detailed_attr_player1, detailed_attr_player2, display_board, "", "", "战斗结束!请清除战斗或者重新生成人物"
|
781 |
+
|
782 |
+
if json2["hp"] <= 0 and json2["hp"] < json1["hp"]:
|
783 |
+
unique1 = get_unique_from_json(name1, json1)
|
784 |
+
unique2 = get_unique_from_json(name2, json2)
|
785 |
+
return detailed_attr_player1, detailed_attr_player2, display_board, "", "", "战斗结束!请清除战斗或者重新生成人物"
|
786 |
+
|
787 |
+
game_manager = GameManager(json1, json2, detailed_skill_player1, detailed_skill_player2)
|
788 |
+
msgs, new_player1, new_player2 = game_manager.run()
|
789 |
+
for msg in msgs:
|
790 |
+
display_board.append(msg)
|
791 |
+
|
792 |
+
if game_manager.flag == "player1_win":
|
793 |
+
unique1 = get_unique_from_json(name1, json1)
|
794 |
+
unique2 = get_unique_from_json(name2, json2)
|
795 |
+
update_elo(unique1, unique2)
|
796 |
+
elif game_manager.flag == "player2_win":
|
797 |
+
unique1 = get_unique_from_json(name1, json1)
|
798 |
+
unique2 = get_unique_from_json(name2, json2)
|
799 |
+
update_elo(unique2, unique1)
|
800 |
+
|
801 |
+
new_player1_str = json.dumps(new_player1, ensure_ascii=False)
|
802 |
+
new_player2_str = json.dumps(new_player2, ensure_ascii=False)
|
803 |
+
|
804 |
+
return new_player1_str, new_player2_str, display_board, get_attr_str_short(new_player1), get_attr_str_short(
|
805 |
+
new_player2), status
|
806 |
+
|
807 |
+
|
808 |
+
def callback_random_role(display_board):
|
809 |
+
data = get_random_fighter()
|
810 |
+
name = data["name"]
|
811 |
+
json_str = data["attr_str"]
|
812 |
+
skills_jsonl = data["skills"]
|
813 |
+
json_answer = json.loads(json_str)
|
814 |
+
display_board.append(("从数据库选择角色" + name, None))
|
815 |
+
return name, json_str, skills_jsonl, get_attr_str_short(json_answer), get_skill_str_short(
|
816 |
+
json_answer), display_board
|
817 |
+
|
818 |
+
|
819 |
+
def callback_role_from_name(display_board, name):
|
820 |
+
data = searching_fighter_on_elo(name)
|
821 |
+
json_str = data["attr_str"]
|
822 |
+
skills_jsonl = data["skills"]
|
823 |
+
json_answer = json.loads(json_str)
|
824 |
+
display_board.append(("从数据库选择角色" + name, None))
|
825 |
+
return name, json_str, skills_jsonl, get_attr_str_short(json_answer), get_skill_str_short(
|
826 |
+
json_answer), display_board
|
827 |
+
|
828 |
+
|
829 |
+
def callback_clean_fight(display_board, detailed_attr_player1, detailed_attr_player2):
|
830 |
+
display_board = []
|
831 |
+
json1 = json.loads(detailed_attr_player1)
|
832 |
+
json2 = json.loads(detailed_attr_player2)
|
833 |
+
if "hp" in json1:
|
834 |
+
del json1["hp"]
|
835 |
+
if "hp" in json2:
|
836 |
+
del json2["hp"]
|
837 |
+
|
838 |
+
new_detailed_attr_player1 = json.dumps(json1, ensure_ascii=False)
|
839 |
+
new_detailed_attr_player2 = json.dumps(json2, ensure_ascii=False)
|
840 |
+
|
841 |
+
return display_board, new_detailed_attr_player1, new_detailed_attr_player2
|
842 |
+
|
843 |
+
|
844 |
+
def callback_refresh_rank():
|
845 |
+
return get_rank_str()
|
846 |
+
|
847 |
+
|
848 |
+
with gr.Blocks() as demo:
|
849 |
+
gr.Markdown(
|
850 |
+
"""
|
851 |
+
# LuotuoFighter
|
852 |
+
|
853 |
+
## 骆驼大乱斗
|
854 |
+
|
855 |
+
Implemented by 李鲁鲁
|
856 |
+
|
857 |
+
项目链接 https://github.com/LC1332/Chat-Haruhi-Suzumiya
|
858 |
+
|
859 |
+
这个原型是为了百川Hackathon而初步建立
|
860 |
+
|
861 |
+
三种角色建立方式: 根据姓名召唤、随机召唤,或者输入姓名和描述后生成新的人物
|
862 |
+
姓名召唤会召唤同名人物中战力最强的那个
|
863 |
+
由于Gradio特性,建立角色要花个几十秒,先点击生成功法,再点击生成功法描述
|
864 |
+
"""
|
865 |
+
)
|
866 |
+
|
867 |
+
with gr.Row():
|
868 |
+
with gr.Column():
|
869 |
+
current_status = gr.Textbox(label="当前状态", value="请输入角色1的姓名之后生成功法,或进行召唤")
|
870 |
+
|
871 |
+
display_board = gr.Chatbot(height=800)
|
872 |
+
|
873 |
+
submit_fight2 = gr.Button("继续战斗!")
|
874 |
+
clean_fight = gr.Button("清空战斗")
|
875 |
+
|
876 |
+
with gr.Column():
|
877 |
+
with gr.Row():
|
878 |
+
name_player1 = gr.Textbox(label="角色1姓名", scale=1, interactive=True, value="李鲁鲁")
|
879 |
+
desc_player1 = gr.Textbox(label="角色1描述", scale=20, value="师从,主修剑法", interactive=True)
|
880 |
+
|
881 |
+
with gr.Row():
|
882 |
+
generate_ma_player1 = gr.Button("生成功法")
|
883 |
+
generate_madetail_player1 = gr.Button("生成功法描述")
|
884 |
+
|
885 |
+
with gr.Row():
|
886 |
+
random_sel_player1 = gr.Button("随机召唤")
|
887 |
+
call_player1_with_name1 = gr.Button("根据姓名召唤")
|
888 |
+
|
889 |
+
with gr.Row():
|
890 |
+
name_player2 = gr.Textbox(label="角色2姓名", scale=1, interactive=True, value="冷子昂")
|
891 |
+
desc_player2 = gr.Textbox(label="角色2描述", scale=20, value="师从,主修剑法", interactive=True)
|
892 |
+
with gr.Row():
|
893 |
+
generate_ma_player2 = gr.Button("生成功法")
|
894 |
+
generate_madetail_player2 = gr.Button("生成功法描述")
|
895 |
+
|
896 |
+
with gr.Row():
|
897 |
+
random_sel_player2 = gr.Button("随机召唤2")
|
898 |
+
call_player1_with_name2 = gr.Button("根据姓名召唤2")
|
899 |
+
|
900 |
+
with gr.Row():
|
901 |
+
submit_fight = gr.Button("继续战斗!")
|
902 |
+
|
903 |
+
with gr.Row():
|
904 |
+
attr_player1 = gr.TextArea(label="角色1属性")
|
905 |
+
skill_player1 = gr.TextArea(label="角色1功法描述")
|
906 |
+
|
907 |
+
with gr.Row():
|
908 |
+
attr_player2 = gr.TextArea(label="角色2属性")
|
909 |
+
skill_player2 = gr.TextArea(label="角色2功法描述")
|
910 |
+
|
911 |
+
with gr.Row():
|
912 |
+
refresh_rank = gr.Button("刷新天梯")
|
913 |
+
|
914 |
+
with gr.Row():
|
915 |
+
rank_showboard = gr.TextArea(label="天梯")
|
916 |
+
|
917 |
+
with gr.Row():
|
918 |
+
with gr.Column():
|
919 |
+
detailed_description_player1 = gr.TextArea(label="角色1具体描述")
|
920 |
+
detailed_skill_player1 = gr.TextArea(label="角色1技能json")
|
921 |
+
detailed_attr_player1 = gr.TextArea(label="角色1属性json")
|
922 |
+
|
923 |
+
with gr.Column():
|
924 |
+
detailed_description_player2 = gr.TextArea(label="角色2具体描述")
|
925 |
+
detailed_skill_player2 = gr.TextArea(label="角色2技能json")
|
926 |
+
detailed_attr_player2 = gr.TextArea(label="角色2属性json")
|
927 |
+
|
928 |
+
generate_ma_player1.click(fn=generate_ma, inputs=[name_player1, desc_player1, display_board],
|
929 |
+
outputs=[detailed_description_player1, detailed_attr_player1, attr_player1, skill_player1,
|
930 |
+
display_board, current_status])
|
931 |
+
generate_ma_player2.click(fn=generate_ma, inputs=[name_player2, desc_player2, display_board],
|
932 |
+
outputs=[detailed_description_player2, detailed_attr_player2, attr_player2, skill_player2,
|
933 |
+
display_board, current_status])
|
934 |
+
generate_madetail_player1.click(fn=generate_madetail, inputs=[detailed_attr_player1, display_board],
|
935 |
+
outputs=[detailed_skill_player1, display_board, current_status])
|
936 |
+
generate_madetail_player2.click(fn=generate_madetail, inputs=[detailed_attr_player2, display_board],
|
937 |
+
outputs=[detailed_skill_player2, display_board, current_status])
|
938 |
+
|
939 |
+
random_sel_player1.click(fn=callback_random_role, inputs=[display_board],
|
940 |
+
outputs=[name_player1, detailed_attr_player1, detailed_skill_player1, attr_player1,
|
941 |
+
skill_player1, display_board])
|
942 |
+
random_sel_player2.click(fn=callback_random_role, inputs=[display_board],
|
943 |
+
outputs=[name_player2, detailed_attr_player2, detailed_skill_player2, attr_player2,
|
944 |
+
skill_player2, display_board])
|
945 |
+
|
946 |
+
call_player1_with_name1.click(fn=callback_role_from_name, inputs=[display_board, name_player1],
|
947 |
+
outputs=[name_player1, detailed_attr_player1, detailed_skill_player1, attr_player1,
|
948 |
+
skill_player1, display_board])
|
949 |
+
call_player1_with_name2.click(fn=callback_role_from_name, inputs=[display_board, name_player2],
|
950 |
+
outputs=[name_player2, detailed_attr_player2, detailed_skill_player2, attr_player2,
|
951 |
+
skill_player2, display_board])
|
952 |
+
|
953 |
+
refresh_rank.click(fn=callback_refresh_rank, inputs=[], outputs=[rank_showboard])
|
954 |
+
|
955 |
+
clean_fight.click(fn=callback_clean_fight, inputs=[display_board, detailed_attr_player1, detailed_attr_player2],
|
956 |
+
outputs=[display_board, detailed_attr_player1, detailed_attr_player2])
|
957 |
+
|
958 |
+
submit_fight.click(fn=continue_fight,
|
959 |
+
inputs=[detailed_attr_player1, detailed_attr_player2, detailed_skill_player1,
|
960 |
+
detailed_skill_player2, display_board],
|
961 |
+
outputs=[detailed_attr_player1, detailed_attr_player2, display_board, attr_player1, attr_player2,
|
962 |
+
current_status])
|
963 |
+
|
964 |
+
submit_fight2.click(fn=continue_fight,
|
965 |
+
inputs=[detailed_attr_player1, detailed_attr_player2, detailed_skill_player1,
|
966 |
+
detailed_skill_player2, display_board],
|
967 |
+
outputs=[detailed_attr_player1, detailed_attr_player2, display_board, attr_player1,
|
968 |
+
attr_player2, current_status])
|
969 |
+
|
970 |
+
demo.launch(debug=False, share=True)
|
requirements.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
openai
|
2 |
+
gradio
|
3 |
+
tiktoken
|
4 |
+
langchain
|