08-11-2003, 12:07 PM
Joe, you're right, things like plasmas could be done.
The challenge is to make a graphical textmode screen 0 effect.
rules:
1. No call absolute
2. No external files
3. Call interrupt is okay to use.
Here's and example:
Plasma and floormapper. ;*)
The challenge is to make a graphical textmode screen 0 effect.
rules:
1. No call absolute
2. No external files
3. Call interrupt is okay to use.
Here's and example:
Plasma and floormapper. ;*)
Code:
'I am crazy!!!
'Plasma anf Floormapper in TextMode!!!
'Relsoft 2003
DECLARE SUB BlobsTxt (Intensity%)
DECLARE SUB DrawBlob (bx%, by%)
DECLARE SUB Mode7Text (sx%, sy%, sz%, horz%)
DEFINT A-Z
RANDOMIZE TIMER
CLS
SCREEN 0
WIDTH 80, 50
CONST PI = 3.14151693#
CONST FALSE = 0, TRUE = NOT FALSE
DIM SHARED Lsin1%(-1024 TO 1024)
DIM SHARED Lsin2%(-1024 TO 1024)
DIM SHARED Lsin3%(-1024 TO 1024)
DIM SHARED Lsin!(-10 TO 370)
DIM SHARED Lcos!(-10 TO 370)
FOR i% = -1024 TO 1024
Lsin1%(i%) = SIN(i% / (16)) * 16
Lsin2%(i%) = SIN(i% / (32)) * 64
Lsin3%(i%) = SIN(i% / (32)) * 8
NEXT i%
j! = 255 / 360 * 2
k! = 255 / 360 * 8
l! = 255 / 360 * 4
FOR i% = 0 TO 255
m% = INT(a!)
n% = INT(b!)
o% = INT(c!)
r% = 63 * ABS(SIN(m% * PI / 180))
g% = 63 * ABS(SIN(n% * PI / 180))
b% = 63 * ABS(SIN(o% * PI / 180))
a! = a! + j!
b! = b! + k!
c! = c! + l!
OUT &H3C8, i%
OUT &H3C9, r%
OUT &H3C9, g%
OUT &H3C9, b%
NEXT
Dir% = 1
DEF SEG = &HB800
DO
counter& = (counter& + Dir%)
IF counter& > 600 THEN Dir% = -Dir%
IF counter& < -600 THEN Dir% = -Dir%
offset% = 0
FOR y% = 1 TO 50
FOR x% = 1 TO 80
c% = Lsin3%(x%) + Lsin1%(x% + counter&) + Lsin2%(y% + counter&)
c% = c% + Lsin3%(c%) + Lsin1%(c% + counter&) + Lsin2%(counter& - y% + x%)
POKE offset%, 177 + (c% AND 1)
POKE offset% + 1, c% AND 15
offset% = offset% + 2
NEXT x%
NEXT y%
LOOP UNTIL INKEY$ <> ""
CLS
horz% = 10
sx% = 30
sy% = 30
sz% = 40
Mode7Text sx%, sy%, sz%, horz%
END
SUB Mode7Text (sx%, sy%, sz%, horz%)
'256*126 = 32256
'((256*126)+4)\2 =16130
'256*8 =2048
'32256\2=16128
FOR i% = 0 TO 359
RA! = i% * (3.141593 / 180)
Lcos!(i%) = COS(RA!)
Lsin!(i%) = SIN(RA!)
NEXT i%
FOR i% = -1024 TO 1024
Lsin1%(i%) = SIN(i% / (16)) * 32
Lsin2%(i%) = SIN(i% / (32)) * 16
Lsin3%(i%) = SIN(i% / (32)) * 32
NEXT i%
j! = 255 / 360 * 8
k! = 255 / 360 * 8
l! = 255 / 360 * 16
FOR i% = 0 TO 255
m% = INT(a!)
n% = INT(b!)
o% = INT(c!)
r% = 63 * ABS(SIN(m% * PI / 180))
g% = 63 * ABS(SIN(n% * PI / 180))
b% = 63 * ABS(SIN(o% * PI / 180))
a! = a! + j!
b! = b! + k!
c! = c! + l!
OUT &H3C8, i%
OUT &H3C9, r%
OUT &H3C9, g%
OUT &H3C9, b%
NEXT
SpaceZ! = sz%
ScaleY! = sy%
ScaleX! = sx%
Horizon% = horz%
countdir% = 1
counter% = 50
t# = TIMER
DO
F& = (F& + 1) AND &H7FFFFFFF
counter% = (counter% + countdir%)
IF counter% < 2 THEN
countdir% = -countdir%
ELSEIF counter% > 700 THEN
countdir% = -countdir%
END IF
pd% = (pd% + 1) AND 1023
ci% = (ci% + 1) AND (3)
px% = SIN(ci% / counter%) * 4
py% = COS(ci% / counter%) * 8
Angle = (Angle + 1) MOD 359
xv! = Lcos!(Angle)
yv! = Lsin!(Angle)
offset% = (80 * 4)
FOR ya% = 4 TO 50
Distance! = (SpaceZ! * ScaleY!) / (ya% + Horizon%)
HorizScale! = (Distance! / ScaleX!)
LineDX! = (-yv! * HorizScale!)
LineDy! = (xv! * HorizScale!)
SpaceX! = ((Distance! * xv!)) - (40 * LineDX!)
SpaceY! = ((Distance! * yv!)) - (25 * LineDy!)
ldx& = LineDX! * 1024
ldy& = LineDy! * 1024
sx& = SpaceX! * 1024
sy& = SpaceY! * 1024
pxysin% = Lsin3%(px% + py%)
FOR xa% = 1 TO 80
xx% = sx& \ 1024' + (pd%)
yy% = sy& \ 1024' + (pd%)
c% = Lsin1%(xx% + px%) + Lsin2%(yy% + py%) + pxysin%
c% = Lsin2%(xx% - counter%) + Lsin3%(Lsin1%(yy% - counter%) - Lsin3%(xx% - counter% - c%))
POKE offset%, 177 + (c% AND 1)
POKE offset% + 1, c% AND 15
offset% = offset% + 2
sx& = sx& + ldx&
sy& = sy& + ldy&
NEXT xa%
NEXT ya%
LOOP UNTIL INKEY$ <> ""
END SUB