Tein joskus viime vuonna starfieldin ja rupesin sitten lisäilemään siihen kaikenlaista. En ole ihan varma tosta alkusanojen kirjotusasusta ja siksi se kannattaakin skipata lyömällä näppäintä. Tuskin tästä kukaan mitään oppii kun koodi on vähän sekavaa, mutta olipahan aika munkin heittää tänne uusi vinkki :D
DECLARE SUB MainTitle ()
DECLARE SUB Menus ()
DECLARE SUB Story ()
DECLARE SUB NewStar ()
DECLARE SUB DrawStars ()
DECLARE SUB HideStars ()
DECLARE FUNCTION MenuResult! (XPos!, YPos!, DefaultIndex!, MenuCount!)
DECLARE SUB OUTColor (ColorSlot!)
DECLARE SUB Pause (Delay AS SINGLE)
DECLARE SUB SetColors ()
DECLARE FUNCTION SolveAngle! (x1!, y1!, x2!, y2!)
DECLARE SUB DrawShots ()
DECLARE SUB HideShots ()
DIM SHARED OnAir AS INTEGER
DIM SHARED Menu(1 TO 7) AS STRING
'Background stars
TYPE BackgroundStar
X AS SINGLE
Y AS SINGLE
StartX AS SINGLE
StartY AS SINGLE
Angle AS SINGLE
Speed AS SINGLE
Distance AS SINGLE
Visible AS INTEGER
Shown AS INTEGER
END TYPE
DIM SHARED Star(50) AS BackgroundStar
DIM SHARED NewStarDelay AS INTEGER
CONST StarDelay = 1
TYPE ShotType
Speed AS SINGLE
Angle AS INTEGER
Clr AS SINGLE
Distance AS SINGLE
Visible AS INTEGER
CX AS SINGLE
CY AS SINGLE
END TYPE
DIM SHARED Shot(9) AS ShotType
DIM SHARED LastShotSide
LastShotSide = 70
'Color tables
TYPE ColorTable
Red AS SINGLE
Green AS SINGLE
Blue AS SINGLE
END TYPE
DIM SHARED RGBColor(0 TO 255) AS ColorTable
DIM SHARED Brightness AS SINGLE
DIM SHARED XTurning AS SINGLE, YTurning AS SINGLE
DIM SHARED Spin AS SINGLE, SpinAccel AS SINGLE
ON ERROR RESUME NEXT
'Settings
DIM SHARED ShowStars AS INTEGER
DIM SHARED FancyMenu AS INTEGER
FancyMenu = -1
SCREEN 13
Brightness = 100
OnAir = 0
SetColors
Story
MainTitle
Menus
'(!) DISTANCE:
'eX = Star(i).StartX - Star(i).x: eY = Star(i).StartY - Star(i).y
'Dist = SQR((ABS(eX) * ABS(eX)) + (ABS(eY) * ABS(eY)))
CLS
DO
HideStars
HideShots
XTurning = (ABS(XTurning) - .05) * SGN(XTurning)
IF ABS(XTurning) < .05 THEN XTurning = 0
IF ABS(XTurning) > 2 THEN XTurning = 2 * SGN(XTurning)
YTurning = (ABS(YTurning) - .05) * SGN(YTurning)
IF ABS(YTurning) < .05 THEN YTurning = 0
IF ABS(YTurning) > 2 THEN YTurning = 2 * SGN(YTurning)
SpinAccel = (ABS(SpinAccel) - .02) * SGN(SpinAccel)
IF ABS(SpinAccel) < .02 THEN SpinAccel = 0
Spin = Spin + SpinAccel
DrawStars
DrawShots
LINE (157, 100)-(163, 100), 32
LINE (160, 97)-(160, 103), 32
PSET (160, 100), 45
CIRCLE (160, 100), 2, 40
SELECT CASE INKEY$
CASE CHR$(0) + "K": XTurning = XTurning - .2: SpinAccel = SpinAccel + .04
CASE CHR$(0) + "H": YTurning = YTurning - .2
CASE CHR$(0) + "M": XTurning = XTurning + .2: SpinAccel = SpinAccel - .04
CASE CHR$(0) + "P": YTurning = YTurning + .2
CASE CHR$(13)
FOR i = 0 TO UBOUND(Shot)
IF NOT Shot(i).Visible THEN
Shot(i).Distance = 0
Shot(i).CX = 160: Shot(i).CY = 100
Shot(i).Speed = 10
Shot(i).Angle = 180 - LastShotSide - Spin
LastShotSide = -LastShotSide
Shot(i).Clr = 126
Shot(i).Visible = -1
FOR f = 3500 TO 1000 STEP -250
SOUND f, .05
NEXT
EXIT FOR
END IF
NEXT
CASE CHR$(27): END
END SELECT
Pause .01
LOOP
SUB DrawShots
FOR i = 0 TO UBOUND(Shot)
IF Shot(i).Visible THEN
Shot(i).Distance = Shot(i).Distance + Shot(i).Speed
Shot(i).Speed = Shot(i).Speed * .89
Clr = Shot(i).Clr
Shot(i).Clr = Shot(i).Clr - 3
Shot(i).CX = Shot(i).CX - XTurning
Shot(i).CY = Shot(i).CY + YTurning
IF Shot(i).Clr < 66 THEN Shot(i).Visible = False: GOTO NextShot
Dist1 = 150 - (Shot(i).Distance / 63 * 110)
Dist2 = Dist1 + (150 - Shot(i).Distance * 2) / 5
a = (Shot(i).Angle + Spin - 90) * 3.141592 / 180
x1 = COS(a) * Dist1 + Shot(i).CX
y1 = SIN(a) * Dist1 + Shot(i).CY
x2 = COS(a) * Dist2 + Shot(i).CX
y2 = SIN(a) * Dist2 + Shot(i).CY
LINE (x1, y1)-(x2, y2), Clr
END IF
NextShot:
NEXT
END SUB
SUB DrawStars
NewStarDelay = NewStarDelay - 1
IF NewStarDelay <= 0 THEN
NewStar
NewStarDelay = StarDelay
END IF
FOR i = 0 TO UBOUND(Star)
IF Star(i).Visible THEN
a = (Star(i).Angle - 90) * 3.141592 / 180
Star(i).X = COS(a) * Star(i).Distance / 3 + Star(i).StartX
Star(i).Y = SIN(a) * Star(i).Distance / 3 + Star(i).StartY
Star(i).StartX = Star(i).StartX - XTurning
Star(i).StartY = Star(i).StartY + YTurning
IF Star(i).X < 0 OR Star(i).X > 319 OR Star(i).Y < 0 OR Star(i).Y > 199 THEN
Star(i).Visible = 0
GOTO NextStar
END IF
Clr = Star(i).Distance * .5
IF Clr > 65 THEN Clr = 65
a = SolveAngle(160, 100, Star(i).X, Star(i).Y)
eX = 160 - Star(i).X: eY = 100 - Star(i).Y
Dist = SQR((ABS(eX) * ABS(eX)) + (ABS(eY) * ABS(eY)))
a = (a + Spin - 90) * 3.141592 / 180
X = COS(a) * Dist + 160
Y = SIN(a) * Dist + 100
IF Clr >= 0 AND POINT(Star(i).X, Star(i).Y) = 0 THEN
PSET (X, Y), Clr
Star(i).Shown = -1
ELSE
Star(i).Shown = 0
END IF
Star(i).Distance = Star(i).Distance + Star(i).Speed
Star(i).Speed = Star(i).Speed * 1.1
END IF
NextStar:
NEXT
END SUB
SUB HideShots
FOR i = 0 TO UBOUND(Shot)
IF Shot(i).Visible THEN
Dist1 = 150 - (Shot(i).Distance / 63 * 110)
Dist2 = Dist1 + (150 - Shot(i).Distance * 2) / 5
a = (Shot(i).Angle + Spin - 90) * 3.141592 / 180
x1 = COS(a) * Dist1 + Shot(i).CX
y1 = SIN(a) * Dist1 + Shot(i).CY
x2 = COS(a) * Dist2 + Shot(i).CX
y2 = SIN(a) * Dist2 + Shot(i).CY
LINE (x1, y1)-(x2, y2), 0
END IF
NEXT
END SUB
SUB HideStars
FOR i = 0 TO UBOUND(Star)
IF Star(i).Visible AND Star(i).Shown THEN
a = SolveAngle(160, 100, Star(i).X, Star(i).Y)
eX = 160 - Star(i).X: eY = 100 - Star(i).Y
Dist = SQR((ABS(eX) * ABS(eX)) + (ABS(eY) * ABS(eY)))
a = (a + Spin - 90) * 3.141592 / 180
X = COS(a) * Dist + 160
Y = SIN(a) * Dist + 100
PSET (X, Y), 0
END IF
NEXT
END SUB
SUB MainTitle
Title$ = "STARTREK"
CLS : COLOR 1: LOCATE 1, 1: PRINT Title$
FOR Size = 0 TO 4 STEP .1
YPos = YPos - .5
Clr = Clr + .6
BaseColor = Clr
HideStars
DrawStars
Pause .01
FOR Y = 0 TO 7
Top = 60
FOR X = 0 TO LEN(Title$) * 8
c = POINT(X, Y)
Tx1 = 160 - (Size * LEN(Title$) * 8 / 2) + (X * Size)
Ty1 = Top - (Size * LEN(Title$) / 2) + (Y * Size) + YPos
Tx2 = Tx1 + Size - 1: Ty2 = Ty1 + Size - 1
Top = Top - .2
BaseColor = BaseColor - .01
DrawColor = BaseColor - (X / 8) - (Y / 3) + RND
IF DrawColor < 0 THEN DrawColor = 0
IF c > 0 THEN LINE (Tx1, Ty1)-(Tx2, Ty2), DrawColor, BF
NEXT X, Y, Size
COLOR 0: LOCATE 1, 1: PRINT Title$
Clr = 100
Title$ = "Puhveli 2004"
COLOR 1
LOCATE 15, 1: PRINT Title$
LOCATE 16, 1: PRINT SPACE$(LEN(Title$))
SpeedStep = .01
Size = 0
DO
Size = Size + SpeedStep
Clr = Clr + .2
SpeedStep = SpeedStep + .02
BaseColor = Clr
HideStars
DrawStars
Pause .01
FOR Y = 0 TO 14
Top = 80
FOR X = 0 TO LEN(Title$) * 8
c = POINT(X, Y + 112)
Tx1 = 160 - (Size * LEN(Title$) * 8 / 2) + (X * Size)
Ty1 = Top - (Size * LEN(Title$) / 2) + (Y * Size)
Tx2 = INT(Tx1 + Size - 1): Ty2 = INT(Ty1 + Size - 1)
Top = Top + ((1 - Size) / 10)
BaseColor = BaseColor - .002
DrawColor = (BaseColor - (X / 8) - (Y / 3) + RND) * SGN(c)
IF DrawColor < 1 OR DrawColor > 64 THEN LINE (Tx1, Ty1)-(Tx2, Ty2), DrawColor, BF
NEXT X, Y
LOOP UNTIL Size >= 1
LINE (0, 70)-(319, 199), 0, BF
END SUB
FUNCTION MenuResult (XPos, YPos, DefaultIndex, MenuCount)
Index = DefaultIndex
ShadowClr = 0
ShadowFade = 0
GOSUB DrawMenus
IF FancyMenu THEN MenuBrightness = 0 ELSE MenuBrightness = 1: GOSUB DrawMenus
DO
IF ShadowClr > 30 THEN ShadowFade = ShadowFade - .1
IF ShadowClr < 30 THEN ShadowFade = ShadowFade + .1
ShadowClr = ShadowClr + ShadowFade
IF MenuBrightness < 1 THEN MenuBrightness = MenuBrightness + .2: GOSUB DrawMenus
Pause .01
HideStars
DrawStars
SELECT CASE INKEY$
CASE CHR$(0) + "H": Index = Index - 1
IF Index < 1 THEN Index = MenuCount
GOSUB DrawMenus
CASE CHR$(0) + "P": Index = Index + 1
IF Index > MenuCount THEN Index = 1
GOSUB DrawMenus
CASE CHR$(13): EXIT DO
CASE CHR$(27): Index = 0: EXIT DO
END SELECT
LOOP
IF FancyMenu THEN
FOR MenuBrightness = 1 TO 0 STEP -.2
HideStars
DrawStars
GOSUB DrawMenus
Pause .01
NEXT
ELSE
MenuBrightness = 0: GOSUB DrawMenus
END IF
MenuResult = Index
EXIT FUNCTION
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
DrawMenus:
FOR i = 1 TO MenuCount
X = INT(XPosition - (LEN(Menu(i)) / 2 * 8))
Y = INT(YPosition - (MenuCount / 2) + ((i - 1) * 2 * 7))
COLOR 1
LOCATE 23, 1
PRINT Menu(i)
FOR Y = 0 TO 9
FOR X = 0 TO LEN(Menu(i)) * 8
Tx = INT(XPos - (LEN(Menu(i)) * 4) + X)
Ty = INT(YPos - (MenuCount * 17 / 2) + (i * 17) + Y)
SelY = INT(YPos - (MenuCount * 17 / 2) + (Index * 17) + Y)
c = POINT(X, Y + 176)
IF FancyMenu THEN
eX = XPos - Tx: eY = SelY - Ty
Clr = 50 - (SQR((ABS(eX) * ABS(eX)) + (ABS(eY) * ABS(eY))) / 1.7)
IF i = Index THEN Clr = Clr + 15
ELSE
IF i = Index THEN Clr = 50 ELSE Clr = 20
END IF
IF Clr < 0 THEN Clr = 0
Clr = Clr * MenuBrightness
IF c = 1 THEN
PSET (Tx, Ty), Clr
IF FancyMenu THEN PSET (Tx, Ty + 1), Clr / 2
ELSEIF FancyMenu THEN
IF POINT(X, Y + 177) = 1 THEN PSET (Tx, Ty), Clr / 2
END IF
NEXT X, Y
NEXT
RETURN
END FUNCTION
SUB Menus
LastMenu = 1
MainMenu:
IF OnAir THEN Menu(1) = "Resume game" ELSE Menu(1) = "Begin game"
Menu(2) = "Highest scores"
Menu(3) = "Settings"
Menu(4) = "Instructions"
Menu(5) = "Exit"
SELECT CASE MenuResult(160, 120, LastMenu, 5)
CASE 1: EXIT SUB
CASE 3: LastMenu = 6: GOTO Settings
CASE ELSE
FOR Brightness = Brightness TO 0 STEP -.5
FOR c = 0 TO 255: OUTColor c: NEXT
NEXT
END
END SELECT
Settings:
Menu(1) = "Amount of stars: 75"
Menu(2) = "Unlock highscores"
IF FancyMenu THEN Menu(3) = "Show plain menus" ELSE Menu(3) = "Show fancy menus"
Menu(4) = "Control: Keyboard"
Menu(5) = "Modify graphics"
Menu(6) = "Validate"
LastMenu = MenuResult(160, 120, LastMenu, 6)
SELECT CASE LastMenu
CASE 3: FancyMenu = NOT FancyMenu
CASE ELSE: LastMenu = 3: GOTO MainMenu
END SELECT: GOTO Settings
END SUB
SUB NewStar
FOR i = 0 TO UBOUND(Star)
IF NOT Star(i).Visible THEN
Star(i).X = RND * 320: Star(i).Y = RND * 200
Star(i).StartX = Star(i).X: Star(i).StartY = Star(i).Y
Star(i).Angle = SolveAngle(160, 100, Star(i).X, Star(i).Y)
Star(i).Speed = RND * .1
Star(i).Distance = 1: Star(i).Visible = -1
Star(i).Shown = 0
EXIT FOR
END IF
NEXT
END SUB
SUB OUTColor (ColorSlot)
OUT &H3C8, ColorSlot
OUT &H3C9, RGBColor(ColorSlot).Red * Brightness / 100
OUT &H3C9, RGBColor(ColorSlot).Green * Brightness / 100
OUT &H3C9, RGBColor(ColorSlot).Blue * Brightness / 100
END SUB
SUB Pause (Delay AS SINGLE)
DIM StartTime AS SINGLE
DIM CurrentTime AS SINGLE
StartTime = TIMER: DO: CurrentTime = TIMER
LOOP UNTIL CurrentTime - StartTime > Delay OR CurrentTime < StartTime
END SUB
SUB SetColors
RGBColor(1).Red = 0
RGBColor(1).Green = 0
RGBColor(1).Blue = 0
OUTColor 1
FOR i = 2 TO 65
RGBColor(i).Red = i - 2
RGBColor(i).Green = i - 2
RGBColor(i).Blue = i - 2
OUTColor i
NEXT
FOR i = 66 TO 130
RGBColor(i).Red = i - 66
RGBColor(i).Green = i - 66
RGBColor(i).Blue = 0
OUTColor i
NEXT
END SUB
FUNCTION SolveAngle (x1, y1, x2, y2)
eX = x1 - x2
eY = y1 - y2
IF x2 > x1 AND eY = 0 THEN
Angle = 90
ELSE
Angle = -45 / ATN(1) * ATN(eX / eY)
IF y2 > y1 THEN Angle = Angle + 180
IF x2 < x1 AND y2 < y1 THEN Angle = Angle + 360
END IF
SolveAngle = Angle
END FUNCTION
SUB Story
DIM Wave(999) AS LONG
WaveWidth = 1
DIM Text(1 TO 4) AS STRING
Clr = 0
Index = 0
DO
d = d + 1
c = c - .05
Clr = Clr + c
IF Clr < 0 THEN d = 0: Clr = 0: c = 2.5: Index = Index + 1
SELECT CASE Index
CASE 1
Text(1) = "Space, the final frontier..."
TextCount = 1
CASE 2
Text(1) = "These are the voyagers"
Text(2) = "of the starship Enterprise"
TextCount = 2
CASE 3
Text(1) = "Its continuing mission"
Text(2) = "to explore strange new worlds"
TextCount = 2
CASE 4
Text(1) = "To seek out new life"
Text(2) = "and new civilizations"
TextCount = 2
CASE 5
Text(1) = "To roguely go where"
Text(2) = "no one has gone before..."
TextCount = 2
CASE ELSE: EXIT DO
END SELECT
FOR i = 1 TO TextCount
Title$ = Text(i)
Row = 10 - INT(TextCount / 2) + i * 2
Column = 20 - INT(LEN(Title$) / 2)
COLOR Clr: IF Clr < 5 THEN COLOR 0
LOCATE Row, Column: PRINT Title$
Top = (Row * 8) - 9
FOR X = Column * 8 - 8 TO Column * 8 + (LEN(Title$) * 8) STEP WaveWidth
Y = INT(SIN((X - d) / 5)) + Top + 1
GET (X, Top)-(X + WaveWidth, Top + 8), Wave
LINE (X, Top - 1)-(X + WaveWidth, Top + 11), 0, BF
PUT (X, Y), Wave, PSET
NEXT
NEXT
HideStars
DrawStars
Pause .01
LOOP WHILE INKEY$ = ""
END SUBAihe on jo aika vanha, joten et voi enää vastata siihen.