silksong-coop-mod 0.4.83 → 0.4.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/INSTALL.txt CHANGED
@@ -1830,7 +1830,7 @@ exe 旁边放一个 dll,让游戏启动时连带加载它。这是所有同类
1830
1830
  - 日志:另一边第一次跟上时写一行 “follows the scene host's in every state”;离开房间时写一行以 [Directed]
1831
1831
  开头的记录:房主那边告诉了几步,另一边跟着走了几步。
1832
1832
 
1833
- * 【身上挂着蜘蛛网休息的那种2伤小怪,醒了以后还带着网打:修了】(0.4.83)
1833
+ * 【身上挂着蜘蛛网休息的那种2伤小怪,醒了以后还带着网打:修了】(0.4.83,0.4.84 改成所有怪都管)
1834
1834
  - 原因:
1835
1835
  · 这种怪休息时身上挂着一块蜘蛛网(两种样子里随机一种),第一次醒来时把网去掉。
1836
1836
  它会记住“已经醒过”,以后再醒就不再管网。
@@ -1839,27 +1839,45 @@ exe 旁边放一个 dll,让游戏启动时连带加载它。这是所有同类
1839
1839
  · 朋友离开房间后,你的游戏接手跑房间:模组把你这边原本那只叫醒,照朋友那边那只的位置、动作和状态
1840
1840
  (包括“已经醒过”)接着跑,但没有管它身上哪些部件开着。所以它带着睡前挂上的网起来打,
1841
1841
  又因为“已经醒过”,网再也不会去掉。
1842
- · 朋友回来后,朋友那边看到的也带着网。朋友那边那份是用朋友自己房间里的那只做出来的,
1843
- 网是哪一步挂上的,日志里看不出来;下面的新做法两种情况都管。
1844
- - 现在:
1845
- · 这只怪身上的网开着还是关着,由跑房间的一边说了算:一变就告诉另一边,另一边显示的那只、
1846
- 房间里睡着的那只都跟着改;后进房间的人也会拿到最新的样子。
1847
- 所以换人跑房间时,叫醒的那只身上的网和原来那边一样;后进来的人看到的也一样。
1842
+ · 坏的是“接手的时候不带上怪身上哪些部件开着”这件事本身,不只是这一种怪。
1843
+ - 现在(0.4.84):
1844
+ · 每只怪进房间时,模组从它自己的状态机里找出它会长期开关、而且只是用来看的部件
1845
+ (像这块网:只有图,不碰人、不出声、不冒粒子)。所有怪都这样找,不再只认这一种怪。
1846
+ · 这些部件开着还是关着,由跑房间的一边说了算:稳定 0.25 秒后告诉另一边。
1847
+ 另一边房间里睡着的那只每次都跟着改,所以换人跑房间时,叫醒的那只身上的部件和原来那边一样。
1848
+ 另一边显示的那只只在刚开始时照着改一次,之后跟着怪自己的动作同时变。后进房间的人也拿到最新的样子。
1848
1849
  · 顺带:休息时挂的是哪一种网,两边现在也一样了(以前各自随机)。
1849
- - 只改了这一种怪。
1850
+ · 会碰人的部件(攻击判定、范围)、声音、粒子不在里面,还是跟着怪的动作同步,和以前一样。
1851
+ · 两边找到的部件对不上时(比如这只怪先被别的东西改过),就不照着改,免得开关错部件。
1852
+ · 日志里每只找到部件的怪会有一行 “has parts that its FSMs switch”,后面是部件名字;
1853
+ 对不上时会有一行 “aren't the ones found here”。
1854
+ - 0.4.83 的做法(只给这一种怪单独列了网)已经去掉。
1850
1855
 
1851
- * 【打完机杼舞者以后的那段对话(聆听):先听完的一边开了门,另一边再听却不开门、出不去:修了】(0.4.83)
1856
+ * 【打完机杼舞者以后的那段对话(聆听):先听完的一边开了门,另一边再听却不开门、出不去:修了】(0.4.83,0.4.84 改成按接愿望的规则)
1852
1857
  - 原因:
1853
1858
  · 那段对话说完时,游戏会让你接下一个愿望,同时打开首领房的门和往下走的两条路。
1854
1859
  游戏靠“这个愿望接了没有”来判断对话是不是第一次说完:已经接了,就当成说过了、门早就开了,什么都不做。
1855
- · 两个人各在自己的游戏里听。你先听完,你这边接了愿望、开了门;
1856
- 模组照规矩把“接了这个愿望”复制到朋友那边。朋友听完时一看愿望已经接了,就走了“说过了”那条路,
1857
- 门没开,人出不去。
1858
- - 现在:
1859
- · 对话说完时判断“愿望接了没”的那一步:只是队友那边接了、复制过来的,在你这边不算接了。
1860
- 所以后听完的一边也会接一次(会再看到接愿望的提示),门和往下的路照样打开。
1861
- · 自己这边接过以后,再去听就和游戏原来一样。
1862
- · 整个游戏里,对话结束时这样判断的只有这一段。
1860
+ · 接愿望的选项框早就是“两个人都选「是」才接”。但这种不弹框、对话读到某一步就直接接下的愿望,
1861
+ 以前没走这个规则:你先听完,你这边直接接了,模组把“接了”复制到朋友那边,
1862
+ 朋友还在听,听完时一看愿望已经接了,就走了“说过了”那条路,门没开,人出不去。
1863
+ - 现在(0.4.84):
1864
+ · 对话里不弹框就接下的愿望,也按接愿望的规则:两个人都读到那一步才接,不会替另一个人接。
1865
+ 只管需要两个人都在场的那种对话(接愿望、交愿望前会检查队友在不在旁边的那种)。
1866
+ 对话说完以后角色还在演的那一段(比如走开、消失)里才接下的愿望,也算在这段对话里。
1867
+ · 先读到的人停在那一步:这一步后面的事(比如开门、往下的路)也一起等。聊天框会说在等队友;
1868
+ 队友那边会提示去把同一个角色的对话读到那里。等的时候不能再和同一个角色说话(会提示正在等队友),
1869
+ 免得对话被重新触发、跳过这一步。
1870
+ · 队友读到同一步时,两边一起接下(各自看到接愿望的提示),后面的事两边都照常发生。
1871
+ · 队友正在读同一个角色的对话时一直等;队友没在读时,最多等 20 秒(和接愿望的选项框一样)。
1872
+ 等不到就先不接、对话继续,存档里记住“你读过了”。之后队友什么时候读到同一步(或者在接这个愿望的
1873
+ 选项框上选「是」),两边就一起接下,不用你再去读一遍。差不多同时发生的也算(你这边刚停止等,
1874
+ 队友那边刚好读到)。
1875
+ · 队友中途断线、或者你在等的时候离开了房间:这次先不接,同样记住“你读过了”,等队友读到时一起接下。
1876
+ 两边都记着“读过了”却没对上的(比如消息丢了),下次两边存档对上时会互相问一次,两边都读过就一起接下。
1877
+ · 先在选项框上两个人都选了「是」、对话后面才真正接下的愿望,不会再等第二次。
1878
+ · 正在等的时候双人存档被解除:这一步直接接下(存档已经是单人的了)。
1879
+ 回主菜单或换存档时正在等:这一步不往下走,记住“你读过了”。
1880
+ · 0.4.83 的做法(只改这一段对话的判断,让后听完的一边再接一次)已经去掉。
1863
1881
 
1864
1882
  * 【首领血条的编号:两边可能对不上;两条血条是1号在下:都改了】(0.4.83)
1865
1883
  - 原因:
@@ -1870,7 +1888,159 @@ exe 旁边放一个 dll,让游戏启动时连带加载它。这是所有同类
1870
1888
  · 编号按两边都一样的固定顺序给(按房间里这只首领本来的名字排),同一只首领两边编号相同。
1871
1889
  · 两条血条时1号在上、2号在下;只有一条时,还在原来最下面的位置。
1872
1890
 
1873
- ※ 以上一百二十六条【没有实机验证过】。
1891
+ * 【机杼舞者联合技出现光圈时,你这边舞者眼睛里射出的光几乎都不指着场地中间:修了】(0.4.84)
1892
+ - 原因:
1893
+ · 光圈出现那一下,每只舞者先转身朝向场地中间,再把眼睛里那道光对准中间。
1894
+ 跑房间的那边,这两件事是同一瞬间做完的。
1895
+ · 另一边的舞者是照着跑房间那边演的,而“舞者转身”和“光的角度”是分两条路传过来的。
1896
+ 以前光的角度是按“在场地里朝哪个方向”抄过来,套在舞者那一刻的朝向上。
1897
+ 转身的消息晚到一点,光就是按转身前的朝向摆的;舞者转过身以后,光跟着被翻到另一边,
1898
+ 所以几乎都指不到中间。
1899
+ - 现在:
1900
+ · 光改成照抄“相对舞者身体的角度”。转身的消息先到还是后到都一样,最后和跑房间那边相同。
1901
+ · 所有怪身上被这样转动的部件都改了,不只这道光(挂在怪自己身上的部件才这样抄)。
1902
+ 平时冲刺前斜着指方向的那道光也是“先转身再定角度”,如果你见过它指歪,也是这个原因,一起改了。
1903
+ · 每帧都在转的部件见下一条(香炉那条)。
1904
+
1905
+ * 【末代裁决者扔香炉时,你这边的香炉不飞、扔出去后直接出现在地上:修了】(0.4.84)
1906
+ - 原因:
1907
+ · 香炉会飞,是因为游戏每一帧都沿一条弧线重新摆一次它的位置(往上 0.15 秒、往下 0.3 秒)。
1908
+ 以前不跑房间的那一边只在每一段开始时照抄一次“摆在哪”,之后没有东西再挪它,所以看不到它飞;
1909
+ 落地那一步把它一次性放到地上,于是它“直接出现在地上”。不是网络慢的问题。
1910
+ · 香炉和链子在战斗一开始就被怪从身上摘下来、放进了场地。以前“部件滑动”的复制只认还挂在
1911
+ 怪身上的部件,所以收回时香炉滑回来的那一下也没复制。
1912
+ · 链子的两头在游戏里是钉住的、不受重力;以前在不跑房间的那一边被改成了会受重力往下掉。
1913
+ - 现在:
1914
+ · 怪身上的部件(包括怪自己摘下来放进场地的)被设成“接下来每一帧都摆位置或角度”时,
1915
+ 不跑房间的那一边也每一帧自己摆,用跑房间那边一直传过来的数,直到那只怪进入下一步。
1916
+ · 收回时香炉滑回来、链子跟着香炉走,也照样演。
1917
+ · 被摘下来的东西,物理按游戏原本的设定恢复:链子两头不再往下掉。
1918
+ · 香炉在外面的时候,如果跑房间的那边离开了房间(比如死了回椅子,你接着打):以前你这边那只香炉会定在半空、
1919
+ 碰到会伤人,链子也一直留在场地里;现在它们和你这边的复制品一起关掉,怪接下来用它自己的那一份。
1920
+ 所有怪自己摘下来放进场地的东西都按这个来。
1921
+ · 跟着玩家走的部件不改(不跑房间那边的复制品认的“玩家”是自己,不一定是怪盯着的那个人)。
1922
+ · 不只香炉:全游戏大约 10 种怪、170 处左右这样每帧摆的部件都一起改了。
1923
+
1924
+ * 【遭遇战里那种会飞、能拼刀的小怪你这边不出来;有的房间里会飞的虫子只有一边看得到:修了】(0.4.85)
1925
+ - 原因:
1926
+ · 两边的游戏给房间里每只怪编一个号,靠这个号认出“是同一只”。号是按怪的名字和它在房间里的位置算的。
1927
+ · 有些怪在房间刚加载时,游戏会随机给它一个“远近”(只决定谁画在前面),两边随机出来的不一样,
1928
+ 同一只怪在两边就被编成了不同的号。跑房间那边说它出来了、动了、挨打了,另一边对不上号,
1929
+ 复制品就一直不出来,你打它也传不过去。
1930
+ · 不是网络的问题,网再好也一样。
1931
+ - 现在:
1932
+ · 编号不再算“远近”,只用名字和平面上的位置。全游戏的房间都查过了:这样不会有两只怪撞成同一个号。
1933
+ (按以前的算法,有一个房间里原本就有 2 对怪撞了号,撞号的那只两边都不同步;现在也没了。)
1934
+ · 受影响的一共 21 个房间、993 只:大多是之前说过的沙虫堆(沙里一下一下冒出来的那种),
1935
+ 另外就是这种会飞的小怪,还有几只别的。
1936
+ · 所有怪的编号都变了(两边算法一样,所以两个人必须用同一个版本,和以前一样)。
1937
+
1938
+ * 【平时藏在地里、有人走近才钻出来的那种小怪,你这边一直站在外面摆着攻击的样子:修了】(0.4.85)
1939
+ - 原因:
1940
+ · 这种怪藏起来靠的是一段“藏着”的动画,房间刚加载时放一次,之后一直保持,直到有人走近。
1941
+ · 以前跑房间的那一边,要等“这个房间由谁跑”定下来以后,才开始把怪的动画发给另一边;
1942
+ 房间刚加载那一下放的动画没发出去。另一边的复制品自己不放动画(都等跑房间那边发),
1943
+ 于是一直显示房间存档里那张图,这只怪存的那张正好是攻击的样子。
1944
+ - 现在:
1945
+ · 定下来由这边跑房间的那一刻,把每只怪“当前在放的动画”发一次(和“它开没开着”一样),
1946
+ 之后才进房间的人也能拿到。
1947
+ · 不只这种怪:所有一进房间就摆好一个姿势、之后很久不变的怪都一样。
1948
+
1949
+ * 【比试、回忆里的战斗:一个人倒下整场就算输了:改成两个人都倒下才算输】(0.4.86)
1950
+ - 原因:
1951
+ · 这类战斗里倒下,游戏本身不算真死:不掉钱、不留茧,直接算你输,把你放回游戏定好的地方。
1952
+ 以前这个 mod 对这种倒下完全不管,所以一个人一倒下,这一场就当场算输了:
1953
+ 和你们比试的角色已经算自己赢了,另一个人还在跟它打。
1954
+ · 比试的角色会告诉游戏“输了的人在它旁边醒来”。以前只有跑房间的那边听到了这一句,
1955
+ 另一边输了的人会回到椅子上醒来。
1956
+ - 现在:
1957
+ · 和所有首领战一样:一个人倒下先躺下,等队友来拉(和平时一样的拉法);两个人都倒下才算输。
1958
+ · 两个人都倒下以后,各自的游戏照游戏本来的样子处理:不掉东西,回到游戏定好的地方。
1959
+ 比试输了,两个人都在那个角色旁边醒来。
1960
+ · 所有“输了不算真死”的战斗都这样,不只比试;回忆里的战斗也是。
1961
+
1962
+ * 【有的会说话的角色,只有一边能跟它说话(比如骑虫子的骑士):修了】(0.4.86)
1963
+ - 原因:
1964
+ · 有些角色说话和打架用的是同一套控制,这一套只在跑房间的那边运行,另一边看到的是照着演的复制品。
1965
+ 以前在复制品身上按“对话”,你这边的游戏会把这一整套从头跑起来,从那以后你这边就多了一个
1966
+ 自己行动的它。所以实际上只有先进房间的人能正常跟它说话。
1967
+ · 骑虫子的骑士:能对话的那个部分,是房间刚开始时由它自己打开的。以前这种部分不复制,
1968
+ 后进房间的人那边一直关着,根本没有对话入口。
1969
+ · 骑士在两场之间休息的样子,名字里带着骑士的名字,以前被当成了要同步的那只骑士,
1970
+ 结果也只有跑房间的那边能跟它说话。
1971
+ · 有的角色打架时不能对话、停下来才能对话。以前“现在能不能对话”只在跑房间的那边切换,
1972
+ 另一边一直是房间刚加载时的样子。
1973
+ - 现在:
1974
+ · 两个人都能在自己的游戏里跟它说话,各听各的台词(听没听过也是各记各的,和所有角色一样)。
1975
+ 说一段、停一下再接着说一段的,整段都只在说话的人这边,另一个人不会被拉进对话。
1976
+ · 说完话以后它要做的事(比如开打),跑房间的那边也照做,两边一样。
1977
+ 说完话直接开打、不先把操作还给你的,也照原版的方式把操作还给你。
1978
+ · 你说话的时候,跑房间那边的人看不到它在跟你说话,只看到说完以后的结果。
1979
+ · 只会说话、不会打的角色,每边各自运行,和其他只会说话的角色一样。
1980
+ · “现在能不能对话”两边一样了。
1981
+ · 所有这样说话的角色都按这个来,不只骑士。
1982
+
1983
+ * 【角色当面问要不要打(比试之类)时,一个人选“是”就开始了:改成两个人都选“是”才开始】(0.4.86)
1984
+ - 原因:
1985
+ · 全游戏查过,角色当面问“要不要打”的一共 4 处。以前和平时的选项一样,谁先选“是”就开始了,
1986
+ 另一个人可能还没走过来。
1987
+ - 现在:
1988
+ · 和请求援助一样:一个人选“是”以后,停在选项上等;另一个人会收到一条消息,
1989
+ 要自己去和同一个角色对话、也选“是”,才一起开打。
1990
+ · 任何一个人选“否”,或者 45 秒内另一个人没选,就当两个人都没答应。
1991
+ (比交祈愿等得久,因为另一个人要先走过去、听它说完。)
1992
+
1993
+ * 【网络卡一下以后,有的东西一直不同步(比如怪在一边已经死了,另一边一直活着):修了】(0.4.86)
1994
+ - 原因:
1995
+ · 10-09 的日志里,你这边有一段 19 秒什么都没收到。这段时间里朋友那边发出的东西一样都没有到,
1996
+ 之后也没有补发:那边已经打死的怪,在你这边一直活着。
1997
+ · 走 Steam 中转时,“必须送到”的消息靠 Steam 保证送到,这个 mod 自己不补发;Steam 扔掉的就没了。
1998
+ · Steam 自己的说明里写着:连接 10 秒没动静就算断了,下一次发东西时自动重连,
1999
+ 重连时还没送到的“必须送到”的消息直接扔掉,不另外通知。而这个 mod 要 30 秒没动静才算断线。
2000
+ (那次是不是这样丢的,日志里看不出来;但这种丢法是确实存在的。)
2001
+ · 另外查到:以前如果某一次要发的东西打包出错,这一份会一直留着,之后每次都出同样的错,
2002
+ 从此什么都发不出去,但连接看起来还在。
2003
+ - 现在:
2004
+ · Steam 改成 45 秒没动静才算断(比这个 mod 的 30 秒长),不会在 mod 不知道的时候自己重连、扔东西。
2005
+ · 不管是什么原因丢的:只要有 3 秒以上什么都没收到,恢复以后马上向服务器再要一次“这个房间现在是什么样”:
2006
+ 谁在房间里、哪些怪已经死了或关掉了、在哪、在放什么动作。漏掉的死亡会补上;
2007
+ 怪正在做的事不会被打断重来;血量也照跑房间那边的改,你刚打出去、还在路上的那几下照样算(见下一条)。
2008
+ · 反过来也补:跑房间的那一边如果有 3 秒以上什么都没传到服务器,恢复以后服务器会让它把整个房间现在的样子
2009
+ 再发一次(每只怪开没开着、在哪、朝哪边、在放什么动作、血量、状态),记下以后再让房间里的另一个人照着改;
2010
+ 怪身上的各个部分(碰撞、图层、颜色之类)也各自再发一次。
2011
+ · 卡住的那几秒里打出去的攻击也不会丢:恢复以后照样扣血,只是晚一点(你得还在那个房间里;见下一条)。
2012
+ · 打包出错时,只丢掉出错的那一项(日志里写是哪一项),其余照常发出,不会再从此什么都发不出去。
2013
+ · 日志里会写卡了多久(Packets arrive again after …),收到读不出来的包也会写一条警告。
2014
+
2015
+ * 【网络卡过以后,两边怪的血量对不上,卡一次差一点,越打差得越多:改了血量的同步方式】(0.4.86)
2016
+ - 原因:
2017
+ · 以前血量是按“这一下扣了多少”发给对面的。只要有一条在路上丢了,对面就一直少扣这么多,
2018
+ 怪活多久就差多久;卡的次数越多差得越多,首领战打得久就更明显。
2019
+ · 跑房间的人(先进房的那个)一离开、由另一边接手时,接手那边会拿自己这份可能已经差了的血,
2020
+ 当成怪真正的血接着打。
2021
+ - 现在:
2022
+ · 跑房间那一边说了算:怪的血一变(不管是谁打的、回血还是换阶段),就把“现在还剩多少血”发出去,
2023
+ 连同“队友打的已经算进去了多少”。
2024
+ · 另一边打怪还是当场扣血,不用等;发出去的是“我一共打掉了多少”,不是“这一下多少”。
2025
+ 丢了一条也没关系,下一条里全都有;跑房间那边没回话,就隔一会儿再发一次(先每秒一次,十次以后每 5 秒一次),
2026
+ 直到它收到为止。
2027
+ · 另一边看到的血 = 跑房间那边说的血 − 自己打了、对面还没算进去的那部分。
2028
+ 所以不管中间丢过什么,只要收到最新的一条,两边就一样。
2029
+ · 卡顿以后补房间状态(上一条)时,血量数字也一起改对,不再只补“死了”。
2030
+ · 房间换人管时,接手的一边先把自己现在的血告诉大家,大家从这个数接着算。
2031
+ · 审查时还查出一个以前就有的问题:房间加载完以后才出现的怪(生出来的、后加载的),两边记的
2032
+ “这个房间换过几次人管”可能不一样,不一样时一边打的血另一边收不到。现在后出现的怪也用房间当前的这个数。
2033
+ · 卡顿以后补房间状态时,只有跑房间那边说“已经死了”的怪才会在你这边死掉;血是 0 但还活着的怪不会被弄死。
2034
+
2035
+ * 【从上面的平台下来时被“空气”打到:原因还没找到,加了记录】(0.4.86)
2036
+ - 原因:
2037
+ · 以前日志只记死亡,不记每一下挨打,所以那次是什么打到了朋友,两边的日志都看不出来。
2038
+ - 现在:
2039
+ · 每次掉血,日志里写一行 [Hurts]:掉了多少、被什么打的、它属于哪只怪、当时画面上画没画出来、
2040
+ 它在哪、你在哪。只写日志,不走网络,不改玩法;一分钟最多写 30 行。
2041
+ · 再遇到的话,把那次的日志(BepInEx\LogOutput.log)发过来,就能看出是什么。
2042
+
2043
+ ※ 以上一百三十六条【没有实机验证过】。
1874
2044
 
1875
2045
 
1876
2046
  六、出问题的话
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # silksong-coop-mod 0.4.83
1
+ # silksong-coop-mod 0.4.86
2
2
 
3
3
  The files a player needs to install a two-player co-op build of **SSMP**, packaged so they can be fetched from
4
4
  a mirror that is reachable inside mainland China. This is not a Node library: nothing here is imported or run
@@ -14,4 +14,4 @@ The BepInEx loader is included, so the install needs no network access at all.
14
14
 
15
15
  The multiplayer mod is the work of [Extremelyd1](https://github.com/Extremelyd1/SSMP). This is a modified copy
16
16
  that adds a shared two-player save; please do not take questions about it to the original author. Distributed
17
- under the GNU LGPL 2.1 - see `LICENSE`. Built from https://github.com/Candy-649/SSMP at `2e79dce`.
17
+ under the GNU LGPL 2.1 - see `LICENSE`. Built from https://github.com/Candy-649/SSMP at `2b65f7d`.
package/SSMP/SSMP.dll CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "silksong-coop-mod",
3
- "version": "0.4.83",
3
+ "version": "0.4.86",
4
4
  "description": "Offline installer payload for a two-player co-op build of the SSMP Silksong multiplayer mod. Not a Node library.",
5
5
  "license": "LGPL-2.1-or-later",
6
6
  "author": "Candy-649 (https://github.com/Candy-649)",