3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 2929|回复: 10
打印 上一主题 下一主题

[原创] 创造世界!支配游戏事件!

[复制链接]

12

主题

349

帖子

1784

积分

3DM Mod站 原创组

Rank: 12Rank: 12Rank: 12

贡献度
156
金元
11602
积分
1784
精华
0
注册时间
2013-6-28

3DM MOD站(黄金)

跳转到指定楼层
主题
发表于 2020-1-1 23:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
先预告,明放详细。
游戏本身的逻辑其实是用类似lua的脚本存放在游戏目录下common文件夹下的,只需要对这些文件进行小幅度的修改就可以出现一些超出你想象的修改效果。
由于网上中文资源很少,贴吧那个代码有一些问题,所以lz踩了不少坑,最后当然是修改成功了,先放效果图
回复

使用道具 举报

12

主题

349

帖子

1784

积分

3DM Mod站 原创组

Rank: 12Rank: 12Rank: 12

贡献度
156
金元
11602
积分
1784
精华
0
注册时间
2013-6-28

3DM MOD站(黄金)

来自 2#
 楼主| 发表于 2020-1-2 23:51 | 只看该作者
本帖最后由 老猫◆尘埃 于 2020-1-2 23:53 编辑

在群星中,游戏的事件,机制等逻辑都是通过脚本进行控制,这些脚本主要集中在
STEAM库\steamapps\common\Stellaris\common

STEAM库\steamapps\common\Stellaris\events

如果英语好的玩家可以自己对应其中文件夹的名字进行翻译

工具
作为编程语言的一种,脚本语言需要正确的语法去描述逻辑,哪怕是一个符号的缺失,也会导致诸如无法开启游戏的错误发生,而记事本是不带有语法高亮的
建议先下载notepad++或者visual studio这类专有的编辑器,调整为正确的语法高亮模式,由于这个脚本之前我并没有见过,所以我使用的语法模式为lua,如果有朋友知道这是什么语言麻烦和我说一下
如果你自信自己可以不用这类辅助手段 跳过本步骤


入口
和大多数程序都带有一个main函数一样,在群星当中,游戏开始所对应的事件函数叫做on_game_start,这个函数所在的文件位于 common\on_actions\00_on_actions.txt 这个文件还拥有其他周期事件所对应的逻辑,如果你需要修改游戏本身的逻辑,可以在这里下手

以按照我添加了一个超级灵能天赋为例子,我将在下面重现操作步骤
步骤1 添加特性

特性文件位于 E:\steamLib\steamapps\common\Stellaris\common\traits 这个文件夹内文件结构如下

主要存放特性对应文件

00_admiral_traits.txt          舰长的特性

00_general_traits.txt          统治者特性

00_governor_traits.txt           元首特性

00_ruler_traits.txt              管理者特性

04_species_traits.txt              物种特性



以我的种族特性 灵能网络 为例 它被添加在物种特性文件内

trait_mental_network =
{
cost = 0                                                                                     #费用,注意 为0的费用不仅表示免费,还不会被特性数量所记录,它将会被当作类似“幸存者”这样的特性计算
potential_crossbreeding_chance = 0.25
icon = "gfx/interface/icons/traits/trait_psionic_species.dds"             #图标,这里我使用的是灵能的图标
opposites = { "" }                                                                       #冲突特性列表,括号内的特性具有时将无法选择这个特性
improves_leaders = yes
initial = yes
randomized = no
modification = no
allowed_archetypes = { BIOLOGICAL LITHOID }                           #上面几个如果不知道是啥最好照抄,不然可能会被ai偷用你的专属作弊器
odifier =                                                                                    # 提供的效果列表
{
  planet_jobs_engineering_research_produces_mult = 10                #一些非常imba的效果
  planet_jobs_physics_research_produces_mult = 10
  planet_jobs_society_research_produces_mult = 10
  pop_housing_usage_mult = -1
  leader_skill_levels = 100
  species_leader_exp_gain = 10
  pop_environment_tolerance = 0.50
  army_damage_mult = 10
  planet_jobs_worker_produces_mult = 1
  leader_age = 800
}
}                                                                                            #注意 注意 注意 一定到备份你编辑的文件,随时注意括号的对应,不然真的会损坏游戏的



然后是统治者特性

leader_trait_generic_mental_network =                                          #名字随意 不要和别的一样就行

{
cost = 0
modification = no
randomized = no                                                                        # 随即获取 不知道有什么用 跟事件有关系?禁用防止电脑偷
    improves_leaders = no
icon = "gfx/interface/icons/traits/trait_psionic_species.dds"
modifier =
{
  army_morale = 3
  army_morale_damage_mult = 3
  army_damage_mult = 2
  leader_skill_levels = 1000
  species_leader_exp_gain = 10
}
immortal_leaders = yes                 #永生效果
leader_trait = { general }
leader_class = { general }
initial = no                    #使电脑无法使用
}

舰长
对应游戏文件
leader_trait_admiral_mental_network                 #仿写特性-心灵网络
{
cost = 0
modification = no
randomized = no                                                                        # 随即获取 不知道有什么用 跟事件有关系?
    improves_leaders = no
icon = "gfx/interface/icons/traits/trait_psionic_species.dds"
modifier =
{
  ship_emergency_ftl_mult = -0.5
  ship_weapon_range_mult = 4
  ship_fire_rate_mult = 4
  ship_speed_mult = 4
  ship_hull_mult = 4
  ship_weapon_damage = 4
  ship_disengage_chance_mult = -0.25
  damage_vs_country_type_swarm_mult = 2
  ship_evasion_mult = 3
  leader_skill_levels = 1000
  species_leader_exp_gain = 10
}
immortal_leaders = yes                 #永生效果
leader_trait = { admiral }
leader_class = { admiral }
initial = no
}



统治者,实际上因为渣渣英语我到现在也不确定那个算是通用天赋,从游戏事件逻辑上看应该是ruler,但是在00_general_traits.txt内有个叫general的特性类型


leader_trait_governor_mental_network =
{
cost = 0
modification = no
randomized = no                                                                     
    improves_leaders = no
icon = "gfx/interface/icons/traits/trait_psionic_species.dds"
modifier =
{
  planet_buildings_cost_mult = -0.5
  planet_districts_cost_mult = -0.5
  planet_building_build_speed_mult = 2
  planet_stability_add = 500
  planet_jobs_unity_produces_mult = 10
  planet_jobs_energy_produces_mult = 10
  planet_jobs_minerals_produces_mult = 10
  planet_jobs_food_produces_mult = 10
  planet_jobs_engineering_research_produces_mult = 10
  planet_jobs_physics_research_produces_mult = 10
  planet_jobs_society_research_produces_mult = 10
  leader_skill_levels = 1000
  species_leader_exp_gain = 10
}
immortal_leaders = yes                 #永生效果
leader_trait = { governor }
leader_class = { governor }
initial = no                  
}


科学家的最好别抄,因为我复制的谨慎的特性,但是不知为啥,这个特性并没和其他特性一样合并在一起,而是有一堆详细效果,其实就是对应一个考古失败概率降低



leader_trait_scientist_mental_network =
{
cost = 0
modification = no
randomized = no                                                                        # 随即获取 不知道有什么用 跟事件有关系?
    improves_leaders = no
icon = "gfx/interface/icons/traits/trait_psionic_species.dds"
modifier =
{
   all_technology_research_speed = 2
   science_ship_survey_speed = 1
   vultaum_1_cat_research_speed_mult = 0.5
   VULTAUMAR_research_speed_mult = 0.5
   YUHTAAN_research_speed_mult = 0.5
   FEN_HABBANIS_research_speed_mult = 0.5
   IRASSIA_research_speed_mult = 0.5
   leader_skill_levels = 1000
   species_leader_exp_gain = 10
   vultaum_2_cat_research_speed_mult = 0.5               #没错 下面的都是复制谨慎里头的
   vultaum_3_cat_research_speed_mult = 0.5
   vultaum_4_cat_research_speed_mult = 0.5
   vultaum_5_cat_research_speed_mult = 0.5
   vultaum_6_cat_research_speed_mult = 0.5
   vultaum_7_cat_research_speed_mult = 0.5
   vultaum_8_cat_research_speed_mult = 0.5
   vultaum_9_cat_research_speed_mult = 0.5
   vultaum_10_cat_research_speed_mult = 0.5
   vultaum_11_cat_research_speed_mult = 0.5
   
   yuht_1_cat_research_speed_mult = 0.5
   yuht_2_cat_research_speed_mult = 0.5
   yuht_3_cat_research_speed_mult = 0.5
   yuht_4_cat_research_speed_mult = 0.5
   yuht_5_cat_research_speed_mult = 0.5
   yuht_6_cat_research_speed_mult = 0.5
   yuht_7_cat_research_speed_mult = 0.5
   yuht_8_cat_research_speed_mult = 0.5
   yuht_9_cat_research_speed_mult = 0.5
   
   league_1_cat_research_speed_mult = 0.5
   league_2_cat_research_speed_mult = 0.5
   league_3_cat_research_speed_mult = 0.5
   league_4_cat_research_speed_mult = 0.5
   league_5_cat_research_speed_mult = 0.5
   league_6_cat_research_speed_mult = 0.5
   league_7_cat_research_speed_mult = 0.5
   league_8_cat_research_speed_mult = 0.5
   league_9_cat_research_speed_mult = 0.5
   league_10_cat_research_speed_mult = 0.5
   league_11_cat_research_speed_mult = 0.5
   league_12_cat_research_speed_mult = 0.5
   league_13_cat_research_speed_mult = 0.5
   league_14_cat_research_speed_mult = 0.5
   
   irassian_1_cat_research_speed_mult = 0.5
   irassian_2_cat_research_speed_mult = 0.5
   irassian_3_cat_research_speed_mult = 0.5
   irassian_4_cat_research_speed_mult = 0.5
   irassian_5_cat_research_speed_mult = 0.5
   irassian_6_cat_research_speed_mult = 0.5
   irassian_7_cat_research_speed_mult = 0.5
   irassian_8_cat_research_speed_mult = 0.5
   irassian_9_cat_research_speed_mult = 0.5
   irassian_10_cat_research_speed_mult = 0.5
   irassian_11_cat_research_speed_mult = 0.5
   
   cybrex_1_cat_research_speed_mult = 0.5
   cybrex_2_cat_research_speed_mult = 0.5
   cybrex_3_cat_research_speed_mult = 0.5
   cybrex_4_cat_research_speed_mult = 0.5
   cybrex_5_cat_research_speed_mult = 0.5
   cybrex_6_cat_research_speed_mult = 0.5
   cybrex_7_cat_research_speed_mult = 0.5
   cybrex_8_cat_research_speed_mult = 0.5
   cybrex_9_cat_research_speed_mult = 0.5
   cybrex_10_cat_research_speed_mult = 0.5
   cybrex_11_cat_research_speed_mult = 0.5
   
   
}
immortal_leaders = yes                 #永生效果
leader_trait = { scientist }
leader_class = { scientist }
initial = no                    #这两处使电脑无法使用
}


但是进入游戏就会发现,领袖并不能带有这些特性,因为这些特性既无法在升级时获得,也无法通过事件获得(因为没有对应的事件)
类似灵能/罐头这样的特殊种族特性是怎么给领袖加上buff的,游戏机制是这样实现的
首先 每当一个新的领袖出现在你的可雇佣列表内的时候 游戏会调用 common\on_actions\00_on_actions.txt 文件内的 on_leader_spawned 函数 让我们看看这个函数都干了啥


on_leader_spawned = {
events =      #触发事件,按顺序进行触发
  {
   utopia.2509 # 调用事件utopia.2509 这个事件是判断是否有博学特性,如果有,就为领袖添加这个特性,下面的函数都是类似的行为
   utopia.2510 # 是否为生化人
   utopia.2560 # 是否为罐头
   utopia.2651 # 是否有灵能潜质
   utopia.6000 # 蜂巢政体的不朽特性
   syndaw.1050 # 机器人
  distar.173  
  utopia.524      #这里是我添加的作弊事件
  }
random_events = {       #这里是随机事件 感兴趣的朋友可以自己试试改改
  80 = 0
  20 = utopia.2601
}

}

我们看到,在这里仅仅实际上游戏每生成一个领袖的时候,都会调用一连串的事件,但是我们在游戏当中并没有看到生成的领袖既有罐头又信灵能这样的情况,那么说明这些事件本身就有一定的筛选能力,那么我们找到触发的事件,看看他们到底怎做了什么
其大部分调用的事件 utopia.* 这样的 所对应的文件路径为 \Stellaris\events\utopia_on_action_events.txt
以utopia.2509(博学特性)为例

country_event = {

id = utopia.2509                                #事件id 必须唯一

is_triggered_only = yes

hide_window = yes
trigger = {                                        #判断触发条件
  from = {
   species = {                                     #必须具有的特性
    has_trait = trait_erudite                  #具有种族特性:博学
    NOR = {                                        #不能具有的特性
     has_trait = trait_cybernetic            
     has_trait = trait_psionic
     has_trait = trait_latent_psionic   
    }
   }
  }
}
immediate = {                                #立刻发生的事情
  from = {
   if = {
    limit = { leader_class = admiral }  #leader_class 生成领袖的类型,这里是判断是否为舰长
    add_trait = leader_trait_admiral_erudite             #添加特性
    add_ruler_trait = leader_trait_ruler_erudite         #添加通用特性
    break = yes                                                     #跳出事件,不然会在下面继续判断
   }
   if = {
    limit = { leader_class = general }
    add_trait = leader_trait_general_erudite
    add_ruler_trait = leader_trait_ruler_erudite
    break = yes
   }
   if = {
    limit = { leader_class = governor }
    add_trait = leader_trait_governor_erudite
    add_ruler_trait = leader_trait_ruler_erudite
    break = yes
   }
   if = {
    limit = { leader_class = scientist }
    add_trait = leader_trait_scientist_erudite
    add_ruler_trait = leader_trait_ruler_erudite
    break = yes
   }
   if = {
    limit = { leader_class = ruler }
    add_trait = leader_trait_ruler_erudite
    add_ruler_trait = leader_trait_ruler_erudite
    break = yes
   }
  }
}
}


那么我们就可以仿写出一个类似的事件
(如果你到这里还看不懂,那就抄吧)

country_event =                              #事件的标志结构
{
id = utopia.524                               #事件必须有的id,这个id必须全局唯一
is_triggered_only = yes
hide_window = yes
trigger =                                        #具备的条件,注意我这里是不带from={...}的 实际上我也搞不清楚这个符号的意思是啥,只要带了里面的条件判断就一直不满足,但是官方写的就没啥问题,反正能用就行

{
  has_trait = trait_mental_network     #如果你写了自己的特性,这里填上你写的名字
}
immediate
{
from =
  {
   if =
   {
    limit = { leader_class = admiral }   #和前面一样的类型判断
    add_trait = leader_trait_admiral_mental_network        #为领袖添加特性
    add_ruler_trait = leader_trait_ruler_mental_network   #下同
    break = yes
   }
   if =
   {
    limit = { leader_class = general }
    add_trait = leader_trait_generic_mental_network
    add_ruler_trait = leader_trait_ruler_mental_network
    break = yes
   }
   if =
   {
    limit = { leader_class = governor }
    add_trait = leader_trait_governor_mental_network
    add_ruler_trait = leader_trait_ruler_mental_network
    break = yes
   }
   if =
   {
    limit = { leader_class = scientist }
    add_trait = leader_trait_scientist_mental_network
    add_ruler_trait = leader_trait_ruler_mental_network
    break = yes
   }
   if =
   {
    limit = { leader_class = ruler }
    add_trait = leader_trait_ruler_mental_network
    add_ruler_trait = leader_trait_ruler_mental_network
    break = yes
   }
  }
}
}


其说明文本参见汉化的方法 看到这里说明你应该是有些写代码的底子的 相信这些小问题你完全可以搞定








回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-3-29 03:54 , Processed in 0.029842 second(s), 19 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表