Dark Bit Factory & Gravity

PROGRAMMING => Freebasic => Topic started by: Shockwave on March 03, 2007

Title: Really cute typer.
Post by: Shockwave on March 03, 2007
This has to be the cutest text writer I have ever made... I was talking with Alpha One earlier and we were chatting about cracktros and I got thinking that the ones that I liked the most were the ones that used some different way of getting the text on the screen.

Then I remembered a really cute one by Fairlight which just had some nice sine dots and a cute reggae style tune and I decided I wanted to make a writer which had the same colours through the letters as those sine dots.

Plus I wanted the letters to look as cute as they could, so here's what I came up with in a few hours.
You might find this in a production somewhere when I've finished it if you know where to look. :)

Exe attached for forum members.

Code: [Select]
'
'                  POST MORTEM CRACKTRO NUMBER 2 BY SHOCKWAVE
'                THIS ONE DEFINATELY HAS A STRONG OLDSCHOOL FEEL!!
'                =================================================
'
'===============================================================================
'       REMOVE COMMENT ON LINE BELOW FOR WINDOWED MODE

 '       #DEFINE PTC_WIN
        #INCLUDE "TINYPTC.BI"

'       ALL VARIABLES MUST BE DECLARED.
'       -------------------------------

        OPTION STATIC
        OPTION EXPLICIT
       
'       SCREEN DIMENSIONS.
'       ------------------

        CONST   XRES = 640:'    WIDTH
        CONST   YRES = 480:'    HEIGHT

'-------------------------------------------------------------------------------
'       THESE SUBS ARE CUSTOM BUILT GFX SUBS (c) SHOCKWAVE, REMOVE SURPLUS ONES WHEN INTRO FINISHED.
'-------------------------------------------------------------------------------

        DECLARE SUB TRIANGLE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TR AS INTEGER,BYVAL TG AS INTEGER,BYVAL TB AS INTEGER)
        DECLARE SUB CIRC(BYVAL CX AS INTEGER , BYVAL CY AS INTEGER , BYVAL R AS INTEGER, BYVAL CR AS INTEGER,BYVAL CG AS INTEGER,BYVAL CB AS INTEGER)
        DECLARE SUB RECT(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL XW AS INTEGER , BYVAL YH AS INTEGER , BYVAL RR AS INTEGER , BYVAL RG AS INTEGER, BYVAL RB AS INTEGER)
        DECLARE SUB EDGE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL LR AS INTEGER, BYVAL LG AS INTEGER, BYVAL LB AS INTEGER)
        DECLARE SUB DOT (BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL DR AS INTEGER , BYVAL DG AS INTEGER , BYVAL DB AS INTEGER )
        DECLARE SUB TEXT(BYVAL BX AS INTEGER , BYVAL BY AS INTEGER , BYVAL WW AS STRING , BYVAL WR AS INTEGER, BYVAL WG AS INTEGER, BYVAL WB AS INTEGER)
        DECLARE SUB CURVE(BYVAL X0 AS INTEGER ,BYVAL Y0 AS INTEGER, BYVAL X3 AS INTEGER ,BYVAL Y3 AS INTEGER ,BYVAL X1 AS INTEGER ,BYVAL Y1 AS INTEGER ,BYVAL X2 AS INTEGER ,BYVAL Y2 AS INTEGER , BYVAL RR AS INTEGER , BYVAL RG AS INTEGER, BYVAL RB AS INTEGER)
        DECLARE SUB READFONT()
               
'-------------------------------------------------------------------------------
'       VARIABLES NEEDED FOR THE INTRO;
'-------------------------------------------------------------------------------
'       "FLOATING TEXT" ROUTINE VARIABLES;
'-------------------------------------------------------------------------------

        DIM SHARED LHORIZ = 40: ' WIDTH OF TEXT PAGES.
        DIM SHARED LVERT  = 10 :' HEIGHT OF TEXT PAGES.
       
'-------------------------------------------------------------------------------       
'       SINGLE DIMENSION ARRAYS USED TO MAKE IT EASIER TO PUT LETTERS ON LATER.
'-------------------------------------------------------------------------------

        DIM SHARED AS DOUBLE LXT( LHORIZ * LVERT ):' TARGET X LOCATION FOR LETTER.
        DIM SHARED AS DOUBLE LYT( LHORIZ * LVERT ):' TARGET Y LOCATION FOR LETTER.
       
        DIM SHARED AS DOUBLE LXA( LHORIZ * LVERT ):' ACTUAL X LOCATION FOR LETTER.
        DIM SHARED AS DOUBLE LYA( LHORIZ * LVERT ):' ACTUAL Y LOCATION FOR LETTER.
       
        DIM SHARED AS DOUBLE YSPD( LHORIZ * LVERT )
        DIM SHARED AS DOUBLE XSPD( LHORIZ * LVERT )
       
        DIM SHARED AS UBYTE  LYO( LHORIZ * LVERT ):' IS LETTER ACTIVE? ON=1 OFF=0       
        DIM SHARED AS STRING LYC( LHORIZ * LVERT ):' STORES THE LETTER.
        DIM SHARED AS UINTEGER  LLM:               ' HOW MANY LETTERS ARE ON SCREEN ATM?
        DIM SHARED AS UINTEGER  LTM:               ' TIMER (IN FRAMES) FOR NEXT LETTER.
        LLM=0
        LTM=0
        DIM SHARED AS UBYTE CHECK_PLACEMENT=0
        DIM SHARED TPP AS INTEGER
        TPP=0
        DIM SHARED TXT AS STRING
        DIM SHARED AS DOUBLE HOLD_TIME
'-------------------------------------------------------------------------------
'            IMPORTANT!!!!! PLEASE MAKE SURE THAT YOU
'             USE 40 CHARACTERS PER LINE!!!!!!!!!!!!
'             YOU >>MUST<< FILL WITH SPACES TO MAKE
'             SURE EACH LINE IS 40 CHARS WIDE......
'            ALSO THERE ARE 10 LINES OF TEXT PER PAGE.
'           DO NOT USE LESS OR MORE. THESE TEXT STRINGS
'           HAVE TO BE KEPT THE SAME SIZE!!!!!!!!!!!!!!
'                   OTHERWISE IT WILL FUCK UP.
'          I HAVE PUT THE SPACERS "|" AS A GUIDE FOR YOU
'       LINE THEM UP WITH THE QUOTES AND YOU WON'T GO WRONG.
'-------------------------------------------------------------------------------
'         |PAGE 1:                                 |
TXT = TXT+"        OLDSCHOOL TYPER ROUTINE!        "
TXT = TXT+"        ========================        "
TXT = TXT+"                                        "
TXT = TXT+"       WITH  ADDED DUTCH COLOURS!       "
TXT = TXT+"    SPECIALLY DESIGNED FOR HANGOVERS    "
TXT = TXT+"                                        "
TXT = TXT+"    --------------------------------    "
TXT = TXT+"    - THIS PIECE OF SHIT WAS CODED -    "
TXT = TXT+"    -  BY SHOCKWAVE ON A SATURDAY  -    "
TXT = TXT+"    --------------------------------    "

'         |PAGE 2:                                 |
TXT = TXT+"    --------------------------------    "
TXT = TXT+"    - THIS ROUTINE WILL BE USED IN -    "
TXT = TXT+"    -  A  PRODUCTION FOR A GERMAN  -    "
TXT = TXT+"    - GROUP  BUT I THOUGHT I WOULD -    "
TXT = TXT+"    -  RELEASE THE SOURCE FIRST!!  -    "
TXT = TXT+"    --------------------------------    "
TXT = TXT+"                                        "
TXT = TXT+"   AREN'T I KIND? TO A FAULT INDEED..   "
TXT = TXT+"     NO MORE WORDS COME TO MY MIND      "
TXT = TXT+"   SO GREETINGS TO YOU AND LETS WRAP!   "




'-------------------------------------------------------------------------------
'       EFFECT SUBS DEFINITIONS;
'-------------------------------------------------------------------------------
'       TEXT WRITER;
'-------------------------------------------------------------------------------
        DECLARE SUB PRELOADGRID():' SET UP GRID POSITIONS FOR THE LETTERS.
        DECLARE SUB RESETWRITER():' NEW TEXT PAGE FOR WRITER.
        DECLARE SUB HYPERTEXTER():' THIS SUB DOES THE TEXT WRITER.
       
'-------------------------------------------------------------------------------       
'       OPEN THE SCREEN
'-------------------------------------------------------------------------------       

        DIM SHARED AS UINTEGER BUFFER ( XRES * YRES )       
        DIM SHARED FONT (64 * 64) as Uinteger : ' FONT BUFFER
        DIM SHARED AS DOUBLE GADD,GADD4,GADD3,GADD2
       
       
        READFONT()
        PRELOADGRID()
        RESETWRITER()
       
        If( PTC_OPEN( "FREEBASIC GRAPHICS SCREEN", XRES, YRES ) = 0 ) Then
        End -1
        End If

'-------------------------------------------------------------------------------       
'       THE MAIN LOOP;
'-------------------------------------------------------------------------------       
'DIM SHARED S AS INTEGER
        while (1)
            HYPERTEXTER()
            PTC_UPDATE @ BUFFER (0)
            ERASE BUFFER
            GADD=GADD+1
            GADD4=GADD4+.05
            GADD3=GADD3+.1
            GADD2=GADD2+.025
        wend


'-------------------------------------------------------------------------------
' THE NICE WRITER;
'-------------------------------------------------------------------------------
SUB HYPERTEXTER()
    DIM AS INTEGER A,CF
    DIM AS DOUBLE FX,FY
    DIM AS DOUBLE XDV
    DIM AS DOUBLE YDV
    XDV=37
    YDV=45

    '---------------------------------------------------------------------------
    ' DRAW THE ACTIVE LETTERS ON THE SCREEN;
    '---------------------------------------------------------------------------
   
    FOR A=0 TO LLM
        IF INT(LXA(A))>-8 AND INT(LXA(A))<XRES AND INT(LYA(A))>-8 AND INT(LYA(A))<YRES THEN
            TEXT(INT(LXA(A)),INT(LYA(A)),LYC(A),150+100*SIN((A+GADD4)),150+100*SIN((A+GADD3)),150+100*SIN((A+GADD2)))
        END IF
    NEXT

    '---------------------------------------------------------------------------
    ' IF ALL LETTERS ARE NOT IN PLACE THEN WE NEED TO DO THE WRITER;
    '---------------------------------------------------------------------------
   
    IF CHECK_PLACEMENT=0 THEN
    '---------------------------------------------------------------------------
    ' THIS "FLOATING" POINT IS THE ORIGIN WHERE NEW LETTERS APPEAR FROM.
    '---------------------------------------------------------------------------
    FX = XRES/2 + (70*SIN(GADD/ 7)+70*COS(GADD/9)+120*SIN(GADD/6))
    FY = YRES/2 + (70*SIN(GADD/ 6)+70*COS(GADD/11)+80*SIN(GADD /4))

    IF LLM < (LHORIZ * LVERT) THEN
        LLM = LLM + 1
       
        LXA(LLM) = FX
        LYA(LLM) = FY
        LYO(LLM) = 1
        END IF
   
    FOR A=0 TO LLM
       
        IF LXA(A)<>LXT(A) THEN
            LXA(A)=LXA(A)+((LXT(A)-LXA(A))/XDV)
        END IF
        IF LYA(A)<>LYT(A) THEN
            LYA(A)=LYA(A)+((LYT(A)-LYA(A))/YDV)
        END IF
        IF LXA(A)-LXT(A) >-.5 AND LXA(A)-LXT(A) <.5 THEN LXA(A)=LXT(A)
        IF LYA(A)-LYT(A) >-.5 AND LYA(A)-LYT(A) <.5 THEN LYA(A)=LYT(A)
    NEXT
   
    END IF

    '---------------------------------------------------------------------------
    ' CHECK IF ALL LETTERS ARE IN PLACE;
    '---------------------------------------------------------------------------
   
    IF LLM>= ( LHORIZ * LVERT ) AND CHECK_PLACEMENT=0 THEN
    CF=1
    FOR A = 1 TO LLM
        IF LXA(A)<> LXT(A) OR LYA(A)<>LYT(A) THEN CF=0
    NEXT

    '---------------------------------------------------------------------------
    ' IF ALL LETTERS ARE IN PLACE BEGIN 8 SECOND COUNTDOWN
    '---------------------------------------------------------------------------

    IF CF=1 THEN
        CHECK_PLACEMENT=1
        HOLD_TIME = TIMER
    END IF
   
    END IF

    '---------------------------------------------------------------------------
    ' IF ALL LETTERS ARE IN PLACE AND THE COUNTDOWN HAS PASSED 5 SECS WE NEED TO
    ' START GETTING RID OF THE LETTERS
    '---------------------------------------------------------------------------
    IF CHECK_PLACEMENT=1 AND TIMER-HOLD_TIME >=5.5 AND TIMER-HOLD_TIME <=6 THEN
        FOR A=0 TO LLM
            LYA(A)=LYA(A)+ (RND(1)-.5)
            LXA(A)=LXA(A)+ (RND(1)-.5)
            'IF YSPD(A)<12 THEN YSPD(A)=YSPD(A)+.2
        NEXT
    END IF
   
    '---------------------------------------------------------------------------
    ' IF ALL LETTERS ARE IN PLACE AND THE COUNTDOWN HAS PASSED 5 SECS WE NEED TO
    ' START GETTING RID OF THE LETTERS
    '---------------------------------------------------------------------------
    IF CHECK_PLACEMENT=1 AND TIMER-HOLD_TIME >=6 THEN
        FOR A=0 TO LLM
            LYA(A)=LYA(A)+YSPD(A)
            LXA(A)=LXA(A)+XSPD(A)
            IF YSPD(A)<12 THEN YSPD(A)=YSPD(A)+.2
        NEXT
    END IF

    '---------------------------------------------------------------------------
    ' GO TO NEXT PAGE IF COUNTDOWN>8 SECS AND LETTERS WERE IN PLACE.
    '---------------------------------------------------------------------------

    IF CHECK_PLACEMENT=1 AND TIMER-HOLD_TIME >=8 THEN
        TPP=TPP+(LHORIZ*LVERT)
        IF TPP>LEN(TXT)-(LHORIZ*LVERT) THEN TPP=0
        RESETWRITER()
    END IF
   
END SUB


'-------------------------------------------------------------------------------
' CLEAR OUT OLD TEXT AND SET UP NEW PAGE IN TEXT WRITER.
'-------------------------------------------------------------------------------
SUB RESETWRITER()
    DIM AS INTEGER A,PS,T
    '---------------------------------------------------------------------------
    ' BOING DETERMINES WHETHER WE GO BACKWARDS OR FORWARDS THRU THE STRING
    ' AS LETTES IN ALTERNATE LINES HAVE TO BE REVERSED DUE TO THE ORDER WE
    ' ACTIVATE THEM!
    '---------------------------------------------------------------------------
    DIM AS INTEGER BOING
    BOING=0
    PS=1+TPP
    LLM=0
    FOR A=1 TO ( LHORIZ * LVERT )
        '-----------------------------------------------------------------------
        ' SET UP SOME SPEEDS FOR EXPLOSION WHEN TEXT SCREEN CHANGES
        '-----------------------------------------------------------------------
        YSPD(A)= (RND(1)*7)-6
        XSPD(A)= (RND(1)*5)-2.5
        '-----------------------------------------------------------------------
        ' TURN OFF THIS LETTER AND GET NEW CHARACTER
        '-----------------------------------------------------------------------
        LYO(A) = 0
        LYC(A) = MID(TXT,PS,1)
        '-----------------------------------------------------------------------
        ' CYCLE THROUGH STRING FORWARDS OR BACKWARDS
        '-----------------------------------------------------------------------
        IF BOING=0 THEN PS=PS+1
        IF BOING=1 THEN PS=PS-1
        '-----------------------------------------------------------------------
        ' WHEN WE HAVE CALCULATED ONE LINE, REVERSE DIRECTION.
        '-----------------------------------------------------------------------
        T=T+1
        IF T>=LHORIZ THEN
            T=0
            BOING=BOING+1
            IF BOING>1 THEN BOING=0
        IF BOING=0 THEN PS=PS+(LHORIZ+1)
        IF BOING=1 THEN PS=PS+(LHORIZ-1)
        END IF
    NEXT
    '---------------------------------------------------------------------------
    ' LETTERS ARE NOW OUT OF PLACE, SO RESET THIS FLAG.
    '---------------------------------------------------------------------------
    CHECK_PLACEMENT=0
END SUB

'-------------------------------------------------------------------------------
' SET UP GRID TARGETS FOR LETTERS IN TYPER..
'-------------------------------------------------------------------------------
SUB PRELOADGRID()   
   
    DIM AS INTEGER TOP,LFT,A,T
    DIM AS INTEGER TRACKX,TRACKY
    DIM AS INTEGER BOING
   
    BOING=0
    TOP=170:' TOP  OF GRID.
    LFT=120:' LEFT OF GRID.

    TRACKY=TOP
    TRACKX=LFT   
   
    FOR A=1 TO ( LHORIZ * LVERT )
       
        LXT(A) = TRACKX
        LYT(A) = TRACKY
       
        IF BOING=0 THEN TRACKX=TRACKX+10
        IF BOING=1 THEN TRACKX=TRACKX-10
        T=T+1
        IF T>=LHORIZ THEN
            T=0
           
            BOING=BOING+1
            IF BOING>1 THEN BOING=0
        IF BOING=0 THEN TRACKX=TRACKX+10
        IF BOING=1 THEN TRACKX=TRACKX-10
           
            TRACKY=TRACKY+10
        END IF
       
    NEXT
   
END SUB


'-------------------------------------------------------------------------------
' CUSTOM GRAPHICS SUBS;
'-------------------------------------------------------------------------------

'
' USAGE, CURVE(SOURCE X,SOURCE Y , DEST X , DEST Y, CONTROL X1 , CONTROL Y1 , CONTROL X2, CONTROL Y2)
'

SUB CURVE(BYVAL X0 AS INTEGER ,BYVAL Y0 AS INTEGER, BYVAL X3 AS INTEGER ,BYVAL Y3 AS INTEGER ,BYVAL X1 AS INTEGER ,BYVAL Y1 AS INTEGER ,BYVAL X2 AS INTEGER ,BYVAL Y2 AS INTEGER , BYVAL RR AS INTEGER , BYVAL RG AS INTEGER, BYVAL RB AS INTEGER)
dim as double T
DIM AS INTEGER L,X,Y,cx,bx,ax,cy,by,ay,CVLU,OX,OY

'CVLU = RGB(RR,RG,RB)
CX = 3*(X1-X0)
BX = 3*(X2-X1)-CX
AX = X3-X0-CX-BX
CY=3*(Y1-Y0)
BY=3*(Y2-Y1)-CY
AY=Y3-Y0-CY-BY
for t = 0 to 1.01 step .01
IF T>0 THEN
    OX=X
    OY=Y
END IF
        x = ax * t ^ 3 + bx * t ^ 2 + cx * t + X0
        y = ay * t ^ 3 + by * t ^ 2 + cy * t + Y0
IF T>0 THEN
    EDGE (X,Y,OX,OY,RR,RG,RB)
END IF

next
END SUB


sub TEXT(BYVAL BX AS INTEGER , BYVAL BY AS INTEGER , BYVAL WW AS STRING , BYVAL WR AS INTEGER , BYVAL WG AS INTEGER , BYVAL WB AS INTEGER)
'
' Usage : TEXT ( X , Y , "YOUR TEXT" , R , G , B )
'
'

WW = UCASE (WW)

dim blx,bly as Uinteger

DIM as INTEGER STRX,STRY,TLP,TC,CH,TC2

    TC =RGB (WR , WG , WB)
   TC2 =RGB (WR SHR 1 , WG  SHR 1, WB SHR 1)
    dim bm,mm
   
    FOR TLP = 0 TO LEN(WW)
    CH = ASC(MID(WW,TLP,1))-31
    IF CH<0 OR CH>64 THEN CH=0
    '---------------------------------
    'Calculate Offset In Font Data;---
    '---------------------------------
    bm=(ch*64)-64
   

    STRY=BY
   
    FOR BLY=0 TO 7   
    STRX=BX + ((TLP-1) * 9)
   
    FOR BLX=1 TO 8
        '--------
        'Clip;---
        '--------                   
            '----------------------------------------------------
            'Draw Pixel In Buffer If Onscreen And If Binary 1 ---
            '----------------------------------------------------
            MM= FONT((((BLY)*8)+(BLX))+BM)                       
                IF (STRX>0) AND (STRX<XRES)  and (STRY>0) AND (STRY<YRES-2)THEN             
                IF MM >0 THEN
                BUFFER (((STRY+1)*XRES)+STRX+1) = TC2
                    BUFFER (((STRY)*XRES)+STRX) = TC
                end if
                END IF 
                STRX=STRX+1
    NEXT
    STRY=STRY+1
    NEXT
    NEXT
END SUB




SUB DOT (BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL DR AS INTEGER , BYVAL DG AS INTEGER , BYVAL DB AS INTEGER )
'-------------------------------------------------------------------------------
' THIS SUB DRAWS A DOT AT X1 , Y1
' USAGE : DOT ( X1 , Y1 , R , G , B)
'
'-------------------------------------------------------------------------------
DIM TC AS INTEGER
TC = RGB (DR , DG , DB)

IF X1>0 AND X1 < XRES AND Y1>0 AND Y1<YRES THEN
        BUFFER ( X1 + (Y1 * XRES)) = TC
END IF


END SUB


SUB EDGE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL LR AS INTEGER, BYVAL LG AS INTEGER, BYVAL LB AS INTEGER)
'-------------------------------------------------------------------------------
'
' THIS LINE ROUTINE IS NOT VERY FAST BUT IT WORKS. THANKS TETRA.
' USAGE:
' EDGE ( X1 , Y1 , X2 , Y2 , R , G , B )
'
'-------------------------------------------------------------------------------
        DIM xdistance AS DOUBLE
        DIM ydistance AS DOUBLE
        DIM TC AS INTEGER       
        DIM i AS INTEGER
        DIM h2 AS INTEGER
       
        DIM StartX AS DOUBLE
        DIM StartY AS DOUBLE
        DIM XRatio AS DOUBLE
        DIM YRatio AS DOUBLE

        TC = RGB ( LR,LG,LB )

        xdistance = X2 - X1
        ydistance = Y2 - Y1

        h2 = sqr( xdistance * xdistance + ydistance * ydistance )
       
        StartX = X1
        StartY = Y1
       
        XRatio = xdistance * ( 1.0 / h2 )
        YRatio = ydistance * ( 1.0 / h2 )
       
        for i = 0 to h2
            IF STARTX>0 AND STARTX<XRES AND STARTY>0 AND STARTY<YRES THEN
            BUFFER ( INT(StartX) + (INT(StartY) * XRES ) ) = TC
            END IF
            StartX = StartX + XRatio
            StartY = StartY + YRatio
        next i
END SUB



SUB RECT(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL XW AS INTEGER , BYVAL YH AS INTEGER , BYVAL RR AS INTEGER , BYVAL RG AS INTEGER, BYVAL RB AS INTEGER)
'-------------------------------------------------------------------------
'
' FILLED RECTANGLE ROUTINE WITH ASSEMBLY LANGUAGE RASTERISING.
' USAGE   RECT ( TOPX , TOPY , WIDTH , HEIGHT , R , G , B )
' THIS ROUTINE HAS BASIC CLIPPING TO SCREEN BOUNDARIES.
'
'-------------------------------------------------------------------------

        DIM PP AS INTEGER PTR
        DIM AS INTEGER SLICE,LP,TC

'-------------------------------------------------------------------------
'       BASIC CLIPPING TO SCREEN;
'-------------------------------------------------------------------------

        IF X1 < 0 THEN
         XW = XW +  X1         
         X1=0
        END IF
       
        IF Y1 < 0 THEN
         YH = YH +  Y1         
         Y1=0
        END IF       
       
        IF XW + X1 > XRES THEN
            XW = XRES - X1
        END IF
       
        IF YH + Y1 > YRES THEN
            YH = (YRES - Y1)
        END IF       
       
IF XW>0 AND YH>0 THEN       
        TC = RGB ( RR , RG , RB )
       
        FOR LP =Y1 TO (YH+Y1)-1
           
            pp=@buffer((XRES*LP)+X1)
            slice = XW
           
            if slice>0 then
                    asm
                    mov eax,dword ptr[TC]
                    mov ecx, [slice]
                    mov edi, [PP]
                    rep stosd
                    end asm   
            end if
           
        NEXT
END IF


END SUB


SUB CIRC(BYVAL CX AS INTEGER , BYVAL CY AS INTEGER , BYVAL R AS INTEGER, BYVAL CR AS INTEGER,BYVAL CG AS INTEGER,BYVAL CB AS INTEGER)

'-------------------------------------------------------------------------
'
' FILLED CIRCLE ROUTINE WITH ASSEMBLY LANGUAGE RASTERISING.
' USAGE  CIRC ( X , Y , RADIUS , R , G , B )
' REMEMBER THAT X + Y ARE THE CENTER OF YOUR CIRCLE.
' THIS HAS BASIC CLIPPING TO SCREEN BOUNDARIES.
'
'-------------------------------------------------------------------------

DIM  as integer r2,cc,loopy,ww,l,clipl , clipr,slice,tc
dim pp as integer ptr
r2=r*r
cc=-r
TC = RGB ( CR , CG , CB )
for loopy = cc to r     
        ww = Sqr(r2-loopy*loopy)

        if loopy+cy>=0 and loopy+cy<yres then
            clipl = cx-ww
            clipr = (cx+ww)-1
            if clipl<0 then clipl=0
            if clipr>xres-1 then clipr = xres-1
            pp=@buffer((XRES*(loopy+CY))+clipl)
            slice = clipr-clipl
           
            if slice>0 then
                    asm
                    mov eax,dword ptr[TC]
                    mov ecx, [slice]
                    mov edi, [PP]
                    rep stosd
                    end asm   
            end if
           

   
        end if

next
END SUB



SUB TRIANGLE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TR AS INTEGER,BYVAL TG AS INTEGER,BYVAL TB AS INTEGER)
'-------------------------------------------------------------------------
' FLAT TRIANGLE RENDERER WITH ASSEMBLY LANGUAGE RASTERISING BY SHOCKWAVE ^ DBF ^ S!P 2006.
'
' USAGE : TRIANGLE ( X1 , Y1 , X2 , Y2 , X3 , Y3 , R , G , B )
' CLIPS TO SCREEN BOUNDARIES.
'
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
' WE NEED TO SORT THESE POINTS INTO ORDER FROM TOP TO BOTTOM, AN EXCHANGE SORT IS OK.
' AS WE ONLY HAVE GOT 3 POINTS TO ARRANGE.
'-------------------------------------------------------------------------
DIM AS INTEGER TEMPX,TEMPY,LO,LI,TC
                DIM AS INTEGER PX(3)
                DIM AS INTEGER PY(3)
                DIM TFLAG AS INTEGER
                dim pp as uinteger PTR
                DIM AS INTEGER IL1,IL2,SLICE
                TFLAG=0
                TC = RGB ( TR , TG , TB )
        PX(1)= X1
        PX(2)= X2
        PX(3)= X3
       
        PY(1)= Y1
        PY(2)= Y2
        PY(3)= Y3

FOR LO = 1 TO 2
    FOR LI =1 TO 2     
        IF PY(LI+1) <= PY(LI) THEN
        TEMPX = PX(LI) : TEMPY = PY(LI)
        PX(LI) = PX(LI+1)
        PY(LI) = PY(LI+1)
        PX(LI+1) = TEMPX
        PY(LI+1) = TEMPY
        END IF   
    NEXT LI
NEXT LO

'   BOOT OUT INVISIBLE TRIANGLES!

    IF PX(1)<0 AND PX(2)<0  AND PX(3)< 0 THEN TFLAG=1
    IF PX(1)>XRES AND PX(2)>XRES  AND PX(3)>XRES THEN TFLAG=1
    IF PY(1)>YRES AND PY(2)>YRES  AND PY(3)>YRES THEN TFLAG=1
   
        DIM AS DOUBLE XP1,XP2:' SCREEN POSITIONS.
        DIM AS DOUBLE XI1,XI2:' INTERPOLATIONS.
       
'***
'*** REGULAR TRIANGLE (Y1<Y2 Y2<Y3)
'***

IF PY(1)<PY(2) AND PY(2)<PY(3) or (PY(2) = PY(3)) THEN
    TFLAG=1
XP1 = PX(1)
XP2 = PX(1)
XI1 = (PX(1)-PX(2)) / (PY(2) - PY(1))
XI2 = (PX(1)-PX(3)) / (PY(3) - PY(1))

FOR LO = PY(1) TO PY(2)-1
   
IF LO>=0 AND LO<YRES THEN

    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF
   
    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0

    SLICE = IL2-IL1

IF SLICE>0 THEN
   

     

   
    PP = @BUFFER(IL1+(LO*XRES))   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
   

END IF

XP1=XP1-XI1
XP2=XP2-XI2
NEXT

XI1 = (PX(2)-PX(3)) / (PY(3) - PY(2))
XP1 = PX(2)

FOR LO = PY(2) TO PY(3)
IF LO>=0 AND LO<YRES THEN
    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF

    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0

    SLICE = IL2-IL1
    IF SLICE>0 THEN
 
       

    PP = @BUFFER(IL1+(LO*XRES))   
   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
END IF
XP1=XP1-XI1
XP2=XP2-XI2
NEXT

END IF


'***
'*** FLAT TOPPED TRIANGLE Y1=Y2
'***

IF TFLAG=0 AND PY(1) = PY(2) THEN
   
        TFLAG=1
        XP1 = PX(1)
        XP2 = PX(2)
        XI1 = (PX(1)-PX(3)) / (PY(3) - PY(1))
        XI2 = (PX(2)-PX(3)) / (PY(3) - PY(2))
FOR LO = PY(1) TO PY(3)
 IF LO>=0 AND LO<YRES THEN
    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF
   
    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0
   
    SLICE = IL2-IL1
    IF SLICE>0 THEN



    PP = @BUFFER(IL1+(LO*XRES))   
   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
END IF
    XP1=XP1-XI1
    XP2=XP2-XI2

NEXT
END IF
END SUB

SUB READFONT()
        dim lp
        FOR LP=1 TO (64*64)
                READ FONT(LP)
        NEXT
       
END SUB



'space
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0

'!
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0

' "
data 0,1,1,1,0,1,1,1
data 0,1,1,1,0,1,1,1
data 0,1,1,1,0,1,1,1
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0

' #

data 0,0,0,0,0,0,0,0
data 0,1,1,1,0,1,1,0
data 1,1,1,1,1,1,1,1
data 0,1,1,1,0,1,1,0
data 0,1,1,1,0,1,1,0
data 1,1,1,1,1,1,1,1
data 0,1,1,1,0,1,1,0
data 0,0,0,0,0,0,0,0

' $ = £
data 0,0,1,1,1,1,1,0
data 0,1,1,1,0,1,1,1
data 1,1,1,1,1,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 1,1,1,1,1,1,1,1

' %
data 0,0,0,0,0,0,0,0
data 0,1,1,0,0,1,1,1
data 0,1,1,0,1,1,1,0
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,0,0,0
data 0,1,1,1,0,1,1,0
data 1,1,1,0,0,1,1,0
data 0,0,0,0,0,0,0,0
' & = O
data 0,0,0,1,1,0,0,0
data 0,1,1,1,1,1,1,0
data 0,1,1,1,1,1,1,0
data 1,1,1,1,1,1,1,1
data 1,1,1,1,1,1,1,1
data 0,1,1,1,1,1,1,0
data 0,1,1,1,1,1,1,0
data 0,0,0,1,1,0,0,0
' '
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0

' (
data 0,0,1,1,1,1,0,0
data 0,1,1,1,1,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,1,0,0,0
data 0,0,1,1,1,1,0,0
' )
data 0,0,1,1,1,1,0,0
data 0,0,0,1,1,1,1,0
data 0,0,0,0,1,1,1,0
data 0,0,0,0,1,1,1,0
data 0,0,0,0,1,1,1,0
data 0,0,0,0,1,1,1,0
data 0,0,0,1,1,1,1,0
data 0,0,1,1,1,1,0,0

' *
data 0,0,0,0,0,0,0,0
data 0,1,0,1,1,0,1,0
data 0,0,1,1,1,1,0,0
data 0,1,1,1,1,1,1,0
data 0,1,1,1,1,1,1,0
data 0,0,1,1,1,1,0,0
data 0,1,0,1,1,0,1,0
data 0,0,0,0,0,0,0,0

' +
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,0,0,0
data 0,0,0,1,1,0,0,0
data 0,1,1,1,1,1,1,0
data 0,1,1,1,1,1,1,0
data 0,0,0,1,1,0,0,0
data 0,0,0,1,1,0,0,0
data 0,0,0,0,0,0,0,0
' ,
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,1,0,0

' -
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,1,1,1,1,1,1,0
data 0,1,1,1,1,1,1,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
' .
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,0,0,0
data 0,0,0,1,1,0,0,0
' /
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,1,1,1
data 0,0,0,0,1,1,1,0
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,0,0,0
data 0,1,1,1,0,0,0,0
data 1,1,1,0,0,0,0,0
data 0,0,0,0,0,0,0,0

'0
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,0,1,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'1
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,1,0,0
data 0,0,1,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,1,1,0
'2
data 0,0,1,1,1,1,1,0
data 0,1,1,1,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,1,1
data 1,1,1,1,1,1,1,1
'3
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 0,0,0,0,1,1,1,0
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'4
data 1,1,1,0,1,1,1,0
data 1,1,1,0,1,1,1,0
data 0,1,1,1,1,1,1,1
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
'5
data 1,1,1,1,1,1,1,0
data 1,1,1,0,1,1,1,0
data 1,1,1,0,0,0,0,0
data 0,1,1,1,1,1,1,0
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'6
data 1,1,0,0,0,0,0,0
data 1,1,0,0,0,0,0,0
data 1,1,0,0,0,0,0,0
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'7
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 0,0,0,0,1,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
'8
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'9
data 0,1,1,1,1,1,1,1
data 1,1,0,0,0,1,1,1
data 0,1,1,1,1,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1

' :
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,1,0,0

' ;
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0

' <
data 0,0,0,0,0,0,0,0
data 0,0,1,1,1,0,0,0
data 0,1,1,1,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,0,0,0,0,0,0

' =
data 0,0,0,0,0,0,0,0
data 0,0,1,1,1,1,0,0
data 0,0,1,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,1,1,1,1,0,0
data 0,0,1,1,1,1,0,0
data 0,0,0,0,0,0,0,0

' >
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,1,1,1,0
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,1,1,1,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0

' ?
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 0,0,0,1,1,1,1,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0

' @
data 0,0,0,0,0,0,0,0
data 0,0,1,1,1,1,0,0
data 0,1,1,0,0,1,1,0
data 0,1,0,1,1,0,1,0
data 0,1,0,0,0,0,1,0
data 0,1,0,1,1,0,1,0
data 0,0,1,1,1,1,0,0
data 0,0,0,0,0,0,0,0

'[]\^_?@

'A
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
'B
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0
'C
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'D
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0
'E
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'F
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0

'G
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,1,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0

'H
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1

'I
data 0,1,1,1,1,1,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,1,1,1,1,1,0,0
'J
data 0,1,1,1,1,1,1,1
data 1,1,1,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'K
data 1,1,1,0,1,1,1,0
data 1,1,1,0,1,1,1,0
data 1,1,1,1,1,1,0,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
'L

data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0

'M

data 0,1,1,0,1,1,1,0
data 1,1,1,1,1,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1

'N

data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1

'O
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'P

data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0

'Q
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,1,0,1,1
data 1,1,1,0,1,1,0,1
data 1,1,1,0,0,1,1,0
data 0,1,1,1,1,1,1,0


'R

data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
'S

data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,0,0,0
data 0,1,1,1,1,1,1,0
data 0,0,0,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0

'T
data 1,1,1,1,1,1,1,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
'U
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0

'V

data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,0,0,1,1,0
data 0,0,1,1,1,1,0,0

'W
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,1,0,1,1,1
data 0,1,1,1,1,1,1,0

'X
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1

'Y
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0

'Z
data 0,1,1,1,1,1,1,1
data 1,1,1,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0

'[
data 1,1,1,1,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,1,0,0,0,0
'\
data 1,1,0,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,1,1,1,0
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,0,1,1
']
data 0,0,0,0,1,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,1,1,1,1
'^
data 0,0,0,1,1,0,0,0
data 0,0,1,1,1,1,0,0
data 0,1,1,0,0,1,1,0
data 1,1,1,0,0,1,1,1
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0

'_
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,1,1,1,1,1,1,0
Title: Re: Really cute typer.
Post by: zawran on March 03, 2007
Nice writer with some smooth movements.
Title: Re: Really cute typer.
Post by: slinks on March 03, 2007
Very nice effect Shockie, though I'd recomend extending the middle line on the 'E', as it looks too similar to a 'C' at the moment. I think so anyway. Love the way it explodes at the end of each paragraph! How long till this new production comes out?
Title: Re: Really cute typer.
Post by: Shockwave on March 03, 2007
Thanks for the feedback. I will change that letter "e".

As for when it comes out, that is a bit of a strange one.. You see I can't really advertise it on my own site! Strange? Well not really, it is going to be for a "release group". If you go to intro-inferno and search for the groups "rituel" and "postmortem" you will find some of my secret work.

I want to point out that I do not have a single piece of pirated software, I even registered my copy of winzip..
On the Amiga I would strip the crack intros off of games, delete the games and keep the intros, hence the fact that I uploaded my entire collection of amiga cracktros to Intro-Inferno.

I love the cracktro as a pure art form and these days it is one of the only ways to get an oldschool product accepted into the mainstream. I apologise in advance if this offends any of you and of course, I will be happy to remove this post if it does. (just PM me).

Cracktro (http://www.pouet.net/prod.php?which=29984) <- Oldschool baby!
Title: Re: Really cute typer.
Post by: Emil_halim on March 03, 2007

as usual , nice effect from nice programmer , well done shocky. :)
Title: Re: Really cute typer.
Post by: Shockwave on March 03, 2007
Thanks Emil :)
I added some more shit to this :)


Code: [Select]
'
'                  POST MORTEM CRACKTRO NUMBER 2 BY SHOCKWAVE
'                THIS ONE DEFINATELY HAS A STRONG OLDSCHOOL FEEL!!
'                =================================================
'
'===============================================================================
'       REMOVE COMMENT ON LINE BELOW FOR WINDOWED MODE

'        #DEFINE PTC_WIN
        #INCLUDE "TINYPTC.BI"

'       ALL VARIABLES MUST BE DECLARED.
'       -------------------------------

        OPTION STATIC
        OPTION EXPLICIT
       
'       SCREEN DIMENSIONS.
'       ------------------

        CONST   XRES = 640:'    WIDTH
        CONST   YRES = 480:'    HEIGHT

'-------------------------------------------------------------------------------
'       THESE SUBS ARE CUSTOM BUILT GFX SUBS (c) SHOCKWAVE, REMOVE SURPLUS ONES WHEN INTRO FINISHED.
'-------------------------------------------------------------------------------

        DECLARE SUB TRIANGLE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TR AS INTEGER,BYVAL TG AS INTEGER,BYVAL TB AS INTEGER)
        DECLARE SUB CIRC(BYVAL CX AS INTEGER , BYVAL CY AS INTEGER , BYVAL R AS INTEGER, BYVAL CR AS INTEGER,BYVAL CG AS INTEGER,BYVAL CB AS INTEGER)
        DECLARE SUB RECT(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL XW AS INTEGER , BYVAL YH AS INTEGER , BYVAL RR AS INTEGER , BYVAL RG AS INTEGER, BYVAL RB AS INTEGER)
        DECLARE SUB EDGE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL LR AS INTEGER, BYVAL LG AS INTEGER, BYVAL LB AS INTEGER)
        DECLARE SUB DOT (BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL DR AS INTEGER , BYVAL DG AS INTEGER , BYVAL DB AS INTEGER )
        DECLARE SUB TEXT(BYVAL BX AS INTEGER , BYVAL BY AS INTEGER , BYVAL WW AS STRING , BYVAL WR AS INTEGER, BYVAL WG AS INTEGER, BYVAL WB AS INTEGER)
        DECLARE SUB CURVE(BYVAL X0 AS INTEGER ,BYVAL Y0 AS INTEGER, BYVAL X3 AS INTEGER ,BYVAL Y3 AS INTEGER ,BYVAL X1 AS INTEGER ,BYVAL Y1 AS INTEGER ,BYVAL X2 AS INTEGER ,BYVAL Y2 AS INTEGER , BYVAL RR AS INTEGER , BYVAL RG AS INTEGER, BYVAL RB AS INTEGER)
        DECLARE SUB READFONT()
               
'-------------------------------------------------------------------------------
'       VARIABLES NEEDED FOR THE INTRO;
'-------------------------------------------------------------------------------
'       "FLOATING TEXT" ROUTINE VARIABLES;
'-------------------------------------------------------------------------------

        DIM SHARED LHORIZ = 40: ' WIDTH OF TEXT PAGES.
        DIM SHARED LVERT  = 10 :' HEIGHT OF TEXT PAGES.
       
'-------------------------------------------------------------------------------       
'       SINGLE DIMENSION ARRAYS USED TO MAKE IT EASIER TO PUT LETTERS ON LATER.
'-------------------------------------------------------------------------------

        DIM SHARED AS DOUBLE LXT( LHORIZ * LVERT ):' TARGET X LOCATION FOR LETTER.
        DIM SHARED AS DOUBLE LYT( LHORIZ * LVERT ):' TARGET Y LOCATION FOR LETTER.
       
        DIM SHARED AS DOUBLE LXA( LHORIZ * LVERT ):' ACTUAL X LOCATION FOR LETTER.
        DIM SHARED AS DOUBLE LYA( LHORIZ * LVERT ):' ACTUAL Y LOCATION FOR LETTER.
       
        DIM SHARED AS DOUBLE YSPD( LHORIZ * LVERT )
        DIM SHARED AS DOUBLE XSPD( LHORIZ * LVERT )
       
        DIM SHARED AS UBYTE  LYO( LHORIZ * LVERT ):' IS LETTER ACTIVE? ON=1 OFF=0       
        DIM SHARED AS STRING LYC( LHORIZ * LVERT ):' STORES THE LETTER.
        DIM SHARED AS UINTEGER  LLM:               ' HOW MANY LETTERS ARE ON SCREEN ATM?
        DIM SHARED AS UINTEGER  LTM:               ' TIMER (IN FRAMES) FOR NEXT LETTER.
        LLM=0
        LTM=0
        DIM SHARED AS UBYTE CHECK_PLACEMENT=0
        DIM SHARED TPP AS INTEGER
        TPP=0
        DIM SHARED TXT AS STRING
        DIM SHARED AS DOUBLE HOLD_TIME
'-------------------------------------------------------------------------------
'            IMPORTANT!!!!! PLEASE MAKE SURE THAT YOU
'             USE 40 CHARACTERS PER LINE!!!!!!!!!!!!
'             YOU >>MUST<< FILL WITH SPACES TO MAKE
'             SURE EACH LINE IS 40 CHARS WIDE......
'            ALSO THERE ARE 10 LINES OF TEXT PER PAGE.
'           DO NOT USE LESS OR MORE. THESE TEXT STRINGS
'           HAVE TO BE KEPT THE SAME SIZE!!!!!!!!!!!!!!
'                   OTHERWISE IT WILL FUCK UP.
'          I HAVE PUT THE SPACERS "|" AS A GUIDE FOR YOU
'       LINE THEM UP WITH THE QUOTES AND YOU WON'T GO WRONG.
'-------------------------------------------------------------------------------
'         |PAGE 1:                                 |
TXT = TXT+"        OLDSCHOOL TYPER ROUTINE!        "
TXT = TXT+"        ========================        "
TXT = TXT+"                                        "
TXT = TXT+"       WITH  ADDED DUTCH COLOURS!       "
TXT = TXT+"    SPECIALLY DESIGNED FOR HANGOVERS    "
TXT = TXT+"                                        "
TXT = TXT+"    --------------------------------    "
TXT = TXT+"    - THIS PIECE OF SHIT WAS CODED -    "
TXT = TXT+"    -  BY SHOCKWAVE ON A SATURDAY  -    "
TXT = TXT+"    --------------------------------    "

'         |PAGE 2:                                 |
TXT = TXT+"    --------------------------------    "
TXT = TXT+"    - THIS ROUTINE WILL BE USED IN -    "
TXT = TXT+"    -  A  PRODUCTION FOR A GERMAN  -    "
TXT = TXT+"    - GROUP  BUT I THOUGHT I WOULD -    "
TXT = TXT+"    -  RELEASE THE SOURCE FIRST!!  -    "
TXT = TXT+"    --------------------------------    "
TXT = TXT+"                                        "
TXT = TXT+"   AREN'T I KIND? TO A FAULT INDEED..   "
TXT = TXT+"     NO MORE WORDS COME TO MY MIND      "
TXT = TXT+"   SO GREETINGS TO YOU AND LETS WRAP!   "


'-------------------------------------------------------------------------------
'       LINE STARFIELD VARIABLES;
'-------------------------------------------------------------------------------

        DIM SHARED AS INTEGER STARNUM = 750:' HOW MANY STARS.
        DIM SHARED AS DOUBLE  STRX(STARNUM):' STAR X STORE.
        DIM SHARED AS DOUBLE  STRY(STARNUM):' STAR Y STORE.
        DIM SHARED AS DOUBLE  STRZ(STARNUM):' STAR Z STORE.

'-------------------------------------------------------------------------------
'       EFFECT SUBS DEFINITIONS;
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'       STARFIELD;
'-------------------------------------------------------------------------------

        DECLARE SUB SETUPSTARS()
        DECLARE SUB STARFIELD()
       
'-------------------------------------------------------------------------------
'       TEXT WRITER;
'-------------------------------------------------------------------------------
        DECLARE SUB PRELOADGRID():' SET UP GRID POSITIONS FOR THE LETTERS.
        DECLARE SUB RESETWRITER():' NEW TEXT PAGE FOR WRITER.
        DECLARE SUB HYPERTEXTER():' THIS SUB DOES THE TEXT WRITER.
       
'-------------------------------------------------------------------------------       
'       OPEN THE SCREEN
'-------------------------------------------------------------------------------       

        DIM SHARED AS UINTEGER BUFFER ( XRES * YRES )       
        DIM SHARED FONT (64 * 64) as Uinteger : ' FONT BUFFER
        DIM SHARED AS DOUBLE GADD,GADD4,GADD3,GADD2
       
       
        READFONT()
        PRELOADGRID()
        RESETWRITER()
        SETUPSTARS()
       
        If( PTC_OPEN( "FREEBASIC GRAPHICS SCREEN", XRES, YRES ) = 0 ) Then
        End -1
        End If

'-------------------------------------------------------------------------------       
'       THE MAIN LOOP;
'-------------------------------------------------------------------------------       

DIM SHARED RGADD AS DOUBLE

        while (1)
            RGADD= .025*SIN(GADD/270)
            STARFIELD()
            HYPERTEXTER()
            PTC_UPDATE @ BUFFER (0)
            ERASE BUFFER
            GADD=GADD+1
            GADD4=GADD4+.053
            GADD3=GADD3+.1
            GADD2=GADD2+.0257
        wend

'-------------------------------------------------------------------------------
' DRAW THE STARS AND MOVE THEM ETC.
'-------------------------------------------------------------------------------

SUB STARFIELD()
 DIM AS INTEGER TX,TY,TX2,TY2,A,CVV
 DIM AS DOUBLE XX,YY,MO1,MO2
 
 FOR A=1 TO STARNUM
     
     '--------------------------------------------------------------------------
     ' WE NEED TO GENERATE 2 SETS OF X AND Y FOR EACH "STAR" SO WE CAN DRAW A LINE
     '--------------------------------------------------------------------------
     
     TX = (STRX(A) / STRZ(A)) + 320     
     TY = (STRY(A) / STRZ(A)) + 240
     
     TX2 = (STRX(A) / (STRZ(A)+.5)) + 320     
     TY2 = (STRY(A) / (STRZ(A)+.5)) + 240
     
     '--------------------------------------------------------------------------
     ' ONSCREEN? IF SO DRAW IT.
     '--------------------------------------------------------------------------
     
     IF TX>0 AND TX<XRES AND TY>0 AND TY<YRES AND TX2>0 AND TX2<XRES AND TY2>0 AND TY2<YRES THEN
         CVV = (INT(-STRZ(A)+35)) SHL 2
         EDGE (TX,TY,TX2,TY2,CVV,CVV,CVV)
     ELSE
         
       '------------------------------------------------------------------------
       ' IT'S OFFSCREEN? GENERATE A NEW ONE.
       '------------------------------------------------------------------------
       
        STRX(A) = (RND(1) * 20000) - 10000
        STRY(A) = (RND(1) * 20000) - 10000
        STRZ(A) = 32
     END IF

     '--------------------------------------------------------------------------
     ' MOVE THE STAR.
     '--------------------------------------------------------------------------
     
     STRZ(A)=STRZ(A)-.5
       
    NEXT

    MO1= COS(RGADD):' GENERATE MATRIX CONSTANT 1
    MO2= SIN(RGADD):' GENERATE MATRIX CONSTANT 2

FOR A=1 TO STARNUM
       
        '-----------------------------------------------------------------------
        ' ROTATE THE STAR
        '-----------------------------------------------------------------------
       
        XX = MO1 * STRX(A) - MO2 * STRY(A)
        YY = MO1 * STRY(A) + MO2 * STRX(A)
       
        STRX(A) = XX
        STRY(A) = YY
NEXT
 
 
END SUB

'-------------------------------------------------------------------------------
' INITIALISE THE NICE STARFIELD
'-------------------------------------------------------------------------------

SUB SETUPSTARS()
    DIM A AS INTEGER
   
    FOR A=1 TO STARNUM
       
        STRX(A) = (RND(1) * 10000) - 5000
        STRY(A) = (RND(1) * 10000) - 5000
        STRZ(A) = (RND(1) * 32   )
    NEXT
   
END SUB

'-------------------------------------------------------------------------------
' THE NICE WRITER;
'-------------------------------------------------------------------------------
SUB HYPERTEXTER()
    DIM AS INTEGER A,CF
    DIM AS DOUBLE FX,FY
    DIM AS DOUBLE XDV
    DIM AS DOUBLE YDV
    XDV=37
    YDV=45

    '---------------------------------------------------------------------------
    ' DRAW THE ACTIVE LETTERS ON THE SCREEN;
    '---------------------------------------------------------------------------
   
    FOR A=0 TO LLM
        IF INT(LXA(A))>-8 AND INT(LXA(A))<XRES AND INT(LYA(A))>-8 AND INT(LYA(A))<YRES THEN
            TEXT(INT(LXA(A)),INT(LYA(A)),LYC(A),150+100*SIN((A+GADD4)),150+100*SIN((A+GADD3)),150+100*SIN((A+GADD2)))
        END IF
    NEXT

    '---------------------------------------------------------------------------
    ' IF ALL LETTERS ARE NOT IN PLACE THEN WE NEED TO DO THE WRITER;
    '---------------------------------------------------------------------------
   
    IF CHECK_PLACEMENT=0 THEN
    '---------------------------------------------------------------------------
    ' THIS "FLOATING" POINT IS THE ORIGIN WHERE NEW LETTERS APPEAR FROM.
    '---------------------------------------------------------------------------
    FX = XRES/2 + (70*SIN(GADD/ 7)+70*COS(GADD/9)+120*SIN(GADD/6))
    FY = YRES/2 + (70*SIN(GADD/ 6)+70*COS(GADD/11)+80*SIN(GADD /4))

    IF LLM < (LHORIZ * LVERT) THEN
        LLM = LLM + 1
       
        LXA(LLM) = FX
        LYA(LLM) = FY
        LYO(LLM) = 1
        END IF
   
    FOR A=0 TO LLM
       
        IF LXA(A)<>LXT(A) THEN
            LXA(A)=LXA(A)+((LXT(A)-LXA(A))/XDV)
        END IF
        IF LYA(A)<>LYT(A) THEN
            LYA(A)=LYA(A)+((LYT(A)-LYA(A))/YDV)
        END IF
        IF LXA(A)-LXT(A) >-.5 AND LXA(A)-LXT(A) <.5 THEN LXA(A)=LXT(A)
        IF LYA(A)-LYT(A) >-.5 AND LYA(A)-LYT(A) <.5 THEN LYA(A)=LYT(A)
    NEXT
   
    END IF

    '---------------------------------------------------------------------------
    ' CHECK IF ALL LETTERS ARE IN PLACE;
    '---------------------------------------------------------------------------
   
    IF LLM>= ( LHORIZ * LVERT ) AND CHECK_PLACEMENT=0 THEN
    CF=1
    FOR A = 1 TO LLM
        IF LXA(A)<> LXT(A) OR LYA(A)<>LYT(A) THEN CF=0
    NEXT

    '---------------------------------------------------------------------------
    ' IF ALL LETTERS ARE IN PLACE BEGIN 8 SECOND COUNTDOWN
    '---------------------------------------------------------------------------

    IF CF=1 THEN
        CHECK_PLACEMENT=1
        HOLD_TIME = TIMER
    END IF
   
    END IF

    '---------------------------------------------------------------------------
    ' IF ALL LETTERS ARE IN PLACE AND THE COUNTDOWN HAS PASSED 5 SECS WE NEED TO
    ' START GETTING RID OF THE LETTERS
    '---------------------------------------------------------------------------
    IF CHECK_PLACEMENT=1 AND TIMER-HOLD_TIME >=5.5 AND TIMER-HOLD_TIME <=6 THEN
        FOR A=0 TO LLM
            LYA(A)=LYA(A)+ (RND(1)-.5)
            LXA(A)=LXA(A)+ (RND(1)-.5)
            'IF YSPD(A)<12 THEN YSPD(A)=YSPD(A)+.2
        NEXT
    END IF
   
    '---------------------------------------------------------------------------
    ' IF ALL LETTERS ARE IN PLACE AND THE COUNTDOWN HAS PASSED 5 SECS WE NEED TO
    ' START GETTING RID OF THE LETTERS
    '---------------------------------------------------------------------------
    IF CHECK_PLACEMENT=1 AND TIMER-HOLD_TIME >=6 THEN
        FOR A=0 TO LLM
            LYA(A)=LYA(A)+YSPD(A)
            LXA(A)=LXA(A)+XSPD(A)
            IF YSPD(A)<12 THEN YSPD(A)=YSPD(A)+.2
        NEXT
    END IF

    '---------------------------------------------------------------------------
    ' GO TO NEXT PAGE IF COUNTDOWN>8 SECS AND LETTERS WERE IN PLACE.
    '---------------------------------------------------------------------------

    IF CHECK_PLACEMENT=1 AND TIMER-HOLD_TIME >=8 THEN
        TPP=TPP+(LHORIZ*LVERT)
        IF TPP>LEN(TXT)-(LHORIZ*LVERT) THEN TPP=0
        RESETWRITER()
    END IF
   
END SUB


'-------------------------------------------------------------------------------
' CLEAR OUT OLD TEXT AND SET UP NEW PAGE IN TEXT WRITER.
'-------------------------------------------------------------------------------
SUB RESETWRITER()
    DIM AS INTEGER A,PS,T
    '---------------------------------------------------------------------------
    ' BOING DETERMINES WHETHER WE GO BACKWARDS OR FORWARDS THRU THE STRING
    ' AS LETTES IN ALTERNATE LINES HAVE TO BE REVERSED DUE TO THE ORDER WE
    ' ACTIVATE THEM!
    '---------------------------------------------------------------------------
    DIM AS INTEGER BOING
    BOING=0
    PS=1+TPP
    LLM=0
    FOR A=1 TO ( LHORIZ * LVERT )
        '-----------------------------------------------------------------------
        ' SET UP SOME SPEEDS FOR EXPLOSION WHEN TEXT SCREEN CHANGES
        '-----------------------------------------------------------------------
        YSPD(A)= (RND(1)*12)-9
        XSPD(A)= (RND(1)*7)-3.5
        '-----------------------------------------------------------------------
        ' TURN OFF THIS LETTER AND GET NEW CHARACTER
        '-----------------------------------------------------------------------
        LYO(A) = 0
        LYC(A) = MID(TXT,PS,1)
        '-----------------------------------------------------------------------
        ' CYCLE THROUGH STRING FORWARDS OR BACKWARDS
        '-----------------------------------------------------------------------
        IF BOING=0 THEN PS=PS+1
        IF BOING=1 THEN PS=PS-1
        '-----------------------------------------------------------------------
        ' WHEN WE HAVE CALCULATED ONE LINE, REVERSE DIRECTION.
        '-----------------------------------------------------------------------
        T=T+1
        IF T>=LHORIZ THEN
            T=0
            BOING=BOING+1
            IF BOING>1 THEN BOING=0
        IF BOING=0 THEN PS=PS+(LHORIZ+1)
        IF BOING=1 THEN PS=PS+(LHORIZ-1)
        END IF
    NEXT
    '---------------------------------------------------------------------------
    ' LETTERS ARE NOW OUT OF PLACE, SO RESET THIS FLAG.
    '---------------------------------------------------------------------------
    CHECK_PLACEMENT=0
END SUB

'-------------------------------------------------------------------------------
' SET UP GRID TARGETS FOR LETTERS IN TYPER..
'-------------------------------------------------------------------------------
SUB PRELOADGRID()   
   
    DIM AS INTEGER TOP,LFT,A,T
    DIM AS INTEGER TRACKX,TRACKY
    DIM AS INTEGER BOING
   
    BOING=0
    TOP=180:' TOP  OF GRID.
    LFT=124:' LEFT OF GRID.

    TRACKY=TOP
    TRACKX=LFT   
   
    FOR A=1 TO ( LHORIZ * LVERT )
       
        LXT(A) = TRACKX
        LYT(A) = TRACKY
       
        IF BOING=0 THEN TRACKX=TRACKX+10
        IF BOING=1 THEN TRACKX=TRACKX-10
        T=T+1
        IF T>=LHORIZ THEN
            T=0
           
            BOING=BOING+1
            IF BOING>1 THEN BOING=0
        IF BOING=0 THEN TRACKX=TRACKX+10
        IF BOING=1 THEN TRACKX=TRACKX-10
           
            TRACKY=TRACKY+10
        END IF
       
    NEXT
   
END SUB


'-------------------------------------------------------------------------------
' CUSTOM GRAPHICS SUBS;
'-------------------------------------------------------------------------------

'
' USAGE, CURVE(SOURCE X,SOURCE Y , DEST X , DEST Y, CONTROL X1 , CONTROL Y1 , CONTROL X2, CONTROL Y2)
'

SUB CURVE(BYVAL X0 AS INTEGER ,BYVAL Y0 AS INTEGER, BYVAL X3 AS INTEGER ,BYVAL Y3 AS INTEGER ,BYVAL X1 AS INTEGER ,BYVAL Y1 AS INTEGER ,BYVAL X2 AS INTEGER ,BYVAL Y2 AS INTEGER , BYVAL RR AS INTEGER , BYVAL RG AS INTEGER, BYVAL RB AS INTEGER)
dim as double T
DIM AS INTEGER L,X,Y,cx,bx,ax,cy,by,ay,CVLU,OX,OY

'CVLU = RGB(RR,RG,RB)
CX = 3*(X1-X0)
BX = 3*(X2-X1)-CX
AX = X3-X0-CX-BX
CY=3*(Y1-Y0)
BY=3*(Y2-Y1)-CY
AY=Y3-Y0-CY-BY
for t = 0 to 1.01 step .01
IF T>0 THEN
    OX=X
    OY=Y
END IF
        x = ax * t ^ 3 + bx * t ^ 2 + cx * t + X0
        y = ay * t ^ 3 + by * t ^ 2 + cy * t + Y0
IF T>0 THEN
    EDGE (X,Y,OX,OY,RR,RG,RB)
END IF

next
END SUB


sub TEXT(BYVAL BX AS INTEGER , BYVAL BY AS INTEGER , BYVAL WW AS STRING , BYVAL WR AS INTEGER , BYVAL WG AS INTEGER , BYVAL WB AS INTEGER)
'
' Usage : TEXT ( X , Y , "YOUR TEXT" , R , G , B )
'
'

WW = UCASE (WW)

dim blx,bly as Uinteger

DIM as INTEGER STRX,STRY,TLP,TC,CH,TC2

    TC =RGB (WR , WG , WB)
   TC2 =RGB ( WR SHR 1 , WG  SHR 1, WB SHR 1 )
    dim bm,mm
   
    FOR TLP = 0 TO LEN(WW)
    CH = ASC(MID(WW,TLP,1))-31
    IF CH<0 OR CH>64 THEN CH=0
    '---------------------------------
    'Calculate Offset In Font Data;---
    '---------------------------------
    bm=(ch*64)-64
   

    STRY=BY
   
    FOR BLY=0 TO 7   
    STRX=BX + ((TLP-1) * 9)
   
    FOR BLX=1 TO 8
        '--------
        'Clip;---
        '--------                   
            '----------------------------------------------------
            'Draw Pixel In Buffer If Onscreen And If Binary 1 ---
            '----------------------------------------------------
            MM= FONT((((BLY)*8)+(BLX))+BM)                       
                IF (STRX>0) AND (STRX<XRES-3)  and (STRY>0) AND (STRY<YRES-3)THEN             
                IF MM >0 THEN
                BUFFER (((STRY+2)*XRES)+STRX+2) = TC2
                    BUFFER (((STRY)*XRES)+STRX) = TC
                end if
                END IF 
                STRX=STRX+1
    NEXT
    STRY=STRY+1
    NEXT
    NEXT
END SUB




SUB DOT (BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL DR AS INTEGER , BYVAL DG AS INTEGER , BYVAL DB AS INTEGER )
'-------------------------------------------------------------------------------
' THIS SUB DRAWS A DOT AT X1 , Y1
' USAGE : DOT ( X1 , Y1 , R , G , B)
'
'-------------------------------------------------------------------------------
DIM TC AS INTEGER
TC = RGB (DR , DG , DB)

IF X1>0 AND X1 < XRES AND Y1>0 AND Y1<YRES THEN
        BUFFER ( X1 + (Y1 * XRES)) = TC
END IF


END SUB


SUB EDGE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL LR AS INTEGER, BYVAL LG AS INTEGER, BYVAL LB AS INTEGER)
'-------------------------------------------------------------------------------
'
' THIS LINE ROUTINE IS NOT VERY FAST BUT IT WORKS. THANKS TETRA.
' USAGE:
' EDGE ( X1 , Y1 , X2 , Y2 , R , G , B )
'
'-------------------------------------------------------------------------------
        DIM xdistance AS DOUBLE
        DIM ydistance AS DOUBLE
        DIM TC AS INTEGER       
        DIM i AS INTEGER
        DIM h2 AS INTEGER
       
        DIM StartX AS DOUBLE
        DIM StartY AS DOUBLE
        DIM XRatio AS DOUBLE
        DIM YRatio AS DOUBLE

        TC = RGB ( LR,LG,LB )

        xdistance = X2 - X1
        ydistance = Y2 - Y1

        h2 = sqr( xdistance * xdistance + ydistance * ydistance )
       
        StartX = X1
        StartY = Y1
       
        XRatio = xdistance * ( 1.0 / h2 )
        YRatio = ydistance * ( 1.0 / h2 )
       
        for i = 0 to h2
            IF STARTX>0 AND STARTX<XRES AND STARTY>0 AND STARTY<YRES-1 THEN
            BUFFER ( INT(StartX) + (INT(StartY) * XRES ) ) = TC
            END IF
            StartX = StartX + XRatio
            StartY = StartY + YRatio
        next i
END SUB



SUB RECT(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL XW AS INTEGER , BYVAL YH AS INTEGER , BYVAL RR AS INTEGER , BYVAL RG AS INTEGER, BYVAL RB AS INTEGER)
'-------------------------------------------------------------------------
'
' FILLED RECTANGLE ROUTINE WITH ASSEMBLY LANGUAGE RASTERISING.
' USAGE   RECT ( TOPX , TOPY , WIDTH , HEIGHT , R , G , B )
' THIS ROUTINE HAS BASIC CLIPPING TO SCREEN BOUNDARIES.
'
'-------------------------------------------------------------------------

        DIM PP AS INTEGER PTR
        DIM AS INTEGER SLICE,LP,TC

'-------------------------------------------------------------------------
'       BASIC CLIPPING TO SCREEN;
'-------------------------------------------------------------------------

        IF X1 < 0 THEN
         XW = XW +  X1         
         X1=0
        END IF
       
        IF Y1 < 0 THEN
         YH = YH +  Y1         
         Y1=0
        END IF       
       
        IF XW + X1 > XRES THEN
            XW = XRES - X1
        END IF
       
        IF YH + Y1 > YRES THEN
            YH = (YRES - Y1)
        END IF       
       
IF XW>0 AND YH>0 THEN       
        TC = RGB ( RR , RG , RB )
       
        FOR LP =Y1 TO (YH+Y1)-1
           
            pp=@buffer((XRES*LP)+X1)
            slice = XW
           
            if slice>0 then
                    asm
                    mov eax,dword ptr[TC]
                    mov ecx, [slice]
                    mov edi, [PP]
                    rep stosd
                    end asm   
            end if
           
        NEXT
END IF


END SUB


SUB CIRC(BYVAL CX AS INTEGER , BYVAL CY AS INTEGER , BYVAL R AS INTEGER, BYVAL CR AS INTEGER,BYVAL CG AS INTEGER,BYVAL CB AS INTEGER)

'-------------------------------------------------------------------------
'
' FILLED CIRCLE ROUTINE WITH ASSEMBLY LANGUAGE RASTERISING.
' USAGE  CIRC ( X , Y , RADIUS , R , G , B )
' REMEMBER THAT X + Y ARE THE CENTER OF YOUR CIRCLE.
' THIS HAS BASIC CLIPPING TO SCREEN BOUNDARIES.
'
'-------------------------------------------------------------------------

DIM  as integer r2,cc,loopy,ww,l,clipl , clipr,slice,tc
dim pp as integer ptr
r2=r*r
cc=-r
TC = RGB ( CR , CG , CB )
for loopy = cc to r     
        ww = Sqr(r2-loopy*loopy)

        if loopy+cy>=0 and loopy+cy<yres then
            clipl = cx-ww
            clipr = (cx+ww)-1
            if clipl<0 then clipl=0
            if clipr>xres-1 then clipr = xres-1
            pp=@buffer((XRES*(loopy+CY))+clipl)
            slice = clipr-clipl
           
            if slice>0 then
                    asm
                    mov eax,dword ptr[TC]
                    mov ecx, [slice]
                    mov edi, [PP]
                    rep stosd
                    end asm   
            end if
           

   
        end if

next
END SUB



SUB TRIANGLE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TR AS INTEGER,BYVAL TG AS INTEGER,BYVAL TB AS INTEGER)
'-------------------------------------------------------------------------
' FLAT TRIANGLE RENDERER WITH ASSEMBLY LANGUAGE RASTERISING BY SHOCKWAVE ^ DBF ^ S!P 2006.
'
' USAGE : TRIANGLE ( X1 , Y1 , X2 , Y2 , X3 , Y3 , R , G , B )
' CLIPS TO SCREEN BOUNDARIES.
'
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
' WE NEED TO SORT THESE POINTS INTO ORDER FROM TOP TO BOTTOM, AN EXCHANGE SORT IS OK.
' AS WE ONLY HAVE GOT 3 POINTS TO ARRANGE.
'-------------------------------------------------------------------------
DIM AS INTEGER TEMPX,TEMPY,LO,LI,TC
                DIM AS INTEGER PX(3)
                DIM AS INTEGER PY(3)
                DIM TFLAG AS INTEGER
                dim pp as uinteger PTR
                DIM AS INTEGER IL1,IL2,SLICE
                TFLAG=0
                TC = RGB ( TR , TG , TB )
        PX(1)= X1
        PX(2)= X2
        PX(3)= X3
       
        PY(1)= Y1
        PY(2)= Y2
        PY(3)= Y3

FOR LO = 1 TO 2
    FOR LI =1 TO 2     
        IF PY(LI+1) <= PY(LI) THEN
        TEMPX = PX(LI) : TEMPY = PY(LI)
        PX(LI) = PX(LI+1)
        PY(LI) = PY(LI+1)
        PX(LI+1) = TEMPX
        PY(LI+1) = TEMPY
        END IF   
    NEXT LI
NEXT LO

'   BOOT OUT INVISIBLE TRIANGLES!

    IF PX(1)<0 AND PX(2)<0  AND PX(3)< 0 THEN TFLAG=1
    IF PX(1)>XRES AND PX(2)>XRES  AND PX(3)>XRES THEN TFLAG=1
    IF PY(1)>YRES AND PY(2)>YRES  AND PY(3)>YRES THEN TFLAG=1
   
        DIM AS DOUBLE XP1,XP2:' SCREEN POSITIONS.
        DIM AS DOUBLE XI1,XI2:' INTERPOLATIONS.
       
'***
'*** REGULAR TRIANGLE (Y1<Y2 Y2<Y3)
'***

IF PY(1)<PY(2) AND PY(2)<PY(3) or (PY(2) = PY(3)) THEN
    TFLAG=1
XP1 = PX(1)
XP2 = PX(1)
XI1 = (PX(1)-PX(2)) / (PY(2) - PY(1))
XI2 = (PX(1)-PX(3)) / (PY(3) - PY(1))

FOR LO = PY(1) TO PY(2)-1
   
IF LO>=0 AND LO<YRES THEN

    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF
   
    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0

    SLICE = IL2-IL1

IF SLICE>0 THEN
   

     

   
    PP = @BUFFER(IL1+(LO*XRES))   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
   

END IF

XP1=XP1-XI1
XP2=XP2-XI2
NEXT

XI1 = (PX(2)-PX(3)) / (PY(3) - PY(2))
XP1 = PX(2)

FOR LO = PY(2) TO PY(3)
IF LO>=0 AND LO<YRES THEN
    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF

    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0

    SLICE = IL2-IL1
    IF SLICE>0 THEN
 
       

    PP = @BUFFER(IL1+(LO*XRES))   
   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
END IF
XP1=XP1-XI1
XP2=XP2-XI2
NEXT

END IF


'***
'*** FLAT TOPPED TRIANGLE Y1=Y2
'***

IF TFLAG=0 AND PY(1) = PY(2) THEN
   
        TFLAG=1
        XP1 = PX(1)
        XP2 = PX(2)
        XI1 = (PX(1)-PX(3)) / (PY(3) - PY(1))
        XI2 = (PX(2)-PX(3)) / (PY(3) - PY(2))
FOR LO = PY(1) TO PY(3)
 IF LO>=0 AND LO<YRES THEN
    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF
   
    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0
   
    SLICE = IL2-IL1
    IF SLICE>0 THEN



    PP = @BUFFER(IL1+(LO*XRES))   
   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
END IF
    XP1=XP1-XI1
    XP2=XP2-XI2

NEXT
END IF
END SUB

SUB READFONT()
        dim lp
        FOR LP=1 TO (64*64)
                READ FONT(LP)
        NEXT
       
END SUB



'space
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0

'!
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0

' "
data 0,1,1,1,0,1,1,1
data 0,1,1,1,0,1,1,1
data 0,1,1,1,0,1,1,1
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0

' #

data 0,0,0,0,0,0,0,0
data 0,1,1,1,0,1,1,0
data 1,1,1,1,1,1,1,1
data 0,1,1,1,0,1,1,0
data 0,1,1,1,0,1,1,0
data 1,1,1,1,1,1,1,1
data 0,1,1,1,0,1,1,0
data 0,0,0,0,0,0,0,0

' $ = £
data 0,0,1,1,1,1,1,0
data 0,1,1,1,0,1,1,1
data 1,1,1,1,1,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 1,1,1,1,1,1,1,1

' %
data 0,0,0,0,0,0,0,0
data 0,1,1,0,0,1,1,1
data 0,1,1,0,1,1,1,0
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,0,0,0
data 0,1,1,1,0,1,1,0
data 1,1,1,0,0,1,1,0
data 0,0,0,0,0,0,0,0
' & = O
data 0,0,0,1,1,0,0,0
data 0,1,1,1,1,1,1,0
data 0,1,1,1,1,1,1,0
data 1,1,1,1,1,1,1,1
data 1,1,1,1,1,1,1,1
data 0,1,1,1,1,1,1,0
data 0,1,1,1,1,1,1,0
data 0,0,0,1,1,0,0,0
' '
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0

' (
data 0,0,1,1,1,1,0,0
data 0,1,1,1,1,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,1,1,1,1,0,0,0
data 0,0,1,1,1,1,0,0
' )
data 0,0,1,1,1,1,0,0
data 0,0,0,1,1,1,1,0
data 0,0,0,0,1,1,1,0
data 0,0,0,0,1,1,1,0
data 0,0,0,0,1,1,1,0
data 0,0,0,0,1,1,1,0
data 0,0,0,1,1,1,1,0
data 0,0,1,1,1,1,0,0

' *
data 0,0,0,0,0,0,0,0
data 0,1,0,1,1,0,1,0
data 0,0,1,1,1,1,0,0
data 0,1,1,1,1,1,1,0
data 0,1,1,1,1,1,1,0
data 0,0,1,1,1,1,0,0
data 0,1,0,1,1,0,1,0
data 0,0,0,0,0,0,0,0

' +
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,0,0,0
data 0,0,0,1,1,0,0,0
data 0,1,1,1,1,1,1,0
data 0,1,1,1,1,1,1,0
data 0,0,0,1,1,0,0,0
data 0,0,0,1,1,0,0,0
data 0,0,0,0,0,0,0,0
' ,
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,1,0,0

' -
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,1,1,1,1,1,1,0
data 0,1,1,1,1,1,1,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
' .
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,0,0,0
data 0,0,0,1,1,0,0,0
' /
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,1,1,1
data 0,0,0,0,1,1,1,0
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,0,0,0
data 0,1,1,1,0,0,0,0
data 1,1,1,0,0,0,0,0
data 0,0,0,0,0,0,0,0

'0
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,0,1,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'1
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,1,0,0
data 0,0,1,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,1,1,0
'2
data 0,0,1,1,1,1,1,0
data 0,1,1,1,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,1,1
data 1,1,1,1,1,1,1,1
'3
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 0,0,0,0,1,1,1,0
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'4
data 1,1,1,0,1,1,1,0
data 1,1,1,0,1,1,1,0
data 0,1,1,1,1,1,1,1
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
'5
data 1,1,1,1,1,1,1,0
data 1,1,1,0,1,1,1,0
data 1,1,1,0,0,0,0,0
data 0,1,1,1,1,1,1,0
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'6
data 1,1,0,0,0,0,0,0
data 1,1,0,0,0,0,0,0
data 1,1,0,0,0,0,0,0
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'7
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 0,0,0,0,1,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
'8
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'9
data 0,1,1,1,1,1,1,1
data 1,1,0,0,0,1,1,1
data 0,1,1,1,1,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1

' :
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,1,1,1,1,0,0

' ;
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0

' <
data 0,0,0,0,0,0,0,0
data 0,0,1,1,1,0,0,0
data 0,1,1,1,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,0,0,0,0,0,0

' =
data 0,0,0,0,0,0,0,0
data 0,0,1,1,1,1,0,0
data 0,0,1,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,1,1,1,1,0,0
data 0,0,1,1,1,1,0,0
data 0,0,0,0,0,0,0,0

' >
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,1,1,1,0
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,1,1,1,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0

' ?
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 0,0,0,1,1,1,1,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,1,1,1,0,0

' @
data 0,0,0,0,0,0,0,0
data 0,0,1,1,1,1,0,0
data 0,1,1,0,0,1,1,0
data 0,1,0,1,1,0,1,0
data 0,1,0,0,0,0,1,0
data 0,1,0,1,1,0,1,0
data 0,0,1,1,1,1,0,0
data 0,0,0,0,0,0,0,0

'[]\^_?@

'A
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
'B
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0
'C
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'D
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0
'E
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'F
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0

'G
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,1,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0

'H
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1

'I
data 0,1,1,1,1,1,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,1,1,1,1,1,0,0
'J
data 0,1,1,1,1,1,1,1
data 1,1,1,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'K
data 1,1,1,0,1,1,1,0
data 1,1,1,0,1,1,1,0
data 1,1,1,1,1,1,0,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
'L

data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0

'M

data 0,1,1,0,1,1,1,0
data 1,1,1,1,1,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1

'N

data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1

'O
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
'P

data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0

'Q
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,1,0,1,1
data 1,1,1,0,1,1,0,1
data 1,1,1,0,0,1,1,0
data 0,1,1,1,1,1,1,0


'R

data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
'S

data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,0,0,0
data 0,1,1,1,1,1,1,0
data 0,0,0,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0

'T
data 1,1,1,1,1,1,1,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,1,1,1,0,0,0
'U
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0

'V

data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,0,0,1,1,0
data 0,0,1,1,1,1,0,0

'W
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,1,0,1,1,1
data 1,1,1,1,0,1,1,1
data 0,1,1,1,1,1,1,0

'X
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1

'Y
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 1,1,1,0,0,1,1,1
data 0,1,1,1,1,1,1,0

'Z
data 0,1,1,1,1,1,1,1
data 1,1,1,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,1,1,1,1,1,1,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,1,1,1
data 1,1,1,1,1,1,1,0

'[
data 1,1,1,1,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 1,1,1,1,0,0,0,0
'\
data 1,1,0,0,0,0,0,0
data 1,1,1,0,0,0,0,0
data 0,1,1,1,0,0,0,0
data 0,0,1,1,1,0,0,0
data 0,0,0,1,1,1,0,0
data 0,0,0,0,1,1,1,0
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,0,1,1
']
data 0,0,0,0,1,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,0,1,1,1
data 0,0,0,0,1,1,1,1
'^
data 0,0,0,1,1,0,0,0
data 0,0,1,1,1,1,0,0
data 0,1,1,0,0,1,1,0
data 1,1,1,0,0,1,1,1
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0

'_
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0
data 0,1,1,1,1,1,1,0
Title: Re: Really cute typer.
Post by: Shockwave on March 03, 2007
I should say that I watched this;

INSPIRATION (http://www.intro-inferno.com/production.php?id=9)

before I started coding.
Title: Re: Really cute typer.
Post by: Emil_halim on March 03, 2007
Nice demo ,  I just wonder in which language was this demo written ?
Title: Re: Really cute typer.
Post by: Shockwave on March 03, 2007
Alpha One uses C++ and Direct X.
Title: Re: Really cute typer.
Post by: Emil_halim on March 03, 2007

wow , but it is only  42.1 KB ,  :)

my be tommorw i will try to port his demo to OgreMagic.
Title: Re: Really cute typer.
Post by: Rbz on March 03, 2007
That's a cool text routine  :goodpost:
Title: Re: Really cute typer.
Post by: Shockwave on March 03, 2007
Thanks Rbraz :)

Emil, you are goingto have the size problem because your library includes everything it could possibly need.

The freebasic framework I use for instance is very small, it is based on gaffers tinyptc lib. This is very small because all it does is to open a window, and update that window with doulbe buffering from a memory block. Rbraz and Jim worked on it to change it from GDI drawing to opengl so that the refresh had vsync so that smooth movement and scrolling was possible.

To be able to generate an exe size of about 70kb is a good guide (as long as no gfx are included), when packed with kkrunchy or upx, the size comes down dramatically.

If you released an intro that was 3mb at Pouet it wouldn't get a good reception. I can see ogermagic being of a lot more use in a bigger production, a full demo with many scenes. Having said that, Intro's are excellent fodder to test the features of Ogermagic on and I say more power to you. It's refreshing to see someone with your enthusiasm with such a cool tool :) I'll look forward to seeing your conversion of Alpha One's intro. I am in touch with him sometimes so I will even show him that you've  made a conversion :)
Title: Re: Really cute typer.
Post by: rdc on March 04, 2007
Cool stuff.
Title: Re: Really cute typer.
Post by: Emil_halim on March 04, 2007
Oh , thanks shocky , for your explaination.

I was thinking that , instead of making it as a DLL ,I will make it as a static library , so that when liking operation the linker will get what it actually needed.

But doing it as a static library may produce some problem in linking with some language.

BTW my first Magic Library was a static one , it was an extension for Irrlicht 3D engine and under OpenGL.

Any way I will give it a try and see.     

an other thing that i want to tell you , i have successfully made an one exe file installer for OgreMagic as you suggested.  :)
Title: Re: Really cute typer.
Post by: Shockwave on March 04, 2007
The one file installer is definately the way to go! :)

Well done, I don't know about how to get the file size down.. Perhaps Ogermagic would need to be split down into modules? For instance #include "OM_PNGLOADER" etc.. and yeah, it may not be as simlple as including the whole library, but it would make Ogermagic more practical to use in things like intros.

But don't forget, your library will still have it's uses for peple who want to write games and bigger projects.
3MB is nothing in some demos, I've downloaded some demos that were like 15mb. But when I downloaded those things I exected to be entertained for 10 to 15 minutes!
Title: Re: Really cute typer.
Post by: Emil_halim on March 04, 2007
I have encountered a huge numbers of  undefined reference errors with a static library , so I think the DLL is the best solution. So reduce the size is not my first priority , but the speed is it, may be later I do it.   
Title: Re: Really cute typer.
Post by: Shockwave on March 04, 2007
That's a shame, I might have used this myself, but if it is going to cause a lot of problems, then maybe it's best to get it working as fast as it can first... It's just that I've seen some great libs like Adigun Polack's fb primitive lib coming in for a lot of criticism because of file size, even though it's a great lib.
Title: Re: Really cute typer.
Post by: benny! on March 04, 2007
Excellent typer. I really do like it !
Title: Re: Really cute typer.
Post by: Shockwave on March 04, 2007
Thank you Benny :)
Title: Re: Really cute typer.
Post by: MrP on March 04, 2007
Sweet typer Shocky, nice work.....
Title: Re: Really cute typer.
Post by: Shockwave on March 04, 2007
Thanks mate :)
Title: Re: Really cute typer.
Post by: .:] Druid [:. on March 04, 2007
it has been already said....nice work! :)
Title: Re: Really cute typer.
Post by: Emil_halim on March 04, 2007

Hi shocky.

i have a good news , i have made a static OgreMagic Library , so the linker will take what it need only , but still there are small problem, it still need the d3dx9.dll which is 825 KB , so i want to search for a static d3dx9 library.

any way tomorrow i will keep on working and let you know the results.
Title: Re: Really cute typer.
Post by: Shockwave on March 04, 2007
Should that dll be installed on most up to date systems anyway?
Title: Re: Really cute typer.
Post by: Emil_halim on March 05, 2007
I did not found it in my system , so that I think it does not come with system by default , Does you system has it by default?

Any way , I can include it with my OgreMagic installer and copy it to System32 in the destination computer , so it will be there and there is no need to redistribute it every time.
Title: Re: Really cute typer.
Post by: Shockwave on March 05, 2007
That would be a good idea.Eventually we'll get to the point where ogermagic exes will be small enough to upload to the showcase here :)
Title: Re: Really cute typer.
Post by: DrewPee on March 06, 2007
Shockwave,
That sure is some amazing stuff - BUT - it runs way way too fast on my laptop for some reason?
Anybody else had this trouble?

Drew
Title: Re: Really cute typer.
Post by: Shockwave on March 06, 2007
Your gfx card settings have been altered by the sound of it mate.
Make sure you have v-sync enabled.  :)
Title: Re: Really cute typer.
Post by: Hotshot on March 17, 2007
that cool C64 TYPER  :P
Title: Re: Really cute typer.
Post by: Shockwave on March 17, 2007
On the Amiga you could have done it, but not on the C64, you might have got the letters to drift into place but when they explode all over the screen the C64 wouldn't have handled it. Glad you liked it though Hotshot :)
Title: Re: Really cute typer.
Post by: psygate on March 17, 2007
Very nice effect! I love it, though some letters are hard to read. :2funny: