# Lockjaw - How come the Tetris Company doesn't go after it?

PetitPrince: I'm glad. I'll probably release a version here just for user-input in a week or two. Keep an eye out.

I'd really like to buy some server space, design a simple website, and host it like any other free application out there. I'm just trying to figure out if there's a way to do it without attracting TTC. The configuration is such that I can strip a lot out of the game and let it be delivered by some 3rd party: blocks, rotations, scoring, skin, sounds, etc.

You guys have a lot more familiarity than me with the state of all of the various falling block games out there. Can anyone link me to any falling blocks game that is still being actively developed and has not come under the fire of TTC? I'd like to try to figure out what they're doing right to give my project the best chance for success and longevity.

2. ### PetitPrince

Blockbox is still running despite having a TTC cease and desist. Quinn had a cease and desist, removed all mentions of Tetris(c)(r)(tm) and got okay with that.

Here are some screen shots. Each game right now is completely independent. Eventually when there's netplay, the smaller screens will be used to show your enemie's grid from across the net.

The games can be sized differently in order to eventually accommodate a large multiplayer game (imagine 2v2). You can make your enemies smaller screens and your team-mate large, or all three 1/3 size, etc. There's really no hard limit besides 8 maximum players, and that can be changed with a single variable that's hard-coded. It seemed like a safe number to choose.

To get an idea of the configurability of the thing, here's my code for each level. A level system is made up of a series of levels, so you can change pretty much anything from level to level:

Code:
//These are either set by the level system or the following values are assumed:
public double frameLength = 16.666667;
public int inc = 1;
public int framesPerInc = 1;
public int rows = 24;
public int columns = 10;
public String scoring = "Jester";
public int startDropRow = 4;
public int startDropCol = 4;
public int vanishZoneSize = 4;
public int lineClears = IRRELEVANT;
public int blocks = IRRELEVANT;
public int survivalLevels = IRRELEVANT;
public long milliseconds = IRRELEVANT;
public boolean wallKicksAllowed = true;
public boolean ceilingKicksAllowed = true;
public int floorKicks = 3;
public boolean hardShiftsAllowed = true;
public boolean hardDropsAllowed = true;
public boolean firmDropsAllowed = true;
public boolean softDropsAllowed = true;
public boolean holdBlockAllowed = true;
public boolean flipsAllowed = true;
public int lockDelay = 30;
public int spawnDelay = 25;
public int collapseDelay = 40;
public int flashDelay = 2;
public boolean resetLockOnRotate = false;
public boolean resetLockOnShift = false;
public boolean resetLockOnFall = true;
public boolean persistantShifts = true;
public boolean truncateGraphOverflow = false;

public boolean monochromeBlocks = false;

//these are set by preferences, but can be overridden by the levelsystem
//(Defaults are in preferences, better to leave all of these null so if a setting isn't being properly treated a red flag goes up.
public String blockFile;
public String generatorType;
public String rotationType;

public int sirenHeight;
public boolean randomInitialHoldBlock;
public boolean holdToNext;
public int nextBlockCount;
public boolean showGhosts;
public boolean outlineGraph;

public boolean lockOnSoftLand;
public boolean stopSoftDropEachFall;

public boolean realisticShiftCollision;

public boolean graphVisible;

public int shiftRepeatDelay;
public int shiftInitRepeatDelay;

public int softDropInc;
public int softDropFPI;    

So a level system looks something like this. This is my home-made "easy" curve:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<GameRules>
<levelRelevant>false</levelRelevant>
<level>
<increment>1</increment>
<survivalLevels>10</survivalLevels> <!-- Only used in survival Style Level Systems-->
</level>
<level>
<increment>2</increment>
<survivalLevels>20</survivalLevels>
</level>
<level>
<increment>4</increment>
<survivalLevels>30</survivalLevels>
</level>
<level>
<increment>6</increment>
<survivalLevels>40</survivalLevels>
</level>
<level>
<increment>8</increment>
<survivalLevels>50</survivalLevels>
</level>
<level>
<increment>10</increment>
<survivalLevels>60</survivalLevels>
</level>
<level>
<increment>12</increment>
<survivalLevels>70</survivalLevels>
</level>
<level>
<increment>14</increment>
<survivalLevels>80</survivalLevels>
</level>
<level>
<increment>20</increment>
<survivalLevels>100</survivalLevels>
<!--Requirement: line clear-->
</level>
<level>
<increment>4</increment>
<survivalLevels>108</survivalLevels>
</level>
<level>
<increment>6</increment>
<survivalLevels>119</survivalLevels>
</level>
<level>
<increment>8</increment>
<survivalLevels>125</survivalLevels>
</level>
<level>
<increment>10</increment>
<survivalLevels>131</survivalLevels>
</level>
<level>
<increment>12</increment>
<survivalLevels>139</survivalLevels>
</level>
<level>
<increment>14</increment>
<survivalLevels>149</survivalLevels>
</level>
<level>
<increment>16</increment>
<survivalLevels>156</survivalLevels>
</level>
<level>
<increment>20</increment>
<survivalLevels>164</survivalLevels>
</level>
<level>
<increment>24</increment>
<survivalLevels>174</survivalLevels>
</level>
<level>
<increment>28</increment>
<survivalLevels>180</survivalLevels>
</level>
<level>
<increment>32</increment>
<survivalLevels>200</survivalLevels>
<!--Requirement: line clear-->
</level>
<level>
<increment>4</increment>
<survivalLevels>212</survivalLevels>
</level>
<level>
<increment>8</increment>
<survivalLevels>232</survivalLevels>
</level>
<level>
<increment>12</increment>
<survivalLevels>244</survivalLevels>
</level>
<level>
<increment>16</increment>
<survivalLevels>256</survivalLevels>
</level>
<level>
<increment>20</increment>
<survivalLevels>266</survivalLevels>
</level>
<level>
<increment>24</increment>
<survivalLevels>272</survivalLevels>
</level>
<level>
<increment>28</increment>
<survivalLevels>280</survivalLevels>
</level>
<level>
<increment>36</increment>
<survivalLevels>300</survivalLevels>
<!--Requirement: line clear-->
</level>
<level>
<increment>4</increment>
<survivalLevels>306</survivalLevels>
</level>
<level>
<increment>8</increment>
<survivalLevels>312</survivalLevels>
</level>
<level>
<increment>12</increment>
<survivalLevels>317</survivalLevels>
</level>
<level>
<increment>16</increment>
<survivalLevels>322</survivalLevels>
</level>
<level>
<increment>20</increment>
<survivalLevels>328</survivalLevels>
</level>
<level>
<increment>24</increment>
<survivalLevels>334</survivalLevels>
</level>
<level>
<increment>28</increment>
<survivalLevels>342</survivalLevels>
</level>
<level>
<increment>36</increment>
<survivalLevels>350</survivalLevels>
</level>
<level>
<increment>36</increment>
<survivalLevels>400</survivalLevels>
<monochromeBlocks>true</monochromeBlocks>
<!--Requirement: line clear-->
</level>
</GameRules>

and here's a slightly out of date tgm1 emulation. A lot of the calls aren't necessary here, I just had them in from a while ago. You only have to specify those that change from the defaults. Each level copies the previous level, so on each level you only have to specify what changed from the previous level.

Code:
<?xml version="1.0" encoding="UTF-8"?>
<GameRules>
<levelRelevant>false</levelRelevant>
<survivalLevelRelevant>true</survivalLevelRelevant>
<scoreRelevant>true</scoreRelevant>
<level>
<!--Current Generator Types:  Guidelines, survival1, survival2, behavedBag, Random->
<!--Current Rotation Systems:  survival, SRS-->
<!--All delays are in frames, so if you change the frameLength you change the speed of the game -->

<generator>survival1</generator>
<rotation>survival1</rotation>
<blocks>survivalBlocks</blocks>
<scoring>survival1</scoring>

<rows>24</rows>
<cols>10</cols>

<startDropCol>4</startDropCol>
<startDropRow>4</startDropRow>
<vanishZoneSize>4</vanishZoneSize>

<!--On Some Dual Processor/Dual Core systems this isn't so accurate.  It's a system bug that I can't fix, sorry. :( -->
<frameLength>16.666667</frameLength> <!-- accurate out to the 6th decimal point, the rest is truncated -->

<survivalLevels>30</survivalLevels> <!-- Only used in survival Style Level Systems-->

<resetLockOnRotate>false</resetLockOnRotate>
<hardShiftsAllowed>false</hardShiftsAllowed>
<hardDropsAllowed>false</hardDropsAllowed>
<firmDropsAllowed>false</firmDropsAllowed>
<softDropsAllowed>true</softDropsAllowed>
<flipsAllowed>false</flipsAllowed>
<holdsAllowed>false</holdsAllowed>
<wallKicksAllowed>true</wallKicksAllowed>
<ceilingKicksAllowed>false</ceilingKicksAllowed>
<floorKickCount>0</floorKickCount>  <!-- enter "inf" or "infinite" for infinite, otherwise a number (0, 1, 2, 3, etc) -->

<realisticShiftCollisions>false</realisticShiftCollisions>
<persistantShifts>false</persistantShifts>
<lockOnSoftLanding>true</lockOnSoftLanding>
<resetSoftDropEachFall>false</resetSoftDropEachFall>

<keyInitialRepeatDelay>16</keyInitialRepeatDelay> <!--AKA DAS-->
<keyRepeatDelay>1</keyRepeatDelay>
<collapseDelay>40</collapseDelay> <!---AKA Line Clear Delay -->
<lockDelay>30</lockDelay>
<spawnDelay>25</spawnDelay> <!--AKA ARE-->
<flashDelay>2</flashDelay>

<softDropInc>256</softDropInc>
<softDropFPI>1</softDropFPI>

<increment>4</increment>
<framesPerInc>1</framesPerInc>

<showGhosts>true</showGhosts>
<graphVisible>true</graphVisible>
<outlineGraph>true</outlineGraph>
<sirenHeight>16</sirenHeight>
</level>
<levellineClears>
<increment>6</increment>
<survivalLevels>35</survivalLevels>
</level>
<levellineClears>
<increment>8</increment>
<survivalLevels>40</survivalLevels>
</level>
<levellineClears>
<increment>10</increment>
<survivalLevels>50</survivalLevels>
</level>
<levellineClears>
<increment>12</increment>
<survivalLevels>60</survivalLevels>
</level>
<levellineClears>
<increment>16</increment>
<survivalLevels>70</survivalLevels>
</level>
<levellineClears>
<increment>32</increment>
<survivalLevels>80</survivalLevels>
</level>
<levellineClears>
<increment>48</increment>
<survivalLevels>90</survivalLevels>
</level>
<levellineClears>
<increment>64</increment>
<survivalLevels>100</survivalLevels>
</level>
<levellineClears>
<increment>80</increment>
<survivalLevels>120</survivalLevels>
</level>
<levellineClears>
<increment>96</increment>
<survivalLevels>140</survivalLevels>
</level>
<levellineClears>
<increment>112</increment>
<survivalLevels>160</survivalLevels>
</level>
<levellineClears>
<increment>128</increment>
<survivalLevels>170</survivalLevels>
</level>
<levellineClears>
<increment>144</increment>
<survivalLevels>200</survivalLevels>
</level>
<levellineClears>
<increment>4</increment>
<survivalLevels>220</survivalLevels>
</level>
<levellineClears>
<increment>32</increment>
<survivalLevels>230</survivalLevels>
</level>
<levellineClears>
<increment>64</increment>
<survivalLevels>233</survivalLevels>
</level>
<levellineClears>
<increment>96</increment>
<survivalLevels>236</survivalLevels>
</level>
<levellineClears>
<increment>128</increment>
<survivalLevels>239</survivalLevels>
</level>
<levellineClears>
<increment>160</increment>
<survivalLevels>243</survivalLevels>
</level>
<levellineClears>
<increment>192</increment>
<survivalLevels>247</survivalLevels>
</level>
<levellineClears>
<increment>224</increment>
<survivalLevels>251</survivalLevels>
</level>
<levellineClears>
<increment>256</increment>
<survivalLevels>300</survivalLevels>
</level>
<levellineClears>
<increment>512</increment>
<survivalLevels>330</survivalLevels>
</level>
<levellineClears>
<increment>768</increment>
<survivalLevels>360</survivalLevels>
</level>
<levellineClears>
<increment>1024</increment>
<survivalLevels>400</survivalLevels>
</level>
<levellineClears>
<increment>1280</increment>
<survivalLevels>420</survivalLevels>
</level>
<levellineClears>
<increment>1024</increment>
<survivalLevels>450</survivalLevels>
</level>
<levellineClears>
<increment>768</increment>
<survivalLevels>500</survivalLevels>
</level>
<levellineClears>
<increment>5120</increment>
<survivalLevels>999</survivalLevels>
</level>
</GameRules>

I'll get a beta up as soon as I'm happy with releasing something. It might be a little while, but I'll try to get something soon for feedback.

5. ### XaeL

looks pretty good

6. ### Wojtek

looks promising.

tgm5 may be canceled because of it.

Last edited: 4 Jan 2011

9. ### lee n

NullpoMino is still going strong.

Looks like Jester has come a long way ince I last tried it (I think it's been three years since) btw.

. I tend to work on the thing with fervor for one month and then put it down for eleven. I passed a really nice threshold these last two weeks though; the framework and plumbing are essentially done. I get to start hanging the sheetrock now, which is a much more enjoyable process.

11. ### awake

Looks slick. I don't think you have to worry about TTC going after you, they don't give a **** about TGM. It would be Arika or Mihara going after you.

12. ### cyberguile

this hard-shifts feature is a pretty good idea