RelLib Documentation
Created December 28,2001
VERSION 5.0(Jul.
16, 2004) Pls. Read Readme.TXT for a summary of additions......
VERSION
4.1(Sept. 1, 2003) VERSION 4(July 9,2003)
VERSION
3.2(May 11,2003)
VERSION
3.0(September 22,2002)
VERSION 2.0(June
11,2002)
Description: RelLib is a VERY FAST Screen 13 Game
Programming library made mostly in assembly.
This was made with only one thing in mind: SPEED!!!( at least with the
speed intensive routines :) ie Sprites!.
I made the Sprite routines and some other speed intensive routines as
fast as I can. And also made them
support clipping ;-). But one thing I
discovered while making this Beta version is, IT COULD ALWAYS GET BETTER!!!!!
So if any of you could make my routines faster, I would like to hear from
you. :) I'm just learning the joy and torture of ASM programming but I
made this with all of what I can give you as of the moment. I also made this to use PP256's powerful
features and is compatible with QB's GET and PUT statements. :)
*And
because all of the OBJs are Independent of each other, you can add any of
RelLib's routines
to any lib of your choice. ;*)
Developer:
Richard Eric M. Lope BSN RN aka Relsoft/Genso Sanzo
Email:
vic_viperph@yahoo.com
Degree: BS
Nursing
SMS: +6391730219557
Address: Blk
36, Lot 8, Florvel Homes Subdv. Buray, Oton, Iloilo, Philippines
Site: Http://Rel.BetterWebber.com
Current
Projects:
Frantic Journey - A space shooter
ala Gradius(Adigun, Eebs, and Beta)
RelLib
AFlib -RelLib in CALL ABSOLUTE
format( with L_O_J)
Dwoods3 (Jocke and Jofers)
Disclaimer: I am in no
way responsible to any effects of this game development utility to your
life.Blah,Blah,Blah,Blah.........
Use
this routines as much as you want. If
you could make something out of this,
I would love to hear from you. You could also
email your games to me.
No
sound routine is going to be included with this and any future updates of
RelLib.
Why?
Aside from the fact that I Don't have a speaker, I have found the best to be
DS4QB++ by Lithium.
History: Started
making my Pset routine November 28,2001......
Note: This library
came into being when the artist I was working on with Frantic Journey, Eero Pitkanen(Finland), wanted to have
translucency in our sprites. As we are
using COSMOX, and CosmoX uses
blender maps for translucency, and I hate blender maps(they're memory hogs), I
decided that the best way is to make a CosmoX compatible translucent
routine. I already know a lot of
translucency algorithms so I assumed that it would be easy for me to make it in
ASM......... I was wrong.
So I searched the net for some useful
info regarding assembly programming.
Well, the best introductory tutorial I have found is from CGI JOE of Shimmer Ribbonsoft(They also developed a Great Library: RSVGALib). I also have some pure QB double buffering routines that I have
converted into ASM code. ex. are the Sprite Routines. And it really was a pain
to convert. Coded this entirely on a 486 and prevented as much AGI's as I can
so this would run better on a Pentium.
BTW. Don’t forget to check out other Libs. My personal recommendation: UGL. The fastest lib out there!!! Made by
V1ctor
and Blitz.
Requirements:
*386 or better CPU
*Qb4.5(but would work with VBDOS and
QB7.1)
*VGA monitor
To USE:
*Type QB/L Rel/ah
Important!!!!!!!!!!!!
For Procedures/Subs/Functions which
uses/writes/draws anything to the VIDEO
BUFFER ie PAGES, The First parameter is always the DESTINATION buffer/segment. I have done
this to prevent crashes and for this library to be EASY to learn and use.
ex:
RelPcopy VIDEO,Varseg(Vpage(0))
'copies the contents of
VPAGE to the VIDEO screen
RelPset
Varseg(Vpage(0)),10,10,15
'puts a pixel to Vpage
at position 10,10 color 15
RelSpriteTrans VIDEO,100,100,Varseg(PicArray(0)),Varptr(PicArray(0))
'puts a Sprite(PicArray)
on the Screen at position 100,100 translucently
Procedure and
function Summary:
SUBS/FUNCTIONS
with (**) need a gradient palette to work well ie Translucency. Use pp256 to simplify things. :)
For
best translucency results, use a 16 color gradient palette. :)
*Note
that PP256 segment starts from 1 not zero.
'/==============SCREEN
SWITCHING===================================
DECLARE SUB
RelInitVGA13 ()
Description: Initializes the screen to SCREEN 13
How to Use: RelInitVGA13
Notes: Like most of the third party
libs, you could not use some of QB's GFX statements
after you do this. You could alternately use SCREEN 13 if
you like and the libs
routine won't complain,
but this would make your exe's smaller.
DECLARE SUB
RelInitText ()
Description: Initializes the screen to SCREEN 0, width 80
How to Use: RelInitText
'/===============SCREEN
BUFFER======================================
DECLARE SUB
RelPCopy (BYVAL DestSeg%, BYVAL SrcSeg%)
Description: Copies the contents of SrcSeg% to DestSeg%
How to Use: RelPcopy
VIDEO,Varseg(Vpage(0))
*copies the
contents of Vpage to the Screen
Notes: Solid Copy, Very Fast!!!!
DECLARE SUB
RelPcopyTrans (BYVAL DestSeg%, BYVAL SrcSeg%)
Description: Copies the contents of SrcSeg% to DestSeg% skipping color 0
How to Use: RelPcopyTrans
VIDEO,Varseg(Vpage(0))
*copies the
contents of Vpage to the Screen
Notes: Transparent Copy Used for
multiple layered maps and parallax scrolling
**DECLARE SUB
RelPcopyTransB (BYVAL DestSeg%, BYVAL SrcSeg%)
Description: Copies the contents of SrcSeg% to DestSeg% skipping color 0 and
Translucently
How to Use: RelPcopyTransB
VIDEO,Varseg(Vpage(0))
*copies the
contents of Vpage to the Screen
Notes: Transparent Copy with
translucency. Used for translucent map layers ie.
Waterfalls,Netlike
Structures, some other kewl FX you can think of. ;-)
**DECLARE SUB
RelPcopyBlended (BYVAL DestSeg%, BYVAL SrcSeg%)
Description: Copies the contents of SrcSeg% to DestSeg% Translucently
How to Use: RelPcopyBlended
VIDEO,Varseg(Vpage(0))
*copies the
contents of Vpage to the Screen
Notes: Solid Copy with translucency.
Used for translucent map layers ie. Waterfalls,Netlike
Structures, some other
kewl FX you can think of. ;-)
DECLARE SUB
RelPCopySF (BYVAL DestSeg%, BYVAL SrcSeg%)
Description: Copies the contents of SrcSeg% to DestSeg% only if the color of a particular
pixel is 0
How to Use: RelPcopySF
VIDEO,Varseg(Vpage(0))
*copies the
contents of Vpage to the Screen(puts a Pixel only if the color
of the
DestSeg is ZERO
Notes: SF stands for See Forth . Useful for collission detection and some other cool fx.
Made this with slower
computers in mind. You don't have to
make an extra layer
for your collide
layer. Using this routine, you could
draw your FOREGROUND first
using Pcopy, check for
COLLISION, then Draw your BACKGROUND Layer
afterwards using
RelPcopySF. That way you don't need an extra collision layer.
**DECLARE SUB
RelPCopyGamma (BYVAL DestSeg%, BYVAL SrcSeg%, BYVAL _
GammaVal%)
Description: Copies the contents of SrcSeg% to DestSeg% transparently. Darkening ot
Lightening
depending on GammaVal (Neg(+)=darken,
Pos(+)=lighten)
How to Use: RelPcopyGamma VIDEO,Varseg(Vpage(0)),5
*copies the
contents of Vpage to the Screen lightening by 5 gamma
displacement
Notes: Same as the Effect you see in
some RPG games. Darkening when night and
lightening when
days. You could save tiles this
way(therefore saving memory).
More dynamic than
Palette rotation since you could use all the colors that
you want.
DECLARE SUB
RelCompress (BYVAL DestSeg%, BYVAL DestOff%, BYVAL SrcSeg%)
Description: Copies the contents of SrcSeg% to DestSeg% compressing into half a
screen
How to Use: RelCompress
VIDEO,Varseg(Vpage(0))
*copies the
contents of Vpage to the Screen compressed in half
Notes: *The Idea came from RSVGALIB by CGI JOE. Just thought to
include it here since
I found it to be very
COOOOL!
DECLARE SUB
RelXCompress (BYVAL DestSeg%, BYVAL DestOff%, BYVAL SrcSeg%,_
BYVAL
SrcOff%, BYVAL PERCENT%)
Description: Copies the contents of SrcSeg% to DestSeg% compressing the buffer
(extended)
How to Use: RelXCompress
VIDEO,Varseg(Vpage(0))
*copies the
contents of Vpage to the Screen compressed in percentage
basis(1 to
100)
Notes: *The Idea came from RSVGALIB by CGI JOE. Just thought to
include it here since
I found it to be very
COOOOL! Still some polishing needed since its buggy at the
moment(Fixed point Math)
DECLARE SUB
RelCLS (BYVAL DestSeg%, BYVAL C%)
Description: Clears DestSEG% to color C%
How to Use: RelCLS
Varseg(Vpage(0)),15
*Clears the
contents of the buffer(Vpage) to color 15
Notes:
uhmmmmmmmmm................nothing. :)
DECLARE SUB
RelPageSwap (BYVAL DestSeg%, BYVAL SrcSeg%)
Description: Swaps/Exchanges the contents of SrcSeg% to DestSeg%
How to Use: RelPageSwap
VIDEO,Varseg(Vpage(0))
*the
contents of the Screen is exchanged with the buffer after the call
Notes: can be used for Intro's some
other cool stuff like in Metal Slug 3
DECLARE SUB
RelCopyLineH (BYVAL DestSeg%, BYVAL SrcSeg%, BYVAL Ypos%)
Description: Copies one horizontal line from SrcSeg to DestSeg in Ypos(Y
coordinate)
How to Use: RelCopyLineH VIDEO,Varseg(Vpage(0)),10
*Copies a
line of GFX from the buffer to the Screen in row 10
Notes: Lot's of uses(Intros and
Endings),Supports Clipping
DECLARE SUB
RelCopyLineV (BYVAL DestSeg%, BYVAL SrcSeg%, BYVAL Xpos%)
Description: Copies one Vertical line from SrcSeg to DestSeg in Xpos(X
coordinate)
How to Use: RelCopyLineX
VIDEO,Varseg(Vpage(0)),100
*Copies a
line of GFX from the buffer to the Screen in column 100
Notes: Lot's of uses(Intros and
Endings),Supports Clipping
DECLARE SUB
RelCopyBlock (BYVAL DestSeg%, BYVAL SrcSeg%, BYVAL X1%, BYVAL_
Y1%,
BYVAL X2%, BYVAL Y2%)
Description: Copies a block of GFX from SrcSeg to DestSeg starting at
coordinate (X1,Y1) -
(X2,Y2)
How to Use: RelCopyBlock
VIDEO,VARSEG(Vpage(0)),10,10,100,100
Notes: Used to Restore the
background for NON-Scrolling games, this way is faster since
you only have to restore
the block at the players position.
Clipping is supported
and swaps the values if
X1>X2 or Y1>Y2. So you wont crash
your computer. :)
**DECLARE SUB RelGammaBlock (BYVAL DestSeg%, BYVAL X1%,
BYVAL Y1%, BYVAL X2%, BYVAL_
Y2%, BYVAL GammaVal%)
Description: Copies a block of GFX from SrcSeg to DestSeg starting at
coordinate (X1,Y1) -
(X2,Y2)
Darkening or
lightening depending on GammaVal(negative
value=Darken,Positive
Value=Lighten
How to Use: RelGammaBlock
VIDEO,VARSEG(Vpage(0)),10,10,100,100,-5
Notes: Gives the effect that you see
in SNES FinalFantasy 3, Caves, Lights, etc.
DECLARE SUB
RelWrapX (BYVAL DESTSEG%, BYVAL SrcSeg%, BYVAL X%)
Description: Scrolls the source layer and puts it in the dest layer
How to Use: RelWrapX Layer,Layer2,X
Notes: Very good for scrolling BG. X
is Modded by 320. See ExampleFile Wrap.Bas
'/==============DRAWING
PRIMITIVES=================================
DECLARE SUB
RelPset (BYVAL DestSeg%, BYVAL X%, BYVAL Y%, BYVAL C%)
Description: Puts a pixel on DestSeg at location X,Y color C
How to Use: RelPset VIDEO,10,10,15
Notes: Same as QB's Pset
routine. Clipping is supported but
still very fast(only one shift)!
DECLARE SUB
RelPsetWu (Layer%, x!, y!, clr%)
Description: Puts a pixel on DestSeg at location X,Y color C (Anti-Aliiased)
How to Use: RelPsetWu VIDEO,10,10,15
Notes: Makes pixel movement very
natural
DECLARE SUB
RelPsetWu16 (Layer%, x!, y!, clr%)
Description: Puts a pixel on DestSeg at location X,Y color C (Anti-Aliiased)
supports more colors!!!
How to Use: RelPsetWu16
VIDEO,10,10,15
Notes: Makes pixel movement very
natural
DECLARE SUB
RelPsetF (BYVAL DestSeg%, BYVAL X%, BYVAL Y%, BYVAL C%)
Description: Puts a pixel on DestSeg at location X,Y color C
How to Use: RelPsetF VIDEO,10,10,15
Notes: Same as QB's Pset
routine. Clipping is NOT supported
*the fastest PSET
routine I had seen is from CGI Joe's Tute. But this one's pretty
HOT itself.
**DECLARE SUB
RelPsetTrans (BYVAL DestSeg%, BYVAL X%, BYVAL Y%, BYVAL C%)
Description: Puts a pixel on DestSeg at location X,Y color C, TRANSLUCENTLY
How to Use: RelPsetTrans
VIDEO,10,10,15
Notes: Same as QB's Pset routine
only puts the pixel translucently.
Clipping is supported
DECLARE SUB
RelBoxF (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL_
Y2%,
BYVAL C%)
Description: Draws a FILLED Box at X1,Y1,X2,Y2
How to Use: RelBoxF
VIDEO,10,10,200,100,25
Notes: Supports Clipping, and Swaps
the values if X1>X2 or Y1>Y2 so no problem with
crashes
**DECLARE SUB
RelBoxTransF (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%, BYVAL X2%,_
BYVAL
Y2%, BYVAL C%)
Description: Draws a FILLED Box at X1,Y1,X2,Y2 TRANSLUCENTLY!
How to Use: RelBoxTransF
VIDEO,10,10,200,100,50
Notes: Supports Clipping, and Swaps
the values if X1>X2 or Y1>Y2 so no problem with
crashes. Useful for RPG dialog boxes and
color-scaling a region of screen.
**DECLARE SUB
RelBoxTrans (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%, BYVAL X2%,_
BYVAL
Y2%, BYVAL C%)
Description: Draws a Box at X1,Y1,X2,Y2 TRANSLUCENTLY!
How to Use: RelBoxTrans
VIDEO,10,10,200,100,200
Notes: Supports Clipping, and Swaps
the values if X1>X2 or Y1>Y2 so no problem with
crashes. Useful for RPG dialog boxes and color-scaling a region of
screen.
DECLARE SUB
RelBox (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL_
Y2%, BYVAL
C%)
Description: Draws a Box at X1,Y1,X2,Y2
How to Use: RelBoxTrans
VIDEO,10,10,200,100,10
Notes: Supports Clipping, and Swaps
the values if X1>X2 or Y1!>Y2 so no problem with
crashes.
DECLARE SUB
RelLine (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%, BYVAL_
X2%,BYVALY2%,
BYVAL C%)
Description: Draws a Diagonal line line on DestSeg% at X1,Y1,X2,Y2 color C
How to Use: RelLine VIDEO,10,100,300,199,15
Notes: Supports Clipping, and swaps
values if X1>X2 or Y1>Y2, so no crashes will occur.
Uses Bresenham..;-)
**DECLARE SUB
RelLineT (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%, BYVAL X2%,BYVAL_
Y2%,
BYVAL C%)
Description: Draws a Diagonal line line on DestSeg% at X1,Y1,X2,Y2 color C,
TRANSLUCENTLY
How to Use: RelLineT VIDEO,10,100,300,199,15
Notes: Supports Clipping, and swaps
values if X1>X2 or Y1>Y2, so no crashes will occur.
Uses
Bresenham..;-)
DECLARE SUB
RelLineH (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL_
C%)
Description: Draws a horizontal line on DestSeg% at X1,Y1,X2 color C
How to Use: RelLineH VIDEO,10,100,300,15
Notes: Supports Clipping, and swaps values
if X1>X2, so no crashes will occur.
DECLARE SUB
RelLineV (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%, BYVAL Y2%, BYVAL_
C%)
Description: Draws a Vertical line on DestSeg% at X1,Y1,Y2 color C
How to Use: RelLineH VIDEO,10,10,150,15
Notes: Supports Clipping, and swaps
values if Y1>Y2, so no crashes will occur.
**DECLARE SUB
RelLineTransV (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%, BYVAL Y2%,_
BYVAL
C%)
Description: Draws a Vertical line on DestSeg% at X1,Y1,Y2 color C Translucently!
How to Use: RelLineH VIDEO,10,10,150,15
Notes: Supports Clipping, and swaps
values if Y1>Y2, so no crashes will occur.
**DECLARE SUB
RelLineTransH (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%, BYVAL X2%,_
BYVAL
C%)
Description: Draws a horizontal line on DestSeg% at X1,Y1,Y2 color C
TransLucently
How to Use: RelLineH VIDEO,10,10,150,15
Notes: Supports Clipping, and swaps
values if Y1>Y2, so no crashes will occur.
'/===================SPRITE===========================================
DECLARE SUB
RelSprite (BYVAL DestSeg%, BYVAL X%, BYVAL Y%, BYVAL SPRITESEGMENT%, BYVAL_
SPRITEOFFSET%)
Description: Draws a Sprite on Destseg at coordinate X,Y. Skips color 0
Compatible
with QB's Get routine :)
How to Use: RelSprite
VIDEO,10,10,VARSEG(SpriteArray(0)),VARPTR(SpriteArray(Offset))
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10
skipping color 0
Notes: Try and test this againts the
lib your using to see which is faster.
This one is
extremely fast! Used for
games. :)
*SUPPORTS
CLIPPING!!!!!
DECLARE SUB RelSpriteSolid (BYVAL DestSeg%, BYVAL X%, BYVAL
Y%, BYVAL SPRITESEGMENT%, BYVAL_
SPRITEOFFSET%)
Description: Draws a Sprite on Destseg at coordinate X,Y. Solidly
Compatible
with QB's Get routine :)
How to Use: RelSpriteSolid
VIDEO,10,10,VARSEG(SpriteArray(0)),VARPTR(SpriteArray
(Offset))
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10
Notes: Try and test this againts the
lib your using to see which is faster.
This one is
extremely fast! Used for
games. :) Also try to see the ASM source(Asm guys) for
moving Dwords even on
ODD width Sprites without using a JUMP. :) I
don't know if someone
already knew the algorithm I used with this(Xloop) but it will
be nice to know.
*SUPPORTS CLIPPING!!!!!
DECLARE SUB RelSpriteFast (BYVAL DestSeg%, BYVAL X%, BYVAL
Y%, BYVAL SPRITESEGMENT%, BYVAL_
SPRITEOFFSET%)
Description: Draws a Sprite on Destseg at coordinate X,Y. SOLIDLY
Compatible
with QB's Get routine :)
How to Use: RelSpriteFast
VIDEO,10,10,VARSEG(SpriteArray(0)),VARPTR(SpriteArray_
(Offset))
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate 10,10
skipping color 0
Notes: NO Support for Clipping!!! So
beware!!!! Probably useless since there is little
difference speedwise
with RelSpriteSolid.
**DECLARE SUB RelSpriteTrans (BYVAL DestSeg%, BYVAL X%,
BYVAL Y%, BYVAL SPRITESEGMENT%,_
BYVAL
SPRITEOFFSET%)
Description: Draws a Sprite on Destseg at coordinate X,Y. Skips color 0 and draws it
TRANSLUCENTLY!!!
Compatible
with QB's Get routine :)
How to Use: RelSpriteTrans
VIDEO,10,10,VARSEG(SpriteArray(0)),VARPTR(SpriteArray
(Offset))
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10
skipping color 0
Notes: Cool for See-Thru sprite FX,
Ghosts, translucent map Layers,Lasers...ETC. Still
very
Fast(Used in Space Impact)
*SUPPORTS CLIPPING!!!!!
DECLARE SUB RelSpriteSF (BYVAL DestSeg%, BYVAL X%, BYVAL Y%,
BYVAL SPRITESEGMENT%, BYVAL_
SPRITEOFFSET%)
Description: Draws a Sprite on Destseg at coordinate X,Y. Only Draws the Pixel
id the
color at
DESTSEG is ZERO.
Compatible
with QB's Get routine :)
How to Use: RelSpriteSF
VIDEO,10,10,VARSEG(SpriteArray(0)),VARPTR(SpriteArray
(Offset))
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10
skipping color 0
Notes: Used for Memory Deficient
computers and RPG's ie. entering houses.
Also for
BACKWARD
rendering. See RelPcopySF for more
details.
*SUPPORTS CLIPPING!!!!!
DECLARE SUB RelSpriteColor (BYVAL DestSeg%, BYVAL X%, BYVAL
Y%, BYVAL SPRITESEGMENT%, BYVAL_
SPRITEOFFSET%,
BYVAL C%)
Description: Draws a Sprite on Destseg at coordinate X,Y. Skips color 0 and draws the
sprite in
one single color(C) ie Outline of Sprite. Compatible with QB's Get
routine :)
How to Use: RelSpriteColor
VIDEO,10,10,VARSEG(SpriteArray(0)),VARPTR(SpriteArray
(Offset)),31
*Draws the
Sprite at 10,10 using color 31
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10
skipping color 0
Notes: Used for collision detection
and used to "FLASH" the sprite when hit.
*SUPPORTS CLIPPING!!!!!
DECLARE SUB RelSpriteColorX (BYVAL DestSeg%, BYVAL X%, BYVAL
Y%, BYVAL SPRITESEGMENT%,_
BYVAL
SPRITEOFFSET%, BYVAL C%, BYVAL STARTC%)
Description: Draws a Sprite on Destseg at coordinate X,Y. Skips color 0 and draws the
sprite in
one single color(C) ie Outline of Sprite.
Will only draw the PIXEL
if the pixel
in the Sprite is >=StartC%, more dynamic than RelSpriteColor.
Compatible
with QB's Get routine :)
How to Use: RelSpriteColorX
VIDEO,10,10,VARSEG(SpriteArray(0)),VARPTR(SpriteArray
(Offset)),31,128
*Draws the
Sprite at 10,10 using color 31 only if the SpriteColor >=color
128
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10
skipping color 0
Notes: Used for collision detection
and used to "FLASH" the sprite when hit. Also to make
collision detection more
dynamic. That way you could divide your
colors into 2
sections(0 to 127=no
collide and 128-255=collide) then draw them appropriately in
you collision layer.
*SUPPORTS CLIPPING!!!!!
DECLARE SUB RelSpriteSolidX (BYVAL DestSeg%, BYVAL SrcSeg%,
BYVAL X1%, BYVAL Y1%, BYVAL X2%,_
BYVAL
Y2%, BYVAL NewX%, BYVAL NewY%)
Description: Draws a block of image from SrcSeg at X1,Y1,X2,Y2 to DestSeg at
NewX,NewY
Same as:
Get(X1,Y1)-(X2,Y2),Array
Put(NewX,NewY),
Array
*But doesn't
use array to hold the data.
How to Use: RelSpriteSolidX
VIDEO,VARSEG(Vpage(0)),10,10,45,45,100,100
*Gets a
block of image at Vpage on coordinates X1,Y1,X2,Y2 and puts it
onScreen at
corrdinates 100,100
Notes: Useful for SCROLLING, restoring
the background on scrolling games, anything that
moves. :)
*Swaps the coordinates
if X1>X2 or Y1>Y2. So less
crashes. NO Clipping is
supported with NEWX and
NEWY so use with caution.
**DECLARE SUB RelSpriteGamma (BYVAL DestSeg%, BYVAL X%,
BYVAL Y%, BYVAL SPRITESEGMENT%,_
BYVAL
SPRITEOFFSET%, BYVAL GammaVal%)
Description: Draws a Sprite on Destseg at coordinate X,Y. Skips color 0 and draws the
sprite
depending on the value of GammaVal
(Neg(-)=Darken,Pos(+)
=Lighten)
Compatible
with QB's Get routine :)
How to Use: RelSpriteGamma
VIDEO,10,10,VARSEG(SpriteArray(0)),VARPTR(SpriteArray
(Offset)),6
*Draws the
Sprite at 10,10 lightening its colors by 6 gamma displacement
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10
skipping color 0
Notes: Used for Shadows and ghosts.
Anything you want! :)
*SUPPORTS CLIPPING!!!!!
DECLARE SUB RelSpriteRotate (BYVAL DESTSEG%, BYVAL X%, BYVAL
Y%, BYVAL ANGLE%, BYVAL_
SPRSEG%,
BYVAL SPROFF%)
Description: Draws a Sprite on Destseg at coordinate X,Y. Skips color 0 and Rotates it
according to
the ANGLE
Compatible
with QB's Get routine :)
How to Use: RelSpriteRotate
VIDEO,10,10,100,VARSEG(SpriteArray(0)),VARPTR
(SpriteArray(Offset)),6
*Draws the
Sprite at 10,10 rotating it 100 degrees
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10
skipping color 0
Notes: Used to make a sprite Rotate
to simplify things. Angle must be in
the range of 0-
359
*SUPPORTS CLIPPING!!!!!
**DECLARE SUB RelSpriteRotateTrans (BYVAL DESTSEG%, BYVAL
X%, BYVAL Y%, BYVAL ANGLE%, BYVAL_
SPRSEG%,
BYVAL SPROFF%)
Description: Draws a Sprite on Destseg at coordinate X,Y. Skips color 0 and Rotates it
according to
the ANGLE
Tranlucently!!!
Compatible with QB's Get routine :)
How to Use: RelSpriteRotateTrans
VIDEO,10,10,100,VARSEG(SpriteArray(0)),VARPTR
(SpriteArray(Offset)),6
*Draws the
Sprite at 10,10 rotating it 100 degrees,bending the BG with the
SPR
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10
skipping color 0
Notes: Used to make a sprite Rotate
to simplify things. Angle must be in
the range of 0-
359
*SUPPORTS CLIPPING!!!!!
DECLARE SUB RelSpriteFlip (BYVAL DESTSEG%, BYVAL X%, BYVAL
Y%, BYVAL SPRITESEGMENT%,_
BYVAL
SPRITEOFFSET%, BYVAL FlipMode%)
Description:
Puts a sprite in but inverted Vertically, Horizontally or both depending
on the value
of Flipmode.
How to Use: Same as RelSprite
Notes: useful for memory management.
very fast!!! As fast as RelSprite.
FlipMode:
0 =No Flip
1 =Flip Horizontally
2.=Flip Vertically
3 =Flip both horizontally
and vertically
*You could also use the
constants: FLIPH, FLIPV, FLIPVH
Supports Clipping!!!!
DECLARE SUB RelSpriteFlipG (BYVAL DESTSEG%, BYVAL X%, BYVAL
Y%, BYVAL SPRITESEGMENT%,
BYVAL
SPRITEOFFSET%, BYVAL FlipMode%, BYVAL GammaVal%)
Description:
Puts a sprite in but inverted Vertically, Horizontally or both depending
on the value
of Flipmode. In GammaMode!!!
How to Use: Same as RelSpriteGamma
Notes: useful for memory management.
very fast!!! As fast as RelSpriteGamma
FlipMode:
0 =No Flip
1 =Flip Horizontally
2.=Flip Vertically
3 =Flip both
horizontally and vertically
*You could also use the
constants: FLIPH, FLIPV, FLIPVH
Supports Clipping!!!!
DECLARE SUB RelSpriteFlipC (BYVAL DESTSEG%, BYVAL X%, BYVAL
Y%, BYVAL SPRITESEGMENT%,
BYVAL SPRITEOFFSET%, BYVAL FlipMode%, BYVAL
Clr%)
Description:
Puts a sprite in but inverted Vertically, Horizontally or both depending
on the value
of Flipmode. In just one color!!!
How to Use: Same as RelSpriteColor
Notes: useful for memory management.
very fast!!! As fast as RelSpriteColor.
FlipMode:
0 =No Flip
1 =Flip Horizontally
2.=Flip Vertically
3 =Flip both
horizontally and vertically
*You could also use the
constants: FLIPH, FLIPV, FLIPVH
Supports Clipping!!!!
DECLARE SUB RelGet (BYVAL DestSeg%, BYVAL X1%, BYVAL Y1%,
BYVAL X2%, BYVAL Y2%,
BYVAL
SPRSEG%, BYVAL SPROFF%)
Description: Gets the Image at
DestSeg% at coords X1,Y1,X2,Y2 and Stores the data at
SprOff.
*Compatible
with QB's PUT routine
*Works like
QB's GET routine
*Use in
conjuction with RelSize
How to Use: RelSize(10,10,20,20)
Dim
Array(RelSize,1 to 2) 'two elements
for ease
'Draw crap
at VPAGE
RelGet
VARSEG(Vpage(0)),10,10,20,20,Varseg(Array(0,1)),Varptr(Array
(0,1)) 'First Image
RelGet
VARSEG(Vpage(0)),10,10,20,20,Varseg(Array(0,1)),Varptr(Array
(0,2)) 'Second Image
or....
RelSize(10,10,20,20)
Dim
Array(RelSize*2) 'two images
'Draw crap
at VPAGE
RelGet
VARSEG(Vpage(0)),10,10,20,20,Varseg(Array(0)),Varptr(Array(0))
'First Image
RelGet
VARSEG(Vpage(0)),10,10,20,20,Varseg(Array(0)),Varptr(Array
(RelSize)) 'Second Image
*use what
suits you or for a better index... use PP256 since it's indexed
automatically
:-)
Notes: Useful for games............Supports
Clipping
'/================COLLISION
DETECTION=================================
DECLARE FUNCTION RelCollide% (BYVAL DestSeg%, BYVAL X%,
BYVAL Y%, BYVAL SPRITESEGMENT%,_
BYVAL
SPRITEOFFSET%)
Description: Unlike most Collision detection, This returns the COLOR of the pixel the sprite
collided
with instead of -1.
*Returns
color of pixel collided with, zero(FALSE) if otherwise, The check
is done at
DestSeg.
How to Use: RelCollide
VARSEG(Vpage(0)),10,10,VARSEG(SprArray(0)),VARPTR
(SprArray(Offset))
*Returns the
color of the pixel the sprite Collided with(Pixel*Pixel) 0 if not
*Offset is
the sprite's offset/frame
*Used in
conjuction with RelCollideSprB to
achieve pixel*pixel sprite
collision
detection
Notes: Returning the Color instead
of -1(TRUE) is more dynamic and flexible in the sense
that you
don't have to use another layer to detect collision. Example:
C=Relcollide
Varseg...............
if C>127
then Collision=TRUE else Collision=FALSE
*Supports Clipping
DECLARE FUNCTION RelCollideSprB% (BYVAL SPR1X%, BYVAL
SPR1Y%, BYVAL SPR1SEGMENT%, BYVAL_
SPR1OFFSET%,
BYVAL SPR2X%, BYVAL SPR2Y%, BYVAL_
SPR2SEGMENT%,
BYVAL SPR2OFFSET%)
Description: Returns -1(TRUE) if Spr1 collided with SPR2 using a bounding box
check
How to Use: RelCollideSprB Spr1X,Spr1Y,VARSEG(Spr1(0)),VARPTR(Spr1
(Offset)),Spr2X,Spr2Y,VARSEG(Spr2(0)),VARPTR(Spr2(Offset))
*Offset is
the sprite's offset/frame
*Used in
conjuction with RelCollide to
achieve pixel*pixel sprite collision
detection
*This does
not actually draw the sprites. It checks collision arithmitically.
Notes: Very FAST. See the source..... :) and the example Files
for more details.... :-)
DECLARE FUNCTION RelCollideSpr% (BYVAL SPR1X%, BYVAL SPR1Y%,
BYVAL SPR1SEGMENT%, BYVAL_
SPR1OFFSET%,
BYVAL SPR2X%, BYVAL SPR2Y%, BYVAL_
SPR2SEGMENT%,
BYVAL SPR2OFFSET%)
Description: Returns the color of in the SPR2
if Spr1 collided with SPR2 using a PIXEL
PERFECT
collision method
How to Use: RelCollideSpr
Spr1X,Spr1Y,VARSEG(Spr1(0)),VARPTR(Spr1(Offset)),Spr2X,Spr2Y,VARSEG
(Spr2(0)),VARPTR(Spr2(Offset))
*Offset is
the sprite's offset/frame
*Pixel
perfect so you don't have to use a collision layer
*This does
not actually draw the sprites. It checks collision arithmitically.
*This
combines RelCollide and RelCollideSprB in one but does it faster!!!!!
Notes: Very FAST. See the source..... :) and the example Files
for more details.... :-)
'/================KEYBOARD============================================
*I found this
routines at CGI Joe's tutorial. I have
made my own routines using Petter Holmbergs tut but mine's a little buggy so I
used the routines I found at CGI's tut.
This are not my routines, This is CGI's.
DECLARE SUB
RelKeyBoardON ()
Description: Turns the Keyboard handler on.
How to Use: RelKeyBoardON
Notes: You will not be able to use
QB's intrinsic keyboard routines(INKEY$,INPUT$,etc) after you issue this
command.
DECLARE SUB
RelKeyBoardOFF ()
Description: Turns the Keyboard handler off.
How to Use: RelKeyBoardOFF
Notes: Use this to turn the KeyBoard
handler off. Always issue this before ending your program or you will not
regain control of
the keyboard.
DECLARE FUNCTION
RelKey% (BYVAL Scancode%)
Description: Returns -1(TRUE) if a particular key is pressed.
How to Use: if RelKey(KEYENTER)
then 'Check to see if user pressed
Enter
DOSOMETHING
else
DONOTHING
end if
Notes: *Scancode is the Code which
can be found at QB's online help. See
RelLib.BI for KEY constants
'/================FONT================================================
DECLARE SUB
RelPrint (DestSeg%, X%, Y%, Font$, Mincolor%, Italic%)
Description: Prints an 8*8 font using the ROM address FFA6h,italic ot
otherwise,Starting
from color
mincolor to Mincolor+8
*Font$=String
to Print
*MinColor=Starting
Color to plot
*if
TRUE,prints in italic,Else normal
How to Use: RelPrint
VIDEO,10,10,"RelSOFT",23,TRUE
*Prints
"RelSOFT" on the Screen at 10,10,Starting from color 23 to color
30,
in ITALIC
Notes: Supports Clipping!!!
DECLARE SUB
RelPrintS (DestSeg%, X%, Y%, Font$, Mincolor%, Xscale%, Yscale%, Italic%)
Description: Prints a SCALED font using the ROM address FFA6h,italic or
otherwise,Starting
from color mincolor to Mincolor+8
*Font$=String
to Print
*MinColor=Starting
Color to plot
*If
TRUE,prints in italic,Else normal
*Xscale=Horizontal
Scale(minimun is 1)
*Yscale=Vertical
Scale(minimum is 1)
How to Use: RelPrintS
VIDEO,10,10,"RelSOFT",23,2,3,FALSE
*Prints
"RelSOFT" on the Screen at 10,10,Starting from color 23 to color
30, in
ITALIC,with 2x the Xsize and 3 times the Ysize.
Notes: Supports Clipping!!!
**DECLARE SUB
RelPrintTransS (DestSeg%, X%, Y%, Font$, Mincolor%, Xscale%, Yscale%,_
Italic%)
Description: Prints a SCALED font using the ROM address FFA6h,italic or
otherwise,Starting
from color mincolor to Mincolor+8,
TRANSLUCENTLY!!!!!
*Font$=String
to Print
*MinColor=Starting
Color to plot
*If
TRUE,prints in italic,Else normal
*Xscale=Horizontal
Scale(minimun is 1)
*Yscale=Vertical
Scale(minimum is 1)
How to Use: RelPrintTransS
VIDEO,10,10,"RelSOFT",23,2,3,FALSE
*Prints
"RelSOFT" on the Screen at 10,10,Starting from color 23 to color
30, in
ITALIC,with 2x the Xsize and 3 times the Ysize.
TRANSLUCENTLY!!!
Notes: Supports Clipping!!!
DECLARE SUB
RelFont256 (DestSeg%, X%, Y%, Text$, Centered%, FontArray%(),_
FontArrayIndex%())
Description: Prints font using any Charset made with PP256!!!! With Variable
Spacing!!!
*Text$=String
to Print
*Centered=
Auto Centers the string if TRUE
*FontArray()=
FontSet made with PP256
*FontArrayIndex()=Index
made with MakeImageIndex
How to Use: RelFont256
VIDEO,10,10,"RelSOFT",FALSE,Font(),FontIndex()
*Prints
"RelSOFT" on the Screen at 10,10,with autocentering off
Notes: Supports Clipping!!! Must
Issue InitImageData before you use
this(see example
files for
more details)
**DECLARE SUB
RelFontTrans256 (DestSeg%, X%, Y%, Text$, Centered%, FontArray%(),_
FontArrayIndex%())
Same as RelFont256 but prints the fonts TRANSLUCENTLY!!!!
DECLARE SUB
RelFontFixed256 (DestSeg%, X%, Y%, Text$, Centered%, FontArray%(),_
FontArrayIndex%())
Description: Prints font using any Charset made with PP256!!!! With Fixed
Spacing.
*Text$=String
to Print
*Centered=
Auto Centers the string if TRUE
*FontArray()=
FontSet made with PP256
*FontArrayIndex()=Index
made with MakeImageIndex
How to Use: RelFontFixed256
VIDEO,10,10,"RelSOFT",FALSE,Font(),FontIndex()
*Prints
"RelSOFT" on the Screen at 10,10,with autocentering off
Notes: Supports Clipping!!! Must
Issue InitImageData before you use
this(see example
files for
more details)
**DECLARE SUB
RelFontFixedT256 (DestSeg%, X%, Y%, Text$, Centered%, FontArray%(),_
FontArrayIndex%())
Same as RelFontFixed256 but prints the fonts TRANSLUCENTLY!!!!
DECLARE SUB
RelScore256 (DestSeg%, X%, Y%, Score&, Centered%, FontArray%(),_
FontArrayIndex%())
Description: Prints the Score& using any Charset made with PP256!!!! With
Fixed Spacing.
*Score&=LongINT value to print
*Centered=
Auto Centers the string if TRUE
*FontArray()=
FontSet made with PP256
*FontArrayIndex()=Index
made with MakeImageIndex
How to Use: RelScore256
VIDEO,10,10,1000000,FALSE,Font(),FontIndex()
*Prints
"1,000,000" on the Screen at 10,10,with autocentering off
*Note that a
Comma(,) is inserted every 3 chars from the right.
Notes: Supports Clipping!!! Must
Issue InitImageData before you use
this(see example
files for
more details)
**DECLARE SUB
RelScoreTrans256 (DestSeg%, X%, Y%, Score&, Centered%, FontArray%(),_
FontArrayIndex%())
Same as RelScore256 but prints the fonts TRANSLUCENTLY!!!!
'/============MEMORY==============================================
DECLARE SUB
RelMemCopy (BYVAL DestSeg%, BYVAL DestOff%, BYVAL SrcSeg%, BYVAL SrcOff%, BYVAL
NumBytes%)
Description: Copies numbytes from SRC to DEST
How to Use: RelMemCopy
VIDEO,200,VARSEG(VPAGE(0)),VARPTR(Vpage(500)),12000
*Copies the
contents of Vpage at offset 500, to the Screen at offset
200,copying
12000 bytes
Notes: Numbytes should not Exceed
32767. I don't know how to fix this as
of the moment
but I think it has
something to do with QB defaulting to SIGNED integers. So if
any of you knows how to
fix this, pls email me, and you will get credit.
:) . Could be used as a replacement for PCOPY or
Reusing of Array's of the same
size. Probably
useless. Got the Idea from PASCAL.
DECLARE SUB
RelAddHi (BYVAL SEGINTVAL%, BYVAL OFFINTVAL%, BYVAL BYTEVAL%)
Description: Puts a value(0 to 255) to the UPPER byte of Intval, emulates bytes
in QB to
save memory
How to Use:RelAddHi
Varseg(A%),Varptr(A%),230
*Writes the
value 230 to the upper byte of A%
Notes: Use VARSEG and VARPTR
combination to get the pointer of the Integer Value.
Values for Byte val are
UNSIGNED meaning they range from 0 to
255 and you
can't put negative
values. Useful for
Maps/Tilesets/TileIndexes as you
wont need more than 255
to make some good tilesets.See ByteSamp.Bas for
more details.
DECLARE SUB
RelAddLow (BYVAL SEGINTVAL%, BYVAL OFFINTVAL%, BYVAL BYTEVAL%)
Description: Puts a value(0 to 255) to the LOWER byte of Intval, emulates bytes
in QB to
save memory
How to Use:RelAddLow
Varseg(A%),Varptr(A%),230
*Writes the
value 230 to the lower byte of A%
Notes: Use VARSEG and VARPTR
combination to get the pointer of the Integer Value.
Values for Byte val are
UNSIGNED meaning they range from 0 to 255
and you
can't put negative
values. Useful for
Maps/Tilesets/TileIndexes as you
wont need more than 255
to make some good tilesets. See ByteSamp.Bas for
more details.
DECLARE
FUNCTION RelGetHi (BYVAL Intval%)
Description: Returns value(0 to 255) read from the UPPER byte of Intval
How to Use: Dim A as Integer
RelAddHi
Varseg(A),Varptr(A),156
HiByte=RelGetHi(A)
*Returns
156(HighByte)
Notes: Used in conjuction with
RelAddHi/RelAddLow to emulate BYTES in QB. Values
returned are UNSIGNED meaning they range from 0 to 255 . Useful for
Maps/Tilesets/TileIndexes
as you wont need more than 255 to make
some good tilesets.
Saves a lot of memory.
DECLARE
FUNCTION RelGetLow (BYVAL Intval%)
Description: Returns value(0 to 255) read from the LOWER byte of Intval
How to Use: Dim A as Integer
RelAddLow
Varseg(A),Varptr(A),124
LowByte=RelGetLow(A)
*Returns
124(LowByte)
Notes: Used in conjuction with
RelAddHi/RelAddLow to emulate BYTES in QB. Values
returned are UNSIGNED
meaning they range from 0 to 255 . Useful for
Maps/Tilesets/TileIndexes
as you wont need more than 255 to make
some good tilesets.
Saves a lot of memory.
'/==============XMS
SUBS/FUNCTIONS==================================
DECLARE
FUNCTION RelXmsInit% ()
Description: Checks if an XMS driver present and initializes it if found.
Returns: -1 if found 0 if
otherwise
How to Use: Foo%=RelXMSinit
*Foo% would
return -1 if found
Notes: ALWAYS call this BEFORE any
XMS routines as this gets the Handle of the Driver.
DECLARE
FUNCTION RelXmsGetFree& ()
Description: Queries any free extended memory
Returns: A long integer of the
largest free XMS memory in KB
How to Use: Foo&=RelXMSGetFree
Notes: Duh?!
DECLARE
FUNCTION RelXmsGetTotal& ()
Description: Queries the total extended memory
Returns: A long integer of the
total XMS memory in KB
How to Use: Foo&=RelXMSGetTotal
Notes: Duh?!
DECLARE
FUNCTION RelXmsAllocate% (BYVAL AmountKbs&)
Description: Allocates the XMS block for use.
Parameters:
AmountKBs& - Long
integer in KBs of XMS mem to allocate
Returns: the XMS handle(address) fo
the XMS block
How to Use:
Handle%=RelXMSAllocate%(64)
*Allocates
64 Kb of XMS mem.
Notes: No Super XMS so is limited to
64 MB addressable XMS space. :*( Sorry as they say XP would complain.
DECLARE SUB
RelXmsDeallocate (BYVAL XmsHandle%)
Description: Deallocates/Frees the XMS block .
Parameters:
AmountKBs& - Long
integer in KBs of XMS mem to Deallocate
Returns: the XMS handle(address) fo
the XMS block
How to Use: Handle%=RelXMSAllocate%(64)
RelXMSDeallocate%(Handle%)
*Deallocates
64 Kb of XMS mem.
Notes: No Super XMS so is limited to
64 MB addressable XMS space. :*( Sorry as they
say XP would complain.
DECLARE SUB RelXMSFromBase (BYVAL BaseSeg%, BYVAL
BaseOFF&, BYVAL XmsHandle%, BYVAL XMSOffset&, BYVAL Length&)
Description: Copies a block of DATA from Base/Conventional mem to XMS
Parameters:
BaseSEG%=Base
SEGment(Varseg) Short Int
BaseOFF&=Baser
OFFset(Varptr) Long Int as QB wraps things
XmsHandle&=Handle
returned by RelXMSAllocate (Short Int)
XmsOffSet&=32
bit Offset in XMS data (Long Int)
Length&=32
bit Length(IN BYTES) of data to copy(Long Int)
How to Use: XMSHandle% = RelXmsAllocate(512)
RelXMSFromBase
Varseg(Sprite(0)), 0, XMSHandle%, 0, 64000
*Copies
64000 KB of DATA from the array Sprite() to the first XMS block.
Notes: No Super XMS so is limited to
64 MB addressable XMS space. :*( Sorry as they
say XP would complain
DECLARE SUB RelXMStoBase (BYVAL BaseSeg%, BYVAL
BaseOFF&, BYVAL XmsHandle%, BYVAL XMSOffset&, BYVAL Length&)
Description: Copies a block of DATA from XMS to Base/Conventional mem
Parameters:
BaseSEG%=Base
SEGment(Varseg) Short Int
BaseOFF&=Baser
OFFset(Varptr) Long Int as QB wraps things
XmsHandle&=Handle
returned by RelXMSAllocate (Short Int)
XmsOffSet&=32
bit Offset in XMS data (Long Int)
Length&=32
bit Length(IN BYTES) of data to copy(Long Int)
How to Use: XMSHandle% = RelXmsAllocate(512)
RelXMSToBase
Varseg(Sprite(0)), 0, XMSHandle%, 0, 64000
*Copies
64000 KB of DATA from XMS to the array Sprite().
Notes: No Super XMS so is limited to
64 MB addressable XMS space. :*( Sorry as they
say XP would
complain
DECLARE SUB RelXMSPut (BYVAL Layer%, BYVAL x%, BYVAL y%, BYVAL SprSeg%, BYVAL SprOff%, BYVAL Flipmode%, _
BYVAL DummySeg%, BYVAL xmsHandle%)
Description: An XMS based Sprite
routine! Copies a sprite to a Layer using data stored in XMS, Thereby freeing
up a
Lot
of base memory. Transparent Put
Parameters:
Layer% = The
double buffer
X% = X
location of sprite
X% = Y
location of sprite
SprSeg% = The
segment of the XMSTile index
SprOff% = The offset
of the XMSTile index
XmsHandle%=Handle
returned by RelXMSAllocate (Short Int)
Flipmode%
= The flipping values of the sprite(Same as RelSpriteFlip)
DummySeg% =
The segment of the intermediate base array that is used to speed things up.
*Dummy()
would contain the actual sprite data(PUT compatible) after the call so you can
use it to
make
a pixel perfect collision.
How to Use:
RelXMSPut
Layer%, x%, y%,
Varseg(XmsTileInded(1), VarPtr(XmsTileInded(500), 2, Varseg(Dummy(0)), xmsHandle%
*Puts
the 500th sprite transparently on the layer flipping it horizontally.
Notes: Very fast and easy to
use!!!(See the Appendix at the end of this doc for a lil tute)
DECLARE SUB RelXMSPutT (BYVAL Layer%, BYVAL x%, BYVAL y%,
BYVAL SprSeg%, BYVAL SprOff%, BYVAL Flipmode%, _
BYVAL DummySeg%,
BYVAL xmsHandle%)
Description: An XMS based Sprite
routine! Copies a sprite to a Layer using data stored in XMS, Thereby freeing
up a
Lot
of base memory. Translucent Put
Parameters:
Layer% = The
double buffer
X% = X
location of sprite
X% = Y
location of sprite
SprSeg% = The
segment of the XMSTile index
SprOff% = The offset
of the XMSTile index
XmsHandle%=Handle
returned by RelXMSAllocate (Short Int)
Flipmode%
= The flipping values of the sprite(Same as RelSpriteFlipT)
DummySeg% =
The segment of the intermediate base array that is used to speed things up.
*Dummy()
would contain the actual sprite data(PUT compatible) after the call so you can
use it to
make
a pixel perfect collision.
How to Use:
RelXMSPut
T Layer%, x%, y%, Varseg(XmsTileInded(1), VarPtr(XmsTileInded(500),
2, Varseg(Dummy(0)), xmsHandle%
*Puts
the 500th sprite translucently on the layer flipping it horizontally.
Notes: Very fast and easy to
use!!!(See the Appendix at the end of this doc for a lil tute)
DECLARE SUB RelXMSPutC (BYVAL Layer%, BYVAL x%, BYVAL y%,
BYVAL SprSeg%, BYVAL SprOff%, BYVAL Flipmode%,_
BYVAL Clr%, BYVAL DummySeg%, BYVAL
xmsHandle%)
Description: An XMS based Sprite
routine! Copies a sprite to a Layer using data stored in XMS, Thereby freeing
up a
Lot
of base memory. Colored Put
Parameters:
Layer% = The
double buffer
X% = X
location of sprite
X% = Y
location of sprite
SprSeg% = The
segment of the XMSTile index
SprOff% = The offset
of the XMSTile index
XmsHandle%=Handle
returned by RelXMSAllocate (Short Int)
Flipmode%
= The flipping values of the sprite(Same as RelSpriteFlipC)
Clr% = The color outline of the sprite
DummySeg% =
The segment of the intermediate base array that is used to speed things up.
*Dummy()
would contain the actual sprite data(PUT compatible) after the call so you can
use it to
make
a pixel perfect collision.
How to Use:
RelXMSPutC Layer%, x%, y%, Varseg(XmsTileInded(1), VarPtr(XmsTileInded(500), 2,15,
Varseg(Dummy(0)), xmsHandle%
*Puts
the 500th sprite using color 15 on the layer flipping it horizontally.
Notes: Very fast and easy to
use!!!(See the Appendix at the end of this doc for a lil tute)
DECLARE SUB RelXMSPutG (BYVAL Layer%, BYVAL x%, BYVAL y%,
BYVAL SprSeg%, BYVAL SprOff%, BYVAL Flipmode%,_
BYVAL Gamma%, BYVAL DummySeg%, BYVAL
xmsHandle%)
Description: An XMS based Sprite
routine! Copies a sprite to a Layer using data stored in XMS, Thereby freeing
up a
Lot
of base memory. Gamma Put
Parameters:
Layer% = The
double buffer
X% = X
location of sprite
X% = Y
location of sprite
SprSeg% = The
segment of the XMSTile index
SprOff% = The offset
of the XMSTile index
XmsHandle%=Handle
returned by RelXMSAllocate (Short Int)
Flipmode%
= The flipping values of the sprite(Same as RelSpriteFlipG)
Gammar% = The
Gamma displacement of the sprite
DummySeg% =
The segment of the intermediate base array that is used to speed things up.
*Dummy()
would contain the actual sprite data(PUT compatible) after the call so you can
use it to
make
a pixel perfect collision.
How to Use:
RelXMSPutG Layer%, x%, y%, Varseg(XmsTileInded(1), VarPtr(XmsTileInded(500),
2,-6, Varseg(Dummy(0)), xmsHandle%
*Puts
the 500th sprite using darkening if by a factor of 6on the layer flipping it horizontally.
Notes: Very fast and easy to
use!!!(See the Appendix at the end of this doc for a lil tute)
DECLARE SUB RelXMSPutS (BYVAL Layer%, BYVAL x%, BYVAL y%,
BYVAL SprSeg%, BYVAL SprOff%, BYVAL DummySeg%, _
BYVAL
xmsHandle%)
Description: An XMS based Sprite
routine! Copies a sprite to a Layer using data stored in XMS, Thereby freeing
up a
Lot
of base memory. Solid Put
Parameters:
Layer% = The
double buffer
X% = X
location of sprite
X% = Y
location of sprite
SprSeg% = The
segment of the XMSTile index
SprOff% = The offset
of the XMSTile index
XmsHandle%=Handle
returned by RelXMSAllocate (Short Int)
How to Use:
RelXMSPut
Layer%, x%, y%,
Varseg(XmsTileInded(1), VarPtr(XmsTileInded(500), Varseg(Dummy(0)), xmsHandle%
*Puts
the 500th sprite solidly on the layer .
Notes: Very fast and easy to
use!!!(See the Appendix at the end of this doc for a lil tute)
DECLARE SUB RelTile2Xms (Filename$, Tile() AS ANY,
xmsHandle%, XmsStartOFF&, XmsEndOFF&)
Description: Loads the Tileset stored in disk directly to XMS, Compressing
it by 99.99%!
Parameters:
FileName$ =
The name of the file
Tile() = The
XMS Array index for use by RelXMSPUT ans its variants
XmsHandle%=Handle
returned by RelXMSAllocate (Short Int)
XmsStartOff&
= A long integer that references the offset of the tiles in XMS
XmsEndOff&
= A long integer that returns the last offset of the XMS data
·
XmsEndOff& after each call can be used as a startOffset
on the next call by
RelAddXMSTileIndex.
How to Use:
Path$ =
"C:\Qbasic\pp256\Images\"
Layer =
VARSEG(Vpage(0))
File$ = Path$
+ "Crytlstg.Put"
xmsHandle% =
RelXmsAllocate(512)
XmsEndOFF&=0
RelTile2Xms
File$, XmsTileIndex(), xmsHandle%, XmsEndOFF&, XmsEndOFF&
RelXMSPut
VIDEO, X, y, VARSEG(XmsTileIndex(1)), VARPTR(XmsTileIndex(Idx)), 0, _
VARSEG(Tdum(0)),
xmsHandle%
* Stores the CryltStg.Put
file directly to XMS and uses RElXMSPut afterwards.
Notes: (See the Appendix at the end
of this doc for a lil tute)
DECLARE SUB RelAddXMSTileIndex (DestTile() AS ANY, SourceTile()
AS ANY)
Description: Adds a Tileset from base to a tileset in XMS. This way you can have as many tiles as you
want on XMS.
Parameters:
DestTile = The
Tileset in XMS
SourceTile()
= The Tileset in base memory
How to Use:
Path$ =
"C:\Qbasic\pp256\Images\"
Layer =
VARSEG(Vpage(0))
File$ = Path$
+ "Crytlstg.Put"
xmsHandle% =
RelXmsAllocate(512)
XmsEndOFF&=0
RelTile2Xms
File$, XmsTileIndex(), xmsHandle%, XmsEndOFF&, XmsEndOFF&
File$ = Path$
+ "Sultan.Put"
RelTile2Xms
File$, XmsTempIndex(), xmsHandle%, XmsEndOFF&, XmsEndOFF&
RelAddXMSTileIndex
XmsTileIndex(), XmsTempIndex()
RelXMSPut
VIDEO, X, y, VARSEG(XmsTileIndex(1)), VARPTR(XmsTileIndex(Idx)), 0, _
VARSEG(Tdum(0)),
xmsHandle%
·
Stores the CryltStg.Put file directly to XMS and uses
RElXMSPut afterwards. Also adds
Sultan.Put in the XMS data.
Notes: (See the Appendix at the end
of this doc for a lil tute)
DECLARE SUB RelFontXms (DestSeg%, x%, y%, Text$, Centered%,
XmsFont() AS ANY, Flipmode%, xmsHandle%)
Description: Prints font using any Charset stored in XMS
Text$=String
to Print
Centered=
Auto Centers the string if TRUE
XmsFont()= FontSet in XMS
FlipMode = If you want to have flip fx.
XmsHandle%=Handle
returned by RelXMSAllocate (Short Int)
How to Use: RelFontXMS
VIDEO,10,10,"RelSOFT",FALSE,Font(), 0, xmshandle%
*Prints
"RelSOFT" on the Screen at 10,10,with autocentering off
Notes: Supports Clipping!!!
'/==============MOUSE===============================================
DECLARE SUB
RelMouseShow ()
Description: Shows the mouse
How to Use: RelMouseShow
Notes: ;)
DECLARE SUB
RelMouseHide ()
Description: Hides the mouse
How to Use: RelMouseHide
Notes: ;)
DECLARE SUB
RelMouseReset ()
Description: Resets the Mouse Coordinates to center of screen and disables
Range Limits
How to Use: RelMouseReset
Notes: ;)
DECLARE SUB
RelMouseLimitXY (BYVAL MinX%, BYVAL MinY%, BYVAL MaxX%, BYVAL MaxY%)
Description: Limits the mouse range by MinX,MinY,MaxX,maxY
How to Use: RelMouseLimitXY
10,10,100,100
Notes: Shows the mouse if nit shown
limiting it to the box defined by the above dimensions
DECLARE SUB
RelMouseSetXY (BYVAL X%, BYVAL Y%)
Description: Sets the mouse location
How to Use: RelMouseSetXY 10,10
Notes: Show the mouse if hidden and
puts it at the above coordinates.
DECLARE
FUNCTION RelMouseX% ()
Description: Returns the X mouse coordinate
How to Use: C=RelMouseX
Notes: ;)
DECLARE
FUNCTION RelMouseY% ()
Description: Returns the Y mouse coordinate
How to Use: C=RelMouseY
Notes: ;)
DECLARE
FUNCTION RelMouseClick% ()
Description: Returns:
1
if Leftbutton is clicked
2
if Rightbutton is clicked
3
if both are clicked at the same time.
How to Use: C=RelMouseClick
Notes: ;)
DECLARE
FUNCTION RelMouseDetect% ()
Description: returns 1 if there is a
mouse 0 if otherwise
How to Use: C=RelMousedetect
Notes: ;)
DECLARE FUNCTION
RelMouseInside (BYVAL MinX%, BYVAL MinY%, BYVAL MaxX%, BYVAL MaxY%)
Description: returns 1 if the mouse is inside the box defined by MinX,
MinY,MaxX,MaxY
How to Use: C=RelMouseInside
10,10,100,100
Notes: Used in conjuction with Relmouseclick
to see if you clicked on a given area(button)
'/==============IMAGES==============================================
DECLARE
FUNCTION RelLoadBMP% (Layer%, X%, Y%, File$, Pal$, SwitchPal%)
Description: Loads a 320*200*256 color bitmap to DestSeg
*Switchpal%
if TRUE will switch the current palette to the palette of the
BMP
file
How to Use:
Dummy=RelLoadBMP(VARSEG(VPAGE(0)), "Crap.BMP",Pal$, TRUE)
Notes: Loads the CRAP.BMP file to
VPAGE switching the palette to the BMP file pallete
and storing Pal to PAL$
*Retuns: 0= if successfull.
*Error Codes are at the end of this
DOC
DECLARE
FUNCTION RelLoadPCX% (Layer%, X%, Y%, File$, Pal$, SwitchPal%)
Description: Loads a 320*200*256 color bitmap to DestSeg
*Switchpal%
if TRUE will switch the current palette to the palette of the
BMP
file
How to Use:
Dummy=RelLoadPCX(VARSEG(VPAGE(0)), "Crap.PCX",Pal$, TRUE)
Notes: Loads the CRAP.PCX file to
VPAGE switching the palette to the PCX file pallete
and storing Pal to PAL$
*Retuns: 0= if successfull
*Error Codes are at the end of this
DOC
'/=============PALETTE=============================================
DECLARE SUB
RelReadRGB (ColorVal%, R%, G%, B%)
Description:Reads the RGB values of
colorval
How to Use: RelReadRGB 100,R,G,B
*Reads the
RGB values of color 100 putting them in the variables R,G & B
Notes: look at the sample files at
the Examples folder
DECLARE SUB
RelWriteRGB (ColorNum%, R%, G%, B%)
Description:Writes the RGB values to
colornum
How to Use: RelWriteRGB 100,63,0,0
*Writes the
RGB values 63,0,0 to color 100 making it red
Notes: look at the sample files at
the Examples folder
DECLARE SUB
RelReadPal (PalString$)
Description: Reads the current
palette storing it in the 768 byte string Palstring$
How to Use: Dim RGBpal as String
*768
RelReadPal
RGBpal
Notes: After using this sub, you can
use all the palette manipulation of RelLib
DECLARE SUB
RelFade (R%, G%, B%, Counts%)
Description: Fades the current palette
to the specified RGB values
*Counts is a
nifty parameter which allows you to specify how many times
it
takes to completely fade the pal
How to Use: RelFade 0,0,0,200
*Fades the
current pal to black in 200 steps
RelFade
0,0,0,0
*Instantaneous
pal switch to black
Notes: Uses vectors instead of
integers to fade the palette giving you more control and also
makes the fadeout
standardized. Meaning, all the fadeout will arrive at the same
time as all the other
attributes no matter how near or far the RGB difference
is.
Uses the morphing
algorithm. All colors are affected.
DECLARE SUB
RelFadeStep (StartCol%, EndCol%, R%, G%, B%)
Description: Fades the colors form
Startcol to Endcol to the specified RGB values in steps
How to Use: RelFadeStep
100,150,0,0,0
*Decrements
the RGB values of color 100 to 150 by one
Notes: to completely fade call this
SUB 64 times. Useful for night and day effects. See the
RPG demo at the Examples
folder.
DECLARE SUB
RelFadeToPal (PalString$, Counts%)
Description: Fades the current
palette to the palette held by Palstring$
*Counts is a
nifty parameter which allows you to specify how many times
it takes to
completely fade the pal
*PalString$
is a 768 byte string that holds pal values
How to Use: Dim RGBpal as String*768
RelFadeToPal
RGBpal,200
*Fades the
current pal to RGBpal in 200 steps
RelFadeToPal
RGBpal,0
*Instantaneous
pal switch to RGBpal
Notes: Uses vectors instead of
integers to fade the palette giving you more control and also
makes the fadeout
standardized. Meaning, all the fadeout will arrive at the same
time as all the other
attributes no matter how near or far the RGB difference
is.
Uses the morphing
algorithm. Pls see the example file.
DECLARE SUB
RelFadeToPalStep (StartCol%, EndCol%, PalString$)
Description: Fades the current
palette to the palette held by PalString$ in steps
How to Use: Dim RGBpal as String*768
RelFadeToPalStep
100,150,RGBpal
Notes: to completely fade call this
SUB 64 times. Useful for night and day effects. See the
RPG demo at the Examples
folder.
DECLARE SUB
RelFadeToPalX (StartCol%, EndCol%, PalString$, Counts%)
Description: Fades the current
palette to the palette held by Palstring$ from StartCol to
EndCol. ie,
Selective Fade
*Counts is a
nifty parameter which allows you to specify how many times
it takes to
completely fade the pal
*PalString$
is a 768 byte string that holds pal values
How to Use: Dim RGBpal as String*768
RelFadeToPalX
100,150,RGBpal,200
*Fades Color
100 to 150 to RGBpal in 200 steps
RelFadeToPalX
100,150, RGBpal,0
*Instantaneous
pal switch to RGBpal
Notes: Uses vectors instead of
integers to fade the palette giving you more control and also
makes the fadeout
standardized. Meaning, all the fadeout will arrive at the same
time as all the other
attributes no matter how near or far the RGB difference
is.
Uses the morphing
algorithm. Pls see the example file.
DECLARE SUB
RelFadeX (StartCol%, EndCol%, R%, G%, B%, Counts%)
Description: Fades the current
palette to the specified RGB values from StartCol to EndCol.
ie,
Selective Fade
*Counts is a
nifty parameter which allows you to specify how many times
it takes to
completely fade the pal
How to Use: RelFadeX 100,150,63,63,63,200
*Fades Color
100 to 150 to bright white in 200 steps
RelFadeX
100,150,63,63,63 ,0
*Instantaneous
pal switch to bright white
Notes: Uses vectors instead of
integers to fade the palette giving you more control and also
makes the fadeout
standardized. Meaning, all the fadeout will arrive at the same
time as all the other
attributes no matter how near or far the RGB difference
is.
Uses the morphing
algorithm. Pls see the example file.
DECLARE SUB
RelLoadPal (File$, PalString$, Switch%)
Description: Loads an external pal
file(File$) storing the palette in the 768 byte paltring$
*Switch lets
you specify if you want to switch to the palette help by
palstring$.
if TRUE then switch else...
How to Use: Dim RGBpal as String*768
1.
RelLoadPal "RelPal.Pal",RGBpal,TRUE
*Loads
the pal and switches the current palette to palstring$
2.
RelLoadPal "RelPal.Pal",RGBpal,FALSE
*Loads
the pal and but does not switch colors
Notes: See the example file
;-). File$ should be a 768 byte
file(made using RelSavePal)
DECLARE SUB
RelLoadPalPP256 (File$)
Description: Loads an external PP256
pal file(File$)
*Switches
the colors just included it here to be compatible with PP256
How to Use: Dim RGBpal as String*768
RelLoadPalPP256
"PPpal.Pal"
RelReadPal
RGBpal
RelSavePal
"RelPal.Pal"
*Loads a
PP256(1024 byte pal file), switching the current palette, Reads
the current
palette saving it to RGBpal, then Saves the current palette to a
768 byte pal
file named RelPal.Pal
Notes: Very useful for converting a
pp256(1024 bytes) format file to the standard 768 byte
pal so as not to waste
memory(256 bytes is still 256 bytes, don't ya think?).
Kackurot gets credit
for this one. In case you're wondering
PP256 Pal
loader has a BUG that
prevents it from running when compiled. :-)
DECLARE SUB
RelNegativePal ()
Description: Subracts from 63 each
RGB val of the current pal flipping the values producing
a
"negative" effect
How to Use: RelNegativePal
Notes: ya hafta see this!!!! See the
example files.... ;-)
DECLARE SUB
RelRotatePalB (StartCol%, EndCol%)
Description: Rotates the palettes
from StartCol to EndCol giving a motion effect backwards.
How to Use: Do
RelRotatePalB
100,150
Loop until
inkey$<>""
Notes: See the example files.... ;-)
Plasma anyone? :-)
DECLARE SUB
RelRotatePalF (StartCol%, EndCol%)
Description: Rotates the palettes
from StartCol to EndCol giving a motion effect Forward.
How to Use: Do
RelRotatePalF
100,150
Loop until
inkey$<>""
Notes: See the example files.... ;-)
Plasma anyone? :-)
DECLARE SUB
RelSavePal (File$)
Description: Saves the current
pal to File$(a 768 byte file)
How to Use: RelSavePal "RelPal.Pal"
Notes: See the example files.... ;-)
DECLARE SUB
RelSwitchToPal (PalString$)
Description: Instantaneous switch
to palstring$(768 byte)
How to Use: RelSwitchPal RGBpal
Notes: See the example files.... ;-)
'/=============GFX
Effects============================================
DECLARE SUB
RelWater (BYVAL DESTSEG%, BYVAL SourceSeg%)
Description:Simulates the water
effect you see in demos. The difference? This is way
faster.
How to Use: RelWater
WaterSeg1,WaterSeg2
Notes: Used in conjunction with
RelRefrac to simulate water on a texture.
See the example file
called WATER.BAS
DECLARE SUB
ReFrac (BYVAL DESTSEG%, BYVAL SourceSeg%, BYVAL TextSeg%)
Description:Simulates the water
effect you see in demos. The difference? This is way
faster.
How to Use: Refrac Layer
WaterSeg1,TexSeg
Notes: Used in conjunction with
Relwater to simulate water on a texture.
See the example file
called WATER.BAS
/==========OnSprite
SUBS/FUNCTIONS+==============================
Note: Special procedures Allegro Style!!! Joakim's
subs :*)
>The coordinate passed are 0
relative which means that you treat the QB get/put array as a buffer.
>You can have as many
VARIABLE-SIZED buffer using this routines depending on the memory as this
are very memory
efficient and used well, could give you some cool FX. Pls. refer to the example
file
for more
details(SpriteON.Bas).
DECLARE SUB
RelPsetOnSprite (BYVAL DESTSprSEG%, BYVAL DESTSprOFF%, BYVAL_
X%,
BYVAL Y%, BYVAL C%)
Description: Puts a pixel on a QB GET/PUT array(DestsprSeg/DestSprOff) at
location X,Y
color C
How to Use: RelPsetOnSprite
Varseg(Array(0)),Varptr(Array(0)),10,10,15
Notes: Same as QB's Pset
routine. Clipping is supported!
**DECLARE SUB
RelPsetOnSpriteT (BYVAL DESTSprSEG%, BYVAL DESTSprOFF%, BYVAL_
X%,
BYVAL Y%, BYVAL C%)
Description: Puts a pixel on a QB GET/PUT array(DestsprSeg/DestSprOff) at
location X,Y
color C,Translucently!!
How to Use: RelPsetOnSpriteT
Varseg(Array(0)),Varptr(Array(0)),10,10,15
Notes: Same as QB's Pset
routine. Clipping is supported!
DECLARE SUB RelSpriteOnSprite (BYVAL DESTSprSEG%, BYVAL
DESTSprOFF%, BYVAL X%, BYVAL Y%,_
BYVAL
SPRSEG%, BYVAL SPROFF%)
Description: Draws a Sprite on a GET/PUT array at coordinate X,Y. Skips color 0
Compatible
with QB's Get routine :)
How to Use: RelSpriteOnSprite
VARSEG(Array(0)),VARPTR(ARRAY(0)),10,10,VARSEG(SpriteArray
(0)),VARPTR(SpriteArray(Offset))
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10 skipping color 0
Notes: Also almost as fast as
RelSprite so not a lot has been lost.
Useful for changing the
appearance of the sprite
or using buffers/pages of different sizes. See example file
(SpriteO.Bas). Note: You
can do double buffering using this single routine alone.
ie. Draw your sprite
using this and Blit your buffer using QB's PUT.
*SUPPORTS CLIPPING!!!!!
DECLARE SUB RelSpriteOnSpriteS (BYVAL DESTSprSEG%, BYVAL
DESTSprOFF%, BYVAL X%, BYVAL Y%,_
BYVAL
SPRSEG%, BYVAL SPROFF%)
Description: Draws a Sprite on a GET/PUT array at coordinate X,Y. Solidly.
Compatible
with QB's Get routine :)
How to Use: RelSpriteOnSpriteS
VARSEG(Array(0)),VARPTR(ARRAY(0)),10,10,VARSEG(SpriteArray
(0)),VARPTR(SpriteArray(Offset))
*Offset is
the Frame of the Sprite for animation. Puts a Sprite at coordinate
10,10
solidly
Notes: Also almost as fast as
RelSpriteSolid so not a lot has been lost.
Useful for
changing the appearance
of the sprite or using buffers/pages of different sizes. See
example
file(SpriteO.Bas). Note: You can do double buffering using this single
routine alone. ie. Draw
your sprite using this and Blit your buffer using QB's PUT.
*SUPPORTS CLIPPING!!!!!
DECLARE
FUNCTION RelPointOnSprite% (BYVAL DESTSprSEG%, BYVAL DESTSprOFF%,_
BYVAL
X%, BYVAL Y%)
Description: Returns the color of a pixel on
a QB GET/PUT array(DestsprSeg/DestSprOff)
at location
X,Y.
How to Use: C=RelPpointOnSprite
Varseg(Array(0)),Varptr(Array(0)),10,10
Notes: Same as QB's Point routine. Clipping is supported!
DECLARE SUB
RelSmooth (BYVAL Layer%, BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL
_y2%)
Description: Smoothens an area in a layer definded by x1,y1,x2,y2
How to Use: see Smooth.Bas on the
examples folder
Notes: feedback effffects and tile
smoothing. ;*)
'/======================Mode
7=========================================
DECLARE SUB
RelMode7Map (Layer%, x1%, y1%, x2%, y2%, Angle%, scalex%, scaley%,
_scalez%,
Horz%, camx!, camy!, Texture%(), TextureOffset%, Map%())
Description: Draws a MAP projected on a
Layer ala MarioKart
How to Use:
x1 = 0 'Box bounds
y1 = 100
x2 = 319
y2 = 199
Angle = 0 Mode 7 Parameters
scalex = 200
scaley = 200
scalez = 15
Horz = 5
camx! = 0
camy! = 0
RelMode7Map Layer%, x1,
y1, x2, y2, Angle, scalex, scaley,_
scalez, Horz, px!, py!, Texture%(), 0, Map%()
Notes: See the Example Files in the \examples\mode7 directory. See Also
Mode7.Txt
*SUPPORTS CLIPPING!!!!!
DECLARE SUB
RelMode7 (Layer%, x1%, y1%, x2%, y2%, Angle%, scalex%, scaley%,
_calez%,
Horz%, camx!, camy!, Texture%(), TextureOffset%)
x1 = 0 'Box bounds
y1 = 100
x2 = 319
y2 = 199
Angle = 0 Mode 7 Parameters
scalex = 200
scaley = 200
scalez = 15
Horz = 5
camx! = 0
camy! = 0
RelMode7
Layer%, x1, y1, x2, y2, Angle%, Scalex, Scaley,_
Scalez,
Horz, px!, py!, Texture%(), 0
Notes: See the Example Files in the \examples\mode7 directory. See Also
Mode7.Txt
*SUPPORTS CLIPPING!!!!!
'/================3d
Routines===============================================================
***********THIS
SECTION IS UNDER CONSTRUCTION**********
DECLARE SUB RelTriF (BYVAL DestSeg%, BYVAL x1%, BYVAL y1%,
BYVAL x2%, BYVAL y2%, BYVAL x3%, BYVAL y3%, BYVAL C%)
Description: Draws a flat filled
triangle
How to Use:
Notes:
DECLARE SUB RelTriG (BYVAL DestSeg%, BYVAL x1%, BYVAL y1%, BYVAL c1%, BYVAL x2%, BYVAL y2%, BYVAL c2%, BYVAL x3%_
, BYVAL y3%, BYVAL c3%)
Description: Draws a Gouraud filled
triangle
How to Use:
Notes:
DECLARE SUB RelTriT (BYVAL DestSeg%, BYVAL x1%, BYVAL y1%,
BYVAL u1%, BYVAL v1%, BYVAL x2%, BYVAL y2%, BYVAL u2%_
, BYVAL v2%,
BYVAL x3%, BYVAL y3%, BYVAL u3%, BYVAL v3%, BYVAL Tseg%, BYVAL Toff%)
Description: Draws a Texturedd triangle
How to Use:
Notes:
'/================FUNCTIONS===========================================
DECLARE
FUNCTION RelSize% (BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%)
Description: Determines the size
needed to dimension an array using this formula:
SIZE=(((X2-X1)*(Y2-Y1))\2)+2(Thanks
to Andrew
Ayers)
*used in
conjuction with RelGET
How to Use:
SizeNeeded=RelSize(0,0,15,15)
Calculates
the size needed to dimension an array
16*16 in size
Notes: Makes dimensioning
easier. Useless if your using PP256.
DECLARE
FUNCTION RelPoint% (BYVAL DestSeg%, BYVAL X%, BYVAL Y%)
Description: Works like QB's POINT function. Returns the Pixel Color of destseg
at X,Y.
How to Use: RelPoint VIDEO,10,10
*Returns the
color of the screen at 10,10
Notes: Used for many puposes........
hehehehehe
DECLARE
FUNCTION RelInside% (BYVAL X%, BYVAL Y%, BYVAL X1%, BYVAL Y1%, BYVAL_
X2%,
BYVAL Y2%)
Description: Returns -1 if Coordinate X,Y is inside the Bounding Box defined by
X1,Y1,X2,Y2
How to Use: C=RelInside X, Y,
10,10,100,100
*Returns the
-1(TRUE) if X,Y is inside 0(FALSE) if not.
Notes: Used for Block Type Range
checking and collision detection
DECLARE
FUNCTION RelInsideC% (BYVAL X%, BYVAL Y%, BYVAL XC%, BYVAL YC%,_
BYVAL
Radius%)
Description: Returns -1 if Coordinate X,Y is inside the Circle defined by
XC=centerX,Yc=CenterY,radius=Distance
How to Use: C=RelInsideC X, Y,
100,100,50
*Returns the
-1(TRUE) if X,Y is inside 0(FALSE) if not.
Notes: Used for Radar Type range checking(Idea
came from a post at a QB board), Very
useful for
RPGS and could also be used for collision detection. Very
FAST!!! No
Square Root is used nor any use of FPU.
DECLARE
FUNCTION RelAngle% (BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%)
Description: Returns the angle in degrees(0 to 359) from the source(X1%,Y1%) to
the
target(X2%,Y2)
How to Use:
C=RelAngle(20,-10,1000,200)
*Returns the
Angle in Degrees
Notes: Used for bullets(ang vector
calcs)/Morphing,etc. Y-inversed
cartesian Fixed so that
SIN/COS would work. For SIN/COS to work, you have to convert
degrees to
radians using this
formula:
PI=3.141593
IntAngle%=RelAngle(X1,Y1,X2,Y2)
Angle!=IntAngle*PI/180
* I dont recommend using
Radians though as they are far slower.
Better to use
360 degree Lookup
tables.
DECLARE FUNCTION RelInsideT% (BYVAL x%, BYVAL y%, BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL y2%, BYVAL x3%, BYVAL y3%)
Description: Returns -1 if Coordinate X,Y is inside the triangle defined by
x1, y1, x2,
y2,x3,y3
How to Use: C=RelInsideT(X, Y,
100,100,50,150,20,30)
*Returns the
-1(TRUE) if X,Y is inside 0(FALSE) if not.
Notes: Used in 3d game engine. Ie, 2d gameplay with 3d GFX. Check out my
Darius game at my site to see this
In action.
'/======================File====================================
DECLARE
FUNCTION RelFindFile$ (Mask$, Attribute%)
Description: Used to scan a
directory for a file or types of file if it/they exist
Returns: The filename if found else a null string.
How to use:
*This puts all the
filenames in the File$(array) as we are using "*.*" as mask.
*ARCHIVE is a File
attrbute constand in the BI file.
* Mask= String(Mask) fo
file. Can accept wildcards.
* Attribute = Attribute of the file(s) to look for
[code]
REDIM File$(100)
File$(0) =
RelFindFile("*.*", ARCHIVE)
WHILE File$(Count%) <> ""
Count% = Count% + 1
File$(Count%) = RelFindFile("",
0)
WEND
DirCount% = Count%
[end code]
Notes:
You
can use this to scan the directory for a file or files if it exists using the
ask and attribute as
filters.
You can scan by passing
a nul"" string as a mask parameter after you cll it the
firsttime. Check example
code.
Attribute is a
constant as an added filter'
List of Constants:
VOLUMELABEL =
&H8, DIRECTORY = &H10, ARCHIVE = &H20
READONLY = &H1,
HIDDEN = &H2, SYSTEMFILE = &H4
'/======================MISC====================================
DECLARE SUB
RelWait ()
Description: waits for vertical retrace
How to Use: RelWait
Notes: Waits for vertical retrace to
make drawing "cleaner" also used for delay.
DECLARE SUB
RelDelay (Msec%)
Description: Millisecond delay routine for accuracy
How to Use: RelDelay 100
Notes: Msec=1000*Sec so to delay for
a second, use Reldelay 1000
DECLARE SUB
RelFfix()
Description: Speeds up QB's floating point calcs. Thanx v1ctor!!!!
How to Use: RelFfix
Notes: Once installed, RelFfix is
active until you get out of QB. The
original core algo is
made by V1ctor. I just modified it a little to
suit my needs. Thanks Dude!!!!! I
would recommend using
this on all your programs so that it speeds up your
engine. Sometimes even
on integers!!!!!!
/==========End of Routines=======================================
/==========RelLoadBMP/RelLoadPCX Error Codes=======================
00 = No Error
02 = File Not
Found
03 = Path not
found
04 = Too many
files Open
05 = Access
denied
06 = Invalid
Handle
07 to 26 =
Misc. error code that can be found on Ralf Brown's Int list. ;*)
255 = unknown
error
/==========XmsTileIndex Format====================================
'Type for xms
base sprite routines.
'8 bytes per
sprite no matter how big it is.
TYPE
XmsTileIndexType
Bytes
AS LONG
offs
AS LONG
END TYPE
**On the horizon
Diagonal line Routine(done!!!!!
After more than 10 crashes.... :)) Now, very fast!!!!!
Sprite Rotation and
Scaling(optimizing.......) Note: Rotation=DONE!!!!!
Made it already in QB
but couldn't translate it well to ASM
Circle and Ellipse routines
If I could get it to
work....Damn this fixed point math!!!!
Triangle routines
Yeah right. (I ate my
words)
Bilinear Filtering and WU pixels(Done!)
(Shudders)
Real Alpha Blended Translucency
Doesn't need a gradient
palette to work. Slower though.
EMS(Scrapped cuz WINBLOWS XP doesn't
like EMS. Blame MS not me.)
Will use XMS instead so
no problem.
XMS done.
**I
included the source so that other ASM newbies like me may learn to make their
own super fast routines. I commented
the source as much as I can so don't call me stingy. If somebody learns from my routines, I would love to hear from
you. And If I can learn ASM, so can YOU!!!!
**
For any routines you want added to this library, pls. email me about it and
I'll see what I can do.
**XMS Tutorial
THIS SECTION IS
BEING WRITTEN
CREDITS:
GOD/JESUS CHRIST
For making me
what I am today!!!!
Anya
Therese Lope(my daughter)
For the constant determination
to shutdown the computer while I'm making this.
Rosmelly
Lope
For the constant nagging
to sleep early.
Lily
Lope and Peter Lope
My parents
Marie
Cristina and Cristina Marie
My sisters(the above is
not a TYPO), my dad used either SWAP or XCHG! j/k
CGI JOE
(Shimmer.Zext.Net) aka Alan O'Hagan
For the great
tutorial and the help at the boards.
Without you, I could never have
done this!!!! You da man! Mate....
Aura
Flow Team:
Eero
Pitkanen
The Artist formerly
known as EEBRO. For his idea of
making some tiles in the
game we're developing
translucent.
Adigun
A. Polack
For giving Arqanoid a
10/10 and donating some of the coolest SFX/GFX to be used
with Space
Impakto/Frantic Journey. Now a member of the AuraFlow team. And he
has
an AWESOME site now.
Bobby
Leigh aka Beta_SS
For accepting
the job I offered to help me code Frantic Journey(he's doing the
sounds and sticks) LOL
(Eebro,Adigun,Beta_SS
and I are working on the project as of the moment)
Achmad Aulia aka L_O_J
The newest member of the
team..... (Working on AFlib)
WILDCARD(Qbasic.QB45.com),(Qbasicnews.com)
For keeping the Qmunity
alive and for writing an article for Space Impakto, which
paved the way for EEBRO
and I to co-develop the game.
Hexadecimal
Disaster(aka Mario)
My cheerleader and my
pointman to all my net woes. When are "we" going
to realease BB2?
Hard Rock(Stars DEV)
For a kewl game called
Metal QB. Where's the HTML doc? Don't
go away from
QB dude.
Luis
Espinoza aka. Laffin
For making me
realize that ideal mode is better and easier than MASM mode. I
should have been going
to the chatroom ealier buddy. King of
Hacks! And for
donating 2
routines(Long2Int and Int2long) to "FOOL" QB.
Marc
Spencer aka citpes
For making
some kewl games with this lib. Thanks for the RelGet bug tip.
Petter Holmberg
Very useful ASM
tut. Now if I could get Absolute
Assembly to work.....
Gianncarlo(GBgames.com)
Best Links site and
giving Arqanoid an 82%
Jason
Earl
Without his review of
Arqanoid, I would never have found Adigun.
Bobby3999(CosmoSoft.Zext.Net)
aka Francisco Soto
For making the best LIB
(CosmoX), I'll still be using your lib for Space Impact so
don't worry..
Toshihiro
Horie
Taught me some cool
things. And tips on how to play with data structures. A
Genius!!!
Glenn Stumpff(did I spell
it right?) "The Glenn"
Hands down, your the
SMARTEST! Thanks for the tips. Also a
Genius!!!
Byron
Adams aka Nory-B(Masterminds.co.nz)
For telling me to
convert the Pure QB RelLib to ASM
Andrew L. Ayers
For teaching me how do
do some kick ass things with QB's Sprites.
Chris Chadwick
For making
PP256.
Mr.
Moose,Jake and ChaotiC(Masterminds.co.nz)
Couldn't wait to see the
finished NEXIUM32 and SnowBrawl
Jason
Gould
Studied his codes to
make my routines fast.
Angelo
Mottola
His LIB is the first one
I've used.
Dark Dread
Used his Tileset for
some demos and for being an inspiration to make good games.
Adam
Hyde
Also for his excellent
ASM tutorial.
Andre
Brown(Kakurot)
For making
RelLib as a platform for his Zelda style game. (Quest)
Lachie
Dazdarian
For pointing
out the bug in RelDelay which screws up on faster computers, and for
releasing the first ever
Rellib product. Finish that Solar Wind-like
game my
friend.....
Joakim
Anfelt_Ronne(Joakim_AR)
For being
honest with regards to UGL(plug_plug)
:)
*Version 2.0 is
dedicated to this guy. :*)
Piptol (Marcus Kasumba)
Run,run,run as fast as
you can... You can't catch me, I'm playing GHINI
RUN!!!!
V1ctor and Blitz
Plugged UGL here. Thank me!!! hehehehe.
v1ctor for allowing me
to use the core algo of his Ffix lib.
And these guys helped me
on the latter parts of ASM coding. Mostly Optimizations.
Lawrence
Bray Taleon
Gaming tips and would be
a great military tactician someday(Red Alert II)
Jan
Aaron Rojas
Gaming tips and Gran
Turismo II wizard(buy Metal Gear Solid II)
Nathan
Asshanti
For being the first to
test this LIB. Hentai anyone? Try Jill to see one of the best
games ever made in QB!!!
R@dioman
For his kind
words and interest in rellib. Coudn't
wait for your RPG dude!
Plasma357(Jon
Petrosky)
For hosting
some of my progs including this.
Flingmaster
For interest
in the Rellib MOD for DQB. :*)
Xchaser, JtM,(BCP)
Can't wait for your project dudes!!!!
Jocke the Beast
How's the GF?
Toonski84/Jofers
Pls make me an
avatar.....pls...........
Neo/Recinos
Say hi to Jon P. :*)
Vance
Velez
How could I forget?
Wizardlife/M.
Purvis
For making a
darn kool game called Empyrean.
Peter
Van Zwol
For making a
darn kool game that I even didn't know used RelLib. ;*)
Oracle
For the nudge here and
there about the XMSPut routine.
For making those nice 3d
models I used in my engines.
Adosorken/Nekrophidius
For being an honest man
that he is.
Updates!!!!
Pls/
Read the readme file for updates.
January
13,2002
Made my font routines
January
15,2002
Made my mouse and Bresenham circle
routines.
January 16,2002
Nothing. It's just my B-day!!!!!(27)
January
23,2002
Made my BMP loader
February
2,2002
Added
RelSpriteGamma,RelPcopyGamma,RelGammaBlock
February
26, 2002
Added my palette routines. Vector palette routines.
March
11,2002
After about 10 crashes, optimized
my diagonal line routine, diagonal transparent routine
and fixed the RelDelay bug.
March
23
Added RelInside(Bounding Box) and
RelInsideC(Circular Range Check)
Fixed the STUPID RelPset bug.
March
27
Added my Sprite Rotation routines
after much optimizations.....
April
06,2002
Added
RelGetHi,RelGetLow,RelAddHi,RelAddLow for support for Byte-Sized variables to
save memory :*)
May
29,2002
Added RelSpriteOnSprite and
RelSpriteOnSprite and Rescaled my Rotation Tables from 128 to 256 so
RelSpriteRotate
produces "cleaner"
sprites.
May
31,2002
Added RelCollideSpr for a pixel
perfect collision detection(extremely fast!!!!!!)
June
11,2002
Added RelPsetOnSprite,RelPsetOnSpriteT,RelPointOnSprite
June
26,2002
Added ReFfix.
August
???,2002
Added the XMS routines
September
22,2002
Added RelAngle