Quote: "So get off my back and don't try to understand what you cannot!"
I can't understand? Try explaining it better before yelling back at the guy whose tutorial you tried to use in the first place.
To me it sounded like you just gave up completely, not quit for the night, my mistake. But nowhere in this talk about the flash drive did you say the purpose of it or that any code was on it. FF wrote some code, stuck on the flash drive which was later given to you. Far as I could tell, he gave you a flash drive and the code you already had just worked. See the confusion?
I try to help whenever I can, but I need to understand what's going on first.
Here's the DBC code from the tutorial, but I'd recommend having your friend download the whole zip to the flash drive for you. You can't download the file to the flash drive at school?
Also, note that this code is very outdated when compared to the DBP code, which is what I moved on with while doing the tutorial.
REM VARIABLES
RANDOMIZE TIMER()
depth#=500
screenwidth#=800
screenheight#=600
screenwidth2#=screenwidth#/2
screenheight2#=screenheight#/2
cspd#=6 : `camera x & y movement speed
cyspd#=4 : `camera height movement speed
cy#=350 : `starting camera height position
ScrollSpeed#=6 : `mouse map scroll speed
total_char_amount=100 : `total number of character allowed to be created (CONSTANT)
dim character(total_char_amount,8)
dim characterStats(4,6)
dim characterNames$(4)
active_char_amount=20 : `number of characters currently created on map (increments with each new character created)
matrix_size_x#=2000.0
matrix_size_z#=2000.0
matrix_tile_x#=30.0 : `number of tiles in matrix
matrix_tile_z#=30.0
scalefactor#=screenheight#/1.2
`walkSpeed#=2
MAX_ALLOWED_SELECTED=12 : `maximum number of characters allowed to be selected at one time(demo can only handle 12)
select_range=4
dim these_are_highlighted(12)
dim mapGrid(50,50) : `array to hold map data of the world
rem read DATA into the array
for y=1 to 30
for x=1 to 30
read mapGrid(x,y)
next x
next y
tile_Size_X# = matrix_size_x#/matrix_tile_x# : `size of individual tile
tile_Size_Z# = matrix_size_z#/matrix_tile_z#
rem character
rem 1 - object number
rem 2 - selected = 1, not selected = 0
rem 3 - 1 if unit is moving, 0 if not moving
rem 4 - target x position
rem 5 - target z position
rem 6 - life
rem 7 - type of character
rem 8 - group number, if assigned (0 for no group number)
rem -------------------------------------------
rem character stats characterStats(x,y)
rem x - character number (represents peasant,knight,etc.)
rem y - as follows:
rem 1 - max life
rem 2 - armor
rem 3 - dmg
rem 4 - range
rem 5 - icon image number (for when unit is selected)
rem 6 - walk speed
rem ------------------------------
rem characterNames$(4)
rem 1 - Peasant
rem 2 - Swordsman
rem 3 - Bowman
rem 4 - Knight
characterNames$(1) = "Peasant"
characterNames$(2) = "Swordsman"
characterNames$(3) = "Bowman"
characterNames$(4) = "Knight"
characterStats(1,1)=30
characterStats(1,2)=0
characterStats(1,3)=2
characterStats(1,4)=0
characterStats(1,5)=4
characterStats(1,6)=2
characterStats(2,1)=45
characterStats(2,2)=2
characterStats(2,3)=6
characterStats(2,4)=0
characterStats(2,5)=5
characterStats(2,6)=2
characterStats(3,1)=40
characterStats(3,2)=1
characterStats(3,3)=4
characterStats(3,4)=5
characterStats(3,5)=6
characterStats(3,6)=2
characterStats(4,1)=60
characterStats(4,2)=4
characterStats(4,3)=10
characterStats(4,4)=0
characterStats(4,5)=7
characterStats(4,6)=4
REM SETUP
set display mode screenwidth#,screenheight#,32
sync on
`sync rate 0
backdrop on
color backdrop 0
REM IMAGES
load image "images\grass.jpg", 1
load image "images\ingame_interface.jpg", 2
`load image "newton.bmp",3
load image "images\icon_peasant.pcx",4
load image "images\icon_swordsman.pcx",5
load image "images\icon_bowman.pcx",6
load image "images\icon_knight.pcx",7
load image "images\top menu bar.bmp", 8
load image "images\circle.pcx", 9
REM SOUNDS
load sound "sounds\terrain_click.wav",1
load sound "sounds\invalid.wav", 2
REM MATRIX
make matrix 1,matrix_size_x#,matrix_size_z#,matrix_tile_x#,matrix_tile_z#
prepare matrix texture 1,1,1,1
`randomize matrix 1,75.0
REM OBJECTS
`character highlight object
make object plain 1,100,100
ghost object on 1
lock object on 1
`in-game interface
make object plain 2,800,158
lock object on 2
position object 2,-1,-220,depth#-2
texture object 2, 2
set object 2,1,1,1,0,0,0,0
`random characters
for t=1 to active_char_amount
character(t,7)=rnd(3)+1
if character(t,7) = 4
load object "objects\knightidle.x",9+t
f1=total object frames(9+t)
append object "objects\knightmove.x",9+t,100
f2=total object frames(9+t)
yrotate object 9+t,180
fix object pivot 9+t
scale object 9+t,2000,2000,2000
character(t,1)=9+t
tempx=rnd(matrix_size_x#)
tempz=rnd(matrix_size_z#)
tempy=get ground height(1,tempx,tempz)
position object 9+t,tempx,tempy,tempz
character(t,6)=rnd(characterStats(character(t,7),1))
loop object 9+t,1,f1
else
load object "objects\usaidle.x",9+t
f1=total object frames(9+t)
append object "objects\usamove.x",9+t,100
f2=total object frames(9+t)
yrotate object 9+t,180
fix object pivot 9+t
scale object 9+t,2000,2000,2000
character(t,1)=9+t
tempx=rnd(matrix_size_x#)
tempz=rnd(matrix_size_z#)
tempy=get ground height(1,tempx,tempz)
position object 9+t,tempx,tempy,tempz
character(t,6)=rnd(characterStats(character(t,7),1))
loop object 9+t,1,f1
endif
next t
`selected characters icons (multiple)
for t=1 to MAX_ALLOWED_SELECTED
make object plain 50000+t,64,64
lock object on 50000+t
set object 50000+t,1,1,1,0,0,0,0
hide object 50000+t
next t
counter=0
ypos=-196
for y=1 to 2
xpos=-166
for x=1 to 6
inc counter
position object 50000+counter,xpos,ypos,depth#-3
inc xpos,66
next x
ypos=-263
next y
`selected character icon (single)
make object plain 50013,64,64
lock object on 50013
set object 50013,1,1,1,0,0,0,0
position object 50013,-1,-229,depth#-3
hide object 50013
`random placed trees
for x=1 to 50
load object "objects\gold.3ds", x+1000
tempx#=rnd(matrix_tile_x#)*tile_Size_X#+(tile_Size_X#/2)
tempz#=rnd(matrix_tile_z#)*tile_Size_Z#+(tile_Size_Z#/2)
position object x+1000,tempx#,0,tempz#
mapGrid(get_tile_x#(tempx#, tile_Size_X#),get_tile_x#(tempz#, tile_Size_Z#))=1
yrotate object x+1000,rnd(360)
next x
rem
make object plain 499,804,20
lock object on 499
position object 499, 0,291,500
texture object 499, 8
set object 499,1,1,1,1,0,0,0
make object plain 498,25,25
set object 498,1,0,1,1 ,0,0,0
texture object 498,9
xrotate object 498, 90
rem on-map arrow
load object "objects\arrow.3ds",500
hide object 500
`ghost object on 500
REM -------------------------------- MAIN LOOP ----------------------------
DO
e=character(1,1)
ink rgb(0,255,0),0
position object 498,object position x(e),1,object position z(e)
x#=mousex()-screenwidth2#
y#=screenheight2#-mousey()
if mouseclick()=1 and mouse_selection_activated=0
totalHighlighted = 0
if mousey() < 442
mouse_selection_activated = 1
oldmouse_x = mousex()
oldmouse_y = mousey()
else
gosub _Bottom_Menu_Interface
endif
endif
if mouse_selection_activated=1 and Draw_Highlight=0
if abs(mousey()-oldmouse_y) > 2 or abs(mousex()-oldmouse_x) > 2
Draw_Highlight=1
show object 1
hide mouse
mx1# = mousex()-400
my1# = 300-mousey()
clicking_single=0
else
clicking_single=1
endif
endif
if Draw_Highlight=1
if mousey()>442 then position mouse mousex(), 442
mx2# = mousex()-400
my2# = 300-mousey()
hx#=mx1#+(mx2#-mx1#)/2
hy#=my1#+(my2#-my1#)/2
position object 1,hx#,hy#,depth#
scale object 1,abs(mx1#-mx2#),abs(my1#-my2#),100
endif
if mouseclick()=0
mouse_selection_activated=0
if Draw_Highlight=1
Draw_Highlight=0
hide object 1
show mouse
gosub _Get_Selected_Characters
else
if clicking_single=1
clicking_single=0
gosub _Select_Single_Character
endif
endif
endif
if HighlightedGuy>0
chartype=character(HighlightedGuy,7)
center text 400,470,characterNames$(chartype)
text 205,480,"Health: "+str$(character(HighlightedGuy,6))+"/"+str$(characterStats(chartype,1))
text 205,510,"Armor: "+str$(characterStats(chartype,2))
text 205,540,"Damage: "+str$(characterStats(chartype,3))
text 205,570,"Range: "+str$(characterStats(chartype,4))
endif
if mouseclick()=2 and totalHighlighted>0 and mousey()<442 and mouseclick2_flag=0
mouseclick2_flag=1
gosub _Click_Matrix_Position
targetX#=movex#
targetZ#=movez#
if mapGrid(get_tile_x#(targetx#, tile_Size_X#),get_tile_x#(targetz#, tile_Size_Z#))=0
targetY#=get ground height(1,targetX#,targetZ#)
gosub _Assign_Target_Positions
position object 500,targetX#,targetY#,targetZ#
arrow_flag=1
arrow_rotation=0
show object 500
play sound 1
else
play sound 2
endif
endif
if mouseclick()<>2 then mouseclick2_flag=0
if arrow_flag=1
arrow_rotation = wrapvalue(arrow_rotation+5)
yrotate object 500,arrow_rotation
if arrow_rotation >= 170 then arrow_flag=0:hide object 500
endif
for t=1 to active_char_amount
obj=character(t,1)
if character(t,3)=1
tx#=character(t,4)
tz#=character(t,5)
temp_charx#=object position x(obj)
temp_charz#=object position z(obj)
position object obj,temp_charx#,get ground height(1,temp_charx#,temp_charz#),temp_charz#
point object obj,tx#,object position y(obj),tz#
move object obj,characterStats(character(t,7),6)
if ObjectFromTargetDistance#(obj,tx#,tz#) <= 5.0
character(t,3)=0
set object speed obj,10
set object frame obj,1
loop object obj,1,f1
endif
endif
if character(t,2)=1 and character(t,8)>0
text object screen x(obj),object screen y(obj),str$(character(t,8))
endif
next t
gosub _Assign_Group_Number
if controlkey() = 0 then gosub _Get_Selected_Group
set cursor 0,0
print mousex()
print mousey()
print 400+mx1#
print 300-my1#
print "FPS: ",screen fps()
print "Poly count: ",statistic(1)
print "# of units highlighted: ",totalHighlighted
print get_tile_x#(targetX#, tile_Size_X#)
print get_tile_z#(targetZ#, tile_Size_Z#)
gosub _Mouse_Scroll_Map
gosub _Control_Camera
sync
LOOP
REM CAMERA CONTROL AND MOVEMENT -------------------------------------------
_Control_Camera:
if upkey() then inc cz#,cspd#
if downkey() then dec cz#,cspd#
if rightkey() then inc cx#,cspd#
if leftkey() then dec cx#,cspd#
if scancode()=30 then inc cy#,cyspd#
if scancode()=44 then dec cy#,cyspd#
if cy#>400 then cy#=400
if cy#<200 then cy#=200
position camera cx#,cy#,cz#
offsetx#=cx#
offsety#=0
offsetz#=cz#+300
point camera offsetx#,offsety#,offsetz#
RETURN
REM gets co-ordinates on matrix of where mouse was clicked
_Click_Matrix_Position:
mouseposx#=mousex()-screenwidth2#
mouseposy#=screenheight2#-mousey()
dist#=sqrt((camera position x()-offsetx#)^2+(camera position y()-offsety#)^2+(camera position z()-offsetz#)^2)
if mouseposy#<>0
vectorang#=atanfull(scalefactor#,mouseposy#)
else
vectorang#=90.0
endif
if vectorang#+camera angle x()>90.965
ratio#=mouseposy#/(sin((vectorang#+camera angle x() )-90.0))
cursorposy#=ratio#*sin(180.0-vectorang#)
else
cursorposy#=1000000.0
endif
hyplength#=scalefactor#/sin(vectorang#)
cursorposx#=(((ratio#*sin(90.0-camera angle x() ))/hyplength#)+1.0)*mouseposx#
if mouseposx#<>0
angtotal#=wrapvalue(camera angle y()-atanfull(mouseposy#,mouseposx#))
else
if mouseposy#<0
angtotal#=wrapvalue(camera angle y()+90.0)
else
angtotal#=wrapvalue(camera angle y()-90.0)
endif
endif
cameraang#=wrapvalue(360.0-camera angle y() )
cosang#=cos(cameraang#)
sinang#=sin(cameraang#)
movex#=(dist#/scalefactor#)*((cosang#*cursorposx#)+((-1*sinang#)*cursorposy#))
movez#=(dist#/scalefactor#)*((sinang#*cursorposx#)+(cosang#*cursorposy#))
`\\\ 3D translated coords from 2D mouse coords \\\
movex#=movex#+offsetx#
movez#=movez#+offsetz#
movey#=0
RETURN
REM Returns the name of the specified character type
function GetCharacterName(chartype)
endfunction characterNames$(chartype)
REM Returns the maximum life of the specified character type
function getCharacterMaxLife(chartype)
endfunction characterStats(chartype,1)
REM Returns the armor number of the specified character type
function getCharacterArmor(chartype)
endfunction characterStats(chartype,2)
REM Returns the damage number of the specified character type
function getCharacterDamage(chartype)
endfunction characterStats(chartype,3)
REM Returns the range of the specified character type
function getCharacterRange(chartype)
endfunction characterStats(chartype,4)
REM Returns the character's current amount of life
function getCharacterLife(character_number)
endfunction character(character_number,6)
REM Handles mouse events over the bottom menu
_Bottom_Menu_Interface:
RETURN
REM Check to see if a character is under the mouse when it was clicked
_Select_Single_Character:
foundOne=0
HighlightedGuy=0
for t=1 to 13
hide object 50000+t
next t
for t=1 to active_char_amount
objx#=object screen x(character(t,1))
objy#=object screen y(character(t,1))
if mousex()>objx#-select_range and mousex()<objx#+select_range and mousey()>objy#-select_range and mousey()<objy#+select_range and foundOne=0
foundOne=1
` color object character(t,1), rgb(255,0,0)
character(t,2)=1
show object 50013
texture object 50013,characterStats(character(t,7),5)
HighlightedGuy=t
else
character(t,2)=0
` color object character(t,1), rgb(255,255,255)
endif
next t
RETURN
REM Check for which characters have been highlighted by the mouse selection
REM And finds center co-ordinates of that selection (used for movement formation)
_Get_Selected_Characters:
tx1# = mx1#+400
tx2# = mx2#+400
ty1# = 300-my1#
ty2# = 300-my2#
`\\\ this variable counts up in the loop below to make sure we dont highlight \\\
`\\\ more characters than we want (in this case, limit is 12 selected characters) \\\
totalHighlighted=0
HighlightedGuy=0
initializeFlag=0
`\\\ hide all character icons \\\
for t=1 to 13
hide object 50000+t
next t
`\\\ run through all active characters on the map \\\
for t=1 to active_char_amount
obj=character(t,1)
if CharacterHighlighted(obj,tx1#,ty1#,tx2#,ty2#)=1 and totalHighlighted<12
gosub _Char_Object_Selected
else
gosub _Char_Object_Not_Selected
endif
next t
`\\\ Calculate center coords for selected units
selectionCenterX#=SCMinX+abs(SCMinX-SCMaxX)/2
selectionCenterZ#=SCMinZ+abs(SCMinZ-SCMaxZ)/2
RETURN
REM will determine if the object specified is within the defined box
REM returns 1 if true, 0 if false
function CharacterHighlighted(obj_num,hmx1#,hmy1#,hmx2#,hmy2#)
ok=0
xok=0
yok=0
if hmx1#<hmx2#
if object screen x(obj_num)>hmx1# and object screen x(obj_num)<hmx2# then xok=1
else
if object screen x(obj_num)>hmx2# and object screen x(obj_num)<hmx1# then xok=1
endif
if hmy1#<hmy2#
if object screen y(obj_num)>hmy1# and object screen y(obj_num)<hmy2# then yok=1
else
if object screen y(obj_num)>hmy2# and object screen y(obj_num)<hmy1# then yok=1
endif
if xok=1 and yok=1 then ok=1
endfunction ok
REM Activates movement flag in the character array
REM Translates target coordinates so characters keep same formation
REM Assigns the new target coordinates
_Assign_Target_Positions:
SCMinX = object position x(SCMinXObject)
SCMaxX = object position x(SCMaxXObject)
SCMinZ = object position z(SCMinZObject)
SCMaxZ = object position z(SCMaxZObject)
selectionCenterX#=SCMinX+abs(SCMinX-SCMaxX)/2
selectionCenterZ#=SCMinZ+abs(SCMinZ-SCMaxZ)/2
for t=1 to active_char_amount
if character(t,2)=1
character(t,3)=1
obj=character(t,1)
targetOffsetX#=object position x(obj)-selectionCenterX#
targetOffsetZ#=object position z(obj)-selectionCenterZ#
character(t,4)=targetX#+targetOffsetX#
character(t,5)=targetZ#+targetOffsetZ#
set object speed obj,30
set object frame obj,100
loop object obj,105,f2
endif
next t
RETURN
REM calculates how far a character is from its targeted position
function ObjectFromTargetDistance#(obj_num,tx#,tz#)
dist#=sqrt((object position x(obj_num)-tx#)^2 + (object position z(obj_num)-tz#)^2)
endfunction dist#
REM Assigns group number specified to the current selected units
_Assign_Group_Number:
if controlkey()
number=scancode()
endif
select number
case 2 : UN=1 : endcase
case 3 : UN=2 : endcase
case 4 : UN=3 : endcase
case 5 : UN=4 : endcase
case 6 : UN=5 : endcase
case 7 : UN=6 : endcase
case 8 : UN=7 : endcase
case 9 : UN=8 : endcase
case 10: UN=9 : endcase
case default : UN=0 : endcase
endselect
if UN > 0
for t=1 to active_char_amount
if character(t,2)=1
character(t,8)=UN
else
if character(t,8)=UN then character(t,8)=0
endif
next t
endif
RETURN
REM
_Get_Selected_Group:
number = scancode()
select number
case 2 : UN=1 : endcase
case 3 : UN=2 : endcase
case 4 : UN=3 : endcase
case 5 : UN=4 : endcase
case 6 : UN=5 : endcase
case 7 : UN=6 : endcase
case 8 : UN=7 : endcase
case 9 : UN=8 : endcase
case 10: UN=9 : endcase
case default : UN=0 : endcase
endselect
if UN > 0
`\\\ this variable counts up in the loop below to make sure we dont highlight \\\
`\\\ more characters than we want (in this case, limit is 12 selected characters) \\\
totalHighlighted=0
HighlightedGuy=0
initializeFlag=0
`\\\ hide all character icons \\\
for t=1 to 13
hide object 50000+t
next t
for t=1 to active_char_amount
obj=character(t,1)
if character(t,8) = UN
gosub _Char_Object_Selected
else
gosub _Char_Object_Not_Selected
endif
next t
`\\\ Calculate center coords for selected units
selectionCenterX#=SCMinX+abs(SCMinX-SCMaxX)/2
selectionCenterZ#=SCMinZ+abs(SCMinZ-SCMaxZ)/2
endif
RETURN
REM
_Char_Object_Selected:
inc totalHighlighted
show object 50000+totalHighlighted
texture object 50000+totalHighlighted, characterStats(character(t,7),5)
character(t,2)=1
`\\\ must initialize these variables once each time they are being recalculated \\\
if initializeFlag=0
SCMinX=object position x(obj)
SCMaxX=object position x(obj)
SCMinZ=object position z(obj)
SCMaxZ=object position z(obj)
initializeFlag=1
SCMinXObject=obj
SCMaxXObject=obj
SCMinZObject=obj
SCMaxZObject=obj
endif
`\\\ Find min and max coords on X and Z axis \\\
if object position x(obj) < SCMinX then SCMinX=object position x(obj):SCMinXObject=obj
if object position x(obj) > SCMaxX then SCMaxX=object position x(obj):SCMaxXObject=obj
if object position z(obj) < SCMinZ then SCMinZ=object position z(obj):SCMinZObject=obj
if object position z(obj) > SCMaxZ then SCMaxZ=object position z(obj):SCMaxZObject=obj
RETURN
REM
_Char_Object_Not_Selected:
character(t,2)=0
RETURN
REM Scroll map according to mouse
_Mouse_Scroll_Map:
if mousex() < 1 then dec cx#,ScrollSpeed#
if mousex() > 798 then inc cx#,ScrollSpeed#
if mousey() > 598 then dec cz#,ScrollSpeed#
if mousey() < 1 then inc cz#,ScrollSpeed#
RETURN
REM Returns the X number for the mapGrid array, based on a world X coordinate
REM worldX_coord# = world X coordinate
REM tileSizeX# = size for each tile in the grid
function get_tile_x#(worldX_coord#, tileSizeX#)
endfunction int(worldX_coord#/tileSizeX#) + 1
REM Returns the Z number for the mapGrid array, based on a world Z coordinate
REM worldZ_coord# = world Z coordinate
REM tileSizeZ# = size for each tile in the grid
function get_tile_z#(worldZ_coord#, tileSizeZ#)
endfunction int(worldZ_coord#/tileSizeZ#) + 1
REM Data used to build a grid-based map system
REM 0 - passable (grass, road, etc.)
REM 1 - not passable (ridges, other world obstacles)
REM 2 - tree
REM 3 -
REM 4 -
REM 5 - wall
REM 6 - building
map_data:
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
"Using Unix is the computing equivalent of listening only to music by David Cassidy" - Rob Pike