Jump to content


Photo

Tetris


  • Please log in to reply
49 replies to this topic

#1 geniusalz

geniusalz

    Team MXM

  • Head Moderators
  • PipPipPipPipPip
  • 1,827 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:unknown

Posted 30 December 2003 - 12:38 AM

More hype biggrin.gif

I'm working on a tetris actionscript, for a little game while transferring files cool.gif

How far along are the negotiations for boost mode? Heard UX is getting it.

#2 geniusalz

geniusalz

    Team MXM

  • Head Moderators
  • PipPipPipPipPip
  • 1,827 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:unknown

Posted 30 December 2003 - 01:01 AM

Is there a modulus operation? Or any other way to get random numbers?

#3 BenJeremy

BenJeremy

    X-S Elysian

  • Head Moderators
  • PipPipPipPipPipPipPipPipPipPipPipPipPip
  • 9,690 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:v1 (xenon)

Posted 30 December 2003 - 01:25 AM

Hmmmm... no, I don't have it at the moment, but I'll add some bit-wise operations, as well as MOD and a RANDOM function.

#4 geniusalz

geniusalz

    Team MXM

  • Head Moderators
  • PipPipPipPipPip
  • 1,827 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:unknown

Posted 30 December 2003 - 03:35 AM

EDIT: Got around it, so its on low priority now

I'm having problems with input (yet again)

I don't want the script to halt while it waits for input, but stay in a loop while it waits.
The problem is that MSG_ID becomes numeric when using IQPeekMsgID

Here's a sample test script:

CODE
BeginDraw UseCurrent
Messagebox "Press Any Key Now"
Enddraw

:TOP
SETFUNC MSG_ID1 IQPeekMsgID
IF %MSG_ID1% GOTO BLAH
GOTO TOP

:BLAH
SETFUNC MSG_ID2 IQGetMsgID ANY
BeginDraw UseCurrent
Messagebox "Func IQGetMsgID gives ... %MSG_ID2%"
Enddraw
Delay 4

BeginDraw UseCurrent
Messagebox "Just MSG_ID ... %MSG_ID% ... this is blank"
Enddraw
Delay 4

QUIT


Edit: MXM returns a number for functions IQGetMsgID/IQPeekMsgID, while I want it to return "UI_BLAH"

Solution: Just put in a "IQWaitMsg ANY" before checking %MSG_ID%. It doesn't wait, but assigns a value to %MSG_ID%

Edited by geniusalz, 30 December 2003 - 04:11 AM.


#5 geniusalz

geniusalz

    Team MXM

  • Head Moderators
  • PipPipPipPipPip
  • 1,827 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:unknown

Posted 30 December 2003 - 05:12 AM

Pretty much done, except for random pieces.
It's sorta slow checking for complete lines, can you suggest a more efficient way of emulating arrays, other than using xml?

EDIT: well, I fixed up some stuff, and now the subroutine takes only 4 ms on average biggrin.gif

Edited by geniusalz, 30 December 2003 - 05:48 AM.


#6 unleashx

unleashx

    X-S Freak

  • Members
  • PipPipPipPipPip
  • 1,330 posts
  • Xbox Version:v1.1
  • 360 version:unknown

Posted 30 December 2003 - 05:58 AM

QUOTE (geniusalz @ Dec 30 2003, 02:38 AM)
How far along are the negotiations for boost mode? Heard UX is getting it.

Unfortunately, the negotiation died down as a result of a bogus user and some FB's. Team AVA took it the wrong way. I could safely assume this is the situation as TJ didn't bother to respond to my PM to him, so, no boost mode for UnleashX -of course, this, in no way doesn't mean, everything is over. wink.gif

#7 geniusalz

geniusalz

    Team MXM

  • Head Moderators
  • PipPipPipPipPip
  • 1,827 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:unknown

Posted 30 December 2003 - 07:26 AM

Tetris Beta 1 cool.gif
For any WIP user who wants to try it out

Since theres no randomness, all pieces start off as a bar. You can press UP to change them. Left/right to move, A to rotate.


tetris.xas
CODE
;Tetris by geniusalz
;Beta, do not put up anywhere
;Change the path accordingly
XMLOPEN pieces c:\pieces.xml

OPENWRITE log c:\log.txt
XMLCREATE counts Count
XMLCREATE board Board


XMLCREATE

SET pieceExists 1

SET globalTop 100
SET globalLeft 200

SET curPiece 1
SET curState 1
SET curLeft 0
SET curTop 0

SET nextPiece 1
SET nextState 1
SET nextLeft 0
SET nextTop 0

SET changed 1

:Begin
SET endTime $timer$
ADD endTime 1000

:BeginLoop
 IF# %pieceExists% == 0 GOSUB MakePiece
 IF# %changed% == 1 GOSUB CheckLine
 IF# %changed% == 1 GOSUB DrawBoard

 SETFUNC MSG_ID1 IQPeekMsgID
 IF %MSG_ID1% GOSUB ExecuteInput
 IF# %endTime% < $timer$ GOTO TimeUp

 GOTO BeginLoop
  :TimeUp
  GOSUB MoveDown
  GOTO Begin
 GOTO BeginLoop
 
:MakePiece
SET curPiece 1
SET curState 1
SET curLeft 0
SET curTop 0
SET nextPiece 1
SET nextState 1
SET nextLeft 0
SET nextTop 0

SET pieceExists 1
RETURN

:MoveDown
SET nextTop %curTop%
ADD nextTop 1
SET nextPiece %curPiece%
GOSUB CheckValidity

IF# %isValid% == 1 GOTO Keep
GOSUB FixPiece

:Keep
SET curTop %nextTop%
SET changed 1
RETURN

:ExecuteInput
IQWaitMsg ANY

SET nextTop %curTop%
SET nextLeft %curLeft%
SET nextState %curState%
SET nextPiece %curPiece%

IF %MSG_ID% == "UI_UP" GOTO ChangePiece
IF %MSG_ID% == "UI_DN" GOTO MoveDn
IF %MSG_ID% == "UI_LF" GOTO MoveLeft
IF %MSG_ID% == "UI_RT" GOTO MoveRight
IF %MSG_ID% == "UI_Select" GOTO SpinLeft
BeginDraw
 Messagebox %MSG_ID%
 Delay 1
Enddraw
GOTO Quit

 :MoveDn
 ADD nextTop 1
 GOTO DontFix
 
 :MoveRight
 ADD nextLeft 1
 GOTO DontFix
 
 :MoveLeft
 SUB nextLeft 1
 GOTO DontFix

 :ChangePiece
 ADD nextPiece 1
 
 IF# %nextPiece% > 7 GOTO FixPiec
  GOTO DontFix
 
  :FixPiec
  SUB nextPiece 7
 GOTO DontFix
 
 :SpinLeft
 ADD nextState 1
 
 IF# %nextState% > 4 GOTO Fix
  GOTO DontFix
 
  :Fix
  SUB nextState 4
 :DontFix
 GOSUB CheckValidity

 IF# %isValid% == 1 GOTO KeepInput
 GOTO DiscardInput
  :KeepInput
  IF# %nextTop% == %curTop% GOTO DontResetTimer
  SET endTime $timer$
  ADD endTime 1000

  :DontResetTimer
  SET curLeft %nextLeft%
  SET curTop %nextTop%
  SET curState %nextState%
  SET curPiece %nextPiece%
 
  SET changed 1
:DiscardInput
SET nextTop %curTop%
SET nextLeft %curLeft%
SET nextState %curState%
SET nextPiece %curPiece%

IQClear
RETURN

:DrawBoard

BeginDraw
SET leftVal %globalLeft%
ADD leftVal 9
SET topVal %globalTop%
ADD topVal 9
BOX %leftVal% %topVal% 101 201 0x000000 0x88FFFFFF

FOR x = 1 to 11
 FOR y = 1 to 21
  XMLGetValue board toDraw !.%x%.%y%
  IF# %toDraw% == 1 GOTO DrawThis1
  GOTO DontDraw1
  :DrawThis1
   SET xPos %x%
   MULT xPos 10
   SET yPos %y%
   MULT yPos 10
   ADD xPos %globalLeft%
   ADD yPos %globalTop%

   BOX %xPos% %yPos% 9 9 0xF2182228 0xF2182228
  :DontDraw1
 NEXT
NEXT
FOR y = 1 to 5
 XMLGetValue pieces curRow !.piece%curPiece%.state%curState%.row%y%
 FOR x = 1 to 5
  SET x2 %x%
  SUB x2 1
  SETFUNC toDraw1 MID %x2% 1 %curRow%
 
  IF# %toDraw1% == 1 GOTO DrawThis2
  GOTO DontDraw2
  :DrawThis2
   SET xPos %x%
   ADD xPos %curLeft%
   MULT xPos 10
   ADD xPos %globalLeft%
   SET yPos %y%
   ADD yPos %curTop%
   MULT yPos 10
   ADD yPos %globalTop%
 
   BOX %xPos% %yPos% 9 9 0xF2182228 0xF2182228
  :DontDraw2
 NEXT
NEXT
EndDraw

SET changed 0
RETURN


:CheckValidity
SET isValid 1

FOR y = 1 to 5
 XMLGetValue pieces curRow !.piece%nextPiece%.state%nextState%.row%y%
 
 FOR x = 1 to 5
  SET x2 %x%
  SUB x2 1
  SETFUNC toCheck4 MID %x2% 1 %curRow%
 
  IF# %toCheck4% == 1 GOTO CheckThis4
  GOTO DontCheck4
  :CheckThis4
   SET xPos %x%
   ADD xPos %nextLeft%
   
   SET yPos %y%
   ADD yPos %nextTop%
 
   XMLGetValue board checkVal !.%xPos%.%yPos% 0
   
   IF# %checkVal% == 1 GOTO ThisIsInvalid
   IF# %xPos% < 1 GOTO ThisIsInvalid
   IF# %yPos% < 1 GOTO ThisIsInvalid
   IF# %xPos% > 10 GOTO ThisIsInvalid
   IF# %yPos% > 20 GOTO ThisIsInvalid

   GOTO DontCheck4

   :ThisIsInvalid
   SET isValid 0
  :DontCheck4
 NEXT
NEXT
RETURN

:FixPiece
FOR y = 1 to 5
 XMLGetValue pieces curRow !.piece%curPiece%.state%curState%.row%y%
 
 FOR x = 1 to 5
  SET x2 %x%
  SUB x2 1
  SETFUNC toDraw3 MID %x2% 1 %curRow%
 
  IF# %toDraw3% == 1 GOTO DrawThis3
  GOTO DontDraw3
  :DrawThis3
   SET xPos %x%
   ADD xPos %curLeft%
   
   SET yPos %y%
   ADD yPos %curTop%
 
   XMLSetValue board !.%xPos%.%yPos% 1
   XMLGetValue counts TEMP !.%yPos%
   ADD TEMP 1
   XMLSetValue counts !.%yPos% %TEMP%
  :DontDraw3
 NEXT
NEXT

SET pieceExists 0
SET changed 1
RETURN

:CheckLine
FOR y = 1 to 21
 XMLGetValue counts lineTotal !.%y%
 
 IF# %lineTotal% < 10 GOTO skipLine
  SET y2 %y%
  ADD y2 1
  FOR z = %y% to 0 step -1
   SET z2 %z%
   SUB z2 1
 
   FOR x = 1 to 11
    XMLGetValue board TEMP !.%x%.%z2%
    XMLSetValue board !.%x%.%z% %TEMP%
   NEXT
   XMLGetValue counts TEMP !.%z2%
   XMLSetValue counts !.%z% %TEMP%
  NEXT
 :skipLine  
NEXT

SET changed 1
RETURN

:Quit
QUIT



pieces.xml
CODE
<pieces>
<piece1>
 <!-- bar -->
 <state1>
  <row1>1111</row1>
  <row2>0000</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state1>
 <state2>
  <row1>0001</row1>
  <row2>0001</row2>
  <row3>0001</row3>
  <row4>0001</row4>
 </state2>
 <state3>
  <row1>1111</row1>
  <row2>0000</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state3>
 <state4>
  <row1>0001</row1>
  <row2>0001</row2>
  <row3>0001</row3>
  <row4>0001</row4>
 </state4>
</piece1>
<piece2>
 <!-- backwards L -->
 <state1>
  <row1>0111</row1>
  <row2>0001</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state1>
 <state2>
  <row1>0001</row1>
  <row2>0001</row2>
  <row3>0011</row3>
  <row4>0000</row4>
 </state2>
 <state3>
  <row1>0100</row1>
  <row2>0111</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state3>
 <state4>
  <row1>0011</row1>
  <row2>0010</row2>
  <row3>0010</row3>
  <row4>0000</row4>
 </state4>
</piece2>
<piece3>
 <!-- short T -->
 <state1>
  <row1>0010</row1>
  <row2>0111</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state1>
 <state2>
  <row1>0010</row1>
  <row2>0011</row2>
  <row3>0010</row3>
  <row4>0000</row4>
 </state2>
 <state3>
  <row1>0111</row1>
  <row2>0010</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state3>
 <state4>
  <row1>0001</row1>
  <row2>0011</row2>
  <row3>0001</row3>
  <row4>0000</row4>
 </state4>
</piece3>
<piece4>
 <!-- straight L -->
 <state1>
  <row1>0111</row1>
  <row2>0100</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state1>
 <state2>
  <row1>0011</row1>
  <row2>0001</row2>
  <row3>0001</row3>
  <row4>0000</row4>
 </state2>
 <state3>
  <row1>0001</row1>
  <row2>0111</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state3>
 <state4>
  <row1>0010</row1>
  <row2>0010</row2>
  <row3>0011</row3>
  <row4>0000</row4>
 </state4>
</piece4>
<piece5>
 <!-- backwards Z -->
 <state1>
  <row1>0010</row1>
  <row2>0011</row2>
  <row3>0001</row3>
  <row4>0000</row4>
 </state1>
 <state2>
  <row1>0011</row1>
  <row2>0110</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state2>
 <state3>
  <row1>0010</row1>
  <row2>0011</row2>
  <row3>0001</row3>
  <row4>0000</row4>
 </state3>
 <state4>
  <row1>0011</row1>
  <row2>0110</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state4>
</piece5>
<piece6>
 <!-- straight Z -->
 <state1>
  <row1>0001</row1>
  <row2>0011</row2>
  <row3>0010</row3>
  <row4>0000</row4>
 </state1>
 <state2>
  <row1>0110</row1>
  <row2>0011</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state2>
 <state3>
  <row1>0001</row1>
  <row2>0011</row2>
  <row3>0010</row3>
  <row4>0000</row4>
 </state3>
 <state4>
  <row1>0110</row1>
  <row2>0011</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state4>
</piece6>
<piece7>
 <!-- box -->
 <state1>
  <row1>0011</row1>
  <row2>0011</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state1>
 <state2>
  <row1>0011</row1>
  <row2>0011</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state2>
 <state3>
  <row1>0011</row1>
  <row2>0011</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state3>
 <state4>
  <row1>0011</row1>
  <row2>0011</row2>
  <row3>0000</row3>
  <row4>0000</row4>
 </state4>
</piece7>
</pieces>

Edited by geniusalz, 30 December 2003 - 10:22 PM.


#8 koldfuzion

koldfuzion

    X-S Freak

  • Members
  • PipPipPipPipPip
  • 1,480 posts

Posted 30 December 2003 - 12:41 PM

QUOTE (geniusalz @ Dec 30 2003, 09:26 AM)
Tetris Beta 1 cool.gif
For any WIP user who wants to try it out

Since theres no randomness, all pieces start off as a bar. You can press UP to change them. Left/right to move, A to rotate.


tetris.xas
CODE
;Tetris by geniusalz
;Beta, do not put up anywhere
;Change the path accordingly

you have way too much time on your hands. smile.gif



#9 geniusalz

geniusalz

    Team MXM

  • Head Moderators
  • PipPipPipPipPip
  • 1,827 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:unknown

Posted 30 December 2003 - 07:21 PM

I think its pretty neat that MXM lets u write a game with gameplay identical to a commercial game for xbox.

That, and I like doing stuff no one's done before. This is the first time a homebrew game has been written for a dashboard cool.gif

EDIT: Have you tried it out? Any thoughts?

Edited by geniusalz, 30 December 2003 - 07:21 PM.


#10 BenJeremy

BenJeremy

    X-S Elysian

  • Head Moderators
  • PipPipPipPipPipPipPipPipPipPipPipPipPip
  • 9,690 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:v1 (xenon)

Posted 30 December 2003 - 07:52 PM

I'm dying to try it out.... wink.gif

If I can just get the wife to stop nagging me about cleaning up the house (and my computer room)

#11 koldfuzion

koldfuzion

    X-S Freak

  • Members
  • PipPipPipPipPip
  • 1,480 posts

Posted 31 December 2003 - 01:15 AM

QUOTE (geniusalz @ Dec 30 2003, 09:21 PM)
I think its pretty neat that MXM lets u write a game with gameplay identical to a commercial game for xbox.

That, and I like doing stuff no one's done before. This is the first time a homebrew game has been written for a dashboard cool.gif

EDIT: Have you tried it out? Any thoughts?

i agree 100%.. just giving you a little elbow cause you have too much time on your hands.... and I dont seem to have any.

No, like BJ, im dying to try it.. I havent even loaded the latest WIP yet. But I will, thats for sure. It sucks to play catch-up after being gone for only 1 week.

#12 geniusalz

geniusalz

    Team MXM

  • Head Moderators
  • PipPipPipPipPip
  • 1,827 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:unknown

Posted 02 January 2004 - 07:11 AM

Randomness works cool.gif
New features:
-Pressing 'B' drops the current piece straight down.
-Keeps track of score and lines, and displays them.

Major problem:
-Game flickers badly in skins using a low amount of resources (eg halowresource biggrin.gif). Works perfect in high-resource skins (eg bluespek haxored or however you spell it)
I guess the problem is that the framerate is high for skins that don't use too much resources, so the screen refreshes while the board is being drawn. Therefore sometimes the main layout of the skin flashes briefly, and the game board keeps flickering on/off.

There should be a way to lock screen updates while the screen is being drawn on.
e.g.
CODE
BeginDraw LockRefresh
blah
blah
blah
EndDraw

'BeginDraw LockRefresh' should keep the current frame on the screen, until the EndDraw statement is reached, thus eliminating the flickering.


On another note, I've noticed that skins show up more 'completely' while switching (when it tells you to reboot). Is this an indication of runtime skin switching coming soon?

Edited by geniusalz, 02 January 2004 - 07:13 AM.


#13 BenJeremy

BenJeremy

    X-S Elysian

  • Head Moderators
  • PipPipPipPipPipPipPipPipPipPipPipPipPip
  • 9,690 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:v1 (xenon)

Posted 02 January 2004 - 11:30 AM

On the LockRefresh, I'll look into something like that... as for the skin switching... dunno for sure. The major things I need to update for what I plan on doing have not been implemented yet.


Work progresses on Virtual Keyboard, BTW.... the keyboard works 'seamlessly' in the input system (you can activate it and 'hit keys' that produce ASCII messages in the input system queue), but I still need to give it text editing legs.


An update might be in place tonight.

#14 BenJeremy

BenJeremy

    X-S Elysian

  • Head Moderators
  • PipPipPipPipPipPipPipPipPipPipPipPipPip
  • 9,690 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:v1 (xenon)

Posted 02 January 2004 - 11:08 PM

Any chance we can see an update?

Looks cool, except I only get straight pieces (don't see $rand$ anywhere in the code) and the pieces are rather dark.

On a side note, I'm going to shortly implement dual Draw stacks, and alternate between them... this should eliminate the flicker issue.

Perhaps you can also add a few more features when time allows wink.gif since we can record high scores and such with names.

#15 geniusalz

geniusalz

    Team MXM

  • Head Moderators
  • PipPipPipPipPip
  • 1,827 posts
  • Gender:Male
  • Xbox Version:v1.1
  • 360 version:unknown

Posted 02 January 2004 - 11:51 PM

Here's the current version:
Use the pieces.xml from the other post
I'll probably add highscores, and fix colors tonight
CODE
;Tetris by geniusalz
;Beta, do not redistribute
;Change the path accordingly

XMLOPEN pieces c:pieces.xml
XMLCREATE counts Count
XMLCREATE board Board

SET score 0
SET lineTotal 0
SET interval 1000

SET pieceExists 1

SET globalTop 100
SET globalLeft 200

SET curPiece 1
SET curState 1
SET curLeft 0
SET curTop 0

SET nextPiece 1
SET nextState 1
SET nextLeft 0
SET nextTop 0

SET changed 1

SET falling 0

:Begin
SET endTime $timer$
ADD endTime %interval%

:BeginLoop
 IF# %falling% == 1 GOTO TimeUp
 IF# %pieceExists% == 0 GOSUB MakePiece
 IF# %changed% == 1 GOSUB DrawBoard
 SETFUNC MSG_ID1 IQPeekMsgID
 IF %MSG_ID1% GOSUB ExecuteInput

 IF# %endTime% < $timer$ GOTO TimeUp

 GOTO BeginLoop
  :TimeUp
  GOSUB MoveDown
  GOTO Begin
 GOTO BeginLoop
 
:MakePiece
SETFUNC nextPiece RIGHT 3 $rand$
MOD nextPiece 7
ADD nextPiece 1
SET nextState 1
SET nextLeft 2
SET nextTop 0
GOSUB CheckValidity
IF# %isValid% == 1 GOTO GetNewPiece
GOSUB EndGame

:GetNewPiece
SET curPiece %nextPiece%
SET curState 1
SET curLeft 2
SET curTop 0


SET pieceExists 1
RETURN

:MoveDown
SET nextTop %curTop%
ADD nextTop 1
SET nextPiece %curPiece%
GOSUB CheckValidity

IF# %isValid% == 1 GOTO Keep
GOSUB FixPiece

:Keep
SET curTop %nextTop%
SET changed 1
RETURN

:ExecuteInput
IQWaitMsg ANY

SET nextTop %curTop%
SET nextLeft %curLeft%
SET nextState %curState%
SET nextPiece %curPiece%

; IF %MSG_ID% == "UI_UP" GOTO ChangePiece
IF %MSG_ID% == "UI_DN" GOTO MoveDn
IF %MSG_ID% == "UI_LF" GOTO MoveLeft
IF %MSG_ID% == "UI_RT" GOTO MoveRight
IF %MSG_ID% == "UI_Select" GOTO SpinLeft
IF %MSG_ID% == "UI_Back" GOTO DropIt
BeginDraw
 Messagebox "Paused $eol$Press Y to quit$eol$Anything else to continue"
Enddraw
IQWaitMsg ANY
IF %MSG_ID% == "SYS_MENU" GOTO Quit
GOTO DiscardInput
 :DropIt
 SET falling 1
 GOTO DiscardInput

 :MoveDn
 ADD nextTop 1
 GOTO DontFix
 
 :MoveRight
 ADD nextLeft 1
 GOTO DontFix
 
 :MoveLeft
 SUB nextLeft 1
 GOTO DontFix

 :ChangePiece
 ADD nextPiece 1
 
 IF# %nextPiece% > 7 GOTO FixPiec
  GOTO DontFix
 
  :FixPiec
  SUB nextPiece 7
 GOTO DontFix
 
 :SpinLeft
 ADD nextState 1
 
 IF# %nextState% > 4 GOTO Fix
  GOTO DontFix
 
  :Fix
  SUB nextState 4
 :DontFix
 GOSUB CheckValidity

 IF# %isValid% == 1 GOTO KeepInput
 GOTO DiscardInput
  :KeepInput
  IF# %nextTop% != %curTop% GOSUB ResetTimer

  SET curLeft %nextLeft%
  SET curTop %nextTop%
  SET curState %nextState%
  SET curPiece %nextPiece%
 
  SET changed 1
:DiscardInput
SET nextTop %curTop%
SET nextLeft %curLeft%
SET nextState %curState%
SET nextPiece %curPiece%
RETURN

:DrawBoard
BeginDraw
SET leftVal %globalLeft%
ADD leftVal 9
SET topVal %globalTop%
ADD topVal 9
BOX %leftVal% %topVal% 101 201 0xFF000000 0x88FFFFFF

SUB topVal 24
BOX %leftVal% %topVal% 101 24 0xFF000000 0x88FFFFFF
TEXT %leftVal% %topVal% LEFT " Tetris 1.0"

ADD leftVal 50
ADD topVal 225
TEXT %leftVal% %topVal% CENTER "Score: %score%"
ADD topVal 24
TEXT %leftVal% %topVal% CENTER "Lines: %lineTotal%"

FOR x = 1 to 11
 FOR y = 1 to 21
  XMLGetValue board toDraw !.%x%.%y%
  IF# %toDraw% == 1 GOTO DrawThis1
  GOTO DontDraw1
  :DrawThis1
   SET xPos %x%
   MULT xPos 10
   SET yPos %y%
   MULT yPos 10
   ADD xPos %globalLeft%
   ADD yPos %globalTop%

   BOX %xPos% %yPos% 9 9 0xF2182228 0xF2182228
  :DontDraw1
 NEXT
NEXT
FOR y = 1 to 5
 XMLGetValue pieces curRow !.piece%curPiece%.state%curState%.row%y%
 FOR x = 1 to 5
  SET x2 %x%
  SUB x2 1
  SETFUNC toDraw1 MID %x2% 1 %curRow%
 
  IF# %toDraw1% == 1 GOTO DrawThis2
  GOTO DontDraw2
  :DrawThis2
   SET xPos %x%
   ADD xPos %curLeft%
   MULT xPos 10
   ADD xPos %globalLeft%
   SET yPos %y%
   ADD yPos %curTop%
   MULT yPos 10
   ADD yPos %globalTop%
 
   BOX %xPos% %yPos% 9 9 0xF2182228 0xF2182228
  :DontDraw2
 NEXT
NEXT
SET changed 0
EndDraw
RETURN


:CheckValidity
SET isValid 1

FOR y = 1 to 5
 XMLGetValue pieces curRow !.piece%nextPiece%.state%nextState%.row%y%
 
 FOR x = 1 to 5
  SET x2 %x%
  SUB x2 1
  SETFUNC toCheck4 MID %x2% 1 %curRow%
 
  IF# %toCheck4% == 1 GOTO CheckThis4
  GOTO DontCheck4
  :CheckThis4
   SET xPos %x%
   ADD xPos %nextLeft%
   
   SET yPos %y%
   ADD yPos %nextTop%
 
   XMLGetValue board checkVal !.%xPos%.%yPos% 0
   
   IF# %checkVal% == 1 GOTO ThisIsInvalid
   IF# %xPos% < 1 GOTO ThisIsInvalid
   IF# %yPos% < 1 GOTO ThisIsInvalid
   IF# %xPos% > 10 GOTO ThisIsInvalid
   IF# %yPos% > 20 GOTO ThisIsInvalid

   GOTO DontCheck4

   :ThisIsInvalid
   SET isValid 0
  :DontCheck4
 NEXT
NEXT
RETURN

:FixPiece
SET falling 0
FOR y = 1 to 5
 XMLGetValue pieces curRow !.piece%curPiece%.state%curState%.row%y%
 
 FOR x = 1 to 5
  SET x2 %x%
  SUB x2 1
  SETFUNC toDraw3 MID %x2% 1 %curRow%
 
  IF# %toDraw3% == 1 GOTO DrawThis3
  GOTO DontDraw3
  :DrawThis3
   SET xPos %x%
   ADD xPos %curLeft%
   
   SET yPos %y%
   ADD yPos %curTop%
 
   XMLSetValue board !.%xPos%.%yPos% 1
   XMLGetValue counts TEMP !.%yPos%
   ADD TEMP 1
   XMLSetValue counts !.%yPos% %TEMP%
  :DontDraw3
 NEXT
NEXT

SET pieceExists 0
SET changed 1
GOSUB CheckLine
RETURN

:CheckLine
SET lineCount 0
FOR y = 1 to 21
 XMLGetValue counts lineTot !.%y%
 
 IF# %lineTot% < 10 GOTO SkipLine
  GOSUB ResetTimer
  ADD lineCount 1
  SET y2 %y%
  ADD y2 1

  FOR z = %y% to 0 STEP -1
   SET z2 %z%
   SUB z2 1
   
   FOR x = 1 to 11
    XMLGetValue board TEMP !.%x%.%z2%
    XMLSetValue board !.%x%.%z% %TEMP%
   NEXT
   XMLGetValue counts TEMP !.%z2%
   XMLSetValue counts !.%z% %TEMP%
  NEXT
 :SkipLine  
NEXT

IF# %lineCount% == 1 GOTO OneLine
;100
IF# %lineCount% == 2 GOTO TwoLines
;300
IF# %lineCount% == 3 GOTO ThreeLines
;600
IF# %lineCount% == 4 GOTO FourLines
;1000
GOTO NoLines

:FourLines
ADD lineTotal 1
ADD score 400
:ThreeLines
ADD lineTotal 1
ADD score 300
:TwoLines
ADD lineTotal 1
ADD score 200
:OneLine
ADD lineTotal 1
ADD score 100
SET changed 1

IF# %lineTotal% > 120 GOTO Line5
IF# %lineTotal% > 80 GOTO Line4
IF# %lineTotal% > 50 GOTO Line3
IF# %lineTotal% > 30 GOTO Line2
IF# %lineTotal% > 10 GOTO Line1
GOTO NoLines
:Line1
SET interval 800
GOTO NoLines
:Line2
SET interval 600
GOTO NoLines
:Line3
SET interval 400
GOTO NoLines
:Line4
SET interval 200
GOTO NoLines
:Line5
SET interval 100
:NoLines
RETURN

:ResetTimer
SET endTime $timer$
ADD endTime %interval%
RETURN

:EndGame
BeginDraw
 Messagebox "Game over.  Your score was %score% with %lineTotal% lines."
 IQWaitMsg ANY
Enddraw
:Quit
QUIT





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users