diff --git a/TetrEnvironment/Info/FallInfo.cs b/TetrEnvironment/Info/FallInfo.cs index d5b817c..df44cf0 100644 --- a/TetrEnvironment/Info/FallInfo.cs +++ b/TetrEnvironment/Info/FallInfo.cs @@ -235,15 +235,23 @@ public void Next(Tetromino.MinoType? newMino) if (_manager.GameData.Falling.Ihs) { + //TODO: t.setoptions.display_hold && !t.setoptions.display_hold + _manager.GameData.Falling.Ihs = false; if (!_manager.GameData.HoldLocked) SwapHold(); } if (_manager.GameData.Falling.Irs != 0) - _manager.HandleInfo.RotatePiece((spawnRotation + _manager.GameData.Falling.Irs) % 14); + { + _manager.HandleInfo.RotatePiece((spawnRotation + _manager.GameData.Falling.Irs) % 4); + _manager.GameData.Falling.Irs = 0; + } - _manager.GameData.Falling.Irs = 0; - _manager.GameData.Falling.Ihs = false; + if (_manager.GameData.Options.Version >= 17) + { + if (Is20G()) + SlamToFloor(); + } } public void SwapHold() @@ -340,4 +348,26 @@ public Falling.SpinTypeKind IsTspin() return spinType; } + + public bool Is20G() + { + if (_manager.GameData.Options.Version < 17) + throw new Exception( + "The 20G check should not be called before TETR.IO engine version 17."); + + var boardHeight = _manager.GameData.Options.BoardHeight; + if (_manager.GameData.SoftDrop) + return _manager.GameData.Handling.SDF == 41 || + _manager.GameData.Gravity * _manager.GameData.Handling.SDF >= boardHeight; + else + return _manager.GameData.Gravity >= boardHeight; + } + + public void SlamToFloor() + { + var tempGravity = _manager.GameData.Gravity; + _manager.GameData.Gravity = int.MaxValue; + FallEvent(null, 1); + _manager.GameData.Gravity = tempGravity; + } } \ No newline at end of file diff --git a/TetrEnvironment/Info/HandleInfo.cs b/TetrEnvironment/Info/HandleInfo.cs index 8bab3da..fad6482 100644 --- a/TetrEnvironment/Info/HandleInfo.cs +++ b/TetrEnvironment/Info/HandleInfo.cs @@ -14,11 +14,11 @@ public HandleInfo(Environment manager) _manager = manager; } - public void KeyDown(EventKeyInputData @event) + public void KeyDown(EventKeyInputData @event) { if ((int)@event.key < 8) _manager.PressingKeys[(int)@event.key] = true; - + if (@event.subframe > _manager.GameData.SubFrame) { _manager.HandleInfo.ProcessShift(false, @event.subframe - _manager.GameData.SubFrame); @@ -140,7 +140,7 @@ public void KeyUp(EventKeyInputData @event) { if ((int)@event.key < 8) _manager.PressingKeys[(int)@event.key] = false; - + if (@event.subframe > _manager.GameData.SubFrame) { _manager.HandleInfo.ProcessShift(false, @event.subframe - _manager.GameData.SubFrame); @@ -256,12 +256,13 @@ internal void RotatePiece(int newRotation) if (_manager.GameData.Falling.Type == Constants.Tetromino.MinoType.O) return; - - var kicktable = _manager.Kickset.KICKSET_TABLE[currentNewRotation]; + var kicktable = _manager.Kickset.KICKSET_TABLE[currentNewRotation]; if (_manager.GameData.Falling.Type == Constants.Tetromino.MinoType.I) kicktable = _manager.Kickset.KICKSET_TABLE_I[currentNewRotation]; + //if(_manager.GameData.Options.Version<17&&_manager.GameData.Options.kickset=="ARS") + for (var kicktableIndex = 0; kicktableIndex < kicktable.Length; kicktableIndex++) { var kicktableTest = kicktable[kicktableIndex]; @@ -351,6 +352,9 @@ private void ProcessLShift(bool value, double subFrameDiff = 1) _manager.GameData.Falling.Last = Falling.LastKind.Move; _manager.GameData.Falling.Clamped = false; + if (_manager.GameData.Options.Version >= 17 && _manager.FallInfo.Is20G()) + _manager.FallInfo.SlamToFloor(); + if (++_manager.GameData.Falling.LockResets < 15 || _manager.GameData.Options.InfiniteMovement) _manager.GameData.Falling.Locking = 0; } @@ -404,6 +408,9 @@ private void ProcessRShift(bool value, double subFrameDiff = 1) _manager.GameData.Falling.Last = Falling.LastKind.Move; _manager.GameData.Falling.Clamped = false; + if (_manager.GameData.Options.Version >= 17 && _manager.FallInfo.Is20G()) + _manager.FallInfo.SlamToFloor(); + if (++_manager.GameData.Falling.LockResets < 15 || _manager.GameData.Options.InfiniteMovement) _manager.GameData.Falling.Locking = 0; } diff --git a/TetrEnvironment/Options.cs b/TetrEnvironment/Options.cs index dfb9c49..dd89f68 100644 --- a/TetrEnvironment/Options.cs +++ b/TetrEnvironment/Options.cs @@ -48,7 +48,7 @@ public class Options public bool Shielded { get; internal set; } public bool HasGarbage { get; internal set; } public int GarbageCapMax { get; internal set; } - + public int BoardHeight { get; internal set; } public bool ClipListenIDs { get; internal set; } public Options(EventFullOptionsData fullOptionsData) @@ -58,7 +58,7 @@ public Options(EventFullOptionsData fullOptionsData) GSpeed = fullOptionsData.gspeed ?? 0.007; LevelSpeed = fullOptionsData.levelspeed ?? 0.42; MasterLevels = fullOptionsData.masterlevels ?? false; - + BoardHeight = fullOptionsData.boardheight ?? 20; Version = fullOptionsData.version; GravityIncrease = fullOptionsData.gincrease ?? 0; GravityMargin = fullOptionsData.gmargin ?? 0;