Posts for JXQ


JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
I voted no because the game's intro wasn't Japanese enough. Richter should have Hadokened everyone into The Wheel of Fate is Turning.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
1) What is your favorite thing that resulted from creating this site? 2) What is your least favorite thing that resulted from creating this site? Good luck in your future, Bisqwit.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
Post subject: I am HappyLee
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
I found this in an old folder while getting source code for the TAS utilities I wrote a while ago (I gave them to Raiscan so they should be on his emulator site at some point). It's Connect 4. It was fun programming the AI, but I've since learned that this game is "solved" and player 1 can always win if playing perfectly, and the AI here is not that good. Sorry for the long code. Edit: Some of the code didn't paste the first time. Edit: Trying again, now with HTML disabled. I sure don't miss this forum markup crap!
DECLARE SUB assigndifficulty ()
DECLARE SUB updatecursor ()
DECLARE SUB updateboardinfo ()
DECLARE FUNCTION checkwin! ()
DECLARE FUNCTION getplayermove! ()
DECLARE FUNCTION getcomputermove! ()
DECLARE SUB introscreen ()
DECLARE SUB setcolors ()
DECLARE SUB showcolors ()
DECLARE SUB drawboard ()
' JXQ
' Winter 2005
' Connect Four Program
'(6,1)      (6,7)
'
'
'
'
'(1,1)      (1,7)


' Declare variables

TYPE gamedata
       
        colour AS INTEGER       'Represents the color of the checker
                                'in a particular spot.
                                '0 - no checker
                                '1 - red
                                '2 - black
       
        red AS INTEGER          'Used to keep track of spots that are
                                'potential winning spaces for red.
                                '0 - no potential
                                '1 - red 3-in-a-row
                                '2 - red 2-in-a-row

        black AS INTEGER        'Used to keep track of spots that are
                                'potential winning spaces for black.
                                '0 - no potential
                                '1 - black 3-in-a-row
                                '2 - black 2-in-a-row
END TYPE

TYPE boarddata
       
        height AS INTEGER       'Keeps track of each column's height.
                                'If x checkers have been placed in a column,
                                'height = x.

        red2win AS INTEGER      'Boolean value if a column has a two-way-win
                                'in a particular column for red.

        black2win AS INTEGER    'Boolean value if a column has a two-way-win
                                'in a particular column for black.

        movevalue AS SINGLE     'Used in computer AI, representing the value
                                'of making the move in a particular column.

END TYPE

DIM SHARED board(1 TO 6, 1 TO 7) AS gamedata   'gamedata TYPE, one for each space

DIM SHARED boardinfo(1 TO 7) AS boarddata      'boardata TYPE, one for each column

DIM SHARED computermove(1 TO 7) AS INTEGER     'computer's priority of moves


DIM SHARED temp(1 TO 6, 1 TO 7) AS gamedata    'another gamedata TYPE, used for
                                               'testing moves in AI

DIM SHARED tempinfo(1 TO 7) AS boarddata       'another boarddata TYPE, used for
                                               'testing moves in AI

DIM SHARED playertypes AS INTEGER              '0 - replay, 1 - 1 player, 2 - 2 player
        playertypes = 1                        '1 player mode is default


DIM SHARED whosturn AS INTEGER                 '1 - black's turn, 2 - red's turn

DIM SHARED whoisfirstmethod AS INTEGER         'Configurable option.
                                        '0 - black always first
                                        '1 - black, then winner always first                                                        
                                        '2 - black, then loser always first
                                        '3 - red always first
                                        '4 - red, then winner always first                                                    
                                        '5 - red, then loser always first
        whoisfirstmethod = 6            '6 - random always first (DEFAULT)
                                        '7 - random, then winner always first                                                  
                                        '8 - random, then loser always first

DIM SHARED difficulty AS INTEGER               '1----2----3----4----5
        difficulty = 3                  'easy <-default-> hard

DIM SHARED diffvalue(1 TO 7) AS SINGLE  'table of difficulty values

DIM SHARED stillplaying AS INTEGER      '0 - not playing, 1 - still playing
        stillplaying = 1

DIM SHARED cursorcolumn AS INTEGER      'Keeps track of the moving cursor
        cursorcolumn = 4

DIM SHARED soundon AS INTEGER           '0 - no sound, 1 - sound
        soundon = 1

DIM SHARED movelist(1 TO 42) AS INTEGER

DIM SHARED skycolor(1 TO 17) AS INTEGER

RANDOMIZE TIMER

DO
        CALL introscreen

        'Here is the main title screen, selecting from:
        '1-player game, 2-player game, options menu, and exit
       
        CALL setcolors
     
        'numberofmoves is used as an indicator for being the first game or not
       
        numberofmoves = 0
        stillplaying = 1

        CALL assigndifficulty

        DO WHILE stillplaying = 1

                CLS

                CALL drawboard

                'Clear board data
        
                FOR i = 1 TO 6
                        FOR j = 1 TO 7
                                board(i, j).colour = 0
                                board(i, j).red = 0
                                board(i, j).black = 0
                                boardinfo(j).height = 0
                                boardinfo(j).red2win = 0
                                boardinfo(j).black2win = 0
                                boardinfo(j).movevalue = 0
                        NEXT j
                NEXT i

                'Based on options, assign who's turn is first for the first game
               
                'If this is the first game:
                IF numberofmoves = 0 THEN
                        SELECT CASE whoisfirstmethod
                      
                                CASE 0, 1, 2
                                        whosturn = 1
                              
                                CASE 3, 4, 5
                                        whosturn = 2
                              
                                CASE 6, 7, 8
                                        whosturn = INT(RND + .5) + 1
                        END SELECT
                'if this is not the first game
                ELSE
                        SELECT CASE whoisfirstmethod
                     
                                CASE 0
                                        whosturn = 1
                                CASE 3
                                        whosturn = 2
                                CASE 6
                                        whosturn = INT(RND + .5) + 1
                                CASE 1, 4, 7
                                        IF whosturn = 2 THEN whosturn = 1 ELSE whosturn = 2
                       
                        END SELECT
                END IF

                numberofmoves = 0

                DO
               
                        SELECT CASE playertypes
                                CASE 1
                                        IF whosturn = 2 THEN
                                                nextmove = getplayermove
                                                IF soundon = 1 THEN PLAY "mfo4l32dd"
                                        END IF
                                        IF whosturn = 1 THEN
                                                nextmove = getcomputermove
                                                IF soundon = 1 THEN PLAY "mfo4p2l32ff" ELSE PLAY "mfp2p32"
                                        END IF
                                CASE 2
                                        nextmove = getplayermove
                                        IF whosturn = 2 THEN
                                                IF soundon = 1 THEN PLAY "mfo4l32ddp8" ELSE PLAY "mfp8p32"
                                        END IF
                                        IF whosturn = 1 THEN
                                                IF soundon = 1 THEN PLAY "mfo4l32ffp8" ELSE PLAY "mfp8p32"
                                        END IF
                        END SELECT

                        'Clear keyboard buffer

                        DO
                                a$ = INKEY$
                        LOOP UNTIL a$ = ""
                
                        'Fill the correct colored checker in
                        'Add highlighted border to show it was the last move made
                        
                        IF numberofmoves > 0 THEN CIRCLE (48 + INT(37.4 * (movelist(numberofmoves) - 1)), 144.5 - INT(24.2 * (boardinfo(movelist(numberofmoves)).height - 1))), 13, 0
                       
                        PAINT (48 + INT(37.4 * (nextmove - 1)), 145.2 - INT(24.2 * boardinfo(nextmove).height)), (whosturn - 1) * 16 + 16, 0
                        CIRCLE (48 + INT(37.4 * (nextmove - 1)), 144.5 - INT(24.2 * boardinfo(nextmove).height)), 13, 80
                    
                        'Update simple board data
                        'Increase the height of the column played

                        board(boardinfo(nextmove).height + 1, nextmove).colour = whosturn
                        boardinfo(nextmove).height = boardinfo(nextmove).height + 1

                        'Update more advanced board information for 1-player game
               
                        IF playertypes = 1 THEN CALL updateboardinfo
                       
                        'Enable these next lines to show 2-in-a-rows, 3-in-a-rows,
                        'and two-way-wins

        '                FOR i = 1 TO 7
        '                        FOR j = 1 TO 6
        '                                IF board(j, i).red <> 0 THEN LINE (43 + INT(37.4 * (i - 1)), 140.2 - INT(24.2 * (j - 1)))-(48 + INT(37.4 * (i - 1)), 150.2 - INT(24.2 * (j - 1))), 32, BF
        '                                IF board(j, i).red = 1 THEN LINE (43 + INT(37.4 * (i - 1)), 140.2 - INT(24.2 * (j - 1)))-(48 + INT(37.4 * (i - 1)), 150.2 - INT(24.2 * (j - 1))), 250, B
        '                       
        '                                IF board(j, i).black <> 0 THEN LINE (48 + INT(37.4 * (i - 1)), 140.2 - INT(24.2 * (j - 1)))-(53 + INT(37.4 * (i - 1)), 150.2 - INT(24.2 * (j - 1))), 48, BF
        '                                IF board(j, i).black = 1 THEN LINE (48 + INT(37.4 * (i - 1)), 140.2 - INT(24.2 * (j - 1)))-(53 + INT(37.4 * (i - 1)), 150.2 - INT(24.2 * (j - 1))), 250, B
        '                       
        '                        NEXT j
        '               
        '                        IF boardinfo(i).red2win > 0 THEN PAINT (48 + INT(37.4 * (i - 1)), 140.2 - INT(24.2 * (boardinfo(i).red2win - 1))), 64, 0
        '                        IF boardinfo(i).black2win > 0 THEN PAINT (48 + INT(37.4 * (i - 1)), 140.2 - INT(24.2 * (boardinfo(i).black2win - 1))), 64, 0
        '                NEXT i

                        'Increase the number of total moves by 1

                        numberofmoves = numberofmoves + 1
                                      
                        'Add the current move to the move list

                        movelist(numberofmoves) = nextmove
                      
                        'Switch who's turn it is for the next move

                        IF whosturn = 2 THEN whosturn = 1 ELSE whosturn = 2

                        'Clear the dialog box
                        LOCATE 23, 1
                        PRINT SPACE$(38)
                               
                        'Check the board for a win, and break the loop if found
               
                        IF checkwin = 1 THEN EXIT DO
               
                LOOP UNTIL numberofmoves = 42
               
                LOCATE 23, 1
               
                IF checkwin = 0 THEN
                        PRINT "it's a tie"
                ELSE
                        IF playertypes = 1 THEN
                                PRINT "You ";
                                IF whosturn = 2 THEN
                                        PRINT "lose"
                                        IF soundon = 1 THEN PLAY "mfo3l16eedp16l8c"
                                ELSE
                                        PRINT "win!"
                                        IF soundon = 1 THEN PLAY "mfo4l16ffgp16l8o5c"
                                END IF
                        ELSE
                                IF whosturn = 1 THEN PRINT "Red";  ELSE PRINT "Black";
                                PRINT " wins!"
                                IF soundon = 1 THEN PLAY "mfo4l16ffgp16l8o5c"
                        END IF
                END IF

        'Routine asking to play again.  If yes, determine who is
        'first based on who is current and first procedure from options
        LOCATE 23, 20: PRINT "Play again? (Y/N)"
       
                DO UNTIL a$ = "Y" OR a$ = "N"
                        a$ = UCASE$(INKEY$)
                LOOP
               
                IF a$ = "N" THEN stillplaying = 0
        LOOP

        'If not playing again, return to the title screen
LOOP

SUB assigndifficulty

IF difficulty = 1 THEN
        diffvalue(1) = .5
        diffvalue(2) = .7
        diffvalue(3) = .8
        diffvalue(4) = .88
        diffvalue(5) = .95
        diffvalue(6) = .98
        diffvalue(7) = 1
END IF
IF difficulty = 2 THEN
        diffvalue(1) = .65
        diffvalue(2) = .85
        diffvalue(3) = .95
        diffvalue(4) = .98
        diffvalue(5) = 1
        diffvalue(6) = 1
        diffvalue(7) = 1
END IF
IF difficulty = 3 THEN
        diffvalue(1) = .8
        diffvalue(2) = .95
        diffvalue(3) = .985
        diffvalue(4) = 1
        diffvalue(5) = 1
        diffvalue(6) = 1
        diffvalue(7) = 1
END IF
IF difficulty = 4 THEN
        diffvalue(1) = .95
        diffvalue(2) = .99
        diffvalue(3) = 1
        diffvalue(4) = 1
        diffvalue(5) = 1
        diffvalue(6) = 1
        diffvalue(7) = 1
END IF
IF difficulty = 5 THEN
        diffvalue(1) = 1
        diffvalue(2) = 1
        diffvalue(3) = 1
        diffvalue(4) = 1
        diffvalue(5) = 1
        diffvalue(6) = 1
        diffvalue(7) = 1
END IF

END SUB

'This program checks board for a win (four checkers
'in a row horizontally, vertically, or diagonally)
'and returns integer value of 1 if a win is found.
'
FUNCTION checkwin
        FOR i = 1 TO 6
                FOR j = 1 TO 7

                        'check win to the right
                        IF board(i, j).colour <> 0 THEN
                                IF j <= 4 THEN
                                        IF i <= 3 THEN
                                                IF board(i, j).colour = board(i + 1, j + 1).colour AND board(i + 1, j + 1).colour = board(i + 2, j + 2).colour AND board(i + 2, j + 2).colour = board(i + 3, j + 3).colour THEN checkwin = 1
                                        END IF
                                        IF i >= 4 THEN
                                                IF board(i, j).colour = board(i - 1, j + 1).colour AND board(i - 1, j + 1).colour = board(i - 2, j + 2).colour AND board(i - 2, j + 2).colour = board(i - 3, j + 3).colour THEN checkwin = 1
                                        END IF
                                        IF board(i, j).colour = board(i, j + 1).colour AND board(i, j + 1).colour = board(i, j + 2).colour AND board(i, j + 2).colour = board(i, j + 3).colour THEN checkwin = 1
                                END IF
                                IF j >= 4 THEN
                                        IF i <= 3 THEN
                                                IF board(i, j).colour = board(i + 1, j - 1).colour AND board(i + 1, j - 1).colour = board(i + 2, j - 2).colour AND board(i + 2, j - 2).colour = board(i + 3, j - 3).colour THEN checkwin = 1
                                        END IF
                                        IF i >= 4 THEN
                                                IF board(i, j).colour = board(i - 1, j - 1).colour AND board(i - 1, j - 1).colour = board(i - 2, j - 2).colour AND board(i - 2, j - 2).colour = board(i - 3, j - 3).colour THEN checkwin = 1
                                        END IF
                                        IF board(i, j).colour = board(i, j - 1).colour AND board(i, j - 1).colour = board(i, j - 2).colour AND board(i, j - 2).colour = board(i, j - 3).colour THEN checkwin = 1
                                END IF
                                IF i >= 4 THEN
                                        IF board(i, j).colour = board(i - 1, j).colour AND board(i - 1, j).colour = board(i - 2, j).colour AND board(i - 2, j).colour = board(i - 3, j).colour THEN checkwin = 1
                                END IF
                                IF i <= 3 THEN
                                        IF board(i, j).colour = board(i + 1, j).colour AND board(i + 1, j).colour = board(i + 2, j).colour AND board(i + 2, j).colour = board(i + 3, j).colour THEN checkwin = 1
                                END IF
                       
                        END IF
                NEXT j
        NEXT i
END FUNCTION

'Subroutine called at the beginning of each game to draw the new board
'
'
SUB drawboard
SCREEN 13

CLS

'draw layered sky

FOR j = 170 TO 11 STEP -15
        LINE (0, 0)-(320, j), 65 - (j \ 10), BF
NEXT j


'draw individual checker spaces

LINE (30, 10)-(290, 160), 0, B

FOR i = 0 TO 6
        FOR j = 0 TO 5
                CIRCLE (48 + INT(37.4 * i), 24 + INT(24.18 * j)), 13, 0
                
        NEXT j
NEXT i

PAINT (31, 11), 14, 0

END SUB

'Artificial Intelligence function used for the computer
'to determine which column to move, based on the status
'of board & boardinfo.  Returns column to move in.
'
FUNCTION getcomputermove
      
        LOCATE 23, 1
        COLOR 25
        PRINT "Computer is thinking..."


        'reset the base values for each column's movement value
        'add in slight degree of randomness for equal values

        FOR i = 1 TO 7
                boardinfo(i).movevalue = ((3 - ABS(4 - i) + (6 - boardinfo(i).height)) / 10) + (RND / 20)
        NEXT i
              

        FOR i = 1 TO 7
                IF boardinfo(i).height < 6 THEN
                        'First check for a computer-win
                        IF board(boardinfo(i).height + 1, i).black = 1 THEN boardinfo(i).movevalue = boardinfo(i).movevalue + 300: LOCATE 2, 1
                       
                        'Then check for a human-win to block
                        IF board(boardinfo(i).height + 1, i).red = 1 THEN boardinfo(i).movevalue = boardinfo(i).movevalue + 150: LOCATE 3, 1
                       
                        'Then check for a human-win creation to avoid
                        IF boardinfo(i).height < 5 THEN
                                IF board(boardinfo(i).height + 2, i).red = 1 THEN boardinfo(i).movevalue = boardinfo(i).movevalue - 150
                        END IF

                        'Now check for an existing 2-way win to build toward
                        IF boardinfo(i).black2win > 0 THEN boardinfo(i).movevalue = boardinfo(i).movevalue + 50 + boardinfo(i).black2win
               
                        'Now check for an existing 2-way loss to avoid
                        IF boardinfo(i).red2win > 0 THEN boardinfo(i).movevalue = boardinfo(i).movevalue - 50 - boardinfo(i).black2win

                        'Copy board info into a dummy array

                        FOR j = 1 TO 7
                                FOR k = 1 TO 6
                                        temp(k, j) = board(k, j)
                                NEXT k
                                tempinfo(j) = boardinfo(j)
                        NEXT j
                                            
                        'Now place a red checker in column i of this data structure
                        board(boardinfo(i).height + 1, i).colour = 2
               
                        boardinfo(i).height = boardinfo(i).height + 1
                        CALL updateboardinfo

                        FOR j = 1 TO 7
                               

                                'If a new 2-way-win exists for red in any column, block this move
                                IF boardinfo(j).red2win <> tempinfo(j).red2win AND boardinfo(j).red2win <> 0 THEN boardinfo(i).movevalue = boardinfo(i).movevalue + 12

                                'If a new 3-in-a-row win exists for red, block this move
                                IF boardinfo(j).height < 6 AND boardinfo(j).height > 0 THEN
                                        IF temp(boardinfo(j).height + 1, j).red <> 1 AND board(boardinfo(j).height + 1, j).red = 1 THEN boardinfo(i).movevalue = boardinfo(i).movevalue + 10: LOCATE 8, 1
                                END IF
                               
                                'If a new 3-in-a-row non-win exists for red, block this move
                                FOR k = 1 TO 6
                                        IF temp(k, j).red <> 1 AND board(k, j).red = 1 THEN boardinfo(i).movevalue = boardinfo(i).movevalue + 3: : LOCATE 9, 1
                                NEXT k
                        NEXT j

                        'change the placed red checker to black
                        board(boardinfo(i).height, i).colour = 1
                        CALL updateboardinfo

                        FOR j = 1 TO 7
                                'If a new 2-way-win exists for black in any column, make this move
                                IF boardinfo(j).black2win <> tempinfo(j).black2win AND boardinfo(j).black2win <> 0 THEN boardinfo(i).movevalue = boardinfo(i).movevalue + 12

                                'If a new 3-in-a-row win exists for black, make this move
                                IF boardinfo(j).height < 6 AND boardinfo(j).height > 0 THEN
                                        IF temp(boardinfo(j).height + 1, j).black <> 1 AND board(boardinfo(j).height + 1, j).black = 1 THEN boardinfo(i).movevalue = boardinfo(i).movevalue + 15
                                END IF
                              
                                FOR k = 1 TO 6
                                        'If a new 3-in-a-row non-win exists for black, make this move
                                        IF temp(k, j).black <> 1 AND board(k, j).black = 1 THEN boardinfo(i).movevalue = boardinfo(i).movevalue + 4
                                       
                                        'If a new 2-in-a-row non-win exists for black, make this move
                                        IF temp(k, j).black <> 2 AND board(k, j).black = 2 THEN boardinfo(i).movevalue = boardinfo(i).movevalue + 1
                                NEXT k
                        NEXT j


                        'if there is space above the placed black checker
                        IF boardinfo(i).height < 6 THEN
                               
                                'place a red checker above it
                                board(boardinfo(i).height + 1, i).colour = 2
                                boardinfo(i).height = boardinfo(i).height + 1
                                CALL updateboardinfo

                                FOR j = 1 TO 7
                                        'If moving here creates a new 2-way-win for red in any column, avoid this move
                                        IF boardinfo(j).red2win <> tempinfo(j).red2win AND boardinfo(j).red2win <> 0 THEN boardinfo(i).movevalue = boardinfo(i).movevalue - 12

                                        'If moving here creates a new 3-in-a-row win for red, avoid this move
                                        IF boardinfo(j).height < 6 AND boardinfo(j).height > 0 THEN
                                                IF board(boardinfo(j).height + 1, j).red <> temp(boardinfo(j).height + 1, j).red AND board(boardinfo(j).height + 1, j).red = 1 THEN boardinfo(i).movevalue = boardinfo(i).movevalue - 10
                                        END IF
                              
                                        'If moving here creates a new 3-in-a-row non-win for red, avoid this move
                                        FOR k = 1 TO 6
                                                IF temp(k, j).red <> 1 AND board(k, j).red = 1 THEN boardinfo(i).movevalue = boardinfo(i).movevalue - 3
                                        NEXT k
                                NEXT j
                               
                               
                                'remove the top red checker
                                board(boardinfo(i).height, i).colour = 0
                                boardinfo(i).height = boardinfo(i).height - 1
                                CALL updateboardinfo
                        END IF

                        'remove the top black checker, returning the board
                        'to its original state
                        board(boardinfo(i).height, i).colour = 0
                        boardinfo(i).height = boardinfo(i).height - 1
                        CALL updateboardinfo
                ELSE
                        boardinfo(i).movevalue = -1000
                END IF
        NEXT i

        currentmaximum = -500
        currentmove = 4
       
        LOCATE 1, 1
        FOR i = 1 TO 7
                computermove(i) = i
                'Uncomment this line to see computer AI values
'                PRINT boardinfo(i).movevalue; " ";
        NEXT i

        'Bubble Sort computer's moves - computermove(1) > ... > computermove(7)
        FOR i = 6 TO 1 STEP -1
                FOR j = 6 TO i STEP -1
                        IF boardinfo(computermove(j)).movevalue < boardinfo(computermove(j + 1)).movevalue THEN
                                temp = computermove(j)
                                computermove(j) = computermove(j + 1)
                                computermove(j + 1) = temp
                        END IF
                NEXT j
        NEXT i
       
        'Computermove(7) is the best move.  Depending on the difficulty,
        'each move has a predetermined probability of being selected
       
        temp = RND
        selectedmove = 0


        'Cycle through the chart values and assign the appropriate move
       
        FOR i = 7 TO 1 STEP -1
               
                IF temp < diffvalue(i) THEN currentmove = computermove(i)
               
                'In case an illegal move is selected, change it
               
                IF boardinfo(currentmove).movevalue = -1000 THEN currentmove = computermove(i - 1)
        NEXT i

        getcomputermove = currentmove

END FUNCTION

'This function will get input from the keyboard determining
'which column the human player chooses to move in.
'
FUNCTION getplayermove
       
        DO                      'Clear the keyboard buffer
                a$ = INKEY$
        LOOP UNTIL a$ = ""

        LOCATE 23, 1
        COLOR 47
        IF playertypes = 2 THEN
                IF whosturn = 2 THEN
                        PRINT "Red's turn: ";
                ELSEIF whosturn = 1 THEN
                        COLOR 25
                        PRINT "Black's turn: ";
                END IF
        END IF
        PRINT "Make your move  "
       
        moveconfirmed = 0       'Player is asked for a move until
                                'moveconfirmed = 1.  This is to
                                'stop players from choosing columns
                                'that are already full.
       
        
        
        DO
                CALL updatecursor
                DO
                        a$ = INKEY$
                        IF a$ = "" THEN a$ = "0"
                        IF a$ = CHR$(0) + "K" AND cursorcolumn > 1 THEN
                                cursorcolumn = cursorcolumn - 1
                                CALL updatecursor
                        END IF
                        IF a$ = CHR$(0) + "M" AND cursorcolumn < 7 THEN
                                cursorcolumn = cursorcolumn + 1
                                CALL updatecursor
                        END IF
                       
                        'Escape key to end at any time
                        IF a$ = CHR$(27) THEN SYSTEM

                LOOP UNTIL ASC(a$) > 48 AND ASC(a$) < 56 OR ASC(a$) = 13
               
                IF ASC(a$) <> 13 THEN loopmove = ASC(a$) - 48 ELSE loopmove = cursorcolumn


                IF boardinfo(loopmove).height < 6 THEN

                        moveconfirmed = 1
               
                ELSE
                        PLAY "mfo3l8c"

                END IF
       
        LOOP UNTIL moveconfirmed = 1

        getplayermove = loopmove

END FUNCTION

SUB introscreen
SCREEN 12
COLOR 15
CLS
'Basic menu system, to adjust options and so forth


LOCATE 6, 25: PRINT "Connect 4 by JXQ"

LOCATE 10, 20: PRINT "Begin 1-player game"
LOCATE 12, 20: PRINT "Begin 2-player game"
LOCATE 14, 20: PRINT "Difficulty: "
LOCATE 16, 20: PRINT "Who goes first: "
LOCATE 18, 20: PRINT "Sound: "
LOCATE 20, 20: PRINT "Quit"

COLOR 7
LOCATE 14, 50: PRINT "Up and down arrows to"
LOCATE 15, 50: PRINT "select options"
LOCATE 17, 50: PRINT "Left and right arrows"
LOCATE 18, 50: PRINT "to adjust options"
LOCATE 20, 50: PRINT "Enter to begin a game"
LOCATE 21, 50: PRINT "ESC to quit program"

COLOR 15
breakloop = 0
menucursor = 1

DO UNTIL breakloop = 1
        COLOR 15
        LOCATE 14, 32
        SELECT CASE difficulty
                CASE 1
                        PRINT "Very Easy     "
                CASE 2
                        PRINT "Easy          "
                CASE 3
                        PRINT "Average       "
                CASE 4
                        PRINT "Difficult     "
                CASE 5
                        PRINT "Very Difficult"
        END SELECT
       
        LOCATE 16, 36
        SELECT CASE whoisfirstmethod
                CASE 0
                        PRINT "Black always       "
                CASE 1
                        PRINT "Black, then winner "
                CASE 2
                        PRINT "Black, then loser  "
                CASE 3
                        PRINT "Red always         "
                CASE 4
                        PRINT "Red, then winner   "
                CASE 5
                        PRINT "Red, then loser    "
                CASE 6
                        PRINT "Random always      "
                CASE 7
                        PRINT "Random, then winner"
                CASE 8
                        PRINT "Random, then loser "
        END SELECT
        LOCATE 18, 27
        IF soundon = 0 THEN PRINT "Off" ELSE PRINT "On "

        LOCATE 10, 17: PRINT "  "
        LOCATE 12, 17: PRINT "  "
        LOCATE 14, 17: PRINT "  "
        LOCATE 16, 17: PRINT "  "
        LOCATE 18, 17: PRINT "  "
        LOCATE 20, 17: PRINT "  "
        LOCATE (menucursor * 2) + 8, 17
        COLOR 14
        PRINT "->"

        DO
                a$ = INKEY$
                IF a$ = CHR$(0) + "H" AND menucursor > 1 THEN
                        menucursor = menucursor - 1
                END IF
                IF a$ = CHR$(0) + "P" AND menucursor < 6 THEN
                        menucursor = menucursor + 1
                END IF
                IF a$ = CHR$(0) + "M" THEN
                        IF menucursor = 3 AND difficulty < 5 THEN difficulty = difficulty + 1
                        IF menucursor = 4 AND whoisfirstmethod < 8 THEN whoisfirstmethod = whoisfirstmethod + 1
                        IF menucursor = 5 AND soundon = 0 THEN soundon = 1: PLAY "mfl16o2c"
                END IF
                IF a$ = CHR$(0) + "K" THEN
                        IF menucursor = 3 AND difficulty > 1 THEN difficulty = difficulty - 1
                        IF menucursor = 4 AND whoisfirstmethod > 0 THEN whoisfirstmethod = whoisfirstmethod - 1
                        IF menucursor = 5 AND soundon = 1 THEN soundon = 0
               
                END IF
                IF a$ = CHR$(13) THEN
                        IF menucursor = 1 THEN playertypes = 1: EXIT SUB
                        IF menucursor = 2 THEN playertypes = 2: EXIT SUB
                        IF menucursor = 6 THEN SYSTEM
                END IF
                IF a$ = CHR$(27) THEN SYSTEM


        LOOP UNTIL a$ = CHR$(0) + "H" OR a$ = CHR$(0) + "K" OR a$ = CHR$(0) + "M" OR a$ = CHR$(0) + "P" OR a$ = CHR$(13)

LOOP


END SUB

'Subroutine used to test color schemes.
'
'
SUB setcolors

SCREEN 13

'sky colors (48-63)

FOR i = 16 TO 31
        PALETTE (i + 32), (65536 * i * 2)
NEXT i

' red checker colors (32-47)

FOR i = 16 TO 31
        PALETTE i + 16, (i * 2)
NEXT i

' black checker colors already colors 16 - 31


END SUB

SUB showcolors
SCREEN 13

FOR i = 1 TO 16
FOR j = 1 TO 16
LINE (0 + (20 * (i - 1)), 0 + (12.5 * (j - 1)))-(0 + (20 * i), 0 + (12.5 * j)), 16 * (i - 1) + j - 1, BF
NEXT j
NEXT i
END SUB

'right, upright, up, upleft do NOT WORK
'
'This subroutine will update parts of the board and boardinfo
'array / structure.
'
'board(i, j).red and board(i, j).black are updated for each spot
'to keep track of potential winning spaces for red and black.
'
'boardinfo(n).red2way and boardinfo(n).black2way represent
'the height of the lower space of any 2-way wins that are
'in place for red or black.
'
'Since this information is used primarily for computer AI,
'this subroutine is ran only in one-player mode.
'(row, col)                              
SUB updateboardinfo
        FOR i = 1 TO 6
                FOR j = 1 TO 7

                        board(i, j).red = 0
                        board(i, j).black = 0
                NEXT j
                
        NEXT i
      
        FOR j = 1 TO 7
                boardinfo(j).red2win = 0
                boardinfo(j).black2win = 0
        NEXT j

        FOR i = 1 TO 6
                FOR j = 1 TO 7
                      
                        'check 2-in-a-row for red
                       
                       
                        IF board(i, j).colour = 2 THEN
                                IF j <= 5 THEN
                                        IF i <= 4 THEN
                                                IF board(i, j).colour = board(i + 1, j + 1).colour AND board(i + 2, j + 2).colour = 0 THEN board(i + 2, j + 2).red = 2
                                        END IF
                                        IF i >= 3 THEN
                                                IF board(i, j).colour = board(i - 1, j + 1).colour AND board(i - 2, j + 2).colour = 0 THEN board(i - 2, j + 2).red = 2
                                        END IF
                                        IF board(i, j).colour = board(i, j + 1).colour AND board(i, j + 2).colour = 0 THEN board(i, j + 2).red = 2
                                END IF
                                IF j >= 3 THEN
                                        IF i <= 4 THEN
                                                IF board(i, j).colour = board(i + 1, j - 1).colour AND board(i + 2, j - 2).colour = 0 THEN board(i + 2, j - 2).red = 2
                                        END IF
                                        IF i >= 3 THEN
                                                IF board(i, j).colour = board(i - 1, j - 1).colour AND board(i - 2, j - 2).colour = 0 THEN board(i - 2, j - 2).red = 2
                                        END IF
                                        IF board(i, j).colour = board(i, j - 1).colour AND board(i, j - 2).colour = 0 THEN board(i, j - 2).red = 2
                                END IF
                                IF i <= 4 THEN
                                        IF board(i, j).colour = board(i + 1, j).colour AND board(i + 2, j).colour = 0 THEN board(i + 2, j).red = 2
                                END IF
                     
                        END IF
                       
                    
                        'Check 2-in-a-row for black
                        IF board(i, j).colour = 1 THEN
                                IF j <= 5 THEN
                                        IF i <= 4 THEN
                                                IF board(i, j).colour = board(i + 1, j + 1).colour AND board(i + 2, j + 2).colour = 0 THEN board(i + 2, j + 2).black = 2
                                        END IF
                                        IF i >= 3 THEN
                                                IF board(i, j).colour = board(i - 1, j + 1).colour AND board(i - 2, j + 2).colour = 0 THEN board(i - 2, j + 2).black = 2
                                        END IF
                                        IF board(i, j).colour = board(i, j + 1).colour AND board(i, j + 2).colour = 0 THEN board(i, j + 2).black = 2
                                END IF
                                IF j >= 3 THEN
                                        IF i <= 4 THEN
                                                IF board(i, j).colour = board(i + 1, j - 1).colour AND board(i + 2, j - 2).colour = 0 THEN board(i + 2, j - 2).black = 2
                                        END IF
                                        IF i >= 3 THEN
                                                IF board(i, j).colour = board(i - 1, j - 1).colour AND board(i - 2, j - 2).colour = 0 THEN board(i - 2, j - 2).black = 2
                                        END IF
                                        IF board(i, j).colour = board(i, j - 1).colour AND board(i, j - 2).colour = 0 THEN board(i, j - 2).black = 2
                                END IF
                                IF i <= 4 THEN
                                        IF board(i, j).colour = board(i + 1, j).colour AND board(i + 2, j).colour = 0 THEN board(i + 2, j).black = 2
                                END IF
                    
                        END IF
                NEXT j
        NEXT i
                      
        FOR i = 1 TO 6
                FOR j = 1 TO 7

                        'check 3-in-a-row for red
                        IF board(i, j).colour = 2 THEN
                                IF j <= 4 THEN
                                        IF i <= 3 THEN
                                                IF board(i, j).colour = board(i + 1, j + 1).colour AND board(i + 1, j + 1).colour = board(i + 2, j + 2).colour AND board(i + 3, j + 3).colour = 0 THEN board(i + 3, j + 3).red = 1
                                                IF board(i, j).colour = board(i + 1, j + 1).colour AND board(i + 1, j + 1).colour = board(i + 3, j + 3).colour AND board(i + 2, j + 2).colour = 0 THEN board(i + 2, j + 2).red = 1
                                        END IF
                                        IF i >= 4 THEN
                                                IF board(i, j).colour = board(i - 1, j + 1).colour AND board(i - 1, j + 1).colour = board(i - 2, j + 2).colour AND board(i - 3, j + 3).colour = 0 THEN board(i - 3, j + 3).red = 1
                                                IF board(i, j).colour = board(i - 1, j + 1).colour AND board(i - 1, j + 1).colour = board(i - 3, j + 3).colour AND board(i - 2, j + 2).colour = 0 THEN board(i - 2, j + 2).red = 1
                                        END IF
                                        IF board(i, j).colour = board(i, j + 1).colour AND board(i, j + 1).colour = board(i, j + 2).colour AND board(i, j + 3).colour = 0 THEN board(i, j + 3).red = 1
                                        IF board(i, j).colour = board(i, j + 1).colour AND board(i, j + 1).colour = board(i, j + 3).colour AND board(i, j + 2).colour = 0 THEN board(i, j + 2).red = 1
                                END IF
                                IF j >= 4 THEN
                                        IF i <= 3 THEN
                                                IF board(i, j).colour = board(i + 1, j - 1).colour AND board(i + 1, j - 1).colour = board(i + 2, j - 2).colour AND board(i + 3, j - 3).colour = 0 THEN board(i + 3, j - 3).red = 1
                                                IF board(i, j).colour = board(i + 1, j - 1).colour AND board(i + 1, j - 1).colour = board(i + 3, j - 3).colour AND board(i + 2, j - 2).colour = 0 THEN board(i + 2, j - 2).red = 1
                                        END IF
                                        IF i >= 4 THEN
                                                IF board(i, j).colour = board(i - 1, j - 1).colour AND board(i - 1, j - 1).colour = board(i - 2, j - 2).colour AND board(i - 3, j - 3).colour = 0 THEN board(i - 3, j - 3).red = 1
                                                IF board(i, j).colour = board(i - 1, j - 1).colour AND board(i - 1, j - 1).colour = board(i - 3, j - 3).colour AND board(i - 2, j - 2).colour = 0 THEN board(i - 2, j - 2).red = 1
                                        END IF
                                        IF board(i, j).colour = board(i, j - 1).colour AND board(i, j - 1).colour = board(i, j - 2).colour AND board(i, j - 3).colour = 0 THEN board(i, j - 3).red = 1
                                        IF board(i, j).colour = board(i, j - 1).colour AND board(i, j - 1).colour = board(i, j - 3).colour AND board(i, j - 2).colour = 0 THEN board(i, j - 2).red = 1
                                END IF
                                IF i <= 3 THEN
                                        IF board(i, j).colour = board(i + 1, j).colour AND board(i + 1, j).colour = board(i + 2, j).colour AND board(i + 3, j).colour = 0 THEN board(i + 3, j).red = 1
                                END IF
                      
                        END IF
                        
                        'Check 3-in-a-row for black
                        IF board(i, j).colour = 1 THEN
                                IF j <= 4 THEN
                                        IF i <= 3 THEN
                                                IF board(i, j).colour = board(i + 1, j + 1).colour AND board(i + 1, j + 1).colour = board(i + 2, j + 2).colour AND board(i + 3, j + 3).colour = 0 THEN board(i + 3, j + 3).black = 1
                                                IF board(i, j).colour = board(i + 1, j + 1).colour AND board(i + 1, j + 1).colour = board(i + 3, j + 3).colour AND board(i + 2, j + 2).colour = 0 THEN board(i + 2, j + 2).black = 1
                                        END IF
                                        IF i >= 4 THEN
                                                IF board(i, j).colour = board(i - 1, j + 1).colour AND board(i - 1, j + 1).colour = board(i - 2, j + 2).colour AND board(i - 3, j + 3).colour = 0 THEN board(i - 3, j + 3).black = 1
                                                IF board(i, j).colour = board(i - 1, j + 1).colour AND board(i - 1, j + 1).colour = board(i - 3, j + 3).colour AND board(i - 2, j + 2).colour = 0 THEN board(i - 2, j + 2).black = 1
                                        END IF
                                        IF board(i, j).colour = board(i, j + 1).colour AND board(i, j + 1).colour = board(i, j + 2).colour AND board(i, j + 3).colour = 0 THEN board(i, j + 3).black = 1
                                        IF board(i, j).colour = board(i, j + 1).colour AND board(i, j + 1).colour = board(i, j + 3).colour AND board(i, j + 2).colour = 0 THEN board(i, j + 2).black = 1
                                END IF
                                IF j >= 4 THEN
                                        IF i <= 3 THEN
                                                IF board(i, j).colour = board(i + 1, j - 1).colour AND board(i + 1, j - 1).colour = board(i + 2, j - 2).colour AND board(i + 3, j - 3).colour = 0 THEN board(i + 3, j - 3).black = 1
                                                IF board(i, j).colour = board(i + 1, j - 1).colour AND board(i + 1, j - 1).colour = board(i + 3, j - 3).colour AND board(i + 2, j - 2).colour = 0 THEN board(i + 2, j - 2).black = 1
                                        END IF
                                        IF i >= 4 THEN
                                                IF board(i, j).colour = board(i - 1, j - 1).colour AND board(i - 1, j - 1).colour = board(i - 2, j - 2).colour AND board(i - 3, j - 3).colour = 0 THEN board(i - 3, j - 3).black = 1
                                                IF board(i, j).colour = board(i - 1, j - 1).colour AND board(i - 1, j - 1).colour = board(i - 3, j - 3).colour AND board(i - 2, j - 2).colour = 0 THEN board(i - 2, j - 2).black = 1
                                        END IF
                                        IF board(i, j).colour = board(i, j - 1).colour AND board(i, j - 1).colour = board(i, j - 2).colour AND board(i, j - 3).colour = 0 THEN board(i, j - 3).black = 1
                                        IF board(i, j).colour = board(i, j - 1).colour AND board(i, j - 1).colour = board(i, j - 3).colour AND board(i, j - 2).colour = 0 THEN board(i, j - 2).black = 1
                                END IF
                                IF i <= 3 THEN
                                        IF board(i, j).colour = board(i + 1, j).colour AND board(i + 1, j).colour = board(i + 2, j).colour AND board(i + 3, j).colour = 0 THEN board(i + 3, j).black = 1
                                END IF
                     
                        END IF
                NEXT j
        NEXT i

        FOR j = 1 TO 7
                FOR i = 5 TO 1 STEP -1
                        'check two-way-wins for red and black

                        IF board(i, j).red = 1 AND board(i + 1, j).red = 1 THEN boardinfo(j).red2win = i
                        IF board(i, j).black = 1 AND board(i + 1, j).black = 1 THEN boardinfo(j).black2win = i
                        
                NEXT i
        NEXT j



END SUB

'This subroutine updates the position of the cursor used with
'the player to select a column to play.
'
SUB updatecursor
        LINE (0, 0)-(320, 10), 63, BF
               
        LINE (7 + INT(37.4 * cursorcolumn), 5)-(14 + INT(37.4 * cursorcolumn), 5), 100
        LINE (7 + INT(37.4 * cursorcolumn), 5)-(11 + INT(37.4 * cursorcolumn), 8), 100
        LINE (11 + INT(37.4 * cursorcolumn), 8)-(14 + INT(37.4 * cursorcolumn), 5), 100
        PAINT (11 + INT(37.4 * cursorcolumn), 6), 100, 100
       

END SUB

<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Here are some new links to music that I've done. Myself - album finished in 2008, available at CDBaby. New site - I will be putting more free tracks here pretty soon (and on a more consistent basis), and discussing things about music that interest me, and hopefully help or inform others who are interested in similar things. If you're interested, check the links out. Apparently there is an RSS feed that came with the software, but I have no idea how to use one of those. So I don't know if it works or not! (I don't have My Voice hosted online anymore, so I removed the link. I also changed the name of this thread and updated the first post with this same information) I hope everyone's doing well here.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Does every single post I make need a damn footnote? TASvideos collective memory is pretty short-term. Post where you talk about the positive effects of his attitude
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Enjoy having 10 incorrectly emulated extra frames tacked onto each one of the already too-long door transitions!
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Saturn wrote:
The argument is closed, thanks to someone as cool and rational as hero of the day. Take a example of his attitude, JXQ.
Another way to close the argument is to not start it in the first place, and avoid drawing everyone else into your irrelevant bickering about who gets credit for what. (This is accomplished by you not being a huge cockwand. Try it!)
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
You guys see what Saturn's presence does? (PJ Boy are you reading this?) It's not just his own attitude, it's that his demeanor is causing the other Super Metroid TASers, even someone as cool and rational as hero of the day, to argue about who discovered a fucking route. Are you joking me? Is this SDA's Ocarina of Time thread? You guys see what his presence does? Thanks for helping the forum suck, Saturn. I hope you get banned some day for being such a selfish prick.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
I found this game at a used video game store months ago, and picked it up for $7. Money well spent! I have almost finished through this game, and I've given thought to trying a TAS of it. The task seems daunting, and I'd be thrilled if someone beat me to it, but that seems to not happen very often. I wouldn't be starting this for a while though, so maybe this will spark someone else's interest, which would be great. Here are my opinions!
  • I would turn brightness up to its maximum in the options. I also wonder if turning up the analog's sensitivity could give more precise turning (though it may end up more jerky than anything).
  • Diagonal walking works in this game. I don't like this.
  • There are some secret levels. I'm not sure if these should be visited or not in a TAS.
  • I have yet to find a graphics plugin that does not have a visual problem on the left and right sides of the screen when near a wall. This does not happen on console.
  • Some of the levels in this game are just so back-and-forth, it reminds me of Metroid Prime. It's ridiculous and would not be very fun to watch, I think. Maybe someone who is more into the game would not find it boring, though. Some levels require a lot of enemy-killing, and I think those would be fun to watch.
  • This game was ported to the PC as a Doom 2 customization under the name Absolution Doom (or something like that). I haven't tried it, but I hear it's a near flawless recreation, and also has extra levels and enemies that the N64 version doesn't have. Maybe that would be more worth doing than this version? Maybe a version is already done and I just haven't found it yet.
Please share your opinions on the game, its TAS potential, and what kind of goals would be good. Thanks!
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Saturn wrote:
it's just a obvious case that this route is more entertaining for reasons stated before. Nobody who knows SM well enough can deny that.
I find real-time route more entertaining than the in-game route, though I can watch both without being bored. I guess I don't know SM well enough, right? Your language that "promotes" this in-game timer bullshit is slanted as hell; I can go the other way just as easily. Why watch a run that extends the length of play and increases the number and duration of completely actionless sequences just to make a number at the end of the game read differently? It's obviously inferior and makes no sense. Pretty easy, eh? Also, justifying it by saying you shouldn't pay attention to the boring parts is dumb as hell. Every run would kick ass if we just skipped all that parts that didn't. Of course, by your definition of "perfect", I'm not too surprised at your idiocy when defining things. You are such a unique flavor of stupid. So, get your bitchfest in now, while you still have false hope of giving this one game a special timing rule. At least cpadolf sees the big picture.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Comicalflop: It's Saturn. Nothing to do here, unfortunately (PM failed as well). Just get used to that.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
There are a couple isolated bugs with FCM pasting that I haven't been able to fix yet. One happens if the input movie frame range starts at 0. This causes "Bad record number" error and crash. The other happened to me when using QuickHex on parts of SMB3. I don't know the specific circumstances but it was related to pasting very far into a movie, so the bug probably won't show up unless your movie is larger than 65535 frames, and even then it's spotty. This also caused a crash. I'll try to investigate these at some point, but it's not a huge priority to me right now, so... yeah.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Made a long-overdue update, sorry about the delay. Added VBA v19 source (thanks Gocha!) Added newer versions of SNES9x. (edit: including 1.43 v11 beta20 for Linux, thanks Maximus!) Added Lua scripting. Added an "encoding" page which has helpful utilities for encoding based on adelikat's recommendation and guide that he's writing. mudlord: Another mirror can't hurt :) I'm not too familiar with setting them up so if you're interested, PM me and we can discuss it. Thanks! primorial#soup, I decided not to add that emulator. My reasoning is that I'm trying to keep this page in a scope of a replacement to EmulatorResources>Homepages until TASvideos finds a way to host its own emulators and such, so I'm trying to keep content focused on downloads that are used here. Otherwise, there's a lot more stuff I could include. Thanks for the suggestion though :) Lastly, I can't edit the first post here anymore since it was stickied, but all of the bulleted list can be removed from it, so if someone else can, woot.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
There have been a few submissions with the (J) version of this game, Cameltry. The first used this same glitch, and it was mostly agreed in that thread as making the run boring to watch. The second and third played normally, but neither was published. I think the game would make an interesting TAS.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
I'm not worried about the votes. Either: 1) Someone didn't like the movie. I can't expect them to vote yes. Maybe they didn't post because sometimes, people get hated on, even when posting their reason. 2) Incorrect click. 3) It was someone like laughing_gas, and it's common knowledge that he doesn't know shit about fuck. Hell, look at some of his ratings. Actually, speaking of that, isn't he banned from voting? He should be banned from rating, too. But I digress. Thank you for your comments, everyone!
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
I agree with Aqfaq 100% here. And I definitely don't think that the current wording is "clear" in the example Aqfaq and Brushy have discussed.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Nope. (Hopefully an FCM will stop people from asking this)
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
It happened with one of the previous encodes. There is a certain sound processor setting that, when enabled, changes Sonic's jump noise to weirdness. I can't remember which one it is, something like Realistic PZC? PSG High Quality.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Spider-Waffle wrote:
Seems like lots of people are working on this game, why isn't anyone finding go through walls shortcuts?
Probably because this isn't NES Metroid. Same reason that no one is finding shortcuts that bankrupt the computer players quickly; because this isn't NES Monopoly. Hey guys, why haven't you tried delaying your steps to get enemies to not attack? It worked in NES Dragon Warrior. Be sure to credit me in the submission text.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Comicalflop wrote:
The Warpless run Tompa has been arguing has a missed trick that means it's not optimal, and should be redone. he was promptly ignored, and it was published. I also did not watch it before it got published. I would possibly vote no on it for that missed trick, but too late now eh?
I can't find where he mentioned his concern anywhere on the warpless submission.. (until just now as I'm writing this post (which he has edited away into nothing)) Let me explain how that discussion has progressed, because it's not what Tompa has implied: Tompa had shown us that you can go down the right side of a pipe one block too far on the right. Then he told us "not to miss his trick". Through all our testing (and regardless of what Tompa tells you, we did test it quite a bit), we were never able to do this trick on the left side of any pipe, or while going up a pipe. So, at least, we didn't ignore his idea, I'm happy he shared it with us, and we did try to use it. But we couldn't make it work to our advantage, and as far as I know, neither has he, which makes his persistence of us using it all the more frustrating to me. If I'm wrong on anything, please let me know. -- Another thing worth mentioning is that for levels that applied, we (usually adelikat, heh) set the speed very high to see what the next frame we coudl finish the level on was while still keeping good hammer brother movement. If this was far out of reach, there's no need to look for every little pixel boost in the level, and instead we concentrated on doing entertaining-looking things instead.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Boy that Super Metroid run JXQ did a year ago sure does suck, right? Missed frames everywhere, all these easy™ strategies ignored, maybe even on purpose(!), a far cry from perfection no doubt. I guess this is the price I pay for not restarting my run every time someone else figures out a new trick. Personally, I hope you improve the hell out of my run. I know I'm never getting to it; I'm sick of this game and I'm sick of the community around it. Try to enjoy the attention it will bring; I sure didn't.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Comicalflop wrote:
I have a blessed free week of TASing coming up that I would rather dedicate to MM, but you never know what I will find if I go snooping into this run.
Comicalflop's right, it is funny! :D LOL That picture is awesome! (<-- whip)
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Cpadolf, I've seen your skill progress and it's very impressive. Of course, without my perfect demos to study from, you would not be same fast, but it's ok to copy my work, it's what TASing is! Respect! (Just wanted to clear up confusion.)
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
Saturn wrote:
Indeed. It's hard to believe there were no possibilities to get them even with using the scroll glitches. At least on the first look it seems that by better analyzing and planning of the multiple rocket jumps during the autoscroller, it should be possible. Sorry if I'm wrong though.
The reason it is not possible is because Mario's P-meter will be instantly killed off if he is in the air for too long (256 frames). The memory address for this is 056E. For example, the best we were able to get on 8-Tank2 before losing P-meter was 2000 points (the 6th consecutive stomp). We also discussed it as a group, and since 8-Tank was left intact (which we felt was the most impressive autoscroller in the run), we didn't feel it detracted from the overall movie. I personally don't care about the number of lives in the corner, but there is the alternate movie (which is now in the movie's description) for those who really like seeing "99" by the life counter. Geez I've posted a lot today.. :(
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
JXQ
Experienced Forum User, Published Author, Experienced player (750)
Joined: 5/6/2005
Posts: 3132
I liked this a lot! Pretty interesting glitch near the end, you are good at finding some obscure stuff :) The ending text is pretty rychest as well, especially this out-of-context line: Now, allow us to present our staff to you...
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)