Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ========================================================================================================
- ::: [ * SpriteDemo.bat ; Author: T3RRY { https://stackoverflow.com/users/12343998/t3rr0r } * ]
- ::: [ * Game_Engine.bat ; Author: T3RRY { https://stackoverflow.com/users/12343998/t3rr0r } * ]
- ::::::::::::::::::::::::::::
- ::: Additional Accreditation
- ::: Getkey.Exe by Antonio { https://stackoverflow.com/users/778560/aacini }
- ::: * REQUIRED * for Extended key controls.
- ::: Sleep.bat by Dave Benham { https://stackoverflow.com/users/1012053/dbenham }
- ::: - Not required; allows for more precise sub second delays than other methods.
- ::: DOWNLOAD ALL + More Games_By_T3RRY from:
- ::: https://drive.google.com/file/d/1cAQLd-f9HN6SuWowBUETccKCZd2dVbWj/view?usp=sharing
- ::::::::::::::::::::::::::::
- ::: Script prep
- @Echo off & CD "%~dp0"
- CHCP 65001 > nul
- cls
- Set "Delay=If exist Sleep.bat ( Call sleep.bat ? !time! )Else (For /L %%n in (1 1 10)Do ( Call :Delay 2> nul ))"
- Call "Game_Engine.bat" || (Echo/Game_Engine.bat missing & Exit /B 0)
- rem/* PC.Prompt Macro - Supplemental Info displayed below control panel; shows information relating to PC status {Arg 1} and Obj=NPC status {Arg 2} */
- Set "PC.Prompt=For %%n in (1 2)Do if %%n==2 (For /F "Tokens=1,2 Delims={}" %%G in ("!PC.NPC!")Do ( < Nul Set /P "=%\E%[10;!CNTRL!H%\E%[!Player.Color!mPlayer: %%G%\E%[0m %\E%!!!!!!H%\E%[!Obj.Color!mObj: %%H%\E%[0m " ))Else Set PC.NPC="
- rem/* G.O - Supplemental Gameflow macro. Use Substitution to exchange :start for another valid label to implement levels as exampled further below */
- Set "G.O=Call :End & Endlocal & Goto :start"
- ========================================================================================================
- ::: Script main body
- ========================================================================================================
- :start
- CLS
- Set "lvl=1"
- Setlocal EnableDelayedExpansion
- %MSG:?= Generating Border ...%
- ::::: Background.Border
- :::: Defines critical Variables used by other Sprite Macros - Must be expanded first.
- ::: Extensive error testing performed in Background.Border due to dependencies of
- ::: other macros. As the border is not animated; Time Intensive testing can be performed.
- ::: Move.Sprite Rotate.Sprite and Show cannot engage in the same degree of testing without
- ::: grossly slowing animation speed
- ::: USAGE:
- ::: %Background.Border%{VTcolor}{.Xmin}{.Xmax}{.Ymin}{.Ymax}{.Char}{0|-1}
- ::: Override default control info panel width. [ default = 20 ]
- ::: %Background.Border:CNTRL.Width=INTEGER%{VTcolor}{.Xmin}{.Xmax}{.Ymin}{.Ymax}{.Char}{0|-1}
- ::: Arg 7 {0|-1} 0=Border Collision Fatal; -1=Non Fatal
- %Background.Border%{48;2;130;100;10}{1}{50}{1}{25}{#}{0}
- ::: CNTRL.Width Default = 20. Info Panel position at col .Xmax + 5
- ::: Console Lines .Ymax + 2
- ::: Console Columns .Xmax + 5 + CNTRL.Width
- ::: Console resizes during execution of Background.Border Macro using the above offsets.
- ::: Game Control / Info Panel. Default width should be modified as shown in above Usage if
- ::: strings in panel info exceed 19 characters length
- %Update.BackGround%
- Set "lvl=1"
- rem /* custom {Y} coordinate for each line of a sprite to be supplied during Def.Sprite Expansion */
- rem /* using substring modification to replace # with Integer Y value GTR .Ymin LSS .Ymax */
- ========================================================================================================
- %Def.Sprite:#=1%{player}{32}{ O }
- %Def.Sprite%{player}{32}{MWM }
- %Def.Sprite%{player}{32}{ T }
- ========================================================================================================
- %Def.Sprite:#=3%{rocks}{90}{ @ }
- %Def.Sprite%{rocks}{90}{ @ }
- %Def.Sprite%{rocks}{90}{ # #@ }
- %Def.Sprite%{rocks}{90}{ @@ }
- %Def.Sprite:#=17%{rocks}{90}{ @ @ }
- %Def.Sprite%{rocks}{90}{ @ @ }
- %Def.Sprite%{rocks}{90}{ # }
- %Def.Sprite%{rocks}{90}{ @ }
- ========================================================================================================
- %Def.Sprite:#=1%{river}{36}{ .ll }
- %Def.Sprite:#=2%{river}{36}{ ^l. }
- %Def.Sprite%{river}{36}{ .l }
- %Def.Sprite%{river}{36}{ .l_ }
- %Def.Sprite%{river}{36}{ .r^)._ }
- %Def.Sprite%{river}{36}{ _^)` .l` ^). }
- %Def.Sprite%{river}{36}{ l` . }
- %Def.Sprite%{river}{36}{ _l. }
- %Def.Sprite%{river}{36}{ . }
- ========================================================================================================
- %Def.Sprite:#=9%{mount}{37}{ x X xXx }
- %Def.Sprite%{mount}{37}{ XxXx Xx X }
- %Def.Sprite%{mount}{37}{ Xx xXxxX x}
- ========================================================================================================
- %Def.Sprite:#=8%{money}{33}{ $}
- %Def.Sprite:#=12%{money}{33}{ $}
- ========================================================================================================
- rem /* varname[index#] naming convention can be used to define multiple sprites of a given type - allowing for random selection from an array of sprites */
- %Def.Sprite:#=21%{AI[1]}{31}{ /+\}
- %Def.Sprite%{AI[1]}{31}{ + }
- %Def.Sprite%{AI[1]}{31}{ \+/}
- ========================================================================================================
- rem /* Show initial sprite positions */
- rem /* Display order: Collectable; Background; Player; Collideable */
- ::: Display order priority allows quick confirmation of sprite placement during development
- (
- %Show:obj=money%
- %Show:obj=mount%
- %Show:obj=river%
- %Show:obj=rocks%
- %Show:obj=player%
- %Show:obj=AI[1]%
- )>%Foreground%
- TYPE %Foreground%
- rem /* Define valid keys */
- %Def.Key%"-72=up" "-80=down" "-75=left" "-77=right" "27=escape" "32=space" "13=enter"
- %Def.Key%"48=0" "49=1" "50=2" "51=3" "52=4" "53=5" "54=6" "55=7" "56=8" "57=9"
- %MSG:?= Sprite Demo by T3RRY. Collect Both $ Coins%
- rem / ********************** /
- %PC.Prompt:Obj=AI[1]%{Start}{Waiting}
- ========================================================================================================
- ::: GAME LOGIC /* DEMO of Sprite movement and Display only. Not intended as an Actual Game. */
- :level[1] :# Objectives ::::::::::::::::::::::::::::::::::::
- ::: Player Win - capture both $ coins :::
- ::: Player Loss - player or AI experiences any collision :::
- ::: AI Win - AI Captures any $ coin :::
- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- rem /* input is taken and assessed within the loop ; all game actions repeat with each loop until a specified end condition is met */
- rem /* clear previous key; catch new input */
- Set "Key="& %GetKey%
- rem /* ::: ?Key# insert/remove substring modification ':mode=dev' for/after debugging. Dev mode allows testing of key inputs to identify errorcode values returned */
- rem /* Expand ?Key# macro; test if captured errorlevel corresponds to a valid key */
- %?Key#:Obj=Player%
- rem /* Static Sprite Objects NOT collision tested should be refreshed each cycle PRIOR to movement */
- %Show:obj=river%
- rem /* Test move in the current Direction for declared SPRITE OBJect valid against list of collision characters; Call :End on Collision */
- rem /* Previous sprite position overwritten with whitespace during Move.Sprite macro execution */
- For %%O in (!Player.Dir!)Do (
- %PC.Prompt:Obj=AI[1]%{%%O}{!.%%O!}
- If /I not "!key!" == "enter" (
- rem /* if not key equ enter move in current dir */
- For %%M in (!Player.Dir!)Do %Move.Sprite:obj=player%!%%M!{"@" "x" "+" "/" "\"}{"$"}
- )Else (
- rem /* If key equ enter rotate sprite */
- For %%D in (!Player.Dir!)Do %Rotate.Sprite:obj=player%{!r%%D!}{"@" "x" "+" "/" "\"}{"$"}
- )
- %SHOW:Obj=Player%
- )
- If !Player.capt! GEQ 1 Set /A "Playercoin+=1 + 0"
- If "!valid!" == "0" ( Set "Win=Lost" & set ".Win=Won" & %G.O% 1)
- ::: GAME LOGIC OPTION :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- ::: Implement levels by using conditional tests that flag winning the current level jump to
- ::: a new label to define new sprites.
- ::: Before implementing a new level loop:
- ::: - endlocal environment to remove previous sprites and renew Setlocal EnableDelayedExpansion
- ::: [ Tunneling any variables For scoring etc ]
- ::: prior to defining the next batch of sprites - MUST be done to remove }Y;X definitions used
- ::: for collision testing.
- If "!Playercoin!" == "2" (Set "Win=Won" & set ".Win=Lost" & %G.O:start=lvl[2]% 1)
- ::: %G.O:start=lvl[2]% Substitution changes label target from start to lvl[2] definition stage
- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- rem /* Simple AI sprite motion. AI moves in opposite direction to player */
- For %%. in (!Player.Dir!)Do For %%M in (!.%%.!)Do %Move.Sprite:obj=AI[1]%!%%M!{"@" "x" "O" "M" "T"}{"$"}
- If !AI[1].capt! GEQ 1 (Set "Win=Lost" & set ".Win=Won" & %G.O%)
- If "!valid!" == "0" (Set "Win=Lost" & set ".Win=Lost" & %G.O%)
- If /I "!Key!" == "escape" Goto :Quit
- %Delay:#=100%
- Goto :level[1]
- =======================================================================================================
- ::: Demonstration of level implementation
- :lvl[2] :# Level specific definitions
- CLS
- Set /A "lvl+=1+0"
- Setlocal EnableDelayedExpansion
- %MSG:?= Generating Border ...%
- %Background.Border%{38;2;240;128;128}{1}{50}{1}{25}{#}{0}
- %Update.BackGround%
- ========================================================================================================
- %Def.Sprite:#=1%{player}{36}{ O }
- %Def.Sprite%{player}{36}{MWM }
- %Def.Sprite%{player}{36}{ T }
- ========================================================================================================
- %Def.Sprite:#=5%{rocks}{38;2;160;82;45}{ #@ }
- %Def.Sprite%{rocks}{38;2;160;82;45}{ @# # }
- %Def.Sprite%{rocks}{38;2;160;82;45}{ # @#@ }
- %Def.Sprite%{rocks}{38;2;160;82;45}{ @@}
- %Def.Sprite:#=17%{rocks}{38;2;160;82;45}{ @#@ }
- %Def.Sprite%{rocks}{38;2;160;82;45}{ @ @# }
- %Def.Sprite%{rocks}{38;2;160;82;45}{ #@ }
- ========================================================================================================
- %Def.Sprite:#=12%{river}{34}{ .ll }
- %Def.Sprite%{river}{34}{ ^l. }
- %Def.Sprite%{river}{34}{ .l }
- %Def.Sprite%{river}{34}{ .l_ }
- %Def.Sprite%{river}{34}{ r^) ._ }
- %Def.Sprite%{river}{34}{ .l` ^). }
- %Def.Sprite%{river}{34}{ l` `. }
- %Def.Sprite%{river}{34}{ _l .^)}
- %Def.Sprite%{river}{34}{ .r }
- ========================================================================================================
- %Def.Sprite:#=9%{mount}{37}{ x X xXx }
- %Def.Sprite%{mount}{37}{ XxXx Xx X }
- %Def.Sprite%{mount}{37}{ Xx xXxxX x}
- ========================================================================================================
- %Def.Sprite:#=4%{money}{33}{ $}
- %Def.Sprite:#=7%{money}{33}{ $}
- ========================================================================================================
- %Def.Sprite:#=20%{AI[1]}{35}{ /+\}
- %Def.Sprite%{AI[1]}{35}{ +++}
- %Def.Sprite%{AI[1]}{35}{ \+/}
- %Def.Sprite%{AI[1]}{35}{ \+/}
- ========================================================================================================
- (
- %Show:obj=money%
- %Show:obj=mount%
- %Show:obj=river%
- %Show:obj=rocks%
- %Show:obj=player%
- %Show:obj=AI[1]%
- ) >%Foreground%
- TYPE %Foreground%
- %Def.Key%"-72=up" "-80=down" "-75=left" "-77=right" "27=escape" "32=space" "13=enter"
- %Def.Key%"48=0" "49=1" "50=2" "51=3" "52=4" "53=5" "54=6" "55=7" "56=8" "57=9"
- %MSG:?= Sprite Demo by T3RRY. Collect Both $ Coins%
- %PC.Prompt:Obj=AI[1]%{Start}{Waiting}
- :level[2] :# Gameplay Loop
- Set "Key="& %GetKey%
- %?Key#:Obj=Player%
- %Show:obj=river%
- For %%O in (!Player.Dir!)Do (
- %PC.Prompt:Obj=AI[1]%{%%O}{!.%%O!}
- If /I not "!key!" == "enter" (
- rem /* if not key equ enter move in current dir */
- %Move.Sprite:obj=player%!%%O!{"@" "x" "+" "/" "\"}{"$"}
- )Else (
- rem /* If key equ enter rotate sprite */
- %Rotate.Sprite:obj=player%{!r%%O!}{"@" "x" "+" "/" "\"}{"$"}
- )
- )
- If !Player.capt! GEQ 1 Set /A "Playercoin+=1 + 0"
- If "!valid!" == "0" ( Set "Win=Lost" & set ".Win=Won" & %G.O%)
- If "!Playercoin!" == "2" (Set "Win=Won" & set ".Win=Lost" & %G.O:start=Eof%)
- For %%. in (!Player.Dir!)Do For %%M in (!.%%.!)Do %Move.Sprite:obj=AI[1]%!%%M!{"@" "x" "O" "M" }{"$"}
- If !AI[1].capt! GEQ 1 (Set "Win=Lost" & set ".Win=Won" & %G.O%)
- If "!valid!" == "0" (Set "Win=Lost" & set ".Win=Lost" & %G.O%)
- If /I "!Key!" == "escape" Goto :Quit
- %Delay:?=80%
- Goto :level[2]
- =======================================================================================================
- ::: SCRIPT BREAK :# Functions below.
- =======================================================================================================
- :End
- (
- %Show:obj=player%
- %Show:obj=AI[1]%
- )>%Foreground%
- TYPE %Foreground%
- rem /* Sound alert level over */
- Echo/n|Choice /N /C:y 2> nul
- %MSG:?= Level !lvl! !Win! %
- %PC.Prompt:Obj=AI[1]%{!Win!}{!.Win!}
- Timeout /T 2 /Nobreak > Nul
- <nul Set /P "=%\E%[!.End!;1H%\E%[?25h%\E%[31m{escape} %\E%[0m:%\E%[31m Quit%\E%[37m or %\E%[32mPress any Key to continue... "
- rem /* use substitution to remove /n no-wait switch from getkey macro execution; wait for input */
- Set "Key="& %Getkey: /n=%
- %?Key#%
- If /I "!Key!" == "escape" (Call :Quit & Exit)
- :Quit
- <nul Set /P "=%\E%[!.End!;1H%\E%[?25h%\E%[31m"
- DEL "%Save.Dir%%~n0*.~tmp" 2> Nul
- <nul Set /P "=%\E%[0m"
- Exit /B 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement