REM KeyBoard1.basDEFLNG A-ZCONST True = -1, False = 0TYPE KeyBoardState Left AS LONG Right AS LONG Down AS LONG Up AS LONG CTRL AS LONG SHIFT AS LONG ALT AS LONG SPACE AS LONG ENTER AS LONG ESC AS LONGEND TYPEDIM KeyRef AS KeyBoardState'------------------------------------------------------------------------------------------------------------------------------------SCREEN 12DO _LIMIT 30 KeyState KeyRef LOCATE 9, 1: PRINT "Left", "Up", "Down", "Right" LOCATE 10, 1 PRINT KeyRef.Left, KeyRef.Up, KeyRef.Down, KeyRef.Right LOCATE 12, 1: PRINT "CTRL", "ALT", "Shift", "Space" LOCATE 13, 1 PRINT KeyRef.CTRL, KeyRef.ALT, KeyRef.SHIFT, KeyRef.SPACE _DISPLAYLOOP UNTIL Done = 1SLEEPSYSTEM'------------------------------------------------------------------------------------------------------------------------------------SUB KeyState (KeyRef AS KeyBoardState)KeyRef.ESC = _KEYDOWN(27)KeyRef.SPACE = _KEYDOWN(32)KeyRef.Left = _KEYDOWN(19200)KeyRef.Right = _KEYDOWN(19712)KeyRef.Down = _KEYDOWN(20480)KeyRef.Up = _KEYDOWN(18432)IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN KeyRef.CTRL = True ELSE KeyRef.CTRL = FalseIF _KEYDOWN(100307) OR _KEYDOWN(100308) THEN KeyRef.ALT = True ELSE KeyRef.ALT = FalseIF _KEYDOWN(100303) OR _KEYDOWN(100304) THEN KeyRef.SHIFT = True ELSE KeyRef.SHIFT = FalseKeyRef.ENTER = _KEYDOWN(13)END SUB
'// Animated Duke Nukem'// Set up a screen for animationSCREEN _NEWIMAGE(800, 600, 32)CHDIR "dukenukem\" '// Maybe we should all make this folder?'// The Rect TYPE has two main uses, the first is for sprite animation, the second for bounding'// RECT collision detection but it alos used for tilesheets! Useful Eh?TYPE Rect X AS INTEGER Y AS INTEGER Width AS INTEGER Height AS INTEGEREND TYPE'// The Sprite TYPE contains variables common to all spritesTYPE Sprite X AS INTEGER Y AS INTEGER AnimFrame AS INTEGER AnimTime AS DOUBLE IsMoving AS INTEGER Direction AS INTEGER Exists AS INTEGEREND TYPEDIM DukeImage AS LONG '// Duke character sprite'// TO BE RE_CODED TO FIT NEW ANIMATION!!!DIM SHARED DukeFrame(1 TO 10) AS Rect '// Hold animation frame co-ordinatesDIM Duke AS Sprite, DukeRect AS RectDukeImage = _LOADIMAGE("Duke.png", 32) '// Load the image_CLEARCOLOR _RGB32(255, 0, 255), DukeImage '// Set pink as the transparent colour'// Load the animation RECTs into memory.'// The duke image has 10 frames, equally spaced on a single line, so this is easy.FrameCount% = 1FOR X% = 0 TO _WIDTH(DukeImage) - (_WIDTH(DukeImage) / 10) STEP (_WIDTH(DukeImage) / 10) DukeFrame(FrameCount%).X = X% DukeFrame(FrameCount%).Height = _HEIGHT(DukeImage) DukeFrame(FrameCount%).Width = _WIDTH(DukeImage) / 10 FrameCount% = FrameCount% + 1NEXT'// END OF NEEDED RE_CODE'// TileSheet loading, sheet has 30 columns 15 rows = 450 tiles (but some are empty)'// After tile 300, tiles are only 20 columns wide - this acounts for that.TileSheet& = _LOADIMAGE("Tilesheet.png")DIM Tile(1 TO 400) AS RectX% = 0Y% = 0XStep% = _WIDTH(TileSheet&) / 30YStep% = _HEIGHT(TileSheet&) / 15FOR i% = 1 TO 400 Tile(i%).X = X% Tile(i%).Y = Y% Tile(i%).Width = XStep% Tile(i%).Height = YStep% X% = X% + XStep% IF i% > 300 THEN IF X% >= _WIDTH(TileSheet&) - (XStep% * 11) THEN X% = 0 Y% = Y% + YStep% END IF ELSE IF X% >= _WIDTH(TileSheet&) - XStep% THEN X% = 0 Y% = Y% + YStep% END IF END IF '// DEBUG CODE _ REMOVE FROM FINAL _PUTIMAGE (X%, Y%)-(X% + XStep%, Y% + YStep%), TileSheet&, , (X%, Y%)-(X% + XStep%, Y% + YStep%)NEXT_DISPLAYSLEEP'// Duke Initial Position Animation and direction VariablesDuke.X = 0Duke.Y = 500Duke.AnimFrame = 1 '// Current Animation FrameDuke.Direction = 1 '// 1 = Right, 2 = leftDuke.IsMoving% = 0Duke.AnimTime = .07 '// Time between animation framesDukeRect.Height = _HEIGHT(DukeImage)DukeRect.Width = _WIDTH(DukeImage) / 10DukeAnimTimer# = TIMER(.001) '// Animation timerDO _LIMIT 30 CLS '// Duke Collision RECT DukeRect.X = DukeX% DukeRect.Y = DukeY% '// Duke Movement, Collisions and animation control... IF Duke.Direction = 1 THEN IF Duke.AnimFrame >= 5 THEN Duke.AnimFrame = 1 Duke.IsMoving = 0 '// RESET Movement ELSE IF Duke.IsMoving THEN IF TIMER(.001) - DukeAnimTimer# >= Duke.AnimTime# THEN IF Duke.AnimFrame < 5 THEN Duke.AnimFrame = Duke.AnimFrame + 1 ELSE Duke.AnimFrame = 1 DukeAnimTimer# = TIMER(.001) '// Animation timer '// Move DUKE - check for collisions first though!!! IF Duke.X + DukeRect.Width < 800 THEN Duke.X = Duke.X + 3 END IF END IF END IF ELSEIF Duke.Direction = 2 THEN IF Duke.AnimFrame < 5 OR Duke.AnimFrame = 10 THEN Duke.AnimFrame = 6 Duke.IsMoving = 0 '// RESET Movement ELSE IF Duke.IsMoving THEN IF TIMER(.001) - DukeAnimTimer# >= Duke.AnimTime THEN IF Duke.AnimFrame < 10 THEN Duke.AnimFrame = Duke.AnimFrame + 1 ELSE Duke.AnimFrame = 6 DukeAnimTimer# = TIMER(.001) '// Animation timer '// Move DUKE - check for collisions first though!!! IF Duke.X > 0 THEN Duke.X = Duke.X - 3 END IF END IF END IF END IF '// Input - Keyboard KB$ = INKEY$ SELECT CASE KB$ CASE CHR$(0) + CHR$(75) '// LEFT ARROW IF Duke.IsMoving THEN '// Increase speed??? Do nothing??? ELSE Duke.IsMoving = -1 Duke.Direction = 2 Duke.AnimFrame = 6 END IF CASE CHR$(0) + CHR$(77) '// RIGHT ARROW IF Duke.IsMoving THEN '// Increase speed??? Do nothing??? ELSE Duke.IsMoving = -1 Duke.Direction = 1 Duke.AnimFrame = 1 END IF END SELECT '// Drawing Duke _PUTIMAGE (Duke.X, Duke.Y)-(Duke.X + DukeRect.Width, Duke.Y + DukeRect.Height), DukeImage, , (DukeFrame(Duke.AnimFrame).X, 0)-(DukeFrame(Duke.AnimFrame).X + DukeFrame(Duke.AnimFrame).Width, _HEIGHT(DukeImage)) _DISPLAYLOOP'// Determines if any part of two rectangles intersect. returns -1 for true, 0 for falseFUNCTION RECT_Intersect (RECTRef1 AS Rect, RECTRef2 AS Rect)IF RECTRef1.X <= RECTRef2.X + RECTRef2.Width THEN IF RECTRef1.X + RECTRef1.Width >= RECTRef2.X THEN IF RECTRef1.Y <= RECTRef2.Y + RECTRef2.Height THEN IF RECTRef1.Y + RECTRef1.Height >= RECTRef2.Y THEN RECT_Intersect = -1 END IF END IF END IFELSE RECT_Intersect = 0END IFEND FUNCTION
'// Animated Duke Nukem'// Set up a screen for animationSCREEN _NEWIMAGE(800, 600, 32)_TITLE "DUKE NUKEM"_SCREENMOVE 0, 0CHDIR "dukenukem\" '// FOLDER CONATIANING GAME CONTENT'// INTRO SCREEN AND MAIN MENU'// GAME MUSIC???Logo& = _LOADIMAGE("Splash.png")Logo2& = _LOADIMAGE("Splash2.png")_CLEARCOLOR _RGB(255, 0, 255), Logo&_CLEARCOLOR _RGB(255, 0, 255), Logo2&FOR y% = 600 TO 100 STEP -2 _LIMIT 60 CLS _PUTIMAGE (150, y%)-(650, y% + 400), Logo& _PUTIMAGE (150, 520 - y%)-(650, (520 - y%) + 112), Logo2& _DISPLAYNEXT'// Main MenuSLEEP'// The Rect TYPE has two main uses, the first is for sprite animation, the second for bounding'// RECT collision detection but it alos used for tilesheets! Useful Eh?TYPE Rect X AS INTEGER Y AS INTEGER Width AS INTEGER Height AS INTEGEREND TYPE'// The Sprite TYPE contains variables common to all spritesTYPE Sprite X AS INTEGER Y AS INTEGER AnimFrame AS INTEGER AnimTime AS DOUBLE IsMoving AS INTEGER Direction AS INTEGER Exists AS INTEGEREND TYPEDIM DukeImage AS LONG '// Duke character sprite'// TO BE RE_CODED TO FIT NEW ANIMATION!!!DIM SHARED DukeFrame(1 TO 14) AS Rect '// Hold animation frame co-ordinatesDIM Duke AS Sprite, DukeRect AS RectDukeImage = _LOADIMAGE("Duke.png", 32) '// Load the image_CLEARCOLOR _RGB32(255, 0, 255), DukeImage '// Set pink as the transparent colour'// Load the animation RECTs into memory.'// The duke image has 14 frames, equally spaced on a single line, so this is easy.FrameCount% = 1FOR X% = 0 TO _WIDTH(DukeImage) - (_WIDTH(DukeImage) / 14) STEP (_WIDTH(DukeImage) / 14) DukeFrame(FrameCount%).X = X% DukeFrame(FrameCount%).Height = _HEIGHT(DukeImage) DukeFrame(FrameCount%).Width = _WIDTH(DukeImage) / 14 FrameCount% = FrameCount% + 1NEXT'// END OF NEEDED RE_CODE'// TileSheet loading, sheet has 30 columns 15 rows = 450 tiles (but some are empty)'// After tile 300, tiles are only 20 columns wide - this acounts for that.TileSheet& = _LOADIMAGE("Tilesheet.png")DIM Tile(1 TO 400) AS RectX% = 0y% = 0XStep% = _WIDTH(TileSheet&) / 30YStep% = _HEIGHT(TileSheet&) / 15FOR i% = 1 TO 400 Tile(i%).X = X% Tile(i%).Y = y% Tile(i%).Width = XStep% Tile(i%).Height = YStep% X% = X% + XStep% IF i% > 300 THEN IF X% >= _WIDTH(TileSheet&) - (XStep% * 11) THEN X% = 0 y% = y% + YStep% END IF ELSE IF X% >= _WIDTH(TileSheet&) - XStep% THEN X% = 0 y% = y% + YStep% END IF END IFNEXT'// Duke Initial Position Animation and direction VariablesDuke.X = 0Duke.Y = 500Duke.AnimFrame = 1 '// Current Animation FrameDuke.Direction = 1 '// 1 = Right, 2 = leftDuke.IsMoving% = 0Duke.AnimTime = .07 '// Time between animation framesDukeRect.Height = _HEIGHT(DukeImage)DukeRect.Width = _WIDTH(DukeImage) / 10DukeAnimTimer# = TIMER(.001) '// Animation timerDIM KB(2) AS KeyBoardStateDO _LIMIT 30 CLS '// Duke Collision RECT DukeRect.X = DukeX% DukeRect.Y = DukeY% '// Duke Movement, Collisions and animation control... IF Duke.Direction = 1 THEN IF Duke.AnimFrame >= 6 THEN Duke.AnimFrame = 1 Duke.IsMoving = 0 '// RESET Movement ELSE IF Duke.IsMoving THEN IF TIMER(.001) - DukeAnimTimer# >= Duke.AnimTime# THEN IF Duke.AnimFrame < 6 THEN Duke.AnimFrame = Duke.AnimFrame + 1 ELSE Duke.AnimFrame = 2 DukeAnimTimer# = TIMER(.001) '// Animation timer '// Move DUKE - check for collisions first though!!! IF Duke.X + DukeRect.Width < 800 THEN Duke.X = Duke.X + 3 END IF ELSE Duke.AnimFrame = 1 END IF END IF ELSEIF Duke.Direction = 2 THEN '// Left IF Duke.AnimFrame <= 8 THEN Duke.AnimFrame = 14 Duke.IsMoving = 0 '// RESET Movement ELSE IF Duke.IsMoving THEN IF TIMER(.001) - DukeAnimTimer# >= Duke.AnimTime THEN IF Duke.AnimFrame > 8 THEN Duke.AnimFrame = Duke.AnimFrame - 1 ELSE Duke.AnimFrame = 13 DukeAnimTimer# = TIMER(.001) '// Animation timer '// Move DUKE - check for collisions first though!!! IF Duke.X > 0 THEN Duke.X = Duke.X - 3 END IF ELSE Duke.AnimFrame = 14 END IF END IF END IF '// Input - Keyboard KeyState KB(0) IF KB(0).Left AND NOT KB(0).Right THEN IF Duke.IsMoving THEN '// Increase speed??? Do nothing??? ELSE Duke.IsMoving = -1 Duke.Direction = 2 Duke.AnimFrame = 14 END IF ELSEIF KB(0).Right AND NOT KB(0).Left THEN IF Duke.IsMoving THEN '// Increase speed??? Do nothing??? ELSE Duke.IsMoving = -1 Duke.Direction = 1 Duke.AnimFrame = 1 END IF END IF KB(1) = KB(0) '// Copy the keyboard state for comparisons '// Drawing Duke _PUTIMAGE (Duke.X, Duke.Y)-(Duke.X + DukeRect.Width, Duke.Y + DukeRect.Height), DukeImage, , (DukeFrame(Duke.AnimFrame).X, 0)-(DukeFrame(Duke.AnimFrame).X + DukeFrame(Duke.AnimFrame).Width, _HEIGHT(DukeImage)) _DISPLAYLOOP'// Determines if any part of two rectangles intersect. returns -1 for true, 0 for falseFUNCTION RECT_Intersect (RECTRef1 AS Rect, RECTRef2 AS Rect)IF RECTRef1.X <= RECTRef2.X + RECTRef2.Width THEN IF RECTRef1.X + RECTRef1.Width >= RECTRef2.X THEN IF RECTRef1.Y <= RECTRef2.Y + RECTRef2.Height THEN IF RECTRef1.Y + RECTRef1.Height >= RECTRef2.Y THEN RECT_Intersect = -1 END IF END IF END IFELSE RECT_Intersect = 0END IFEND FUNCTIONTYPE KeyBoardState Left AS LONG Right AS LONG Down AS LONG Up AS LONG CTRL AS LONG SHIFT AS LONG ALT AS LONG SPACE AS LONG ENTER AS LONG ESC AS LONGEND TYPESUB KeyState (KeyRef AS KeyBoardState)KeyRef.ESC = _KEYDOWN(27)KeyRef.SPACE = _KEYDOWN(32)KeyRef.Left = _KEYDOWN(19200)KeyRef.Right = _KEYDOWN(19712)KeyRef.Down = _KEYDOWN(20480)KeyRef.Up = _KEYDOWN(18432)IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN KeyRef.CTRL = True ELSE KeyRef.CTRL = FalseIF _KEYDOWN(100307) OR _KEYDOWN(100308) THEN KeyRef.ALT = True ELSE KeyRef.ALT = FalseIF _KEYDOWN(100303) OR _KEYDOWN(100304) THEN KeyRef.SHIFT = True ELSE KeyRef.SHIFT = FalseKeyRef.ENTER = _KEYDOWN(13)END SUB
'// Animated Duke Nukem'// Set up a screen for animationSCREEN _NEWIMAGE(640, 240, 32)_TITLE "DUKE NUKEM"_SCREENMOVE 0, 0CHDIR "dukenukem\" '// FOLDER CONATIANING GAME CONTENT'// INTRO SCREEN AND MAIN MENU'// GAME MUSIC???Logo& = _LOADIMAGE("Splash.png")Logo2& = _LOADIMAGE("Splash2.png")_CLEARCOLOR _RGB(255, 0, 255), Logo&_CLEARCOLOR _RGB(255, 0, 255), Logo2&FOR Y% = 240 TO 0 STEP -2 _LIMIT 60 CLS _PUTIMAGE (120, Y%)-(520, Y% + 240), Logo& _PUTIMAGE (120, 200 - Y%)-(520, (200 - Y%) + 40), Logo2& _DISPLAYNEXT'// Main MenuSLEEPDIM DukeImage AS LONG '// Duke character spriteDIM SHARED DukeFrame(1 TO 14) AS Rect '// Hold animation frame co-ordinatesDIM Duke AS Sprite, DukeRect AS RectDukeImage = _LOADIMAGE("Duke.png", 32) '// Load the image_CLEARCOLOR _RGB32(255, 0, 255), DukeImage '// Set pink as the transparent colour'// Load the animation RECTs into memory.'// The duke image has 14 frames, equally spaced on a single line, so this is easy.FOR X% = 0 TO _WIDTH(DukeImage) - (_WIDTH(DukeImage) / 14) STEP (_WIDTH(DukeImage) / 14) FrameCount% = FrameCount% + 1 DukeFrame(FrameCount%).X = X% DukeFrame(FrameCount%).Height = _HEIGHT(DukeImage) DukeFrame(FrameCount%).Width = _WIDTH(DukeImage) / 14NEXT'// TileSheet loading, sheet has 30 columns 15 rows = 450 tiles (but some are empty)'// After tile 300, tiles are only 20 columns wide - this acounts for that.TileSheet& = _LOADIMAGE("Tilesheet.png")DIM Tile(1 TO 400) AS RectX% = 0Y% = 0XStep% = _WIDTH(TileSheet&) / 30YStep% = _HEIGHT(TileSheet&) / 15FOR i% = 1 TO 400 Tile(i%).X = X% Tile(i%).Y = Y% Tile(i%).Width = XStep% Tile(i%).Height = YStep% X% = X% + XStep% IF i% > 300 THEN IF X% > _WIDTH(TileSheet&) - (XStep% * 11) THEN X% = 0 Y% = Y% + YStep% END IF ELSE IF X% > _WIDTH(TileSheet&) - XStep% THEN X% = 0 Y% = Y% + YStep% END IF END IFNEXT'// LOAD THE LEVEL DATADIM Level(40, 15) AS INTEGER, BackGround(40, 15) AS INTEGERFOR i% = 0 TO 14 FOR J% = 0 TO 39 READ TileBit% Level(J%, i%) = TileBit% NEXTNEXTFOR i% = 0 TO 14 FOR J% = 0 TO 39 READ TileBit% BackGround(J%, i%) = TileBit% NEXTNEXT'// Duke Initial Position Animation and direction VariablesDuke.X = 12Duke.Y = 170Duke.AnimFrame = 1 '// Current Animation FrameDuke.Direction = 1 '// 1 = Right, 2 = leftDuke.IsMoving = 0Duke.AnimTime = .07 '// Time between animation framesDuke_IsJumping% = 0DukeRect.Height = _HEIGHT(DukeImage)DukeRect.Width = _WIDTH(DukeImage) / 14DukeAnimTimer# = TIMER(.001) '// Animation timerDIM KB(2) AS KeyBoardStateDO _LIMIT 30 CLS '// Duke Movement, Collisions and animation control... '// First check to see if Duke is jumping, then faling, then assuming a collision with the background walk! IF Duke.Direction = 1 THEN IF Duke.AnimFrame >= 6 THEN Duke.AnimFrame = 1 Duke.IsMoving = 0 '// RESET Movement ELSE IF Duke.IsMoving THEN IF TIMER(.001) - DukeAnimTimer# >= Duke.AnimTime# THEN IF Duke.AnimFrame < 6 THEN Duke.AnimFrame = Duke.AnimFrame + 1 ELSE Duke.AnimFrame = 2 DukeAnimTimer# = TIMER(.001) '// Animation timer '// Move DUKE - check for collisions first though!!! IF Duke.X + DukeRect.Width < 800 THEN Duke.X = Duke.X + 3 END IF ELSE Duke.AnimFrame = 1 END IF END IF ELSEIF Duke.Direction = 2 THEN '// Left IF Duke.AnimFrame <= 8 THEN Duke.AnimFrame = 14 Duke.IsMoving = 0 '// RESET Movement ELSE IF Duke.IsMoving THEN IF TIMER(.001) - DukeAnimTimer# >= Duke.AnimTime THEN IF Duke.AnimFrame > 8 THEN Duke.AnimFrame = Duke.AnimFrame - 1 ELSE Duke.AnimFrame = 13 DukeAnimTimer# = TIMER(.001) '// Animation timer '// Move DUKE - check for collisions first though!!! IF Duke.X > 0 THEN Duke.X = Duke.X - 3 END IF ELSE Duke.AnimFrame = 14 END IF END IF END IF '// Duke Collision RECT DukeRect.X = DukeX% DukeRect.Y = DukeY% '// Input - Keyboard KeyState KB(0) IF KB(0).Left AND NOT KB(0).Right THEN IF Duke.IsMoving THEN '// Increase speed??? Do nothing ??? ELSE Duke.IsMoving = -1 Duke.Direction = 2 Duke.AnimFrame = 14 END IF ELSEIF KB(0).Right AND NOT KB(0).Left THEN IF Duke.IsMoving THEN '// Increase speed??? Do nothing??? ELSE Duke.IsMoving = -1 Duke.Direction = 1 Duke.AnimFrame = 1 END IF END IF KB(1) = KB(0) '// Copy the keyboard state for comparisons '// Drawing the background then the level Y% = 0 FOR i% = 0 TO 14 X% = 0 FOR J% = 0 TO 39 IF BackGround(J%, i%) > 0 THEN _PUTIMAGE (X%, Y%)-(X% + 15, Y% + 15), TileSheet&, , (Tile(BackGround(J%, i%)).X, Tile(BackGround(J%, i%)).Y)-(Tile(BackGround(J%, i%)).X + 15, Tile(BackGround(J%, i%)).Y + 15) END IF X% = X% + 16 NEXT Y% = Y% + 16 NEXT Y% = 0 FOR i% = 0 TO 14 X% = 0 FOR J% = 0 TO 39 IF Level(J%, i%) > 0 THEN _PUTIMAGE (X%, Y%)-(X% + 15, Y% + 15), TileSheet&, , (Tile(Level(J%, i%)).X, Tile(Level(J%, i%)).Y)-(Tile(Level(J%, i%)).X + 15, Tile(Level(J%, i%)).Y + 15) END IF X% = X% + 16 NEXT Y% = Y% + 16 NEXT '// Drawing Duke _PUTIMAGE (Duke.X, Duke.Y)-(Duke.X + DukeRect.Width, Duke.Y + DukeRect.Height), DukeImage, , (DukeFrame(Duke.AnimFrame).X, 0)-(DukeFrame(Duke.AnimFrame).X + DukeFrame(Duke.AnimFrame).Width, _HEIGHT(DukeImage)) _DISPLAYLOOPTYPE KeyBoardState Left AS LONG Right AS LONG Down AS LONG Up AS LONG CTRL AS LONG SHIFT AS LONG ALT AS LONG SPACE AS LONG ENTER AS LONG ESC AS LONGEND TYPE'// The Rect TYPE has two main uses, the first is for sprite animation, the second for bounding'// RECT collision detection but its also used for tilesheets! Useful Eh?TYPE Rect X AS INTEGER Y AS INTEGER Width AS INTEGER Height AS INTEGEREND TYPE'// The Sprite TYPE contains variables common to all spritesTYPE Sprite X AS INTEGER Y AS INTEGER AnimFrame AS INTEGER AnimTime AS DOUBLE IsMoving AS INTEGER Direction AS INTEGER Exists AS INTEGEREND TYPESUB KeyState (KeyRef AS KeyBoardState)KeyRef.ESC = _KEYDOWN(27)KeyRef.SPACE = _KEYDOWN(32)KeyRef.Left = _KEYDOWN(19200)KeyRef.Right = _KEYDOWN(19712)KeyRef.Down = _KEYDOWN(20480)KeyRef.Up = _KEYDOWN(18432)IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN KeyRef.CTRL = True ELSE KeyRef.CTRL = FalseIF _KEYDOWN(100307) OR _KEYDOWN(100308) THEN KeyRef.ALT = True ELSE KeyRef.ALT = FalseIF _KEYDOWN(100303) OR _KEYDOWN(100304) THEN KeyRef.SHIFT = True ELSE KeyRef.SHIFT = FalseKeyRef.ENTER = _KEYDOWN(13)END SUB'// Determines if any part of two rectangles intersect. returns -1 for true, 0 for falseFUNCTION RECT_Intersect (RECTRef1 AS Rect, RECTRef2 AS Rect)IF RECTRef1.X <= RECTRef2.X + RECTRef2.Width THEN IF RECTRef1.X + RECTRef1.Width >= RECTRef2.X THEN IF RECTRef1.Y <= RECTRef2.Y + RECTRef2.Height THEN IF RECTRef1.Y + RECTRef1.Height >= RECTRef2.Y THEN RECT_Intersect = -1 END IF END IF END IFELSE RECT_Intersect = 0END IFEND FUNCTION'// DUMMY LEVEL - If built in in a level maker this will need to be in an external file. level is 40x15DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 0,0,0,0,0,0,293,294,0,0,0,0,293,294,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,0DATA 0,0,0,0,0,0,295,296,0,0,0,0,295,296,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,0DATA 0,0,0,0,0,293,294,293,294,0,0,0,293,294,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,0DATA 0,0,0,0,0,295,296,295,296,0,0,0,295,296,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'// BACKGROUD TILESDATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0DATA 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,0,0,0,0,0,0,0,0,0,0
REMDEFLNG A-Z_TITLE "DukeNukem Editor"Video& = _NEWIMAGE(800, 600, 32)Sheet1& = _LOADIMAGE("DNBackground1.bmp", 32)SCREEN Video&_FULLSCREENDIM SHARED mx%, my%, mbl%, mbr%Grey& = _RGB32(192, 192, 192)Pink& = _RGB32(255, 105, 180)LWhite& = _RGB32(255, 250, 250)GOSUB BoxGOSUB LoadTiles_MOUSESHOWDO _LIMIT 30 MousePoll LOCATE 1, 90: PRINT "x="; mx% LOCATE 2, 90: PRINT "y="; my% ' we in tile paste window IF mx% >= 8 AND mx% <= 407 THEN IF my% >= 8 AND my% <= 407 THEN x% = mx% - 8: y% = my% - 8 xx% = x% \ 16: yy% = y% \ 16 END IF END IF ' we in tile selection window IF mx% >= 428 AND mx% <= 684 THEN IF my% >= 8 AND my% <= 488 THEN x% = mx% - 428: y% = my% - 8 xx% = x% \ 16: yy% = y% \ 16 IF mbl% = -1 THEN xxx% = xx% + 1: yyy% = yy% + 1: x1% = (xxx% * 16) - 15: y1% = (yyy% * 16) - 15 LINE ((428 + (xxx% * 16) - 16), (8 + (yyy% * 16)) - 16)-(428 + (xxx% * 16) - 1, 8 + (yyy% * 16) - 1), Pink&, B _PUTIMAGE (108, 438)-(123, 453), Sheet1&, Video&, ((xxx% * 16) - 15, (yyy% * 16) - 15)-((xxx% * 16) - 1, (yyy% * 16) - 1) END IF END IF END IF LOCATE 4, 90: PRINT "C="; xx% + 1 LOCATE 5, 90: PRINT "R="; yy% + 1 _DISPLAYLOOP UNTIL _KEYDOWN(27)SLEEPSYSTEMBox:LINE (0, 0)-(415, 415), Grey&, BFLINE (8, 8)-(407, 407), LWhite&, BFFOR t = 8 TO 398 STEP 16 FOR tt = 8 TO 398 STEP 16 LINE (t, tt)-(t + 15, tt + 15), Pink&, B NEXT ttNEXT tLINE (420, 0)-(690, 496), Grey&, BFLINE (100, 430)-(132, 462), Grey&, BFRETURNLoadTiles:_PUTIMAGE (428, 8)-(684, 488), Sheet1&, Video&RETURNSUB MousePoll ()DO WHILE _MOUSEINPUT mx% = _MOUSEX: my% = _MOUSEY: mbl% = _MOUSEBUTTON(1): mbr% = _MOUSEBUTTON(2)LOOPEND SUB
'//Convert level into data style statements FOR i% = 1 TO 50 '// Column DataString$ = "" FOR j% = 1 TO 50 '// Row IF j% > 1 THEN DataString$ = DataString$ + "," DataString$ = DataString$ + STR$(Walls(i%, j%)) NEXT PRINT #1, DataString$ NEXT
OPEN GameFile$ FOR INPUT AS #1FOR i% = 1 TO 50 LINE INPUT #1, DataLine$ RowCnt% = 1 FOR j% = 0 TO LEN(DataLine$) IF INSTR(j%, DataLine$, ",") > 0 THEN Level(i%, RowCnt%) = VAL(MID$(DataLine$, j%, INSTR(j%, DataLine$, ",") - j%)) j% = INSTR(j%, DataLine$, ",") RowCnt% = RowCnt% + 1 ELSE Level(i%, RowCnt%) = VAL(MID$(DataLine$, j%)) END IF NEXTNEXT