From e036abee6049ec1d0f29cd3411123a35a95be742 Mon Sep 17 00:00:00 2001 From: Randy Thiemann Date: Sat, 28 Oct 2023 22:27:58 +0200 Subject: [PATCH] Big Chungus --- bin/DMGTRIS.GBC | Bin 131072 -> 131072 bytes bin/DMGTRIS.pocket | Bin 131072 -> 131072 bytes src/field.asm | 125 +++++++++++++++++++++++- src/gbc.asm | 217 +++++++++++++++++++++++++++++++++++++++++ src/main.asm | 2 +- src/state_gameplay.asm | 29 +++--- 6 files changed, 355 insertions(+), 18 deletions(-) diff --git a/bin/DMGTRIS.GBC b/bin/DMGTRIS.GBC index 4ada00d779874a8618d09a33d530402fe9d7c8e1..41d46dea1123a5222f47d8dae051e3ab2ee6403b 100644 GIT binary patch delta 6789 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%0A3Mx;+7Y(UV8^v4KY2s)8Ii?9VjFVg1`wjmfq z`Xa)1gbb0sgs>AKQ>2>^c8MOKERpU(@}nwSq&*0)AQ(lu58+jWF(Q2#;WdP@BHfSh z211TV-$eKgLas>PLU;$kB+`FIIE0WV(qAF`4&e@wz73^^zK3KM>0wlb5b{OZhcJL( z5$O>G5ure&{Rsb#U=`_6gyRT>A{|6HhfpNa4-h^=C>H4uf`nib>1l+I5ypx1tPANA z_zKIe;Vwt&ZH39V0$+LW;^AB*URK;bz5Q|rWEEC(;w^-pQ(s(!X=SrK6n{_A*&N)` z9DKbw_-=FX{+3`%OR%RUcy)R3y_R4}hkPnF-=2j@8>YpW3+o|&7!n+i47YZ|$|jQG z_rWqPPwu!$CCtJ^d8P}l$Ycuteh1w0XP~PS@EL@RMmnixz&iG6hjlSnok^sV$uxSp z=hqM+9R|TF4F#cfjx>aM1kA`8_|~9vm^F`OLoRtpIt}j#(2Qv-)ttks+UBK=2jd7v z=mUPv!0(Mb)%vzQJX9;g&k(yd7qflra`zl|@?p3edTA56H_MYu>RE;>Af1F45<|j# z=@b~^FSsLMA5ZE3?^OTeWUBw&PRxhn={m^wq{-E3^5Rk1(+TG@)c_V`wDF!a`OP%> naGE@rkiTiF|A{`4>O&+n;x89pRU@%{^OS!c>Fx59zhC-4pJ&R; delta 5719 zcmcgwdvp}l8J|1*%9GtO$?oO>%n*?+2mv3&Vlr;XW0Q~?NwCNx*`z3-i0!E@Vk>5O zh=4%B6$Yr4L0hGdbCy%o(4%moLv=TqIXo&s(b}O%s#B2h6zE}UXZzim+0CM{r+*cg zy}$2%kNeHN-~GOCh(xj?ku3II^ADjtAS#PR?S4^tK-3nA%Kf6|3Mz}ll?p*8lF1~@ zg)n!Kh$Vr$7)x$vS#O2cX+I`?7`!By=(*ZUg2%i4*&mS47e(!;IjefQ)+OpxU$i=_ z%$@*za0NPu>L&SEB)58P46zH*gjDPEBE%b`3-uwODPk8x97Tj(n&gYgt*lFVP{itB zijBxi<%iJN=vGu5-GcHDMr~_Qk7dz?ErQn9ELh5T$)nbiE`~mex=4^!FAuqOMCWS{ zidDMn4w5BcIUwdT!J{aG{nD0;RSbU=1&Qox`b*X}7i(h=(n zjKhFrZGmD8Y%CG*U|A)pyPdP(45r=S@ftq&f8sP$cOh@I zCYL_QXMNX3dc4tyyS!w9_|6&S*|@e)eCIF9&bZbgzVlaQPh1O&(ZlXq$I>vhE*w4U zDUH&ewPcqV{gtQEoIH5evk&=}=j%zjTr!3-b0~r#y8DL4o^|e(Izi{MS@H!oC|?vX z9RYd?(6cO>1bQ6M^%lJb=vts>TQmZCJkYfky&C9Zpj$2426Qga4Hmr?=syG9CSU9^ z7PP~}>lp&;fSv&K9819g^a7wm7X1{^KLz?;i*^G20?>^Xy&mXQK+iR3JqO4WKsK4= zCLp_koChSi&K*5l@G=?Ak8UiS(mh2)i^zrXC8>wfQQ(?R2Cm5OX$v5F zXcx>W$C3%SGYPq09*{*mPXwGSiHQsi-4XagPJpa*A0^yJMg2u%CiYPNk6A}}bf5?X znMCqP;BxtqfC|qAcs}*N#kwqJw5zD7$CROe4#NJO28)({Oeyz?t+5a@Ma+KEF!33v zo`>fwJb#udJ>dUs`eV(BVR3}VLd?S!`hcgU!Y+f3pH0}wrWSR)G zwhU~~z>W;;1gxd~)8>hfC78t&Y>|^_UA?+B`!ivlM_Azz_IZRk9wF+HHc~@(>E%=Z znZU@Uy8toq#CNOvT)z5RNd4WR zfP-~QFn7SWj0}qhNBjL~((*#&|5AeA=acX|>MHy+!s9PtlU3PweEG*KD=R{eSG3wb zda5wmReXQXxqOY_^}o?=8sZ^pW@#j^m(g{ajn^rQUVd52=jB%t?B5iEhqQrswoD;;mQrjyYgg<% zTd6pB*m^M6IbVdWHY~D8F>C_EunMDL7e>P}lNDSgzpUi(Pspz*`Fuj@g4)n6KCXOE zlv>P$LT9Tr1Ff_clY`SHi;!cY`%1MW3SFLRSuy$S~ir}rcwEcXeI`BJiHl1y!yxq%RT zF8GI6oLb7&JtQj2MCDUSbc?ii@w1>qi;OkX=F&MOEKrJ(=Wuo>F zP!EaG+_K6RC}_@O($U#QX>%NtcDES_=58_&^^%V{lSDa$Fv-UdI@(Kk327FUSZBkpw=dV;-=ue-YlE zBna%u5ZId`Fw@vS`cAD|90-BjFYB1PT`12mbfAv8-@^V9>dg#J+~C}7i1`WgXxLIY zBsa=U(xZqa z!#suOodHJ`p20S_8xfk?gN13oHXrL`RYL?r;6WO*0Og46^$3A}}t z-a--LGXc?R0!WE|s7j{I4iRD&>zM%V%otp1i9l|(GPzTPK$gzUOt22PCKlEmpdPl= z!y<$@b}20GB+(etV;}Yy1+uCvM`Obd`>?}y%rgCq4g2fE{*stwx)~dG*N5FTv`jB! z!`_a@-Z}!gRfdBT3~yuCIqSpD8s3=B#=uwZD2eEzPEi_Pd)>_hW85_oO(tOs*w9uI zPU4Ua-P$u>9GEaLp_Tc#E_+S~b7>c{<5-D>;B`#Kkin?fon~b5CPOnA-yddVTMTDC zHWeFYbXulL48|pkf#1(IIWQL9zZBLBTSB)OLKS<=_569%jCv+T^>TK!`p&7fJ|@zS z9!B0I+$M&PBbD&l0aARN*_HqbUp+ofr7-t-1hKvAgJ>@zFAVffn2ExOoG)@y)*(M0 zU#vx~qwyK_e^{>`*Bvmxc};-5Er&3r;P|*vb%-MuioLJYpd!G&=3cJhgX++aUUl>sL%3Gz)EyAab5Ys?DFK-nhO%R|Ua*J2JARnH27S9ygV55807S!b!GbxqD_vWyl z;B3KegM9IZTPiM;eob+Yw4oBR(#>sZL#zwZ1_fz@JJyDL(UA@+d9X3K-p_#k%M^o;YhqZ{#2eY^vG3y;}5(PVB%I~oH8xc9Yov^OU! zz3#$JR7O^KxiR~Yx2M9ZDzK&5QdLlWUmo=TgnBp3#N(*YNQrz{JGf!BApHL;~YL5Dz^lC0MHBP;rl$!IHd*ak@4X`v$#V`<_aX{Rh zf=t7Gz7LJfgN@q+8|R;nXNq4$W2w|kF3!a{!0T;#5#5b?|IvlUkL?-ha^No&d`}#3 zPcZz=Fno0w9vOzPK`Ggj!w|MAH9Is6VbfBxS{${cFzjCnjv9urld0KpX_)x07dOw- zmAy)iJRz@U_;BwXt5GK^DX5WduTf8i)Du!$&72NtagB5B`BP_42<_Z~HK?=)LOw%; z#UhW^NbNKAWL*7|yajGraZLVG+Qv)4Oo1(M@k`*Q4D+uyumvuD32XZ%J~ZD2UsDCg zI@Y2{AzO1EEN`Sn5oe3fTZ?jEtVRCu{|c%nMppdE(n5M!pR2p?-0EX^^~6M z!vTO(7HyPGyZV`*R6o_x+bbH>E!9IdP&77#t>OA=QBg;v20Dd8b&Kie4nwd?-XW}L zXf+B_Kj`6Px1!-I$<8u45PEw@y?@l>I_kfx9xBn3dUoI^#u8N$%XK}4yc6(-(#7hD zD*41n>lnh-mhkN<;p&lvu}{Xk9M_$6qk6I$AFjDh2&>}PJXtNDG#1(uRCmB8InDRU zcr|z5K&@8oqYnNozrfwviX)_SU1Z z*k)fn@}d>os`cpZ%FKA7?dmh~2}!JlbKjuydSRf+=$LBF(m!GqDQFzIiZoYbTJHBW zLXfP-yS({OAQ!7ZLd}!DsnX0CxzgxVz^Pt=C@WPrht!Rcj7!C?3gKHNwR5vKpl=m# zgk#Czs!v9&f>O9y z{aHxe)~arwt3J!`dlAZz8+tga#5r1owN1k%uC)0ZOI+cM2V2-&{JQBnckX|!a~#yU z@mypRRJi75E`Js(rjgX#oX6V#5NFB;oVgPn;FcY_#;dVIbdHmhnz`efP#J3GF2aD7 zR)dn=0ZQBp7&$R|1CY%Hvfa-ZvQL`B&tbqS6)hl`iv?Q%(Rt|=*YtmF#eA^h-V6l} zDsaVSvjT7DrfoKBayQHX2N&X62X}Zo@>i;s5h`j)anGeQb?frrkSG zNl&HQ`igQA#)nsencAifn%`M>w+SoTglL=aN}Is63p3k=b?w5L4q<=0;ObOQ>-W$( zxDw&=j%&ITQsW>SfTAAEDC+w`GNax%U&msnTLmA^&uT^XcS3A`0H#jBa}tuZdI0k(Guwg6mmy08T&!On6hPZ858|u|JMsbi+OTuD5f~*61l2+LefYe= zV$!u*Zuw5+pK-jC%>xZ+!k|mK!QhQ3e@l}J%@fFg$5?;U%-%6`(Da;}QtgM76^zNJ z;FD>Py+=L`BI;+5XF&2t1pH^{SDKR3sitI3MpFVf-IM@MHzk16O$p$1Qvx{MlmJdQ YC4kdS3E*^7GUxx+l=ODM$F0xyAC2hez5oCK diff --git a/bin/DMGTRIS.pocket b/bin/DMGTRIS.pocket index 2404940937603dbed11a4c505319e9f182bdce6b..b703ac04e595fc4afccd8e40029a5284110c630b 100644 GIT binary patch delta 6789 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 a>81p5x+wviZc66=-+5Q70z2~?9 diff --git a/src/field.asm b/src/field.asm index c3c4a28..5915aca 100644 --- a/src/field.asm +++ b/src/field.asm @@ -33,6 +33,8 @@ SECTION "Field Variables", WRAM0 wField:: ds (10*24) wBackupField:: ds (10*24) wShadowField:: ds (14*26) +wWideField:: ds (5*10) +wWideBlittedField:: ds (20*10) wDelayState: ds 1 @@ -118,6 +120,62 @@ BlitField:: jp EventLoop + ; Blits the field onto the tile map. + ; On the GBC, this chain calls into a special version that takes + ; advantage of the GBC's CPU. +BigBlitField:: + ld a, [wInitialA] + cp a, $11 + jp z, GBCBlitField + + ; What to copy + ld de, wWideBlittedField + ; Where to put it + ld hl, FIELD_TOP_LEFT + ; How much to increment hl after each row + ld bc, 32-10 + + ; The first 14 rows can be blitted without checking for vram access. + REPT 14 + REPT 10 + ld a, [de] + ld [hl+], a + inc de + ENDR + add hl, bc + ENDR + +: ldh a, [rLY] + cp a, 0 + jr nz, :- + + ; The last 6 rows need some care. + REPT 6 + ; Wait until start of drawing, then insert 35 nops. +: ldh a, [rSTAT] + and a, 3 + cp a, 3 + jr nz, :- + REPT 35 + nop + ENDR + + ; Blit a line. + REPT 10 + ld a, [de] + ld [hl+], a + inc de + ENDR + + ; Increment HL so that the next line can be blitted. + add hl, bc + ENDR + + ; This function is actually called as the vblank handler for the gameplay state. + ; This is why it jumps straight back to the event loop. + jp EventLoop + + SECTION "Field Function Banked Gameplay", ROMX, BANK[BANK_GAMEPLAY] ; Initializes the field completely blank. ; Initializes the combo counter to 1. @@ -2173,6 +2231,10 @@ BigFieldInit:: ld bc, 10*24 ld d, TILE_BLANK call UnsafeMemSet + ld hl, wWideBlittedField + ld bc, 10*20 + ld d, TILE_BLANK + call UnsafeMemSet ld hl, wShadowField ld bc, 14*26 ld d, $FF @@ -3667,7 +3729,8 @@ BigFieldProcess:: pop hl pop de call BigDrawPiece - ret + jp WidenField + ; Performs a lookup to see how "locked" the piece is. BigGetTileShade: @@ -3966,7 +4029,7 @@ BigFieldDelay:: dec a ldh [hRemainingDelay], a cp a, 0 - ret nz + jp nz, WidenField call BigClearLines ld a, SFX_LINE_CLEAR @@ -4000,7 +4063,7 @@ BigFieldDelay:: dec a ldh [hRemainingDelay], a cp a, 0 - ret nz + jp nz, WidenField ; Add one level if we're not at a breakpoint. ldh a, [hRequiresLineClear] @@ -4228,4 +4291,60 @@ BigClearLines: ret +WidenField:: + ld de, wField+(4*10) + ld hl, wWideField + ld bc, 5 + call UnsafeMemCopy + ld de, wField+(5*10) + ld hl, wWideField+5 + ld bc, 5 + call UnsafeMemCopy + ld de, wField+(6*10) + ld hl, wWideField+10 + ld bc, 5 + call UnsafeMemCopy + ld de, wField+(7*10) + ld hl, wWideField+15 + ld bc, 5 + call UnsafeMemCopy + ld de, wField+(8*10) + ld hl, wWideField+20 + ld bc, 5 + call UnsafeMemCopy + ld de, wField+(9*10) + ld hl, wWideField+25 + ld bc, 5 + call UnsafeMemCopy + ld de, wField+(10*10) + ld hl, wWideField+30 + ld bc, 5 + call UnsafeMemCopy + ld de, wField+(11*10) + ld hl, wWideField+35 + ld bc, 5 + call UnsafeMemCopy + ld de, wField+(12*10) + ld hl, wWideField+40 + ld bc, 5 + call UnsafeMemCopy + ld de, wField+(13*10) + ld hl, wWideField+45 + ld bc, 5 + call UnsafeMemCopy + + DEF piece = 0 + REPT 50 + ld a, [wWideField+piece] + ld hl, wWideBlittedField+((piece/5)*20)+((piece%5) * 2) + ld [hl+], a + ld [hl], a + ld hl, wWideBlittedField+((piece/5)*20)+((piece%5) * 2)+10 + ld [hl+], a + ld [hl], a + DEF piece += 1 + ENDR + ret + + ENDC diff --git a/src/gbc.asm b/src/gbc.asm index 4e5f960..f43001a 100644 --- a/src/gbc.asm +++ b/src/gbc.asm @@ -919,6 +919,223 @@ GBCGameplayProcess:: ret +GBCBigGameplayProcess:: + ld a, [wInitialA] + cp a, $11 + ret nz + + ; Color based on mode. + ld a, [wSpeedCurveState] + cp a, SCURVE_DMGT + ld a, $05 ;Blue + jr z, .goverride + ld a, [wSpeedCurveState] + cp a, SCURVE_TGM1 + ld a, $06 ;Cyan + jr z, .goverride + ld a, [wSpeedCurveState] + cp a, SCURVE_TGM3 + ld a, $03 ;Blue + jr z, .goverride + ld a, [wSpeedCurveState] + cp a, SCURVE_DEAT + ld a, $00 ;Red + jr z, .goverride + ld a, [wSpeedCurveState] + cp a, SCURVE_SHIR + ld a, $00 ;Red + jr z, .goverride ;Always red + ld a, [wSpeedCurveState] + cp a, SCURVE_CHIL + ld a, $01 ;Green + + ; Are we 20G? +.goverride + ld d, a + ldh a, [hCurrentIntegerGravity] + cp a, 20 + jr c, :+ + ld a, $00 + ld d, a + jr .colorfield +: cp a, 3 + jr c, :+ + ld a, $04 + ld d, a + jr .colorfield +: cp a, 2 + jr c, :+ + ld a, $05 + ld d, a + jr .colorfield +: ldh a, [hCurrentFractionalGravity] + cp a, 0 + jr nz, .colorfield + ld a, $05 + ld d, a + +.colorfield + ld hl, wShadowTileAttrs + ld bc, 32-12 + + ld a, 21 + ld [wOuterReps], a +.outer0 + ld a, 12 + ld [wInnerReps], a +.inner0 + ld [hl], d + inc hl + ld a, [wInnerReps] + dec a + ld [wInnerReps], a + jr nz, .inner0 + + add hl, bc + ld a, [wOuterReps] + dec a + ld [wOuterReps], a + jr nz, .outer0 + + + ; What to copy +: ld de, wWideBlittedField + ; Where to put it + ld hl, wShadowTilemap + 1 + ; How much to increment hl after each row + ld bc, 32-10 + + ; Blit me up daddy. + ld a, 20 + ld [wOuterReps], a +.outer1 + ld a, 10 + ld [wInnerReps], a +.inner1 + ld a, [de] + ld [hl+], a + inc de + ld a, [wInnerReps] + dec a + ld [wInnerReps], a + jr nz, .inner1 + + add hl, bc + ld a, [wOuterReps] + dec a + ld [wOuterReps], a + jr nz, .outer1 + + + ; What to copy + ld de, wWideBlittedField + ; Where to put it + ld hl, wShadowTileAttrs + 1 + ; How much to increment hl after each row + ld bc, 32-10 + + ; Blit me up daddy. + ld a, 20 + ld [wOuterReps], a +.outer2 + ld a, 10 + ld [wInnerReps], a +.inner2 + ld a, [de] + cp a, 10 + jr c, .empty + cp a, 10 + (1*7) + jr c, .sub10 + cp a, 10 + (2*7) + jr c, .sub17 + cp a, 10 + (3*7) + jr c, .sub24 + cp a, 10 + (4*7) + jr c, .sub31 + cp a, 10 + (5*7) + jr c, .sub38 + cp a, 10 + (6*7) + jr c, .sub45 + cp a, 10 + (7*7) + jr c, .sub52 + cp a, 10 + (8*7) + jr c, .sub59 +.empty + ld a, $07 + jr .done +.sub59 + sub a, 7 +.sub52 + sub a, 7 +.sub45 + sub a, 7 +.sub38 + sub a, 7 +.sub31 + sub a, 7 +.sub24 + sub a, 7 +.sub17 + sub a, 7 +.sub10 + sub a, 10 +.done + ld [hl+], a + inc de + ld a, [wInnerReps] + dec a + ld [wInnerReps], a + jr nz, .inner2 + + add hl, bc + ld a, [wOuterReps] + dec a + ld [wOuterReps], a + jr nz, .outer2 + + ; Maybe flash numbers. + ldh a, [hCurrentIntegerGravity] + cp a, 20 + jr nz, .black + + ld hl, hFrameCtr + bit 4, [hl] + jr z, .lighter + +.darker + ld a, OCPSF_AUTOINC | (7*8)+(3*2) + ldh [rOCPS], a + ld bc, R1 | G1 + wait_vram + ld a, c + ldh [rOCPD], a + ld a, b + ldh [rOCPD], a + ret + +.lighter + ld a, OCPSF_AUTOINC | (7*8)+(3*2) + ldh [rOCPS], a + ld bc, R2 | G2 + wait_vram + ld a, c + ldh [rOCPD], a + ld a, b + ldh [rOCPD], a + ret + +.black + ld a, OCPSF_AUTOINC | (7*8)+(3*2) + ldh [rOCPS], a + ld bc, R2 | B0 + wait_vram + ld a, c + ldh [rOCPD], a + ld a, b + ldh [rOCPD], a + ret + + ; Copies the shadow tile maps to VRAM using HDMA. The attributes are copied using instant mode ; The tile data is done using hblank mode. GBCBlitField:: diff --git a/src/main.asm b/src/main.asm index e1f5f54..6df3f78 100644 --- a/src/main.asm +++ b/src/main.asm @@ -156,7 +156,7 @@ EventLoopPostHandler:: .vblankjumps jp TitleVBlankHandler jp BlitField - jp BlitField + jp BigBlitField ; The VBlank Handler is expected to end with jp EventLoop. diff --git a/src/state_gameplay.asm b/src/state_gameplay.asm index e174984..14d038c 100644 --- a/src/state_gameplay.asm +++ b/src/state_gameplay.asm @@ -797,7 +797,7 @@ GamePlayBigEventLoopHandlerB: ld a, GO_TIME : ldh [hModeCounter], a ld de, sBigLeady - ld hl, wField+(14*10) + ld hl, wWideBlittedField+(10*10) ld bc, 10 call UnsafeMemCopy jp .drawStaticInfo @@ -813,7 +813,7 @@ GamePlayBigEventLoopHandlerB: xor a, a : ldh [hModeCounter], a ld de, sBigGo - ld hl, wField+(14*10) + ld hl, wWideBlittedField+(10*10) ld bc, 10 call UnsafeMemCopy jp .drawStaticInfo @@ -1010,10 +1010,11 @@ GamePlayBigEventLoopHandlerB: .preGameOverMode ; Spawn the failed piece. call BigForceSpawnPiece + call WidenField ; Draw the field in grey. ; Yes. This really unrolls the loop that many times. - ld hl, wField+(4*10) + ld hl, wWideBlittedField REPT 60 ld a, [hl] cp a, TILE_FIELD_EMPTY @@ -1159,43 +1160,43 @@ GamePlayBigEventLoopHandlerB: ; Draw PAUSE all over the field. : ld de, sBigPause - ld hl, wField+(4*10) + ld hl, wWideBlittedField ld bc, 20 call UnsafeMemCopy ld de, sBigPause - ld hl, wField+(6*10) + ld hl, wWideBlittedField+20 ld bc, 20 call UnsafeMemCopy ld de, sBigPause - ld hl, wField+(8*10) + ld hl, wWideBlittedField+40 ld bc, 20 call UnsafeMemCopy ld de, sBigPause - ld hl, wField+(10*10) + ld hl, wWideBlittedField+60 ld bc, 20 call UnsafeMemCopy ld de, sBigPause - ld hl, wField+(12*10) + ld hl, wWideBlittedField+80 ld bc, 20 call UnsafeMemCopy ld de, sBigPause - ld hl, wField+(14*10) + ld hl, wWideBlittedField+100 ld bc, 20 call UnsafeMemCopy ld de, sBigPause - ld hl, wField+(16*10) + ld hl, wWideBlittedField+120 ld bc, 20 call UnsafeMemCopy ld de, sBigPause - ld hl, wField+(18*10) + ld hl, wWideBlittedField+140 ld bc, 20 call UnsafeMemCopy ld de, sBigPause - ld hl, wField+(20*10) + ld hl, wWideBlittedField+160 ld bc, 20 call UnsafeMemCopy ld de, sBigPause - ld hl, wField+(22*10) + ld hl, wWideBlittedField+180 ld bc, 20 call UnsafeMemCopy jr .drawStaticInfo @@ -1221,7 +1222,7 @@ GamePlayBigEventLoopHandlerB: ld de, hNLevel call ApplyNumbers - jp GBCGameplayProcess + jp GBCBigGameplayProcess ; Do the hold action.