xboxscene.org forums

Pages: [1] 2 3 4

Author Topic: Tetris  (Read 1884 times)

geniusalz

  • Archived User
  • Hero Member
  • *
  • Posts: 1635
Tetris
« on: December 29, 2003, 09:12:00 PM »

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
Logged

unleashx

  • Archived User
  • Hero Member
  • *
  • Posts: 621
Tetris
« Reply #1 on: December 29, 2003, 11:09:00 PM »

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.  ;)   <
Logged

geniusalz

  • Archived User
  • Hero Member
  • *
  • Posts: 1635
Tetris
« Reply #2 on: December 29, 2003, 11:26:00 PM »

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

   
 
 
    1111
    0000
    0000
    0000
 

 
    0001
    0001
    0001
    0001
 

 
    1111
    0000
    0000
    0000
 

 
    0001
    0001
    0001
    0001
 

   

   
 
 
    0111
    0001
    0000
    0000
 

 
    0001
    0001
    0011
    0000
 

 
    0100
    0111
    0000
    0000
 

 
    0011
    0010
    0010
    0000
 

   

   
 
 
    0010
    0111
    0000
    0000
 

 
    0010
    0011
    0010
    0000
 

 
    0111
    0010
    0000
    0000
 

 
    0001
    0011
    0001
    0000
 

   

   
 
 
    0111
    0100
    0000
    0000
 

 
    0011
    0001
    0001
    0000
 

 
    0001
    0111
    0000
    0000
 

 
    0010
    0010
    0011
    0000
 

   

   
 
 
    0010
    0011
    0001
    0000
 

 
    0011
    0110
    0000
    0000
 

 
    0010
    0011
    0001
    0000
 

 
    0011
    0110
    0000
    0000
 

   

   
 
 
    0001
    0011
    0010
    0000
 

 
    0110
    0011
    0000
    0000
 

 
    0001
    0011
    0010
    0000
 

 
    0110
    0011
    0000
    0000
 

   

   
 
 
    0011
    0011
    0000
    0000
 

 
    0011
    0011
    0000
    0000
 

 
    0011
    0011
    0000
    0000
 

 
    0011
    0011
    0000
    0000
 

   

Logged

koldfuzion

  • Archived User
  • Hero Member
  • *
  • Posts: 1226
Tetris
« Reply #3 on: December 30, 2003, 04:41:00 AM »

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

Logged

geniusalz

  • Archived User
  • Hero Member
  • *
  • Posts: 1635
Tetris
« Reply #4 on: December 30, 2003, 11:21:00 AM »

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?
Logged

BenJeremy

  • Archived User
  • Hero Member
  • *
  • Posts: 5645
Tetris
« Reply #5 on: December 30, 2003, 11:52:00 AM »

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)
Logged

koldfuzion

  • Archived User
  • Hero Member
  • *
  • Posts: 1226
Tetris
« Reply #6 on: December 30, 2003, 05:15:00 PM »

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.
Logged

geniusalz

  • Archived User
  • Hero Member
  • *
  • Posts: 1635
Tetris
« Reply #7 on: January 01, 2004, 11:11:00 PM »

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?
Logged

BenJeremy

  • Archived User
  • Hero Member
  • *
  • Posts: 5645
Tetris
« Reply #8 on: January 02, 2004, 04:41:00 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.  <
Logged

BenJeremy

  • Archived User
  • Hero Member
  • *
  • Posts: 5645
Tetris
« Reply #9 on: January 02, 2004, 03:08:00 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.
Logged

geniusalz

  • Archived User
  • Hero Member
  • *
  • Posts: 1635
Tetris
« Reply #10 on: January 02, 2004, 05:02:00 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
 <
Logged

BenJeremy

  • Archived User
  • Hero Member
  • *
  • Posts: 5645
Tetris
« Reply #11 on: January 02, 2004, 04:17:00 PM »

I fixed XML pathing, so as long as pieces.xml is in the same directory as the script, you don't need to use the full path.

::goes to copy the file over and check the new version out!::
Logged

geniusalz

  • Archived User
  • Hero Member
  • *
  • Posts: 1635
Tetris
« Reply #12 on: January 02, 2004, 04:23:00 PM »

laugh.gif
Logged

BenJeremy

  • Archived User
  • Hero Member
  • *
  • Posts: 5645
Tetris
« Reply #13 on: January 02, 2004, 04:35:00 PM »

The color of the pieces is 0xF2182228, right? Any reason why? It's awfully dim on my display.

Any chance for uniquely colored pieces? This thing has the gameplay down pat. Very nice! (Perhaps I should include it in a script pack?)

Logged

BenJeremy

  • Archived User
  • Hero Member
  • *
  • Posts: 5645
Tetris
« Reply #14 on: January 02, 2004, 04:53:00 PM »

CODE




0xFFFF0000

 1111
 0000
 0000
 0000


 0001
 0001
 0001
 0001


 1111
 0000
 0000
 0000


 0001
 0001
 0001
 0001



0xFFFFFF00


 0111
 0001
 0000
 0000


 0001
 0001
 0011
 0000


 0100
 0111
 0000
 0000


 0011
 0010
 0010
 0000




0xFF00FF00

 0010
 0111
 0000
 0000


 0010
 0011
 0010
 0000


 0111
 0010
 0000
 0000


 0001
 0011
 0001
 0000



0xFF00FFFF


 0111
 0100
 0000
 0000


 0011
 0001
 0001
 0000


 0001
 0111
 0000
 0000


 0010
 0010
 0011
 0000



0xFF80FFFF


 0010
 0011
 0001
 0000


 0011
 0110
 0000
 0000


 0010
 0011
 0001
 0000


 0011
 0110
 0000
 0000



0xFFFF00FF


 0001
 0011
 0010
 0000


 0110
 0011
 0000
 0000


 0001
 0011
 0010
 0000


 0110
 0011
 0000
 0000



0xFF8080FF


 0011
 0011
 0000
 0000


 0011
 0011
 0000
 0000


 0011
 0011
 0000
 0000


 0011
 0011
 0000
 0000





tetris.xas
CODE

;Tetris by geniusalz
;Beta, do not redistribute
;Change the path accordingly

XMLOPEN pieces 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 0xFF1822FF 0xFF1822FF
 :DontDraw1
NEXT
NEXT
FOR y = 1 to 5
XMLGetValue pieces curRow !.piece%curPiece%.state%curState%.row%y%
XMLGetValue pieces PieceColor !.piece%curPiece%.color
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 %PieceColor% %PieceColor%
'0xFF1822FF 0xFF1822FF %curPiece%
 :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


I'll fix the screenshot stuff, too, so it works again with ActionScripts and post a few pics.
Logged
Pages: [1] 2 3 4