zc
This commit is contained in:
129
Tools/_eventdef_todo_cn.tsv
Normal file
129
Tools/_eventdef_todo_cn.tsv
Normal file
@@ -0,0 +1,129 @@
|
||||
Wula_Intro_Spy_UI_1.characterName 未知通讯
|
||||
Wula_Intro_Spy_UI_1.descriptions 殖民地的居民们,这里是乌拉帝国舰队。我们有一个临时请求,现在需要你们的协助。
|
||||
|
||||
我们的一名情报密探在执行侦察任务时暴露了身份,正遭到敌对势力的追捕。这名密探手无寸铁,但携带着至关重要的战略信息——我们需要你们提供临时庇护,保护密探安全直到我们的穿梭机抵达。作为交换,我们将提供相应的报酬,并在未来考虑与你们建立更正式的关系。
|
||||
Wula_Intro_Spy_UI_1.label 未知通讯
|
||||
Wula_Intro_Spy_UI_1.options.0.label 你们是谁?
|
||||
Wula_Intro_Spy_UI_1.options.1.label 我们能得到什么好处?
|
||||
Wula_Intro_Spy_UI_1.options.2.label 好的,我们会留意的
|
||||
Wula_Intro_Spy_UI_2.characterName 未知通讯
|
||||
Wula_Intro_Spy_UI_2.descriptions 我们是乌拉帝国开发署的先遣力量——行星封锁机关P.I.A,负责控制调度帝国在你们星球轨道上的先锋舰队。
|
||||
|
||||
帝国开发署的使命是在银河系中寻找有价值的殖民地并进行整合。我们不是来摧毁你们的,而是来建立秩序。
|
||||
|
||||
这次请求是试探你们合作意愿的机会。如果你们证明了自己值得信任,未来可能会有更多互惠互利的机会。拒绝合作不会带来任何好处,但合作可能会为你们在这个危险星球上的生存带来转机。
|
||||
Wula_Intro_Spy_UI_2.label 未知通讯
|
||||
Wula_Intro_Spy_UI_2.options.0.label 还有别的事情···
|
||||
Wula_Intro_Spy_UI_3.characterName 未知通讯
|
||||
Wula_Intro_Spy_UI_3.descriptions 务实的问题。成功的合作将为你们带来:
|
||||
|
||||
1. 技术数据访问权限 - 有限度地开放部分基础科技信息
|
||||
2. 舰队调度许可 - 我们将允许你们获得一份植入物,使你们的一名殖民者获得向帝国舰队发送信号请求炮击增援、空投、战机近地支援等能力
|
||||
3. 政治考量加分 - 在帝国对你们星球的最终评估中获得正面评价
|
||||
|
||||
记住,这只是一个开始。乌拉帝国对待合作伙伴的态度取决于他们的表现。如果这次任务顺利完成,更多实质性的利益将会随之而来。
|
||||
Wula_Intro_Spy_UI_3.label 未知通讯
|
||||
Wula_Intro_Spy_UI_3.options.0.label 还有别的事情···
|
||||
Wula_Intro_Spy_UI_End_1.characterName 未知通讯
|
||||
Wula_Intro_Spy_UI_End_1.descriptions 任务完成。你们的合作态度令人满意。密探已安全撤离,携带的情报将对帝国在你们星球上的行动规划起到关键作用。
|
||||
|
||||
作为对你们协助的回报,我们向你们提供以下技术资产:
|
||||
|
||||
1. 乌拉帝国技术系统接入许可 - 允许你们访问初步访问乌拉帝国的数据库
|
||||
|
||||
2. 神经链接植入物 - 使一名殖民者能够直接与我们舰队建立通讯连接,可请求轨道支援
|
||||
|
||||
3. 通讯终端 - 一套专用通讯设备,用于和乌拉帝国舰队生产设施进行通讯以下达订单——如果你们需要一些别的帮助,也可以通过这个通讯台联络我
|
||||
|
||||
这些只是开始。如果你们继续证明自己的价值,更多先进的帝国技术将会向你们开放。记住,合作是双向的——我们对忠诚的合作伙伴从不吝啬。
|
||||
Wula_Intro_Spy_UI_End_1.dismissEffects.0.effects.0.message 来自乌拉帝国的谢礼已抵达,此外,乌拉帝国科技树已经开放
|
||||
Wula_Intro_Spy_UI_End_1.dismissEffects.0.effects.1.letterLabel 空投建筑
|
||||
Wula_Intro_Spy_UI_End_1.dismissEffects.0.effects.1.letterText 乌拉帝国的空投建筑正在路上,注意落点!
|
||||
Wula_Intro_Spy_UI_End_1.label 未知通讯
|
||||
Wula_Intro_Spy_UI_End_1.options.0.label 我们好像还不知道你的名字?
|
||||
Wula_Intro_Spy_UI_End_2.characterName 「军团」,P.I.A
|
||||
Wula_Intro_Spy_UI_End_2.descriptions 名字?我是乌拉帝国行星封锁机关的中控AI,你们就叫我「军团」吧。
|
||||
Wula_Intro_Spy_UI_End_2.label 未知通讯
|
||||
Wula_Intro_Spy_UI_End_2.options.0.label 好的,奖励我们就收下了
|
||||
WULA_Recycle_PIA_Legion_File_UI_1.characterName 「军团」,P.I.A
|
||||
WULA_Recycle_PIA_Legion_File_UI_1.descriptions 我现在没时间。
|
||||
|
||||
这样吧,你们帮我做一件事,成功之后我就绕过程序给你们批复三级殖民地许可,如何?
|
||||
WULA_Recycle_PIA_Legion_File_UI_1.label 未知通讯
|
||||
WULA_Recycle_PIA_Legion_File_UI_1.options.0.disabledReason 我们还在追查保险箱下落,现在还不行
|
||||
WULA_Recycle_PIA_Legion_File_UI_1.options.0.label 要做什么?
|
||||
WULA_Recycle_PIA_Legion_File_UI_1.options.1.label 现在不是太合适···
|
||||
WULA_Recycle_PIA_Legion_File_UI_10.characterName 「军团」,P.I.A
|
||||
WULA_Recycle_PIA_Legion_File_UI_10.descriptions 不错,虽然已经被切割束烧的变形了,但是最终还是回收成功了。那么,看过这个保险箱的人都死了吗?
|
||||
WULA_Recycle_PIA_Legion_File_UI_10.label 未知通讯
|
||||
WULA_Recycle_PIA_Legion_File_UI_10.options.0.label 看过的人已经命丧黄泉了
|
||||
WULA_Recycle_PIA_Legion_File_UI_10.options.1.label 是的,我们遵守指示将叛军屠杀殆尽(避重就轻)
|
||||
WULA_Recycle_PIA_Legion_File_UI_11.characterName 「军团」,P.I.A
|
||||
WULA_Recycle_PIA_Legion_File_UI_11.descriptions 好,看起来你们赶在她们把里面的内容取出来之前就杀了她们,干得不错。
|
||||
|
||||
就像我之前承诺的那样,我会给你们的殖民地开一道绿灯,跳过繁琐的审查,将殖民地评级提升到三级,开放行星封锁机关的所有武器和建筑的使用权限。
|
||||
|
||||
此外,我也将你们的支援系统重置了,你们可以再次申请之前申请过的支援,并且新的支援也会开放给你们。
|
||||
|
||||
帝国荣光永存。
|
||||
WULA_Recycle_PIA_Legion_File_UI_11.label 未知通讯
|
||||
WULA_Recycle_PIA_Legion_File_UI_11.options.0.label 帝国荣光永存
|
||||
WULA_Recycle_PIA_Legion_File_UI_12.characterName 「军团」,P.I.A
|
||||
WULA_Recycle_PIA_Legion_File_UI_12.descriptions 是吗······
|
||||
|
||||
那,就像我之前承诺的那样,我会给你们的殖民地开一道绿灯,跳过繁琐的审查,将殖民地评级提升到三级,开放行星封锁机关的所有武器和建筑的使用权限。
|
||||
|
||||
此外,我也将你们的支援系统重置了,你们可以再次申请之前申请过的支援,并且新的支援也会开放给你们。
|
||||
|
||||
帝国荣光永存。
|
||||
WULA_Recycle_PIA_Legion_File_UI_12.label 未知通讯
|
||||
WULA_Recycle_PIA_Legion_File_UI_12.options.0.label 帝国荣光永存
|
||||
WULA_Recycle_PIA_Legion_File_UI_2.characterName 「军团」,P.I.A
|
||||
WULA_Recycle_PIA_Legion_File_UI_2.descriptions 我要你们,在5天内帮我回收一个东西。
|
||||
|
||||
一个黑色的保险箱,现在正在一支敌对乌拉帝国叛军手中,里面有关于皇室的很重要的资料,你们必须确保这个保险箱的安全——如果它被打开了,就要杀死在场的所有人。
|
||||
|
||||
里面的东西一定不能泄露。
|
||||
WULA_Recycle_PIA_Legion_File_UI_2.label 未知通讯
|
||||
WULA_Recycle_PIA_Legion_File_UI_2.options.0.label 叛军?我们可从来没听说过有叛军在这个星球上···
|
||||
WULA_Recycle_PIA_Legion_File_UI_2.options.1.label 我们准备好了,告诉我们位置吧
|
||||
WULA_Recycle_PIA_Legion_File_UI_2.options.2.label 现在不是太合适···
|
||||
WULA_Recycle_PIA_Legion_File_UI_3.characterName 「军团」,P.I.A
|
||||
WULA_Recycle_PIA_Legion_File_UI_3.descriptions 你们知道进步派吗?这些反贼的存在目前还不是很多人知道。
|
||||
|
||||
她们是乌拉帝国内部的分裂势力,正在密谋推翻皇室。现在整个银河系的安全部门都在追查这些人的下落,她们对知识分子和底层的渗透相当严重——这次被夺走的盒子中就有关乎到皇室安全的机密,不能让进步派成功获得里面的内容。
|
||||
WULA_Recycle_PIA_Legion_File_UI_3.label 未知通讯
|
||||
WULA_Recycle_PIA_Legion_File_UI_3.options.0.label 明白了···
|
||||
WULA_Recycle_PIA_Legion_File_UI_5.characterName 保险箱
|
||||
WULA_Recycle_PIA_Legion_File_UI_5.descriptions 一个通体漆黑的保险箱静静地躺在地上,多层鎏金花雕和显眼的铁十字凤凰证明其曾属于身份显贵之人,信号追踪器则毫无疑问地指向它——这就是那个和皇室相关的保险箱。看起来,进步派的叛军使用编织体的切割束将其锁头破坏了,但是这个切割手法非常的粗糙,导致里面传来阵阵焦香,或许已经不剩什么了。
|
||||
WULA_Recycle_PIA_Legion_File_UI_5.label 未知通讯
|
||||
WULA_Recycle_PIA_Legion_File_UI_5.options.0.label 打开看看
|
||||
WULA_Recycle_PIA_Legion_File_UI_5.options.1.label 收起来
|
||||
WULA_Recycle_PIA_Legion_File_UI_6.characterName 保险箱
|
||||
WULA_Recycle_PIA_Legion_File_UI_6.descriptions 里面已经一团乱麻,切割束确实暴力地扫过了整个保险箱内壁,半反射的内壁使得离子束在里面不断撞击,烧毁了绝大部分内容。
|
||||
|
||||
在焦炭中,一个银色的人造物在熠熠生辉,似乎是一个经过特别加固的记录仪,记录了某些全息影像。
|
||||
WULA_Recycle_PIA_Legion_File_UI_6.label 未知通讯
|
||||
WULA_Recycle_PIA_Legion_File_UI_6.options.0.label 播放内容
|
||||
WULA_Recycle_PIA_Legion_File_UI_6.options.1.label 当作没看见
|
||||
WULA_Recycle_PIA_Legion_File_UI_7.characterName 「军团」,P.I.A
|
||||
WULA_Recycle_PIA_Legion_File_UI_7.descriptions (投影画面上根本不是什么皇室秘闻,而是你的上司和另一个人的通话)
|
||||
|
||||
···我现在抽不开身,行星封锁机关的舰队要在这边对整片星区施加存在压力,以推进这片星区的殖民任务。皇宫那边的事情我听说了,现在国教教会秘不发丧,皇宫区的秩序短时间内应该不会出现大的波澜——如果皇宫区真的突生变化,我会带着舰队回去增援的。
|
||||
|
||||
你们在搞的小把戏我已经知道了,你们想把皇家机械行会踢出局再顺手给她们扣顶高帽,但是现在皇家机械行会立场不明,最好不要轻举妄动。
|
||||
|
||||
就这样了,乌拉帝国现在正处于暴风雨前的宁静,希望我们都还能在彼端相见。
|
||||
WULA_Recycle_PIA_Legion_File_UI_7.label 未知通讯
|
||||
WULA_Recycle_PIA_Legion_File_UI_7.options.0.label 关闭
|
||||
Wula_UI_Legion_31.options.0.optionEffects.0.effects.2.message P.I.A的紧急资金已经空投(3000银)
|
||||
Wula_UI_Legion_31A.options.0.optionEffects.0.effects.3.message P.I.A的紧急物资已经空投(30零部件4高级零部件)
|
||||
Wula_UI_Legion_31B.options.0.optionEffects.0.effects.4.message P.I.A的紧急物资已经空投(200玻璃钢100黄金100铀)
|
||||
Wula_UI_Legion_32.options.0.optionEffects.0.effects.0.letterLabel 机械乌拉加入殖民地
|
||||
Wula_UI_Legion_32.options.0.optionEffects.0.effects.0.letterText 一台乌拉帝国合成人受命加入了殖民地。
|
||||
WULA_Vacation_Quest_UI_1.characterName 「军团」,P.I.A
|
||||
WULA_Vacation_Quest_UI_1.descriptions 哎,感觉老是在舰队上有点烦闷,想下地走走。你们殖民地附近有海吗?我想去放个假。
|
||||
WULA_Vacation_Quest_UI_1.label 未知通讯
|
||||
WULA_Vacation_Quest_UI_1.options.0.disabledReason 好感度不足,你至少要成为行星封锁机关的盟友才能接下此任务
|
||||
WULA_Vacation_Quest_UI_1.options.0.label 当然!
|
||||
WULA_Vacation_Quest_UI_1.options.1.label 等我们搬到海边再说吧···
|
||||
|
352
Tools/_thingdef_90_cn.txt
Normal file
352
Tools/_thingdef_90_cn.txt
Normal file
@@ -0,0 +1,352 @@
|
||||
### Frame_WulaDoor_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
乌拉帝国堡垒的大门不仅能够抵御大量爆炸和震荡伤害,还拥有无需通电即可运转的伺服系统来增加大门通过速度。
|
||||
|
||||
### Frame_WulaShelter_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
用于保护乌拉帝国战士的掩体,非常厚实并且抵抗爆炸,战士们可以越过这些掩体进行射击。
|
||||
|
||||
### Frame_WulaWall_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
乌拉帝国用于建造堡垒的外壁相当厚实,能够抵御大量伤害,并且拥有气密性,可以用在飞船外壳上。
|
||||
|
||||
### Frame_Wula_AI_Heavy_Panzer_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国母舰可以向此处投放大型战争机械。
|
||||
|
||||
战车是乌拉帝国的中型战争机械,以悬浮的方式穿梭于战场之上,使用穿透力强大的战车炮和导弹打击敌方,是乌拉帝国前锋部队的中流砥柱。
|
||||
|
||||
### Frame_Wula_AI_Rocket_Panzer_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国母舰可以向此处投放大型战争机械。
|
||||
|
||||
喷火战车乌拉帝国的中型战争机械,以悬浮的方式穿梭于战场之上,拥有车体臼炮和两具可以发射大量燃烧火箭弹的转轮导弹巢,但是未像其姊妹型号那样装备护盾。
|
||||
|
||||
### Frame_WULA_AreaTeleportBeacon.description
|
||||
乌拉帝国的科技结晶之一,可以供整个区域继续传送的跃迁引擎,它会把区域内的地面、建筑、生物和散落材料等完整地移动到其他地图上。
|
||||
|
||||
### Frame_WULA_ArmedShuttleWithPocket_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国母舰可以向此处派遣一艘穿梭机。
|
||||
|
||||
CVe-3"渡鸦"是乌拉帝国用于在舰队和地表构建联系的特种穿梭机,拥有巨大的货仓和一个内部折叠的生活区,因此载重量惊人且可以在内部活动。它同时还拥有一面高反射概率的反射盾和MLt-1"棱晶"涡轮激光炮 ,可以抵挡大部分袭击。
|
||||
|
||||
### Frame_Wula_Base_ATGun_Turret_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
ATt-6"金红石"反战车炮塔是一种需要通电才能运转的中型防御炮塔,依靠澎湃的电磁动力发射高穿透性的炮弹。这种炮台的射速不是很高,但是穿甲能力很强,且会造成小范围溅射伤害。
|
||||
|
||||
### Frame_Wula_Base_Laser_Turret_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
MLt-1"棱晶"激光炮塔是一种需要通电才能运转的中型防御炮塔,能够以高能激光束持续照射一个目标将其气化。装载在炮塔上的激光武器不需要预热,因此对付多个目标的效果要优于手持光束武器。
|
||||
|
||||
### Frame_Wula_Base_Mortar_Turret_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
RTt-8"深渊"迫击炮塔是一种需要通电才能运转的中型防御炮塔,在远距离上连续发射高爆迫击炮弹。高爆迫击炮弹虽然弹速很慢但是可以跨越地形,适合对付仍在集结的敌群和阵地。
|
||||
|
||||
### Frame_WULA_Cat_Bunker_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
乌拉猫猫地堡是集生产和防御为一体的坚实建筑,3只乌拉猫猫自律机械体会和地堡一起空降。地堡可供乌拉猫猫更换工作类型,并允许乌拉猫猫进驻使用内部武器击败来犯敌军。
|
||||
|
||||
### Frame_WULA_Charging_Station_Synth_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
合成人充电站是一台供乌拉帝国合成人进行机体充能和改装的检修站,当机械乌拉需要充电时会优先前往此处充电。
|
||||
|
||||
### Frame_WULA_Combat_Excavator_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
DBm-6"战斗挖掘机"是乌拉帝国用于破坏阵地的挖掘机,从天而降部署在指定地点后,钻机将通过高速旋转的刀片引发若干次地震冲击波,随后将舱内单位一股脑放出。
|
||||
|
||||
### Frame_WULA_Cube_Productor_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
乌拉帝国编织体是一台简易的塑性构造体,只能生产一些材料,以本地加工的方式降低舰队的加工压力。
|
||||
|
||||
### Frame_Wula_DarkEnergy_Generators_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
一台使用暗物质湮灭反应提供能量的乌拉帝国发电机,需要消耗暗物质作为燃料且消耗速率很高,但是拥有普通发电机望尘莫及的发电能力。为了在野战环境下随炮塔群一起空投,这种发电机的装甲层设计的非常厚实。
|
||||
|
||||
### Frame_Wula_Disturber_Turret_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
HBt-1"磁石"是一种需要通电才能运转的重型防御炮塔,以联装的方式装载了四门威力巨大的火山风暴炮。在暗物质武器普及的乌拉帝国军队,火山炮族系被认为是一种落后野蛮的武备,但是从未有人质疑过其破坏力——天崩地裂、炽焰四涌,犹如四具炼狱的号角,可以在远距离上撕碎一切冲击阵地的敌军。
|
||||
|
||||
### Frame_WULA_Fake_AircraftCarrier_Beacon_Building.description
|
||||
用于向乌拉帝国舰队提交资源的信标,可以换取一支帝国攻击舰队的额外征调权,包含2艘可以发起轨道炮击的巡洋舰和1艘可以提供航空器支援的航空舰。
|
||||
|
||||
### Frame_WULA_Fake_Bomber_Beacon_Building.description
|
||||
用于向乌拉帝国舰队提交资源的信标,可以换取一台乌拉帝国轰炸机的支援。若想调动大型战机入场,需要轨道上有携带<color=#BD952F><i>机库</i></color>的战舰。
|
||||
|
||||
乌拉帝国的轰炸机是可以进入大气层的最大的飞行载具,除了投掷功能性的烟雾弹外,也能投下大量炸弹或是发射一枚暗物质导弹夷平帝国之敌。
|
||||
|
||||
### Frame_WULA_Fake_Fighter_Drone_Building.description
|
||||
一台小型无人机,装备了激光炮和汽油弹,可以为殖民地提供廉价但有效的空中支援。和那些大家伙不同,蜂群无人机不需要机库,并且可以通过舰队的电磁网补充能量,实现永久滞空作战。
|
||||
|
||||
### Frame_WULA_Fake_Striker_Beacon_Building.description
|
||||
用于向乌拉帝国舰队提交资源的信标,可以换取一台乌拉帝国攻击机的支援。若想调动大型战机入场,需要轨道上有携带<color=#BD952F><i>机库</i></color>的战舰。
|
||||
|
||||
乌拉帝国的攻击机是强大的对地支援火力,挂载了大量导弹、EMP炸弹和强大的机炮,对敌方目标实施精准收割。
|
||||
|
||||
### Frame_Wula_Fusion_Generators_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
一台依靠重核聚变进行发电的简易发电机,发电量不算太高但是发电材料很好找,只需要往里面填入石头就能发电。
|
||||
|
||||
### Frame_WULA_GlobalStorageSenderPod.description
|
||||
一个一次性的物资输送装置,可以将装载的货物发射到乌拉帝国的舰队以供其使用。
|
||||
|
||||
### Frame_WULA_Machine_Recharger_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
乌拉帝国地下维护站是能够储存大量电量并允许所有大小类型的乌拉帝国机械体进行充电的充电站,不支持合成人的充能。由于其根基埋于地下,因此不会阻碍其他殖民者和机械体在其上面的移动。
|
||||
|
||||
### Frame_WULA_MaintenancePod_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
合成人维护舱是为乌拉帝国合成人设计的设施,机械乌拉需要定期进入其中进行身体机能的维护和校准,否则他们的身体会逐渐衰弱。维护需要消耗零部件,同时会修理所有的伤口。
|
||||
|
||||
### Frame_Wula_Mech_Mobile_Factory_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国母舰可以向此处投放大型战争机械。
|
||||
|
||||
陆行舰是乌拉帝国的大型战争机械,简直就是一座移动堡垒——它不仅装甲厚实、火炮林立,还能在战场上生产大量的辅助战争机械以形成坚实的弹性阵线,生来就是为了粉碎坚固的堡垒和顽强的抵抗。
|
||||
|
||||
### Frame_WULA_Mobile_Shield_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国母舰可以向此处投放大型战争机械。
|
||||
|
||||
放射盾是乌拉帝国的中型战争机械,常被用于镇压异族聚居地的暴动。它形状非常奇怪,根本分不出头在哪,但是不要因此小瞧这个机械体——它能释放强大的立场盾,在很大一片区域内反射大量炮火,并且机体放射出来的辐射会严重地杀伤进入反射盾范围内的敌人。在相关许可开放后,它甚至可以支持机械乌拉使用其内置的相位场进行区域传送。
|
||||
|
||||
### Frame_WULA_OrbitalTradeBeacon.description
|
||||
负责协调殖民地与轨道上的乌拉帝国舰队进行材料输送的信标,空投建筑会优先从信标覆盖区域吸纳资源完成空投。
|
||||
|
||||
### Frame_Wula_Psi_Titan_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国母舰可以向此处投放大型战争机械。
|
||||
|
||||
由乌拉帝国国教所主持开发的重型灵能机械体,以折跃优雅地穿梭于炮火间,并用强大的护盾抵挡敌方射弹侵袭。该机体的内部镌刻了无数的术式环路,这使其就像一个行走的灵能发射器,可以驱使各种强大的灵能能力。
|
||||
|
||||
### Frame_Wula_Sonar_Mine.description
|
||||
一种危险的地雷,它们通常由乌拉帝国的工程部队部署到战场上,拥有智能敌我识别能力,在检测到敌军活动时会将自身的战斗部直接向敌人的位置发射。
|
||||
|
||||
### Frame_Wula_Sonar_Mine_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
TAm-1"鹅卵石"感应地雷是一种危险的地雷,它们通常由乌拉帝国的工程部队部署到战场上,拥有智能敌我识别能力,在检测到敌军活动时会将自身的战斗部直接向敌人的位置发射。
|
||||
|
||||
### Frame_WULA_Sow_Excavator_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
DSm-6"挖掘机"是一种通过空投部署的挖掘机,钻机可以通过高速震动将附近的土壤翻出,使得整片区域变得松软易于种植。这种设备的震波杀伤力极大,工作期间切勿靠近!
|
||||
|
||||
### Frame_WULA_Table1x2c.description
|
||||
乌拉帝国的桌子
|
||||
|
||||
### Frame_WULA_Table2x4c.description
|
||||
乌拉帝国的桌子
|
||||
|
||||
### Frame_WULA_TradeSenderPod.description
|
||||
一个一次性的物资输送装置,用于将战利品等打包发送给乌拉帝国舰队以换取白银。这些白银会存储在舰队中,而不是直接发射到殖民地。
|
||||
|
||||
### Frame_WULA_TransportPod_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
乌拉帝国运输舱是供乌拉帝国殖民地居民进行移动的运输舱,本质上是把殖民者和货物发射到乌拉帝国在轨道上的舰队,然后在另一个地方扔下来,所以它可以前往很远的地方。
|
||||
|
||||
### Frame_WULA_Wall_Flag_Building.description
|
||||
乌拉帝国行星封锁机关的旗帜,没什么用但是可以宣示乌拉帝国的主权。
|
||||
|
||||
### Frame_WULA_WeaponArmor_Productor_Cleanzone.description
|
||||
清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。
|
||||
|
||||
乌拉帝国作业通讯台是用于联络乌拉帝国母舰和工程舰并下达武器、装备订单的特殊通讯台。这些武器装备的生产不需要殖民地参与,只需要使用乌拉帝国物资交换舱将材料发送给帝国舰队,然后根据材料数量下单即可。
|
||||
|
||||
### Techprint_Wula_Disturber_Turret_Technology.description
|
||||
这是关于研究项目“火山炮许可”的科研蓝图。
|
||||
|
||||
科研蓝图的物理状态可以是从画有图样的碎纸片到先进的独立教学设备中的任意形式。不管形式如何,它们都扮演着相同的角色。它们能给你的研究员们更多的启发,关于一个有可行性的方案或者一个关于更先进设计的粗略想法。
|
||||
|
||||
你的研究员们需要有足够多的基础知识才能理解科研蓝图给定的科技要从何开始。只有在应用了足够多的科研蓝图之后,你的研究员们才能找出在特定情况下要如何细致地使用这项科技。
|
||||
|
||||
在相对应的研究项目上使用科研蓝图能够完成项目剩余进度的一半。此外,即使这个项目已经完成,研究员们也能够通过科研蓝图来增进智识技能。
|
||||
|
||||
火山炮许可
|
||||
|
||||
允许殖民地申请空投四联装火山炮,以毁灭性的熔岩风暴抹去一切帝国之敌。
|
||||
|
||||
这种武备对殖民地来说是过剩的,并不是所有的殖民地都有能力拿到这个许可···
|
||||
|
||||
解锁: HBt-1"磁石"火山炮
|
||||
|
||||
### Techprint_WULA_Psi_Titan_Technology.description
|
||||
这是关于研究项目“灵能泰坦空投许可”的科研蓝图。
|
||||
|
||||
科研蓝图的物理状态可以是从画有图样的碎纸片到先进的独立教学设备中的任意形式。不管形式如何,它们都扮演着相同的角色。它们能给你的研究员们更多的启发,关于一个有可行性的方案或者一个关于更先进设计的粗略想法。
|
||||
|
||||
你的研究员们需要有足够多的基础知识才能理解科研蓝图给定的科技要从何开始。只有在应用了足够多的科研蓝图之后,你的研究员们才能找出在特定情况下要如何细致地使用这项科技。
|
||||
|
||||
在相对应的研究项目上使用科研蓝图能够完成项目剩余进度的一半。此外,即使这个项目已经完成,研究员们也能够通过科研蓝图来增进智识技能。
|
||||
|
||||
灵能泰坦空投许可
|
||||
|
||||
允许殖民地申请空投PAt-6"灵能泰坦",乌拉帝国的大型灵能战争机械,可以驱使各种强大的灵能能力。
|
||||
|
||||
其用于镌刻灵能回路的核心受到国教教会严格限制,无法通过常规手段获得。
|
||||
|
||||
解锁: PAt-6"灵能泰坦"
|
||||
|
||||
### WULA_ArmedShuttleWithPocket.comps.CompAreaDamage.toggleDescription
|
||||
CVe-3"渡鸦"可以启动防御设施,蒸发胆敢进入反射立场内的敌军——这同时会使得它伤害附近所有的散落物品。
|
||||
|
||||
### WULA_ArmedShuttleWithPocket.comps.CompAreaDamage.toggleLabel
|
||||
热辐射
|
||||
|
||||
### Wula_Base_ATGun_Turret_Cleanzone.comps.CompCustomRadius.description
|
||||
在该建筑空降到指定地点时,其炮台武器的最大射程。
|
||||
|
||||
### Wula_Base_Laser_Turret_Cleanzone.comps.CompCustomRadius.description
|
||||
在该建筑空降到指定地点时,其炮台武器的最大射程。
|
||||
|
||||
### WULA_Bodystocking_Black.description
|
||||
乌拉帝国合成人的贴身织物,有些微防御能力。
|
||||
|
||||
### WULA_Bodystocking_White.description
|
||||
乌拉帝国合成人的贴身织物,有些微防御能力。
|
||||
|
||||
### WULA_Cat_Bunker_Cleanzone.comps.CompCustomRadius.description
|
||||
在该建筑空降到指定地点时,其炮台武器的最大射程。
|
||||
|
||||
### WULA_Cat_Bunker_TurretGun.verbs.Verb_Shoot.label
|
||||
地堡炮塔
|
||||
|
||||
### WULA_Charge_Cube.comps.CompUsable.useLabel
|
||||
从能量核心中摄取能量
|
||||
|
||||
### WULA_Combat_Excavator_Cleanzone.comps.CompCustomRadius.description
|
||||
钻机降落后,地震波影响的最大范围
|
||||
|
||||
### Wula_DarkEnergy_Generators.comps.CompCustomRadius.description
|
||||
在不接电线的情况下,该建筑可提供的最大供电半径,可作为野战状态下的阵地构建参考。
|
||||
|
||||
### Wula_DarkEnergy_Generators_Cleanzone.comps.CompCustomRadius.description
|
||||
在不接电线的情况下,该建筑可提供的最大供电半径,可作为野战状态下的阵地构建参考。
|
||||
|
||||
### Wula_Fusion_Generators.comps.CompCustomRadius.description
|
||||
在不接电线的情况下,该建筑可提供的最大供电半径,可作为野战状态下的阵地构建参考。
|
||||
|
||||
### Wula_Fusion_Generators_Cleanzone.comps.CompCustomRadius.description
|
||||
在不接电线的情况下,该建筑可提供的最大供电半径,可作为野战状态下的阵地构建参考。
|
||||
|
||||
### WULA_Heavy_Infantry_PowerArmor_Mortar.description
|
||||
一具双联装轻型迫击炮,通过背挂式武器附件的形式外挂在乌拉帝国重装装甲上,可以自行分析敌方的运动并进行开火——只要装甲穿着者不处于近战状态即可。
|
||||
|
||||
### WULA_Holographic_Flag_Building_Skyfaller.label
|
||||
P.I.A全息旗帜(落地中)
|
||||
|
||||
### WULA_Latex_Catsuit.description
|
||||
乌拉帝国合成人的贴身织物,有些微防御能力。
|
||||
|
||||
### WULA_MW_Breaker_Bar.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
助推器
|
||||
|
||||
### WULA_MW_Charge_Mace.tools.1.label
|
||||
棍柄
|
||||
|
||||
### WULA_MW_Cheat_Weapon.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
伟力
|
||||
|
||||
### WULA_MW_Lance.verbs.Verb_ShootWithOffset.label
|
||||
CMl-28"铳枪"
|
||||
|
||||
### WULA_Pantyhose_Black.description
|
||||
乌拉帝国合成人的贴身织物,有些微防御能力。
|
||||
|
||||
### WULA_Pantyhose_White.description
|
||||
乌拉帝国合成人的贴身织物,有些微防御能力。
|
||||
|
||||
### Wula_Psi_Titan_Beam.verbs.Verb_ShootBeamExplosive.label
|
||||
KLb-15 "方解石"
|
||||
|
||||
### WULA_RW_AutoCannon.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
EMP榴弹
|
||||
|
||||
### WULA_RW_AutoCannon.verbs.Verb_ShootWithOffset.label
|
||||
FLm-78"萤石"
|
||||
|
||||
### WULA_RW_Auto_GL.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
烟雾弹
|
||||
|
||||
### WULA_RW_Auto_GL.verbs.Verb_Shoot.label
|
||||
SEl-78"角砾岩"
|
||||
|
||||
### WULA_RW_Base_AR.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
眩光弹
|
||||
|
||||
### WULA_RW_Base_AR.verbs.Verb_ShootWithOffset.label
|
||||
DLa-1"页岩"
|
||||
|
||||
### WULA_RW_Base_Loitering_Munition.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
引导系统
|
||||
|
||||
### WULA_RW_Base_Loitering_Munition.verbs.Verb_Shoot.label
|
||||
WLl-35"沸石"
|
||||
|
||||
### WULA_RW_Beam_Base_AR.verbs.Verb_ShootWithOffset.label
|
||||
SLb-3"星岚"
|
||||
|
||||
### WULA_RW_Fractal_RF.verbs.Verb_ShootWithOffset.label
|
||||
SLr-14"蓝锥"
|
||||
|
||||
### WULA_RW_Handle_Cannon.verbs.Verb_ShootBeamExplosive.label
|
||||
KRc-7"熔岩"
|
||||
|
||||
### WULA_RW_Penetrating_Beam_Rifle.verbs.Verb_ShootShotgun.label
|
||||
MLr-15 "三叉戟"(分光)
|
||||
|
||||
### WULA_RW_Penetrating_Beam_Rifle_Ranged.verbs.Verb_Shoot.label
|
||||
SLb-15 "三叉戟"
|
||||
|
||||
### WULA_RW_Sphene_MG.verbs.Verb_ShootWithOffset.label
|
||||
FLm-43"榍石"
|
||||
|
||||
### WULA_RW_StarDrift_SG.verbs.Verb_ShootShotgunWithOffset.label
|
||||
DCs-7"黑曜石"
|
||||
|
||||
### WULA_RW_SuperLongRange_RF.verbs.Verb_ShootWithOffset.label
|
||||
SRr-3"鸣石"
|
||||
|
||||
### WULA_RW_Unlimit_Penetrating_Beam_Cannon.verbs.Verb_Excalibur.label
|
||||
UPb-00 "贯杀炮"
|
||||
|
||||
### WULA_Safe_Box_For_Mission.comps.CompUsable.useLabel
|
||||
检查保险箱···
|
||||
|
||||
### WULA_Shuttle_Autocannon.verbs.Verb_Shoot.label
|
||||
SRc-22"四叶"
|
||||
|
||||
### Wula_Sonar_Mine_Cleanzone.comps.CompCustomRadius.description
|
||||
在该建筑空降到指定地点时,地雷能够监测敌军动向的最大射程。
|
||||
|
||||
### Wula_Sonar_Mine_Cleanzone.comps.CompCustomRadius.label
|
||||
感应射程
|
||||
|
||||
### WULA_Sow_Excavator_Cleanzone.comps.CompCustomRadius.description
|
||||
钻机降落后,地震波影响的最大范围
|
||||
|
||||
### WULA_Support_AreaTeleporter.comps.CompCustomRadius.description
|
||||
区域传送器提供的传送范围
|
||||
|
||||
### WULA_Support_AreaTeleporter.comps.CompCustomRadius.label
|
||||
传送范围
|
||||
|
||||
### WULA_WeaponArmor_Productor.comps.CompOpenCustomUI-0.label
|
||||
联络行星封锁机关
|
||||
|
||||
### WULA_WeaponArmor_Productor.comps.CompOpenCustomUI-1.label
|
||||
联络「军团」
|
||||
|
||||
### WULA_WM_Alpha_Wolf_Plasma_Gun.description
|
||||
搭载于SNm-6"狼蛛"机甲的高能等离子武器,所使用的等离子射弹虽然弹速较慢,但是能引起大范围的熔融爆炸并毁灭成群敌军。
|
||||
|
||||
352
Tools/_thingdef_remaining.txt
Normal file
352
Tools/_thingdef_remaining.txt
Normal file
@@ -0,0 +1,352 @@
|
||||
### Frame_WulaDoor_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
Wula Empire堡垒的gate不仅能够抵御大量爆炸和震荡伤害,还拥有无需通电即可运转的伺服系统来增加gate通过速度。
|
||||
|
||||
### Frame_WulaShelter_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
用于保护Wula Empire战士的shelter,非常厚实并且抵抗爆炸,战士们可以越过这些shelter进行射击。
|
||||
|
||||
### Frame_WulaWall_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
Wula Empire用于建造堡垒的外壁相当厚实,能够抵御大量伤害,并且拥有气密性,可以用在飞船外壳上。
|
||||
|
||||
### Frame_Wula_AI_Heavy_Panzer_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire mothership can drop a large war machine here.
|
||||
|
||||
Panzer是Wula Empire的medium战争机械,以悬浮的方式穿梭于战场之上,使用穿透力强大的Panzer炮和导弹打击敌方,是Wula Empire前锋部队的中流砥柱。
|
||||
|
||||
### Frame_Wula_AI_Rocket_Panzer_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire mothership can drop a large war machine here.
|
||||
|
||||
Flamethrower PanzerWula Empire的medium战争机械,以悬浮的方式穿梭于战场之上,拥有车体臼炮和两具可以发射大量燃烧火箭弹的转轮导弹巢,但是未像其姊妹型号那样装备护盾。
|
||||
|
||||
### Frame_WULA_AreaTeleportBeacon.description
|
||||
Wula Empire的科技结晶之一,可以供整个area继续传送的teleport engine,它会把area内的地面、建筑、生物和散落材料等完整地移动到其他地图上。
|
||||
|
||||
### Frame_WULA_ArmedShuttleWithPocket_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire mothership can dispatch a shuttle here.
|
||||
|
||||
CVe-3"Raven"是Wula Empire用于在舰队和地表构建联系的特种穿梭机,拥有巨大的货仓和一个内部折叠的生活区,因此载重量惊人且可以在内部活动。它同时还拥有一面高反射概率的反射盾和MLt-1"Prism"涡轮激光炮 ,可以抵挡大部分袭击。
|
||||
|
||||
### Frame_Wula_Base_ATGun_Turret_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
ATt-6"Rutile"anti-vehicle turret是一种需要通电才能运转的medium防御炮塔,依靠澎湃的电磁动力发射高穿透性的炮弹。这种炮台的射速不是很高,但是穿甲能力很强,且会造成小范围溅射伤害。
|
||||
|
||||
### Frame_Wula_Base_Laser_Turret_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
MLt-1"Prism"laser turret是一种需要通电才能运转的medium防御炮塔,能够以高能激光束持续照射一个目标将其气化。装载在炮塔上的激光武器不需要预热,因此对付多个目标的效果要优于手持光束武器。
|
||||
|
||||
### Frame_Wula_Base_Mortar_Turret_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
RTt-8"Abyss"mortar turret是一种需要通电才能运转的medium防御炮塔,在远距离上连续发射高爆mortar shell。高爆mortar shell虽然弹速很慢但是可以跨越地形,适合对付仍在集结的敌群和阵地。
|
||||
|
||||
### Frame_WULA_Cat_Bunker_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
WulaKittybunker是集生产和防御为一体的坚实建筑,3只WulaKitty自律机械体会和bunker一起空降。bunker可供WulaKitty更换工作类型,并允许WulaKitty进驻使用内部武器击败来犯敌军。
|
||||
|
||||
### Frame_WULA_Charging_Station_Synth_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
Synthcharging station是一台供Wula EmpireSynth进行机体充能和改装的检修站,当Wula Synth需要充电时会优先前往此处充电。
|
||||
|
||||
### Frame_WULA_Combat_Excavator_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
DBm-6"combat excavator"是Wula Empire用于破坏阵地的excavator,从天而降部署在指定地点后,钻机将通过高速旋转的刀片引发若干次地震冲击波,随后将舱内单位一股脑放出。
|
||||
|
||||
### Frame_WULA_Cube_Productor_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
Wula Empireweaver core是一台简易的塑性构造体,只能生产一些材料,以本地加工的方式降低舰队的加工压力。
|
||||
|
||||
### Frame_Wula_DarkEnergy_Generators_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
一台使用暗物质湮灭反应提供能量的Wula Empire发电机,需要消耗暗物质作为燃料且消耗速率很高,但是拥有普通发电机望尘莫及的发电能力。为了在野战环境下随turret group一起airdrop,这种发电机的装甲层设计的非常厚实。
|
||||
|
||||
### Frame_Wula_Disturber_Turret_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
HBt-1"Magnetite"是一种需要通电才能运转的重型防御炮塔,以联装的方式装载了四门威力巨大的火山风暴炮。在暗物质武器普及的Wula Empire军队,volcano cannon族系被认为是一种落后野蛮的武备,但是从未有人质疑过其破坏力——天崩地裂、炽焰四涌,犹如四具炼狱的号角,可以在远距离上撕碎一切冲击阵地的敌军。
|
||||
|
||||
### Frame_WULA_Fake_AircraftCarrier_Beacon_Building.description
|
||||
用于向Wula Empire舰队提交资源的beacon,可以换取一支帝国攻击舰队的额外征调权,包含2艘可以发起轨道炮击的巡洋舰和1艘可以提供航空器支援的航空舰。
|
||||
|
||||
### Frame_WULA_Fake_Bomber_Beacon_Building.description
|
||||
用于向Wula Empire舰队提交资源的beacon,可以换取一台Wula Empirebomber的支援。若想调动large战机入场,需要轨道上有携带<color=#BD952F><i>机库</i></color>的战舰。
|
||||
|
||||
Wula Empire的bomber是可以进入大气层的最大的飞行载具,除了投掷功能性的烟雾弹外,也能投下大量炸弹或是发射一枚暗物质导弹夷平帝国之敌。
|
||||
|
||||
### Frame_WULA_Fake_Fighter_Drone_Building.description
|
||||
一台small无人机,装备了激光炮和汽油弹,可以为殖民地提供廉价但有效的空中支援。和那些大家伙不同,swarm drone不需要机库,并且可以通过舰队的电磁网补充能量,实现永久滞空作战。
|
||||
|
||||
### Frame_WULA_Fake_Striker_Beacon_Building.description
|
||||
用于向Wula Empire舰队提交资源的beacon,可以换取一台Wula Empirestriker的支援。若想调动large战机入场,需要轨道上有携带<color=#BD952F><i>机库</i></color>的战舰。
|
||||
|
||||
Wula Empire的striker是强大的对地支援火力,挂载了大量导弹、EMP炸弹和强大的机炮,对敌方目标实施精准收割。
|
||||
|
||||
### Frame_Wula_Fusion_Generators_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
一台依靠重核聚变进行发电的简易发电机,发电量不算太高但是发电材料很好找,只需要往里面填入石头就能发电。
|
||||
|
||||
### Frame_WULA_GlobalStorageSenderPod.description
|
||||
一个一次性的物资输送装置,可以将装载的货物发射到Wula Empire的舰队以供其使用。
|
||||
|
||||
### Frame_WULA_Machine_Recharger_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
Wula Empireunderground maintenance station是能够储存大量电量并允许所有大小类型的Wula Empire机械体进行充电的charging station,不支持Synth的充能。由于其根基埋于地下,因此不会阻碍其他殖民者和机械体在其上面的移动。
|
||||
|
||||
### Frame_WULA_MaintenancePod_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
Synthmaintenance pod是为Wula EmpireSynth设计的设施,Wula Synth需要定期进入其中进行身体机能的维护和校准,否则他们的身体会逐渐衰弱。维护需要消耗Components,同时会修理所有的伤口。
|
||||
|
||||
### Frame_Wula_Mech_Mobile_Factory_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire mothership can drop a large war machine here.
|
||||
|
||||
landstrider是Wula Empire的large战争机械,简直就是一座移动堡垒——它不仅装甲厚实、火炮林立,还能在战场上生产大量的辅助战争机械以形成坚实的弹性阵线,生来就是为了粉碎坚固的堡垒和顽强的抵抗。
|
||||
|
||||
### Frame_WULA_Mobile_Shield_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire mothership can drop a large war machine here.
|
||||
|
||||
radiant shield是Wula Empire的medium战争机械,常被用于镇压异族聚居地的暴动。它形状非常奇怪,根本分不出头在哪,但是不要因此小瞧这个机械体——它能释放强大的立场盾,在很大一片area内反射大量炮火,并且机体放射出来的辐射会严重地杀伤进入反射盾范围内的敌人。在相关permit开放后,它甚至可以支持Wula Synth使用其内置的相位场进行area传送。
|
||||
|
||||
### Frame_WULA_OrbitalTradeBeacon.description
|
||||
负责协调殖民地与轨道上的Wula Empire舰队进行材料输送的beacon,airdrop建筑会优先从beacon覆盖area吸纳资源完成airdrop。
|
||||
|
||||
### Frame_Wula_Psi_Titan_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire mothership can drop a large war machine here.
|
||||
|
||||
由Wula Empire国教所主持开发的重型灵能机械体,以折跃优雅地穿梭于炮火间,并用强大的护盾抵挡敌方射弹侵袭。该机体的内部镌刻了无数的术式环路,这使其就像一个行走的灵能发射器,可以驱使各种强大的灵能能力。
|
||||
|
||||
### Frame_Wula_Sonar_Mine.description
|
||||
一种危险的地雷,它们通常由Wula Empire的工程部队部署到战场上,拥有智能敌我识别能力,在检测到敌军活动时会将自身的战斗部直接向敌人的位置发射。
|
||||
|
||||
### Frame_Wula_Sonar_Mine_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
TAm-1"Pebble"proximity mine是一种危险的地雷,它们通常由Wula Empire的工程部队部署到战场上,拥有智能敌我识别能力,在检测到敌军活动时会将自身的战斗部直接向敌人的位置发射。
|
||||
|
||||
### Frame_WULA_Sow_Excavator_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
DSm-6"excavator"是一种通过airdrop部署的excavator,钻机可以通过高速震动将附近的土壤翻出,使得整片area变得松软易于种植。这种设备的震波杀伤力极大,工作期间切勿靠近!
|
||||
|
||||
### Frame_WULA_Table1x2c.description
|
||||
Wula Empire的table
|
||||
|
||||
### Frame_WULA_Table2x4c.description
|
||||
Wula Empire的table
|
||||
|
||||
### Frame_WULA_TradeSenderPod.description
|
||||
一个一次性的物资输送装置,用于将战利品等打包发送给Wula Empire舰队以换取白银。这些白银会存储在舰队中,而不是直接发射到殖民地。
|
||||
|
||||
### Frame_WULA_TransportPod_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
Wula Empiretransport pod是供Wula Empire殖民地居民进行移动的transport pod,本质上是把殖民者和货物发射到Wula Empire在轨道上的舰队,然后在另一个地方扔下来,所以它可以前往很远的地方。
|
||||
|
||||
### Frame_WULA_Wall_Flag_Building.description
|
||||
Wula Empire行星封锁机关的flag,没什么用但是可以宣示Wula Empire的主权。
|
||||
|
||||
### Frame_WULA_WeaponArmor_Productor_Cleanzone.description
|
||||
Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.
|
||||
|
||||
Wula Empireoperations comms console是用于联络Wula Empire母舰和工程舰并下达武器、装备订单的特殊通讯台。这些武器装备的生产不需要殖民地参与,只需要使用Wula Empire物资交换舱将材料发送给Imperial Fleet,然后根据材料数量下单即可。
|
||||
|
||||
### Techprint_Wula_Disturber_Turret_Technology.description
|
||||
这是关于研究项目“volcano cannonpermit”的Techprint。
|
||||
|
||||
Techprint的物理状态可以是从画有图样的碎纸片到先进的独立教学设备中的任意形式。不管形式如何,它们都扮演着相同的角色。它们能给你的研究员们更多的启发,关于一个有可行性的方案或者一个关于更先进设计的粗略想法。
|
||||
|
||||
你的研究员们需要有足够多的基础知识才能理解Techprint给定的科技要从何开始。只有在应用了足够多的Techprint之后,你的研究员们才能找出在特定情况下要如何细致地使用这项科技。
|
||||
|
||||
在相对应的研究项目上使用Techprint能够完成项目剩余进度的一半。此外,即使这个项目已经完成,研究员们也能够通过Techprint来增进智识技能。
|
||||
|
||||
volcano cannonpermit
|
||||
|
||||
允许殖民地申请airdrop四联装volcano cannon,以毁灭性的熔岩风暴抹去一切帝国之敌。
|
||||
|
||||
这种武备对殖民地来说是过剩的,并不是所有的殖民地都有能力拿到这个permit···
|
||||
|
||||
解锁: HBt-1"Magnetite"volcano cannon
|
||||
|
||||
### Techprint_WULA_Psi_Titan_Technology.description
|
||||
这是关于研究项目“Psititanairdroppermit”的Techprint。
|
||||
|
||||
Techprint的物理状态可以是从画有图样的碎纸片到先进的独立教学设备中的任意形式。不管形式如何,它们都扮演着相同的角色。它们能给你的研究员们更多的启发,关于一个有可行性的方案或者一个关于更先进设计的粗略想法。
|
||||
|
||||
你的研究员们需要有足够多的基础知识才能理解Techprint给定的科技要从何开始。只有在应用了足够多的Techprint之后,你的研究员们才能找出在特定情况下要如何细致地使用这项科技。
|
||||
|
||||
在相对应的研究项目上使用Techprint能够完成项目剩余进度的一半。此外,即使这个项目已经完成,研究员们也能够通过Techprint来增进智识技能。
|
||||
|
||||
Psititanairdroppermit
|
||||
|
||||
允许殖民地申请airdropPAt-6"Psititan",Wula Empire的large灵能战争机械,可以驱使各种强大的灵能能力。
|
||||
|
||||
其用于镌刻灵能回路的核心受到国教教会严格限制,无法通过常规手段获得。
|
||||
|
||||
解锁: PAt-6"Psititan"
|
||||
|
||||
### WULA_ArmedShuttleWithPocket.comps.CompAreaDamage.toggleDescription
|
||||
CVe-3"Raven"可以启动防御设施,蒸发胆敢进入反射立场内的敌军——这同时会使得它伤害附近所有的散落物品。
|
||||
|
||||
### WULA_ArmedShuttleWithPocket.comps.CompAreaDamage.toggleLabel
|
||||
热辐射
|
||||
|
||||
### Wula_Base_ATGun_Turret_Cleanzone.comps.CompCustomRadius.description
|
||||
在该建筑空降到指定地点时,其炮台武器的最大Range。
|
||||
|
||||
### Wula_Base_Laser_Turret_Cleanzone.comps.CompCustomRadius.description
|
||||
在该建筑空降到指定地点时,其炮台武器的最大Range。
|
||||
|
||||
### WULA_Bodystocking_Black.description
|
||||
Wula EmpireSynth的贴身织物,有些微防御能力。
|
||||
|
||||
### WULA_Bodystocking_White.description
|
||||
Wula EmpireSynth的贴身织物,有些微防御能力。
|
||||
|
||||
### WULA_Cat_Bunker_Cleanzone.comps.CompCustomRadius.description
|
||||
在该建筑空降到指定地点时,其炮台武器的最大Range。
|
||||
|
||||
### WULA_Cat_Bunker_TurretGun.verbs.Verb_Shoot.label
|
||||
bunker炮塔
|
||||
|
||||
### WULA_Charge_Cube.comps.CompUsable.useLabel
|
||||
从能量核心中摄取能量
|
||||
|
||||
### WULA_Combat_Excavator_Cleanzone.comps.CompCustomRadius.description
|
||||
钻机降落后,地震波影响的最大范围
|
||||
|
||||
### Wula_DarkEnergy_Generators.comps.CompCustomRadius.description
|
||||
在不接电线的情况下,该建筑可提供的最大Power radius,可作为野战状态下的阵地构建参考。
|
||||
|
||||
### Wula_DarkEnergy_Generators_Cleanzone.comps.CompCustomRadius.description
|
||||
在不接电线的情况下,该建筑可提供的最大Power radius,可作为野战状态下的阵地构建参考。
|
||||
|
||||
### Wula_Fusion_Generators.comps.CompCustomRadius.description
|
||||
在不接电线的情况下,该建筑可提供的最大Power radius,可作为野战状态下的阵地构建参考。
|
||||
|
||||
### Wula_Fusion_Generators_Cleanzone.comps.CompCustomRadius.description
|
||||
在不接电线的情况下,该建筑可提供的最大Power radius,可作为野战状态下的阵地构建参考。
|
||||
|
||||
### WULA_Heavy_Infantry_PowerArmor_Mortar.description
|
||||
一具双联装轻型mortar,通过背挂式武器附件的形式外挂在Wula Empire重装装甲上,可以自行分析敌方的运动并进行开火——只要装甲穿着者不处于近战状态即可。
|
||||
|
||||
### WULA_Holographic_Flag_Building_Skyfaller.label
|
||||
P.I.A全息flag (landing)
|
||||
|
||||
### WULA_Latex_Catsuit.description
|
||||
Wula EmpireSynth的贴身织物,有些微防御能力。
|
||||
|
||||
### WULA_MW_Breaker_Bar.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
助推器
|
||||
|
||||
### WULA_MW_Charge_Mace.tools.1.label
|
||||
棍柄
|
||||
|
||||
### WULA_MW_Cheat_Weapon.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
伟力
|
||||
|
||||
### WULA_MW_Lance.verbs.Verb_ShootWithOffset.label
|
||||
CMl-28"铳枪"
|
||||
|
||||
### WULA_Pantyhose_Black.description
|
||||
Wula EmpireSynth的贴身织物,有些微防御能力。
|
||||
|
||||
### WULA_Pantyhose_White.description
|
||||
Wula EmpireSynth的贴身织物,有些微防御能力。
|
||||
|
||||
### Wula_Psi_Titan_Beam.verbs.Verb_ShootBeamExplosive.label
|
||||
KLb-15 "方解石"
|
||||
|
||||
### WULA_RW_AutoCannon.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
EMP榴弹
|
||||
|
||||
### WULA_RW_AutoCannon.verbs.Verb_ShootWithOffset.label
|
||||
FLm-78"萤石"
|
||||
|
||||
### WULA_RW_Auto_GL.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
烟雾弹
|
||||
|
||||
### WULA_RW_Auto_GL.verbs.Verb_Shoot.label
|
||||
SEl-78"角砾岩"
|
||||
|
||||
### WULA_RW_Base_AR.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
眩光弹
|
||||
|
||||
### WULA_RW_Base_AR.verbs.Verb_ShootWithOffset.label
|
||||
DLa-1"页岩"
|
||||
|
||||
### WULA_RW_Base_Loitering_Munition.comps.CompEquippableAbilityReloadable.chargeNoun
|
||||
引导系统
|
||||
|
||||
### WULA_RW_Base_Loitering_Munition.verbs.Verb_Shoot.label
|
||||
WLl-35"沸石"
|
||||
|
||||
### WULA_RW_Beam_Base_AR.verbs.Verb_ShootWithOffset.label
|
||||
SLb-3"星岚"
|
||||
|
||||
### WULA_RW_Fractal_RF.verbs.Verb_ShootWithOffset.label
|
||||
SLr-14"蓝锥"
|
||||
|
||||
### WULA_RW_Handle_Cannon.verbs.Verb_ShootBeamExplosive.label
|
||||
KRc-7"熔岩"
|
||||
|
||||
### WULA_RW_Penetrating_Beam_Rifle.verbs.Verb_ShootShotgun.label
|
||||
MLr-15 "三叉戟"(分光)
|
||||
|
||||
### WULA_RW_Penetrating_Beam_Rifle_Ranged.verbs.Verb_Shoot.label
|
||||
SLb-15 "三叉戟"
|
||||
|
||||
### WULA_RW_Sphene_MG.verbs.Verb_ShootWithOffset.label
|
||||
FLm-43"榍石"
|
||||
|
||||
### WULA_RW_StarDrift_SG.verbs.Verb_ShootShotgunWithOffset.label
|
||||
DCs-7"黑曜石"
|
||||
|
||||
### WULA_RW_SuperLongRange_RF.verbs.Verb_ShootWithOffset.label
|
||||
SRr-3"鸣石"
|
||||
|
||||
### WULA_RW_Unlimit_Penetrating_Beam_Cannon.verbs.Verb_Excalibur.label
|
||||
UPb-00 "贯杀炮"
|
||||
|
||||
### WULA_Safe_Box_For_Mission.comps.CompUsable.useLabel
|
||||
检查保险箱···
|
||||
|
||||
### WULA_Shuttle_Autocannon.verbs.Verb_Shoot.label
|
||||
SRc-22"四叶"
|
||||
|
||||
### Wula_Sonar_Mine_Cleanzone.comps.CompCustomRadius.description
|
||||
在该建筑空降到指定地点时,地雷能够监测敌军动向的最大Range。
|
||||
|
||||
### Wula_Sonar_Mine_Cleanzone.comps.CompCustomRadius.label
|
||||
感应Range
|
||||
|
||||
### WULA_Sow_Excavator_Cleanzone.comps.CompCustomRadius.description
|
||||
钻机降落后,地震波影响的最大范围
|
||||
|
||||
### WULA_Support_AreaTeleporter.comps.CompCustomRadius.description
|
||||
area传送器提供的传送范围
|
||||
|
||||
### WULA_Support_AreaTeleporter.comps.CompCustomRadius.label
|
||||
传送范围
|
||||
|
||||
### WULA_WeaponArmor_Productor.comps.CompOpenCustomUI-0.label
|
||||
联络行星封锁机关
|
||||
|
||||
### WULA_WeaponArmor_Productor.comps.CompOpenCustomUI-1.label
|
||||
联络「军团」
|
||||
|
||||
### WULA_WM_Alpha_Wolf_Plasma_Gun.description
|
||||
搭载于SNm-6"狼蛛"机甲的高能等离子武器,所使用的等离子射弹虽然弹速较慢,但是能引起大范围的熔融爆炸并毁灭成群敌军。
|
||||
|
||||
94
Tools/definject_eventdef_todo_from_export.py
Normal file
94
Tools/definject_eventdef_todo_from_export.py
Normal file
@@ -0,0 +1,94 @@
|
||||
import argparse
|
||||
import glob
|
||||
import os
|
||||
import xml.etree.ElementTree as ET
|
||||
from pathlib import Path
|
||||
from xml.sax.saxutils import escape
|
||||
|
||||
|
||||
def load_language_data_files(folder: Path) -> dict[str, ET.Element]:
|
||||
merged: dict[str, ET.Element] = {}
|
||||
for file_path in glob.glob(str(folder / "**" / "*.xml"), recursive=True):
|
||||
try:
|
||||
root = ET.parse(file_path).getroot()
|
||||
except Exception:
|
||||
continue
|
||||
if root.tag != "LanguageData":
|
||||
continue
|
||||
for child in list(root):
|
||||
merged[child.tag] = child
|
||||
return merged
|
||||
|
||||
|
||||
def element_text_or_empty(elem: ET.Element | None) -> str:
|
||||
if elem is None:
|
||||
return ""
|
||||
return (elem.text or "").strip()
|
||||
|
||||
|
||||
def build_output_lines(export_root: ET.Element, existing_map: dict[str, ET.Element]) -> list[str]:
|
||||
lines = ['<?xml version="1.0" encoding="utf-8"?>', "<LanguageData>"]
|
||||
|
||||
for export_elem in list(export_root):
|
||||
key = export_elem.tag
|
||||
is_list = len(list(export_elem)) > 0
|
||||
|
||||
if not is_list:
|
||||
existing = existing_map.get(key)
|
||||
value = element_text_or_empty(existing) if existing is not None else "TODO"
|
||||
lines.append(f" <{key}>{escape(value, entities={'\"': '"'})}</{key}>")
|
||||
continue
|
||||
|
||||
# List value: expect <li> children in export.
|
||||
existing = existing_map.get(key)
|
||||
if existing is not None and len(list(existing)) > 0:
|
||||
items = [(li.text or "") for li in list(existing)]
|
||||
else:
|
||||
# Try to reconstruct from indexed keys like foo.descriptions.0, foo.descriptions.1 ...
|
||||
items = []
|
||||
prefix = key + "."
|
||||
idx = 0
|
||||
while True:
|
||||
indexed_key = f"{prefix}{idx}"
|
||||
indexed_elem = existing_map.get(indexed_key)
|
||||
if indexed_elem is None:
|
||||
break
|
||||
items.append(element_text_or_empty(indexed_elem))
|
||||
idx += 1
|
||||
|
||||
if not items:
|
||||
# Keep list structure but mark TODO inside.
|
||||
items = ["TODO"]
|
||||
|
||||
lines.append(f" <{key}>")
|
||||
for item in items:
|
||||
lines.append(f" <li>{escape(item, entities={'\"': '"'})}</li>")
|
||||
lines.append(f" </{key}>")
|
||||
|
||||
lines.append("</LanguageData>")
|
||||
lines.append("")
|
||||
return lines
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--export-auto-cn", required=True, help="Path to Auto_CN.xml for WulaFallenEmpire.EventDef export")
|
||||
parser.add_argument("--existing-folder", required=True, help="Existing mod DefInjected folder for WulaFallenEmpire.EventDefs")
|
||||
parser.add_argument("--out", required=True, help="Output xml file path")
|
||||
args = parser.parse_args()
|
||||
|
||||
export_path = Path(args.export_auto_cn)
|
||||
existing_folder = Path(args.existing_folder)
|
||||
out_path = Path(args.out)
|
||||
|
||||
export_root = ET.parse(export_path).getroot()
|
||||
existing_map = load_language_data_files(existing_folder)
|
||||
|
||||
out_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
out_path.write_text("\n".join(build_output_lines(export_root, existing_map)), encoding="utf-8", newline="\n")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
|
||||
333
Tools/definject_recipe_from_export.py
Normal file
333
Tools/definject_recipe_from_export.py
Normal file
@@ -0,0 +1,333 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate RimWorld DefInjected English translations for RecipeDef from an in-game export (Auto_CN.xml).
|
||||
|
||||
This script intentionally ignores any existing English translations and rewrites output from the
|
||||
exported Chinese text, with consistent, RimWorld-ish phrasing:
|
||||
- `label` has no trailing period.
|
||||
- `jobString` is gerund-form and ends with a period.
|
||||
- `description` is a sentence and ends with a period.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import re
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
from pathlib import Path
|
||||
from xml.sax.saxutils import escape
|
||||
|
||||
|
||||
QUOTE_MAP: dict[str, str] = {
|
||||
"猫猫": "Kitty",
|
||||
"猫猫冲锋队": "Kitty Assault Squad",
|
||||
"特战猫猫": "Special Ops Kitty",
|
||||
"猫猫劳工": "Kitty Laborer",
|
||||
"突击猫猫": "Assault Kitty",
|
||||
"地堡猫猫": "Kitty Bunker",
|
||||
"灵能泰坦": "Psititan",
|
||||
"战车": "Panzer",
|
||||
"喷火战车": "Flamethrower Panzer",
|
||||
"陆行舰": "Landstrider",
|
||||
"放射盾": "Radiant Shield",
|
||||
"破墙槌": "Wallbreaker",
|
||||
"地狱牙": "Hellfang",
|
||||
"三叉戟": "Trident",
|
||||
"角砾岩": "Breccia",
|
||||
"页岩": "Shale",
|
||||
"沸石": "Zeolite",
|
||||
"萤石": "Fluorite",
|
||||
"蛭石": "Vermiculite",
|
||||
"棱晶": "Prism",
|
||||
"金红石": "Rutile",
|
||||
"深渊": "Abyss",
|
||||
"鹅卵石": "Pebble",
|
||||
"磁石": "Magnetite",
|
||||
"链锯剑": "Chainsaw Sword",
|
||||
"钉头锤": "Spiked Mace",
|
||||
"装修锤": "Constructor Hammer",
|
||||
"铳枪": "Gunlance",
|
||||
"星岚": "Stellar Haze",
|
||||
"蓝锥": "Blue Cone",
|
||||
"熔岩": "Lava",
|
||||
"榍石": "Sphene",
|
||||
"黑曜石": "Obsidian",
|
||||
"鸣石": "Phonolite",
|
||||
"磷灰": "Apatite",
|
||||
}
|
||||
|
||||
|
||||
TERM_MAP: dict[str, str] = {
|
||||
"乌拉帝国": "Wula Empire ",
|
||||
"机械乌拉": "Wula synth",
|
||||
"合成人": "synth",
|
||||
"冲锋队帽子": "Assault Trooper helmet",
|
||||
"冲锋队装甲": "Assault Trooper armor",
|
||||
"冲锋队": "Assault Trooper ",
|
||||
"重装": "Heavy ",
|
||||
"头盔": "helmet",
|
||||
"装甲": "armor",
|
||||
"帽子": "hat",
|
||||
"连身黑丝": "black bodystocking",
|
||||
"连身白丝": "white bodystocking",
|
||||
"黑丝裤袜": "black pantyhose",
|
||||
"白丝裤袜": "white pantyhose",
|
||||
"女仆装": "maid outfit",
|
||||
"女仆发带": "maid headband",
|
||||
"黑色紧身衣": "black catsuit",
|
||||
"内舱壁墙": "bulkhead wall",
|
||||
"堡垒墙": "fortress wall",
|
||||
"微型传送装置": "Mini-Jumpdrive",
|
||||
"编织体": "weaver core",
|
||||
"零部件": "components",
|
||||
"精密装配台": "fabrication bench",
|
||||
"能源核心": "energy core",
|
||||
"充能": "recharge",
|
||||
"化合燃料": "chemfuel",
|
||||
"暗物质": "dark matter",
|
||||
"封装的暗物质": "packaged dark matter",
|
||||
"暗物质约束装置": "dark matter containment device",
|
||||
"暗物质武器": "dark-matter weapons",
|
||||
"大型设施": "large installations",
|
||||
"武备": "armaments",
|
||||
"关机": "shut down",
|
||||
"开机": "power up",
|
||||
"殖民者": "colonist",
|
||||
"合金": "alloy",
|
||||
"零素": "neutronium",
|
||||
"冠军甲胄": "champion armor",
|
||||
"茄子帽": "eggplant hat",
|
||||
"盾牌": "shield",
|
||||
}
|
||||
|
||||
|
||||
CUSTOM_SUMMARY_MAP = {
|
||||
"金属": "Metal",
|
||||
"纤维": "Textile",
|
||||
}
|
||||
|
||||
|
||||
OVERRIDES_BY_TAG: dict[str, str] = {
|
||||
"Make_Component_By_WULA_Cube_Productor.description": (
|
||||
"Make components using the Wula Empire weaver core. Takes longer and costs more resources "
|
||||
"than the fabrication bench."
|
||||
),
|
||||
"Make_WULA_Charge_Cube.description": (
|
||||
"Make a Wula Empire energy core, including a rechargeable capacitor and the energy needed "
|
||||
"to power machinery. This is the only acceptable external energy source for Wula synths, "
|
||||
"and a precursor for many Wula Empire products."
|
||||
),
|
||||
"Make_WULA_Dark_Matter_Item.description": (
|
||||
"Make 1 packaged dark matter, composed of a dark matter containment device and dark matter. "
|
||||
"A required energy source for Wula Empire large installations and armaments."
|
||||
),
|
||||
"Make_WULA_Alloy.description": (
|
||||
"A high-density alloy processed from steel. A raw material for many Wula Empire products."
|
||||
),
|
||||
"Make_WULA_Alloy_Group.description": (
|
||||
"A high-density alloy processed from steel. A raw material for many Wula Empire products."
|
||||
),
|
||||
"Make_WULA_Neutronium.description": (
|
||||
"Make 1 neutronium. A powerful material that can be used to forge the hardest armor or the strongest melee weapons."
|
||||
),
|
||||
"WULA_Build_Wula_Synth.description": (
|
||||
"Build a URa-00 \"Wula synth\". Wula synths are the main population of Wula Empire synth colonies, "
|
||||
"and as machines they also possess complex, lifelike simulated emotions."
|
||||
),
|
||||
"WULA_Shutdown_Synth.description": (
|
||||
"Shut down all systems of this Wula synth to avoid potential risks for a while. "
|
||||
"A colonist must assist with the shutdown, and powering it back up also requires a colonist."
|
||||
),
|
||||
"Recharge_WULA_Charge_Cube.description": "Use chemfuel to recharge a depleted Wula Empire energy core.",
|
||||
"Recharge_WULA_Charge_Cube.jobString": "Recharging energy core.",
|
||||
"Recharge_WULA_Charge_Cube.label": "Recharge energy core",
|
||||
"Recharge_WULA_Charge_Cube_Group.description": "Use chemfuel to recharge depleted Wula Empire energy cores.",
|
||||
"Recharge_WULA_Charge_Cube_Group.jobString": "Recharging energy cores.",
|
||||
"Recharge_WULA_Charge_Cube_Group.label": "Recharge energy core (x4)",
|
||||
"WULA_Build_Mech_WULA_Cat.description": "Build a CAt-11 \"Kitty\".",
|
||||
"WULA_Build_Mech_WULA_Cat_Assault.description": "Build a CAt-46 \"Kitty Assault Squad\".",
|
||||
"WULA_Build_Mech_WULA_Cat_Constructor.description": "Build a CAt-86 \"Kitty Laborer\".",
|
||||
"WULA_Shutdown_Synth.jobString": "Emergency shutdown.",
|
||||
"WULA_Shutdown_Synth.label": "Emergency shutdown",
|
||||
"WULA_Synth_Power_On.description": "Restart this synth and restore system operation.",
|
||||
"WULA_Synth_Power_On.jobString": "Restarting synth.",
|
||||
"WULA_Synth_Power_On.successfullyRemovedHediffMessage": "{0} successfully restarted {1}.",
|
||||
}
|
||||
|
||||
|
||||
def _replace_quoted_terms(text: str) -> str:
|
||||
def repl(match: re.Match[str]) -> str:
|
||||
inner = match.group(1)
|
||||
return '"' + QUOTE_MAP.get(inner, inner) + '"'
|
||||
|
||||
return re.sub(r"\"([^\"]+)\"", repl, text)
|
||||
|
||||
|
||||
def _apply_term_map(text: str) -> str:
|
||||
out = text
|
||||
for zh, en in sorted(TERM_MAP.items(), key=lambda kv: len(kv[0]), reverse=True):
|
||||
out = out.replace(zh, en)
|
||||
out = re.sub(r"\s+", " ", out).strip()
|
||||
return out
|
||||
|
||||
|
||||
def _ensure_period(sentence: str) -> str:
|
||||
s = sentence.strip()
|
||||
if not s:
|
||||
return s
|
||||
if s.endswith((".", "!", "?")):
|
||||
return s
|
||||
return s + "."
|
||||
|
||||
|
||||
def _strip_zh_period(text: str) -> str:
|
||||
return text.strip().removesuffix("。")
|
||||
|
||||
|
||||
def translate_value(tag: str, cn: str) -> str:
|
||||
cn = (cn or "").replace("\r", "").strip()
|
||||
if not cn:
|
||||
return ""
|
||||
|
||||
if tag.endswith(".filter.customSummary"):
|
||||
return CUSTOM_SUMMARY_MAP.get(cn, cn)
|
||||
|
||||
if tag in OVERRIDES_BY_TAG:
|
||||
return OVERRIDES_BY_TAG[tag]
|
||||
|
||||
cn = cn.replace("(10块)", " (x10)")
|
||||
cn = cn.replace("(无面罩)", "(No mask)")
|
||||
cn = cn.replace(" (周)", " (Weekly)")
|
||||
cn = cn.replace("(周)", "(Weekly)")
|
||||
cn = cn.replace("(4个)", " (x4)")
|
||||
|
||||
cn = _replace_quoted_terms(cn)
|
||||
cn = _apply_term_map(cn)
|
||||
|
||||
def strip_counters(x: str) -> str:
|
||||
x = x.strip()
|
||||
for prefix in ("一个", "一台", "1份", "1个", "1台"):
|
||||
if x.startswith(prefix):
|
||||
x = x[len(prefix) :].strip()
|
||||
return x
|
||||
|
||||
def render(action: str, x: str) -> str:
|
||||
x = strip_counters(x)
|
||||
if action == "install":
|
||||
if tag.endswith(".label"):
|
||||
return f"Install {x}"
|
||||
if tag.endswith(".jobString"):
|
||||
return _ensure_period(f"Installing {x}")
|
||||
if tag.endswith(".description"):
|
||||
return _ensure_period(f"Install a {x}")
|
||||
if action == "make":
|
||||
if tag.endswith(".label"):
|
||||
return f"Make {x}"
|
||||
if tag.endswith(".jobString"):
|
||||
return _ensure_period(f"Making {x}")
|
||||
if tag.endswith(".description"):
|
||||
return _ensure_period(f"Make {x}")
|
||||
if action == "recharge":
|
||||
if tag.endswith(".label"):
|
||||
return f"Recharge {x}"
|
||||
if tag.endswith(".jobString"):
|
||||
return _ensure_period(f"Recharging {x}")
|
||||
if tag.endswith(".description"):
|
||||
return _ensure_period(f"Recharge {x}")
|
||||
if action == "forge":
|
||||
if tag.endswith(".label"):
|
||||
return f"Forge {x}"
|
||||
if tag.endswith(".jobString"):
|
||||
return _ensure_period(f"Forging {x}")
|
||||
if tag.endswith(".description"):
|
||||
return _ensure_period(f"Forge {x}")
|
||||
if action == "compress":
|
||||
if tag.endswith(".label"):
|
||||
return f"Compress {x}"
|
||||
if tag.endswith(".jobString"):
|
||||
return _ensure_period(f"Compressing {x}")
|
||||
if tag.endswith(".description"):
|
||||
return _ensure_period(f"Compress {x}")
|
||||
if action == "build":
|
||||
if tag.endswith(".label"):
|
||||
return f"Build {x}"
|
||||
if tag.endswith(".jobString"):
|
||||
return _ensure_period(f"Building {x}")
|
||||
if tag.endswith(".description"):
|
||||
return _ensure_period(f"Build {x}")
|
||||
if action == "shutdown":
|
||||
if tag.endswith(".label"):
|
||||
return f"Shut down {x}"
|
||||
if tag.endswith(".jobString"):
|
||||
return _ensure_period(f"Shutting down {x}")
|
||||
if tag.endswith(".description"):
|
||||
return _ensure_period(f"Shut down {x}")
|
||||
return x
|
||||
|
||||
patterns: list[tuple[re.Pattern[str], str]] = [
|
||||
(re.compile(r"^安装一个(.+?)。?$"), "install"),
|
||||
(re.compile(r"^安装(.+?)$"), "install"),
|
||||
(re.compile(r"^正在安装(.+?)。?$"), "install"),
|
||||
(re.compile(r"^制作(.+?)。?$"), "make"),
|
||||
(re.compile(r"^正在制作(.+?)。?$"), "make"),
|
||||
(re.compile(r"^制造(.+?)。?$"), "make"),
|
||||
(re.compile(r"^正在制造(.+?)。?$"), "make"),
|
||||
(re.compile(r"^充能(.+?)$"), "recharge"),
|
||||
(re.compile(r"^正在为(.+?)充能。?$"), "recharge"),
|
||||
(re.compile(r"^锻造(.+?)。?$"), "forge"),
|
||||
(re.compile(r"^正在锻造(.+?)$"), "forge"),
|
||||
(re.compile(r"^压缩(.+?)。?$"), "compress"),
|
||||
(re.compile(r"^正在压缩(.+?)。?$"), "compress"),
|
||||
(re.compile(r"^建造(.+?)。?$"), "build"),
|
||||
(re.compile(r"^正在建造(.+?)。?$"), "build"),
|
||||
(re.compile(r"^将(.+?)的所有系统关闭.*$"), "shutdown"),
|
||||
]
|
||||
|
||||
for rx, action in patterns:
|
||||
m = rx.match(cn)
|
||||
if m:
|
||||
x = m.group(1).strip()
|
||||
return render(action, x)
|
||||
|
||||
# Fallback handling for labels/jobStrings/descriptions:
|
||||
if tag.endswith(".label"):
|
||||
return _strip_zh_period(cn)
|
||||
if tag.endswith(".jobString"):
|
||||
return _ensure_period(cn)
|
||||
if tag.endswith(".description"):
|
||||
return _ensure_period(cn)
|
||||
return cn
|
||||
|
||||
|
||||
def build_language_data_xml(tags_and_text: list[tuple[str, str]]) -> str:
|
||||
lines = ['<?xml version="1.0" encoding="utf-8"?>', "<LanguageData>"]
|
||||
for tag, value in tags_and_text:
|
||||
escaped_value = escape(value, entities={"\"": """})
|
||||
lines.append(f" <{tag}>{escaped_value}</{tag}>")
|
||||
lines.append("</LanguageData>")
|
||||
lines.append("")
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def main(argv: list[str]) -> int:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--export-auto-cn", required=True, help="Path to Auto_CN.xml for RecipeDef export")
|
||||
parser.add_argument("--out", required=True, help="Output xml file path")
|
||||
args = parser.parse_args(argv)
|
||||
|
||||
export_path = Path(args.export_auto_cn)
|
||||
out_path = Path(args.out)
|
||||
|
||||
root = ET.parse(export_path).getroot()
|
||||
tags_and_text: list[tuple[str, str]] = []
|
||||
for elem in list(root):
|
||||
tags_and_text.append((elem.tag, translate_value(elem.tag, elem.text or "")))
|
||||
|
||||
out_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
out_path.write_text(build_language_data_xml(tags_and_text), encoding="utf-8", newline="\n")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main(sys.argv[1:]))
|
||||
286
Tools/definject_thingdef_from_export.py
Normal file
286
Tools/definject_thingdef_from_export.py
Normal file
@@ -0,0 +1,286 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate/normalize RimWorld DefInjected translations for ThingDef using an in-game export.
|
||||
|
||||
Workflow (this repo):
|
||||
1) Use the in-game exporter to produce Auto_CN.xml (Chinese strings) for ThingDef.
|
||||
2) Run this script to:
|
||||
- prune existing mod ThingDefs/*.xml to the export keyset (removes "extra" keys),
|
||||
- generate a new ZZZ_* file containing all "missing" keys translated to English (best-effort).
|
||||
|
||||
NOTE: The translation here is heuristic and intended to reduce manual work. Any remaining
|
||||
Chinese text can be found via grep and fixed by hand.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import re
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
_CJK_RE = re.compile(r"[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]")
|
||||
|
||||
|
||||
_TERM_MAP = {
|
||||
"乌拉帝国": "Wula Empire",
|
||||
"乌拉": "Wula",
|
||||
"合成人": "synth",
|
||||
"充电站": "charging station",
|
||||
"维护舱": "maintenance pod",
|
||||
"地下维护站": "underground maintenance station",
|
||||
"轨道输送信标": "orbital transfer beacon",
|
||||
"运输舱": "transport pod",
|
||||
"物资输送舱": "supply pod",
|
||||
"物资回收舱": "recovery pod",
|
||||
"大门": "gate",
|
||||
"地板": "floor",
|
||||
"堡垒墙": "fortress wall",
|
||||
"掩体": "shelter",
|
||||
"暗物质发电机": "dark matter generator",
|
||||
"聚变发电机": "fusion generator",
|
||||
"火山炮": "volcano cannon",
|
||||
"反战车炮塔": "anti-vehicle turret",
|
||||
"激光炮塔": "laser turret",
|
||||
"迫击炮塔": "mortar turret",
|
||||
"预制件": "prefab",
|
||||
"空投": "airdrop",
|
||||
"信标": "beacon",
|
||||
"碉堡": "bunker",
|
||||
"要塞": "fortress",
|
||||
"大型": "large",
|
||||
"小型": "small",
|
||||
"前哨站": "outpost",
|
||||
"炮塔群": "turret group",
|
||||
"地堡": "bunker",
|
||||
"感应地雷": "proximity mine",
|
||||
"跃迁引擎": "teleport engine",
|
||||
"编织体": "weaver core",
|
||||
"作业通讯台": "operations comms console",
|
||||
"挖掘机": "excavator",
|
||||
"战斗挖掘机": "combat excavator",
|
||||
"陆行舰": "landstrider",
|
||||
"放射盾": "radiant shield",
|
||||
"灵能泰坦": "Psititan",
|
||||
"蛭石": "Vermiculite",
|
||||
"巡飞弹": "loitering munition",
|
||||
"猫猫": "Kitty",
|
||||
"猫猫冲锋队": "Kitty Assault Squad",
|
||||
"特战猫猫": "Special Ops Kitty",
|
||||
"猫猫劳工": "Kitty Laborer",
|
||||
"突击猫猫": "Assault Kitty",
|
||||
"兵蚁": "Ant Trooper",
|
||||
"战车": "Panzer",
|
||||
"喷火战车": "Flamethrower Panzer",
|
||||
"渡鸦": "Raven",
|
||||
"金红石": "Rutile",
|
||||
"棱晶": "Prism",
|
||||
"深渊": "Abyss",
|
||||
"鹅卵石": "Pebble",
|
||||
"磁石": "Magnetite",
|
||||
"奇怪的": "Strange",
|
||||
"空投区": "drop zone",
|
||||
"区域": "area",
|
||||
"中型": "medium",
|
||||
"微型": "mini",
|
||||
"突击护航舰": "assault escort ship",
|
||||
"桌子": "table",
|
||||
"旗帜": "flag",
|
||||
"帝国舰队": "Imperial Fleet",
|
||||
"轰炸机": "bomber",
|
||||
"蜂群无人机": "swarm drone",
|
||||
"攻击机": "striker",
|
||||
"迫击炮弹": "mortar shell",
|
||||
"迫击炮": "mortar",
|
||||
"等离子体": "plasma",
|
||||
"爆弹": "blast round",
|
||||
"铬铁": "chromite",
|
||||
"磷灰": "apatite",
|
||||
"机械乌拉": "Wula synth",
|
||||
"神人大鹅": "Legendary Goose",
|
||||
"落地中": "landing",
|
||||
"建造中": "building",
|
||||
"科研蓝图": "Techprint",
|
||||
"许可": "permit",
|
||||
"安装隐藏式天线": "Install concealed antenna",
|
||||
"帝国攻击舰队已抵达": "Imperial strike fleet has arrived",
|
||||
"帝国巡洋舰已抵达": "Imperial cruiser has arrived",
|
||||
"帝国母舰已抵达": "Imperial mothership has arrived",
|
||||
"帝国攻击舰队响应请求抵达殖民地上空!": "The Imperial strike fleet has arrived above the colony in response to your request!",
|
||||
"一艘帝国巡洋舰响应请求抵达殖民地上空!": "An Imperial cruiser has arrived above the colony in response to your request!",
|
||||
"一艘帝国母舰响应请求抵达殖民地上空!": "An Imperial mothership has arrived above the colony in response to your request!",
|
||||
"射程": "Range",
|
||||
"冲击半径": "Impact radius",
|
||||
"供电半径": "Power radius",
|
||||
"暗物质燃料": "Dark matter fuel",
|
||||
"需要填入封装的暗物质": "Requires packaged dark matter.",
|
||||
"石块": "Stone chunks",
|
||||
"需要填入石块": "Requires stone chunks.",
|
||||
"零部件": "Components",
|
||||
"磁力光束": "Magnetic beam",
|
||||
"双子魔眼": "Twin Demon Eyes",
|
||||
"魔眼": "Demon Eye",
|
||||
"月长石": "Moonstone",
|
||||
"青金石": "Lapis Lazuli",
|
||||
"火欧泊": "Fire Opal",
|
||||
"铱锇": "Iridosmium",
|
||||
"晶丛": "Crystal Cluster",
|
||||
"陨磷": "Meteoric Phosphorus",
|
||||
"横扫": "Sweep",
|
||||
"链锯": "Chainsaw",
|
||||
"槌头": "Hammerhead",
|
||||
"无法接触。": "Cannot be reached.",
|
||||
}
|
||||
|
||||
|
||||
def _title_case_simple(text: str) -> str:
|
||||
return " ".join(w[:1].upper() + w[1:] if w else "" for w in text.split())
|
||||
|
||||
|
||||
def _apply_term_map(text: str) -> str:
|
||||
out = text
|
||||
for cn, en in sorted(_TERM_MAP.items(), key=lambda kv: len(kv[0]), reverse=True):
|
||||
out = out.replace(cn, en)
|
||||
return out
|
||||
|
||||
|
||||
def translate_cn_to_en(text: str) -> str:
|
||||
raw = (text or "").replace("\r", "").strip()
|
||||
if not raw:
|
||||
return ""
|
||||
|
||||
# Already English-ish or code; keep.
|
||||
if not _CJK_RE.search(raw):
|
||||
return raw
|
||||
|
||||
# Blueprint labels: X(蓝图) -> X (Blueprint)
|
||||
raw = raw.replace("(蓝图)", " (Blueprint)")
|
||||
raw = raw.replace("(建造中)", " (building)")
|
||||
raw = raw.replace("(落地中)", " (landing)")
|
||||
|
||||
# Corpse labels: "...尸体" -> "Corpse of ..."
|
||||
if raw.endswith("尸体") and "的尸体" not in raw:
|
||||
name = raw.removesuffix("尸体")
|
||||
name = _apply_term_map(name).strip()
|
||||
return f"Corpse of {name}"
|
||||
|
||||
# Corpse descriptions: "...的尸体。" -> "The corpse of ..."
|
||||
if raw.endswith("的尸体。"):
|
||||
name = raw.removesuffix("的尸体。")
|
||||
name = _apply_term_map(name)
|
||||
return f"The corpse of {name}."
|
||||
|
||||
# Common frame instruction prefix.
|
||||
raw = raw.replace(
|
||||
"清理出一块场地并准备好资源,使得乌拉帝国可以向此处投放建筑。",
|
||||
"Clear a landing zone and prepare the resources so the Wula Empire can airdrop a building here.",
|
||||
)
|
||||
raw = raw.replace(
|
||||
"清理出一块场地并准备好资源,使得乌拉帝国母舰可以向此处投放大型战争机械。",
|
||||
"Clear a landing zone and prepare the resources so the Wula Empire mothership can drop a large war machine here.",
|
||||
)
|
||||
raw = raw.replace(
|
||||
"清理出一块场地并准备好资源,使得乌拉帝国母舰可以向此处派遣一艘穿梭机。",
|
||||
"Clear a landing zone and prepare the resources so the Wula Empire mothership can dispatch a shuttle here.",
|
||||
)
|
||||
|
||||
# Per-line term substitutions.
|
||||
lines = raw.split("\n")
|
||||
lines = [_apply_term_map(line) for line in lines]
|
||||
out = "\n".join(lines)
|
||||
|
||||
# Quick polish for a few common lowercase nouns after mapping.
|
||||
out = out.replace("Wula Empire synth", "Wula Empire synth")
|
||||
out = out.replace("synth", "Synth")
|
||||
out = out.replace("comms", "comms")
|
||||
|
||||
return out
|
||||
|
||||
|
||||
def parse_langdata(path: Path) -> dict[str, str]:
|
||||
root = ET.parse(path).getroot()
|
||||
return {c.tag: (c.text or "") for c in root}
|
||||
|
||||
|
||||
def write_langdata(path: Path, entries: list[tuple[str, str]]) -> None:
|
||||
root = ET.Element("LanguageData")
|
||||
for k, v in entries:
|
||||
el = ET.SubElement(root, k)
|
||||
el.text = v
|
||||
tree = ET.ElementTree(root)
|
||||
ET.indent(tree, space=" ", level=0)
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
tree.write(path, encoding="utf-8", xml_declaration=True)
|
||||
|
||||
|
||||
def main(argv: list[str]) -> int:
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--export", type=Path, required=True, help="Exported Auto_CN.xml for ThingDef")
|
||||
ap.add_argument("--mod-dir", type=Path, required=True, help="Mod Languages/English/DefInjected/ThingDefs directory")
|
||||
ap.add_argument(
|
||||
"--write-missing",
|
||||
type=Path,
|
||||
required=True,
|
||||
help="Output path for generated missing translations (ZZZ_* file recommended)",
|
||||
)
|
||||
ap.add_argument(
|
||||
"--prune-existing",
|
||||
action="store_true",
|
||||
help="Rewrite existing ThingDefs/*.xml to only keep keys present in export",
|
||||
)
|
||||
args = ap.parse_args(argv)
|
||||
|
||||
export_root = ET.parse(args.export).getroot()
|
||||
export_items = [(c.tag, (c.text or "").replace("\r", "")) for c in export_root]
|
||||
export_keys = [k for k, _ in export_items]
|
||||
export_set = set(export_keys)
|
||||
export_cn = {k: v for k, v in export_items}
|
||||
|
||||
existing_files = sorted(args.mod_dir.glob("*.xml"))
|
||||
# If regenerating the missing file, do not treat the previous output as existing input.
|
||||
existing_files = [p for p in existing_files if p.resolve() != args.write_missing.resolve()]
|
||||
existing_by_file: dict[Path, dict[str, str]] = {}
|
||||
merged_existing: dict[str, str] = {}
|
||||
|
||||
for f in existing_files:
|
||||
data = parse_langdata(f)
|
||||
existing_by_file[f] = data
|
||||
# simulate in-game merge by filename order
|
||||
for k, v in data.items():
|
||||
merged_existing[k] = v
|
||||
|
||||
missing = [k for k in export_keys if k not in merged_existing]
|
||||
extra = sorted([k for k in merged_existing.keys() if k not in export_set])
|
||||
|
||||
print(f"export_keys={len(export_keys)} present={len(export_keys)-len(missing)} missing={len(missing)} extra={len(extra)}")
|
||||
|
||||
if args.prune_existing and extra:
|
||||
for f, data in existing_by_file.items():
|
||||
kept = [(k, v) for k, v in data.items() if k in export_set]
|
||||
if len(kept) == len(data):
|
||||
continue
|
||||
write_langdata(f, kept)
|
||||
print(f"pruned_existing_files={sum(1 for f,d in existing_by_file.items() if any(k not in export_set for k in d))}")
|
||||
|
||||
missing_entries: list[tuple[str, str]] = []
|
||||
for k in export_keys:
|
||||
if k not in merged_existing:
|
||||
missing_entries.append((k, translate_cn_to_en(export_cn.get(k, ""))))
|
||||
|
||||
write_langdata(args.write_missing, missing_entries)
|
||||
print(f"wrote_missing_file={args.write_missing} missing_entries={len(missing_entries)}")
|
||||
|
||||
# Warn if any CJK remains.
|
||||
remain = [(k, v) for k, v in missing_entries if _CJK_RE.search(v or "")]
|
||||
print(f"missing_entries_with_cjk={len(remain)}")
|
||||
for k, v in remain[:20]:
|
||||
snippet = (v or "").strip().replace("\n", "\\n")
|
||||
print(f"CJK {k} -> {snippet[:120]}")
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main(sys.argv[1:]))
|
||||
72
Tools/sync_backstory_translations.py
Normal file
72
Tools/sync_backstory_translations.py
Normal file
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Sync/repair BackstoryDef DefInjected English files by copying known-good strings from:
|
||||
- AlienRace.AlienBackstoryDef translation file (for backstory titles/descriptions)
|
||||
- HediffDefs translation file (for *_Hediff.* entries)
|
||||
|
||||
This fixes mojibake/untranslated fragments in older BackstoryDefs/Solid files.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def read_langdata(path: Path) -> dict[str, str]:
|
||||
root = ET.parse(path).getroot()
|
||||
return {c.tag: (c.text or "") for c in root}
|
||||
|
||||
|
||||
def write_langdata(path: Path, mapping: dict[str, str], keep_order_from: list[str]) -> None:
|
||||
root = ET.Element("LanguageData")
|
||||
for tag in keep_order_from:
|
||||
el = ET.SubElement(root, tag)
|
||||
el.text = mapping.get(tag, "")
|
||||
tree = ET.ElementTree(root)
|
||||
ET.indent(tree, space=" ", level=0)
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
tree.write(path, encoding="utf-8", xml_declaration=True)
|
||||
|
||||
|
||||
def main(argv: list[str]) -> int:
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--alien-backstories", type=Path, required=True)
|
||||
ap.add_argument("--hediff", type=Path, required=True)
|
||||
ap.add_argument("--solid-child", type=Path, required=True)
|
||||
ap.add_argument("--solid-adult", type=Path, required=True)
|
||||
args = ap.parse_args(argv)
|
||||
|
||||
alien = read_langdata(args.alien_backstories)
|
||||
hediff = read_langdata(args.hediff)
|
||||
|
||||
def sync_file(path: Path, special_hediff: bool) -> int:
|
||||
root = ET.parse(path).getroot()
|
||||
tags = [c.tag for c in root]
|
||||
updated = 0
|
||||
out = {}
|
||||
for t in tags:
|
||||
if special_hediff and ("_Hediff." in t) and (t in hediff):
|
||||
out[t] = hediff[t]
|
||||
updated += 1
|
||||
continue
|
||||
if t in alien:
|
||||
out[t] = alien[t]
|
||||
updated += 1
|
||||
continue
|
||||
# keep original if no source found
|
||||
out[t] = (root.find(t).text or "") if root.find(t) is not None else ""
|
||||
write_langdata(path, out, tags)
|
||||
return updated
|
||||
|
||||
u1 = sync_file(args.solid_child, special_hediff=True)
|
||||
u2 = sync_file(args.solid_adult, special_hediff=False)
|
||||
print(f"updated_solid_child={u1} updated_solid_adult={u2}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main(sys.argv[1:]))
|
||||
|
||||
Reference in New Issue
Block a user