kukupapa 发表于 2018-11-5 13:33

=====游戏修改教程及拓展以及控制台命令的简要说明=====

本帖最后由 kukupapa 于 2018-11-24 15:35 编辑

这个教程是在学习本论坛几位大神的帖子之后,自己摸索着写的,凡是引用的帖子基本都标注了。本人C#只懂皮毛,所以水平有限,还请各位大神勿喷。
写的过程中夹杂了一些寻找修改地址的思路,只供各位参考。本人第一次写修改攻略,还望各位路过的大侠多多支持,顺手回个贴,如果大家喜欢,我会在后继续放上一些拓展功能


游戏版本:1.8.22904
修改工具:dnSpy(https://github.com/0xd4d/dnSpy/releases )
修改文件:
      主要文件:[你的双点医院游戏的目录]\TPH_Data\Managed\Assembly-CSharp.dll
      次要文件(在游戏中可以打开控制台而修改):[你的双点医院游戏的目录]\TPH_Data\Managed\Assembly-CSharp-firstpass.dll
      
一些建议:
      1 修改前照惯例先备份源文件
      2 修改后或使用其它人的修改文件时,能够对应建立一个文本文件,简要说明该文件下载的地方(最好是贴上链接)、被修改的地方和修改后达到的功能。这样就算时间久了,也不至于遗忘。
      3 被修改的文件一定是在[你的双点医院游戏的目录]\TPH_Data\Managed\这个目录里,否则编译会出错的
      4 修改完一个函数或类后记得保存,省得发生意外时,前面的修改全都白做,切记切记。















kukupapa 发表于 2018-11-5 13:33

开启控制台

本帖最后由 kukupapa 于 2018-11-5 13:26 编辑

(参考贴:http://bbs.3dmgame.com/thread-5783027-1-1.html)(这个非常必要,一是控制台其实就能完成许多修改想要达到的功能,二是后续我还会说一些要用到控制台的功能)
1、 在dnSpy中打开TPH_Data\Managed\Assembly-CSharp-firstpass.dll,依以下顺序找到RegisterCommand(在以后修改的方法中,找类和方法时都是依照这种方法。)Assembly-CSharp-firstpass > Assembly-CSharp-firstpass.dll > UnityConsole > ConsoleCommandsDatabase > RegisterCommand2、 修改RegisterCommand函数:鼠标右键对RegisterCommand单击,在弹出菜单种选择“编辑方法(C#)…”。(有两个编辑方法可选,上面那个是设计方法名称及参数的窗口,新建方法时使用。我们要的是下面那个带C#符号的,除非特别指出,一般都是指选下面那个。)


在红框位置加入下行代码,然后点“编译”(注意不要在中文状态下输入标点符号)。编译完毕后,点击菜单栏中的“文件”选择“保存模块…”,在弹出窗口中检查文件名中的保存路径是否是你所修改的文件的路径,一般默认就是正确的,最后点“确定”ConsoleCommandsDatabase.Database = new ConsoleCommand(command, description, usage, callback);


3、 保存完毕后,点菜单栏中的“文件”,选择“全部关闭”。
4、 如上述方法再在dnSpy中打开要修改的主要文件:Assembly-CSharp.dll。依以下顺序找到.ctor
Assembly-CSharp >Assembly-CSharp.dll > TH20 > APP > 派生类型 > .ctor5、右键点击.Ctor的名称,选择“修改方法(C#)…”。按照tempa大神所说,删除“base..ctor();”这句,在该函数参数末尾加入“:base()”。然后(按Ctrl+F键)搜索consoleController.ToggleKey,如图将keyCode.None 改成 KeyCode.BackQuote,改好后“编译”。

6、编译完毕,同上个文件一样保存即可。运行游戏后,如要调出控制台只要按键盘上“1”左边的那个“~”键,即可调出控制台。

kukupapa 发表于 2018-11-5 13:33

一些游戏的小发现(欢迎大家补充)

1、 使用控制台输入某些针对游戏中角色的命令时,一定要先选中角色,然后直接按“~”键调出控制台,在输入命令时,鼠标一直都不能动。2、 游戏中员工头像右下的省略号可以改员工的名字。3、 游戏中员工的技能槽虽然只有5个,但是技能是可以通过控制台加技能的命令累加的,只是看不见。比如一个遗传科医生,一个遗传学技能+四个治疗技能,这时再增加第五级治疗技能给这个员工时,该员工的治疗数据仍然会增加(此时人物状态会变成需要培训,可能会影响心情)。也就是理论上说你可以让一个员工所有技能都学满。4、 不要在医院里放置椅子什么的,全科安排的好,病人排队不会过长,如果放了椅子,病人反而会乱坐。5、 最好不要在医院里放置书报亭什么的,会排队的。6、 在看到VIP对着你的病人布道或者毁坏你的设备时,可以按暂停,然后用垃圾桶或者椅子以及饮料机规划一条路让他走,等VIP走到某个偏僻的角落时堵住他。这样他就不会再来烦你的病人了。缺点貌似以后就再也不会有VIP来了(关于这点没有长时间实验)7、 如果要更改游戏里你的名字,可以在[游戏的安装目录]\TPH_Data\Plugins\下找到valve.ini文件,打开这个文件把PlayerName修改成你要的名字即可。在这个文件里可以看出DLC中已经有黄金马桶了(看版本的)

kukupapa 发表于 2018-11-5 13:33

本帖最后由 kukupapa 于 2018-11-5 03:07 编辑

1、 ClearQualifications删除人物已有的技能,这个命令和SetStaffRank X以及AssignQualification命令可以组合起来用,给招聘的员工赋予技能。2、 AddStaffXPXX    给员工加XX经验。如:AddStaffXP 1000。加经验值人物升级后,如果还要加经验值,则先要去点升级加薪,否则人物状态可能会乱。这个命令不大用,只是在某些关卡中用来快速完成员工挑战或特定任务。3、 DebugDestroyCharacter删除选中人物。应该是有区别于DebugKillCharacter,具体没有研究4、 SetMaintenanceLevelFullyes/no 后面跟yes表示让设备着火,no表示让设备耐久度恢复最高。5、 SetStaffRankX (X为0,1,2,3,4)对应人物的5个技能槽。如某人物只有3个技能槽,调用命令SetStaffRank 3,则会拥有4个技能槽。游戏中如果员工出现BUG,比如人员提示要晋升,但是已经没有技能个可以培训了,这时可以用这个命令直接让这个员工提升一个等级,免去不能培训的苦恼。
6、 技能命令的格式为:AssignQualification <!-MissingTranslation -!>,所以一条完整的技能命令应该如下:AssignQualification<!-Missing Translation -!>


适用技能名称等级指令场景属性
通用体力1AssignQualification<!-Missing Translation -!>


情商1AssignQualification<!-Missing Translation -!> +10%
临床交流1AssignQualification<!-Missing Translation -!>


工作激情1AssignQualification<!-Missing Translation -!> +10%
培训达人1AssignQualification<!-Missing Translation -!>
+20%
助理营销学5AssignQualification <!-Missing Translation-!>营销活动+20%
客户服务5AssignQualification <!-MissingTranslation -!>门厅接待+50%
医生/护士诊断5AssignQualification <!-Missing Translation-!>
每级增加10%
全科诊断5AssignQualification <!-MissingTranslation -!>全科诊室每级增加15%
精神学5AssignQualification <!-Missing Translation-!>精神科每级增加20%
遗传学1AssignQualification <!-MissingTranslation -!>DNA

放射学1AssignQualification <!-Missing Translation-!>
研究5AssignQualification<!-Missing Translation -!>


外科学5AssignQualification<!-Missing Translation -!>手术室每级增加20%
治疗5AssignQualification<!-Missing Translation -!>
每级增加10%
注射1AssignQualification<!-Missing Translation -!>
药房1AssignQualification<!-Missing Translation -!>


病房5AssignQualification<!-Missing Translation -!>病房和骨科每级增加10%
勤杂工捉鬼1AssignQualification<!-Missing Translation -!>


维护5AssignQualification<!-Missing Translation -!>
机械升级5AssignQualification<!-Missing Translation -!>


命令中的1代表等级1,如要等级5则把数字改成5即可。7、 ClearTraits删除人物特质8、 设定人物特质命令,格式如设定技能命令,下表中只列出好的特质。
精神抖擞AssignTrait<!-Missing Translation -!>走路速度、工作效率加快20%
我很便宜AssignTrait<!-Missing Translation -!>薪水比常人要求低。
不知疲倦AssignTrait<!-Missing Translation -!>体力消耗减少(体力消耗速度变成正常状态的四分之一)
治愈者AssignTrait<!-Missing Translation -!> (医生、护士专有):提升病人的健康度
乐观主义者AssignTrait<!-Missing Translation -!>增加10%幸福度
一学就会AssignTrait<!-Missing Translation -!>学习速度增加50%
小洁癖AssignTrait<!-Missing Translation -!>主动清理垃圾(即使不是勤杂工)
园艺高手AssignTrait<!-Missing Translation -!>主动给植物浇水(即使不是勤杂工)
老师AssignTrait<!-Missing Translation -!>教学速度增加50%
激励者AssignTrait<!-Missing Translation -!>周围人走路速度、工作效率加快(具体数值未知)
美颜心悸AssignTrait<!-Missing Translation -!>周围人幸福度增加
有趣的人AssignTrait<!-Missing Translation -!>周围人幸福度增加
艺人AssignTrait<!-Missing Translation -!>周围人幸福度增加
前9种蓝色的属于比较好的特质,要记住,后续会有用的。表中其余的以及未列出的特质如:激励者、美颜心悸、艺人、好辩、魅力十足、恋爱狂、有趣的人等会吸引周围的人围着自己,引起交通阻塞并且具有这种特质的人会不务正业。9、 StopAllChallenges关掉所有随机事件发生,感觉地震、火山很讨厌吗,用它吧,世界刹时安静了,当然它停止了所有的挑战。。。10、 CreateChallenge <name> 生成地震、火山等随机事件 如:CreateChallenge Earthquake11、 SetAttributeOnAllCharacters 修改所有人物的 饥饿、渴、高兴、健康、卫生等数值。如:SetAttributeOnAllCharacters Hunger -100 修改人物饥饿状态为-100(不饥饿),这是一个万能的、在过关时迫切需要的命令啊!人物状态为:Hunger(饥饿度)、Thirst (口渴度)、Toilet(如厕需求)、Boredom (无聊程度)、Litter(垃圾)、Energy(能量)、Health(健康度)、Happiness(幸福度)、Nausea (恶心呕吐)、Hygiene (卫生)、Temperature(温度适宜程度)12、 SpawnGhostAtCursor   鼠标位置生成鬼魂(有个生涯奖励是有关捉鬼魂数量的,可以用这个速成)13、 EarnMoney <Amount>将输入的数值作为收入计算 如:EarnMoney -100 减少10014、 ModifyBalance <Amount> 直接改显示余额 如:ChangeBalance -100 减少100其实这两项改钱的感觉好像结果都是一样的,没仔细研究,你要钱不够了,可以用命令EarnMoney +100000。应该、也许可能、肯定是有用的。      15、 ModifyReputation <Amount>修改声誉如: ModifyReputation -10016、 CreateStaffChallenge生成员工挑战(用于完成某些关卡,不大用)。17、 CompleteDiagnosis完成病人诊断并送去治疗。18、控制台命令的一些拓展(福利?)


kukupapa 发表于 2018-11-5 13:33

本帖最后由 kukupapa 于 2018-11-5 13:10 编辑

改变培训、训练、研究的加成速度


物品属性
诊断书柜提升房间名望、+2%诊断能力
治疗书柜提升房间名望、+2治疗能力
药柜 +1%诊断能力、+1%治疗能力
咖啡机降低口渴度、提供咖啡因提振
超级计算机 协助研究、+2%研发能力
服务器协助研究、+1%研发能力
百科全书I提升房间名望、+2%培训速度
百科全书II提升房间名望、+4%培训速度
解剖图海报提升医院吸引力和房间名望、+1%培训速度
脑部解剖图海报提升医院吸引力和房间名望、+1%培训速度
立体主义解剖图海报提升医院吸引力和房间名望、+1%培训速度
骷髅模型提升医院吸引力、+1%培训速度
解剖模型提升医院吸引力、+1%培训速度

这里主要考虑修改房间内的物品效果,这样可以方便的在游戏界面看到。依以下顺序打开:Assembly-CSharp > Assembly-CSharp.dll > TH20 >找到以下的几个类“RoomModifierDiagnosis(诊断的修改)修改的方法分别为apply(放置物品时)、remove(移走物品时)、Description(这个是屏幕上显示的物品说明)。RoomModifierTreatment(治疗的修改)修改的方法分别为apply、remove、Description。RoomLogicResearch(研究的实际数值放置处)RoomModifierResearchRate(研究的在屏幕上的显示数值)、RoomLogicTrainingRoom(训练的实际数值)、RoomModifierTrainingRate(训练的显示)、 GameAlgorithms.CalculateTrainingPointLearnRate(this._teacher, pupil, this._pupils.Count, this._room)(计算速度系数)修改诊断和治疗的物品加成时应同时修改apply、remove、description以确保数据统一性。训练和研究的加成数据都是在游戏中开始一项科目的培训或一项研究时即时计算房间内物品的加成,所以有没有remove其实都无所谓。
修改的数值怎么得出来的猜测的思路:以药柜为例,它在游戏的界面显示的治疗加成是1%(这个值是经过被%格式化的字符串),代码中和这个相关的是this._percentage/100,推测出this._percentage = 1,可以看出this.percentage就是代表物品本身固有的加成属性(这个值因该是固化在unity里的,我是没能力找到它的初始值在哪,哪位大神如果能有办法找出,还请不吝赐教),所以我们只能在程序把它读出来后进行修改。
既然this._percentage不能改,如果我想把它变成200%怎么办? 只要把代码改成:this._percentage*200/100(为尽量维护源代码的完整性,我把它写成this._percentage/100*200)即可。如果是药柜的话这个算式的值是2,经过格式化字符串显示出来就是200%。那么如果你想改成10%,则只要把代码改成:this._percentage*10/100,想增加百分之多少,依此类推即可。
我在修改中统统改成200%加成。
1、修改治疗的物品加成,找到RoomModifierTreatment类后,右键点击类名,选择“编辑类(C#)…“,


找到下图中的三行代码,对照下图红框位置(对于语句的定位可以用CTRL+F也可以参照图示中语句的行号大致定位)进行修改,在公式最后添加你想放大的倍数即可。修改完毕后点击”编译“。

2、修改诊断的物品加成,找到RoomModifierDiagnosis类后,右键点击类名,选择“编辑类(C#)…“,对照下图进行修改,在公式最后添加你想放大的倍数即可。修改完毕后点击”编译“。

3、修改培训的物品加成,先修改显示效果,找到RoomModifierTrainingRate类,右键点击类名,选择“编辑类(C#)…“,在弹出窗口中修改类中的Description()方法,这里是物品关于培训加成的描述,是游戏中鼠标指向物体时,显示的说明,并不实际改变培训速度。在公式最后添加你想放大的倍数即可。然后点击“编译“      这个RoomModifierTrainingRate类中的Apply和Remove方法里都是空的,所以培训加成的实际数值已经改了算法,经过一番折腾,其实无非就是用关键字搜索而已,找到了RoomLogicTrainingRoom类中Tick(),可以看到培训是以老师到没到培训室作为培训开始动作的判断依据的,如果教师到场,学生没有到场,默认等待120秒(程序里是120f,我觉得应该是120秒的意思,没有深究),超过时间则取消培训。如果学生到场,教师也在培训室内,则开始培训,所以相关函数是UpdateLearning。点击UpdateLearning(或者直接在左边的栏中找),可以看到UpdateLearning方法中的IncreaseLearning函数是判断每个学生的培训进度,满了加点幸福值(这里你可以提高所加的幸福值,给点员工福利:lol)赶出培训室,没满就继续培训。那么num值就是这个房间的单位时间培训速度加成的总和,我们可以直接改这个值,但是这样改了以后,无论你在房间里放多少物品,培训速度都不会改变了,那就失去很多乐趣了,所以我们去改给它赋值的函数GameAlgorithms类中的CalculateTrainingPointLearnRate方法。在这个方法中可以看到和培训加成总和相关的有:教师的教学加成trainingTeachingSpeed,学生的学习加成trainingLearningSpeed,还有个很有趣的系数:房间大小classSize(我觉得应该是),它的公式好像说明房间越大培训效果越差,有兴趣的不妨去研究下这个函数。最后一个num2就是我们要改的物品的加成了,看到那个熟悉的100f了吗,还犹豫啥,*200f直接怼了它。依次找到GameAlgorithms类中的CalculateTrainingPointLearnRate方法。右键点选方法名,选择“编辑方法(C#)…”。红框内为物品的速度加成,在公式最后添加你想放大的倍数即可。改完后点击“编译“


4、修改研究的物品加成,同培训一样的思路,先改说明,找到RoomModifierResearchRate类,这个类里放置的时物品加成研究速度的说明。右键点击类名,选择“编辑类(C#)…“,找到类中的Description()方法,对照下图进行修改,在公式最后添加你想放大的倍数即可。修改完毕后点击”编译“。

改好显示的结果后,通过寻找修改培训的方法一样,找到RoomLogicResearch类中的tick()方法,这个方法中只修改物品对研究速度的加成。RoomLogicResearch._itemMultiplier = 1f;
这句代码是这个房间物品加成研究速度的初值,不要动它,改了虽然也能加快研究速度,但是在游戏界面上是看不到的,所以仍然改每个物品对研究速度的加成,通过查看后面的代码,可以看出后面的roomItem2是代表房间的物品对研究的速度加成的,所以其后foreach内的程序体就是对这个房间内所有物品的加成系数做汇总,我们改它就行了。右键点击tick(),选择“编辑方法(C#…)”,对照下图在公式最后添加你想放大的倍数即可,点“编译”
最后HAPPY吧!

kukupapa 发表于 2018-11-5 13:33

本帖最后由 kukupapa 于 2018-11-4 01:54 编辑

GameAlgorithms 类是个很有趣的类,里面有许多和游戏里数值相关的算法。可以深入研究一下的。这个类里CalculateEnvironmentThermalComfort(计算环境的舒适值),CalculateHygieneEnvironmentRating(计算环境的清洁率)等许多游戏算法都在这个类里。
1、 在这里首先是改一下那个万恶的99%的最高治愈率。改好后,治愈率只要达到99%就默认为100%。如果你觉得大于90%就应该是100%的话,那只要把99%换成90%即可象无头苍蝇一样终于找到了这个类中的CalculateEstimatedTreatmentOutcom方法是关于治愈率的算法的。右键点击该方法的名称,选择“编辑类(C#)…“,在弹出窗口中找到如图位置,将下面的代码加入。if (chanceOfSuccess >= 99f) {   chanceOfSuccess = 100f;}


ChanceOfSuccess = chanceOfSuccess,计算该房间的病人的治愈率
DiagnosisCertainty = diagnosisCertainty,诊断率
StaffSkill = num * 100f,职员的技术等级加成
RoomModifiers = num2 * 100f,房间物品的加成
MinTreatmentEffectiveness = num3,最小治愈效果
MaxTreatmentEffectiveness = num4最大治愈效果
后续函数会根据ChanceOfSuccess来判断,如果是100%则直接判定成功。如果不是100%则会根据疾病定义的失败率来判断生死(默认好像是50%)来判断生死

2、 更改房间的声望值,这样比较容易达到5级声望值的房间。依以下顺序打开:Assembly-CSharp > Assembly-CSharp.dll >TH20 > GameAlgorithms,找到GameAlgorithms类中的CalculateRoomPrestige方法选择“编辑方法C#...”将红框中的表达式改成:num3 += roomItem.Prestige * 5f;
















jokeabc 发表于 2018-11-7 11:02

:):):):):):):):):):)

海豚音 发表于 2018-11-7 12:57

虽然看不懂还是顶个

talkrei 发表于 2018-11-7 19:01

原创文章坚决要顶,很适合没有经验的我。感谢分享学习了!

kukupapa 发表于 2018-11-8 03:29

(谢谢各位的回复,差点以为没人玩双点了呢,我继续增加内容了)

六、修改员工的一些相关性质,如行走速度,体力消耗、恢复等
       这个修改个人认为除了行走速度、体力恢复有必要修改外,其余的都可以通过控制台命令完成(引用:http://bbs.3dmgame.com/thread-5786179-1-2.html)1、 修改员工的的行走速度,依以下顺序打开:Assembly-CSharp> Assembly-CSharp.dll > TH20 >Staff(类),找到GetMaxMovementSpeed选择“编辑方法C#...”添加:num*= 2f;语句。2可以是任何你想要的值,表示最大移动速度为原来的2倍,太大反而不好。如图


2、 在Staff类内继续寻找涉及的方法:GetResearchRate、 GetTrainingLearningSpeed、GetTrainingTeachingSpeed、 GetTreatmentSkillRating分别对应员工的研究、学习、教学、治疗速度的加成,这些值个人认为没必要改,可以在前篇的物品加成中统一改了。
3、在Staff类内找到TimeRemainingOnBreak方法,这里是计算员工休息的剩余时间。方法中红框内的num就是剩余的休息时间,GetBreakLength()取回的其实应该就是游戏中设置员工休息时长的那个菜单的值,公式的含义就是游戏中你定的休息标准时长减去已经休息的时间。最后的return是判断如果num大于0表示还没休息好,返回num(即剩余的时间)。个人认为这个没必要改,直接在游戏中更改员工休息周期的那个菜单里调整休息周期即可实现在这里的更改。如果你改了这里还要和下面的体力恢复时间搭配起来,否则你判定休息时间已经结束,但其实员工体力还没完全恢复。
4、修改医生护士雇佣后所有工作自动不许可,这个修改在控制台中也可以用命令解决。如要修改可以修改在Staff类里的.Ctor方法。具体参考:http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=5790163&extra=page%3D1%26filter%3Dtypeid%26typeid%3D34552)。这个能找到并修改好,这位一定是个大神了。
5、 员工经验的增加,个人觉得没必要改,改这里的数值,所有员工都经验增加飞快,有点破坏游戏的感受。可以针对某些员工直接用控制台命令(SetStaffRank X)代替,更直接简单。(引用:http://bbs.3dmgame.com/thread-5797782-1-2.html, http://bbs.3dmgame.com/thread-5783261-1-1.html)助理XP修改依次打开Assembly-CSharp > Assembly-CSharp.dll >TH20.BTA > 注意这里是TH20.BAT不是TH20了       KioskSeePatient类里的OnUpdate()方法中get.XP.Modify(this.XP,1f);可以把1f改成100f或1000f。       ReceptionistSeePatient类里的OnUpdate()中get.XP.Modify(this.XP,1f);这里的改法同上员工的经验参照Assembly-CSharp> Assembly-CSharp.dll > TH20 > staff中的InitialiseXP方法修改。
6、员工的体力消耗和恢复。依次打开Assembly-CSharp> Assembly-CSharp.dll > TH20 > RoomDefinition类,找到GetStaffEnergyModifier方法,添加num*=100f;在红框位置,这个是员工在休息室时体力恢复的速度。参数_staffEnergyModifierIdle代表不在工作也不在休息室,闲逛的时候的体力消耗。参数_staffEnergyModifierWork代表工作的时候的体力消耗。所以每个返回参数上加上*0.5f以降低体力消耗。

兔斯基先森丶 发表于 2018-11-15 08:40

真详细,辛苦了。感谢分享学习了!

kukupapa 发表于 2018-11-18 01:54

感觉没人看啊,都没动力了

xhtpg 发表于 2018-11-21 16:45

几个问题请教大神:
控制台问题
1、怎么给一个人一次添加多个技能或者特性,我50多个员工一个一个人,一个一个技能、一个一个特性添加,烦死个人啊;
2、怎么批量添加多人一个技能或者特性,我50多个员工一个一个人,一个一个技能、一个一个特性添加,烦死个人啊;
3、医院声誉那个命令好像用不了啊;

kukupapa 发表于 2018-11-22 19:46

本帖最后由 kukupapa 于 2018-11-22 20:32 编辑

xhtpg 发表于 2018-11-21 16:45
几个问题请教大神:
控制台问题
1、怎么给一个人一次添加多个技能或者特性,我50多个员工一个一个人,一个 ...
你的问题在我帖子的后续会写到,现在还没有贴上来,目前的控制台命令中是没有办法实现你所问的前两个问题的,要自己重新写命令。另外加声望那条命令我刚才看了下,应该是它在reputationtracker中没有注册成功,所以目前是失效的。
modifyreputation这个命令好像不是修改K值的。
如果你是想改游戏中的K值得话,我觉得你用ce(Cheat Engine直接网上搜索,官网可以下载免费版本)比较好。很简单就能改到你想要得值。

lightvip 发表于 2018-11-23 15:39

支持楼主 目前最详细的修改了 感谢

pksnow 发表于 2018-11-24 01:04

本帖最后由 pksnow 于 2018-11-24 01:07 编辑

好久没玩双点了,仅供参考,大自然的搬运工
暖气、空调和植物的效果范围(参考贴:http://bbs.3dmgame.com/thread-5787374-1-1.html)
private void ModifyMapAttribute(RoomItem roomItem, float radiusInCells, float value)
                {
                        radiusInCells *= 2f;
                        Vector3 worldPosition = roomItem.WorldPosition;
                        worldPosition.x /= 2f;


高速刷求职员工(参考贴:http://bbs.3dmgame.com/thread-5786087-1-1.html)
   public float GetTimeUntilNextApplicant(ReputationTracker reputationTracker)
                        {
                              return Mathf.Lerp(this.TimeUntilNextApplicant, this.TimeUntilNextApplicantMax, reputationTracker.OverallReputation);
                        }

职员性别(参考贴:http://bbs.3dmgame.com/thread-5785235-1-1.html):o夜勤....
public JobApplicant(StaffDefinition definition, CharacterNameGenerator nameGenerator, float recruitmentFeePercentage, int chanceOfEmptyTrainingSlot, int rank, WeightedList<QualificationDefinition> qualifications, CharacterTraitsManager traitsManager, Metagame metagame, Level level)
                {
                        this.Definition = definition;
                        this._recruitmentFeePercentage = recruitmentFeePercentage;
                        this.Sex = ((RandomUtils.GlobalRandomInstance.Next(0, 2) != 0) ? Character.Sex.Female : Character.Sex.Male);
                        this.Name = nameGenerator.Generate(this.Sex);
                        this.Rank = rank;
                        this.Happiness = RandomUtils.GlobalRandomInstance.NextFloat(50f, 100f);
                        this.Experience = RandomUtils.GlobalRandomInstance.NextFloat(0f, this.RankDefinition.MaximumXP * 0.75f);
                        this.Traits = traitsManager.GenerateRandomTraits(definition._type, this.Sex);
                        this.GuiltTripFlavourText = traitsManager.GetGuiltTripFlavourText(this.Sex);
                        this.AssignRandomQualifications(qualifications, metagame, level, chanceOfEmptyTrainingSlot);
                        this.SetupVisuals(definition);
                }


怎么给一个人一次添加多个技能或者特性?

1.使用Bindkey命令 (参考地址忘了) ,需要每次启动游戏输入一便,实际使用还算灵活方便
选择几个空置的按键,下例使用了数字"7"(55=Keycode 7,56=Keycode 8,57=Keycode 9),打开控制台依次输入每行命令,鼠标悬停职工,按"7"就会依次执行相关命令,绑定的命令可以自由搭配组合
Bindkey 55 SetCharacterHappinessFull
Bindkey 55 ClearTraits
Bindkey 55 AssignTrait <!-Missing Translation -!>
Bindkey 55 AssignTrait <!-Missing Translation -!>
Bindkey 55 AssignTrait <!-Missing Translation -!>
Bindkey 55 AssignTrait <!-Missing Translation -!>
Bindkey 55 AssignTrait <!-Missing Translation -!>
Bindkey 55 AssignTrait <!-Missing Translation -!>下例使用了数字"9",删除人物
Bindkey 57 DebugDestroyCharacter

2.使用按键精灵之类软件,批量操作(参考地址忘了)

3.使用辅助工具,之前有人发过专门修改技能特质辅助程序(参考地址忘了)





xhtpg 发表于 2018-11-24 02:15

怎么给一个人一次添加多个技能或者特性?

1.使用Bindkey命令 (参考地址忘了) ,需要每次启动游戏输入一便,实际使用还算灵活方便
选择几个空置的按键,下例使用了数字"7"(55=Keycode 7,56=Keycode 8,57=Keycode 9),打开控制台依次输入每行命令,鼠标悬停职工,按"7"就会依次执行相关命令,绑定的命令可以自由搭配组合
Bindkey 55 SetCharacterHappinessFull
Bindkey 55 ClearTraits
Bindkey 55 AssignTrait <!-Missing Translation -!>
Bindkey 55 AssignTrait <!-Missing Translation -!>
Bindkey 55 AssignTrait <!-Missing Translation -!>
Bindkey 55 AssignTrait <!-Missing Translation -!>
Bindkey 55 AssignTrait <!-Missing Translation -!>
Bindkey 55 AssignTrait <!-Missing Translation -!>
复制代码

这个具体怎么用?

kukupapa 发表于 2018-11-24 02:16

pksnow 发表于 2018-11-24 01:04
好久没玩双点了,仅供参考,大自然的搬运工
暖气、空调和植物的效果范围(参考贴:http://bbs.3dmgame.com/t ...

夜勤那个可是很有趣的,不过游戏的角色实在是不能养眼。
这个游戏目前的乐趣就停留在修改上了。感觉情怀这个东西还是真的倔强,怎么样都是觉得原作更好,带来更多的乐趣。目前这个双点有点鸡肋

kukupapa 发表于 2018-11-24 04:04

感谢pksnow提供的资料,这里借花献佛,对于他的Bindkey命令,详细描述如下:
涉及的命令有3条:BindKey、UnBindKey、ListKeyBindings。
1.Bindkey命令是将控制台中的一些命令绑定于某个快捷键,所以每次启动游戏的时候都要重新赋予定义。简单点的办法就是现在TXT中将命令组合好,然后在游戏中一行一行粘贴到控制台中。
命令格式如下: BindKey <要绑定的键盘上的按键> <要绑定的命令> <要绑定的命令所需要的参数>
要绑定的快捷键:理论上可以是键盘上的任何按键,但为了稳妥起见,请避开游戏中使用的功能键,具体看游戏设置中的键盘操作键定义。你可以定义(55=Keycode 7,56=Keycode 8,57=Keycode 9 这些键是键盘中字母键上面的数字键,好像不是小键盘上的)
要绑定的命令:控制台里的各种命令,如果命令有参数必须在后面指定,比如:AssignTrait<!-Missing Translation -!>,没有就空着

使用方法:该命令可以针对同一个按键设置不同的命令,组成一串各种命令的组合,以达到某些特定的目的。当一个按键有许多命令时,它将从你第一个设置的命令按顺序执行下去。

以设置pksnow提到的设置几个好特性为例:
在游戏中调出控制台,然后依次输入以下命令,这里快捷键我设置成57
Bindkey 57 SetCharacterHappinessFull
Bindkey 57 ClearTraits
Bindkey 57 AssignTrait <!-Missing Translation -!>
Bindkey 57 AssignTrait <!-Missing Translation -!>
Bindkey 57 AssignTrait <!-Missing Translation -!>
Bindkey 57 AssignTrait <!-Missing Translation -!>
Bindkey 57 AssignTrait <!-Missing Translation -!>
Bindkey 57 AssignTrait <!-Missing Translation -!>

每个命令回车后,控制台会返回"done"即表示成功。
全部输入完毕后,关闭控制台,暂停游戏(暂停游戏的目的是为了方便捕捉员工,否则他跑来跑去),随便点击一个员工,并使鼠标悬停于该职工头上,按键盘上的9,就会发现他的幸福度满了,然后原来的特性被清除了,最后特性变成命令里的6种了。
按照这样你可以编辑不同的命令组合,给每个员工输入需要的特质和技能。

2 unbindkey命令是将你前面快捷键绑定的命令注销。
命令格式:unbindkey <前面绑定的快捷键> <快捷键对应的命令> <命令对应的参数>
使用方法:如果你发觉命令组合种某个命令输入错误,可以在控制台中使用unbindkey将这个命令去掉。如果在快捷键后不输入对应的命令,则该快捷键定义的所有命令都将被清除。
如上面的命令组合输入后,如果我再输入一句:
unbindkey 57 ClearTraits
则将删除按键9的命令组合中的cleartraits命令,只剩下另外的7句。
如果输入
unbindkey 57
则对应按键9的所有组合命令都将被删除。

最后非常可悲的是这个命令是错误的,游戏商的程序猿在写这段代码时可能开小差了,没写对。所以我稍微改了下,具体改法如图
选择对应的unbindkeycallback方法,选择编辑方法(C#)...

改完后,编译,然后保存文件。
由于时间太晚,我只是改了前半部分,也就是按照我这样的改法,只能实现对应快捷键的全清功能。
如:unbindkey 57
后面不要跟具体的命令
如果大家有时间可以重写这句后头的下面两句,以达到删除对应命令的功能。不过我觉得这样已经够了。

3 ListKeyBindings
这个命令很好理解,就是如果你不记得你都绑定了哪些快捷键和命令,只要在控制台中输入这个命令就会将清单列出来。

xhtpg 发表于 2018-11-24 13:40

本帖最后由 xhtpg 于 2018-11-24 14:28 编辑

kukupapa 发表于 2018-11-24 04:04
感谢pksnow提供的资料,这里借花献佛,对于他的Bindkey命令,详细描述如下:
涉及的命令有3条 ...
好使了,感谢,要不最后几关大批医生要崩溃。

另外问下,薪资怎么调啊?

还有,能复制人物吗?

kukupapa 发表于 2018-11-24 15:32

本帖最后由 kukupapa 于 2018-11-24 15:38 编辑

xhtpg 发表于 2018-11-24 13:40
好使了,感谢,要不最后几关大批医生要崩溃。

另外问下,薪资怎么调啊?

人物复制好像没有这个功能。你所需要的那个通过人物复制而想要达到的那个目的,其实可以通过别的方法实现的。
关于薪资的问题,个人觉得没必要更改,前面说到你用ce去修改金钱和K值,很容易就能达到的。如果你实在要修改薪资,你可以参考下面的方法:
public static int CalculateDesiredSalary(StaffDefinition definition, int rank, float XP, List<QualificationSlot> qualifications, CharacterTraits traits, float premiumMultiplier)
                {
                        int num = GameAlgorithms.CalculateMarketRateSalary(definition, rank, XP, qualifications);
                        GameAlgorithms._calculateDesiredSalaryParameter.Percent = 0f;
                        traits.IterateAllModifiers<CharacterModifierSalary, GameAlgorithms.CalculateDesiredSalaryParameter>(GameAlgorithms._calculateDesiredSalaryParameter, delegate(GameAlgorithms.CalculateDesiredSalaryParameter p, CharacterModifierSalary modifier, CharacterTraitDefinition trait)
                        {
                              p.Percent += modifier.Percent;
                        });
                        int num2 = num + Mathf.CeilToInt((float)num / 100f * GameAlgorithms._calculateDesiredSalaryParameter.Percent);
                        return (int)((float)num2 * premiumMultiplier);这个方法的最后一行应该就是返回期望工资,你可以把这句改成 return num;(应该是返回当前实际工资,即使其期望工资和当前工资始终持平),也可以在最后除以一个你想要缩小它工资的值。

具体我没有试验过,只是看了代码觉得应该是这里。而且改了以后会对职工的幸福度有什么影响也未可知。你可以自己试试。

我还是觉得你去下个CE改金钱总数和K值比较好。毕竟游戏中有许多东西是需要钱和K值来购买的。

丶叛逆 发表于 2018-12-6 14:53

看着你这个教程,学会了修改。感激不尽。

adzsc 发表于 2018-12-7 16:52

感谢lz分享,辛苦了,刚好出了新dlc,重新捡起来玩一下

lightvip 发表于 2018-12-12 20:03

本帖最后由 lightvip 于 2018-12-13 13:10 编辑

弄好了 ...

★乱世巨星★ 发表于 2019-1-16 19:51

666666666666真心是大佬

丶叛逆 发表于 2019-3-20 23:07

楼主对最新1.13版有研究吗,现在编译会出错

miyaz 发表于 2019-9-26 12:49

楼主好厉害啊,真心感谢,有大神真好,不然下了dnSpy也不会改……

恶Ψ魔 发表于 2019-12-13 08:14

问个事诶,我下载的dnspy都没有可执行文件啊。。杀软啥的也没装,就是找不到。exe文件;P;P;P

zhangafei123 发表于 2024-2-2 03:45

这篇看下来算是很全的一篇了,24年了这游戏依旧是不错的,顶

shanading 发表于 2024-8-25 15:11

技术流贴 感谢分享 非常详细
页: [1] 2
查看完整版本: =====游戏修改教程及拓展以及控制台命令的简要说明=====