Gametime式脱离贯通中的数学原理(辅助理解用)

虽然深蓝写过了,但是我还是姑且说一下我最近的研究

我最近看了一下gametime式脱离贯通,同时看了一下 みらくる式anim习得。有点心得。


回到正题,“gametime式脱离贯通”,是对付“gametime式脱离”的


何为gametime式脱离?


就是 statedef -3 下 写上

[State 0, VarSet]
type = VarSet
trigger1 = 1
sysvar(XXX)= gametime的表达式
supermovetime = 2147483647
pausemovetime = 2147483647
ignorehitpause = 1


然后 statedef -2下写上


[State 0, ChangeState]
type = ChangeState
trigger1 = sysvar(XXX)!=gametime的表达式
value = YYY                        ;← 脱离的状态 
supermovetime = 2147483647
pausemovetime = 2147483647
ignorehitpause = 1


原理是:-3下的代码在 “自身被对方带入对方的状态”的时候,是不执行的。

但是-2每帧都执行。

一旦-3不执行了。那么sysvar(XXX)就会停止变化。

一旦停止变化,下一帧的时候,-2里的

trigger1 = sysvar(XXX)!=gametime的表达式      就会起作用。

起作用后,就被changestate从别人拖入的状态里 脱离 到 YYY 这个状态 

================================================

为了突破这种脱离,就需要“gametime式脱离 的 贯通”


暂且先不谈代码。先来探讨数学问题。

首先,很多人物的gametime式脱离用的是“一元二次函数”的形式。

也就是:



这个形式


刚才那个sysvar(XXX)= gametime的表达式

就可以写成

sysvar(XXX)= 123*gametime*gametime+ 321*gametime + 233


其中

sysvar(XXX)就是Y。123、321、233就是 a、b、c 。gametime就是 x

如果你写是sysvar那还好一点,如果是 用 var来进行gametime式脱离的话,麻烦就大咯。

因为 一般那些神最上,用的gametime脱离贯通,都是针对那些 用 var来进行脱离的人物。


但是有人说,如果我用sysvar不就好了么?可惜往往很多时候变量不够用!所以你才会去用var进行gametime式脱离。


好了,如果说,我不告诉你 sysvar(XXX)= gametime的表达式,那你该如何得到正确的表达式呢?

没错,gametime式脱离 的 贯通,就是去计算出 gametime表达式的,然后通过parentvarset来将本体的变量还原,使得对方无法脱离,从而将对方拖入自定义状态,。


当然,因为表达式千变万化,所以,绝大部分人物的gametime式脱离贯通,依然只是对 ““一元二次函数”作为gametime表达式 的 这种类型的人物”进行的贯通


那么 那些聪明的神最上 是怎么得到表达式的呢?

首先我们看个模型:

假设 gametime为 x 。其三个系数为a,b,c

①,假设 表达式为 

y = ax^2+bx+c


由gametime的特性可知,gametime每一帧加1,这会导致 y 变化

那么,我们可以通过gametime不断加1的特性,来列出方程组:


②式 - ①式 得

a*( 2x + 1 )  + b  = N - M    -------- ④


③式 - ①式 得

2*a*( 2x +2 )  +2*b  = L - M    

两边除以2得  

2*a*(x+1) + b = (L - M) / 2   --------- ⑤


这个时候,将 ⑤  -  ④ 得:

a =  (L - M) / 2  + (N -M)


算出a值后,将a的值 带入 ④

b = N - M  - a*( 2x + 1 )     (注意,这里a值已经是已知)


将a,b值带入 ①式,即可得到

c = M - bx - ax^2


综上所述:

a =  (L - M) / 2  + (N -M)   =  ( (L - M)  + 2*(N -M) )  /  2           (等级变换)

b = N - M  - a*( 2x + 1 )    =  N - M - ( a(x+1)^2  -  ax^2 )  (等价变换,相当于②-①)

c = M - bx - ax^2


得到了 a,b,c,就模拟出了 对方gametime的表达式。


但这里存在一个致命的问题,就是如果a,b,c不是整数呢?

比如

var(XXX)= 0.1*gametime*gametime+ 0.2*gametime + 233

如果gametime=100,那么

var(XXX) = 1000 + 20 +233 = 1253  (整数)


但在计算过程中,

a =  (L - M) / 2  + (N -M)   =  ( (L - M)  + 2*(N -M) )  /  2    

这里的a,是一般是用 整型变量var(YYY)来记录的。

这就导致,将0.1 赋值给 a的时候,Mugen会自动将0.1 先变成整数 0

然后,把0 赋值给 a。这样子  a=0 了。这就错了。

但是现在很多上位神,依然用的整型变量来记录a,b,c。这点是个大问题呢。


=======================================

这里拿 V圆的 代码举例子  (此部分为 gametime变量计算 部分)


[State 155, ステ抜け変数初期化]
type = Null
trigger1 = !var(56)
trigger1 = var(23) := - 1 || var(27) := - 1 || var(31) := - 1 || var(35) := - 1 || var(39) := - 1
trigger1 = var(43) := - 1 || var(47) := - 1 || var(51) := - 1 || var(55) := - 1 || var(59) := - 1
trigger1 = var(56) := 1
ignorehitpause = 1

[State 155, ステ抜け変数調査]
type = Null
trigger1 = 1 || var(58) := var(58) * (var(58) < 10) || var(57) := ifelse(!var(58), gametime, var(57)) 
trigger1 = 1 || var(59) := ifelse(var(59) < 59 || var(59) = 59 && var(58) > 0, var(59), - 1) + !var(58)
trigger1 = 1 || var(10 + var(58)) := enemy,var(var(59))
trigger1 = var(58) := var(58) + 1
ignorehitpause = 1

[State 155, ステ抜け変数判定]
type = Null
triggerall = var(58) = 10
triggerall = var(10) != var(11) && var(10) != var(12) && var(10) != var(13) && var(10) != var(14) && var(10) != var(15)
triggerall = var(10) != var(16) && var(10) != var(17) && var(10) != var(18) && var(10) != var(19) && var(11) != var(12)
triggerall = var(11) != var(13) && var(11) != var(14) && var(11) != var(15) && var(11) != var(16) && var(11) != var(17)
triggerall = var(11) != var(18) && var(11) != var(19) && var(12) != var(13) && var(12) != var(14) && var(12) != var(15)
triggerall = var(12) != var(16) && var(12) != var(17) && var(12) != var(18) && var(12) != var(19) && var(13) != var(14)
triggerall = var(13) != var(15) && var(13) != var(16) && var(13) != var(17) && var(13) != var(18) && var(13) != var(19)
triggerall = var(14) != var(15) && var(14) != var(16) && var(14) != var(17) && var(14) != var(18) && var(14) != var(19)
triggerall = var(15) != var(16) && var(15) != var(17) && var(15) != var(18) && var(15) != var(19) && var(16) != var(17)
triggerall = var(16) != var(18) && var(16) != var(19) && var(17) != var(18) && var(17) != var(19) && var(18) != var(19)


trigger1 = var(23) = - 1
trigger1 = 1 || var(20) := (var(12)-var(10)-(var(11) - var(10)) * 2) / 2
trigger1 = 1 || var(21) := var(11) - var(20) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(20) * var(57) * var(57))
trigger1 = 1 || var(22) := var(10) - var(20) * var(57) * var(57) - var(21) * var(57)
trigger1 = 1 || var(23) := var(59)


trigger2 = var(27) = - 1
trigger2 = 1 || var(24) := (var(12) - var(10) - (var(11) - var(10)) * 2) / 2
trigger2 = 1 || var(25) := var(11) - var(24) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(24) * var(57) * var(57))
trigger2 = 1 || var(26) := var(10) - var(24) * var(57) * var(57) - var(25) * var(57)
trigger2 = 1 || var(27) := var(59)


trigger3 = var(31) = - 1
trigger3 = 1 || var(28) := (var(12) - var(10) - (var(11) - var(10)) * 2) / 2
trigger3 = 1 || var(29) := var(11) - var(28) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(28) * var(57) * var(57))
trigger3 = 1 || var(30) := var(10) - var(28) * var(57) * var(57) - var(29) * var(57)
trigger3 = 1 || var(31) := var(59)


trigger4 = var(35) = - 1
trigger4 = 1 || var(32) := (var(12) - var(10) - (var(11) - var(10)) * 2) / 2
trigger4 = 1 || var(33) := var(11) - var(32) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(32) * var(57) * var(57))
trigger4 = 1 || var(34) := var(10) - var(32) * var(57) * var(57) - var(33) * var(57)
trigger4 = 1 || var(35) := var(59)


trigger5 = var(39) = - 1
trigger5 = 1 || var(36) := (var(12) - var(10) - (var(11) - var(10)) * 2) / 2
trigger5 = 1 || var(37) := var(11) - var(36) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(36) * var(57) * var(57))
trigger5 = 1 || var(38) := var(10) - var(36) * var(57) * var(57) - var(37) * var(57)
trigger5 = 1 || var(39) := var(59)


trigger6 = var(43) = - 1
trigger6 = 1 || var(40) := (var(12) - var(10) - (var(11) - var(10)) * 2) / 2
trigger6 = 1 || var(41) := var(11) - var(40) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(40) * var(57) * var(57))
trigger6 = 1 || var(42) := var(10) - var(40) * var(57) * var(57) - var(41) * var(57)
trigger6 = 1 || var(43) := var(59)


trigger7 = var(47) = - 1
trigger7 = 1 || var(44) := (var(12) - var(10) - (var(11) - var(10)) * 2) / 2
trigger7 = 1 || var(45) := var(11) - var(44) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(44) * var(57) * var(57))
trigger7 = 1 || var(46) := var(10) - var(44) * var(57) * var(57) - var(45) * var(57)
trigger7 = 1 || var(47) := var(59)


trigger8 = var(51) = - 1
trigger8 = 1 || var(48) := (var(12) - var(10) - (var(11) - var(10)) * 2) / 2
trigger8 = 1 || var(49) := var(11) - var(48) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(48) * var(57) * var(57))
trigger8 = 1 || var(50) := var(10) - var(48) * var(57) * var(57) - var(49) * var(57)
trigger8 = 1 || var(51) := var(59)


trigger9 = var(55) = - 1
trigger9 = 1 || var(52) := (var(12) - var(10) - (var(11) - var(10)) * 2) / 2
trigger9 = 1 || var(53) := var(11) - var(52) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(52) * var(57) * var(57))
trigger9 = 1 || var(54) := var(10) - var(52) * var(57) * var(57) - var(53) * var(57)
trigger9 = 1 || var(55) := var(59)
ignorehitpause = 1



上面这段,一般由 探查用helper 来完成。



=================================

这里稍微解释一下:

[State 155, ステ抜け変数初期化]
type = Null
trigger1 = !var(56)                ;   gametime脱离贯通初始化的开关。
trigger1 = var(23) := - 1 || var(27) := - 1 || var(31) := - 1 || var(35) := - 1 || var(39) := - 1
trigger1 = var(43) := - 1 || var(47) := - 1 || var(51) := - 1 || var(55) := - 1 || var(59) := - 1
trigger1 = var(56) := 1
ignorehitpause = 1


这个 是 变量的 初始化。

有些作为flag的变量,每一帧一开始一般会初始化


[State 155, ステ抜け変数調査]
type = Null
trigger1 = 1 || var(58) := var(58) * (var(58) < 10) || var(57) := ifelse(!var(58), gametime, var(57)) 
trigger1 = 1 || var(59) := ifelse(var(59) < 59 || var(59) = 59 && var(58) > 0, var(59), - 1) + !var(58)
trigger1 = 1 || var(10 + var(58)) := enemy,var(var(59))
trigger1 = var(58) := var(58) + 1
ignorehitpause = 1

这有两个作用

①,通过var(58)来进行 下面 gametime表达式 的计算。

②,将var(10) - var(19)  赋值为 敌方的某一个变量的10帧内的10个不同值。

我来解释一下代码:

首先  第一句

trigger1 = 1 || var(58) := var(58) * (var(58) < 10) || var(57) := ifelse(!var(58), gametime, var(57)) 

这个 1 ||  xxx 的写法 是用来赋值的写法。

var(58) := var(58) * (var(58) < 10)  指的是,

如果var(58)<10,那么var(58)不变;

如果var(58)大于等于10,那么让var(58)归零。这一般用来控制循环的次数。


var(57) := ifelse(!var(58), gametime, var(57)) 
如果var(58)为0的话,就把gametime赋值给 var(57)。否则var(57)不变

很显然,var(58)每10帧 变一次 0. 目的是记录10帧的同一个变量的值[ var(10)~var(19) ]。

所以var(57) 每次如果改变了,那么每次相差10 。

------

第二句:trigger1 = 1 || var(59) := ifelse(var(59) < 59 || var(59) = 59 && var(58) > 0, var(59), - 1) + !var(58)   这句也是赋值语句


var(59) := ifelse(var(59) < 59 || var(59) = 59 && var(58) > 0, var(59), - 1) + !var(58)  

这个赋值语句很长,一步一步来分析

var(59) < 59 || var(59) = 59 && var(58) > 0  这是 ifelse条件语句的判断条件

如果“var(59)<59” 或者 “var(59) =59但是var(58)>0”,ifelse语句就返回var(59)。

否则就返回 -1 。 结合后面的  !var(58)  (var(58)每10帧 变一次 0,所以这个每10帧变一次 1)可以理解出。

这个句子 是 每10帧 让var(59) 加 1 。

并且如果var(59)超过59了,就让var(59) 的值变为  -1( ifelse ) + 1( !var(58) ) =0  。


基本上,我们可以猜出,这个var(59)就是 “敌方的变量序号” 了

------

下面两句:

trigger1 = 1 || var(10 + var(58)) := enemy,var(var(59))
trigger1 = var(58) := var(58) + 1     


果然,enemy,var(var(59)) ,就是表示 敌方var(59)这个序号的变量

也就是,如果var(59) = 3 。那么 enemy,var(var(59)) 就是 敌方的var(3)

trigger1 = var(58) := var(58) + 1     这句,每帧var(58)会自己增加1 。

那么,var(10 + var(58)) 表示 var(10) ~var(19)  了。


这就是让 自身 var(10)~var(19)这10个变量,记录了对方某一个变量10帧内的10个值。

也就是,

var(10)   --- 第1帧变量值

var(11)   --- 第2帧变量值

var(12)   --- 第3帧变量值

...

var(19)   --- 第10帧变量值

----------------------------


下面这段

[State 155, ステ抜け変数判定]
type = Null
triggerall = var(58) = 10
triggerall = var(10) != var(11) && var(10) != var(12) && var(10) != var(13) && var(10) != var(14) && var(10) != var(15)
triggerall = var(10) != var(16) && var(10) != var(17) && var(10) != var(18) && var(10) != var(19) && var(11) != var(12)
triggerall = var(11) != var(13) && var(11) != var(14) && var(11) != var(15) && var(11) != var(16) && var(11) != var(17)
triggerall = var(11) != var(18) && var(11) != var(19) && var(12) != var(13) && var(12) != var(14) && var(12) != var(15)
triggerall = var(12) != var(16) && var(12) != var(17) && var(12) != var(18) && var(12) != var(19) && var(13) != var(14)
triggerall = var(13) != var(15) && var(13) != var(16) && var(13) != var(17) && var(13) != var(18) && var(13) != var(19)
triggerall = var(14) != var(15) && var(14) != var(16) && var(14) != var(17) && var(14) != var(18) && var(14) != var(19)
triggerall = var(15) != var(16) && var(15) != var(17) && var(15) != var(18) && var(15) != var(19) && var(16) != var(17)
triggerall = var(16) != var(18) && var(16) != var(19) && var(17) != var(18) && var(17) != var(19) && var(18) != var(19)


trigger1 = var(23) = - 1
trigger1 = 1 || var(20) := (var(12)-var(10)-(var(11) - var(10)) * 2) / 2
trigger1 = 1 || var(21) := var(11) - var(20) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(20) * var(57) * var(57))
trigger1 = 1 || var(22) := var(10) - var(20) * var(57) * var(57) - var(21) * var(57)
trigger1 = 1 || var(23) := var(59)

....

....


这段是,变量计算,就是上面的“一元二次方程”。


首先 triggerall = var(58) = 10 这个用来判断的,如果var(58)刚好10帧了,那么就可以开始下面的变量计算了。

triggerall = var(10) != var(11) && var(10) != var(12) && var(10) != var(13) && var(10) != var(14) && var(10) != var(15)
triggerall = var(10) != var(16) && var(10) != var(17) && var(10) != var(18) && var(10) != var(19) && var(11) != var(12)
triggerall = var(11) != var(13) && var(11) != var(14) && var(11) != var(15) && var(11) != var(16) && var(11) != var(17)
triggerall = var(11) != var(18) && var(11) != var(19) && var(12) != var(13) && var(12) != var(14) && var(12) != var(15)
...

...
triggerall = var(16) != var(18) && var(16) != var(19) && var(17) != var(18) && var(17) != var(19) && var(18) != var(19)


这段,是 判断 每一个值 是否 “互不相同”。

比如,对于var(10)来说,需要判断var(11)~var(19)和它不同。

而var(11)就只要判断var(12)~var(19)和它不同就行了。因为之前判断var(10)的时候,已经判断过var(10)和var(11)是否相同了。

如果,其中有两个值相同,那么在gametime为正数的情况下,就不是“一元二次函数”,那就没必要进行下面的操作了


trigger1 = var(23) = - 1
trigger1 = 1 || var(20) := (var(12)-var(10)-(var(11) - var(10)) * 2) / 2
trigger1 = 1 || var(21) := var(11) - var(20) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(20) * var(57) * var(57))
trigger1 = 1 || var(22) := var(10) - var(20) * var(57) * var(57) - var(21) * var(57)
trigger1 = 1 || var(23) := var(59)


这段,就是上面"一元二次函数"的 系数a,b,c的计算过程了

var(23)是flag,如果var(23)不是-1,那么就不执行下面代码。

显然上面已经 “初始化”过了,所以这里可以执行。

-----

var(20) := (var(12)-var(10)-(var(11) - var(10)) * 2) / 2

这一句,就是

a =  (L - M) / 2  + (N -M)   =  ( (L - M)  + 2*(N -M) )  /  2           (等级变换)


var(20)就是a,L就是第3帧的变量值var(12)  , N就是 第2帧的值var(11) 。

而M则是第1帧的变量值var(10)


var(21) := var(11) - var(20) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(20) * var(57) * var(57))

这句 就是

b = N - M  - a*( 2x + 1 )    =  N - M - ( a(x+1)^2  -  ax^2 )  (等价变换)

注意,这里 x(gametime) 是知道的,因为上面用

var(57)已经记录过了哦~。不要忘了哦~~

所以 x = var(57)

将赋值语句整理一下可以得

var(21) := var(11)  - var(10) - var(20) * (var(57) + 1) * (var(57) + 1) + var(20) * var(57) * var(57)

也就是

b =  N - M - ( a(x+1)^2  -  ax^2 ) 

注:x^2用var(57)*var(57)来表示。而 (x+1)^2则是用  (var(57) + 1) * (var(57) + 1) 来表示。

a = var(20) 刚才才算出来的哦!!


有了 a 和 b后,c只需要带入 ①式,即可算出

自然最后一句

var(22) := var(10) - var(20) * var(57) * var(57) - var(21) * var(57)

就是

c = M - bx - ax^2




最后这句:trigger1 = 1 || var(23) := var(59)

则是将 var(59)的值 赋值给 var(23) .

这么做,是让var(23)保存当时的值。因为var(59)在不断的变化,一般不拿出来使用。

所以就用var(23)来临时记录var(59)的值。

还记得 var(59)是什么吗?

var(59) 是 敌方的变量号。

当 var(23) != -1 的时候,表示 计算完成 


---------------------------

这样看来

a,b,c全都有了,有的同志要问,

为什么,a,b,c都求出来了,

下面,还要 再求几遍?比如:

trigger9 = var(55) = - 1
trigger9 = 1 || var(52) := (var(12) - var(10) - (var(11) - var(10)) * 2) / 2
trigger9 = 1 || var(53) := var(11) - var(52) * (var(57) + 1) * (var(57) + 1) - (var(10) - var(52) * var(57) * var(57))
trigger9 = 1 || var(54) := var(10) - var(52) * var(57) * var(57) - var(53) * var(57)
trigger9 = 1 || var(55) := var(59)



我和你们的想法一样,下面的这几段代码,根本没必要。这属于 代码冗杂。

或者说,这就是套用的模板。

其实,下面这几段放着,也有好处,你需要修改。

改进后,就有用了。


你想,刚才我们不是记录了 var(10)~ var(19)这10个变量么?

到目前为止。

我们仅仅使用了 var(12),var(11),var(10) 这3个变量,

是否能改进一下呢?

举个例子

trigger4 = var(35) = - 1
trigger4 = 1 || var(32) := (var(15) - var(13) - (var(14) - var(13)) * 2) / 2
trigger4 = 1 || var(33) := var(14) - var(32) * (var(57) + 1) * (var(57) + 1) - (var(13) - var(32) * var(57) * var(57))
trigger4 = 1 || var(34) := var(13) - var(32) * var(57) * var(57) - var(33) * var(57)
trigger4 = 1 || var(35) := var(59)


使用 另外3帧计算出来的值。

另外3帧计算出来的值,可能存在更正确的性质。

碰到 有些人物用分段函数写的gametime式脱离,很可能前3帧不是一元二次函数,

而后3帧是 一元二次函数,所以,在后面gametime贯通部分,会将这两个组的a,b,c的值 都去试验的。

提高成功率。



==========================


接下来的 gametime贯通部分


那就简单了。

我直接拿  深蓝大小姐的 代码来变换变换

[staetdef 2];gametime式贯通
[state ]
type=parentvarset
triggerall=playeridexist(探查helper的 ID)         ;探查用helper是否存在
trigger1=playerid(探查helper的 ID),var(23) != -1      ;探查helper的 var(23) 是否计算完成?
trigger2=playerid(探查helper的 ID),var(20)        ; 只要其中有任意一个有值,就说明其他也有值
trigger3=playerid(探查helper的 ID),var(21)
trigger4=playerid(探查helper的 ID),var(22)

var(playerid(探查helper的 ID),var(23))=gametime * gametime * playerid(探查helper的 ID),var(20) + gametime * playerid(探查helper的 ID),var(21)  +  playerid(探查helper的 ID),var(22)

ignorehitpause=1

------

triggerall=playeridexist(floor(root,fvar(5)));探查用helper存在

这句是判断探查helper是否存在,不存在的话,什么都是假的。

trigger1=playerid(探查helper的 ID),var(23) != -1  

判断 是否 计算完成。计算完成后,才可以进行 贯通。


var(playerid(探查helper的 ID),var(23))=gametime * gametime * playerid(探查helper的 ID),var(20) + gametime * playerid(探查helper的 ID),var(21)  +  playerid(探查helper的 ID),var(22)

这句就是:

var(playerid(探查helper的 ID),var(23)) 表示 var(敌方的变量) 

= a * gametime*gametime + b *  gametime  + c



================================



好了,gametime脱离贯通差不多就是这些了。有兴趣的自己去拆人物吧。



我之前对 

var(xxx) = gametime % A   

进行了思考。发现

即使得到 

第一帧的值 var(10)

第二帧的值 var(11)

.....

用处也不大,因为很难下手。

但是鉴于 “gametime会每一帧 +1,导致对方var(XXX)也会每一帧+1” 这个特性


可以将 y = x +b 这种一次函数直线 来模拟 y = x %A 这个函数。


因为很多作者会将 A 设置的很大,所以,很可能在50帧之内,通过一次函数直线来模拟

来即死对方。


所以 一般 gametime%A 这种类型,A最好不要太大。


-----------------------

当然,如果是 多段不同函数相加。就得考虑,相邻2帧内出现相同值的情况。

比如 一个是 递增的函数,一个是递减的函数,就可能出现相邻2帧出现相同值的情况。


这就会出现“漏洞”。gametime脱离 自动就不起作用了。

所以,在gametime式脱离的书写过程中,所使用的函数,请尽量选取单调性单一的函数。



~ Fin ~

by: yui

date:2015.05.28


 
评论
热度(3)
 
回到顶部